template <typename T> ComPointer<T> getService(const Filter &filter, REFGUID guidService, REFIID riid) { //normally we should use IID_IMFGetService but this introduces another dependency //so here we simply define our own IId with the same value ComPointer<T> ret; ComPointer<IMFGetService> getService(filter, IID_IMFGetService); if (getService) { getService->GetService(guidService, riid, reinterpret_cast<void**>(ret.pparam())); } return ret; }
QList<InputPin> BackendNode::pins(const Filter &filter, PIN_DIRECTION wantedDirection) { QList<InputPin> ret; if (filter) { ComPointer<IEnumPins> enumPin; HRESULT hr = filter->EnumPins(enumPin.pparam()); Q_UNUSED(hr); Q_ASSERT( SUCCEEDED(hr)); InputPin pin; while (enumPin->Next(1, pin.pparam(), 0) == S_OK) { PIN_DIRECTION dir; hr = pin->QueryDirection(&dir); Q_ASSERT( SUCCEEDED(hr)); if (dir == wantedDirection) { ret.append(pin); } } } return ret; }
QHash<QByteArray, QVariant> Backend::objectDescriptionProperties(Phonon::ObjectDescriptionType type, int index) const { QMutexLocker locker(&m_directShowMutex); QHash<QByteArray, QVariant> ret; switch (type) { case Phonon::AudioOutputDeviceType: { #ifdef Q_OS_WINCE ret["name"] = QLatin1String("default audio device"); #else const AudioMoniker &mon = m_audioOutputs[index]; LPOLESTR str = 0; HRESULT hr = mon->GetDisplayName(0,0, &str); if (SUCCEEDED(hr)) { QString name = QString::fromUtf16((const unsigned short*) str); ComPointer<IMalloc> alloc; ::CoGetMalloc(1, alloc.pparam()); alloc->Free(str); ret["name"] = name.mid(name.indexOf('\\') + 1); } #endif } break; #ifndef QT_NO_PHONON_EFFECT case Phonon::EffectType: { WCHAR name[80]; // 80 is clearly stated in the MSDN doc HRESULT hr = ::DMOGetName(m_audioEffects[index], name); if (SUCCEEDED(hr)) { ret["name"] = QString::fromUtf16((const unsigned short*) name); } } break; #endif //QT_NO_PHONON_EFFECT default: break; } return ret; }
QList<int> Backend::objectDescriptionIndexes(Phonon::ObjectDescriptionType type) const { QMutexLocker locker(&m_directShowMutex); QList<int> ret; switch(type) { case Phonon::AudioOutputDeviceType: { #ifdef Q_OS_WINCE ret << 0; // only one audio device with index 0 #else ComPointer<ICreateDevEnum> devEnum(CLSID_SystemDeviceEnum, IID_ICreateDevEnum); if (!devEnum) { return ret; //it is impossible to enumerate the devices } ComPointer<IEnumMoniker> enumMon; HRESULT hr = devEnum->CreateClassEnumerator(CLSID_AudioRendererCategory, enumMon.pparam(), 0); if (FAILED(hr)) { break; } AudioMoniker mon; //let's reorder the devices so that directshound appears first int nbds = 0; //number of directsound devices while (S_OK == enumMon->Next(1, mon.pparam(), 0)) { LPOLESTR str = 0; mon->GetDisplayName(0,0,&str); const QString name = QString::fromUtf16((const unsigned short*) str); ComPointer<IMalloc> alloc; ::CoGetMalloc(1, alloc.pparam()); alloc->Free(str); int insert_pos = 0; if (!m_audioOutputs.contains(mon)) { insert_pos = m_audioOutputs.count(); m_audioOutputs.append(mon); } else { insert_pos = m_audioOutputs.indexOf(mon); } if (name.contains(QLatin1String("DirectSound"))) { ret.insert(nbds++, insert_pos); } else { ret.append(insert_pos); } } #endif break; } #ifndef QT_NO_PHONON_EFFECT case Phonon::EffectType: { m_audioEffects.clear(); ComPointer<IEnumDMO> enumDMO; HRESULT hr = ::DMOEnum(DMOCATEGORY_AUDIO_EFFECT, DMO_ENUMF_INCLUDE_KEYED, 0, 0, 0, 0, enumDMO.pparam()); if (SUCCEEDED(hr)) { CLSID clsid; while (S_OK == enumDMO->Next(1, &clsid, 0, 0)) { ret += m_audioEffects.count(); m_audioEffects.append(clsid); } } break; } break; #endif //QT_NO_PHONON_EFFECT default: break; } return ret; }