From 8b21cfe48bbc0c09b186fc42b3507e9d8fdaa082 Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Dec 03 2009 16:31:18 +0000 Subject: sync w/devel branch for phonon/pulseaudio goodness --- diff --git a/.cvsignore b/.cvsignore index 9f0958b..2526edb 100644 --- a/.cvsignore +++ b/.cvsignore @@ -6,3 +6,5 @@ hi22-phonon-gstreamer.png hi32-phonon-gstreamer.png hi48-phonon-gstreamer.png hi64-phonon-gstreamer.png +phonon-20091118svn.tar.bz2 +phonon-20091124svn.tar.bz2 diff --git a/phonon-4.2.96-pulseaudio.patch b/phonon-4.2.96-pulseaudio.patch deleted file mode 100644 index 1253402..0000000 --- a/phonon-4.2.96-pulseaudio.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff -Naurw phonon-4.2.96/phonon/globalconfig.cpp phonon-4.2.96.pulseaudio/phonon/globalconfig.cpp ---- phonon-4.2.96/phonon/globalconfig.cpp 2008-11-27 16:41:41.000000000 +0100 -+++ phonon-4.2.96.pulseaudio/phonon/globalconfig.cpp 2009-01-08 21:29:18.000000000 +0100 -@@ -31,6 +31,7 @@ - #include "phononnamespace_p.h" - - #include -+#include - #include - - QT_BEGIN_NAMESPACE -@@ -167,6 +168,15 @@ - | ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0) - ); - } -+ // make PulseAudio the global default (assume it is already default in this list) -+ if (!list.isEmpty()) { -+ int firstIndex = list.first(); -+ if (backendIface->objectDescriptionProperties(Phonon::AudioOutputDeviceType, -+ firstIndex)["name"].toString() == "PulseAudio") { -+ list.removeFirst(); -+ defaultList.prepend(firstIndex); -+ } -+ } - defaultList += list; - } - -@@ -222,6 +232,15 @@ - | ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0) - ); - } -+ // make PulseAudio the global default (assume it is already default in this list) -+ if (!list.isEmpty()) { -+ int firstIndex = list.first(); -+ if (backendIface->objectDescriptionProperties(Phonon::AudioCaptureDeviceType, -+ firstIndex)["name"].toString() == "PulseAudio") { -+ list.removeFirst(); -+ defaultList.prepend(firstIndex); -+ } -+ } - defaultList += list; - } - diff --git a/phonon-4.2.96-xine-pulseaudio.patch b/phonon-4.2.96-xine-pulseaudio.patch deleted file mode 100644 index bffc87c..0000000 --- a/phonon-4.2.96-xine-pulseaudio.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naurw phonon-4.2.96/xine/backend.cpp phonon-4.2.96.xine-pulseaudio/xine/backend.cpp ---- phonon-4.2.96/xine/backend.cpp 2008-12-19 08:08:53.000000000 +0100 -+++ phonon-4.2.96.xine-pulseaudio/xine/backend.cpp 2009-01-08 21:31:10.000000000 +0100 -@@ -649,7 +649,7 @@ - "in KDE2 and KDE3. Its use is discuraged.

