void SFXXAudioProvider::init() { // Create a temp XAudio object for device enumeration. IXAudio2 *xAudio = NULL; if ( !_createXAudio( &xAudio ) ) { Con::errorf( "SFXXAudioProvider::init() - XAudio2 failed to load!" ); return; } // Add the devices to the info list. UINT32 count = 0; xAudio->GetDeviceCount( &count ); for ( UINT32 i = 0; i < count; i++ ) { XAUDIO2_DEVICE_DETAILS details; HRESULT hr = xAudio->GetDeviceDetails( i, &details ); if ( FAILED( hr ) ) continue; // Add a device to the info list. XADeviceInfo* info = new XADeviceInfo; info->deviceIndex = i; info->driver = String( "XAudio" ); info->name = String( details.DisplayName ); info->hasHardware = false; info->maxBuffers = 64; info->role = details.Role; info->format = details.OutputFormat; mDeviceInfo.push_back( info ); } // We're done with XAudio for now. SAFE_RELEASE( xAudio ); // If we have no devices... we're done. if ( mDeviceInfo.empty() ) { Con::errorf( "SFXXAudioProvider::init() - No valid XAudio2 devices found!" ); return; } // If we got this far then we should be able to // safely create a device for XAudio. regProvider( this ); }
BOOL XAudio2_Config::OnInitDialog() { CDialog::OnInitDialog(); m_combo_dev.ResetContent(); m_slider_buffer.SetRange( 2, 10, FALSE ); m_slider_buffer.SetTicFreq( 1 ); m_slider_buffer.SetPos( (int)m_buffer_count ); CString info; int pos = m_slider_buffer.GetPos(); info.Format( _T("%i frames = %.2f ms"), pos, (float)pos / 60.0f * 1000.0f ); m_info_buffer.SetWindowText( info ); HRESULT hr; IXAudio2 *xa = NULL; UINT32 flags = 0; #ifdef _DEBUG flags = XAUDIO2_DEBUG_ENGINE; #endif hr = XAudio2Create( &xa, flags ); if( hr != S_OK ) { systemMessage( IDS_XAUDIO2_FAILURE, NULL ); } else { UINT32 dev_count = 0; hr = xa->GetDeviceCount( &dev_count ); if( hr != S_OK ) { systemMessage( IDS_XAUDIO2_CANNOT_ENUMERATE_DEVICES, NULL ); } else { XAUDIO2_DEVICE_DETAILS dd; for( UINT32 i = 0; i < dev_count; i++ ) { hr = xa->GetDeviceDetails( i, &dd ); if( hr != S_OK ) { continue; } else { #ifdef _UNICODE int id = m_combo_dev.AddString( dd.DisplayName ); #else CHAR temp[256]; ZeroMemory( temp, sizeof( temp ) ); WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, dd.DisplayName, -1, temp, sizeof( temp ) - 1, NULL, NULL ); int id = m_combo_dev.AddString( temp ); #endif if( id < 0 ) { systemMessage( IDS_XAUDIO2_CANNOT_ENUMERATE_DEVICES, NULL ); break; } else { m_combo_dev.SetItemData( id, i ); } } } // select the currently configured device { int count = m_combo_dev.GetCount(); if( count > 0 ) { for( int i = 0; i < count; i++ ) { if( m_combo_dev.GetItemData( i ) == m_selected_device_index ) { m_combo_dev.SetCurSel( i ); break; } } } // } } xa->Release(); xa = NULL; } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }