static void sound_exit(running_machine &machine) { // kill the buffers and dsound dsound_destroy_buffers(); dsound_kill(); // print out over/underflow stats if (buffer_overflows || buffer_underflows) mame_printf_verbose("Sound: buffer overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); LOG(("Sound buffer: overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows)); }
void sound_direct_sound::exit() { // kill the buffers and dsound dsound_destroy_buffers(); dsound_kill(); // print out over/underflow stats if (buffer_overflows || buffer_underflows) osd_printf_verbose("Sound: buffer overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); LOG(("Sound buffer: overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows)); }
void osd_stop_audio_stream(void) { // if nothing to do, don't do it if (Machine->sample_rate == 0) return; // kill the buffers and dsound dsound_destroy_buffers(); dsound_kill(); // print out over/underflow stats if (verbose && (buffer_overflows || buffer_underflows)) fprintf(stderr, "Sound buffer: overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); #if LOG_SOUND if (sound_log) fprintf(sound_log, "Sound buffer: overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); fclose(sound_log); #endif }
void osd_stop_audio_stream(void) { if( wavptr != NULL ) { wav_close( wavptr ); wavptr = NULL; } // kill the buffers and dsound dsound_destroy_buffers(); dsound_kill(); // print out over/underflow stats if (buffer_overflows || buffer_underflows) verbose_printf("Sound: buffer overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); #if LOG_SOUND if (sound_log) fprintf(sound_log, "Sound buffer: overflows=%d underflows=%d\n", buffer_overflows, buffer_underflows); fclose(sound_log); #endif }
static int dsound_init(void) { HRESULT result; LPGUID guid = NULL; // Default audio device osd_enum_audio_devices(); // (Re-)Enumerate devices // Get the guid to the user selected audio device (NULL if no selected) if(current_audio_device>= 0 && current_audio_device<audio_devices_number) guid = audio_devices[current_audio_device].guid; // now attempt to create it result = DirectSoundCreate(guid, &dsound, NULL); if (result != DS_OK) { fprintf(stderr, "Error creating DirectSound: %08x\n", (UINT32)result); goto cant_create_dsound; } // get the capabilities dsound_caps.dwSize = sizeof(dsound_caps); result = IDirectSound_GetCaps(dsound, &dsound_caps); if (result != DS_OK) { fprintf(stderr, "Error getting DirectSound capabilities: %08x\n", (UINT32)result); goto cant_get_caps; } // set the cooperative level result = IDirectSound_SetCooperativeLevel(dsound, win_video_window, DSSCL_PRIORITY); if (result != DS_OK) { fprintf(stderr, "Error setting cooperative level: %08x\n", (UINT32)result); goto cant_set_coop_level; } // make a format description for what we want stream_format.wBitsPerSample = 16; stream_format.wFormatTag = WAVE_FORMAT_PCM; stream_format.nChannels = (Machine->drv->sound_attributes & SOUND_SUPPORTS_STEREO) ? 2 : 1; stream_format.nSamplesPerSec = Machine->sample_rate; stream_format.nBlockAlign = stream_format.wBitsPerSample * stream_format.nChannels / 8; stream_format.nAvgBytesPerSec = stream_format.nSamplesPerSec * stream_format.nBlockAlign; // compute the buffer sizes stream_buffer_size = ((UINT64)MAX_BUFFER_SIZE * (UINT64)stream_format.nSamplesPerSec) / 44100; stream_buffer_size = (stream_buffer_size * stream_format.nBlockAlign) / 4; stream_buffer_size = (stream_buffer_size * 30) / Machine->drv->frames_per_second; stream_buffer_size = (stream_buffer_size / 1024) * 1024; // compute the upper/lower thresholds lower_thresh = audio_latency * stream_buffer_size / 5; upper_thresh = (audio_latency + 1) * stream_buffer_size / 5; #if LOG_SOUND fprintf(sound_log, "stream_buffer_size = %d (max %d)\n", stream_buffer_size, MAX_BUFFER_SIZE); fprintf(sound_log, "lower_thresh = %d\n", lower_thresh); fprintf(sound_log, "upper_thresh = %d\n", upper_thresh); #endif // create the buffers if (dsound_create_buffers()) goto cant_create_buffers; // start playing is_enabled = 1; result = IDirectSoundBuffer_Play(stream_buffer, 0, 0, DSBPLAY_LOOPING); if (result != DS_OK) { fprintf(stderr, "Error playing: %08x\n", (UINT32)result); goto cant_play; } return 0; // error handling cant_play: dsound_destroy_buffers(); cant_create_buffers: cant_set_coop_level: cant_get_caps: IDirectSound_Release(dsound); cant_create_dsound: dsound = NULL; return 0; }
static HRESULT dsound_create_buffers(void) { HRESULT result; void *buffer; DWORD locked; // create a buffer desc for the primary buffer memset(&primary_desc, 0, sizeof(primary_desc)); primary_desc.dwSize = sizeof(primary_desc); primary_desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_GETCURRENTPOSITION2; primary_desc.lpwfxFormat = NULL; // create the primary buffer result = IDirectSound_CreateSoundBuffer(dsound, &primary_desc, &primary_buffer, NULL); if (result != DS_OK) { mame_printf_error("Error creating primary DirectSound buffer: %08x\n", (UINT32)result); goto error; } // attempt to set the primary format result = IDirectSoundBuffer_SetFormat(primary_buffer, &stream_format); if (result != DS_OK) { mame_printf_error("Error setting primary DirectSound buffer format: %08x\n", (UINT32)result); goto error; } // get the primary format result = IDirectSoundBuffer_GetFormat(primary_buffer, &primary_format, sizeof(primary_format), NULL); if (result != DS_OK) { mame_printf_error("Error getting primary DirectSound buffer format: %08x\n", (UINT32)result); goto error; } mame_printf_verbose("DirectSound: Primary buffer: %d Hz, %d bits, %d channels\n", (int)primary_format.nSamplesPerSec, (int)primary_format.wBitsPerSample, (int)primary_format.nChannels); // create a buffer desc for the stream buffer memset(&stream_desc, 0, sizeof(stream_desc)); stream_desc.dwSize = sizeof(stream_desc); stream_desc.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2; stream_desc.dwBufferBytes = stream_buffer_size; stream_desc.lpwfxFormat = &stream_format; // create the stream buffer result = IDirectSound_CreateSoundBuffer(dsound, &stream_desc, &stream_buffer, NULL); if (result != DS_OK) { mame_printf_error("Error creating DirectSound stream buffer: %08x\n", (UINT32)result); goto error; } // lock the buffer result = IDirectSoundBuffer_Lock(stream_buffer, 0, stream_buffer_size, &buffer, &locked, NULL, NULL, 0); if (result != DS_OK) { mame_printf_error("Error locking DirectSound stream buffer: %08x\n", (UINT32)result); goto error; } // clear the buffer and unlock it memset(buffer, 0, locked); IDirectSoundBuffer_Unlock(stream_buffer, buffer, locked, NULL, 0); return DS_OK; // error handling error: dsound_destroy_buffers(); return result; }
static HRESULT dsound_init(running_machine *machine) { HRESULT result; // create the DirectSound object result = DirectSoundCreate(NULL, &dsound, NULL); if (result != DS_OK) { mame_printf_error("Error creating DirectSound: %08x\n", (UINT32)result); goto error; } // get the capabilities dsound_caps.dwSize = sizeof(dsound_caps); result = IDirectSound_GetCaps(dsound, &dsound_caps); if (result != DS_OK) { mame_printf_error("Error getting DirectSound capabilities: %08x\n", (UINT32)result); goto error; } // set the cooperative level result = IDirectSound_SetCooperativeLevel(dsound, win_window_list->hwnd, DSSCL_PRIORITY); if (result != DS_OK) { mame_printf_error("Error setting DirectSound cooperative level: %08x\n", (UINT32)result); goto error; } // make a format description for what we want stream_format.wBitsPerSample = 16; stream_format.wFormatTag = WAVE_FORMAT_PCM; stream_format.nChannels = 2; stream_format.nSamplesPerSec = machine->sample_rate; stream_format.nBlockAlign = stream_format.wBitsPerSample * stream_format.nChannels / 8; stream_format.nAvgBytesPerSec = stream_format.nSamplesPerSec * stream_format.nBlockAlign; // compute the buffer size based on the output sample rate stream_buffer_size = stream_format.nSamplesPerSec * stream_format.nBlockAlign * options_get_int(machine->options(), WINOPTION_AUDIO_LATENCY) / 10; stream_buffer_size = (stream_buffer_size / 1024) * 1024; if (stream_buffer_size < 1024) stream_buffer_size = 1024; LOG(("stream_buffer_size = %d\n", stream_buffer_size)); // create the buffers result = dsound_create_buffers(); if (result != DS_OK) goto error; // start playing result = IDirectSoundBuffer_Play(stream_buffer, 0, 0, DSBPLAY_LOOPING); if (result != DS_OK) { mame_printf_error("Error playing: %08x\n", (UINT32)result); goto error; } return DS_OK; // error handling error: dsound_destroy_buffers(); dsound_kill(); return result; }
HRESULT sound_direct_sound::dsound_init() { HRESULT result; // create the DirectSound object result = DirectSoundCreate(NULL, &dsound, NULL); if (result != DS_OK) { osd_printf_error("Error creating DirectSound: %08x\n", (UINT32)result); goto error; } // get the capabilities dsound_caps.dwSize = sizeof(dsound_caps); result = IDirectSound_GetCaps(dsound, &dsound_caps); if (result != DS_OK) { osd_printf_error("Error getting DirectSound capabilities: %08x\n", (UINT32)result); goto error; } // set the cooperative level #ifdef SDLMAME_WIN32 SDL_SysWMinfo wminfo; SDL_VERSION(&wminfo.version); #if (SDLMAME_SDL2) SDL_GetWindowWMInfo(sdl_window_list->sdl_window(), &wminfo); result = IDirectSound_SetCooperativeLevel(dsound, wminfo.info.win.window, DSSCL_PRIORITY); #else SDL_GetWMInfo(&wminfo); result = IDirectSound_SetCooperativeLevel(dsound, wminfo.window, DSSCL_PRIORITY); #endif #else result = IDirectSound_SetCooperativeLevel(dsound, win_window_list->m_hwnd, DSSCL_PRIORITY); #endif if (result != DS_OK) { osd_printf_error("Error setting DirectSound cooperative level: %08x\n", (UINT32)result); goto error; } // make a format description for what we want stream_format.wBitsPerSample = 16; stream_format.wFormatTag = WAVE_FORMAT_PCM; stream_format.nChannels = 2; stream_format.nSamplesPerSec = sample_rate(); stream_format.nBlockAlign = stream_format.wBitsPerSample * stream_format.nChannels / 8; stream_format.nAvgBytesPerSec = stream_format.nSamplesPerSec * stream_format.nBlockAlign; // compute the buffer size based on the output sample rate int audio_latency; audio_latency = m_audio_latency; stream_buffer_size = stream_format.nSamplesPerSec * stream_format.nBlockAlign * audio_latency / 10; stream_buffer_size = (stream_buffer_size / 1024) * 1024; if (stream_buffer_size < 1024) stream_buffer_size = 1024; LOG(("stream_buffer_size = %d\n", stream_buffer_size)); // create the buffers result = dsound_create_buffers(); if (result != DS_OK) goto error; // start playing result = IDirectSoundBuffer_Play(stream_buffer, 0, 0, DSBPLAY_LOOPING); if (result != DS_OK) { osd_printf_error("Error playing: %08x\n", (UINT32)result); goto error; } return DS_OK; // error handling error: dsound_destroy_buffers(); dsound_kill(); return result; }
static int dsound_init(void) { HRESULT result; // now attempt to create it result = DirectSoundCreate(NULL, &dsound, NULL); if (result != DS_OK) { fprintf(stderr, "Error creating DirectSound: %08x\n", (UINT32)result); goto cant_create_dsound; } // get the capabilities dsound_caps.dwSize = sizeof(dsound_caps); result = IDirectSound_GetCaps(dsound, &dsound_caps); if (result != DS_OK) { fprintf(stderr, "Error getting DirectSound capabilities: %08x\n", (UINT32)result); goto cant_get_caps; } // set the cooperative level result = IDirectSound_SetCooperativeLevel(dsound, win_window_list->hwnd, DSSCL_PRIORITY); if (result != DS_OK) { fprintf(stderr, "Error setting cooperative level: %08x\n", (UINT32)result); goto cant_set_coop_level; } // make a format description for what we want stream_format.wBitsPerSample = 16; stream_format.wFormatTag = WAVE_FORMAT_PCM; stream_format.nChannels = 2; stream_format.nSamplesPerSec = Machine->sample_rate; stream_format.nBlockAlign = stream_format.wBitsPerSample * stream_format.nChannels / 8; stream_format.nAvgBytesPerSec = stream_format.nSamplesPerSec * stream_format.nBlockAlign; // compute the buffer sizes stream_buffer_size = ((UINT64)MAX_BUFFER_SIZE * (UINT64)stream_format.nSamplesPerSec) / 44100; stream_buffer_size = (stream_buffer_size * stream_format.nBlockAlign) / 4; stream_buffer_size = (stream_buffer_size * 30) / Machine->screen[0].refresh; stream_buffer_size = (stream_buffer_size / 1024) * 1024; // compute the upper/lower thresholds lower_thresh = audio_latency * stream_buffer_size / 5; upper_thresh = (audio_latency + 1) * stream_buffer_size / 5; #if LOG_SOUND fprintf(sound_log, "stream_buffer_size = %d (max %d)\n", stream_buffer_size, MAX_BUFFER_SIZE); fprintf(sound_log, "lower_thresh = %d\n", lower_thresh); fprintf(sound_log, "upper_thresh = %d\n", upper_thresh); #endif // create the buffers if (dsound_create_buffers()) goto cant_create_buffers; // start playing is_enabled = 1; result = IDirectSoundBuffer_Play(stream_buffer, 0, 0, DSBPLAY_LOOPING); if (result != DS_OK) { fprintf(stderr, "Error playing: %08x\n", (UINT32)result); goto cant_play; } return 0; // error handling cant_play: dsound_destroy_buffers(); cant_create_buffers: cant_set_coop_level: cant_get_caps: IDirectSound_Release(dsound); cant_create_dsound: dsound = NULL; return 0; }