Getting close to fixing the xaudio2 driver for the wxwidgets frontend.
This commit is contained in:
parent
6edf950d00
commit
80db6fc884
|
@ -19,6 +19,62 @@
|
||||||
#include "../System.h" // for systemMessage()
|
#include "../System.h" // for systemMessage()
|
||||||
#include "../gba/Globals.h"
|
#include "../gba/Globals.h"
|
||||||
|
|
||||||
|
int GetXA2Devices(IXAudio2 *xa, wxArrayString *names, wxArrayString *ids,
|
||||||
|
const wxString *match)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
UINT32 dev_count = 0;
|
||||||
|
hr = xa->GetDeviceCount( &dev_count );
|
||||||
|
if( hr != S_OK ) {
|
||||||
|
wxLogError(_("XAudio2: Enumerating devices failed!"));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
XAUDIO2_DEVICE_DETAILS dd;
|
||||||
|
for( UINT32 i = 0; i < dev_count; i++ ) {
|
||||||
|
hr = xa->GetDeviceDetails( i, &dd );
|
||||||
|
if( hr != S_OK ) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if(ids) {
|
||||||
|
ids->push_back(dd.DeviceID);
|
||||||
|
names->push_back( dd.DisplayName );
|
||||||
|
} else if(*match == dd.DeviceID)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetXA2Devices(wxArrayString &names, wxArrayString &ids)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IXAudio2 *xa = NULL;
|
||||||
|
UINT32 flags = 0;
|
||||||
|
#ifdef _DEBUG
|
||||||
|
flags = XAUDIO2_DEBUG_ENGINE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
hr = XAudio2Create( &xa, flags );
|
||||||
|
if( hr != S_OK ) {
|
||||||
|
wxLogError( _("The XAudio2 interface failed to initialize!") );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
GetXA2Devices(xa, &names, &ids, NULL);
|
||||||
|
xa->Release();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int XA2GetDev(IXAudio2 *xa)
|
||||||
|
{
|
||||||
|
if(gopts.audio_dev.empty())
|
||||||
|
return 0;
|
||||||
|
else {
|
||||||
|
int ret = GetXA2Devices(xa, NULL, NULL, &gopts.audio_dev);
|
||||||
|
return ret < 0 ? 0 : ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class XAudio2_Output;
|
class XAudio2_Output;
|
||||||
|
|
||||||
|
@ -94,7 +150,7 @@ public:
|
||||||
HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( LPCWSTR pwstrDeviceId, DWORD dwNewState ) { return S_OK; }
|
HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( LPCWSTR pwstrDeviceId, DWORD dwNewState ) { return S_OK; }
|
||||||
HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( LPCWSTR pwstrDeviceId, const PROPERTYKEY key ) { return S_OK; }
|
HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( LPCWSTR pwstrDeviceId, const PROPERTYKEY key ) { return S_OK; }
|
||||||
|
|
||||||
void do_register(sound_out_i_xaudio2 * p_instance)
|
void do_register(XAudio2_Output * p_instance)
|
||||||
{
|
{
|
||||||
if ( InterlockedIncrement( ®istered ) == 1 )
|
if ( InterlockedIncrement( ®istered ) == 1 )
|
||||||
{
|
{
|
||||||
|
@ -111,7 +167,7 @@ public:
|
||||||
LeaveCriticalSection( &lock );
|
LeaveCriticalSection( &lock );
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_unregister( sound_out_i_xaudio2 * p_instance )
|
void do_unregister( XAudio2_Output * p_instance )
|
||||||
{
|
{
|
||||||
if ( InterlockedDecrement( ®istered ) == 0 )
|
if ( InterlockedDecrement( ®istered ) == 0 )
|
||||||
{
|
{
|
||||||
|
@ -277,9 +333,6 @@ void XAudio2_Output::device_change()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int XA2GetDev(IXAudio2 *);
|
|
||||||
|
|
||||||
|
|
||||||
bool XAudio2_Output::init(long sampleRate)
|
bool XAudio2_Output::init(long sampleRate)
|
||||||
{
|
{
|
||||||
if( failed || initialized ) return false;
|
if( failed || initialized ) return false;
|
||||||
|
@ -288,9 +341,9 @@ bool XAudio2_Output::init(long sampleRate)
|
||||||
|
|
||||||
// Initialize XAudio2
|
// Initialize XAudio2
|
||||||
UINT32 flags = 0;
|
UINT32 flags = 0;
|
||||||
#ifdef _DEBUG
|
//#ifdef _DEBUG
|
||||||
flags = XAUDIO2_DEBUG_ENGINE;
|
// flags = XAUDIO2_DEBUG_ENGINE;
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
hr = XAudio2Create( &xaud, flags );
|
hr = XAudio2Create( &xaud, flags );
|
||||||
if( hr != S_OK ) {
|
if( hr != S_OK ) {
|
||||||
|
@ -452,7 +505,7 @@ void XAudio2_Output::write(u16 * finalWave, int length)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// the maximum number of buffers is currently queued
|
// the maximum number of buffers is currently queued
|
||||||
if( synchronize && !speedup && !gopts.throttle ) {
|
if( synchronize && !speedup && !gopts.throttle && !gba_joybus_active ) {
|
||||||
// wait for one buffer to finish playing
|
// wait for one buffer to finish playing
|
||||||
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
||||||
device_changed = true;
|
device_changed = true;
|
||||||
|
@ -536,59 +589,6 @@ SoundDriver *newXAudio2_Output()
|
||||||
return new XAudio2_Output();
|
return new XAudio2_Output();
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetXA2Devices(IXAudio2 *xa, wxArrayString *names, wxArrayString *ids,
|
|
||||||
const wxString *match)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
UINT32 dev_count = 0;
|
|
||||||
hr = xa->GetDeviceCount( &dev_count );
|
|
||||||
if( hr != S_OK ) {
|
|
||||||
wxLogError(_("XAudio2: Enumerating devices failed!"));
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
XAUDIO2_DEVICE_DETAILS dd;
|
|
||||||
for( UINT32 i = 0; i < dev_count; i++ ) {
|
|
||||||
hr = xa->GetDeviceDetails( i, &dd );
|
|
||||||
if( hr != S_OK ) {
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if(ids) {
|
|
||||||
ids->push_back(dd.DeviceID);
|
|
||||||
names->push_back( dd.DisplayName );
|
|
||||||
} else if(*match == dd.DeviceID)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetXA2Devices(wxArrayString &names, wxArrayString &ids)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
IXAudio2 *xa = NULL;
|
|
||||||
UINT32 flags = 0;
|
|
||||||
#ifdef _DEBUG
|
|
||||||
flags = XAUDIO2_DEBUG_ENGINE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hr = XAudio2Create( &xa, flags );
|
|
||||||
if( hr != S_OK ) {
|
|
||||||
wxLogError( _("The XAudio2 interface failed to initialize!") );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
GetXA2Devices(xa, &names, &ids, NULL);
|
|
||||||
xa->Release();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int XA2GetDev(IXAudio2 *xa)
|
|
||||||
{
|
|
||||||
if(gopts.audio_dev.empty())
|
|
||||||
return 0;
|
|
||||||
else {
|
|
||||||
int ret = GetXA2Devices(xa, NULL, NULL, &gopts.audio_dev);
|
|
||||||
return ret < 0 ? 0 : ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // #ifndef NO_XAUDIO2
|
#endif // #ifndef NO_XAUDIO2
|
||||||
|
|
Loading…
Reference in New Issue