static HRESULT WINAPI IDirectMusic8Impl_CreatePort (LPDIRECTMUSIC8 iface, REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT* ppPort, LPUNKNOWN pUnkOuter) { IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; int i/*, j*/; DMUS_PORTCAPS PortCaps; IDirectMusicPort* pNewPort = NULL; HRESULT hr = E_FAIL; TRACE("(%p, %s, %p, %p, %p)\n", This, debugstr_dmguid(rclsidPort), pPortParams, ppPort, pUnkOuter); ZeroMemory(&PortCaps, sizeof(DMUS_PORTCAPS)); PortCaps.dwSize = sizeof(DMUS_PORTCAPS); for (i = 0; S_FALSE != IDirectMusic8Impl_EnumPort(iface, i, &PortCaps); i++) { if (IsEqualCLSID (rclsidPort, &PortCaps.guidPort)) { hr = DMUSIC_CreateDirectMusicPortImpl(&IID_IDirectMusicPort, (LPVOID*) &pNewPort, (LPUNKNOWN) This, pPortParams, &PortCaps); if (FAILED(hr)) { *ppPort = NULL; return hr; } This->nrofports++; if (!This->ppPorts) This->ppPorts = HeapAlloc(GetProcessHeap(), 0, sizeof(LPDIRECTMUSICPORT) * This->nrofports); else This->ppPorts = HeapReAlloc(GetProcessHeap(), 0, This->ppPorts, sizeof(LPDIRECTMUSICPORT) * This->nrofports); This->ppPorts[This->nrofports - 1] = pNewPort; *ppPort = pNewPort; return S_OK; } } /* FIXME: place correct error here */ return E_NOINTERFACE; }
static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSID rclsid_port, LPDMUS_PORTPARAMS port_params, LPDIRECTMUSICPORT* port, LPUNKNOWN unkouter) { IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); int i; DMUS_PORTCAPS port_caps; IDirectMusicPort* new_port = NULL; HRESULT hr; GUID default_port; const GUID *request_port = rclsid_port; TRACE("(%p)->(%s, %p, %p, %p)\n", This, debugstr_dmguid(rclsid_port), port_params, port, unkouter); if (!rclsid_port) return E_POINTER; if (!port_params) return E_INVALIDARG; if (!port) return E_POINTER; if (unkouter) return CLASS_E_NOAGGREGATION; if (TRACE_ON(dmusic)) dump_DMUS_PORTPARAMS(port_params); ZeroMemory(&port_caps, sizeof(DMUS_PORTCAPS)); port_caps.dwSize = sizeof(DMUS_PORTCAPS); if (IsEqualGUID(request_port, &GUID_NULL)) { hr = IDirectMusic8_GetDefaultPort(iface, &default_port); if(FAILED(hr)) return hr; request_port = &default_port; } for (i = 0; S_FALSE != IDirectMusic8Impl_EnumPort(iface, i, &port_caps); i++) { if (IsEqualCLSID(request_port, &port_caps.guidPort)) { hr = This->system_ports[i].create(&IID_IDirectMusicPort, (LPVOID*)&new_port, (LPUNKNOWN)This, port_params, &port_caps, This->system_ports[i].device); if (FAILED(hr)) { *port = NULL; return hr; } This->nrofports++; if (!This->ppPorts) This->ppPorts = HeapAlloc(GetProcessHeap(), 0, sizeof(LPDIRECTMUSICPORT) * This->nrofports); else This->ppPorts = HeapReAlloc(GetProcessHeap(), 0, This->ppPorts, sizeof(LPDIRECTMUSICPORT) * This->nrofports); This->ppPorts[This->nrofports - 1] = new_port; *port = new_port; return S_OK; } } return E_NOINTERFACE; }