From kde-commits Wed Apr 23 13:43:53 2008 From: Matthias Kretz Date: Wed, 23 Apr 2008 13:43:53 +0000 To: kde-commits Subject: kdereview/phonon/gstreamer Message-Id: <1208958233.343925.8211.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=120895825024604 SVN commit 800152 by mkretz: hotfix for the blocking (deadlocking) alsasink in GStreamer: - use custom alsasink2 which uses non-blocking writes in order to not deadlock when a USB soundcard is unplugged while playing - while patching the code, switch to listing default:X devices in addition to hw:X,Y which is a lot more compatible M +47 -33 CMakeLists.txt A alsasink2.c [License: LGPL (v2+) (wrong address)] A alsasink2.h [License: LGPL (v2+) (wrong address)] M +16 -0 devicemanager.cpp --- trunk/kdereview/phonon/gstreamer/CMakeLists.txt #800151:800152 @@ -1,4 +1,5 @@ # Copyright (C) 2007 Trolltech ASA. All rights reserved. +# Copyright (C) 2008 Matthias Kretz # # 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 @@ -16,41 +17,54 @@ include(ConfigureChecks.cmake) if (BUILD_PHONON_GSTREAMER) - include_directories(${GSTREAMER_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR} + include_directories(${GSTREAMER_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR}) - set(phonon_gstreamer_SRCS - audiooutput.cpp - artssink.cpp - backend.cpp - devicemanager.cpp - effectmanager.cpp - gsthelper.cpp - mediaobject.cpp - medianode.cpp - effect.cpp - medianodeevent.cpp - videowidget.cpp - qwidgetvideosink.cpp - streamreader.cpp - phononsrc.cpp - message.cpp - audioeffect.cpp - abstractrenderer.cpp - x11renderer.cpp - widgetrenderer.cpp - glrenderer.cpp - volumefadereffect.cpp - ) + set(phonon_gstreamer_SRCS + audiooutput.cpp + artssink.cpp + backend.cpp + devicemanager.cpp + effectmanager.cpp + gsthelper.cpp + mediaobject.cpp + medianode.cpp + effect.cpp + medianodeevent.cpp + videowidget.cpp + qwidgetvideosink.cpp + streamreader.cpp + phononsrc.cpp + message.cpp + audioeffect.cpp + abstractrenderer.cpp + x11renderer.cpp + widgetrenderer.cpp + glrenderer.cpp + volumefadereffect.cpp + ) - kde4_add_plugin(phonon_gstreamer ${phonon_gstreamer_SRCS}) - target_link_libraries(phonon_gstreamer - ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} - ${KDE4_PHONON_LIBS} ${OPENGL_gl_LIBRARY} - ${GSTREAMER_LIBRARIES} ${GSTREAMER_BASE_LIBRARY} ${GSTREAMER_INTERFACE_LIBRARY} - ${GSTREAMER_PLUGIN_VIDEO_LIBRARIES} ${GSTREAMER_PLUGIN_AUDIO_LIBRARIES} - ${GLIB2_LIBRARIES} ${GOBJECT_LIBRARIES}) - install(TARGETS phonon_gstreamer DESTINATION ${PLUGIN_INSTALL_DIR}/plugins/phonon_backend) - install(FILES gstreamer.desktop DESTINATION ${SERVICES_INSTALL_DIR}/phononbackends) + find_package(Alsa) + if(ALSA_FOUND) + add_definitions(-DUSE_ALSASINK2) + include_directories(${ALSA_INCLUDES}) + set(phonon_gstreamer_SRCS + ${phonon_gstreamer_SRCS} + alsasink2.c + ) + endif(ALSA_FOUND) + kde4_add_plugin(phonon_gstreamer ${phonon_gstreamer_SRCS}) + target_link_libraries(phonon_gstreamer + ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} + ${KDE4_PHONON_LIBS} ${OPENGL_gl_LIBRARY} + ${GSTREAMER_LIBRARIES} ${GSTREAMER_BASE_LIBRARY} ${GSTREAMER_INTERFACE_LIBRARY} + ${GSTREAMER_PLUGIN_VIDEO_LIBRARIES} ${GSTREAMER_PLUGIN_AUDIO_LIBRARIES} + ${GLIB2_LIBRARIES} ${GOBJECT_LIBRARIES} ${ASOUND_LIBRARY}) + if(ALSA_FOUND) + target_link_libraries(phonon_gstreamer ${ASOUND_LIBRARY}) + endif(ALSA_FOUND) + + install(TARGETS phonon_gstreamer DESTINATION ${PLUGIN_INSTALL_DIR}/plugins/phonon_backend) + install(FILES gstreamer.desktop DESTINATION ${SERVICES_INSTALL_DIR}/phononbackends) endif (BUILD_PHONON_GSTREAMER) --- trunk/kdereview/phonon/gstreamer/devicemanager.cpp #800151:800152 @@ -25,6 +25,10 @@ #include "x11renderer.h" #include "artssink.h" +#ifdef USE_ALSASINK2 +#include "alsasink2.h" +#endif + /* * This class manages the list of currently * active output devices @@ -171,7 +175,19 @@ } } +#ifdef USE_ALSASINK2 if (!sink) { + sink = GST_ELEMENT(g_object_new(gst_alsasink2_get_type(), NULL)); + if (canOpenDevice(sink)) + m_backend->logMessage("AudioOutput using alsa2 audio sink"); + else if (sink) { + gst_object_unref(sink); + sink = 0; + } + } +#endif + + if (!sink) { sink = gst_element_factory_make ("alsasink", NULL); if (canOpenDevice(sink)) m_backend->logMessage("AudioOutput using alsa audio sink");