HRESULT CMusicManager::Initialize( HWND hWnd, DWORD dwPChannels, DWORD dwDefaultPathType ) { HRESULT hr; if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&m_pLoader ) ) ) return DXTRACE_ERR( TEXT("CoCreateInstance"), hr ); if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void**)&m_pPerformance ) ) ) return DXTRACE_ERR( TEXT("CoCreateInstance"), hr ); if( FAILED( hr = m_pPerformance->InitAudio( NULL, NULL, hWnd, dwDefaultPathType, dwPChannels, DMUS_AUDIOF_ALL, NULL ) ) ) { if( hr == DSERR_NODRIVER ) { DXTRACE( "Warning: No sound card found\n" ); return hr; } return DXTRACE_ERR( TEXT("InitAudio"), hr ); } return S_OK; }
//----------------------------------------------------------------------------- // Name: CMusicManager::Initialize() // Desc: Inits DirectMusic using a standard audio path //----------------------------------------------------------------------------- HRESULT CMusicManager::Initialize(HWND hWnd, DWORD dwPChannels, DWORD dwDefaultPathType) { HRESULT hr; // Create loader object if (FAILED(hr = CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void **)&m_pLoader))) return DXTRACE_ERR(TEXT("CoCreateInstance"), hr); // Create performance object if (FAILED(hr = CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void **)&m_pPerformance))) return DXTRACE_ERR(TEXT("CoCreateInstance"), hr); // Initialize the performance with the standard audio path. // This initializes both DirectMusic and DirectSound and // sets up the synthesizer. Typcially its easist to use an // audio path for playing music and sound effects. if (FAILED(hr = m_pPerformance->InitAudio(NULL, NULL, hWnd, dwDefaultPathType, dwPChannels, DMUS_AUDIOF_ALL, NULL))) { if (hr == DSERR_NODRIVER) { DXTRACE("Warning: No sound card found\n"); return hr; } return DXTRACE_ERR(TEXT("InitAudio"), hr); } return S_OK; }
//----------------------------------------------------------------------------- // Name: CMusicManager::Initialize() // Desc: Inits DirectMusic using a standard audio path //----------------------------------------------------------------------------- HRESULT CMusicManager::Initialize( HWND hWnd, DWORD dwPChannels, DWORD dwDefaultPathType, LPDIRECTSOUND pDS ) { HRESULT hr; IDirectSound** ppDirectSound; if( pDS ) ppDirectSound = &pDS; else ppDirectSound = NULL; // Create loader object if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&m_pLoader ) ) ) return DXTRACE_ERR_MSGBOX( TEXT("CoCreateInstance"), hr ); // Create performance object if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void**)&m_pPerformance ) ) ) return DXTRACE_ERR_MSGBOX( TEXT("CoCreateInstance"), hr ); // Initialize the performance with the standard audio path. // This initializes both DirectMusic and DirectSound and // sets up the synthesizer. Typcially its easist to use an // audio path for playing music and sound effects. if( FAILED( hr = m_pPerformance->InitAudio( NULL, ppDirectSound, hWnd, dwDefaultPathType, dwPChannels, DMUS_AUDIOF_ALL, NULL ) ) ) { if( hr == DSERR_NODRIVER ) { DXTRACE( TEXT("Warning: No sound card found\n") ); return hr; } return DXTRACE_ERR_MSGBOX( TEXT("InitAudio"), hr ); } // Get the listener from the in the default audio path. IDirectMusicAudioPath8* pAudioPath = GetDefaultAudioPath(); if( pAudioPath ) // might be NULL if dwDefaultPathType == 0 { if( SUCCEEDED( hr = pAudioPath->GetObjectInPath( 0, DMUS_PATH_PRIMARY_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DListener, (LPVOID*) &m_pDSListener ) ) ) { // Get listener parameters m_dsListenerParams.dwSize = sizeof(DS3DLISTENER); m_pDSListener->GetAllParameters( &m_dsListenerParams ); } } return S_OK; }
//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CDPlay8Client::JoinSession( DWORD num ) { HRESULT hr; IDirectPlay8Address* pHostAddress = NULL; IDirectPlay8Address* pDeviceAddress = NULL; if( m_pDPlay == NULL ) return E_FAIL; DXTRACE( TEXT("MazeClient: Trying to connect to server\n") ); DPN_APPLICATION_DESC dpnAppDesc; ZeroMemory( &dpnAppDesc, sizeof( DPN_APPLICATION_DESC ) ); dpnAppDesc.dwSize = sizeof( DPN_APPLICATION_DESC ); dpnAppDesc.guidApplication = StressMazeAppGUID; dpnAppDesc.guidInstance = m_Sessions[num].guidInstance; EnterCriticalSection( &m_csLock ); // Copy the host and device address pointers, and addref them. // If this is not done, then there is a rare chance that // EnumSessionCallback() may be called during the Connect() call // and destory the address before DirectPlay gets a chance to copy them. pHostAddress = m_pHostAddresses[num]; pHostAddress->AddRef(); pDeviceAddress = m_pDeviceAddresses[num]; pDeviceAddress->AddRef(); LeaveCriticalSection( &m_csLock ); // Connect to the remote host // The enumeration is automatically canceled after Connect is called if( FAILED( hr = m_pDPlay->Connect( &dpnAppDesc, // Application description pHostAddress, // Session host address pDeviceAddress, // Address of device used to connect to the host NULL, NULL, // Security descriptions & credientials (MBZ in DPlay8) NULL, 0, // User data & its size NULL, // Asynchronous connection context (returned with DPNMSG_CONNECT_COMPLETE in async handshaking) NULL, // Asynchronous connection handle (used to cancel connection process) DPNOP_SYNC ) ) ) // Connect synchronously { if( hr == DPNERR_NORESPONSE || hr == DPNERR_ABORTED ) goto LCleanup; // These are possible if the server exits while joining if( hr == DPNERR_INVALIDINSTANCE ) goto LCleanup; // This is possible if the original server exits and another server comes online while we are connecting DXTRACE_ERR_NOMSGBOX( TEXT("Connect"), hr ); goto LCleanup; } m_bSessionLost = FALSE; DXTRACE( TEXT("MazeClient: Connected to server. Enum automatically canceled\n") ); UpdateConnectionInfo(); m_fLastUpdateConnectInfoTime = DXUtil_Timer( TIMER_GETAPPTIME ); LCleanup: SAFE_RELEASE( pHostAddress ); SAFE_RELEASE( pDeviceAddress ); return hr; }