mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-24 02:42:55 +00:00
remove PulseAudio support from Phonon and its backend
it should not be up to Phonon to support PulseAudio (or ALSA in that matter) separately, the real backend (in this case VLC) should decide what to use and the Phonon backend should offer only offer control over that with some sort of configuration. Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
a1a7298dd9
commit
456ab36732
15 changed files with 90 additions and 2167 deletions
|
@ -7,6 +7,16 @@
|
|||
# find -name '*.cmake' -exec grep -E 'TODO|FIXME' {} +
|
||||
# find -name CMakeLists.txt -exec grep -E 'TODO|FIXME' {} +
|
||||
|
||||
if(MINGW)
|
||||
set(CMAKE_GNUtoMS TRUE)
|
||||
endif()
|
||||
if(WIN32)
|
||||
set(CMAKE_WIN32_EXECUTABLE TRUE)
|
||||
endif()
|
||||
if(APPLE)
|
||||
set(CMAKE_MACOSX_BUNDLE TRUE)
|
||||
endif()
|
||||
|
||||
project(katie C CXX ASM)
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
|
||||
|
@ -43,9 +53,6 @@ add_feature_info(cups WITH_CUPS "an open source something")
|
|||
option(WITH_ALSA "Build alsa support" ON)
|
||||
add_feature_info(alsa WITH_ALSA "an open source something")
|
||||
|
||||
option(WITH_PULSEAUDIO "Build pulseaudio support" ON)
|
||||
add_feature_info(pulseaudio WITH_PULSEAUDIO "an open source something")
|
||||
|
||||
option(WITH_PNG "Build png support" ON)
|
||||
add_feature_info(png WITH_PNG "an open source something")
|
||||
|
||||
|
@ -305,14 +312,6 @@ set_package_properties(ALSA PROPERTIES
|
|||
TYPE RECOMMENDED
|
||||
)
|
||||
|
||||
find_package(PulseAudio)
|
||||
set_package_properties(PulseAudio PROPERTIES
|
||||
PURPOSE "Required for PulseAudio support"
|
||||
DESCRIPTION "Featureful, general-purpose sound server"
|
||||
URL "http://www.freedesktop.org/wiki/Software/PulseAudio"
|
||||
TYPE OPTIONAL
|
||||
)
|
||||
|
||||
find_package(Freetype)
|
||||
set_package_properties(Freetype PROPERTIES
|
||||
PURPOSE "Required for fonts configuration support"
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
# - Try to find the PulseAudio
|
||||
# Once done this will define
|
||||
#
|
||||
# PULSEAUDIO_FOUND - system has PulseAudio
|
||||
# PULSEAUDIO_INCLUDES - the PulseAudio include directory
|
||||
# PULSEAUDIO_LIBRARIES - The libraries needed to use PulseAudio
|
||||
#
|
||||
# Copyright (c) 2015, Ivailo Monev, <xakepa10@gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
|
||||
if(PULSEAUDIO_INCLUDES AND PULSEAUDIO_LIBRARIES)
|
||||
set(PULSEAUDIO_FIND_QUIETLY TRUE)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
include(FindPkgConfig)
|
||||
pkg_check_modules(PC_PULSEAUDIO QUIET libpulse)
|
||||
pkg_check_modules(PC_PULSEAUDIO_MAINLOOP QUIET libpulse-mainloop-glib)
|
||||
endif()
|
||||
|
||||
find_path(PULSEAUDIO_INCLUDES
|
||||
NAMES
|
||||
pulse/pulseaudio.h
|
||||
HINTS
|
||||
$ENV{PULSEAUDIODIR}/include
|
||||
${PC_PULSEAUDIO_INCLUDEDIR}
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
${INCLUDE_INSTALL_DIR}
|
||||
)
|
||||
|
||||
find_library(PULSEAUDIO_LIBRARIES
|
||||
pulse
|
||||
HINTS
|
||||
$ENV{PULSEAUDIODIR}/lib
|
||||
${PC_PULSEAUDIO_LIBDIR}
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
${LIB_INSTALL_DIR}
|
||||
)
|
||||
|
||||
find_library(PULSEAUDIO_MAINLOOP_LIBRARIES
|
||||
pulse-mainloop-glib
|
||||
HINTS
|
||||
$ENV{PULSEAUDIODIR}/lib
|
||||
${PC_PULSEAUDIO_MAINLOOP_LIBDIR}
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
${LIB_INSTALL_DIR}
|
||||
)
|
||||
|
||||
if(PULSEAUDIO_LIBRARIES AND PULSEAUDIO_MAINLOOP_LIBRARIES)
|
||||
set(PULSEAUDIO_LIBRARIES ${PULSEAUDIO_LIBRARIES} ${PULSEAUDIO_MAINLOOP_LIBRARIES})
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(PulseAudio DEFAULT_MSG PULSEAUDIO_INCLUDES PULSEAUDIO_LIBRARIES PULSEAUDIO_MAINLOOP_LIBRARIES)
|
||||
|
||||
mark_as_advanced(PULSEAUDIO_INCLUDES PULSEAUDIO_LIBRARIES PULSEAUDIO_MAINLOOP_LIBRARIES)
|
|
@ -109,7 +109,6 @@ set(PHONON_HEADERS
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/phonon_export.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/phonondefs.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/platformplugin.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pulsesupport.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/seekslider.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/streaminterface.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/videoplayer.h
|
||||
|
@ -181,7 +180,6 @@ set(PHONON_SOURCES
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/path.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/phononnamespace.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/platform.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pulsesupport.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/seekslider.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/statesvalidator.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/streaminterface.cpp
|
||||
|
@ -221,27 +219,6 @@ else()
|
|||
katie_definition(-DPHONON_NO_GRAPHICSVIEW)
|
||||
endif()
|
||||
|
||||
if(WITH_GLIB2 AND GLIB2_FOUND AND WITH_PULSEAUDIO AND PULSEAUDIO_FOUND)
|
||||
set(PHONON_HEADERS
|
||||
${PHONON_HEADERS}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pulsestream_p.h
|
||||
)
|
||||
set(PHONON_SOURCES
|
||||
${PHONON_SOURCES}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/pulsestream.cpp
|
||||
)
|
||||
set(EXTRA_PHONON_LIBS
|
||||
${EXTRA_PHONON_LIBS}
|
||||
${PULSEAUDIO_LIBRARIES}
|
||||
${GLIB2_LIBRARIES}
|
||||
)
|
||||
add_definitions(-DHAVE_PULSEAUDIO)
|
||||
include_directories(
|
||||
${GLIB2_INCLUDES}
|
||||
${PULSEAUDIO_INCLUDES}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_DBUS AND DBUS_FOUND)
|
||||
set(PHONON_SOURCES
|
||||
${PHONON_SOURCES}
|
||||
|
|
|
@ -30,10 +30,6 @@
|
|||
#include "phononconfig_p.h"
|
||||
#include "phononnamespace_p.h"
|
||||
#include "platform_p.h"
|
||||
#include "pulsesupport.h"
|
||||
#ifdef HAVE_PULSEAUDIO
|
||||
# include "pulsestream_p.h"
|
||||
#endif
|
||||
|
||||
#include <QtCore/QUuid>
|
||||
#include <QtCore/qmath.h>
|
||||
|
@ -51,10 +47,6 @@ namespace Phonon
|
|||
|
||||
static inline bool callSetOutputDevice(AudioOutputPrivate *const d, const AudioOutputDevice &dev)
|
||||
{
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive())
|
||||
return pulse->setOutputDevice(d->getStreamUuid(), dev.index());
|
||||
|
||||
if (!d->backendObject())
|
||||
return false;
|
||||
|
||||
|
@ -100,24 +92,6 @@ void AudioOutputPrivate::init(Phonon::Category c)
|
|||
|
||||
createBackendObject();
|
||||
|
||||
#ifdef HAVE_PULSEAUDIO
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
PulseStream *stream = pulse->registerOutputStream(streamUuid, category);
|
||||
if (stream) {
|
||||
q->connect(stream, SIGNAL(usingDevice(int)), SLOT(_k_deviceChanged(int)));
|
||||
q->connect(stream, SIGNAL(volumeChanged(qreal)), SLOT(_k_volumeChanged(qreal)));
|
||||
q->connect(stream, SIGNAL(muteChanged(bool)), SLOT(_k_mutedChanged(bool)));
|
||||
|
||||
AudioOutputInterface47 *iface = Iface<AudioOutputInterface47>::cast(this);
|
||||
if (iface)
|
||||
iface->setStreamUuid(streamUuid);
|
||||
else
|
||||
pulse->setupStreamEnvironment(streamUuid);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
q->connect(Factory::sender(), SIGNAL(availableAudioOutputDevicesChanged()), SLOT(_k_deviceListChanged()));
|
||||
}
|
||||
|
||||
|
@ -154,11 +128,7 @@ void AudioOutput::setName(const QString &newName)
|
|||
return;
|
||||
}
|
||||
d->name = newName;
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive())
|
||||
pulse->setOutputName(d->getStreamUuid(), newName);
|
||||
else
|
||||
setVolume(Platform::loadVolume(newName));
|
||||
setVolume(Platform::loadVolume(newName));
|
||||
#ifndef PHONON_NO_DBUS
|
||||
if (d->adaptor) {
|
||||
emit d->adaptor->nameChanged(newName);
|
||||
|
@ -173,11 +143,8 @@ void AudioOutput::setVolume(qreal volume)
|
|||
{
|
||||
P_D(AudioOutput);
|
||||
d->volume = volume;
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (k_ptr->backendObject()) {
|
||||
if (pulse->isActive()) {
|
||||
pulse->setOutputVolume(d->getStreamUuid(), volume);
|
||||
} else if (!d->muted) {
|
||||
if (!d->muted) {
|
||||
// using Stevens' power law loudness is proportional to (sound pressure)^0.67
|
||||
// sound pressure is proportional to voltage:
|
||||
// p² \prop P \prop V²
|
||||
|
@ -189,14 +156,13 @@ void AudioOutput::setVolume(qreal volume)
|
|||
} else {
|
||||
emit volumeChanged(volume);
|
||||
}
|
||||
if (!pulse->isActive())
|
||||
Platform::saveVolume(d->name, volume);
|
||||
Platform::saveVolume(d->name, volume);
|
||||
}
|
||||
|
||||
qreal AudioOutput::volume() const
|
||||
{
|
||||
P_D(const AudioOutput);
|
||||
if (d->muted || !d->m_backendObject || PulseSupport::getInstance()->isActive())
|
||||
if (d->muted || !d->m_backendObject)
|
||||
return d->volume;
|
||||
return pow(INTERFACE_CALL(volume()), LOUDNESS_TO_VOLTAGE_EXPONENT);
|
||||
}
|
||||
|
@ -209,7 +175,7 @@ static const qreal log10over20 = qreal(0.1151292546497022842); // ln(10) / 20
|
|||
qreal AudioOutput::volumeDecibel() const
|
||||
{
|
||||
P_D(const AudioOutput);
|
||||
if (d->muted || !d->m_backendObject || PulseSupport::getInstance()->isActive())
|
||||
if (d->muted || !d->m_backendObject)
|
||||
return log(d->volume) / log10over20;
|
||||
return 0.67 * log(INTERFACE_CALL(volume())) / log10over20;
|
||||
}
|
||||
|
@ -229,21 +195,14 @@ void AudioOutput::setMuted(bool mute)
|
|||
{
|
||||
P_D(AudioOutput);
|
||||
if (d->muted != mute) {
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (mute) {
|
||||
d->muted = mute;
|
||||
if (k_ptr->backendObject()) {
|
||||
if (pulse->isActive())
|
||||
pulse->setOutputMute(d->getStreamUuid(), mute);
|
||||
else
|
||||
INTERFACE_CALL(setVolume(0.0));
|
||||
INTERFACE_CALL(setVolume(0.0));
|
||||
}
|
||||
} else {
|
||||
if (k_ptr->backendObject()) {
|
||||
if (pulse->isActive())
|
||||
pulse->setOutputMute(d->getStreamUuid(), mute);
|
||||
else
|
||||
INTERFACE_CALL(setVolume(pow(d->volume, VOLTAGE_TO_LOUDNESS_EXPONENT)));
|
||||
INTERFACE_CALL(setVolume(pow(d->volume, VOLTAGE_TO_LOUDNESS_EXPONENT)));
|
||||
}
|
||||
d->muted = mute;
|
||||
}
|
||||
|
@ -309,35 +268,33 @@ void AudioOutputPrivate::setupBackendObject()
|
|||
q, SLOT(_k_mutedChanged(bool)));
|
||||
}
|
||||
|
||||
if (!PulseSupport::getInstance()->isActive()) {
|
||||
// set up attributes
|
||||
pINTERFACE_CALL(setVolume(pow(volume, VOLTAGE_TO_LOUDNESS_EXPONENT)));
|
||||
// set up attributes
|
||||
pINTERFACE_CALL(setVolume(pow(volume, VOLTAGE_TO_LOUDNESS_EXPONENT)));
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
// if the output device is not available and the device was not explicitly set
|
||||
// There is no need to set the output device initially if PA is used as
|
||||
// we know it will not work (stream doesn't exist yet) and that this will be
|
||||
// handled by _k_deviceChanged()
|
||||
if (!callSetOutputDevice(this, device) && !outputDeviceOverridden) {
|
||||
// fall back in the preference list of output devices
|
||||
QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings | GlobalConfig::HideUnavailableDevices);
|
||||
if (deviceList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < deviceList.count(); ++i) {
|
||||
const AudioOutputDevice &dev = AudioOutputDevice::fromIndex(deviceList.at(i));
|
||||
if (callSetOutputDevice(this, dev)) {
|
||||
handleAutomaticDeviceChange(dev, AudioOutputPrivate::FallbackChange);
|
||||
return; // found one that works
|
||||
}
|
||||
}
|
||||
// if we get here there is no working output device. Tell the backend.
|
||||
const AudioOutputDevice none;
|
||||
callSetOutputDevice(this, none);
|
||||
handleAutomaticDeviceChange(none, FallbackChange);
|
||||
// if the output device is not available and the device was not explicitly set
|
||||
// There is no need to set the output device initially if PA is used as
|
||||
// we know it will not work (stream doesn't exist yet) and that this will be
|
||||
// handled by _k_deviceChanged()
|
||||
if (!callSetOutputDevice(this, device) && !outputDeviceOverridden) {
|
||||
// fall back in the preference list of output devices
|
||||
QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings | GlobalConfig::HideUnavailableDevices);
|
||||
if (deviceList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
#endif //QT_NO_PHONON_SETTINGSGROUP
|
||||
for (int i = 0; i < deviceList.count(); ++i) {
|
||||
const AudioOutputDevice &dev = AudioOutputDevice::fromIndex(deviceList.at(i));
|
||||
if (callSetOutputDevice(this, dev)) {
|
||||
handleAutomaticDeviceChange(dev, AudioOutputPrivate::FallbackChange);
|
||||
return; // found one that works
|
||||
}
|
||||
}
|
||||
// if we get here there is no working output device. Tell the backend.
|
||||
const AudioOutputDevice none;
|
||||
callSetOutputDevice(this, none);
|
||||
handleAutomaticDeviceChange(none, FallbackChange);
|
||||
}
|
||||
#endif //QT_NO_PHONON_SETTINGSGROUP
|
||||
}
|
||||
|
||||
void AudioOutputPrivate::_k_volumeChanged(qreal newVolume)
|
||||
|
@ -372,9 +329,6 @@ void AudioOutputPrivate::_k_revertFallback()
|
|||
|
||||
void AudioOutputPrivate::_k_audioDeviceFailed()
|
||||
{
|
||||
if (PulseSupport::getInstance()->isActive())
|
||||
return;
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
|
||||
pDebug() << Q_FUNC_INFO;
|
||||
|
@ -401,9 +355,6 @@ void AudioOutputPrivate::_k_audioDeviceFailed()
|
|||
|
||||
void AudioOutputPrivate::_k_deviceListChanged()
|
||||
{
|
||||
if (PulseSupport::getInstance()->isActive())
|
||||
return;
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
pDebug() << Q_FUNC_INFO;
|
||||
// Check to see if we have an override and do not change to a higher priority device if the overridden device is still present.
|
||||
|
@ -542,10 +493,6 @@ void AudioOutputPrivate::handleAutomaticDeviceChange(const AudioOutputDevice &de
|
|||
|
||||
AudioOutputPrivate::~AudioOutputPrivate()
|
||||
{
|
||||
PulseSupport *pulse = PulseSupport::getInstanceOrNull(true);
|
||||
if (pulse) {
|
||||
pulse->clearStreamCache(streamUuid);
|
||||
}
|
||||
#ifndef PHONON_NO_DBUS
|
||||
if (adaptor) {
|
||||
emit adaptor->outputDestroyed();
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
#include "../backendinterface.h"
|
||||
#include "../qsettingsgroup_p.h"
|
||||
#include "../platformplugin.h"
|
||||
#include "pulsesupport.h"
|
||||
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QVariant>
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
#include "qsettingsgroup_p.h"
|
||||
#include "phononnamespace_p.h"
|
||||
#include "phononnamespace.h"
|
||||
#include "pulsesupport.h"
|
||||
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QVariant>
|
||||
|
@ -65,8 +64,6 @@ static void filter(ObjectDescriptionType type, BackendInterface *backendIface, Q
|
|||
QHash<QByteArray, QVariant> properties;
|
||||
if (backendIface)
|
||||
properties = backendIface->objectDescriptionProperties(type, it.next());
|
||||
else
|
||||
properties = PulseSupport::getInstance()->objectDescriptionProperties(type, it.next());
|
||||
QVariant var;
|
||||
if (whatToFilter & FilterAdvancedDevices) {
|
||||
var = properties.value("isAdvanced");
|
||||
|
@ -116,24 +113,19 @@ static QList<int> sortDevicesByCategoryPriority(const GlobalConfig *config, cons
|
|||
}
|
||||
|
||||
QList<int> deviceList;
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
deviceList = pulse->objectIndexesByCategory(type, category);
|
||||
} else {
|
||||
QString categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(category));
|
||||
QString categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(category));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for the given category
|
||||
categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(NoCategory));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for the given category
|
||||
categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(NoCategory));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for NoCategory
|
||||
return defaultList;
|
||||
}
|
||||
// no list in config for NoCategory
|
||||
return defaultList;
|
||||
}
|
||||
|
||||
//Now the list from d->config
|
||||
deviceList = backendConfig->value(categoryKey, QList<int>());
|
||||
}
|
||||
|
||||
//Now the list from d->config
|
||||
deviceList = backendConfig->value(categoryKey, QList<int>());
|
||||
|
||||
//if there are devices in d->config that the backend doesn't report, remove them from the list
|
||||
QMutableListIterator<int> i(deviceList);
|
||||
while (i.hasNext()) {
|
||||
|
@ -171,24 +163,19 @@ static QList<int> sortDevicesByCategoryPriority(const GlobalConfig *config, cons
|
|||
}
|
||||
|
||||
QList<int> deviceList;
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
deviceList = pulse->objectIndexesByCategory(type, category);
|
||||
} else {
|
||||
QString categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(category));
|
||||
QString categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(category));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for the given category
|
||||
categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(NoCategory));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for the given category
|
||||
categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(NoCategory));
|
||||
if (!backendConfig->hasKey(categoryKey)) {
|
||||
// no list in config for NoCategory
|
||||
return defaultList;
|
||||
}
|
||||
// no list in config for NoCategory
|
||||
return defaultList;
|
||||
}
|
||||
|
||||
//Now the list from d->config
|
||||
deviceList = backendConfig->value(categoryKey, QList<int>());
|
||||
}
|
||||
|
||||
//Now the list from d->config
|
||||
deviceList = backendConfig->value(categoryKey, QList<int>());
|
||||
|
||||
//if there are devices in d->config that the backend doesn't report, remove them from the list
|
||||
QMutableListIterator<int> i(deviceList);
|
||||
while (i.hasNext()) {
|
||||
|
@ -390,12 +377,6 @@ static QList<int> reindexList(const GlobalConfig *config, ObjectDescriptionType
|
|||
|
||||
void GlobalConfig::setAudioOutputDeviceListFor(Category category, QList<int> order)
|
||||
{
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
pulse->setOutputDevicePriorityForCategory(category, order);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
P_D(GlobalConfig);
|
||||
QSettingsGroup backendConfig(&d->config, QLatin1String("AudioOutputDevice")); // + Factory::identifier());
|
||||
|
@ -424,18 +405,7 @@ QList<int> GlobalConfig::audioOutputDeviceListFor(Category category, int overrid
|
|||
#endif
|
||||
|
||||
QList<int> defaultList;
|
||||
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
defaultList = pulse->objectDescriptionIndexes(AudioOutputDeviceType);
|
||||
if (hide || (override & HideUnavailableDevices)) {
|
||||
filter(AudioOutputDeviceType, NULL, &defaultList,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||||
BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||||
|
||||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||||
if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||||
|
@ -455,20 +425,19 @@ QList<int> GlobalConfig::audioOutputDeviceListFor(Category category, int overrid
|
|||
}
|
||||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||||
|
||||
// lookup the available devices directly from the backend
|
||||
if (backendIface) {
|
||||
// this list already is in default order (as defined by the backend)
|
||||
QList<int> list = backendIface->objectDescriptionIndexes(AudioOutputDeviceType);
|
||||
if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||||
filter(AudioOutputDeviceType, backendIface, &list,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
// the platform plugin maybe already provided the hardware devices?
|
||||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
defaultList += list;
|
||||
// lookup the available devices directly from the backend
|
||||
if (backendIface) {
|
||||
// this list already is in default order (as defined by the backend)
|
||||
QList<int> list = backendIface->objectDescriptionIndexes(AudioOutputDeviceType);
|
||||
if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||||
filter(AudioOutputDeviceType, backendIface, &list,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
// the platform plugin maybe already provided the hardware devices?
|
||||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
defaultList += list;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
|
@ -499,13 +468,6 @@ QHash<QByteArray, QVariant> GlobalConfig::audioOutputDeviceProperties(int index)
|
|||
#ifndef PHONON_NO_AUDIOCAPTURE
|
||||
void GlobalConfig::setAudioCaptureDeviceListFor(CaptureCategory category, QList<int> order)
|
||||
{
|
||||
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
pulse->setCaptureDevicePriorityForCategory(category, order);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
P_D(GlobalConfig);
|
||||
QSettingsGroup backendConfig(&d->config, QLatin1String("AudioCaptureDevice")); // + Factory::identifier());
|
||||
|
@ -535,17 +497,7 @@ QList<int> GlobalConfig::audioCaptureDeviceListFor(CaptureCategory category, int
|
|||
|
||||
QList<int> defaultList;
|
||||
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
defaultList = pulse->objectDescriptionIndexes(AudioCaptureDeviceType);
|
||||
if (hide || (override & HideUnavailableDevices)) {
|
||||
filter(AudioCaptureDeviceType, NULL, &defaultList,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||||
BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||||
|
||||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||||
if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||||
|
@ -565,20 +517,19 @@ QList<int> GlobalConfig::audioCaptureDeviceListFor(CaptureCategory category, int
|
|||
}
|
||||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||||
|
||||
// lookup the available devices directly from the backend
|
||||
if (backendIface) {
|
||||
// this list already is in default order (as defined by the backend)
|
||||
QList<int> list = backendIface->objectDescriptionIndexes(AudioCaptureDeviceType);
|
||||
if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||||
filter(AudioCaptureDeviceType, backendIface, &list,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
// the platform plugin maybe already provided the hardware devices?
|
||||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
defaultList += list;
|
||||
// lookup the available devices directly from the backend
|
||||
if (backendIface) {
|
||||
// this list already is in default order (as defined by the backend)
|
||||
QList<int> list = backendIface->objectDescriptionIndexes(AudioCaptureDeviceType);
|
||||
if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||||
filter(AudioCaptureDeviceType, backendIface, &list,
|
||||
(hide ? FilterAdvancedDevices : 0)
|
||||
// the platform plugin maybe already provided the hardware devices?
|
||||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||||
);
|
||||
}
|
||||
defaultList += list;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||||
|
@ -738,17 +689,6 @@ QHash<QByteArray, QVariant> GlobalConfig::deviceProperties(ObjectDescriptionType
|
|||
QList<int> indices;
|
||||
QHash<QByteArray, QVariant> props;
|
||||
|
||||
// Try a pulseaudio device
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse->isActive()) {
|
||||
// Check the index before passing it to PulseSupport
|
||||
indices = pulse->objectDescriptionIndexes(deviceType);
|
||||
if (indices.contains(index))
|
||||
props = pulse->objectDescriptionProperties(deviceType, index);
|
||||
}
|
||||
if (!props.isEmpty())
|
||||
return props;
|
||||
|
||||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||||
// Try a device from the platform
|
||||
if (PlatformPlugin *platformPlugin = Factory::platformPlugin())
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include <QtCore/QStringList>
|
||||
#include "backendinterface.h"
|
||||
#include "platformplugin.h"
|
||||
#include "pulsesupport.h"
|
||||
|
||||
namespace Phonon
|
||||
{
|
||||
|
@ -107,21 +106,6 @@ bool ObjectDescriptionData::isValid() const
|
|||
|
||||
ObjectDescriptionData *ObjectDescriptionData::fromIndex(ObjectDescriptionType type, int index)
|
||||
{
|
||||
bool is_audio_device = (AudioOutputDeviceType == type || AudioCaptureDeviceType == type);
|
||||
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (is_audio_device && pulse->isActive()) {
|
||||
QList<int> indexes = pulse->objectDescriptionIndexes(type);
|
||||
if (indexes.contains(index)) {
|
||||
QHash<QByteArray, QVariant> properties = pulse->objectDescriptionProperties(type, index);
|
||||
return new ObjectDescriptionData(index, properties);
|
||||
}
|
||||
|
||||
// When Pulse is enabled, only try from the platform plugin or backend if it is about audio capture
|
||||
if (type != AudioCaptureDeviceType)
|
||||
return new ObjectDescriptionData(0); // invalid
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||||
// prefer to get the ObjectDescriptionData from the platform plugin
|
||||
PlatformPlugin *platformPlugin = Factory::platformPlugin();
|
||||
|
|
|
@ -20,8 +20,6 @@
|
|||
|
||||
#include "audiooutput.h"
|
||||
|
||||
#include <phonon/pulsesupport.h>
|
||||
|
||||
#include <vlc/vlc.h>
|
||||
|
||||
#include "backend.h"
|
||||
|
@ -47,22 +45,16 @@ void AudioOutput::handleConnectToMediaObject(MediaObject *mediaObject)
|
|||
{
|
||||
Q_UNUSED(mediaObject);
|
||||
setOutputDeviceImplementation();
|
||||
if (!PulseSupport::getInstance()->isActive()) {
|
||||
connect(m_player, SIGNAL(mutedChanged(bool)),
|
||||
this, SLOT(onMutedChanged(bool)));
|
||||
connect(m_player, SIGNAL(volumeChanged(float)),
|
||||
this, SLOT(onVolumeChanged(float)));
|
||||
applyVolume();
|
||||
}
|
||||
connect(m_player, SIGNAL(mutedChanged(bool)),
|
||||
this, SLOT(onMutedChanged(bool)));
|
||||
connect(m_player, SIGNAL(volumeChanged(float)),
|
||||
this, SLOT(onVolumeChanged(float)));
|
||||
applyVolume();
|
||||
}
|
||||
|
||||
void AudioOutput::handleAddToMedia(Media *media)
|
||||
{
|
||||
media->addOption(":audio");
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse && pulse->isActive()) {
|
||||
pulse->setupStreamEnvironment(m_streamUuid);
|
||||
}
|
||||
}
|
||||
|
||||
qreal AudioOutput::volume() const
|
||||
|
@ -128,23 +120,6 @@ void AudioOutput::setStreamUuid(QString uuid)
|
|||
void AudioOutput::setOutputDeviceImplementation()
|
||||
{
|
||||
Q_ASSERT(m_player);
|
||||
#if (LIBVLC_VERSION_INT >= LIBVLC_VERSION(2, 2, 0, 0))
|
||||
// VLC 2.2 has the PulseSupport overrides always disabled because of
|
||||
// incompatibility. Also see backend.cpp for more detals.
|
||||
// To get access to the correct activity state we need to temporarily
|
||||
// enable pulse and then disable it again. This is necessary because isActive
|
||||
// is in fact isActive&isEnabled.............
|
||||
PulseSupport::getInstance()->enable(true);
|
||||
const bool pulseActive = PulseSupport::getInstance()->isActive();
|
||||
PulseSupport::getInstance()->enable(false);
|
||||
#else
|
||||
const bool pulseActive = PulseSupport::getInstance()->isActive();
|
||||
#endif
|
||||
if (pulseActive) {
|
||||
m_player->setAudioOutput("pulse");
|
||||
debug() << "Setting aout to pulse";
|
||||
return;
|
||||
}
|
||||
|
||||
const QVariant dalProperty = m_device.property("deviceAccessList");
|
||||
if (!dalProperty.isValid()) {
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include <QVariant>
|
||||
|
||||
#include <phonon/GlobalDescriptionContainer>
|
||||
#include <phonon/pulsesupport.h>
|
||||
|
||||
#include <vlc/libvlc_version.h>
|
||||
|
||||
|
@ -102,9 +101,6 @@ Backend::Backend(QObject *parent, const QVariantList &)
|
|||
" PulseAudio requires you to set QCoreApplication::applicationName()");
|
||||
}
|
||||
|
||||
PulseSupport::getInstance()->enable(true);
|
||||
const bool pulseActive = PulseSupport::getInstance()->isActive();
|
||||
PulseSupport::getInstance()->enable(false);
|
||||
if (!qApp->applicationName().isEmpty()) {
|
||||
const QString id = QString("org.kde.phonon.%1").arg(qApp->applicationName());
|
||||
const QString version = qApp->applicationVersion();
|
||||
|
@ -121,11 +117,6 @@ Backend::Backend(QObject *parent, const QVariantList &)
|
|||
id.toUtf8().constData(),
|
||||
version.toUtf8().constData(),
|
||||
icon.toUtf8().constData());
|
||||
} else if (pulseActive) {
|
||||
qWarning("WARNING: Setting PulseAudio context information requires you"
|
||||
" to set QCoreApplication::applicationName(),"
|
||||
" QCoreApplication::applicationVersion() and"
|
||||
" QGuiApplication::windowIcon().");
|
||||
}
|
||||
} else {
|
||||
#ifdef __GNUC__
|
||||
|
@ -143,20 +134,6 @@ Backend::Backend(QObject *parent, const QVariantList &)
|
|||
fatal() << "Phonon::VLC::vlcInit: Failed to initialize VLC";
|
||||
}
|
||||
|
||||
// Initialise PulseAudio support
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
#if (LIBVLC_VERSION_INT >= LIBVLC_VERSION(2, 2, 0, 0))
|
||||
// VLC 2.2 changed the stream creation order around internally which breaks
|
||||
// the Pulseaudio hijacking. Since VLC upstream doesn't feel like giving us
|
||||
// any more property control we now consider this feature unsupported. As
|
||||
// such whatever properties VLC sets will be what pulse knows about us.
|
||||
pulse->enable(true);
|
||||
connect(pulse, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)),
|
||||
SIGNAL(objectDescriptionChanged(ObjectDescriptionType)));
|
||||
#else
|
||||
pulse->enable(false);
|
||||
#endif
|
||||
|
||||
m_deviceManager = new DeviceManager(this);
|
||||
m_effectManager = new EffectManager(this);
|
||||
}
|
||||
|
@ -169,7 +146,6 @@ Backend::~Backend()
|
|||
delete GlobalAudioChannels::self;
|
||||
if (GlobalSubtitles::self)
|
||||
delete GlobalSubtitles::self;
|
||||
PulseSupport::shutdown();
|
||||
}
|
||||
|
||||
QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const QList<QVariant> &args)
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
|
||||
#include "devicemanager.h"
|
||||
|
||||
#include <phonon/pulsesupport.h>
|
||||
|
||||
#include <vlc/vlc.h>
|
||||
|
||||
#include "backend.h"
|
||||
|
@ -208,19 +206,6 @@ void DeviceManager::updateDeviceList()
|
|||
|
||||
QList<QByteArray> audioOutBackends = vlcAudioOutBackends();
|
||||
|
||||
PulseSupport *pulse = PulseSupport::getInstance();
|
||||
if (pulse && pulse->isActive()) {
|
||||
if (audioOutBackends.contains("pulse")) {
|
||||
DeviceInfo defaultAudioOutputDevice(tr("Default"), false);
|
||||
defaultAudioOutputDevice.setCapabilities(DeviceInfo::AudioOutput);
|
||||
defaultAudioOutputDevice.addAccess(DeviceAccess("pulse", "default"));
|
||||
newDeviceList.append(defaultAudioOutputDevice);
|
||||
return;
|
||||
} else {
|
||||
pulse->enable(false);
|
||||
}
|
||||
}
|
||||
|
||||
QList<QByteArray> knownSoundSystems;
|
||||
// Whitelist - Order has no particular impact.
|
||||
// NOTE: if listing was not intercepted by the PA code above we also need
|
||||
|
|
|
@ -26,8 +26,6 @@
|
|||
#include <QtCore/QStringBuilder>
|
||||
#include <QtCore/QVarLengthArray>
|
||||
|
||||
#include <phonon/pulsesupport.h>
|
||||
|
||||
#include <vlc/libvlc.h>
|
||||
#include <vlc/libvlc_version.h>
|
||||
|
||||
|
@ -98,10 +96,7 @@ bool LibVLC::init()
|
|||
args << "--no-video";
|
||||
// 6 seconds disk read buffer (up from vlc 2.1 default of 300ms) when using alsa, prevents most buffer underruns
|
||||
// when the disk is very busy. We expect the pulse buffer after decoding to solve the same problem.
|
||||
Phonon::PulseSupport *pulse = Phonon::PulseSupport::getInstance();
|
||||
if (!pulse || !pulse->isActive()) {
|
||||
args << "--file-caching=6000";
|
||||
}
|
||||
args << "--file-caching=6000";
|
||||
|
||||
// Build const char* array
|
||||
QVarLengthArray<const char *, 64> vlcArgs(args.size());
|
||||
|
|
|
@ -1,129 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2010 Colin Guthrie <cguthrie@mandriva.org>
|
||||
Copyright (C) 2013 Harald Sitter <sitter@kde.org>
|
||||
|
||||
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 of the License, or (at your option) version 3, or any
|
||||
later version accepted by the membership of KDE e.V. (or its
|
||||
successor approved by the membership of KDE e.V.), Nokia Corporation
|
||||
(or its successors, if any) and the KDE Free Qt Foundation, which shall
|
||||
act as a proxy defined in Section 6 of version 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "pulsestream_p.h"
|
||||
|
||||
#include <QtCore/qmath.h>
|
||||
|
||||
#include "pulsesupport.h"
|
||||
|
||||
namespace Phonon
|
||||
{
|
||||
|
||||
PulseStream::PulseStream(QString streamUuid, QString role)
|
||||
: QObject()
|
||||
, mStreamUuid(streamUuid)
|
||||
, mIndex(PA_INVALID_INDEX)
|
||||
, mDevice(-1)
|
||||
, mMute(false)
|
||||
, mCachedVolume(-1)
|
||||
, mRole(role)
|
||||
{
|
||||
pa_cvolume_init(&mVolume);
|
||||
}
|
||||
|
||||
PulseStream::~PulseStream()
|
||||
{
|
||||
}
|
||||
|
||||
QString PulseStream::uuid() const
|
||||
{
|
||||
return mStreamUuid;
|
||||
}
|
||||
|
||||
uint32_t PulseStream::index() const
|
||||
{
|
||||
return mIndex;
|
||||
}
|
||||
|
||||
void PulseStream::setIndex(uint32_t index)
|
||||
{
|
||||
mIndex = index;
|
||||
}
|
||||
|
||||
uint8_t PulseStream::channels() const
|
||||
{
|
||||
return mVolume.channels;
|
||||
}
|
||||
|
||||
void PulseStream::setDevice(int device)
|
||||
{
|
||||
if (mDevice != device) {
|
||||
mDevice = device;
|
||||
emit usingDevice(device);
|
||||
}
|
||||
}
|
||||
|
||||
// Copied from AudioOutput
|
||||
static const qreal LOUDNESS_TO_VOLTAGE_EXPONENT = qreal(0.67);
|
||||
static const qreal VOLTAGE_TO_LOUDNESS_EXPONENT = qreal(1.0/LOUDNESS_TO_VOLTAGE_EXPONENT);
|
||||
|
||||
void PulseStream::setVolume(const pa_cvolume *volume)
|
||||
{
|
||||
if (mCachedVolume != -1)
|
||||
QMetaObject::invokeMethod(this, "applyCachedVolume", Qt::QueuedConnection);
|
||||
if (pa_cvolume_equal(&mVolume, volume) == 0) {
|
||||
memcpy(&mVolume, volume, sizeof(mVolume));
|
||||
qreal vol = (qreal)pa_cvolume_avg(volume) / PA_VOLUME_NORM;
|
||||
// AudioOutput expects the "backend" to supply values that have been
|
||||
// adjusted for Stephens' law, so we need to fudge them accordingly
|
||||
// so that the %ages match up in KMix/the application's own slider.
|
||||
emit volumeChanged(qPow(vol, VOLTAGE_TO_LOUDNESS_EXPONENT));
|
||||
}
|
||||
}
|
||||
|
||||
void PulseStream::setMute(bool mute)
|
||||
{
|
||||
if (mMute != mute) {
|
||||
mMute = mute;
|
||||
emit muteChanged(mMute);
|
||||
}
|
||||
}
|
||||
|
||||
qreal PulseStream::cachedVolume() const
|
||||
{
|
||||
return mCachedVolume;
|
||||
}
|
||||
|
||||
void PulseStream::setCachedVolume(qreal volume)
|
||||
{
|
||||
mCachedVolume = volume;
|
||||
}
|
||||
|
||||
QString PulseStream::role() const
|
||||
{
|
||||
return mRole;
|
||||
}
|
||||
|
||||
void PulseStream::applyCachedVolume()
|
||||
{
|
||||
if (mCachedVolume == -1)
|
||||
return;
|
||||
PulseSupport::getInstance()->setOutputVolume(mStreamUuid, mCachedVolume);
|
||||
mCachedVolume = -1;
|
||||
}
|
||||
|
||||
} // namespace Phonon
|
||||
|
||||
#include "moc_pulsestream_p.h"
|
||||
|
||||
// vim: sw=4 ts=4
|
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2010 Colin Guthrie <cguthrie@mandriva.org>
|
||||
Copyright (C) 2013 Harald Sitter <sitter@kde.org>
|
||||
|
||||
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 of the License, or (at your option) version 3, or any
|
||||
later version accepted by the membership of KDE e.V. (or its
|
||||
successor approved by the membership of KDE e.V.), Nokia Corporation
|
||||
(or its successors, if any) and the KDE Free Qt Foundation, which shall
|
||||
act as a proxy defined in Section 6 of version 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef PHONON_PULSESTREAM_P_H
|
||||
#define PHONON_PULSESTREAM_P_H
|
||||
|
||||
#include <QtCore/QObject>
|
||||
|
||||
#include <pulse/pulseaudio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "phonon_export.h"
|
||||
#include "phononnamespace.h"
|
||||
|
||||
|
||||
namespace Phonon
|
||||
{
|
||||
class PHONON_EXPORT PulseStream : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PulseStream(QString streamUuid, QString role);
|
||||
~PulseStream();
|
||||
|
||||
QString uuid() const;
|
||||
|
||||
uint32_t index() const;
|
||||
void setIndex(uint32_t index);
|
||||
|
||||
uint8_t channels() const;
|
||||
|
||||
void setDevice(int device);
|
||||
void setVolume(const pa_cvolume *volume);
|
||||
void setMute(bool mute);
|
||||
|
||||
qreal cachedVolume() const;
|
||||
void setCachedVolume(qreal volume);
|
||||
|
||||
QString role() const;
|
||||
|
||||
signals:
|
||||
void usingDevice(int device);
|
||||
void volumeChanged(qreal volume);
|
||||
void muteChanged(bool mute);
|
||||
|
||||
private slots:
|
||||
void applyCachedVolume();
|
||||
|
||||
private:
|
||||
QString mStreamUuid;
|
||||
uint32_t mIndex;
|
||||
int mDevice;
|
||||
pa_cvolume mVolume;
|
||||
bool mMute;
|
||||
// -1 = not set
|
||||
qreal mCachedVolume;
|
||||
QString mRole;
|
||||
};
|
||||
} // namespace Phonon
|
||||
|
||||
|
||||
#endif // PHONON_PULSESTREAM_P_H
|
File diff suppressed because it is too large
Load diff
|
@ -1,135 +0,0 @@
|
|||
/* This file is part of the KDE project
|
||||
Copyright (C) 2009 Colin Guthrie <cguthrie@mandriva.org>
|
||||
|
||||
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 of the License, or (at your option) version 3, or any
|
||||
later version accepted by the membership of KDE e.V. (or its
|
||||
successor approved by the membership of KDE e.V.), Nokia Corporation
|
||||
(or its successors, if any) and the KDE Free Qt Foundation, which shall
|
||||
act as a proxy defined in Section 6 of version 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef PHONON_PULSESUPPORT_H
|
||||
#define PHONON_PULSESUPPORT_H
|
||||
|
||||
#include "phonon_export.h"
|
||||
#include "phononnamespace.h"
|
||||
#include "objectdescription.h"
|
||||
|
||||
#include <QtCore/QtGlobal>
|
||||
#include <QtCore/QSet>
|
||||
|
||||
|
||||
namespace Phonon
|
||||
{
|
||||
class PulseStream;
|
||||
class PHONON_EXPORT PulseSupport : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
/**
|
||||
* \returns the instance pointer or null, see note.
|
||||
* \note If \param allowNull is \c true and the instance was already
|
||||
* shut down this function instead returns to indicate that
|
||||
* the instance was already shut down.
|
||||
* If \param allowNull is \c false and the instance was already
|
||||
* shut down a dummy instance is returned instead. This case
|
||||
* will furthermore result in a qWarning being printed, so
|
||||
* when possible and sensible null handling should be done
|
||||
* to prevent this.
|
||||
*/
|
||||
static PulseSupport *getInstanceOrNull(bool allowNull = false);
|
||||
/** This function behaves like getInstanceOrNull(false). \see getInstanceOrNull */
|
||||
static PulseSupport *getInstance();
|
||||
static void shutdown();
|
||||
|
||||
bool isActive();
|
||||
void enable(bool enabled = true);
|
||||
|
||||
QList<int> objectDescriptionIndexes(ObjectDescriptionType type) const;
|
||||
QHash<QByteArray, QVariant> objectDescriptionProperties(ObjectDescriptionType type, int index) const;
|
||||
QList<int> objectIndexesByCategory(ObjectDescriptionType type, Category category) const;
|
||||
QList<int> objectIndexesByCategory(ObjectDescriptionType type, CaptureCategory category) const;
|
||||
|
||||
void setOutputDevicePriorityForCategory(Category category, QList<int> order);
|
||||
void setCaptureDevicePriorityForCategory(CaptureCategory category, QList<int> order);
|
||||
|
||||
PHONON_DEPRECATED void setCaptureDevicePriorityForCategory(Category category, QList<int> order);
|
||||
|
||||
PulseStream *registerOutputStream(QString streamUuid, Category category);
|
||||
PulseStream *registerCaptureStream(QString streamUuid, CaptureCategory category);
|
||||
PHONON_DEPRECATED PulseStream *registerCaptureStream(QString streamUuid, Category category);
|
||||
|
||||
/**
|
||||
* Whenever possible this function should be used to get Phonon
|
||||
* specific PulseAudio stream properties and set them on specific
|
||||
* streams. When precisely setting them per stream is not possible
|
||||
* the envrionment setup function PulseSupport::setupStreamEnvironment
|
||||
* should be called as close to stream creation as possible. The
|
||||
* more time passes between setup and stream creation the more
|
||||
* likely race conditions between setup of more than one AudioOutput
|
||||
* will appear.
|
||||
*
|
||||
* \param streamUuid the AudioOutputs' stream UUID set by the frontend through
|
||||
* AudioOutputInterface47::setStreamUuid
|
||||
*
|
||||
* \returns a hash of all properties set by setupStreamEnvironment
|
||||
*
|
||||
* \see setupStreamEnvironment
|
||||
* \since 4.7.0
|
||||
*/
|
||||
QHash<QString, QString> streamProperties(QString streamUuid) const;
|
||||
|
||||
/**
|
||||
* Sets PulseAudio override properties in the process' envrionment.
|
||||
* Manually setting the properties on a per-stream basis is
|
||||
* preferred as envrionment overrides are subject to race conditions
|
||||
* when creating more than one stream around the same time.
|
||||
*
|
||||
* \param streamUuid the AudioOutputs' stream UUID set by the frontend
|
||||
* through AudioOutputInterface47::setStreamUuid
|
||||
*
|
||||
* \see streamProperties
|
||||
* \since 4.7.0
|
||||
*/
|
||||
void setupStreamEnvironment(QString streamUuid);
|
||||
|
||||
void emitObjectDescriptionChanged(ObjectDescriptionType);
|
||||
|
||||
bool setOutputName(QString streamUuid, QString name);
|
||||
bool setOutputDevice(QString streamUuid, int device);
|
||||
bool setOutputVolume(QString streamUuid, qreal volume);
|
||||
bool setOutputMute(QString streamUuid, bool mute);
|
||||
bool setCaptureDevice(QString streamUuid, int device);
|
||||
// NB Capture Volume/Mute not set until PA supports per-source-output volumes/mutes
|
||||
// or phonon supports capture properly... which ever comes first.
|
||||
void clearStreamCache(QString streamUuid);
|
||||
|
||||
static void debug();
|
||||
public Q_SLOTS:
|
||||
void connectToDaemon();
|
||||
|
||||
Q_SIGNALS:
|
||||
void objectDescriptionChanged(ObjectDescriptionType);
|
||||
|
||||
private:
|
||||
PulseSupport();
|
||||
~PulseSupport();
|
||||
|
||||
bool mEnabled;
|
||||
};
|
||||
} // namespace Phonon
|
||||
|
||||
|
||||
#endif // PHONON_PULSESUPPORT_H
|
Loading…
Add table
Reference in a new issue