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; }
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 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; }
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; }