void GBAudioInit(struct GBAudio* audio, size_t samples, uint8_t* nr52, enum GBAudioStyle style) { audio->samples = samples; audio->left = blip_new(BLIP_BUFFER_SIZE); audio->right = blip_new(BLIP_BUFFER_SIZE); audio->clockRate = DMG_LR35902_FREQUENCY; // Guess too large; we hang producing extra samples if we guess too low blip_set_rates(audio->left, DMG_LR35902_FREQUENCY, 96000); blip_set_rates(audio->right, DMG_LR35902_FREQUENCY, 96000); audio->forceDisableCh[0] = false; audio->forceDisableCh[1] = false; audio->forceDisableCh[2] = false; audio->forceDisableCh[3] = false; audio->masterVolume = GB_AUDIO_VOLUME_MAX; audio->nr52 = nr52; audio->style = style; }
int audio_init(int samplerate, double framerate) { /* Shutdown first */ audio_shutdown(); /* Clear the sound data context */ memset(&snd, 0, sizeof (snd)); /* Initialize Blip Buffers */ snd.blips[0] = blip_new(samplerate / 10); if (!snd.blips[0]) { return -1; } /* Mega CD sound hardware */ if (system_hw == SYSTEM_MCD) { /* allocate blip buffers */ snd.blips[1] = blip_new(samplerate / 10); snd.blips[2] = blip_new(samplerate / 10); if (!snd.blips[1] || !snd.blips[2]) { audio_shutdown(); return -1; } } /* Initialize resampler internal rates */ audio_set_rate(samplerate, framerate); /* Set audio enable flag */ snd.enabled = 1; /* Reset audio */ audio_reset(); return (0); }
ECL_EXPORT bool Init(bool cgb, const uint8_t *spc, int spclen) { if (spc) { GB_init_sgb(&GB); if (!sgb_init(spc, spclen)) return false; sgb = true; } else if (cgb) { GB_init_cgb(&GB); } else { GB_init(&GB); } if (GB_load_boot_rom(&GB, "boot.rom") != 0) return false; if (GB_load_rom(&GB, "game.rom") != 0) return false; GB_set_pixels_output(&GB, GBPixels); GB_set_vblank_callback(&GB, VBlankCallback); GB_set_log_callback(&GB, LogCallback); GB_set_rgb_encode_callback(&GB, RgbEncodeCallback); GB_set_infrared_callback(&GB, InfraredCallback); GB_set_rumble_callback(&GB, RumbleCallback); GB_set_sample_callback(&GB, SampleCallback); leftblip = blip_new(1024); rightblip = blip_new(1024); blip_set_rates(leftblip, sgb ? SOUND_RATE_SGB : SOUND_RATE_GB, 44100); blip_set_rates(rightblip, sgb ? SOUND_RATE_SGB : SOUND_RATE_GB, 44100); return true; }
void GBAAudioInit(struct GBAAudio* audio, size_t samples) { audio->samples = samples; #if RESAMPLE_LIBRARY != RESAMPLE_BLIP_BUF CircleBufferInit(&audio->left, samples * sizeof(int16_t)); CircleBufferInit(&audio->right, samples * sizeof(int16_t)); #else audio->left = blip_new(BLIP_BUFFER_SIZE); audio->right = blip_new(BLIP_BUFFER_SIZE); // Guess too large; we hang producing extra samples if we guess too low blip_set_rates(audio->left, GBA_ARM7TDMI_FREQUENCY, 96000); blip_set_rates(audio->right, GBA_ARM7TDMI_FREQUENCY, 96000); #endif CircleBufferInit(&audio->chA.fifo, GBA_AUDIO_FIFO_SIZE); CircleBufferInit(&audio->chB.fifo, GBA_AUDIO_FIFO_SIZE); audio->forceDisableCh[0] = false; audio->forceDisableCh[1] = false; audio->forceDisableCh[2] = false; audio->forceDisableCh[3] = false; audio->forceDisableChA = false; audio->forceDisableChB = false; audio->masterVolume = GBA_AUDIO_VOLUME_MAX; }
int audio_init(int samplerate, double framerate) { /* Number of M-cycles executed per second. */ /* All emulated chips are kept in sync by using a common oscillator (MCLOCK) */ /* */ /* The original console would run exactly 53693175 M-cycles per sec (53203424 for PAL), */ /* 3420 M-cycles per line and 262 (313 for PAL) lines per frame, which gives an exact */ /* framerate of 59.92 (49.70 for PAL) frames per second. */ /* */ /* Since audio samples are generated at the end of the frame, to prevent audio skipping */ /* or lag between emulated frames, number of samples rendered per frame must be set to */ /* output samplerate (number of samples played per second) divided by input framerate */ /* (number of frames emulated per seconds). */ /* */ /* On some systems, we may want to achieve 100% smooth video rendering by synchronizing */ /* frame emulation with VSYNC, which frequency is generally not exactly those values. */ /* In that case, input framerate (number of frames emulated per seconds) is the same as */ /* output framerate (number of frames rendered per seconds) by the host video hardware. */ /* */ /* When no framerate is specified, base clock is set to original master clock value. */ /* Otherwise, it is set to number of M-cycles emulated per line (fixed) multiplied by */ /* number of lines per frame (VDP mode specific) multiplied by input framerate. */ /* */ double mclk = framerate ? (MCYCLES_PER_LINE * (vdp_pal ? 313 : 262) * framerate) : system_clock; /* Shutdown first */ audio_shutdown(); /* Clear the sound data context */ memset(&snd, 0, sizeof (snd)); /* Initialize audio rates */ snd.sample_rate = samplerate; snd.frame_rate = framerate; /* Initialize Blip Buffers */ snd.blips[0][0] = blip_new(samplerate / 10); snd.blips[0][1] = blip_new(samplerate / 10); if (!snd.blips[0][0] || !snd.blips[0][1]) { audio_shutdown(); return -1; } /* For maximal accuracy, sound chips are running at their original rate using common */ /* master clock timebase so they remain perfectly synchronized together, while still */ /* being synchronized with 68K and Z80 CPUs as well. Mixed sound chip output is then */ /* resampled to desired rate at the end of each frame, using Blip Buffer. */ blip_set_rates(snd.blips[0][0], mclk, samplerate); blip_set_rates(snd.blips[0][1], mclk, samplerate); /* Initialize PSG core */ SN76489_Init(snd.blips[0][0], snd.blips[0][1], (system_hw < SYSTEM_MARKIII) ? SN_DISCRETE : SN_INTEGRATED); /* Mega CD sound hardware */ if (system_hw == SYSTEM_MCD) { /* allocate blip buffers */ snd.blips[1][0] = blip_new(samplerate / 10); snd.blips[1][1] = blip_new(samplerate / 10); snd.blips[2][0] = blip_new(samplerate / 10); snd.blips[2][1] = blip_new(samplerate / 10); if (!snd.blips[1][0] || !snd.blips[1][1] || !snd.blips[2][0] || !snd.blips[2][1]) { audio_shutdown(); return -1; } /* Initialize PCM core */ pcm_init(snd.blips[1][0], snd.blips[1][1]); /* Initialize CDD core */ cdd_init(snd.blips[2][0], snd.blips[2][1]); } /* Set audio enable flag */ snd.enabled = 1; /* Reset audio */ audio_reset(); return (0); }
void init_audio_for_rom() { // Maximum number of unread samples the buffer can hold blip = blip_new(sample_rate/10); blip_set_rates(blip, cpu_clock_rate, sample_rate); }