/* This file is part of the KDE project. Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). This library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2.1 or 3 of the License. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #include "backendnode.h" #include "mediaobject.h" #include // ISpecifyPropertyPages #include // OleCreatePropertyFrame QT_BEGIN_NAMESPACE namespace Phonon { namespace DS9 { // Displays a property dialog for a filter (experimental but should be put into main /*static void showPropertyDialog(const Filter &filter) { ComPointer prop(filter, IID_ISpecifyPropertyPages); if (prop != 0) { IUnknown *iunk[] = {filter}; // Show the page. CAUUID caGUID; prop->GetPages(&caGUID); OleCreatePropertyFrame( 0, // Parent window 0, 0, // (Reserved) 0, // Caption for the dialog box 1, // Number of objects (just the filter) iunk, // Array of object pointers. caGUID.cElems, // Number of property pages caGUID.pElems, // Array of property page CLSIDs 0, // Locale identifier 0, 0 // Reserved ); } }*/ //for now we have 2 graphs that do the same BackendNode::BackendNode(QObject *parent) : QObject(parent), m_mediaObject(0) { } BackendNode::~BackendNode() { //this will remove the filter from the graph FILTER_INFO info; for(int i = 0; i < FILTER_COUNT; ++i) { const Filter &filter = m_filters[i]; if (!filter) continue; filter->QueryFilterInfo(&info); if (info.pGraph) { HRESULT hr = info.pGraph->RemoveFilter(filter); if (hr == VFW_E_NOT_STOPPED && m_mediaObject) { m_mediaObject->ensureStopped(); hr = info.pGraph->RemoveFilter(filter); } Q_ASSERT(SUCCEEDED(hr)); info.pGraph->Release(); } } } void BackendNode::setMediaObject(MediaObject *mo) { if (m_mediaObject) { disconnect(m_mediaObject, SIGNAL(destroyed()), this, SLOT(mediaObjectDestroyed())); } m_mediaObject = mo; connect(mo, SIGNAL(destroyed()), SLOT(mediaObjectDestroyed())); } void BackendNode::mediaObjectDestroyed() { //remove the filter from its graph FILTER_INFO info; for(int i = 0; i < FILTER_COUNT; ++i) { const Filter &filter = m_filters[i]; if (!filter) continue; filter->QueryFilterInfo(&info); if (info.pGraph) { HRESULT hr = info.pGraph->RemoveFilter(filter); Q_ASSERT(SUCCEEDED(hr)); Q_UNUSED(hr); info.pGraph->Release(); } } m_mediaObject = 0; } QList BackendNode::pins(const Filter &filter, PIN_DIRECTION wantedDirection) { QList ret; if (filter) { ComPointer 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; } } } QT_END_NAMESPACE #include "moc_backendnode.cpp"