"), - /*icon name */"audio-backend-arts", outputPlugins[i]); - } else if (0 == strcmp(outputPlugins[i], "pulseaudio")) { -- addAudioOutput(nextIndex++, 10, tr("PulseAudio"), -+ addAudioOutput(nextIndex++, 2000, tr("PulseAudio"), - xine_get_audio_driver_plugin_description(m_xine, outputPlugins[i]), - /*icon name */"audio-backend-pulseaudio", outputPlugins[i]); - } else if (0 == strcmp(outputPlugins[i], "esd")) { diff --git a/phonon-4.3.1-xineonly.patch b/phonon-4.3.1-xineonly.patch deleted file mode 100644 index 02167a6..0000000 --- a/phonon-4.3.1-xineonly.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff -up phonon-4.3.1/CMakeLists.txt.orig phonon-4.3.1/CMakeLists.txt ---- phonon-4.3.1/CMakeLists.txt.orig 2009-06-05 16:16:00.000000000 +0200 -+++ phonon-4.3.1/CMakeLists.txt 2009-06-05 16:22:48.000000000 +0200 -@@ -248,25 +248,8 @@ if(APPLE) - set(CMAKE_INSTALL_NAME_DIR ${LIB_INSTALL_DIR}) - endif(APPLE) - -- --add_subdirectory(cmake) --add_subdirectory(phonon) --add_subdirectory(includes) --if (Q_WS_MAC AND BUILD_PHONON_QT7) -- add_subdirectory(qt7) --endif (Q_WS_MAC AND BUILD_PHONON_QT7) --if (Q_WS_WIN) -- add_subdirectory(ds9) --endif (Q_WS_WIN) -- - if (Q_WS_X11) -- add_subdirectory(gstreamer) - add_subdirectory(xine) - endif (Q_WS_X11) - --if(NOT WIN32) # pkgconfig file -- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/phonon.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/phonon.pc @ONLY) -- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/phonon.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) --endif(NOT WIN32) -- - macro_display_feature_log() diff --git a/phonon-4.3.2-gstreamer-utf8-url.patch b/phonon-4.3.2-gstreamer-utf8-url.patch deleted file mode 100644 index 1ce8e38..0000000 --- a/phonon-4.3.2-gstreamer-utf8-url.patch +++ /dev/null @@ -1,59 +0,0 @@ -Index: gstreamer/mediaobject.h -=================================================================== ---- gstreamer/mediaobject.h (revision 932755) -+++ gstreamer/mediaobject.h (revision 932756) -@@ -185,7 +185,7 @@ - /* - * @param encodedUrl percent-encoded QString for source compat reasons. Should change to QUrl - */ -- bool createPipefromURL(const QString &encodedUrl); -+ bool createPipefromURL(const QUrl &url); - bool createPipefromStream(const MediaSource &); - - private Q_SLOTS: -Index: gstreamer/mediaobject.cpp -=================================================================== ---- gstreamer/mediaobject.cpp (revision 932755) -+++ gstreamer/mediaobject.cpp (revision 932756) -@@ -347,11 +347,8 @@ - * - * returns true if successful - */ --bool MediaObject::createPipefromURL(const QString &encodedUrl) -+bool MediaObject::createPipefromURL(const QUrl &url) - { -- // Convert back to URL -- QUrl url(encodedUrl, QUrl::StrictMode); -- - // Remove any existing data source - if (m_datasource) { - gst_bin_remove(GST_BIN(m_pipeline), m_datasource); -@@ -361,7 +358,7 @@ - - // Verify that the uri can be parsed - if (!url.isValid()) { -- m_backend->logMessage(QString("%1 is not a valid URI").arg(encodedUrl)); -+ m_backend->logMessage(QString("%1 is not a valid URI").arg(url.toString())); - return false; - } - -@@ -875,8 +872,7 @@ - - switch (source.type()) { - case MediaSource::Url: { -- QString urlString = source.url().toEncoded(); -- if (createPipefromURL(urlString)) -+ if (createPipefromURL(source.url())) - m_loading = true; - else - setError(tr("Could not open media source.")); -@@ -884,8 +880,7 @@ - break; - - case MediaSource::LocalFile: { -- QString urlString = QUrl::fromLocalFile(source.fileName()).toString(); -- if (createPipefromURL(urlString)) -+ if (createPipefromURL(QUrl::fromLocalFile(source.fileName()))) - m_loading = true; - else - setError(tr("Could not open media source.")); diff --git a/phonon-4.3.2-gstreamer-volumefader.patch b/phonon-4.3.2-gstreamer-volumefader.patch deleted file mode 100644 index 6dec292..0000000 --- a/phonon-4.3.2-gstreamer-volumefader.patch +++ /dev/null @@ -1,16 +0,0 @@ -Index: gstreamer/mediaobject.cpp -=================================================================== ---- gstreamer/mediaobject.cpp (revision 932979) -+++ gstreamer/mediaobject.cpp (revision 932980) -@@ -141,9 +141,9 @@ - if (m_resumeState) - return; - -- if (m_state == Phonon::PlayingState || m_state == Phonon::PausedState) { -+ if (m_pendingState == Phonon::PlayingState || m_pendingState == Phonon::PausedState) { - m_resumeState = true; -- m_oldState = m_state; -+ m_oldState = m_pendingState; - m_oldPos = getPipelinePos(); - } - } diff --git a/phonon-4.3.2-kdebug#172242-2.patch b/phonon-4.3.2-kdebug#172242-2.patch deleted file mode 100644 index b79e335..0000000 --- a/phonon-4.3.2-kdebug#172242-2.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up phonon-4.3.1/xine/mediaobject.cpp.kde#172242-2 phonon-4.3.1/xine/mediaobject.cpp ---- phonon-4.3.1/xine/mediaobject.cpp.kde#172242-2 2009-06-18 12:37:45.641000922 -0500 -+++ phonon-4.3.1/xine/mediaobject.cpp 2009-06-18 12:39:15.917231311 -0500 -@@ -321,7 +321,7 @@ static QByteArray mrlEncode(QByteArray m - { - for (int i = 0; i < mrl.size(); ++i) { - const unsigned char c = static_cast(mrl.at(i)); -- if (c & 0x80 || c == '\\' || c < 32 || c == '%') { -+ if (c & 0x80 || c == '\\' || c < 32 || c == '%' || c == '#') { - char enc[4]; - qsnprintf(enc, 4, "%%%02X", c); - mrl = mrl.left(i) + QByteArray(enc, 3) + mrl.mid(i + 1); diff --git a/phonon-4.3.2-kdebug#172242.patch b/phonon-4.3.2-kdebug#172242.patch deleted file mode 100644 index 4aec362..0000000 --- a/phonon-4.3.2-kdebug#172242.patch +++ /dev/null @@ -1,101 +0,0 @@ -Index: phonon/xine/xinestream.h -=================================================================== ---- phonon/xine/xinestream.h (revision 924144) -+++ phonon/xine/xinestream.h (revision 924145) -@@ -86,7 +86,6 @@ - //void needRewire(AudioPostList *postList); - void useGaplessPlayback(bool); - void useGapOf(int gap); -- void gaplessSwitchTo(const QUrl &url); - void gaplessSwitchTo(const QByteArray &mrl); - void closeBlocking(); - void aboutToDeleteVideoWidget(); -@@ -141,7 +140,6 @@ - - void unload(); - public slots: -- void setUrl(const QUrl &url); - void setMrl(const QByteArray &mrl, StateForNewMrl = StoppedState); - void play(); - void pause(); -Index: phonon/xine/mediaobject.cpp -=================================================================== ---- phonon/xine/mediaobject.cpp (revision 924144) -+++ phonon/xine/mediaobject.cpp (revision 924145) -@@ -317,6 +317,20 @@ - setSourceInternal(source, HardSwitch); - } - -+static QByteArray mrlEncode(QByteArray mrl) -+{ -+ for (int i = 0; i < mrl.size(); ++i) { -+ const unsigned char c = static_cast(mrl.at(i)); -+ if (c & 0x80 || c == '\\' || c < 32 || c == '%') { -+ char enc[4]; -+ qsnprintf(enc, 4, "%%%02X", c); -+ mrl = mrl.left(i) + QByteArray(enc, 3) + mrl.mid(i + 1); -+ i += 2; -+ } -+ } -+ return mrl; -+} -+ - void MediaObject::setSourceInternal(const MediaSource &source, HowToSetTheUrl how) - { - //debug() << Q_FUNC_INFO; -@@ -340,13 +354,18 @@ - m_stream->setError(Phonon::NormalError, tr("Cannot open media data at '%1'").arg(source.url().toString(QUrl::RemovePassword))); - return; - } -- switch (how) { -- case GaplessSwitch: -- m_stream->gaplessSwitchTo(source.url()); -- break; -- case HardSwitch: -- m_stream->setUrl(source.url()); -- break; -+ { -+ const QByteArray &mrl = (source.url().scheme() == QLatin1String("file") ? -+ "file:/" + mrlEncode(QFile::encodeName(source.url().toLocalFile())) : -+ source.url().toEncoded()); -+ switch (how) { -+ case GaplessSwitch: -+ m_stream->gaplessSwitchTo(mrl); -+ break; -+ case HardSwitch: -+ m_stream->setMrl(mrl); -+ break; -+ } - } - break; - case MediaSource::Disc: -Index: phonon/xine/xinestream.cpp -=================================================================== ---- phonon/xine/xinestream.cpp (revision 924144) -+++ phonon/xine/xinestream.cpp (revision 924145) -@@ -619,12 +619,6 @@ - } - - // called from main thread --void XineStream::gaplessSwitchTo(const QUrl &url) --{ -- gaplessSwitchTo(url.toEncoded()); --} -- --// called from main thread - void XineStream::gaplessSwitchTo(const QByteArray &mrl) - { - QCoreApplication::postEvent(this, new GaplessSwitchEvent(mrl)); -@@ -1707,12 +1701,6 @@ - } - - // called from main thread --void XineStream::setUrl(const QUrl &url) --{ -- setMrl(url.toEncoded()); --} -- --// called from main thread - void XineStream::setMrl(const QByteArray &mrl, StateForNewMrl sfnm) - { - debug() << Q_FUNC_INFO << mrl << ", " << sfnm; diff --git a/phonon-4.3.50-xine_pulseaudio.patch b/phonon-4.3.50-xine_pulseaudio.patch new file mode 100644 index 0000000..ca7c300 --- /dev/null +++ b/phonon-4.3.50-xine_pulseaudio.patch @@ -0,0 +1,12 @@ +diff -up phonon/xine/backend.cpp.pulseaudio phonon/xine/backend.cpp +--- phonon/xine/backend.cpp.pulseaudio 2009-10-03 14:00:19.000000000 -0500 ++++ phonon/xine/backend.cpp 2009-10-19 12:23:17.768923476 -0500 +@@ -649,7 +649,7 @@ void Backend::checkAudioOutputs() + "in KDE2 and KDE3. Its use is discouraged.

