static HRESULT WINAPI IDirectMusicPerformance8Impl_CreateAudioPath (LPDIRECTMUSICPERFORMANCE8 iface, IUnknown* pSourceConfig, BOOL fActivate, IDirectMusicAudioPath** ppNewPath) { IDirectMusicAudioPathImpl *default_path; IDirectMusicAudioPath *pPath; IDirectMusicPerformance8Impl *This = (IDirectMusicPerformance8Impl *)iface; FIXME("(%p, %p, %d, %p): stub\n", This, pSourceConfig, fActivate, ppNewPath); if (NULL == ppNewPath) { return E_POINTER; } DMUSIC_CreateDirectMusicAudioPathImpl (&IID_IDirectMusicAudioPath, (LPVOID*)&pPath, NULL); default_path = (IDirectMusicAudioPathImpl*)((char*)(pPath) - offsetof(IDirectMusicAudioPathImpl,AudioPathVtbl)); default_path->pPerf = (IDirectMusicPerformance8*) This; /** TODO */ *ppNewPath = pPath; return IDirectMusicAudioPath_Activate(*ppNewPath, fActivate); }
static HRESULT WINAPI IDirectMusicPerformance8Impl_CreateAudioPath(IDirectMusicPerformance8 *iface, IUnknown *pSourceConfig, BOOL fActivate, IDirectMusicAudioPath **ppNewPath) { IDirectMusicPerformance8Impl *This = impl_from_IDirectMusicPerformance8(iface); IDirectMusicAudioPathImpl *default_path; IDirectMusicAudioPath *pPath; FIXME("(%p, %p, %d, %p): stub\n", This, pSourceConfig, fActivate, ppNewPath); if (NULL == ppNewPath) { return E_POINTER; } create_dmaudiopath(&IID_IDirectMusicAudioPath, (void**)&pPath); default_path = (IDirectMusicAudioPathImpl*)((char*)(pPath) - offsetof(IDirectMusicAudioPathImpl,AudioPathVtbl)); default_path->pPerf = &This->IDirectMusicPerformance8_iface; /** TODO */ *ppNewPath = pPath; return IDirectMusicAudioPath_Activate(*ppNewPath, fActivate); }
static HRESULT WINAPI IDirectMusicPerformance8Impl_CreateStandardAudioPath (LPDIRECTMUSICPERFORMANCE8 iface, DWORD dwType, DWORD dwPChannelCount, BOOL fActivate, IDirectMusicAudioPath** ppNewPath) { IDirectMusicAudioPathImpl *default_path; IDirectMusicAudioPath *pPath; DSBUFFERDESC desc; WAVEFORMATEX format; LPDIRECTSOUNDBUFFER buffer; HRESULT hr = S_OK; IDirectMusicPerformance8Impl *This = (IDirectMusicPerformance8Impl *)iface; FIXME("(%p)->(%d, %d, %d, %p): semi-stub\n", This, dwType, dwPChannelCount, fActivate, ppNewPath); if (NULL == ppNewPath) { return E_POINTER; } DMUSIC_CreateDirectMusicAudioPathImpl (&IID_IDirectMusicAudioPath, (LPVOID*)&pPath, NULL); default_path = (IDirectMusicAudioPathImpl*)((char*)(pPath) - offsetof(IDirectMusicAudioPathImpl,AudioPathVtbl)); default_path->pPerf = (IDirectMusicPerformance8*) This; /* Secondary buffer description */ memset(&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 1; format.nSamplesPerSec = 44000; format.nAvgBytesPerSec = 44000*2; format.nBlockAlign = 2; format.wBitsPerSample = 16; format.cbSize = 0; memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS; desc.dwBufferBytes = DSBSIZE_MIN; desc.dwReserved = 0; desc.lpwfxFormat = &format; desc.guid3DAlgorithm = GUID_NULL; switch(dwType) { case DMUS_APATH_DYNAMIC_3D: desc.dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE; break; case DMUS_APATH_DYNAMIC_MONO: desc.dwFlags |= DSBCAPS_CTRLFREQUENCY; break; case DMUS_APATH_SHARED_STEREOPLUSREVERB: /* normally we have to create 2 buffers (one for music other for reverb) * in this case. See msdn */ case DMUS_APATH_DYNAMIC_STEREO: desc.dwFlags |= DSBCAPS_CTRLFREQUENCY; format.nChannels = 2; format.nBlockAlign *= 2; format.nAvgBytesPerSec *=2; break; default: HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return E_INVALIDARG; } /* FIXME: Should we create one secondary buffer for each PChannel? */ hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL); if (FAILED(hr)) { HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return DSERR_BUFFERLOST; } default_path->pDSBuffer = buffer; /* Update description for creating primary buffer */ desc.dwFlags |= DSBCAPS_PRIMARYBUFFER; desc.dwBufferBytes = 0; desc.lpwfxFormat = NULL; hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL); if (FAILED(hr)) { IDirectSoundBuffer_Release(default_path->pDSBuffer); HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return DSERR_BUFFERLOST; } default_path->pPrimary = buffer; *ppNewPath = pPath; TRACE(" returning IDirectMusicPerformance interface at %p.\n", *ppNewPath); return IDirectMusicAudioPath_Activate(*ppNewPath, fActivate); }