make dsound use the desktop window handle (#286)

* Dsound driver is now making use of an already existing window handle: the desktop window
* Removing of fluid_dll.c because it has becoming useless
* avoid a potential deadlock when calling functions within DllMain()
* remove obsolete fluid_set_hinstance() and fluid_get_hinstance() from public API
This commit is contained in:
Tom M 2017-11-22 16:42:48 +01:00 committed by GitHub
parent d00dc1c78a
commit eb5945bb2c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 5 additions and 163 deletions

View file

@ -77,6 +77,7 @@ Changes in FluidSynth 2.0.0 concerning developers:
- remove deprecated fluid_synth_get_program() and fluid_synth_get_channel_preset(), use fluid_synth_get_channel_info() instead
- remove deprecated fluid_settings_getstr()
- remove deprecated fluid_synth_set_midi_router()
- remove deprecated fluid_get_hinstance() and fluid_set_hinstance() (dsound driver now uses the desktop window)
- remove deprecated FLUID_HINT_INTEGER
- remove misspelled FLUID_SEQ_PITCHWHHELSENS macro
- remove obsolete "audio.[out|in]put-channels" settings

View file

@ -64,12 +64,6 @@ FLUIDSYNTH_API int fluid_is_soundfont (const char *filename);
FLUIDSYNTH_API int fluid_is_midifile (const char *filename);
#ifdef WIN32
FLUIDSYNTH_API void* fluid_get_hinstance(void);
FLUIDSYNTH_API void fluid_set_hinstance(void* hinstance);
#endif
#ifdef __cplusplus
}
#endif

View file

@ -76,7 +76,7 @@ if ( PORTAUDIO_SUPPORT )
endif ( PORTAUDIO_SUPPORT )
if ( WINDOWS_SUPPORT )
set ( fluid_windows_SOURCES fluid_dll.c drivers/fluid_dsound.c drivers/fluid_winmidi.c )
set ( fluid_windows_SOURCES drivers/fluid_dsound.c drivers/fluid_winmidi.c )
endif ( WINDOWS_SUPPORT )
if ( OSS_SUPPORT )

View file

@ -35,12 +35,8 @@ new_fluid_dsound_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth);
void delete_fluid_dsound_audio_driver(fluid_audio_driver_t* data);
DWORD WINAPI fluid_dsound_audio_run(LPVOID lpParameter);
HWND fluid_win32_get_window(void);
char* fluid_win32_error(HRESULT hr);
#define FLUID_HINSTANCE ((HINSTANCE)fluid_get_hinstance())
typedef struct {
fluid_audio_driver_t driver;
LPDIRECTSOUND direct_sound;
@ -109,21 +105,7 @@ new_fluid_dsound_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
double sample_rate;
int periods, period_size;
fluid_dsound_devsel_t devsel;
/* check if the globals are initialized */
if (FLUID_HINSTANCE == NULL) {
FLUID_LOG(FLUID_ERR, "FluidSynth hinstance not set, which is needed for DirectSound");
return NULL;
}
/*
if (fluid_wnd == NULL) {
if (fluid_win32_create_window() != 0) {
FLUID_LOG(FLUID_ERR, "Couldn't create window needed for DirectSound");
return NULL;
}
}
*/
/* create and clear the driver data */
dev = FLUID_NEW(fluid_dsound_audio_driver_t);
if (dev == NULL) {
@ -131,7 +113,6 @@ new_fluid_dsound_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
return NULL;
}
FLUID_MEMSET(dev, 0, sizeof(fluid_dsound_audio_driver_t));
dev->synth = synth;
dev->cont = 1;
@ -182,8 +163,8 @@ new_fluid_dsound_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
FLUID_LOG(FLUID_ERR, "Failed to create the DirectSound object");
goto error_recovery;
}
hr = IDirectSound_SetCooperativeLevel(dev->direct_sound, fluid_win32_get_window(), DSSCL_PRIORITY);
hr = IDirectSound_SetCooperativeLevel(dev->direct_sound, GetDesktopWindow(), DSSCL_PRIORITY);
if (hr != DS_OK) {
FLUID_LOG(FLUID_ERR, "Failed to set the cooperative level");
goto error_recovery;
@ -301,7 +282,6 @@ void delete_fluid_dsound_audio_driver(fluid_audio_driver_t* d)
if (dev->direct_sound != NULL) {
IDirectSound_Release(dev->direct_sound);
}
FLUID_FREE(dev);
}

View file

@ -1,133 +0,0 @@
/* FluidSynth - A Software Synthesizer
*
* Copyright (C) 2003 Peter Hanappe and others.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA
*/
#ifdef WIN32
#include "fluidsynth_priv.h"
#include "fluid_sys.h"
static HINSTANCE fluid_hinstance = NULL;
static HWND fluid_wnd = NULL;
static int fluid_refCount = 0;
int fluid_win32_create_window(void);
void fluid_win32_destroy_window(void);
HWND fluid_win32_get_window(void);
#ifndef FLUIDSYNTH_NOT_A_DLL
BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
FLUID_LOG(FLUID_DBG, "DllMain");
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
fluid_refCount++;
if (1 == fluid_refCount) {
fluid_set_hinstance((void*) hModule);
fluid_win32_create_window();
}
break;
case DLL_PROCESS_DETACH:
fluid_refCount--;
if (fluid_refCount == 0) {
fluid_win32_destroy_window();
}
break;
}
return TRUE;
}
#endif
/**
* Set the handle to the instance of the application on the Windows platform.
* @param Application instance pointer
*
* The handle is needed to open DirectSound.
*/
void fluid_set_hinstance(void* hinstance)
{
if (fluid_hinstance == NULL) {
fluid_hinstance = (HINSTANCE) hinstance;
FLUID_LOG(FLUID_DBG, "DLL instance = %d", (int) fluid_hinstance);
}
}
/**
* Get the handle to the instance of the application on the Windows platform.
* @return Application instance pointer or NULL if not set
*/
void* fluid_get_hinstance(void)
{
return (void*) fluid_hinstance;
}
static long FAR PASCAL fluid_win32_wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_CREATE:
break;
case WM_DESTROY:
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return(0L);
}
int fluid_win32_create_window(void)
{
WNDCLASS myClass;
myClass.hCursor = LoadCursor( NULL, IDC_ARROW );
myClass.hIcon = NULL;
myClass.lpszMenuName = (LPSTR) NULL;
myClass.lpszClassName = (LPSTR) "FluidSynth";
myClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);
myClass.hInstance = fluid_hinstance;
myClass.style = CS_GLOBALCLASS;
myClass.lpfnWndProc = fluid_win32_wndproc;
myClass.cbClsExtra = 0;
myClass.cbWndExtra = 0;
if (!RegisterClass(&myClass)) {
return -100;
}
fluid_wnd = CreateWindow((LPSTR) "FluidSynth", (LPSTR) "FluidSynth", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, (HWND) NULL, (HMENU) NULL,
fluid_hinstance, (LPSTR) NULL);
if (fluid_wnd == NULL) {
FLUID_LOG(FLUID_ERR, "Can't create window");
return -101;
}
return 0;
}
void fluid_win32_destroy_window(void)
{
HWND hwnd = fluid_win32_get_window();
if (hwnd) {
DestroyWindow(hwnd);
fluid_wnd = 0;
}
}
HWND fluid_win32_get_window(void)
{
return fluid_wnd;
}
#endif // #ifdef WIN32