"), + /*icon name */"audio-backend-arts", outputPlugins[i]); + } else if (0 == strcmp(outputPlugins[i], "pulseaudio")) { +- addAudioOutput(nextIndex++, 10, tr("PulseAudio"), ++ addAudioOutput(nextIndex++, 2000, tr("PulseAudio"), + xine_get_audio_driver_plugin_description(m_xine, outputPlugins[i]), + /*icon name */"audio-backend-pulseaudio", outputPlugins[i]); + } else if (0 == strcmp(outputPlugins[i], "esd")) { diff --git a/phonon.spec b/phonon.spec index 78abef9..ccd3dc1 100644 --- a/phonon.spec +++ b/phonon.spec @@ -1,12 +1,16 @@ +%define snap 20091124svn + Summary: Multimedia framework api Name: phonon -Version: 4.3.1 -Release: 102%{?dist} +Version: 4.3.50 +Release: 5.%{snap}%{?dist} Group: System Environment/Libraries License: LGPLv2+ URL: http://phonon.kde.org/ -Source0: ftp://ftp.kde.org/pub/kde/stable/4.2.1/phonon-%{version}.tar.bz2 +#Source0: ftp://ftp.kde.org/pub/kde/stable/4.2.1/phonon-%{version}.tar.bz2 +Source0: phonon-%{snap}.tar.bz2 +Source1: phonon_snapshot.sh BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Source10: http://gstreamer.freedesktop.org/data/images/artwork/gstreamer-logo.svg @@ -17,27 +21,12 @@ Source14: hi48-phonon-gstreamer.png Source15: hi64-phonon-gstreamer.png Source16: hi128-phonon-gstreamer.png -# Make PulseAudio the default when listed by the backend. -# Note that this currently only works for the Xine backend. Device selection in -# the GStreamer backend is weird: there is a setting for "sink" which cannot be -# set through systemsettings, and listed devices are only those supported by the -# "sink". So it never lists "PulseAudio" as a supported device, you have to pick -# it as a "sink", and then the device setting is ignored entirely. -Patch0: phonon-4.2.96-pulseaudio.patch -Patch1: phonon-4.2.96-xine-pulseaudio.patch -Patch2: qt-x11-opensource-src-4.5.2-gst-pulsaudio.patch - -## define to build phonon-backend-xine only -#define xine_only 1 -#Patch10: phonon-4.3.1-xineonly.patch +# Prefer PulseAudio +# This one was easiest to port, but doesn't seem to work by itself as-is +# maybe we can just wait for the improvie PA support to land. +Patch1: phonon-4.3.50-xine_pulseaudio.patch ## Upstream patches -Patch100: phonon-4.3.2-gstreamer-utf8-url.patch -Patch101: phonon-4.3.2-gstreamer-volumefader.patch -# fix for non-ascii filenames in xine backend -Patch102: phonon-4.3.2-kdebug#172242.patch -# escape '#' too -Patch103: phonon-4.3.2-kdebug#172242-2.patch BuildRequires: automoc4 >= 0.9.86 BuildRequires: cmake >= 2.6.0 @@ -50,14 +39,15 @@ BuildRequires: libxml2-devel BuildRequires: pkgconfig BuildRequires: qt4-devel BuildRequires: xine-lib-devel +%if 0%{?fedora} > 11 +BuildRequires: pulseaudio-libs-devel >= 0.9.21 +%else +%define pa_keep_old_hacks 1 +%endif Requires: phonon-backend%{?_isa} >= %{version} -%if 0%{?fedora} > 11 -Requires: qt4%{?_isa} >= 4.5.2-21 -%else Requires: qt4%{?_isa} >= %{_qt4_version} -%endif %description %{summary}. @@ -84,6 +74,7 @@ Summary: Gstreamer phonon backend Group: Applications/Multimedia Epoch: 2 Requires: %{name} = %{version}-%{release} +Requires: gstreamer-plugins-good Provides: phonon-backend%{?_isa} = %{version}-%{release} Obsoletes: %{name}-backend-gst < 4.2.0-4 Provides: %{name}-backend-gst = %{version}-%{release} @@ -92,18 +83,10 @@ Provides: %{name}-backend-gst = %{version}-%{release} %prep -%setup -q -n phonon-%{version}%{?alphatag} -%patch0 -p1 -b .pulseaudio -%patch1 -p1 -b .xine-pulseaudio -%patch2 -p4 -b .gst-pulseaudio -%patch100 -p0 -b .gstreamer-utf8-url -%patch101 -p0 -b .gstreamer-volumefader -%patch102 -p1 -b .xine_nonascii -%patch103 -p1 -b .xine_nonascii-2 - -# not working? use -C .../xine hack below instead for now -- Rex -%if 0%{?xine_only} -#patch10 -p1 -b .xineonly +%setup -q -n phonon%{!?snap:-%{version}} + +%if 0%{?pa_keep_old_hacks} +%patch1 -p1 -b .xine_pulseaudio %endif @@ -121,6 +104,9 @@ rm -rf %{buildroot} make install/fast DESTDIR=%{buildroot} -C %{_target_platform}%{?xine_only:/xine} +# symlink for qt/phonon compatibility +ln -s ../KDE/Phonon %{buildroot}%{_includedir}/phonon/Phonon + # move the oxygen-only phonon-xine icons to hicolor mv %{buildroot}%{_datadir}/icons/oxygen \ %{buildroot}%{_datadir}/icons/hicolor @@ -204,6 +190,22 @@ gtk-update-icon-cache %{_kde4_iconsdir}/hicolor &> /dev/null ||: %changelog +* Mon Nov 30 2009 Rex Dieter - 4.3.50-5.20091124 +- backend-gstreamer: Requires: gstreamer-plugins-good + +* Fri Nov 27 2009 Rex Dieter - 4.3.50-4.20091124 +- ln -s ../KDE/Phonon %%_includedir/phonon/Phonon (qt/phonon compat) + +* Wed Nov 18 2009 Rex Dieter - 4.3.50-3.20091124 +- phonon-4.3.50 (20091124 snapshot) +- enable pulseaudio integration (F-12+) + +* Wed Nov 18 2009 Rex Dieter - 4.3.50-2.20091118 +- phonon-4.3.50 (20091118 snapshot) + +* Mon Oct 19 2009 Rex Dieter - 4.3.50-1.20091019 +- phonon-4.3.50 (20091019 snapshot) + * Sat Oct 03 2009 Rex Dieter - 4.3.1-102 - Requires: qt4 >= 4.5.2-21 (f12+) diff --git a/qt-x11-opensource-src-4.5.2-gst-pulsaudio.patch b/qt-x11-opensource-src-4.5.2-gst-pulsaudio.patch deleted file mode 100644 index 6ccefab..0000000 --- a/qt-x11-opensource-src-4.5.2-gst-pulsaudio.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff -up qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/audiooutput.cpp.than qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/audiooutput.cpp ---- qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/audiooutput.cpp.than 2009-08-16 14:20:43.000000000 +0200 -+++ qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/audiooutput.cpp 2009-08-16 14:45:56.000000000 +0200 -@@ -141,7 +141,9 @@ bool AudioOutput::setOutputDevice(int ne - // Save previous state - GstState oldState = GST_STATE(m_audioSink); - const QByteArray oldDeviceValue = GstHelper::property(m_audioSink, "device"); -- const QByteArray deviceId = deviceList.at(newDevice).gstId; -+ const QByteArray deviceId = (deviceList.at(newDevice).gstId == "PulseAudio" -+ ? "default" -+ : deviceList.at(newDevice).gstId); - m_device = newDevice; - - // We test if the device can be opened by checking if it can go from NULL to READY state -diff -up qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/devicemanager.cpp.than qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/devicemanager.cpp ---- qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/devicemanager.cpp.than 2009-08-15 12:39:08.000000000 +0200 -+++ qt-x11-opensource-src-4.5.2/src/3rdparty/phonon/gstreamer/devicemanager.cpp 2009-08-16 14:45:13.000000000 +0200 -@@ -50,6 +50,8 @@ AudioDevice::AudioDevice(DeviceManager * - //get name from device - if (gstId == "default") { - description = "Default audio device"; -+ } else if (gstId == "PulseAudio") { -+ description = QObject::tr("Pass all audio through the PulseAudio Sound Server.\n").toUtf8(); - } else { - GstElement *aSink= manager->createAudioSink(); - -@@ -175,6 +177,18 @@ GstElement *DeviceManager::createAudioSi - } - } - -+ if (!sink) { -+ sink = gst_element_factory_make ("pulsesink", NULL); -+ if (canOpenDevice(sink)) { -+ m_backend->logMessage("AudioOutput using pulse audio sink"); -+ m_audioSink = "pulsesink"; -+ } -+ else if (sink) { -+ gst_object_unref(sink); -+ sink = 0; -+ } -+ } -+ - #ifdef USE_ALSASINK2 - if (!sink) { - sink = gst_element_factory_make ("_k_alsasink", NULL); -@@ -306,8 +320,12 @@ void DeviceManager::updateDeviceList() - QList list; - - if (audioSink) { -- list = GstHelper::extractProperties(audioSink, "device"); -- list.prepend("default"); -+ if (m_audioSink == "pulsesink") { -+ list.append("PulseAudio"); -+ } else { -+ list = GstHelper::extractProperties(audioSink, "device"); -+ list.prepend("default"); -+ } - - for (int i = 0 ; i < list.size() ; ++i) { - QByteArray gstId = list.at(i); diff --git a/sources b/sources index be29232..77da72e 100644 --- a/sources +++ b/sources @@ -1,8 +1,8 @@ 8e3924f417fea67f72b2105faed2119c gstreamer-logo.svg -767cb68052c108e95f293f30acdef3fb phonon-4.3.1.tar.bz2 60de9d7e1cddd019f09fd036f0e5413a hi128-phonon-gstreamer.png 7ca265e0cf75b3b4c81e1490d3dba3be hi16-phonon-gstreamer.png 0a9f69d901aded140d4fed969c22e14f hi22-phonon-gstreamer.png 12db12c009b722a6dc141f78feb7e330 hi32-phonon-gstreamer.png 86c34a1b81d44980b1381f94ed6b7a23 hi48-phonon-gstreamer.png 153505c71ec021b0a3bd4b74f2492e93 hi64-phonon-gstreamer.png +0b522b42d9be2b9297ab972b861fdbb8 phonon-20091124svn.tar.bz2