mirror of
https://gitdl.cn/https://github.com/chakralinux/core.git
synced 2025-02-14 20:09:03 +08:00
18814 lines
671 KiB
Plaintext
18814 lines
671 KiB
Plaintext
commit 13b550c5984d6164ce4871e2634ea621bb58b3a7
|
||
Author: Martin T. H. Sandsmark <sandsmark@samfundet.no>
|
||
Date: Wed Dec 9 14:23:01 2009 +0100
|
||
|
||
Import an up to date Phonon release from Phonon trunk in KDE's SVN.
|
||
|
||
diff --git a/src/3rdparty/phonon/gstreamer/CMakeLists.txt b/src/3rdparty/phonon/gstreamer/CMakeLists.txt
|
||
index 4946f5f..d529fb6 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/CMakeLists.txt
|
||
+++ b/src/3rdparty/phonon/gstreamer/CMakeLists.txt
|
||
@@ -1,4 +1,4 @@
|
||
-# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||
+# Copyright (C) 2009 Nokia Corporation. All rights reserved.
|
||
# Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
#
|
||
# This library is free software: you can redistribute it and/or modify
|
||
@@ -17,12 +17,23 @@ project(phonon-gstreamer)
|
||
include(ConfigureChecks.cmake)
|
||
|
||
if (BUILD_PHONON_GSTREAMER)
|
||
- include_directories(${GSTREAMER_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR}
|
||
- ${LIBXML2_INCLUDE_DIR})
|
||
+ include_directories(
|
||
+ ${CMAKE_CURRENT_BINARY_DIR}
|
||
+ ${GSTREAMER_INCLUDE_DIR}
|
||
+ ${GLIB2_INCLUDE_DIR}
|
||
+ ${LIBXML2_INCLUDE_DIR}
|
||
+ ${X11_X11_INCLUDE_PATH})
|
||
+ add_definitions(-DPHONON_BACKEND_VERSION_4_2)
|
||
+
|
||
+ # configure plugin api
|
||
+ if(USE_INSTALL_PLUGIN)
|
||
+ set(PLUGIN_INSTALL_API TRUE)
|
||
+ endif(USE_INSTALL_PLUGIN)
|
||
+
|
||
+ configure_file(phonon-config-gstreamer.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/phonon-config-gstreamer.h )
|
||
|
||
set(phonon_gstreamer_SRCS
|
||
audiooutput.cpp
|
||
- artssink.cpp
|
||
backend.cpp
|
||
devicemanager.cpp
|
||
effectmanager.cpp
|
||
@@ -38,24 +49,30 @@ if (BUILD_PHONON_GSTREAMER)
|
||
message.cpp
|
||
audioeffect.cpp
|
||
abstractrenderer.cpp
|
||
- x11renderer.cpp
|
||
widgetrenderer.cpp
|
||
glrenderer.cpp
|
||
volumefadereffect.cpp
|
||
+ audiodataoutput.cpp
|
||
)
|
||
|
||
- find_package(Alsa)
|
||
- if(ALSA_FOUND)
|
||
+ if(NOT WIN32)
|
||
+ set(phonon_gstreamer_SRCS
|
||
+ ${phonon_gstreamer_SRCS}
|
||
+ artssink.cpp
|
||
+ x11renderer.cpp)
|
||
+ macro_optional_find_package(Alsa)
|
||
+ macro_ensure_version("0.10.22" ${GSTREAMER_VERSION} GSTREAMER_HAS_NONBLOCKING_ALSASINK)
|
||
+ endif(NOT WIN32)
|
||
+ if(ALSA_FOUND AND NOT GSTREAMER_HAS_NONBLOCKING_ALSASINK)
|
||
add_definitions(-DUSE_ALSASINK2)
|
||
include_directories(${ALSA_INCLUDES})
|
||
set(phonon_gstreamer_SRCS
|
||
${phonon_gstreamer_SRCS}
|
||
alsasink2.c
|
||
)
|
||
- endif(ALSA_FOUND)
|
||
+ endif(ALSA_FOUND AND NOT GSTREAMER_HAS_NONBLOCKING_ALSASINK)
|
||
|
||
- automoc4(phonon_gstreamer phonon_gstreamer_SRCS)
|
||
- add_library(phonon_gstreamer SHARED ${phonon_gstreamer_SRCS})
|
||
+ automoc4_add_library(phonon_gstreamer MODULE ${phonon_gstreamer_SRCS})
|
||
set_target_properties(phonon_gstreamer PROPERTIES PREFIX "")
|
||
target_link_libraries(phonon_gstreamer
|
||
${QT_QTOPENGL_LIBRARY}
|
||
@@ -66,6 +83,9 @@ if (BUILD_PHONON_GSTREAMER)
|
||
if(ALSA_FOUND)
|
||
target_link_libraries(phonon_gstreamer ${ASOUND_LIBRARY})
|
||
endif(ALSA_FOUND)
|
||
+ if(USE_INSTALL_PLUGIN)
|
||
+ target_link_libraries(phonon_gstreamer ${GSTREAMER_PLUGIN_PBUTILS_LIBRARIES})
|
||
+ endif(USE_INSTALL_PLUGIN)
|
||
|
||
install(TARGETS phonon_gstreamer DESTINATION ${PLUGIN_INSTALL_DIR}/plugins/phonon_backend)
|
||
install(FILES gstreamer.desktop DESTINATION ${SERVICES_INSTALL_DIR}/phononbackends)
|
||
diff --git a/src/3rdparty/phonon/gstreamer/ConfigureChecks.cmake b/src/3rdparty/phonon/gstreamer/ConfigureChecks.cmake
|
||
index f2922e1..095a0e9 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/ConfigureChecks.cmake
|
||
+++ b/src/3rdparty/phonon/gstreamer/ConfigureChecks.cmake
|
||
@@ -1,4 +1,4 @@
|
||
-# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||
+# Copyright (C) 2009 Nokia Corporation. All rights reserved.
|
||
#
|
||
# 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
|
||
@@ -17,6 +17,7 @@ macro_log_feature(GSTREAMER_FOUND "GStreamer" "gstreamer 0.10 is required for th
|
||
|
||
macro_optional_find_package(GStreamerPlugins)
|
||
macro_log_feature(GSTREAMER_PLUGIN_VIDEO_LIBRARIES "GStreamer video plugin" "The gstreamer video plugin (part of gstreamer-plugins-base 0.10) is required for the multimedia gstreamer backend" "http://gstreamer.freedesktop.org/modules/" FALSE "0.10")
|
||
+macro_log_feature(GSTREAMER_PLUGIN_AUDIO_LIBRARIES "GStreamer audio plugin" "The gstreamer audio plugin (part of gstreamer-plugins-base 0.10) is required for the multimedia gstreamer backend" "http://gstreamer.freedesktop.org/modules/" FALSE "0.10")
|
||
|
||
macro_optional_find_package(GLIB2)
|
||
macro_log_feature(GLIB2_FOUND "GLib2" "GLib 2 is required to compile the gstreamer backend for Phonon" "http://www.gtk.org/download/" FALSE)
|
||
@@ -30,8 +31,8 @@ macro_log_feature(LIBXML2_FOUND "LibXml2" "LibXml2 is required to compile the gs
|
||
macro_optional_find_package(OpenGL)
|
||
macro_log_feature(OPENGL_FOUND "OpenGL" "OpenGL support is required to compile the gstreamer backend for Phonon" "" FALSE)
|
||
|
||
-if (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
+if (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
set(BUILD_PHONON_GSTREAMER TRUE)
|
||
-else (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
+else (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
set(BUILD_PHONON_GSTREAMER FALSE)
|
||
-endif (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
+endif (GSTREAMER_FOUND AND GSTREAMER_PLUGIN_VIDEO_LIBRARIES AND GSTREAMER_PLUGIN_AUDIO_LIBRARIES AND GLIB2_FOUND AND GOBJECT_FOUND AND LIBXML2_FOUND AND OPENGL_FOUND)
|
||
diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.cpp b/src/3rdparty/phonon/gstreamer/abstractrenderer.cpp
|
||
index 5d88d10..924b611 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/abstractrenderer.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/abstractrenderer.cpp
|
||
@@ -17,7 +17,6 @@
|
||
|
||
#include "abstractrenderer.h"
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
namespace Phonon
|
||
@@ -53,5 +52,5 @@ void AbstractRenderer::movieSizeChanged(const QSize &size)
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
+
|
||
|
||
diff --git a/src/3rdparty/phonon/gstreamer/abstractrenderer.h b/src/3rdparty/phonon/gstreamer/abstractrenderer.h
|
||
index 10a2822..140413d 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/abstractrenderer.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/abstractrenderer.h
|
||
@@ -23,7 +23,6 @@
|
||
#include "medianode.h"
|
||
#include <phonon/videowidget.h>
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
class QString;
|
||
@@ -59,5 +58,5 @@ protected:
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
+
|
||
#endif // Phonon_GSTREAMER_ABSTRACTRENDERER_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/artssink.cpp b/src/3rdparty/phonon/gstreamer/artssink.cpp
|
||
index 441607d..ff56da9 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/artssink.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/artssink.cpp
|
||
@@ -233,7 +233,7 @@ static void arts_sink_init (ArtsSink * src, ArtsSinkClass * g_class)
|
||
Q_UNUSED(g_class);
|
||
GST_DEBUG_OBJECT (src, "initializing artssink");
|
||
src->stream = 0;
|
||
-#ifndef QT_NO_LIBRARY
|
||
+
|
||
p_arts_init = (Ptr_arts_init)QLibrary::resolve(QLatin1String("artsc"), 0, "arts_init");
|
||
p_arts_play_stream = (Ptr_arts_play_stream)QLibrary::resolve(QLatin1String("artsc"), 0, "arts_play_stream");
|
||
p_arts_close_stream = (Ptr_arts_close_stream)QLibrary::resolve(QLatin1String("artsc"), 0, "arts_close_stream");
|
||
@@ -250,7 +250,6 @@ static void arts_sink_init (ArtsSink * src, ArtsSinkClass * g_class)
|
||
}
|
||
}
|
||
sinkCount ++;
|
||
-#endif //QT_NO_LIBRARY
|
||
}
|
||
|
||
static void arts_sink_dispose (GObject * object)
|
||
diff --git a/src/3rdparty/phonon/gstreamer/audiodataoutput.cpp b/src/3rdparty/phonon/gstreamer/audiodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..30dabdf
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/gstreamer/audiodataoutput.cpp
|
||
@@ -0,0 +1,143 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@kde.org>
|
||
+ Copyright (C) 2009 Martin Sandsmark <sandsmark@samfundet.no>
|
||
+
|
||
+ 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 "audiodataoutput.h"
|
||
+#include "gsthelper.h"
|
||
+#include "medianode.h"
|
||
+#include "mediaobject.h"
|
||
+#include <QtCore/QVector>
|
||
+#include <QtCore/QMap>
|
||
+#include <phonon/audiooutput.h>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Gstreamer
|
||
+{
|
||
+AudioDataOutput::AudioDataOutput(Backend *backend, QObject *parent)
|
||
+ : QObject(parent),
|
||
+ MediaNode(backend, AudioSink | AudioSource)
|
||
+{
|
||
+ static int count = 0;
|
||
+ m_name = "AudioDataOutput" + QString::number(count++);
|
||
+
|
||
+ m_queue = gst_element_factory_make ("identity", NULL);
|
||
+ gst_object_ref(m_queue);
|
||
+ m_isValid = true;
|
||
+}
|
||
+
|
||
+AudioDataOutput::~AudioDataOutput()
|
||
+{
|
||
+ gst_element_set_state(m_queue, GST_STATE_NULL);
|
||
+ gst_object_unref(m_queue);
|
||
+}
|
||
+
|
||
+int AudioDataOutput::dataSize() const
|
||
+{
|
||
+ return m_dataSize;
|
||
+}
|
||
+
|
||
+int AudioDataOutput::sampleRate() const
|
||
+{
|
||
+ return 44100;
|
||
+}
|
||
+
|
||
+void AudioDataOutput::setDataSize(int size)
|
||
+{
|
||
+ m_dataSize = size;
|
||
+}
|
||
+
|
||
+typedef QMap<Phonon::AudioDataOutput::Channel, QVector<float> > FloatMap;
|
||
+typedef QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > IntMap;
|
||
+
|
||
+inline void AudioDataOutput::convertAndEmit(const QVector<qint16> &leftBuffer, const QVector<qint16> &rightBuffer)
|
||
+{
|
||
+ //TODO: Floats
|
||
+ IntMap map;
|
||
+ map.insert(Phonon::AudioDataOutput::LeftChannel, leftBuffer);
|
||
+ map.insert(Phonon::AudioDataOutput::RightChannel, rightBuffer);
|
||
+ emit dataReady(map);
|
||
+}
|
||
+
|
||
+void AudioDataOutput::processBuffer(GstPad*, GstBuffer* buffer, gpointer gThat)
|
||
+{
|
||
+ // TODO emit endOfMedia
|
||
+ AudioDataOutput *that = reinterpret_cast<AudioDataOutput*>(gThat);
|
||
+
|
||
+ // determine the number of channels
|
||
+ GstStructure* structure = gst_caps_get_structure (GST_BUFFER_CAPS(buffer), 0);
|
||
+ gst_structure_get_int (structure, "channels", &that->m_channels);
|
||
+
|
||
+ if (that->m_channels > 2 || that->m_channels < 0) {
|
||
+ qWarning() << Q_FUNC_INFO << ": Number of channels not supported: " << that->m_channels;
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ gint16 *data = reinterpret_cast<gint16*>(GST_BUFFER_DATA(buffer));
|
||
+ guint size = GST_BUFFER_SIZE(buffer) / sizeof(gint16);
|
||
+
|
||
+ that->m_pendingData.reserve(that->m_pendingData.size() + size);
|
||
+
|
||
+ for (uint i=0; i<size; i++) {
|
||
+ // 8 bit? interleaved? yay for lacking documentation!
|
||
+ that->m_pendingData.append(data[i]);
|
||
+ }
|
||
+
|
||
+ while (that->m_pendingData.size() > that->m_dataSize * that->m_channels) {
|
||
+ if (that->m_channels == 1) {
|
||
+ QVector<qint16> intBuffer(that->m_dataSize);
|
||
+ memcpy(intBuffer.data(), that->m_pendingData.constData(), that->m_dataSize * sizeof(qint16));
|
||
+
|
||
+ that->convertAndEmit(intBuffer, intBuffer);
|
||
+ int newSize = that->m_pendingData.size() - that->m_dataSize;
|
||
+ memmove(that->m_pendingData.data(), that->m_pendingData.constData() + that->m_dataSize, newSize * sizeof(qint16));
|
||
+ that->m_pendingData.resize(newSize);
|
||
+ } else {
|
||
+ QVector<qint16> left(that->m_dataSize), right(that->m_dataSize);
|
||
+ for (int i=0; i<that->m_dataSize; i++) {
|
||
+ left[i] = that->m_pendingData[i*2];
|
||
+ right[i] = that->m_pendingData[i*2+1];
|
||
+ }
|
||
+ that->m_pendingData.resize(that->m_pendingData.size() - that->m_dataSize*2);
|
||
+ that->convertAndEmit(left, right);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void AudioDataOutput::mediaNodeEvent(const MediaNodeEvent *event)
|
||
+{
|
||
+ if (event->type() == MediaNodeEvent::MediaObjectConnected && root()) {
|
||
+ g_object_set(G_OBJECT(audioElement()), "sync", true, (const char*)NULL);
|
||
+ GstPad *audiopad = gst_element_get_pad (audioElement(), "src");
|
||
+ gst_pad_add_buffer_probe (audiopad, G_CALLBACK(processBuffer), this);
|
||
+ gst_object_unref (audiopad);
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ MediaNode::mediaNodeEvent(event);
|
||
+}
|
||
+
|
||
+}} //namespace Phonon::Gstreamer
|
||
+
|
||
+#include "moc_audiodataoutput.cpp"
|
||
+// vim: sw=4 ts=4
|
||
+
|
||
diff --git a/src/3rdparty/phonon/gstreamer/audiodataoutput.h b/src/3rdparty/phonon/gstreamer/audiodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..5e30a1d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/gstreamer/audiodataoutput.h
|
||
@@ -0,0 +1,84 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@kde.org>
|
||
+ Copyright (C) 2009 Martin Sandsmark <sandsmark@samfundet.no>
|
||
+
|
||
+ 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_GSTREAMER_AUDIODATAOUTPUT_H
|
||
+#define Phonon_GSTREAMER_AUDIODATAOUTPUT_H
|
||
+
|
||
+#include "abstractaudiooutput.h"
|
||
+#include "backend.h"
|
||
+#include "medianode.h"
|
||
+#include <phonon/audiodataoutput.h>
|
||
+#include <phonon/audiodataoutputinterface.h>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Gstreamer
|
||
+{
|
||
+ /**
|
||
+ * \author Martin Sandsmark <sandsmark@samfundet.no>
|
||
+ */
|
||
+ class AudioDataOutput : public QObject,
|
||
+ public AudioDataOutputInterface,
|
||
+ public MediaNode
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ Q_INTERFACES(Phonon::AudioDataOutputInterface Phonon::Gstreamer::MediaNode)
|
||
+
|
||
+ public:
|
||
+ AudioDataOutput(Backend *, QObject *);
|
||
+ ~AudioDataOutput();
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ int dataSize() const;
|
||
+ int sampleRate() const;
|
||
+ void setDataSize(int size);
|
||
+
|
||
+ public:
|
||
+ /// callback function for handling new audio data
|
||
+ static void processBuffer(GstPad*, GstBuffer*, gpointer);
|
||
+
|
||
+ Phonon::AudioDataOutput* frontendObject() const { return m_frontend; }
|
||
+ void setFrontendObject(Phonon::AudioDataOutput *frontend) { m_frontend = frontend; }
|
||
+
|
||
+ GstElement *audioElement() { return m_queue; }
|
||
+
|
||
+ void mediaNodeEvent(const MediaNodeEvent *event);
|
||
+
|
||
+
|
||
+ signals:
|
||
+ void dataReady(const QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > &data);
|
||
+ void dataReady(const QMap<Phonon::AudioDataOutput::Channel, QVector<float> > &data);
|
||
+ void endOfMedia(int remainingSamples);
|
||
+
|
||
+ private:
|
||
+ void convertAndEmit(const QVector<qint16>&, const QVector<qint16>&);
|
||
+
|
||
+ GstElement *m_queue;
|
||
+ int m_dataSize;
|
||
+ QVector<qint16> m_pendingData;
|
||
+ Phonon::AudioDataOutput *m_frontend;
|
||
+ int m_channels;
|
||
+ };
|
||
+}} //namespace Phonon::Gstreamer
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // Phonon_FAKE_AUDIODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/audioeffect.cpp b/src/3rdparty/phonon/gstreamer/audioeffect.cpp
|
||
index d3d7a35..db72c8b 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/audioeffect.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/audioeffect.cpp
|
||
@@ -23,7 +23,7 @@
|
||
#include "gsthelper.h"
|
||
|
||
#include <gst/gst.h>
|
||
-#ifndef QT_NO_PHONON_EFFECT
|
||
+
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
namespace Phonon
|
||
@@ -75,5 +75,4 @@ GstElement* AudioEffect::createEffectBin()
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_EFFECT
|
||
#include "moc_audioeffect.cpp"
|
||
diff --git a/src/3rdparty/phonon/gstreamer/audioeffect.h b/src/3rdparty/phonon/gstreamer/audioeffect.h
|
||
index f49f8d2..3a985e5 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/audioeffect.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/audioeffect.h
|
||
@@ -29,8 +29,8 @@
|
||
|
||
#include <gst/gst.h>
|
||
|
||
-#ifndef QT_NO_PHONON_EFFECT
|
||
QT_BEGIN_NAMESPACE
|
||
+
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
@@ -49,7 +49,7 @@ namespace Gstreamer
|
||
QString m_effectName;
|
||
};
|
||
}} //namespace Phonon::Gstreamer
|
||
+
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_EFFECT
|
||
|
||
#endif // Phonon_GSTREAMER_AUDIOEFFECT_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/audiooutput.cpp b/src/3rdparty/phonon/gstreamer/audiooutput.cpp
|
||
index 138a7e4..4cfc42c 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/audiooutput.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/audiooutput.cpp
|
||
@@ -42,7 +42,6 @@ AudioOutput::AudioOutput(Backend *backend, QObject *parent)
|
||
static int count = 0;
|
||
m_name = "AudioOutput" + QString::number(count++);
|
||
if (m_backend->isValid()) {
|
||
- g_set_application_name(qApp->applicationName().toUtf8());
|
||
m_audioBin = gst_bin_new (NULL);
|
||
gst_object_ref (GST_OBJECT (m_audioBin));
|
||
gst_object_sink (GST_OBJECT (m_audioBin));
|
||
@@ -126,6 +125,7 @@ void AudioOutput::setVolume(qreal newVolume)
|
||
bool AudioOutput::setOutputDevice(int newDevice)
|
||
{
|
||
m_backend->logMessage(Q_FUNC_INFO + QString::number(newDevice), Backend::Info, this);
|
||
+
|
||
if (newDevice == m_device)
|
||
return true;
|
||
|
||
@@ -136,12 +136,11 @@ bool AudioOutput::setOutputDevice(int newDevice)
|
||
}
|
||
|
||
bool success = false;
|
||
- const QList<AudioDevice> deviceList = m_backend->deviceManager()->audioOutputDevices();
|
||
- if (m_audioSink && newDevice >= 0 && newDevice < deviceList.size()) {
|
||
+ if (m_audioSink && newDevice >= 0) {
|
||
// 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 = m_backend->deviceManager()->gstId(newDevice);
|
||
m_device = newDevice;
|
||
|
||
// We test if the device can be opened by checking if it can go from NULL to READY state
|
||
diff --git a/src/3rdparty/phonon/gstreamer/backend.cpp b/src/3rdparty/phonon/gstreamer/backend.cpp
|
||
index e1ffd1f..86cf92f 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/backend.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/backend.cpp
|
||
@@ -18,6 +18,7 @@
|
||
#include "common.h"
|
||
#include "backend.h"
|
||
#include "audiooutput.h"
|
||
+#include "audiodataoutput.h"
|
||
#include "audioeffect.h"
|
||
#include "mediaobject.h"
|
||
#include "videowidget.h"
|
||
@@ -26,6 +27,7 @@
|
||
#include "message.h"
|
||
#include "volumefadereffect.h"
|
||
#include <gst/interfaces/propertyprobe.h>
|
||
+#include <phonon/pulsesupport.h>
|
||
|
||
#include <QtCore/QSet>
|
||
#include <QtCore/QVariant>
|
||
@@ -49,19 +51,28 @@ Backend::Backend(QObject *parent, const QVariantList &)
|
||
, m_debugLevel(Warning)
|
||
, m_isValid(false)
|
||
{
|
||
+ // Initialise PulseAudio support
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ connect(pulse, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)), SIGNAL(objectDescriptionChanged(ObjectDescriptionType)));
|
||
+
|
||
+ // In order to support reloading, we only set the app name once...
|
||
+ static bool first = true;
|
||
+ if (first) {
|
||
+ first = false;
|
||
+ g_set_application_name(qApp->applicationName().toUtf8());
|
||
+ }
|
||
GError *err = 0;
|
||
bool wasInit = gst_init_check(0, 0, &err); //init gstreamer: must be called before any gst-related functions
|
||
if (err)
|
||
g_error_free(err);
|
||
|
||
qRegisterMetaType<Message>("Message");
|
||
-#ifndef QT_NO_PROPERTIES
|
||
+
|
||
setProperty("identifier", QLatin1String("phonon_gstreamer"));
|
||
setProperty("backendName", QLatin1String("Gstreamer"));
|
||
setProperty("backendComment", QLatin1String("Gstreamer plugin for Phonon"));
|
||
setProperty("backendVersion", QLatin1String("0.2"));
|
||
- setProperty("backendWebsite", QLatin1String("http://qt.nokia.com/"));
|
||
-#endif //QT_NO_PROPERTIES
|
||
+ setProperty("backendWebsite", QLatin1String("http://qtsoftware.com/"));
|
||
|
||
//check if we should enable debug output
|
||
QString debugLevelString = qgetenv("PHONON_GST_DEBUG");
|
||
@@ -85,7 +96,9 @@ Backend::Backend(QObject *parent, const QVariantList &)
|
||
|
||
Backend::~Backend()
|
||
{
|
||
- gst_deinit();
|
||
+ delete m_effectManager;
|
||
+ delete m_deviceManager;
|
||
+ PulseSupport::shutdown();
|
||
}
|
||
|
||
gboolean Backend::busCall(GstBus *bus, GstMessage *msg, gpointer data)
|
||
@@ -113,20 +126,15 @@ QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const
|
||
case MediaObjectClass:
|
||
return new MediaObject(this, parent);
|
||
|
||
- case AudioOutputClass: {
|
||
- AudioOutput *ao = new AudioOutput(this, parent);
|
||
- m_audioOutputs.append(ao);
|
||
- return ao;
|
||
- }
|
||
-#ifndef QT_NO_PHONON_EFFECT
|
||
+ case AudioOutputClass:
|
||
+ return new AudioOutput(this, parent);
|
||
+
|
||
case EffectClass:
|
||
return new AudioEffect(this, args[0].toInt(), parent);
|
||
-#endif //QT_NO_PHONON_EFFECT
|
||
+
|
||
case AudioDataOutputClass:
|
||
- logMessage("createObject() : AudioDataOutput not implemented");
|
||
- break;
|
||
+ return new AudioDataOutput(this, parent);
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
case VideoDataOutputClass:
|
||
logMessage("createObject() : VideoDataOutput not implemented");
|
||
break;
|
||
@@ -135,11 +143,9 @@ QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const
|
||
QWidget *widget = qobject_cast<QWidget*>(parent);
|
||
return new VideoWidget(this, widget);
|
||
}
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
-#ifndef QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
+
|
||
case VolumeFaderEffectClass:
|
||
return new VolumeFaderEffect(this, parent);
|
||
-#endif //QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
|
||
case VisualizationClass: //Fall through
|
||
default:
|
||
@@ -208,8 +214,15 @@ QStringList Backend::availableMimeTypes() const
|
||
GstPluginFeature *feature = GST_PLUGIN_FEATURE(iter->data);
|
||
QString klass = gst_element_factory_get_klass(GST_ELEMENT_FACTORY(feature));
|
||
|
||
- if (klass == QLatin1String("Codec/Decoder/Audio") ||
|
||
- klass == QLatin1String("Codec/Decoder/Video")) {
|
||
+ if (klass == QLatin1String("Codec/Decoder") ||
|
||
+ klass == QLatin1String("Codec/Decoder/Audio") ||
|
||
+ klass == QLatin1String("Codec/Decoder/Video") ||
|
||
+ klass == QLatin1String("Codec/Demuxer") ||
|
||
+ klass == QLatin1String("Codec/Demuxer/Audio") ||
|
||
+ klass == QLatin1String("Codec/Demuxer/Video") ||
|
||
+ klass == QLatin1String("Codec/Parser") ||
|
||
+ klass == QLatin1String("Codec/Parser/Audio") ||
|
||
+ klass == QLatin1String("Codec/Parser/Video")) {
|
||
|
||
const GList *static_templates;
|
||
GstElementFactory *factory = GST_ELEMENT_FACTORY(feature);
|
||
@@ -245,6 +258,10 @@ QList<int> Backend::objectDescriptionIndexes(ObjectDescriptionType type) const
|
||
if (!isValid())
|
||
return list;
|
||
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive() && (Phonon::AudioOutputDeviceType == type || Phonon::AudioCaptureDeviceType == type))
|
||
+ return pulse->objectDescriptionIndexes(type);
|
||
+
|
||
switch (type) {
|
||
case Phonon::AudioOutputDeviceType: {
|
||
QList<AudioDevice> deviceList = deviceManager()->audioOutputDevices();
|
||
@@ -278,13 +295,17 @@ QHash<QByteArray, QVariant> Backend::objectDescriptionProperties(ObjectDescripti
|
||
if (!isValid())
|
||
return ret;
|
||
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive() && (Phonon::AudioOutputDeviceType == type || Phonon::AudioCaptureDeviceType == type))
|
||
+ return pulse->objectDescriptionProperties(type, index);
|
||
+
|
||
switch (type) {
|
||
case Phonon::AudioOutputDeviceType: {
|
||
- QList<AudioDevice> audioDevices = deviceManager()->audioOutputDevices();
|
||
- if (index >= 0 && index < audioDevices.size()) {
|
||
- ret.insert("name", audioDevices[index].gstId);
|
||
- ret.insert("description", audioDevices[index].description);
|
||
- ret.insert("icon", QLatin1String("audio-card"));
|
||
+ AudioDevice* ad;
|
||
+ if ((ad = deviceManager()->audioDevice(index))) {
|
||
+ ret.insert("name", ad->gstId);
|
||
+ ret.insert("description", ad->description);
|
||
+ ret.insert("icon", ad->icon);
|
||
}
|
||
}
|
||
break;
|
||
@@ -413,7 +434,7 @@ EffectManager* Backend::effectManager() const
|
||
|
||
/**
|
||
* Returns a debuglevel that is determined by the
|
||
- * PHONON_GSTREAMER_DEBUG environment variable.
|
||
+ * PHONON_GST_DEBUG environment variable.
|
||
*
|
||
* Warning - important warnings
|
||
* Info - general info
|
||
diff --git a/src/3rdparty/phonon/gstreamer/backend.h b/src/3rdparty/phonon/gstreamer/backend.h
|
||
index 2aab6fa..d157f11 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/backend.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/backend.h
|
||
@@ -86,7 +86,6 @@ private Q_SLOTS:
|
||
|
||
private:
|
||
static gboolean busCall(GstBus *bus, GstMessage *msg, gpointer data);
|
||
- QList<QPointer<AudioOutput> > m_audioOutputs;
|
||
|
||
DeviceManager *m_deviceManager;
|
||
EffectManager *m_effectManager;
|
||
diff --git a/src/3rdparty/phonon/gstreamer/devicemanager.cpp b/src/3rdparty/phonon/gstreamer/devicemanager.cpp
|
||
index 60e860f..e62d281 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/devicemanager.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/devicemanager.cpp
|
||
@@ -24,6 +24,7 @@
|
||
#include "widgetrenderer.h"
|
||
#include "x11renderer.h"
|
||
#include "artssink.h"
|
||
+#include "pulsesupport.h"
|
||
|
||
#ifdef USE_ALSASINK2
|
||
#include "alsasink2.h"
|
||
@@ -44,9 +45,12 @@ namespace Gstreamer
|
||
AudioDevice::AudioDevice(DeviceManager *manager, const QByteArray &gstId)
|
||
: gstId(gstId)
|
||
{
|
||
- //get an id
|
||
- static int counter = 0;
|
||
- id = counter++;
|
||
+ // This should never be called when PulseAudio is active.
|
||
+ Q_ASSERT(!PulseSupport::getInstance()->isActive());
|
||
+
|
||
+ id = manager->allocateDeviceId();
|
||
+ icon = "audio-card";
|
||
+
|
||
//get name from device
|
||
if (gstId == "default") {
|
||
description = "Default audio device";
|
||
@@ -71,22 +75,25 @@ AudioDevice::AudioDevice(DeviceManager *manager, const QByteArray &gstId)
|
||
DeviceManager::DeviceManager(Backend *backend)
|
||
: QObject(backend)
|
||
, m_backend(backend)
|
||
+ , m_audioDeviceCounter(0)
|
||
{
|
||
- m_audioSink = qgetenv("PHONON_GST_AUDIOSINK");
|
||
- m_videoSinkWidget = qgetenv("PHONON_GST_VIDEOMODE");
|
||
-
|
||
-#ifndef QT_NO_SETTINGS
|
||
QSettings settings(QLatin1String("Trolltech"));
|
||
settings.beginGroup(QLatin1String("Qt"));
|
||
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ m_audioSink = qgetenv("PHONON_GST_AUDIOSINK");
|
||
if (m_audioSink.isEmpty()) {
|
||
m_audioSink = settings.value(QLatin1String("audiosink"), "Auto").toByteArray().toLower();
|
||
+ if (m_audioSink == "auto" && pulse->isActive())
|
||
+ m_audioSink = "pulsesink";
|
||
}
|
||
+ if ("pulsesink" != m_audioSink)
|
||
+ pulse->disable();
|
||
|
||
+ m_videoSinkWidget = qgetenv("PHONON_GST_VIDEOMODE");
|
||
if (m_videoSinkWidget.isEmpty()) {
|
||
m_videoSinkWidget = settings.value(QLatin1String("videomode"), "Auto").toByteArray().toLower();
|
||
}
|
||
-#endif //QT_NO_SETTINGS
|
||
|
||
if (m_backend->isValid())
|
||
updateDeviceList();
|
||
@@ -246,7 +253,6 @@ GstElement *DeviceManager::createAudioSink(Category category)
|
||
return sink;
|
||
}
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
AbstractRenderer *DeviceManager::createVideoRenderer(VideoWidget *parent)
|
||
{
|
||
#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES)
|
||
@@ -269,11 +275,18 @@ AbstractRenderer *DeviceManager::createVideoRenderer(VideoWidget *parent)
|
||
#endif
|
||
return new WidgetRenderer(parent);
|
||
}
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
|
||
-/*
|
||
- * Returns a positive device id or -1 if device
|
||
- * does not exist
|
||
+/**
|
||
+ * Allocate a device id for a new audio device
|
||
+ */
|
||
+int DeviceManager::allocateDeviceId()
|
||
+{
|
||
+ return m_audioDeviceCounter++;
|
||
+}
|
||
+
|
||
+
|
||
+/**
|
||
+ * Returns a positive device id or -1 if device does not exist
|
||
*
|
||
* The gstId is typically in the format hw:1,0
|
||
*/
|
||
@@ -288,16 +301,30 @@ int DeviceManager::deviceId(const QByteArray &gstId) const
|
||
}
|
||
|
||
/**
|
||
- * Get a human-readable description from a device id
|
||
+ * Returns a gstId or "default" if device does not exist
|
||
+ *
|
||
+ * The gstId is typically in the format hw:1,0
|
||
*/
|
||
-QByteArray DeviceManager::deviceDescription(int id) const
|
||
+const QByteArray DeviceManager::gstId(int deviceId)
|
||
+{
|
||
+ if (!PulseSupport::getInstance()->isActive()) {
|
||
+ AudioDevice *ad = audioDevice(deviceId);
|
||
+ if (ad)
|
||
+ return QByteArray(ad->gstId);
|
||
+ }
|
||
+ return QByteArray("default");
|
||
+}
|
||
+
|
||
+/**
|
||
+* Get the AudioDevice for a given device id
|
||
+*/
|
||
+AudioDevice* DeviceManager::audioDevice(int id)
|
||
{
|
||
for (int i = 0 ; i < m_audioDeviceList.size() ; ++i) {
|
||
- if (m_audioDeviceList[i].id == id) {
|
||
- return m_audioDeviceList[i].description;
|
||
- }
|
||
+ if (m_audioDeviceList[i].id == id)
|
||
+ return &m_audioDeviceList[i];
|
||
}
|
||
- return QByteArray();
|
||
+ return NULL;
|
||
}
|
||
|
||
/**
|
||
@@ -311,8 +338,11 @@ void DeviceManager::updateDeviceList()
|
||
QList<QByteArray> list;
|
||
|
||
if (audioSink) {
|
||
- list = GstHelper::extractProperties(audioSink, "device");
|
||
- list.prepend("default");
|
||
+ if (!PulseSupport::getInstance()->isActive()) {
|
||
+ // If we're using pulse, the PulseSupport class takes care of things for us.
|
||
+ list = GstHelper::extractProperties(audioSink, "device");
|
||
+ list.prepend("default");
|
||
+ }
|
||
|
||
for (int i = 0 ; i < list.size() ; ++i) {
|
||
QByteArray gstId = list.at(i);
|
||
diff --git a/src/3rdparty/phonon/gstreamer/devicemanager.h b/src/3rdparty/phonon/gstreamer/devicemanager.h
|
||
index a5e8289..9c6aa8d 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/devicemanager.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/devicemanager.h
|
||
@@ -42,6 +42,7 @@ public :
|
||
int id;
|
||
QByteArray gstId;
|
||
QByteArray description;
|
||
+ QString icon;
|
||
};
|
||
|
||
class DeviceManager : public QObject {
|
||
@@ -51,8 +52,10 @@ public:
|
||
virtual ~DeviceManager();
|
||
const QList<AudioDevice> audioOutputDevices() const;
|
||
GstPad *requestPad(int device) const;
|
||
+ int allocateDeviceId();
|
||
int deviceId(const QByteArray &gstId) const;
|
||
- QByteArray deviceDescription(int id) const;
|
||
+ const QByteArray gstId(int id);
|
||
+ AudioDevice* audioDevice(int id);
|
||
GstElement *createGNOMEAudioSink(Category category);
|
||
GstElement *createAudioSink(Category category = NoCategory);
|
||
AbstractRenderer *createVideoRenderer(VideoWidget *parent);
|
||
@@ -68,6 +71,7 @@ private:
|
||
bool canOpenDevice(GstElement *element) const;
|
||
Backend *m_backend;
|
||
QList <AudioDevice> m_audioDeviceList;
|
||
+ int m_audioDeviceCounter;
|
||
QTimer m_devicePollTimer;
|
||
QByteArray m_audioSink;
|
||
QByteArray m_videoSinkWidget;
|
||
diff --git a/src/3rdparty/phonon/gstreamer/effect.cpp b/src/3rdparty/phonon/gstreamer/effect.cpp
|
||
index 4937246..f653535 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/effect.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/effect.cpp
|
||
@@ -25,8 +25,8 @@
|
||
|
||
#include <gst/gst.h>
|
||
|
||
-#ifndef QT_NO_PHONON_EFFECT
|
||
QT_BEGIN_NAMESPACE
|
||
+
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
@@ -241,6 +241,6 @@ void Effect::setParameterValue(const EffectParameter &p, const QVariant &v)
|
||
|
||
}
|
||
} //namespace Phonon::Gstreamer
|
||
+
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_EFFECT
|
||
#include "moc_effect.cpp"
|
||
diff --git a/src/3rdparty/phonon/gstreamer/effect.h b/src/3rdparty/phonon/gstreamer/effect.h
|
||
index 51cbe9c..dbbb457 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/effect.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/effect.h
|
||
@@ -28,8 +28,8 @@
|
||
|
||
#include <gst/gst.h>
|
||
|
||
-#ifndef QT_NO_PHONON_EFFECT
|
||
QT_BEGIN_NAMESPACE
|
||
+
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
@@ -58,7 +58,7 @@ namespace Gstreamer
|
||
QList<Phonon::EffectParameter> m_parameterList;
|
||
};
|
||
}} //namespace Phonon::Gstreamer
|
||
+
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_EFFECT
|
||
|
||
#endif // Phonon_GSTREAMER_EFFECT_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/gstreamer.desktop b/src/3rdparty/phonon/gstreamer/gstreamer.desktop
|
||
index b62472b..7fb4000 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/gstreamer.desktop
|
||
+++ b/src/3rdparty/phonon/gstreamer/gstreamer.desktop
|
||
@@ -10,27 +10,69 @@ Icon=phonon-gstreamer
|
||
InitialPreference=10
|
||
|
||
Name=GStreamer
|
||
+Name[bg]=GStreamer
|
||
+Name[ca]=GStreamer
|
||
+Name[cs]=GStreamer
|
||
+Name[da]=GStreamer
|
||
+Name[de]=GStreamer
|
||
+Name[el]=GStreamer
|
||
+Name[en_GB]=GStreamer
|
||
+Name[es]=GStreamer
|
||
+Name[et]=GStreamer
|
||
+Name[eu]=GStreamer
|
||
+Name[fr]=GStreamer
|
||
+Name[ga]=GStreamer
|
||
+Name[gl]=GStreamer
|
||
+Name[hsb]=GStreamer
|
||
+Name[hu]=GStreamer
|
||
+Name[is]=GStreamer
|
||
+Name[it]=GStreamer
|
||
+Name[ja]=GStreamer
|
||
+Name[ko]=GStreamer
|
||
+Name[ku]=GStreamer
|
||
+Name[lt]=GStreamer
|
||
+Name[lv]=GStreamer
|
||
+Name[nds]=GStreamer
|
||
+Name[nl]=GStreamer
|
||
+Name[nn]=GStreamer
|
||
Name[pa]=ਜੀਸਟੀਰਮਰ
|
||
+Name[pl]=GStreamer
|
||
+Name[pt]=GStreamer
|
||
+Name[pt_BR]=GStreamer
|
||
+Name[se]=GStreamer
|
||
+Name[sk]=GStreamer
|
||
+Name[sl]=GStreamer
|
||
Name[sr]=Гстример
|
||
+Name[sr@latin]=GStreamer
|
||
Name[sv]=Gstreamer
|
||
+Name[tr]=GStreamer
|
||
+Name[uk]=GStreamer
|
||
Name[x-test]=xxGStreamerxx
|
||
+Name[zh_CN]=GStreamer
|
||
+Name[zh_TW]=GStreamer
|
||
|
||
Comment=Phonon GStreamer backend
|
||
Comment[bg]=Phonon GStreamer
|
||
Comment[ca]=Dorsal GStreamer del Phonon
|
||
+Comment[cs]=Phonon GStreamer backend
|
||
Comment[da]=GStreamer-backend til Phonon
|
||
Comment[de]=Phonon-Treiber für GStreamer
|
||
Comment[el]=Σύστημα υποστήριξης GStreamer του Phonon
|
||
+Comment[en_GB]=Phonon GStreamer backend
|
||
Comment[es]=Motor GStreamer para Phonon
|
||
Comment[et]=Phononi GStreameri taustaprogramm
|
||
+Comment[eu]=Phonon GStreamer backend
|
||
Comment[fr]=Système de gestion GStreamer pour Phonon
|
||
Comment[ga]=Inneall GStreamer le haghaidh Phonon
|
||
Comment[gl]=Infraestrutura de GStreamer para Phonon
|
||
+Comment[hsb]=Phonon GStreamer backend
|
||
+Comment[hu]=Phonon GStreamer modul
|
||
Comment[is]=Phonon GStreamer bakendi
|
||
Comment[it]=Motore Gstreamer di Phonon
|
||
Comment[ja]=Phonon GStreamer バックエンド
|
||
Comment[ko]=Phonon GStreamer 백엔드
|
||
Comment[ku]=Binesaza Phonon GStreamer
|
||
+Comment[lt]=Phonon GStreamer galinė sąsaja
|
||
Comment[lv]=Phonon GStreamer aizmugure
|
||
Comment[nds]=Phonon-Hülpprogramm GStreamer
|
||
Comment[nl]=GStreamer-backend (Phonon)
|
||
@@ -39,6 +81,7 @@ Comment[pa]=ਫੋਨੋਨ ਜਸਟੀਰਮਰ ਬੈਕਐਂਡ
|
||
Comment[pl]=Obsługa GStreamera przez Phonon
|
||
Comment[pt]=Infra-estrutura do GStreamer para o Phonon
|
||
Comment[pt_BR]=Infraestrutura Phonon GStreamer
|
||
+Comment[se]=Phonon GStreamer duogášmohtor
|
||
Comment[sk]=GStreamer podsystém
|
||
Comment[sl]=Phononova hrbtenica GStreamer
|
||
Comment[sr]=Гстример као позадина Фонона
|
||
diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.cpp b/src/3rdparty/phonon/gstreamer/mediaobject.cpp
|
||
index 5713263..10aa8fd 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/mediaobject.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/mediaobject.cpp
|
||
@@ -16,6 +16,7 @@
|
||
*/
|
||
#include <cmath>
|
||
#include <gst/interfaces/propertyprobe.h>
|
||
+#include <gst/pbutils/install-plugins.h>
|
||
#include "common.h"
|
||
#include "mediaobject.h"
|
||
#include "videowidget.h"
|
||
@@ -53,6 +54,7 @@ MediaObject::MediaObject(Backend *backend, QObject *parent)
|
||
, m_tickTimer(new QTimer(this))
|
||
, m_prefinishMark(0)
|
||
, m_transitionTime(0)
|
||
+ , m_isStream(false)
|
||
, m_posAtSeek(-1)
|
||
, m_prefinishMarkReachedNotEmitted(true)
|
||
, m_aboutToFinishEmitted(false)
|
||
@@ -79,6 +81,7 @@ MediaObject::MediaObject(Backend *backend, QObject *parent)
|
||
, m_autoplayTitles(true)
|
||
, m_availableTitles(0)
|
||
, m_currentTitle(1)
|
||
+ , m_pendingTitle(1)
|
||
{
|
||
qRegisterMetaType<GstCaps*>("GstCaps*");
|
||
qRegisterMetaType<State>("State");
|
||
@@ -87,7 +90,7 @@ MediaObject::MediaObject(Backend *backend, QObject *parent)
|
||
m_name = "MediaObject" + QString::number(count++);
|
||
|
||
if (!m_backend->isValid()) {
|
||
- setError(tr("Cannot start playback. \n\nCheck your GStreamer installation and make sure you "
|
||
+ setError(tr("Cannot start playback. \n\nCheck your Gstreamer installation and make sure you "
|
||
"\nhave libgstreamer-plugins-base installed."), Phonon::FatalError);
|
||
} else {
|
||
m_root = this;
|
||
@@ -95,7 +98,7 @@ MediaObject::MediaObject(Backend *backend, QObject *parent)
|
||
m_backend->addBusWatcher(this);
|
||
connect(m_tickTimer, SIGNAL(timeout()), SLOT(emitTick()));
|
||
}
|
||
- connect(this, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
|
||
+ connect(this, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
|
||
this, SLOT(notifyStateChange(Phonon::State, Phonon::State)));
|
||
|
||
}
|
||
@@ -136,6 +139,14 @@ QString stateString(const Phonon::State &state)
|
||
return QString();
|
||
}
|
||
|
||
+void
|
||
+pluginInstallationDone( GstInstallPluginsReturn res, gpointer userData )
|
||
+{
|
||
+ // Nothing inside yet
|
||
+ Q_UNUSED(res);
|
||
+ Q_UNUSED(userData);
|
||
+}
|
||
+
|
||
void MediaObject::saveState()
|
||
{
|
||
//Only first resumeState is respected
|
||
@@ -195,13 +206,35 @@ void MediaObject::noMorePadsAvailable ()
|
||
if (m_missingCodecs.size() > 0) {
|
||
bool canPlay = (m_hasAudio || m_videoStreamFound);
|
||
Phonon::ErrorType error = canPlay ? Phonon::NormalError : Phonon::FatalError;
|
||
+#ifdef PLUGIN_INSTALL_API
|
||
+ GstInstallPluginsContext *ctx = gst_install_plugins_context_new ();
|
||
+ gchar *details[2];
|
||
+ details[0] = m_missingCodecs[0].toLocal8Bit().data();
|
||
+ details[1] = NULL;
|
||
+ GstInstallPluginsReturn status;
|
||
+
|
||
+ status = gst_install_plugins_async( details, ctx, pluginInstallationDone, NULL );
|
||
+ gst_install_plugins_context_free ( ctx );
|
||
+
|
||
+ if ( status != GST_INSTALL_PLUGINS_STARTED_OK )
|
||
+ {
|
||
+ if( status == GST_INSTALL_PLUGINS_HELPER_MISSING )
|
||
+ setError(QString(tr("Missing codec helper script assistant.")), Phonon::FatalError );
|
||
+ else
|
||
+ setError(QString(tr("Plugin codec installation failed for codec: %0"))
|
||
+ .arg(m_missingCodecs[0].split("|")[3]), error);
|
||
+ }
|
||
+ m_missingCodecs.clear();
|
||
+#else
|
||
+ QString codecs = m_missingCodecs.join(", ");
|
||
+
|
||
if (error == Phonon::NormalError && m_hasVideo && !m_videoStreamFound) {
|
||
m_hasVideo = false;
|
||
emit hasVideoChanged(false);
|
||
}
|
||
- QString codecs = m_missingCodecs.join(", ");
|
||
setError(QString(tr("A required codec is missing. You need to install the following codec(s) to play this content: %0")).arg(codecs), error);
|
||
m_missingCodecs.clear();
|
||
+#endif
|
||
}
|
||
}
|
||
|
||
@@ -226,7 +259,6 @@ void MediaObject::cb_unknown_type (GstElement *decodebin, GstPad *pad, GstCaps *
|
||
QString value = "unknown codec";
|
||
|
||
// These functions require GStreamer > 0.10.12
|
||
-#ifndef QT_NO_LIBRARY
|
||
static Ptr_gst_pb_utils_init p_gst_pb_utils_init = 0;
|
||
static Ptr_gst_pb_utils_get_codec_description p_gst_pb_utils_get_codec_description = 0;
|
||
if (!p_gst_pb_utils_init) {
|
||
@@ -240,15 +272,21 @@ void MediaObject::cb_unknown_type (GstElement *decodebin, GstPad *pad, GstCaps *
|
||
codecName = p_gst_pb_utils_get_codec_description (caps);
|
||
value = QString::fromUtf8(codecName);
|
||
g_free (codecName);
|
||
- } else
|
||
-#endif //QT_NO_LIBRARY
|
||
- {
|
||
+ } else {
|
||
// For GStreamer versions < 0.10.12
|
||
GstStructure *str = gst_caps_get_structure (caps, 0);
|
||
value = QString::fromUtf8(gst_structure_get_name (str));
|
||
-
|
||
}
|
||
- media->addMissingCodecName(value);
|
||
+
|
||
+#ifdef PLUGIN_INSTALL_API
|
||
+ QString plugins = QString("gstreamer|0.10|%0|%1|decoder-%2")
|
||
+ .arg( qApp->applicationName() )
|
||
+ .arg( value )
|
||
+ .arg( QString::fromUtf8(gst_caps_to_string (caps) ) );
|
||
+ media->addMissingCodecName( plugins );
|
||
+#else
|
||
+ media->addMissingCodecName( value );
|
||
+#endif
|
||
}
|
||
|
||
static void notifyVideoCaps(GObject *obj, GParamSpec *, gpointer data)
|
||
@@ -309,7 +347,7 @@ void MediaObject::connectVideo(GstPad *pad)
|
||
m_backend->logMessage("Video track connected", Backend::Info, this);
|
||
// Note that the notify::caps _must_ be installed after linking to work with Dapper
|
||
m_capsHandler = g_signal_connect(pad, "notify::caps", G_CALLBACK(notifyVideoCaps), this);
|
||
-
|
||
+
|
||
if (!m_loading && !m_hasVideo) {
|
||
m_hasVideo = m_videoStreamFound;
|
||
emit hasVideoChanged(m_hasVideo);
|
||
@@ -344,7 +382,7 @@ void MediaObject::cb_pad_added(GstElement *decodebin,
|
||
Q_UNUSED(decodebin);
|
||
GstPad *decodepad = static_cast<GstPad*>(data);
|
||
gst_pad_link (pad, decodepad);
|
||
- gst_object_unref (decodepad);
|
||
+ //gst_object_unref (decodepad);
|
||
}
|
||
|
||
/**
|
||
@@ -368,15 +406,38 @@ bool MediaObject::createPipefromURL(const QUrl &url)
|
||
}
|
||
|
||
// Create a new datasource based on the input URL
|
||
- QByteArray encoded_cstr_url = url.toEncoded();
|
||
+ // add the 'file' scheme if it's missing; the double '/' is needed!
|
||
+ QByteArray encoded_cstr_url = (url.scheme() == QLatin1String("") ?
|
||
+ "file://" + url.toEncoded() :
|
||
+ url.toEncoded());
|
||
m_datasource = gst_element_make_from_uri(GST_URI_SRC, encoded_cstr_url.constData(), (const char*)NULL);
|
||
if (!m_datasource)
|
||
return false;
|
||
|
||
// Set the device for MediaSource::Disc
|
||
- QByteArray mediaDevice = QFile::encodeName(m_source.deviceName());
|
||
- if (!mediaDevice.isEmpty())
|
||
- g_object_set (m_datasource, "device", mediaDevice.constData(), (const char*)NULL);
|
||
+ if (m_source.type() == MediaSource::Disc) {
|
||
+
|
||
+ if (g_object_class_find_property (G_OBJECT_GET_CLASS (m_datasource), "device")) {
|
||
+ QByteArray mediaDevice = QFile::encodeName(m_source.deviceName());
|
||
+ if (!mediaDevice.isEmpty())
|
||
+ g_object_set (G_OBJECT (m_datasource), "device", mediaDevice.constData(), (const char*)NULL);
|
||
+ }
|
||
+
|
||
+ // Also Set optical disc speed to 2X for Audio CD
|
||
+ if (m_source.discType() == Phonon::Cd
|
||
+ && (g_object_class_find_property (G_OBJECT_GET_CLASS (m_datasource), "read-speed"))) {
|
||
+ g_object_set (G_OBJECT (m_datasource), "read-speed", 2, (const char*)NULL);
|
||
+ m_backend->logMessage(QString("new device speed : 2X"), Backend::Info, this);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ /* make HTTP sources send extra headers so we get icecast
|
||
+ * metadata in case the stream is an icecast stream */
|
||
+ if (encoded_cstr_url.startsWith("http://")
|
||
+ && g_object_class_find_property (G_OBJECT_GET_CLASS (m_datasource), "iradio-mode")) {
|
||
+ g_object_set (m_datasource, "iradio-mode", TRUE, NULL);
|
||
+ m_isStream = true;
|
||
+ }
|
||
|
||
// Link data source into pipeline
|
||
gst_bin_add(GST_BIN(m_pipeline), m_datasource);
|
||
@@ -396,7 +457,6 @@ bool MediaObject::createPipefromURL(const QUrl &url)
|
||
*/
|
||
bool MediaObject::createPipefromStream(const MediaSource &source)
|
||
{
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
// Remove any existing data source
|
||
if (m_datasource) {
|
||
gst_bin_remove(GST_BIN(m_pipeline), m_datasource);
|
||
@@ -418,10 +478,6 @@ bool MediaObject::createPipefromStream(const MediaSource &source)
|
||
return false;
|
||
}
|
||
return true;
|
||
-#else //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
- Q_UNUSED(source);
|
||
- return false;
|
||
-#endif
|
||
}
|
||
|
||
void MediaObject::createPipeline()
|
||
@@ -664,7 +720,7 @@ void MediaObject::changeState(State newstate)
|
||
return;
|
||
|
||
Phonon::State oldState = m_state;
|
||
- m_state = newstate; // m_state must be set before emitting, since
|
||
+ m_state = newstate; // m_state must be set before emitting, since
|
||
// Error state requires that state() will return the new value
|
||
m_pendingState = newstate;
|
||
emit stateChanged(newstate, oldState);
|
||
@@ -849,7 +905,7 @@ void MediaObject::setSource(const MediaSource &source)
|
||
// such as failing duration queries etc
|
||
GstState state;
|
||
gst_element_set_state(m_pipeline, GST_STATE_NULL);
|
||
- gst_element_get_state (m_pipeline, &state, NULL, 2000);
|
||
+ gst_element_get_state(m_pipeline, &state, NULL, 2000);
|
||
|
||
m_source = source;
|
||
emit currentSourceChanged(m_source);
|
||
@@ -873,7 +929,7 @@ void MediaObject::setSource(const MediaSource &source)
|
||
m_aboutToFinishEmitted = false;
|
||
m_error = NoError;
|
||
m_errorString = QString();
|
||
-
|
||
+
|
||
m_bufferPercent = 0;
|
||
m_prefinishMarkReachedNotEmitted = true;
|
||
m_aboutToFinishEmitted = false;
|
||
@@ -882,11 +938,16 @@ void MediaObject::setSource(const MediaSource &source)
|
||
setTotalTime(-1);
|
||
m_atEndOfStream = false;
|
||
|
||
- // Clear exising meta tags
|
||
+ m_availableTitles = 0;
|
||
+ m_pendingTitle = 1;
|
||
+ m_currentTitle = 1;
|
||
+
|
||
+ // Clear existing meta tags
|
||
m_metaData.clear();
|
||
+ m_isStream = false;
|
||
|
||
switch (source.type()) {
|
||
- case MediaSource::Url: {
|
||
+ case MediaSource::Url: {
|
||
if (createPipefromURL(source.url()))
|
||
m_loading = true;
|
||
else
|
||
@@ -916,23 +977,27 @@ void MediaObject::setSource(const MediaSource &source)
|
||
setError(tr("Could not open media source."));
|
||
break;
|
||
|
||
- case MediaSource::Disc: // CD tracks can be specified by setting the url in the following way uri=cdda:4
|
||
+ case MediaSource::Disc:
|
||
{
|
||
- QUrl url;
|
||
- switch (source.discType()) {
|
||
- case Phonon::Cd:
|
||
- url = QUrl(QLatin1String("cdda://"));
|
||
- break;
|
||
- case Phonon::Dvd:
|
||
- url = QUrl(QLatin1String("dvd://"));
|
||
- break;
|
||
- case Phonon::Vcd:
|
||
- url = QUrl(QLatin1String("vcd://"));
|
||
- break;
|
||
- default:
|
||
- break;
|
||
+ QString mediaUrl;
|
||
+ switch (source.discType()) {
|
||
+ case Phonon::NoDisc:
|
||
+ qWarning() << "I should never get to see a MediaSource that is a disc but doesn't specify which one";
|
||
+ return;
|
||
+ case Phonon::Cd: // CD tracks can be specified by setting the url in the following way uri=cdda:4
|
||
+ mediaUrl = QLatin1String("cdda://");
|
||
+ break;
|
||
+ case Phonon::Dvd:
|
||
+ mediaUrl = QLatin1String("dvd://");
|
||
+ break;
|
||
+ case Phonon::Vcd:
|
||
+ mediaUrl = QLatin1String("vcd://");
|
||
+ break;
|
||
+ default:
|
||
+ qWarning() << "media " << source.discType() << " not implemented";
|
||
+ return;
|
||
}
|
||
- if (!url.isEmpty() && createPipefromURL(url))
|
||
+ if (!mediaUrl.isEmpty() && createPipefromURL(QUrl(mediaUrl)))
|
||
m_loading = true;
|
||
else
|
||
setError(tr("Could not open media source."));
|
||
@@ -988,13 +1053,10 @@ void MediaObject::getStreamInfo()
|
||
emit hasVideoChanged(m_hasVideo);
|
||
}
|
||
|
||
- m_availableTitles = 1;
|
||
- gint64 titleCount;
|
||
- GstFormat format = gst_format_get_by_nick("track");
|
||
- if (gst_element_query_duration (m_pipeline, &format, &titleCount)) {
|
||
- //check if returned format is still "track",
|
||
- //gstreamer sometimes returns the total time, if tracks information is not available.
|
||
- if (qstrcmp(gst_format_get_name(format), "track") == 0) {
|
||
+ if (m_source.discType() == Phonon::Cd) {
|
||
+ gint64 titleCount;
|
||
+ GstFormat format = gst_format_get_by_nick("track");
|
||
+ if (gst_element_query_duration (m_pipeline, &format, &titleCount)) {
|
||
int oldAvailableTitles = m_availableTitles;
|
||
m_availableTitles = (int)titleCount;
|
||
if (m_availableTitles != oldAvailableTitles) {
|
||
@@ -1061,7 +1123,7 @@ void MediaObject::seek(qint64 time)
|
||
}
|
||
|
||
quint64 current = currentTime();
|
||
- quint64 total = totalTime();
|
||
+ quint64 total = totalTime();
|
||
|
||
if (current < total - m_prefinishMark)
|
||
m_prefinishMarkReachedNotEmitted = true;
|
||
@@ -1082,7 +1144,7 @@ void MediaObject::emitTick()
|
||
|
||
if (m_tickInterval > 0 && currentTime != m_previousTickTime) {
|
||
emit tick(currentTime);
|
||
- m_previousTickTime = currentTime;
|
||
+ m_previousTickTime = currentTime;
|
||
}
|
||
if (m_state == Phonon::PlayingState) {
|
||
if (currentTime >= totalTime - m_prefinishMark) {
|
||
@@ -1093,7 +1155,12 @@ void MediaObject::emitTick()
|
||
}
|
||
// Prepare load of next source
|
||
if (currentTime >= totalTime - ABOUT_TO_FINNISH_TIME) {
|
||
- if (!m_aboutToFinishEmitted) {
|
||
+ if (m_source.type() == MediaSource::Disc &&
|
||
+ m_autoplayTitles &&
|
||
+ m_availableTitles > 1 &&
|
||
+ m_currentTitle < m_availableTitles) {
|
||
+ m_aboutToFinishEmitted = false;
|
||
+ } else if (!m_aboutToFinishEmitted) {
|
||
m_aboutToFinishEmitted = true; // track is about to finish
|
||
emit aboutToFinish();
|
||
}
|
||
@@ -1197,7 +1264,7 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
|
||
switch (GST_MESSAGE_TYPE (gstMessage)) {
|
||
|
||
- case GST_MESSAGE_EOS:
|
||
+ case GST_MESSAGE_EOS:
|
||
m_backend->logMessage("EOS recieved", Backend::Info, this);
|
||
handleEndOfStream();
|
||
break;
|
||
@@ -1206,14 +1273,98 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
GstTagList* tag_list = 0;
|
||
gst_message_parse_tag(gstMessage, &tag_list);
|
||
if (tag_list) {
|
||
+ TagMap newTags;
|
||
+ gst_tag_list_foreach (tag_list, &foreach_tag_function, &newTags);
|
||
+ gst_tag_list_free(tag_list);
|
||
+
|
||
+ // Determine if we should no fake the album/artist tags.
|
||
+ // This is a little confusing as we want to fake it on initial
|
||
+ // connection where title, album and artist are all missing.
|
||
+ // There are however times when we get just other information,
|
||
+ // e.g. codec, and so we want to only do clever stuff if we
|
||
+ // have a commonly available tag (ORGANIZATION) or we have a
|
||
+ // change in title
|
||
+ bool fake_it =
|
||
+ (m_isStream
|
||
+ && ((!newTags.contains("TITLE")
|
||
+ && newTags.contains("ORGANIZATION"))
|
||
+ || (newTags.contains("TITLE")
|
||
+ && m_metaData.value("TITLE") != newTags.value("TITLE")))
|
||
+ && !newTags.contains("ALBUM")
|
||
+ && !newTags.contains("ARTIST"));
|
||
+
|
||
TagMap oldMap = m_metaData; // Keep a copy of the old one for reference
|
||
- // Append any new meta tags to the existing tag list
|
||
- gst_tag_list_foreach (tag_list, &foreach_tag_function, &m_metaData);
|
||
+
|
||
+ // Now we've checked the new data, append any new meta tags to the existing tag list
|
||
+ // We cannot use TagMap::iterator as this is a multimap and when streaming data
|
||
+ // could in theory be lost.
|
||
+ QList<QString> keys = newTags.keys();
|
||
+ for (QList<QString>::iterator i = keys.begin(); i != keys.end(); ++i) {
|
||
+ QString key = *i;
|
||
+ if (m_isStream) {
|
||
+ // If we're streaming, we need to remove data in m_metaData
|
||
+ // in order to stop it filling up indefinitely (as it's a multimap)
|
||
+ m_metaData.remove(key);
|
||
+ }
|
||
+ QList<QString> values = newTags.values(key);
|
||
+ for (QList<QString>::iterator j = values.begin(); j != values.end(); ++j) {
|
||
+ QString value = *j;
|
||
+ QString currVal = m_metaData.value(key);
|
||
+ if (!m_metaData.contains(key) || currVal != value) {
|
||
+ m_metaData.insert(key, value);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
m_backend->logMessage("Meta tags found", Backend::Info, this);
|
||
- if (oldMap != m_metaData && !m_loading)
|
||
- emit metaDataChanged(m_metaData);
|
||
- gst_tag_list_free(tag_list);
|
||
- }
|
||
+ if (oldMap != m_metaData) {
|
||
+ // This is a bit of a hack to ensure that stream metadata is
|
||
+ // returned. We get as much as we can from the Shoutcast server's
|
||
+ // StreamTitle= header. If further info is decoded from the stream
|
||
+ // itself later, then it will overwrite this info.
|
||
+ if (m_isStream && fake_it) {
|
||
+ m_metaData.remove("ALBUM");
|
||
+ m_metaData.remove("ARTIST");
|
||
+
|
||
+ // Detect whether we want to "fill in the blanks"
|
||
+ QString str;
|
||
+ if (m_metaData.contains("TITLE"))
|
||
+ {
|
||
+ str = m_metaData.value("TITLE");
|
||
+ int splitpoint;
|
||
+ // Check to see if our title matches "%s - %s"
|
||
+ // Where neither %s are empty...
|
||
+ if ((splitpoint = str.indexOf(" - ")) > 0
|
||
+ && str.size() > (splitpoint+3)) {
|
||
+ m_metaData.insert("ARTIST", str.left(splitpoint));
|
||
+ m_metaData.replace("TITLE", str.mid(splitpoint+3));
|
||
+ }
|
||
+ } else {
|
||
+ str = m_metaData.value("GENRE");
|
||
+ if (!str.isEmpty())
|
||
+ m_metaData.insert("TITLE", str);
|
||
+ else
|
||
+ m_metaData.insert("TITLE", "Streaming Data");
|
||
+ }
|
||
+ if (!m_metaData.contains("ARTIST")) {
|
||
+ str = m_metaData.value("LOCATION");
|
||
+ if (!str.isEmpty())
|
||
+ m_metaData.insert("ARTIST", str);
|
||
+ else
|
||
+ m_metaData.insert("ARTIST", "Streaming Data");
|
||
+ }
|
||
+ str = m_metaData.value("ORGANIZATION");
|
||
+ if (!str.isEmpty())
|
||
+ m_metaData.insert("ALBUM", str);
|
||
+ else
|
||
+ m_metaData.insert("ALBUM", "Streaming Data");
|
||
+ }
|
||
+ // As we manipulate the title, we need to recompare
|
||
+ // oldMap and m_metaData here...
|
||
+ if (oldMap != m_metaData && !m_loading)
|
||
+ emit metaDataChanged(m_metaData);
|
||
+ }
|
||
+ }
|
||
}
|
||
break;
|
||
|
||
@@ -1239,6 +1390,9 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
m_backend->logMessage("gstreamer: pipeline state set to playing", Backend::Info, this);
|
||
m_tickTimer->start();
|
||
changeState(Phonon::PlayingState);
|
||
+ if ((m_source.type() == MediaSource::Disc) && (m_currentTitle != m_pendingTitle)) {
|
||
+ setTrack(m_pendingTitle);
|
||
+ }
|
||
if (m_resumeState && m_oldState == Phonon::PlayingState) {
|
||
seek(m_oldPos);
|
||
m_resumeState = false;
|
||
@@ -1274,6 +1428,9 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
changeState(Phonon::StoppedState);
|
||
m_backend->logMessage("gstreamer: pipeline state set to ready", Backend::Debug, this);
|
||
m_tickTimer->stop();
|
||
+ if ((m_source.type() == MediaSource::Disc) && (m_currentTitle != m_pendingTitle)) {
|
||
+ setTrack(m_pendingTitle);
|
||
+ }
|
||
break;
|
||
|
||
case GST_STATE_VOID_PENDING :
|
||
@@ -1312,7 +1469,7 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
setError(err->message, Phonon::FatalError);
|
||
gst_caps_unref (caps);
|
||
gst_object_unref (sinkPad);
|
||
- }
|
||
+ }
|
||
} else {
|
||
setError(QString(err->message), Phonon::FatalError);
|
||
}
|
||
@@ -1384,8 +1541,8 @@ void MediaObject::handleBusMessage(const Message &message)
|
||
//case GST_MESSAGE_STEP_DONE:
|
||
//case GST_MESSAGE_LATENCY: only from 0.10.12
|
||
//case GST_MESSAGE_ASYNC_DONE: only from 0.10.13
|
||
- default:
|
||
- break;
|
||
+ default:
|
||
+ break;
|
||
}
|
||
}
|
||
|
||
@@ -1401,7 +1558,8 @@ void MediaObject::handleEndOfStream()
|
||
if (!m_seekable)
|
||
m_atEndOfStream = true;
|
||
|
||
- if (m_autoplayTitles &&
|
||
+ if (m_source.type() == MediaSource::Disc &&
|
||
+ m_autoplayTitles &&
|
||
m_availableTitles > 1 &&
|
||
m_currentTitle < m_availableTitles) {
|
||
_iface_setCurrentTitle(m_currentTitle + 1);
|
||
@@ -1486,15 +1644,30 @@ int MediaObject::_iface_currentTitle() const
|
||
|
||
void MediaObject::_iface_setCurrentTitle(int title)
|
||
{
|
||
- GstFormat trackFormat = gst_format_get_by_nick("track");
|
||
m_backend->logMessage(QString("setCurrentTitle %0").arg(title), Backend::Info, this);
|
||
- if ((title == m_currentTitle) || (title < 1) || (title > m_availableTitles))
|
||
+ if ((title == m_currentTitle) || (title == m_pendingTitle))
|
||
+ return;
|
||
+
|
||
+ m_pendingTitle = title;
|
||
+
|
||
+ if (m_state == Phonon::PlayingState || m_state == Phonon::StoppedState) {
|
||
+ setTrack(m_pendingTitle);
|
||
+ } else {
|
||
+ setState(Phonon::StoppedState);
|
||
+ }
|
||
+}
|
||
+
|
||
+void MediaObject::setTrack(int title)
|
||
+{
|
||
+ if (((m_state != Phonon::PlayingState) && (m_state != Phonon::StoppedState)) || (title < 1) || (title > m_availableTitles))
|
||
return;
|
||
|
||
- m_currentTitle = title;
|
||
|
||
//let's seek to the beginning of the song
|
||
- if (gst_element_seek_simple(m_pipeline, trackFormat, GST_SEEK_FLAG_FLUSH, m_currentTitle - 1)) {
|
||
+ GstFormat trackFormat = gst_format_get_by_nick("track");
|
||
+ m_backend->logMessage(QString("setTrack %0").arg(title), Backend::Info, this);
|
||
+ if (gst_element_seek_simple(m_pipeline, trackFormat, GST_SEEK_FLAG_FLUSH, title - 1)) {
|
||
+ m_currentTitle = title;
|
||
updateTotalTime();
|
||
m_atEndOfStream = false;
|
||
emit titleChanged(title);
|
||
diff --git a/src/3rdparty/phonon/gstreamer/mediaobject.h b/src/3rdparty/phonon/gstreamer/mediaobject.h
|
||
index 64b3510..2db596d 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/mediaobject.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/mediaobject.h
|
||
@@ -55,6 +55,7 @@ class MediaObject : public QObject, public MediaObjectInterface
|
||
, public MediaNode
|
||
{
|
||
friend class Stream;
|
||
+ friend class AudioDataOutput;
|
||
Q_OBJECT
|
||
Q_INTERFACES(Phonon::MediaObjectInterface
|
||
#ifndef QT_NO_PHONON_MEDIACONTROLLER
|
||
@@ -236,6 +237,7 @@ private:
|
||
int _iface_availableTitles() const;
|
||
int _iface_currentTitle() const;
|
||
void _iface_setCurrentTitle(int title);
|
||
+ void setTrack(int title);
|
||
|
||
bool m_resumeState;
|
||
State m_oldState;
|
||
@@ -250,6 +252,7 @@ private:
|
||
MediaSource m_nextSource;
|
||
qint32 m_prefinishMark;
|
||
qint32 m_transitionTime;
|
||
+ bool m_isStream;
|
||
|
||
qint64 m_posAtSeek;
|
||
|
||
@@ -285,6 +288,7 @@ private:
|
||
bool m_autoplayTitles;
|
||
int m_availableTitles;
|
||
int m_currentTitle;
|
||
+ int m_pendingTitle;
|
||
};
|
||
}
|
||
} //namespace Phonon::Gstreamer
|
||
diff --git a/src/3rdparty/phonon/gstreamer/phononsrc.cpp b/src/3rdparty/phonon/gstreamer/phononsrc.cpp
|
||
index 97d7220..f893fb5 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/phononsrc.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/phononsrc.cpp
|
||
@@ -109,25 +109,18 @@ static void phonon_src_class_init (PhononSrcClass * klass)
|
||
static void phonon_src_init (PhononSrc * src, PhononSrcClass * g_class)
|
||
{
|
||
Q_UNUSED(g_class);
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
src->device = 0;
|
||
-#else
|
||
- Q_UNUSED(src);
|
||
-#endif
|
||
}
|
||
|
||
static void phonon_src_finalize (GObject * object)
|
||
{
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
PhononSrc *src;
|
||
src = GST_PHONON_SRC (object);
|
||
delete src->device;
|
||
src->device = 0;
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||
}
|
||
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
static gboolean phonon_src_set_device(PhononSrc * src, StreamReader* device)
|
||
{
|
||
GstState state;
|
||
@@ -152,7 +145,6 @@ wrong_state:
|
||
return FALSE;
|
||
}
|
||
}
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
|
||
static void phonon_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
|
||
{
|
||
@@ -161,7 +153,6 @@ static void phonon_src_set_property (GObject * object, guint prop_id, const GVal
|
||
src = GST_PHONON_SRC (object);
|
||
|
||
switch (prop_id) {
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
case ARG_PHONONSRC:
|
||
{
|
||
StreamReader *dev = (StreamReader*)(g_value_get_pointer(value));
|
||
@@ -169,9 +160,6 @@ static void phonon_src_set_property (GObject * object, guint prop_id, const GVal
|
||
phonon_src_set_device(src, dev);
|
||
break;
|
||
}
|
||
-#else
|
||
- Q_UNUSED(value);
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
default:
|
||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||
break;
|
||
@@ -186,13 +174,9 @@ static void phonon_src_get_property (GObject * object, guint prop_id, GValue * v
|
||
src = GST_PHONON_SRC (object);
|
||
|
||
switch (prop_id) {
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
case ARG_PHONONSRC:
|
||
g_value_set_pointer(value, src->device);
|
||
break;
|
||
-#else //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
- Q_UNUSED(value);
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
default:
|
||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||
break;
|
||
@@ -201,7 +185,6 @@ static void phonon_src_get_property (GObject * object, guint prop_id, GValue * v
|
||
|
||
static GstFlowReturn phonon_src_create_read (PhononSrc * src, guint64 offset, guint length, GstBuffer ** buffer)
|
||
{
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
Q_ASSERT(src->device);
|
||
if (!src->device)
|
||
return GST_FLOW_ERROR;
|
||
@@ -221,13 +204,6 @@ static GstFlowReturn phonon_src_create_read (PhononSrc * src, guint64 offset, gu
|
||
|
||
gst_mini_object_unref(GST_MINI_OBJECT(buf));
|
||
return GST_FLOW_ERROR;
|
||
-#else //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
- Q_UNUSED(src);
|
||
- Q_UNUSED(offset);
|
||
- Q_UNUSED(length);
|
||
- Q_UNUSED(buffer);
|
||
- return GST_FLOW_ERROR;
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
}
|
||
|
||
static GstFlowReturn phonon_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer)
|
||
@@ -242,23 +218,19 @@ static GstFlowReturn phonon_src_create (GstBaseSrc * basesrc, guint64 offset, gu
|
||
static gboolean phonon_src_is_seekable (GstBaseSrc * basesrc)
|
||
{
|
||
PhononSrc *src = GST_PHONON_SRC (basesrc);
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
if (src->device)
|
||
return src->device->streamSeekable();
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
return false;
|
||
}
|
||
|
||
static gboolean phonon_src_get_size (GstBaseSrc * basesrc, guint64 * size)
|
||
{
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
PhononSrc *src;
|
||
src = GST_PHONON_SRC (basesrc);
|
||
if (src->device && src->device->streamSeekable()) {
|
||
*size = src->device->streamSize();
|
||
return TRUE;
|
||
}
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
*size = 0;
|
||
return FALSE;
|
||
}
|
||
diff --git a/src/3rdparty/phonon/gstreamer/phononsrc.h b/src/3rdparty/phonon/gstreamer/phononsrc.h
|
||
index a50f8a2..a2cd8b3 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/phononsrc.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/phononsrc.h
|
||
@@ -49,9 +49,7 @@ typedef struct _PhononSrcClass PhononSrcClass;
|
||
// PhononSrc:
|
||
struct _PhononSrc {
|
||
GstBaseSrc element;
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
StreamReader *device;
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
};
|
||
|
||
struct _PhononSrcClass {
|
||
diff --git a/src/3rdparty/phonon/gstreamer/qwidgetvideosink.h b/src/3rdparty/phonon/gstreamer/qwidgetvideosink.h
|
||
index 73a494a..f83dba5 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/qwidgetvideosink.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/qwidgetvideosink.h
|
||
@@ -19,6 +19,7 @@
|
||
#define Phonon_GSTREAMER_VIDEOSINK_H
|
||
|
||
#include "common.h"
|
||
+#include "qwidgetvideosink.h"
|
||
|
||
#include <QtCore/QByteArray>
|
||
#include <QtCore/QEvent>
|
||
diff --git a/src/3rdparty/phonon/gstreamer/streamreader.cpp b/src/3rdparty/phonon/gstreamer/streamreader.cpp
|
||
index f8219e6..04fa6cc 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/streamreader.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/streamreader.cpp
|
||
@@ -20,7 +20,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||
#include <phonon/streaminterface.h>
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
+
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
@@ -49,6 +49,5 @@ bool StreamReader::read(quint64 pos, int length, char * buffer)
|
||
|
||
}
|
||
}
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
|
||
QT_END_NAMESPACE
|
||
diff --git a/src/3rdparty/phonon/gstreamer/streamreader.h b/src/3rdparty/phonon/gstreamer/streamreader.h
|
||
index 387370c..c2e61c8 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/streamreader.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/streamreader.h
|
||
@@ -23,8 +23,6 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
-#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
-
|
||
namespace Phonon
|
||
{
|
||
class MediaSource;
|
||
@@ -93,8 +91,6 @@ private:
|
||
}
|
||
}
|
||
|
||
-#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
-
|
||
QT_END_NAMESPACE
|
||
|
||
#endif
|
||
diff --git a/src/3rdparty/phonon/gstreamer/videowidget.cpp b/src/3rdparty/phonon/gstreamer/videowidget.cpp
|
||
index e1f0ec9..efc750a 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/videowidget.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/videowidget.cpp
|
||
@@ -33,7 +33,6 @@
|
||
#include "widgetrenderer.h"
|
||
#include "x11renderer.h"
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
namespace Phonon
|
||
@@ -384,6 +383,5 @@ void VideoWidget::mediaNodeEvent(const MediaNodeEvent *event)
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
|
||
#include "moc_videowidget.cpp"
|
||
diff --git a/src/3rdparty/phonon/gstreamer/videowidget.h b/src/3rdparty/phonon/gstreamer/videowidget.h
|
||
index dc0754d..47f4e08 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/videowidget.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/videowidget.h
|
||
@@ -25,10 +25,10 @@
|
||
#include "common.h"
|
||
#include "medianode.h"
|
||
#include "abstractrenderer.h"
|
||
+#include "videowidget.h"
|
||
|
||
#include <gst/gst.h>
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
class QString;
|
||
@@ -103,5 +103,5 @@ private:
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
+
|
||
#endif // Phonon_GSTREAMER_VIDEOWIDGET_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/volumefadereffect.cpp b/src/3rdparty/phonon/gstreamer/volumefadereffect.cpp
|
||
index bf0d646..d7ee11b 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/volumefadereffect.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/volumefadereffect.cpp
|
||
@@ -21,11 +21,11 @@
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
-#ifndef QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
{
|
||
+
|
||
VolumeFaderEffect::VolumeFaderEffect(Backend *backend, QObject *parent)
|
||
: Effect(backend, parent, AudioSource | AudioSink)
|
||
, m_fadeCurve(Phonon::VolumeFaderEffect::Fade3Decibel)
|
||
@@ -156,7 +156,7 @@ bool VolumeFaderEffect::event(QEvent *event)
|
||
}
|
||
|
||
}} //namespace Phonon::Gstreamer
|
||
-#endif //QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
+
|
||
QT_END_NAMESPACE
|
||
|
||
#include "moc_volumefadereffect.cpp"
|
||
diff --git a/src/3rdparty/phonon/gstreamer/volumefadereffect.h b/src/3rdparty/phonon/gstreamer/volumefadereffect.h
|
||
index 748d2d6..d74014c 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/volumefadereffect.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/volumefadereffect.h
|
||
@@ -30,7 +30,7 @@
|
||
#include <gst/gst.h>
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
-#ifndef QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
+
|
||
namespace Phonon
|
||
{
|
||
namespace Gstreamer
|
||
@@ -64,7 +64,7 @@ namespace Gstreamer
|
||
QTime m_fadeStartTime;
|
||
};
|
||
}} //namespace Phonon::Gstreamer
|
||
-#endif //QT_NO_PHONON_VOLUMEFADEREFFECT
|
||
+
|
||
QT_END_NAMESPACE
|
||
|
||
#endif // Phonon_GSTREAMER_VOLUMEFADEREFFECT_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
|
||
index 423af9d..d4a411f 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.cpp
|
||
@@ -32,7 +32,6 @@
|
||
# define GL_TEXTURE2 0x84C2
|
||
#endif
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
static void frameRendered()
|
||
@@ -149,4 +148,3 @@ bool WidgetRenderer::eventFilter(QEvent * event)
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
diff --git a/src/3rdparty/phonon/gstreamer/widgetrenderer.h b/src/3rdparty/phonon/gstreamer/widgetrenderer.h
|
||
index 03ee9c0..ff64fa7 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/widgetrenderer.h
|
||
+++ b/src/3rdparty/phonon/gstreamer/widgetrenderer.h
|
||
@@ -26,7 +26,6 @@
|
||
#include <QtOpenGL/QGLWidget>
|
||
#endif
|
||
|
||
-#ifndef QT_NO_PHONON_VIDEO
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
class QString;
|
||
@@ -60,5 +59,5 @@ private:
|
||
} //namespace Phonon::Gstreamer
|
||
|
||
QT_END_NAMESPACE
|
||
-#endif //QT_NO_PHONON_VIDEO
|
||
+
|
||
#endif // Phonon_GSTREAMER_WIDGETRENDERER_H
|
||
diff --git a/src/3rdparty/phonon/gstreamer/x11renderer.cpp b/src/3rdparty/phonon/gstreamer/x11renderer.cpp
|
||
index 73877a8..9977001 100644
|
||
--- a/src/3rdparty/phonon/gstreamer/x11renderer.cpp
|
||
+++ b/src/3rdparty/phonon/gstreamer/x11renderer.cpp
|
||
@@ -138,6 +138,7 @@ void X11Renderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode)
|
||
void X11Renderer::movieSizeChanged(const QSize &movieSize)
|
||
{
|
||
Q_UNUSED(movieSize);
|
||
+
|
||
if (m_renderWidget) {
|
||
m_renderWidget->setGeometry(m_videoWidget->calculateDrawFrameRect());
|
||
}
|
||
diff --git a/src/3rdparty/phonon/phonon/CMakeLists.txt b/src/3rdparty/phonon/phonon/CMakeLists.txt
|
||
index 11d7913..8ce1914 100644
|
||
--- a/src/3rdparty/phonon/phonon/CMakeLists.txt
|
||
+++ b/src/3rdparty/phonon/phonon/CMakeLists.txt
|
||
@@ -8,6 +8,22 @@ endif (PHONON_BUILD_EXAMPLES)
|
||
|
||
add_subdirectory(experimental)
|
||
|
||
+set(PULSEAUDIO_MINIMUM_VERSION "0.9.21")
|
||
+macro_optional_find_package(PulseAudio)
|
||
+macro_log_feature(PULSEAUDIO_FOUND "PulseAudio" "A cross-platform, networked sound server." "http://www.pulseaudio.org" FALSE "" "Allows audio playback via the PulseAudio soundserver when it is running")
|
||
+macro_optional_find_package(GLIB2)
|
||
+macro_log_feature(GLIB2_FOUND "GLib2" "GLib 2 is required to compile the pulseaudio for Phonon" "http://www.gtk.org/download/" FALSE)
|
||
+
|
||
+if (GLIB2_FOUND AND PULSEAUDIO_FOUND)
|
||
+ add_definitions(-DHAVE_PULSEAUDIO)
|
||
+ include_directories(${GLIB2_INCLUDE_DIR} ${PULSEAUDIO_INCLUDE_DIR})
|
||
+else(GLIB2_FOUND AND PULSEAUDIO_FOUND)
|
||
+ set(PULSEAUDIO_INCLUDE_DIR "")
|
||
+ set(PULSEAUDIO_LIBRARY "")
|
||
+ set(PULSEAUDIO_MAINLOOP_LIBRARY "")
|
||
+endif(GLIB2_FOUND AND PULSEAUDIO_FOUND)
|
||
+
|
||
+
|
||
set(phonon_LIB_SRCS
|
||
objectdescription.cpp
|
||
objectdescriptionmodel.cpp
|
||
@@ -35,9 +51,12 @@ set(phonon_LIB_SRCS
|
||
videowidget.cpp
|
||
videoplayer.cpp
|
||
seekslider.cpp
|
||
+ swiftslider.cpp
|
||
volumeslider.cpp
|
||
effectwidget.cpp
|
||
iodevicestream.cpp
|
||
+ audiodataoutput.cpp
|
||
+ pulsesupport.cpp
|
||
)
|
||
|
||
if (QT_QTDBUS_FOUND)
|
||
@@ -50,6 +69,10 @@ endif (QT_QTDBUS_FOUND)
|
||
add_definitions(-DPHONON_LIBRARY_PATH="${PLUGIN_INSTALL_DIR}/plugins")
|
||
automoc4_add_library(phonon SHARED ${phonon_LIB_SRCS})
|
||
target_link_libraries(phonon ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
|
||
+if (GLIB2_FOUND AND PULSEAUDIO_FOUND)
|
||
+target_link_libraries(phonon ${GLIB2_LIBRARIES} ${GOBJECT_LIBRARIES} ${PULSEAUDIO_LIBRARY} ${PULSEAUDIO_MAINLOOP_LIBRARY})
|
||
+endif (GLIB2_FOUND AND PULSEAUDIO_FOUND)
|
||
+
|
||
if (QT_QTDBUS_FOUND)
|
||
target_link_libraries(phonon ${QT_QTDBUS_LIBRARY})
|
||
endif (QT_QTDBUS_FOUND)
|
||
@@ -99,6 +122,10 @@ install(FILES
|
||
volumeslider.h
|
||
effectwidget.h
|
||
platformplugin.h
|
||
+ audiodataoutput.h
|
||
+ audiodataoutputinterface.h
|
||
+ globalconfig.h
|
||
+ pulsesupport_p.h
|
||
DESTINATION ${INCLUDE_INSTALL_DIR}/phonon COMPONENT Devel)
|
||
|
||
install(FILES org.kde.Phonon.AudioOutput.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR})
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractaudiooutput.cpp b/src/3rdparty/phonon/phonon/abstractaudiooutput.cpp
|
||
index 47c5a89..bce7c11 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractaudiooutput.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/abstractaudiooutput.cpp
|
||
@@ -6,7 +6,7 @@ Copyright (C) 2005-2006 Matthias Kretz <kretz@kde.org>
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractaudiooutput.h b/src/3rdparty/phonon/phonon/abstractaudiooutput.h
|
||
index a466298..1045f18 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractaudiooutput.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractaudiooutput.h
|
||
@@ -6,7 +6,7 @@ Copyright (C) 2005-2006 Matthias Kretz <kretz@kde.org>
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractaudiooutput_p.cpp b/src/3rdparty/phonon/phonon/abstractaudiooutput_p.cpp
|
||
index 83ee8b0..20e0b3c 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractaudiooutput_p.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/abstractaudiooutput_p.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractaudiooutput_p.h b/src/3rdparty/phonon/phonon/abstractaudiooutput_p.h
|
||
index 831eb8d..9b3a57f 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractaudiooutput_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractaudiooutput_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractmediastream.cpp b/src/3rdparty/phonon/phonon/abstractmediastream.cpp
|
||
index 5b860f3..26e6fd0 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractmediastream.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/abstractmediastream.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -49,6 +49,7 @@ AbstractMediaStream::AbstractMediaStream(AbstractMediaStreamPrivate &dd, QObject
|
||
|
||
AbstractMediaStream::~AbstractMediaStream()
|
||
{
|
||
+ delete d_ptr;
|
||
}
|
||
|
||
qint64 AbstractMediaStream::streamSize() const
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractmediastream.h b/src/3rdparty/phonon/phonon/abstractmediastream.h
|
||
index c4cde85..5d5bce8 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractmediastream.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractmediastream.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -214,7 +214,7 @@ class PHONON_EXPORT AbstractMediaStream : public QObject
|
||
virtual void seekStream(qint64 offset);
|
||
|
||
AbstractMediaStream(AbstractMediaStreamPrivate &dd, QObject *parent);
|
||
- QScopedPointer<AbstractMediaStreamPrivate> d_ptr;
|
||
+ AbstractMediaStreamPrivate *d_ptr;
|
||
};
|
||
|
||
} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractmediastream_p.h b/src/3rdparty/phonon/phonon/abstractmediastream_p.h
|
||
index 0e87c4d..e4c2be9 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractmediastream_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractmediastream_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -45,7 +45,6 @@ class PHONON_EXPORT AbstractMediaStreamPrivate : private MediaNodeDestructionHan
|
||
public:
|
||
void setStreamInterface(StreamInterface *);
|
||
void setMediaObjectPrivate(MediaObjectPrivate *);
|
||
- ~AbstractMediaStreamPrivate();
|
||
|
||
protected:
|
||
AbstractMediaStreamPrivate()
|
||
@@ -57,6 +56,7 @@ class PHONON_EXPORT AbstractMediaStreamPrivate : private MediaNodeDestructionHan
|
||
errorType(NoError)
|
||
{
|
||
}
|
||
+ ~AbstractMediaStreamPrivate();
|
||
|
||
virtual void setStreamSize(qint64 newSize);
|
||
virtual void setStreamSeekable(bool s);
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractvideooutput.cpp b/src/3rdparty/phonon/phonon/abstractvideooutput.cpp
|
||
index 30dde14..1695b78 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractvideooutput.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/abstractvideooutput.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractvideooutput.h b/src/3rdparty/phonon/phonon/abstractvideooutput.h
|
||
index 04cfdf0..824f729 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractvideooutput.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractvideooutput.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractvideooutput_p.cpp b/src/3rdparty/phonon/phonon/abstractvideooutput_p.cpp
|
||
index 83d0650..a9cfa4d 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractvideooutput_p.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/abstractvideooutput_p.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/abstractvideooutput_p.h b/src/3rdparty/phonon/phonon/abstractvideooutput_p.h
|
||
index d0e8157..90230d4 100644
|
||
--- a/src/3rdparty/phonon/phonon/abstractvideooutput_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/abstractvideooutput_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/addoninterface.h b/src/3rdparty/phonon/phonon/addoninterface.h
|
||
index f400523..229129b 100644
|
||
--- a/src/3rdparty/phonon/phonon/addoninterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/addoninterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/audiodataoutput.cpp b/src/3rdparty/phonon/phonon/audiodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..58870c2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/audiodataoutput.cpp
|
||
@@ -0,0 +1,67 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005 Matthias Kretz <kretz@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 "audiodataoutput.h"
|
||
+#include "audiodataoutput_p.h"
|
||
+#include "factory_p.h"
|
||
+
|
||
+#define PHONON_CLASSNAME AudioDataOutput
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+PHONON_HEIR_IMPL(AbstractAudioOutput)
|
||
+
|
||
+PHONON_GETTER(int, dataSize, d->dataSize)
|
||
+PHONON_GETTER(int, sampleRate, -1)
|
||
+PHONON_SETTER(setDataSize, dataSize, int)
|
||
+
|
||
+bool AudioDataOutputPrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ pBACKEND_GET(int, dataSize, "dataSize");
|
||
+
|
||
+ return AbstractAudioOutputPrivate::aboutToDeleteBackendObject();
|
||
+}
|
||
+
|
||
+void AudioDataOutputPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_Q(AudioDataOutput);
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ AbstractAudioOutputPrivate::setupBackendObject();
|
||
+
|
||
+ // set up attributes
|
||
+ pBACKEND_CALL1("setDataSize", int, dataSize);
|
||
+
|
||
+ qRegisterMetaType<QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > >("QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> >");
|
||
+
|
||
+ QObject::connect(m_backendObject,
|
||
+ SIGNAL(dataReady(const QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > &)),
|
||
+ q, SIGNAL(dataReady(const QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > &)));
|
||
+ QObject::connect(m_backendObject, SIGNAL(endOfMedia(int)), q, SIGNAL(endOfMedia(int)));
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+
|
||
+#undef PHONON_CLASSNAME
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/audiodataoutput.h b/src/3rdparty/phonon/phonon/audiodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..fefd68e
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/audiodataoutput.h
|
||
@@ -0,0 +1,135 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2006 Matthias Kretz <kretz@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_AUDIODATAOUTPUT_H
|
||
+#define Phonon_AUDIODATAOUTPUT_H
|
||
+
|
||
+#include "phonon_export.h"
|
||
+#include "abstractaudiooutput.h"
|
||
+#include "phonondefs.h"
|
||
+
|
||
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||
+template<typename T> class QVector;
|
||
+template<typename Key, typename T> class QMap;
|
||
+#endif
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+ class AudioDataOutputPrivate;
|
||
+
|
||
+ /**
|
||
+ * \short This class gives you the audio data (for visualizations).
|
||
+ *
|
||
+ * This class implements a special AbstractAudioOutput that gives your
|
||
+ * application the audio data. Don't expect realtime performance. But
|
||
+ * the latencies should be low enough to use the audio data for
|
||
+ * visualizations. You can also use the audio data for further processing
|
||
+ * (e.g. encoding and saving to a file).
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+ class PHONON_EXPORT AudioDataOutput : public AbstractAudioOutput
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(AudioDataOutput)
|
||
+ Q_ENUMS(Channel)
|
||
+ Q_PROPERTY(int dataSize READ dataSize WRITE setDataSize)
|
||
+ PHONON_HEIR(AudioDataOutput)
|
||
+ public:
|
||
+ /**
|
||
+ * Specifies the channel the audio data belongs to.
|
||
+ */
|
||
+ enum Channel
|
||
+ {
|
||
+ LeftChannel,
|
||
+ RightChannel,
|
||
+ CenterChannel,
|
||
+ LeftSurroundChannel,
|
||
+ RightSurroundChannel,
|
||
+ SubwooferChannel
|
||
+ };
|
||
+
|
||
+ /**
|
||
+ * Returns the currently used number of samples passed through
|
||
+ * the signal.
|
||
+ *
|
||
+ * \see setDataSize
|
||
+ */
|
||
+ int dataSize() const;
|
||
+
|
||
+ /**
|
||
+ * Returns the sample rate in Hz. Common sample rates are 44100 Hz
|
||
+ * and 48000 Hz. AudioDataOutput will not do any sample rate
|
||
+ * conversion for you. If you need to convert the sample rate you
|
||
+ * might want to take a look at libsamplerate. For visualizations it
|
||
+ * is often enough to do simple interpolation or even drop/duplicate
|
||
+ * samples.
|
||
+ *
|
||
+ * \return The sample rate as reported by the backend. If the
|
||
+ * backend is unavailable -1 is returned.
|
||
+ */
|
||
+ int sampleRate() const;
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ /**
|
||
+ * Sets the number of samples to be passed in one signal emission.
|
||
+ *
|
||
+ * Defaults to 512 samples per emitted signal.
|
||
+ *
|
||
+ * \param size the number of samples
|
||
+ */
|
||
+ void setDataSize(int size);
|
||
+
|
||
+ Q_SIGNALS:
|
||
+ /**
|
||
+ * Emitted whenever another dataSize number of samples are ready.
|
||
+ *
|
||
+ * \param data A mapping of Channel to a vector holding the audio data.
|
||
+ */
|
||
+ void dataReady(const QMap<Phonon::AudioDataOutput::Channel, QVector<qint16> > &data);
|
||
+
|
||
+
|
||
+ /**
|
||
+ * This signal is emitted before the last dataReady signal of a
|
||
+ * media is emitted.
|
||
+ *
|
||
+ * If, for example, the playback of a media file has finished and the
|
||
+ * last audio data of that file is going to be passed with the next
|
||
+ * dataReady signal, and only the 28 first samples of the data
|
||
+ * vector are from that media file endOfMedia will be emitted right
|
||
+ * before dataReady with \p remainingSamples = 28.
|
||
+ *
|
||
+ * \param remainingSamples The number of samples in the next
|
||
+ * dataReady vector that belong to the media that was playing to
|
||
+ * this point.
|
||
+ */
|
||
+ void endOfMedia(int remainingSamples);
|
||
+ };
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // Phonon_AUDIODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/audiodataoutput_p.h b/src/3rdparty/phonon/phonon/audiodataoutput_p.h
|
||
new file mode 100644
|
||
index 0000000..91103a9
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/audiodataoutput_p.h
|
||
@@ -0,0 +1,48 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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 AUDIODATAOUTPUT_P_H
|
||
+#define AUDIODATAOUTPUT_P_H
|
||
+
|
||
+#include "audiodataoutput.h"
|
||
+#include "abstractaudiooutput_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class AudioDataOutputPrivate : public AbstractAudioOutputPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AudioDataOutput)
|
||
+ PHONON_PRIVATECLASS
|
||
+ protected:
|
||
+ AudioDataOutputPrivate()
|
||
+ : dataSize(512)
|
||
+ {
|
||
+ }
|
||
+
|
||
+ int dataSize;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // AUDIODATAOUTPUT_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/audiodataoutputinterface.h b/src/3rdparty/phonon/phonon/audiodataoutputinterface.h
|
||
new file mode 100644
|
||
index 0000000..bc1aad0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/audiodataoutputinterface.h
|
||
@@ -0,0 +1,44 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_AUDIODATAOUTPUTINTERFACE_H
|
||
+#define PHONON_AUDIODATAOUTPUTINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class AudioDataOutput;
|
||
+
|
||
+class AudioDataOutputInterface
|
||
+{
|
||
+ public:
|
||
+ virtual ~AudioDataOutputInterface() {}
|
||
+
|
||
+ virtual AudioDataOutput *frontendObject() const = 0;
|
||
+ virtual void setFrontendObject(AudioDataOutput *) = 0;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::AudioDataOutputInterface, "0AudioDataOutputInterface.phonon.kde.org")
|
||
+
|
||
+#endif // PHONON_AUDIODATAOUTPUTINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/audiooutput.cpp b/src/3rdparty/phonon/phonon/audiooutput.cpp
|
||
index 00b2ebd..89b24bd 100644
|
||
--- a/src/3rdparty/phonon/phonon/audiooutput.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/audiooutput.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -24,12 +24,13 @@
|
||
#include "factory_p.h"
|
||
#include "objectdescription.h"
|
||
#include "audiooutputadaptor_p.h"
|
||
-#include "globalconfig_p.h"
|
||
+#include "globalconfig.h"
|
||
#include "audiooutputinterface.h"
|
||
#include "phononnamespace_p.h"
|
||
#include "platform_p.h"
|
||
+#include "pulsesupport.h"
|
||
|
||
-#include <qmath.h>
|
||
+#include <QtCore/qmath.h>
|
||
|
||
#define PHONON_CLASSNAME AudioOutput
|
||
#define IFACES2 AudioOutputInterface42
|
||
@@ -42,8 +43,12 @@ QT_BEGIN_NAMESPACE
|
||
namespace Phonon
|
||
{
|
||
|
||
-static inline bool callSetOutputDevice(MediaNodePrivate *const d, int index)
|
||
+static inline bool callSetOutputDevice(AudioOutputPrivate *const d, int index)
|
||
{
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive())
|
||
+ return pulse->setOutputDevice(d->getStreamUuid(), index);
|
||
+
|
||
Iface<IFACES2> iface(d);
|
||
if (iface) {
|
||
return iface->setOutputDevice(AudioOutputDevice::fromIndex(index));
|
||
@@ -51,8 +56,12 @@ static inline bool callSetOutputDevice(MediaNodePrivate *const d, int index)
|
||
return Iface<IFACES0>::cast(d)->setOutputDevice(index);
|
||
}
|
||
|
||
-static inline bool callSetOutputDevice(MediaNodePrivate *const d, const AudioOutputDevice &dev)
|
||
+static inline bool callSetOutputDevice(AudioOutputPrivate *const d, const AudioOutputDevice &dev)
|
||
{
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive())
|
||
+ return pulse->setOutputDevice(d->getStreamUuid(), dev.index());
|
||
+
|
||
Iface<IFACES2> iface(d);
|
||
if (iface) {
|
||
return iface->setOutputDevice(dev);
|
||
@@ -89,6 +98,8 @@ void AudioOutputPrivate::init(Phonon::Category c)
|
||
#endif
|
||
|
||
category = c;
|
||
+ streamUuid = QUuid::createUuid().toString();
|
||
+ PulseSupport::getInstance()->setStreamPropList(category, streamUuid);
|
||
|
||
// select hardware device according to the category
|
||
device = AudioOutputDevice::fromIndex(GlobalConfig().audioOutputDeviceFor(category, GlobalConfig::AdvancedDevicesFromSettings | GlobalConfig::HideUnavailableDevices));
|
||
@@ -98,7 +109,10 @@ void AudioOutputPrivate::init(Phonon::Category c)
|
||
q->connect(Factory::sender(), SIGNAL(availableAudioOutputDevicesChanged()), SLOT(_k_deviceListChanged()));
|
||
}
|
||
|
||
-
|
||
+QString AudioOutputPrivate::getStreamUuid()
|
||
+{
|
||
+ return streamUuid;
|
||
+}
|
||
|
||
void AudioOutputPrivate::createBackendObject()
|
||
{
|
||
@@ -126,7 +140,9 @@ void AudioOutput::setName(const QString &newName)
|
||
d->name = newName;
|
||
setVolume(Platform::loadVolume(newName));
|
||
#ifndef QT_NO_DBUS
|
||
- emit d->adaptor->nameChanged(newName);
|
||
+ if (d->adaptor) {
|
||
+ emit d->adaptor->nameChanged(newName);
|
||
+ }
|
||
#endif
|
||
}
|
||
|
||
@@ -232,7 +248,7 @@ bool AudioOutput::setOutputDevice(const AudioOutputDevice &newAudioOutputDevice)
|
||
d->device = newAudioOutputDevice;
|
||
}
|
||
if (k_ptr->backendObject()) {
|
||
- return callSetOutputDevice(k_ptr, d->device.index());
|
||
+ return callSetOutputDevice(d, d->device.index());
|
||
}
|
||
return true;
|
||
}
|
||
@@ -264,8 +280,8 @@ void AudioOutputPrivate::setupBackendObject()
|
||
if (deviceList.isEmpty()) {
|
||
return;
|
||
}
|
||
- for (int i = 0; i < deviceList.count(); ++i) {
|
||
- const AudioOutputDevice &dev = AudioOutputDevice::fromIndex(deviceList.at(i));
|
||
+ foreach (int devIndex, deviceList) {
|
||
+ const AudioOutputDevice &dev = AudioOutputDevice::fromIndex(devIndex);
|
||
if (callSetOutputDevice(this, dev)) {
|
||
handleAutomaticDeviceChange(dev, AudioOutputPrivate::FallbackChange);
|
||
return; // found one that works
|
||
@@ -305,9 +321,8 @@ void AudioOutputPrivate::_k_audioDeviceFailed()
|
||
pDebug() << Q_FUNC_INFO;
|
||
// outputDeviceIndex identifies a failing device
|
||
// fall back in the preference list of output devices
|
||
- const QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings | GlobalConfig::HideUnavailableDevices);
|
||
- for (int i = 0; i < deviceList.count(); ++i) {
|
||
- const int devIndex = deviceList.at(i);
|
||
+ QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings | GlobalConfig::HideUnavailableDevices);
|
||
+ foreach (int devIndex, deviceList) {
|
||
// if it's the same device as the one that failed, ignore it
|
||
if (device.index() != devIndex) {
|
||
const AudioOutputDevice &info = AudioOutputDevice::fromIndex(devIndex);
|
||
@@ -327,10 +342,9 @@ void AudioOutputPrivate::_k_deviceListChanged()
|
||
{
|
||
pDebug() << Q_FUNC_INFO;
|
||
// let's see if there's a usable device higher in the preference list
|
||
- const QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings);
|
||
+ QList<int> deviceList = GlobalConfig().audioOutputDeviceListFor(category, GlobalConfig::AdvancedDevicesFromSettings);
|
||
DeviceChangeType changeType = HigherPreferenceChange;
|
||
- for (int i = 0; i < deviceList.count(); ++i) {
|
||
- const int devIndex = deviceList.at(i);
|
||
+ foreach (int devIndex, deviceList) {
|
||
const AudioOutputDevice &info = AudioOutputDevice::fromIndex(devIndex);
|
||
if (!info.property("available").toBool()) {
|
||
if (device.index() == devIndex) {
|
||
@@ -402,8 +416,11 @@ void AudioOutputPrivate::handleAutomaticDeviceChange(const AudioOutputDevice &de
|
||
|
||
AudioOutputPrivate::~AudioOutputPrivate()
|
||
{
|
||
+ PulseSupport::getInstance()->clearStreamCache(streamUuid);
|
||
#ifndef QT_NO_DBUS
|
||
- emit adaptor->outputDestroyed();
|
||
+ if (adaptor) {
|
||
+ emit adaptor->outputDestroyed();
|
||
+ }
|
||
#endif
|
||
}
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/audiooutput.h b/src/3rdparty/phonon/phonon/audiooutput.h
|
||
index 54bb389..4edf135 100644
|
||
--- a/src/3rdparty/phonon/phonon/audiooutput.h
|
||
+++ b/src/3rdparty/phonon/phonon/audiooutput.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/audiooutput_p.h b/src/3rdparty/phonon/phonon/audiooutput_p.h
|
||
index 459b491..0a90c3d 100644
|
||
--- a/src/3rdparty/phonon/phonon/audiooutput_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/audiooutput_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -46,6 +46,7 @@ class AudioOutputPrivate : public AbstractAudioOutputPrivate
|
||
return 0;
|
||
}
|
||
void init(Phonon::Category c);
|
||
+ QString getStreamUuid();
|
||
|
||
|
||
protected:
|
||
@@ -79,6 +80,7 @@ class AudioOutputPrivate : public AbstractAudioOutputPrivate
|
||
QString name;
|
||
Phonon::AudioOutputDevice device;
|
||
qreal volume;
|
||
+ QString streamUuid;
|
||
#ifndef QT_NO_DBUS
|
||
Phonon::AudioOutputAdaptor *adaptor;
|
||
#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/audiooutputinterface.cpp b/src/3rdparty/phonon/phonon/audiooutputinterface.cpp
|
||
index be2780d..1770f4c 100644
|
||
--- a/src/3rdparty/phonon/phonon/audiooutputinterface.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/audiooutputinterface.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/audiooutputinterface.h b/src/3rdparty/phonon/phonon/audiooutputinterface.h
|
||
index 1511e02..80ba11c 100644
|
||
--- a/src/3rdparty/phonon/phonon/audiooutputinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/audiooutputinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/backend/Mainpage.dox b/src/3rdparty/phonon/phonon/backend/Mainpage.dox
|
||
new file mode 100644
|
||
index 0000000..db4cac1
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/backend/Mainpage.dox
|
||
@@ -0,0 +1,109 @@
|
||
+/** \mainpage Phonon Backend Interface
|
||
+
|
||
+
|
||
+\section phonon_backend_development Backend Development
|
||
+If you want to write a new backend for %Phonon this is for you:
|
||
+\li \ref phonon_backend_development_page "Phonon Backend Development"
|
||
+\li \ref Backend
|
||
+
|
||
+\authors
|
||
+Matthias Kretz \<kretz@kde.org\>
|
||
+
|
||
+\maintainers
|
||
+Matthias Kretz \<kretz@kde.org\>
|
||
+
|
||
+\licenses
|
||
+\lgpl
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+\page phonon_tut1 Phonon Tutorial Part 1: a simple audio player
|
||
+
|
||
+<p><b>
|
||
+\ref index "Overview" |
|
||
+Application Example |
|
||
+\ref phonon_backend_development_page "Backend Development"
|
||
+</b></p>
|
||
+
|
||
+\includelineno tutorial2.cpp
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+\page phonon_backend_development_page Phonon Backend Development
|
||
+
|
||
+<p><b>
|
||
+\ref index "Overview" |
|
||
+\ref phonon_tut1 "Application Example" |
|
||
+Backend Development
|
||
+</b></p>
|
||
+
|
||
+The backend is the most important part in %Phonon to provide functionality. This
|
||
+document will get you started how backends work, how to start development of a
|
||
+new backend and how to understand existing backend code.
|
||
+
|
||
+\section phonon_backend_introduction Introduction
|
||
+
|
||
+The first step is to understand how the %Phonon frontend calls the backend: In
|
||
+the frontend objects all backend objects are "only" QObjects. But QObject has
|
||
+powerful introspection capabilities that %Phonon uses to call methods in the
|
||
+backend. If you're interested look at \ref QMetaObject::invokeMethod. In order
|
||
+to make sure that a backend is fully operational (there are no abstract classes
|
||
+that tell the backend developer what method signatures are wrong or what
|
||
+methods are missing) there are two test programs compiled with kdelibs (if
|
||
+KDE4_BUILD_TESTS is set in cmake) that inspects the backend.
|
||
+
|
||
+In short that requires the backend classes to inherit from QObject and to make
|
||
+all methods that are to be called from the frontend slots or prefixed with
|
||
+Q_INVOKABLE (the latter doesn't work reliable with Qt 4.1.3 at least, so you
|
||
+should simply make those methods slots).
|
||
+
|
||
+\section phonon_backend_classes The Backend Classes
|
||
+
|
||
+The central class that needs to be implemented is the backend factory class,
|
||
+throughout this documentation simply called Backend:
|
||
+
|
||
+\li \ref phonon_Backend "Backend"
|
||
+
|
||
+\subsection phonon_mediaproducingclasses The classes producing media data (sources)
|
||
+
|
||
+\li \ref Phonon::MediaObjectInterface "common methods/signals for media producing classes"
|
||
+\li \ref phonon_MediaObject "MediaObject"
|
||
+
|
||
+\subsection phonon_pathclass The path class
|
||
+
|
||
+\li \ref phonon_Path "Path"
|
||
+
|
||
+\subsection phonon_outputclasses The output classes
|
||
+\li \ref phonon_AudioDataOutput "AudioDataOutput"
|
||
+\li \ref phonon_AudioOutput "AudioOutput"
|
||
+\li \ref phonon_VideoDataOutput "VideoDataOutput"
|
||
+\li \ref phonon_VideoWidget "VideoWidget"
|
||
+
|
||
+\subsection phonon_EffectClasses The effect classes
|
||
+
|
||
+\li \ref phonon_Effect "Effect"
|
||
+\li \ref phonon_Visualization "Visualization"
|
||
+\li \ref phonon_VolumeFaderEffect "VolumeFaderEffect"
|
||
+
|
||
+*/
|
||
+// DOXYGEN_REFERENCES = phonon
|
||
+// DOXYGEN_SET_EXPAND_AS_DEFINED = PHONON_OBJECT PHONON_HEIR PHONON_INTERFACE_GETTER
|
||
+// DOXYGEN_SET_HIDE_SCOPE_NAMES = YES
|
||
+// DOXYGEN_SET_HIDE_FRIEND_COMPOUNDS = YES
|
||
+// DOXYGEN_SET_PROJECT_NAME = Backend
|
||
+// DOXYGEN_SET_EXTRACT_ALL = NO
|
||
+// DOXYGEN_SET_HIDE_UNDOC_MEMBERS = YES
|
||
+// DOXYGEN_SET_SOURCE_BROWSER = NO
|
||
+// DOXYGEN_SET_INPUT = @topdir@/phonon/phonon
|
||
+// DOXYGEN_SET_FILE_PATTERNS = *interface.h */phonon/backend/Mainpage.dox */backend.dox
|
||
+// vim: tw=100 ts=4 sw=4 expandtab filetype=doxygen
|
||
diff --git a/src/3rdparty/phonon/phonon/backendcapabilities.cpp b/src/3rdparty/phonon/phonon/backendcapabilities.cpp
|
||
index 62c9cc9..654e87c 100644
|
||
--- a/src/3rdparty/phonon/phonon/backendcapabilities.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/backendcapabilities.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -26,7 +26,7 @@
|
||
#include "phonondefs_p.h"
|
||
#include "backendinterface.h"
|
||
#include "factory_p.h"
|
||
-#include "globalconfig_p.h"
|
||
+#include "globalconfig.h"
|
||
#include "globalstatic_p.h"
|
||
#include "objectdescription.h"
|
||
|
||
@@ -76,8 +76,8 @@ QList<AudioOutputDevice> BackendCapabilities::availableAudioOutputDevices()
|
||
{
|
||
QList<AudioOutputDevice> ret;
|
||
const QList<int> deviceIndexes = GlobalConfig().audioOutputDeviceListFor(Phonon::NoCategory);
|
||
- for (int i = 0; i < deviceIndexes.count(); ++i) {
|
||
- ret.append(AudioOutputDevice::fromIndex(deviceIndexes.at(i)));
|
||
+ foreach (int i, deviceIndexes) {
|
||
+ ret.append(AudioOutputDevice::fromIndex(i));
|
||
}
|
||
return ret;
|
||
}
|
||
@@ -88,8 +88,8 @@ QList<AudioCaptureDevice> BackendCapabilities::availableAudioCaptureDevices()
|
||
{
|
||
QList<AudioCaptureDevice> ret;
|
||
const QList<int> deviceIndexes = GlobalConfig().audioCaptureDeviceListFor(Phonon::NoCategory);
|
||
- for (int i = 0; i < deviceIndexes.count(); ++i) {
|
||
- ret.append(AudioCaptureDevice::fromIndex(deviceIndexes.at(i)));
|
||
+ foreach (int i, deviceIndexes) {
|
||
+ ret.append(AudioCaptureDevice::fromIndex(i));
|
||
}
|
||
return ret;
|
||
}
|
||
@@ -101,9 +101,9 @@ QList<EffectDescription> BackendCapabilities::availableAudioEffects()
|
||
BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||
QList<EffectDescription> ret;
|
||
if (backendIface) {
|
||
- const QList<int> deviceIndexes = backendIface->objectDescriptionIndexes(Phonon::EffectType);
|
||
- for (int i = 0; i < deviceIndexes.count(); ++i) {
|
||
- ret.append(EffectDescription::fromIndex(deviceIndexes.at(i)));
|
||
+ QList<int> deviceIndexes = backendIface->objectDescriptionIndexes(Phonon::EffectType);
|
||
+ foreach (int i, deviceIndexes) {
|
||
+ ret.append(EffectDescription::fromIndex(i));
|
||
}
|
||
}
|
||
return ret;
|
||
diff --git a/src/3rdparty/phonon/phonon/backendcapabilities.h b/src/3rdparty/phonon/phonon/backendcapabilities.h
|
||
index 36454a3..bbe6937 100644
|
||
--- a/src/3rdparty/phonon/phonon/backendcapabilities.h
|
||
+++ b/src/3rdparty/phonon/phonon/backendcapabilities.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -15,7 +15,7 @@
|
||
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
|
||
+ 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/>.
|
||
|
||
*/
|
||
@@ -88,18 +88,19 @@ namespace BackendCapabilities
|
||
};
|
||
|
||
/**
|
||
- * Use this function to get a QObject pointer to connect to one of the Notifier signals.
|
||
+ * Use this function to get a QObject pointer to connect to the capabilitiesChanged signal.
|
||
*
|
||
* \return a pointer to a QObject.
|
||
*
|
||
- * To connect to the signal do the following:
|
||
+ * The capabilitiesChanged signal is emitted if the capabilities have changed. This can
|
||
+ * happen if the user has requested a backend change.
|
||
+ *
|
||
+ * To connect to this signal do the following:
|
||
* \code
|
||
* QObject::connect(BackendCapabilities::notifier(), SIGNAL(capabilitiesChanged()), ...
|
||
* \endcode
|
||
*
|
||
* \see Notifier::capabilitiesChanged()
|
||
- * \see Notifier::availableAudioOutputDevicesChanged()
|
||
- * \see Notifier::availableAudioCaptureDevicesChanged()
|
||
*/
|
||
PHONON_EXPORT Notifier *notifier();
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/backendcapabilities_p.h b/src/3rdparty/phonon/phonon/backendcapabilities_p.h
|
||
index c17f24f..5ef18a4 100644
|
||
--- a/src/3rdparty/phonon/phonon/backendcapabilities_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/backendcapabilities_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/backendinterface.h b/src/3rdparty/phonon/phonon/backendinterface.h
|
||
index e1f11da..5deee75 100644
|
||
--- a/src/3rdparty/phonon/phonon/backendinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/backendinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effect.cpp b/src/3rdparty/phonon/phonon/effect.cpp
|
||
index 98662a5..f0ac454 100644
|
||
--- a/src/3rdparty/phonon/phonon/effect.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/effect.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -107,8 +107,7 @@ bool EffectPrivate::aboutToDeleteBackendObject()
|
||
{
|
||
if (m_backendObject) {
|
||
const QList<EffectParameter> parameters = pINTERFACE_CALL(parameters());
|
||
- for (int i = 0; i < parameters.count(); ++i) {
|
||
- const EffectParameter &p = parameters.at(i);
|
||
+ foreach (const EffectParameter &p, parameters) {
|
||
parameterValues[p] = pINTERFACE_CALL(parameterValue(p));
|
||
}
|
||
}
|
||
@@ -121,8 +120,7 @@ void EffectPrivate::setupBackendObject()
|
||
|
||
// set up attributes
|
||
const QList<EffectParameter> parameters = pINTERFACE_CALL(parameters());
|
||
- for (int i = 0; i < parameters.count(); ++i) {
|
||
- const EffectParameter &p = parameters.at(i);
|
||
+ foreach (const EffectParameter &p, parameters) {
|
||
pINTERFACE_CALL(setParameterValue(p, parameterValues[p]));
|
||
}
|
||
}
|
||
diff --git a/src/3rdparty/phonon/phonon/effect.h b/src/3rdparty/phonon/phonon/effect.h
|
||
index b3a7975..e403482 100644
|
||
--- a/src/3rdparty/phonon/phonon/effect.h
|
||
+++ b/src/3rdparty/phonon/phonon/effect.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effect_p.h b/src/3rdparty/phonon/phonon/effect_p.h
|
||
index 586812a..6cc42d9 100644
|
||
--- a/src/3rdparty/phonon/phonon/effect_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/effect_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effectinterface.h b/src/3rdparty/phonon/phonon/effectinterface.h
|
||
index f535105..59c69d9 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/effectinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effectparameter.cpp b/src/3rdparty/phonon/phonon/effectparameter.cpp
|
||
index 6030b6e..0447f5b 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectparameter.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/effectparameter.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effectparameter.h b/src/3rdparty/phonon/phonon/effectparameter.h
|
||
index 55c7049..4471a16 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectparameter.h
|
||
+++ b/src/3rdparty/phonon/phonon/effectparameter.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effectparameter_p.h b/src/3rdparty/phonon/phonon/effectparameter_p.h
|
||
index 0fc387a..f3f9f88 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectparameter_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/effectparameter_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/effectwidget.cpp b/src/3rdparty/phonon/phonon/effectwidget.cpp
|
||
index fb9cf6e..6738382 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectwidget.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/effectwidget.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -97,8 +97,7 @@ void EffectWidgetPrivate::autogenerateUi()
|
||
Q_Q(EffectWidget);
|
||
QVBoxLayout *mainLayout = new QVBoxLayout(q);
|
||
mainLayout->setMargin(0);
|
||
- for (int i = 0; i < effect->parameters().count(); ++i) {
|
||
- const EffectParameter ¶ = effect->parameters().at(i);
|
||
+ foreach (const EffectParameter ¶, effect->parameters()) {
|
||
QVariant value = effect->parameterValue(para);
|
||
QHBoxLayout *pLayout = new QHBoxLayout;
|
||
mainLayout->addLayout(pLayout);
|
||
@@ -118,14 +117,13 @@ void EffectWidgetPrivate::autogenerateUi()
|
||
control = cb;
|
||
if (value.type() == QVariant::Int) {
|
||
//value just defines the item index
|
||
- for (int i = 0; i < para.possibleValues().count(); ++i) {
|
||
- cb->addItem(para.possibleValues().at(i).toString());
|
||
+ foreach (const QVariant &item, para.possibleValues()) {
|
||
+ cb->addItem(item.toString());
|
||
}
|
||
cb->setCurrentIndex(value.toInt());
|
||
QObject::connect(cb, SIGNAL(currentIndexChanged(int)), q, SLOT(_k_setIntParameter(int)));
|
||
} else {
|
||
- for (int i = 0; i < para.possibleValues().count(); ++i) {
|
||
- const QVariant &item = para.possibleValues().at(i);
|
||
+ foreach (const QVariant &item, para.possibleValues()) {
|
||
cb->addItem(item.toString());
|
||
if (item == value) {
|
||
cb->setCurrentIndex(cb->count() - 1);
|
||
@@ -157,20 +155,18 @@ void EffectWidgetPrivate::autogenerateUi()
|
||
QObject::connect(sb, SIGNAL(valueChanged(int)), q, SLOT(_k_setIntParameter(int)));
|
||
}
|
||
break;
|
||
- case QMetaType::Float:
|
||
case QVariant::Double:
|
||
{
|
||
- const qreal minValue = para.minimumValue().canConvert(QVariant::Double) ?
|
||
- para.minimumValue().toReal() : DEFAULT_MIN;
|
||
- const qreal maxValue = para.maximumValue().canConvert(QVariant::Double) ?
|
||
- para.maximumValue().toReal() : DEFAULT_MAX;
|
||
+ const double minValue = (para.minimumValue().type() == QVariant::Double ?
|
||
+ para.minimumValue().toDouble() : DEFAULT_MIN);
|
||
+ const double maxValue = (para.maximumValue().type() == QVariant::Double ?
|
||
+ para.maximumValue().toDouble() : DEFAULT_MAX);
|
||
|
||
if (minValue == -1. && maxValue == 1.) {
|
||
//Special case values between -1 and 1.0 to use a slider for improved usability
|
||
QSlider *slider = new QSlider(Qt::Horizontal, q);
|
||
- control = slider;
|
||
slider->setRange(-SLIDER_RANGE, +SLIDER_RANGE);
|
||
- slider->setValue(int(SLIDER_RANGE * value.toReal()));
|
||
+ slider->setValue(int(SLIDER_RANGE * value.toDouble()));
|
||
slider->setTickPosition(QSlider::TicksBelow);
|
||
slider->setTickInterval(TICKINTERVAL);
|
||
QObject::connect(slider, SIGNAL(valueChanged(int)), q, SLOT(_k_setSliderParameter(int)));
|
||
@@ -192,10 +188,10 @@ void EffectWidgetPrivate::autogenerateUi()
|
||
break;
|
||
}
|
||
|
||
- if (control) {
|
||
#ifndef QT_NO_TOOLTIP
|
||
control->setToolTip(para.description());
|
||
#endif
|
||
+ if (control) {
|
||
#ifndef QT_NO_SHORTCUT
|
||
label->setBuddy(control);
|
||
#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/effectwidget.h b/src/3rdparty/phonon/phonon/effectwidget.h
|
||
index 340b2e3..17a310f 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectwidget.h
|
||
+++ b/src/3rdparty/phonon/phonon/effectwidget.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -39,7 +39,7 @@ class Effect;
|
||
class EffectWidgetPrivate;
|
||
|
||
/** \class EffectWidget effectwidget.h Phonon/EffectWidget
|
||
- * \brief Widget to control the parameters of an \ref Effect.
|
||
+ * \brief Widget to control the parameters of an Effect.
|
||
*
|
||
* \ingroup PhononWidgets
|
||
* \ingroup PhononEffects
|
||
diff --git a/src/3rdparty/phonon/phonon/effectwidget_p.h b/src/3rdparty/phonon/phonon/effectwidget_p.h
|
||
index 6ce44bf..aad422a 100644
|
||
--- a/src/3rdparty/phonon/phonon/effectwidget_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/effectwidget_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/CMakeLists.txt b/src/3rdparty/phonon/phonon/experimental/CMakeLists.txt
|
||
new file mode 100644
|
||
index 0000000..d1fcd41
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/CMakeLists.txt
|
||
@@ -0,0 +1,57 @@
|
||
+add_subdirectory(tests)
|
||
+
|
||
+########### libphononexperimental ###############
|
||
+set(phononexperimental_LIB_SRCS
|
||
+ abstractaudiodataoutput.cpp
|
||
+ abstractvideodataoutput.cpp
|
||
+ audiodataoutput.cpp
|
||
+ audioformat.cpp
|
||
+ avcapture.cpp
|
||
+ backendcapabilities.cpp
|
||
+ factory.cpp
|
||
+ globalconfig.cpp
|
||
+ mediasource.cpp
|
||
+ packet.cpp
|
||
+ packetpool.cpp
|
||
+ videodataoutput.cpp
|
||
+ videodataoutput2.cpp
|
||
+ videowidget.cpp
|
||
+ visualization.cpp
|
||
+ ../abstractaudiooutput_p.cpp
|
||
+ ../abstractvideooutput_p.cpp
|
||
+ )
|
||
+automoc4_add_library(phononexperimental SHARED ${phononexperimental_LIB_SRCS})
|
||
+target_link_libraries(phononexperimental ${PHONON_LIBS})
|
||
+set_target_properties(phononexperimental PROPERTIES
|
||
+ VERSION ${PHONON_LIB_VERSION}
|
||
+ SOVERSION ${PHONON_LIB_SOVERSION}
|
||
+ DEFINE_SYMBOL MAKE_PHONONEXPERIMENTAL_LIB
|
||
+ )
|
||
+install(TARGETS phononexperimental ${INSTALL_TARGETS_DEFAULT_ARGS})
|
||
+
|
||
+########### install headers ###############
|
||
+install(FILES
|
||
+ abstractaudiodataoutput.h
|
||
+ abstractvideodataoutput.h
|
||
+ audiodataoutput.h
|
||
+ audiodataoutputinterface.h
|
||
+ audioformat.h
|
||
+ avcapture.h
|
||
+ backendcapabilities.h
|
||
+ backendinterface.h
|
||
+ export.h
|
||
+ mediasource.h
|
||
+ objectdescription.h
|
||
+ snapshotinterface.h
|
||
+ packet.h
|
||
+ packetpool.h
|
||
+ phononnamespace.h
|
||
+ videodataoutput.h
|
||
+ videodataoutput2.h
|
||
+ videodataoutputinterface.h
|
||
+ videoframe.h
|
||
+ videoframe2.h
|
||
+ videowidget.h
|
||
+ visualization.h
|
||
+ globalconfig.h
|
||
+ DESTINATION ${INCLUDE_INSTALL_DIR}/phonon/experimental COMPONENT Devel)
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..f7b4f84
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.cpp
|
||
@@ -0,0 +1,113 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "abstractaudiodataoutput.h"
|
||
+#include "abstractaudiodataoutput_p.h"
|
||
+#include "audiodataoutputinterface.h"
|
||
+#include "factory_p.h"
|
||
+#include "../phonondefs_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+AbstractAudioDataOutput::AbstractAudioDataOutput()
|
||
+ : MediaNode(*new AbstractAudioDataOutputPrivate)
|
||
+{
|
||
+ K_D(AbstractAudioDataOutput);
|
||
+ d->isRunning = false;
|
||
+ d->allowedFormats << AudioFormat();
|
||
+}
|
||
+
|
||
+AbstractAudioDataOutput::~AbstractAudioDataOutput()
|
||
+{
|
||
+ setRunning(false);
|
||
+}
|
||
+
|
||
+QSet<AudioFormat> AbstractAudioDataOutput::allowedFormats() const
|
||
+{
|
||
+ K_D(const AbstractAudioDataOutput);
|
||
+ return d->allowedFormats;
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutput::setAllowedFormats(const QSet<AudioFormat> &allowedFormats)
|
||
+{
|
||
+ K_D(AbstractAudioDataOutput);
|
||
+ d->allowedFormats = allowedFormats;
|
||
+}
|
||
+
|
||
+bool AbstractAudioDataOutput::isRunning() const
|
||
+{
|
||
+ K_D(const AbstractAudioDataOutput);
|
||
+ return d->isRunning;
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutput::setRunning(bool running)
|
||
+{
|
||
+ K_D(AbstractAudioDataOutput);
|
||
+ Iface<AudioDataOutputInterface> iface(d);
|
||
+ if (iface) {
|
||
+ if (running) {
|
||
+ iface->setFrontendObject(this);
|
||
+ } else {
|
||
+ iface->setFrontendObject(0);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutput::start()
|
||
+{
|
||
+ setRunning(true);
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutput::stop()
|
||
+{
|
||
+ setRunning(false);
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutputPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_Q(AbstractAudioDataOutput);
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ //AbstractAudioOutputPrivate::setupBackendObject();
|
||
+ if (isRunning) {
|
||
+ Iface<AudioDataOutputInterface> iface(this);
|
||
+ if (iface) {
|
||
+ iface->setFrontendObject(q);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void AbstractAudioDataOutputPrivate::createBackendObject()
|
||
+{
|
||
+ if (m_backendObject)
|
||
+ return;
|
||
+ //Q_Q(AbstractAudioDataOutput);
|
||
+ m_backendObject = Factory::createAudioDataOutput(0);
|
||
+ if (m_backendObject) {
|
||
+ setupBackendObject();
|
||
+ }
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.h b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..19c9f20
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput.h
|
||
@@ -0,0 +1,100 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2006,2008 Matthias Kretz <kretz@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_X_ABSTRACTAUDIODATAOUTPUT_H
|
||
+#define PHONON_X_ABSTRACTAUDIODATAOUTPUT_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../medianode.h"
|
||
+#include "../phonondefs.h"
|
||
+#include "audioformat.h"
|
||
+
|
||
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||
+template<typename T> class QSet;
|
||
+#endif
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class Packet;
|
||
+class AbstractAudioDataOutputPrivate;
|
||
+
|
||
+/**
|
||
+ * \short This class gives you the audio data.
|
||
+ *
|
||
+ * This class implements a special AbstractAudioOutput that gives your
|
||
+ * application the audio data. This class is usable for realtime performance.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT AbstractAudioDataOutput : public Phonon::MediaNode
|
||
+{
|
||
+ K_DECLARE_PRIVATE(AbstractAudioDataOutput)
|
||
+ public:
|
||
+ /**
|
||
+ * Constructs an AbstractAudioDataOutput
|
||
+ */
|
||
+ AbstractAudioDataOutput();
|
||
+ ~AbstractAudioDataOutput();
|
||
+
|
||
+ /**
|
||
+ * Lists the formats this output is allowed to pass via frameReady.
|
||
+ */
|
||
+ virtual QSet<AudioFormat> allowedFormats() const;
|
||
+
|
||
+ // TODO: consider to remove the following function and make the above pure virtual
|
||
+ /**
|
||
+ * Defaults to AudioFormat().
|
||
+ * I.e. 16 bit, stereo, 48000 kHz PCM data.
|
||
+ */
|
||
+ void setAllowedFormats(const QSet<AudioFormat> &);
|
||
+
|
||
+ bool isRunning() const;
|
||
+
|
||
+ /**
|
||
+ * This function is called whenever an audio packet is ready for
|
||
+ * processing.
|
||
+ *
|
||
+ * \warning packetReady can get called from any thread (other than the
|
||
+ * main thread or the thread affinity of this QObject).
|
||
+ */
|
||
+ virtual void packetReady(const Packet &) = 0;
|
||
+
|
||
+ /**
|
||
+ * This function is called after the last packetReady of a media was
|
||
+ * called.
|
||
+ */
|
||
+ void endOfMedia();
|
||
+
|
||
+ void setRunning(bool running);
|
||
+ void start();
|
||
+ void stop();
|
||
+
|
||
+ protected:
|
||
+ AbstractAudioDataOutput(AbstractAudioDataOutputPrivate &dd);
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_X_ABSTRACTAUDIODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput_p.h b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput_p.h
|
||
new file mode 100644
|
||
index 0000000..af30aec
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractaudiodataoutput_p.h
|
||
@@ -0,0 +1,50 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_ABSTRACTAUDIODATAOUTPUT_P_H
|
||
+#define PHONON_X_ABSTRACTAUDIODATAOUTPUT_P_H
|
||
+
|
||
+#include "abstractaudiodataoutput.h"
|
||
+#include "../medianode_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AbstractAudioDataOutputPrivate : public Phonon::MediaNodePrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AbstractAudioDataOutput)
|
||
+ protected:
|
||
+ virtual bool aboutToDeleteBackendObject() { return true; }
|
||
+ virtual void createBackendObject();
|
||
+ void setupBackendObject();
|
||
+
|
||
+ private:
|
||
+ bool isRunning;
|
||
+ QSet<AudioFormat> allowedFormats;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_X_ABSTRACTAUDIODATAOUTPUT_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.cpp b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.cpp
|
||
new file mode 100644
|
||
index 0000000..ab80fbe
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.cpp
|
||
@@ -0,0 +1,191 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@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 "abstractmediastream2.h"
|
||
+#include "abstractmediastream2_p.h"
|
||
+#include "mediaobjectinterface.h"
|
||
+#include "mediaobject_p.h"
|
||
+#include "phononnamespace_p.h"
|
||
+
|
||
+#include <QtCore/QAbstractEventDispatcher>
|
||
+#include <QtCore/QEvent>
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+bool AbstractMediaStream2::event(QEvent *e)
|
||
+{
|
||
+ if (e->type() == QEvent::ThreadChange) {
|
||
+ Q_D(AbstractMediaStream2);
|
||
+ if (d->eventDispatcher) {
|
||
+ pWarning() << "Do not call moveToThread on an AbstractMediaStream2 object when it is in use.";
|
||
+ QObject::disconnect(d->eventDispatcher, SIGNAL(awake()), this, SLOT(_k_handleStreamEvent()));
|
||
+ d->eventDispatcher = 0;
|
||
+ }
|
||
+ }
|
||
+ return AbstractMediaStream::event(e);
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::dataReady()
|
||
+{
|
||
+ Q_Q(AbstractMediaStream2);
|
||
+ if (!eventDispatcher) {
|
||
+ eventDispatcher = QAbstractEventDispatcher::instance(q->thread());
|
||
+ if (!eventDispatcher) {
|
||
+ pError() << "AbstractMediaStream2 needs to run in a thread with QEventLoop";
|
||
+ return;
|
||
+ } else {
|
||
+ QObject::connect(eventDispatcher, SIGNAL(awake()), q, SLOT(_k_handleStreamEvent()), Qt::DirectConnection);
|
||
+ }
|
||
+ }
|
||
+ eventDispatcher->wakeUp();
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::_k_handleStreamEvent()
|
||
+{
|
||
+ Q_ASSERT(streamEventQueue);
|
||
+ Q_Q(AbstractMediaStream2);
|
||
+ StreamEventQueue::Command c;
|
||
+ while (streamEventQueue->nextCommandForFrontend(&c)) {
|
||
+ switch (c.command) {
|
||
+ case StreamEventQueue::SetStreamSize:
|
||
+ case StreamEventQueue::SetSeekable:
|
||
+ case StreamEventQueue::Write:
|
||
+ case StreamEventQueue::EndOfData:
|
||
+ case StreamEventQueue::SeekDone:
|
||
+ case StreamEventQueue::ResetDone:
|
||
+ case StreamEventQueue::ConnectDone:
|
||
+ pFatal("AbstractMediaStream2 received wrong Command");
|
||
+ break;
|
||
+ case StreamEventQueue::NeedData:
|
||
+ q->needData(qvariant_cast<quint32>(c.data));
|
||
+ break;
|
||
+ case StreamEventQueue::EnoughData:
|
||
+ q->enoughData();
|
||
+ break;
|
||
+ case StreamEventQueue::Seek:
|
||
+ q->seekStream(qvariant_cast<quint64>(c.data));
|
||
+ break;
|
||
+ case StreamEventQueue::Reset:
|
||
+ q->reset();
|
||
+ break;
|
||
+ case StreamEventQueue::Connect:
|
||
+ if (firstConnect) {
|
||
+ firstConnect = false;
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::ConnectDone);
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::SetSeekable, streamSeekable);
|
||
+ if (streamSize != 0) {
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::SetStreamSize, streamSize);
|
||
+ }
|
||
+ } else {
|
||
+ ++connectReset;
|
||
+ q->reset();
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+AbstractMediaStream2::AbstractMediaStream2(QObject *parent)
|
||
+ : AbstractMediaStream(*new AbstractMediaStream2Private, parent)
|
||
+{
|
||
+}
|
||
+
|
||
+AbstractMediaStream2::AbstractMediaStream2(AbstractMediaStream2Private &dd, QObject *parent)
|
||
+ : AbstractMediaStream(dd, parent)
|
||
+{
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::setStreamSize(qint64 newSize)
|
||
+{
|
||
+ streamSize = newSize;
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::SetStreamSize, newSize);
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::setStreamSeekable(bool s)
|
||
+{
|
||
+ streamSeekable = s;
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::SetSeekable, s);
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::writeData(const QByteArray &data)
|
||
+{
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::Write, data);
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2Private::endOfData()
|
||
+{
|
||
+ streamEventQueue->sendToBackend(StreamEventQueue::EndOfData);
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2::resetDone()
|
||
+{
|
||
+ Q_D(AbstractMediaStream2);
|
||
+ if (d->connectReset > 0) {
|
||
+ --d->connectReset;
|
||
+ d->streamEventQueue->sendToBackend(StreamEventQueue::ConnectDone);
|
||
+ } else {
|
||
+ d->streamEventQueue->sendToBackend(StreamEventQueue::ResetDone);
|
||
+ }
|
||
+ d->streamEventQueue->sendToBackend(StreamEventQueue::SetSeekable, d->streamSeekable);
|
||
+ if (d->streamSize != 0) {
|
||
+ d->streamEventQueue->sendToBackend(StreamEventQueue::SetStreamSize, d->streamSize);
|
||
+ }
|
||
+}
|
||
+
|
||
+void AbstractMediaStream2::seekStreamDone()
|
||
+{
|
||
+ d_func()->streamEventQueue->sendToBackend(StreamEventQueue::SeekDone);
|
||
+}
|
||
+
|
||
+AbstractMediaStream2Private::AbstractMediaStream2Private()
|
||
+ : streamEventQueue(new StreamEventQueue),
|
||
+ eventDispatcher(0),
|
||
+ connectReset(0),
|
||
+ firstConnect(true)
|
||
+{
|
||
+ streamEventQueue->ref();
|
||
+ streamEventQueue->setFrontendCommandHandler(this);
|
||
+}
|
||
+
|
||
+AbstractMediaStream2Private::~AbstractMediaStream2Private()
|
||
+{
|
||
+ // setFrontendCommandHandler blocks internally until a handler that might be called right now is
|
||
+ // done. That means AbstractMediaStream2Private::dataReady will either not run again or it will
|
||
+ // be done before this object and our q object are deleted.
|
||
+ streamEventQueue->setFrontendCommandHandler(0);
|
||
+ streamEventQueue->deref();
|
||
+ streamEventQueue = 0;
|
||
+ // if eventDispatcher->wakeUp() was called and we are now still connected to its awake() signal
|
||
+ // then the QObject will be deleted until execution reaches the event loop again and
|
||
+ // _k_handleStreamEvent will not get called
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+#include "moc_abstractmediastream2.cpp"
|
||
+
|
||
+// vim: sw=4 sts=4 et tw=100
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.h b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.h
|
||
new file mode 100644
|
||
index 0000000..e6c89af
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2.h
|
||
@@ -0,0 +1,153 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@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_ABSTRACTMEDIASTREAM2_H
|
||
+#define PHONON_ABSTRACTMEDIASTREAM2_H
|
||
+
|
||
+#include "abstractmediastream.h"
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+class QByteArray;
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+class MediaObject;
|
||
+class AbstractMediaStream2Private;
|
||
+
|
||
+/** \class AbstractMediaStream2 abstractmediastream2.h Phonon/AbstractMediaStream2
|
||
+ * \brief Base class for custom media data streams.
|
||
+ *
|
||
+ * Implement this class to provide a custom data stream to the backend. The class supports both, the
|
||
+ * push and the pull model.
|
||
+ *
|
||
+ * Push:
|
||
+ * \code
|
||
+ * PushStream::PushStream(QObject *parent)
|
||
+ * : AbstractMediaStream2(parent), m_timer(new QTimer(this))
|
||
+ * {
|
||
+ * setStreamSize(getMediaStreamSize());
|
||
+ *
|
||
+ * connect(m_timer, SIGNAL(timeout()), SLOT(moreData()));
|
||
+ * m_timer->setInterval(0);
|
||
+ * }
|
||
+ *
|
||
+ * void PushStream::moreData()
|
||
+ * {
|
||
+ * const QByteArray data = getMediaData();
|
||
+ * if (data.isEmpty()) {
|
||
+ * endOfData();
|
||
+ * } else {
|
||
+ * writeData(data);
|
||
+ * }
|
||
+ * }
|
||
+ *
|
||
+ * void PushStream::needData()
|
||
+ * {
|
||
+ * m_timer->start();
|
||
+ * moreData();
|
||
+ * }
|
||
+ *
|
||
+ * void PushStream::enoughData()
|
||
+ * {
|
||
+ * m_timer->stop();
|
||
+ * }
|
||
+ * \endcode
|
||
+ *
|
||
+ * Pull:
|
||
+ * \code
|
||
+ * PullStream::PullStream(QObject *parent)
|
||
+ * : AbstractMediaStream2(parent)
|
||
+ * {
|
||
+ * setStreamSize(getMediaStreamSize());
|
||
+ * }
|
||
+ *
|
||
+ * void PullStream::needData()
|
||
+ * {
|
||
+ * const QByteArray data = getMediaData();
|
||
+ * if (data.isEmpty()) {
|
||
+ * endOfData();
|
||
+ * } else {
|
||
+ * writeData(data);
|
||
+ * }
|
||
+ * }
|
||
+ * \endcode
|
||
+ *
|
||
+ * \ingroup Playback
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+class PHONON_EXPORT AbstractMediaStream2 : public AbstractMediaStream
|
||
+{
|
||
+ Q_OBJECT
|
||
+ Q_DECLARE_PRIVATE(AbstractMediaStream2)
|
||
+ friend class MediaObject;
|
||
+ friend class MediaObjectPrivate;
|
||
+ friend class MediaSourcePrivate;
|
||
+ protected:
|
||
+ /////////////////////////////////////////////////////////////
|
||
+ // functions an implementation will call:
|
||
+ /////////////////////////////////////////////////////////////
|
||
+
|
||
+ /**
|
||
+ * Constructs an AbstractMediaStream2 object with a \p parent.
|
||
+ */
|
||
+ explicit AbstractMediaStream2(QObject *parent = 0);
|
||
+
|
||
+ void resetDone();
|
||
+ void seekStreamDone();
|
||
+
|
||
+ /////////////////////////////////////////////////////////////
|
||
+ // functions to implement:
|
||
+ /////////////////////////////////////////////////////////////
|
||
+
|
||
+ /**
|
||
+ * Reimplement this function to be notified when the backend needs data.
|
||
+ *
|
||
+ * When this function is called you should try to call writeData or endOfData before
|
||
+ * returning.
|
||
+ *
|
||
+ * \param size The number of bytes that are needed. If possible, pass \p size bytes of media
|
||
+ * data in the next writeData call.
|
||
+ */
|
||
+ virtual void needData(quint32 size) = 0;
|
||
+
|
||
+ /////////////////////////////////////////////////////////////
|
||
+ // internal
|
||
+ /////////////////////////////////////////////////////////////
|
||
+
|
||
+ bool event(QEvent *e);
|
||
+ AbstractMediaStream2(AbstractMediaStream2Private &dd, QObject *parent);
|
||
+
|
||
+ private:
|
||
+ // hide needData() explicitly
|
||
+ virtual void needData() {}
|
||
+
|
||
+ Q_PRIVATE_SLOT(d_func(), void _k_handleStreamEvent())
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+#endif // PHONON_ABSTRACTMEDIASTREAM2_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractmediastream2_p.h b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2_p.h
|
||
new file mode 100644
|
||
index 0000000..e06e08d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractmediastream2_p.h
|
||
@@ -0,0 +1,67 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007 Matthias Kretz <kretz@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 ABSTRACTMEDIASTREAM2_P_H
|
||
+#define ABSTRACTMEDIASTREAM2_P_H
|
||
+
|
||
+#include "phonon_export.h"
|
||
+#include "abstractmediastream2.h"
|
||
+#include "abstractmediastream_p.h"
|
||
+#include "mediaobject_p.h"
|
||
+
|
||
+#include "medianodedestructionhandler_p.h"
|
||
+#include "streameventqueue_p.h"
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+class MediaObjectPrivate;
|
||
+class QAbstractEventDispatcher;
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+class PHONON_EXPORT AbstractMediaStream2Private : public AbstractMediaStreamPrivate, private LockFreeQueueBase::DataReadyHandler
|
||
+{
|
||
+ friend class MediaObject;
|
||
+ friend class MediaSourcePrivate;
|
||
+ Q_DECLARE_PUBLIC(AbstractMediaStream2)
|
||
+ protected:
|
||
+ AbstractMediaStream2Private();
|
||
+ ~AbstractMediaStream2Private();
|
||
+
|
||
+ virtual void setStreamSize(qint64 newSize);
|
||
+ virtual void setStreamSeekable(bool s);
|
||
+ virtual void writeData(const QByteArray &data);
|
||
+ virtual void endOfData();
|
||
+ virtual void dataReady();
|
||
+ void _k_handleStreamEvent();
|
||
+
|
||
+ StreamEventQueue *streamEventQueue;
|
||
+ QAbstractEventDispatcher *eventDispatcher;
|
||
+ int connectReset;
|
||
+ bool firstConnect;
|
||
+};
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+#endif // ABSTRACTMEDIASTREAM2_P_H
|
||
+// vim: sw=4 sts=4 et tw=100
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..67a0431
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.cpp
|
||
@@ -0,0 +1,122 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU General Public License as
|
||
+ published by the Free Software Foundation; either version 2 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 14 of version 3 of the license.
|
||
+
|
||
+ This program 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 General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU General Public License
|
||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+
|
||
+*/
|
||
+#include "abstractvideodataoutput.h"
|
||
+#include "abstractvideodataoutput_p.h"
|
||
+#include "videodataoutputinterface.h"
|
||
+#include "factory_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+AbstractVideoDataOutput::AbstractVideoDataOutput()
|
||
+ : AbstractVideoOutput(*new AbstractVideoDataOutputPrivate)
|
||
+{
|
||
+ K_D(AbstractVideoDataOutput);
|
||
+ d->isRunning = false;
|
||
+ d->allowedFormats << VideoFrame2::Format_RGB888;
|
||
+}
|
||
+
|
||
+AbstractVideoDataOutput::AbstractVideoDataOutput(AbstractVideoDataOutputPrivate &dd)
|
||
+ : AbstractVideoOutput(dd)
|
||
+{
|
||
+}
|
||
+
|
||
+AbstractVideoDataOutput::~AbstractVideoDataOutput()
|
||
+{
|
||
+ setRunning(false);
|
||
+}
|
||
+
|
||
+QSet<VideoFrame2::Format> AbstractVideoDataOutput::allowedFormats() const
|
||
+{
|
||
+ K_D(const AbstractVideoDataOutput);
|
||
+ return d->allowedFormats;
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutput::setAllowedFormats(const QSet<VideoFrame2::Format> &allowedFormats)
|
||
+{
|
||
+ K_D(AbstractVideoDataOutput);
|
||
+ d->allowedFormats = allowedFormats;
|
||
+}
|
||
+
|
||
+bool AbstractVideoDataOutput::isRunning() const
|
||
+{
|
||
+ K_D(const AbstractVideoDataOutput);
|
||
+ return d->isRunning;
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutput::setRunning(bool running)
|
||
+{
|
||
+ K_D(AbstractVideoDataOutput);
|
||
+ d->isRunning = running;
|
||
+ Iface<VideoDataOutputInterface> iface(d);
|
||
+ if (iface) {
|
||
+ if (running) {
|
||
+ iface->setFrontendObject(this);
|
||
+ } else {
|
||
+ iface->setFrontendObject(0);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutput::start()
|
||
+{
|
||
+ setRunning(true);
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutput::stop()
|
||
+{
|
||
+ setRunning(false);
|
||
+}
|
||
+
|
||
+bool AbstractVideoDataOutputPrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ return AbstractVideoOutputPrivate::aboutToDeleteBackendObject();
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutputPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_Q(AbstractVideoDataOutput);
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ //AbstractVideoOutputPrivate::setupBackendObject();
|
||
+ if (isRunning) {
|
||
+ Iface<VideoDataOutputInterface> iface(this);
|
||
+ if (iface) {
|
||
+ iface->setFrontendObject(q);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void AbstractVideoDataOutputPrivate::createBackendObject()
|
||
+{
|
||
+ if (m_backendObject)
|
||
+ return;
|
||
+ //Q_Q(AbstractVideoDataOutput);
|
||
+ m_backendObject = Factory::createVideoDataOutput(0);
|
||
+ if (m_backendObject) {
|
||
+ setupBackendObject();
|
||
+ }
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.h b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..d66e97d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput.h
|
||
@@ -0,0 +1,107 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2008 Matthias Kretz <kretz@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_X_ABSTRACTVIDEODATAOUTPUT_H
|
||
+#define PHONON_X_ABSTRACTVIDEODATAOUTPUT_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../abstractvideooutput.h"
|
||
+#include "../phonondefs.h"
|
||
+#include <QtCore/QObject>
|
||
+#include "videoframe2.h"
|
||
+
|
||
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||
+template<typename T> class QSet;
|
||
+#endif
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AbstractVideoDataOutputPrivate;
|
||
+
|
||
+/**
|
||
+ * \short This class gives you the video data.
|
||
+ *
|
||
+ * This class implements a special AbstractVideoOutput that gives your
|
||
+ * application the video data.
|
||
+ *
|
||
+ * You can also use the video data for further processing (e.g. encoding and
|
||
+ * saving to a file).
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ *
|
||
+ * \see VideoDataOutput2
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT AbstractVideoDataOutput : public AbstractVideoOutput
|
||
+{
|
||
+ K_DECLARE_PRIVATE(AbstractVideoDataOutput)
|
||
+
|
||
+ public:
|
||
+ /**
|
||
+ * Constructs an AbstractVideoDataOutput
|
||
+ */
|
||
+ AbstractVideoDataOutput();
|
||
+ ~AbstractVideoDataOutput();
|
||
+
|
||
+ /**
|
||
+ * Lists the formats this output is allowed to pass via frameReady.
|
||
+ */
|
||
+ virtual QSet<VideoFrame2::Format> allowedFormats() const;
|
||
+
|
||
+ // TODO: consider to remove the following function and make the above pure virtual
|
||
+ /**
|
||
+ * Defaults to VideoFrame2::Format_RGB888.
|
||
+ */
|
||
+ void setAllowedFormats(const QSet<VideoFrame2::Format> &);
|
||
+
|
||
+ bool isRunning() const;
|
||
+
|
||
+ /**
|
||
+ * This function is called whenever a frame should be displayed.
|
||
+ *
|
||
+ * \warning frameReady can get called from any thread (other than the
|
||
+ * main thread or the thread affinity of this QObject). A common error to create a deadlock
|
||
+ * situation is to block the thread this function is called from, until the main thread
|
||
+ * has found time to handle the frame. If it is blocking while the main thread decides to
|
||
+ * stop/delete the MediaObject you might get a deadlock.
|
||
+ */
|
||
+ virtual void frameReady(const VideoFrame2 &) = 0;
|
||
+
|
||
+ /**
|
||
+ * This function is called after the last frameReady of a MediaObject was called.
|
||
+ */
|
||
+ virtual void endOfMedia() = 0;
|
||
+
|
||
+ void setRunning(bool running);
|
||
+ void start();
|
||
+ void stop();
|
||
+
|
||
+ protected:
|
||
+ AbstractVideoDataOutput(AbstractVideoDataOutputPrivate &dd);
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} //namespace Phonon
|
||
+
|
||
+#endif // PHONON_X_ABSTRACTVIDEODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput_p.h b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput_p.h
|
||
new file mode 100644
|
||
index 0000000..268abd4
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/abstractvideodataoutput_p.h
|
||
@@ -0,0 +1,50 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_ABSTRACTVIDEODATAOUTPUT_P_H
|
||
+#define PHONON_X_ABSTRACTVIDEODATAOUTPUT_P_H
|
||
+
|
||
+#include "abstractvideodataoutput.h"
|
||
+#include "../abstractvideooutput_p.h"
|
||
+#include <QtCore/QSet>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AbstractVideoDataOutputPrivate : public Phonon::AbstractVideoOutputPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AbstractVideoDataOutput)
|
||
+ protected:
|
||
+ virtual bool aboutToDeleteBackendObject();
|
||
+ virtual void createBackendObject();
|
||
+ void setupBackendObject();
|
||
+
|
||
+ private:
|
||
+ bool isRunning;
|
||
+ QSet<VideoFrame2::Format> allowedFormats;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_X_ABSTRACTVIDEODATAOUTPUT_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audiodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/audiodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..62b3b87
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audiodataoutput.cpp
|
||
@@ -0,0 +1,74 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005 Matthias Kretz <kretz@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 "audiodataoutput.h"
|
||
+#include "audiodataoutput_p.h"
|
||
+#include "factory_p.h"
|
||
+
|
||
+#define PHONON_CLASSNAME AudioDataOutput
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+PHONON_HEIR_IMPL(AbstractAudioOutput)
|
||
+
|
||
+PHONON_GETTER(Phonon::Experimental::AudioDataOutput::Format, format, d->format)
|
||
+PHONON_GETTER(int, dataSize, d->dataSize)
|
||
+PHONON_GETTER(int, sampleRate, -1)
|
||
+PHONON_SETTER(setFormat, format, Phonon::Experimental::AudioDataOutput::Format)
|
||
+PHONON_SETTER(setDataSize, dataSize, int)
|
||
+
|
||
+bool AudioDataOutputPrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ pBACKEND_GET(Phonon::Experimental::AudioDataOutput::Format, format, "format");
|
||
+ pBACKEND_GET(int, dataSize, "dataSize");
|
||
+
|
||
+ return AbstractAudioOutputPrivate::aboutToDeleteBackendObject();
|
||
+}
|
||
+
|
||
+void AudioDataOutputPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_Q(AudioDataOutput);
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ AbstractAudioOutputPrivate::setupBackendObject();
|
||
+
|
||
+ // set up attributes
|
||
+ pBACKEND_CALL1("setFormat", Phonon::Experimental::AudioDataOutput::Format, format);
|
||
+ pBACKEND_CALL1("setDataSize", int, dataSize);
|
||
+ QObject::connect(m_backendObject,
|
||
+ SIGNAL(dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<qint16> > &)),
|
||
+ q, SIGNAL(dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<qint16> > &)));
|
||
+ QObject::connect(m_backendObject,
|
||
+ SIGNAL(dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<float> > &)),
|
||
+ q, SIGNAL(dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<float> > &)));
|
||
+ QObject::connect(m_backendObject, SIGNAL(endOfMedia(int)), q, SIGNAL(endOfMedia(int)));
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "audiodataoutput.moc"
|
||
+
|
||
+#undef PHONON_CLASSNAME
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audiodataoutput.h b/src/3rdparty/phonon/phonon/experimental/audiodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..f9547d3
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audiodataoutput.h
|
||
@@ -0,0 +1,189 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2006 Matthias Kretz <kretz@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_AUDIODATAOUTPUT_H
|
||
+#define Phonon_AUDIODATAOUTPUT_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../abstractaudiooutput.h"
|
||
+#include "../phonondefs.h"
|
||
+
|
||
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||
+template<typename T> class QVector;
|
||
+template<typename Key, typename T> class QMap;
|
||
+#endif
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+ class AudioDataOutputPrivate;
|
||
+
|
||
+ /**
|
||
+ * \short This class gives you the audio data (for visualizations).
|
||
+ *
|
||
+ * This class implements a special AbstractAudioOutput that gives your
|
||
+ * application the audio data. Don't expect realtime performance. But
|
||
+ * the latencies should be low enough to use the audio data for
|
||
+ * visualizations. You can also use the audio data for further processing
|
||
+ * (e.g. encoding and saving to a file).
|
||
+ *
|
||
+ * The class supports different data formats. One of the most common formats
|
||
+ * is to read vectors of integers (which will only use 16 Bit), but you can
|
||
+ * also request floats which some backends use internally.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+ class PHONONEXPERIMENTAL_EXPORT AudioDataOutput : public AbstractAudioOutput
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(AudioDataOutput)
|
||
+ Q_ENUMS(Channel Format)
|
||
+ Q_PROPERTY(Format format READ format WRITE setFormat)
|
||
+ Q_PROPERTY(int dataSize READ dataSize WRITE setDataSize)
|
||
+ PHONON_HEIR(AudioDataOutput)
|
||
+ public:
|
||
+ /**
|
||
+ * Specifies the channel the audio data belongs to.
|
||
+ */
|
||
+ enum Channel
|
||
+ {
|
||
+ LeftChannel,
|
||
+ RightChannel,
|
||
+ CenterChannel,
|
||
+ LeftSurroundChannel,
|
||
+ RightSurroundChannel,
|
||
+ SubwooferChannel
|
||
+ };
|
||
+
|
||
+ /**
|
||
+ * Used for telling the object whether you want 16 bit Integers or
|
||
+ * 32 bit floats.
|
||
+ *
|
||
+ * \see requestFormat
|
||
+ */
|
||
+ enum Format
|
||
+ {
|
||
+ /**
|
||
+ * Requests 16 bit signed integers.
|
||
+ *
|
||
+ * \see dataReady(const QVector<qint16> &)
|
||
+ */
|
||
+ IntegerFormat = 1,
|
||
+ /**
|
||
+ * Requests 32 bit floating point: signed, zero centered, and
|
||
+ * normalized to the unit value (-1.0 to 1.0).
|
||
+ *
|
||
+ * \see dataReady(const QVector<float> &)
|
||
+ */
|
||
+ FloatFormat = 2
|
||
+ };
|
||
+
|
||
+ /**
|
||
+ * Returns the currently used format.
|
||
+ *
|
||
+ * \see setFormat
|
||
+ */
|
||
+ Format format() const;
|
||
+
|
||
+ /**
|
||
+ * Returns the currently used number of samples passed through
|
||
+ * the signal.
|
||
+ *
|
||
+ * \see setDataSize
|
||
+ */
|
||
+ int dataSize() const;
|
||
+
|
||
+ /**
|
||
+ * Returns the sample rate in Hz. Common sample rates are 44100 Hz
|
||
+ * and 48000 Hz. AudioDataOutput will not do any sample rate
|
||
+ * conversion for you. If you need to convert the sample rate you
|
||
+ * might want to take a look at libsamplerate. For visualizations it
|
||
+ * is often enough to do simple interpolation or even drop/duplicate
|
||
+ * samples.
|
||
+ *
|
||
+ * \return The sample rate as reported by the backend. If the
|
||
+ * backend is unavailable -1 is returned.
|
||
+ */
|
||
+ int sampleRate() const;
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ /**
|
||
+ * Requests the dataformat you'd like to receive. Only one of the
|
||
+ * signals of this class will be emitted when new data is ready.
|
||
+ *
|
||
+ * The default format is IntegerFormat.
|
||
+ *
|
||
+ * \see format()
|
||
+ */
|
||
+ void setFormat(Format format);
|
||
+
|
||
+ /**
|
||
+ * Sets the number of samples to be passed in one signal emission.
|
||
+ *
|
||
+ * Defaults to 512 samples per emitted signal.
|
||
+ *
|
||
+ * \param size the number of samples
|
||
+ */
|
||
+ void setDataSize(int size);
|
||
+
|
||
+ Q_SIGNALS:
|
||
+ /**
|
||
+ * Emitted whenever another dataSize number of samples are ready and
|
||
+ * format is set to IntegerFormat.
|
||
+ *
|
||
+ * If format is set to FloatFormat the signal is not emitted at all.
|
||
+ *
|
||
+ * \param data A mapping of Channel to a vector holding the audio data.
|
||
+ */
|
||
+ void dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<qint16> > &data);
|
||
+
|
||
+ /**
|
||
+ * Emitted whenever another dataSize number of samples are ready and
|
||
+ * format is set to FloatFormat.
|
||
+ *
|
||
+ * If format is set to IntegerFormat the signal is not emitted at all.
|
||
+ *
|
||
+ * \param data A mapping of Channel to a vector holding the audio data.
|
||
+ */
|
||
+ void dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<float> > &data);
|
||
+
|
||
+ /**
|
||
+ * This signal is emitted before the last dataReady signal of a
|
||
+ * media is emitted.
|
||
+ *
|
||
+ * If, for example, the playback of a media file has finished and the
|
||
+ * last audio data of that file is going to be passed with the next
|
||
+ * dataReady signal, and only the 28 first samples of the data
|
||
+ * vector are from that media file endOfMedia will be emitted right
|
||
+ * before dataReady with \p remainingSamples = 28.
|
||
+ *
|
||
+ * \param remainingSamples The number of samples in the next
|
||
+ * dataReady vector that belong to the media that was playing to
|
||
+ * this point.
|
||
+ */
|
||
+ void endOfMedia(int remainingSamples);
|
||
+ };
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // Phonon_AUDIODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audiodataoutput_p.h b/src/3rdparty/phonon/phonon/experimental/audiodataoutput_p.h
|
||
new file mode 100644
|
||
index 0000000..9cbfcc3
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audiodataoutput_p.h
|
||
@@ -0,0 +1,53 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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 AUDIODATAOUTPUT_P_H
|
||
+#define AUDIODATAOUTPUT_P_H
|
||
+
|
||
+#include "audiodataoutput.h"
|
||
+#include "../abstractaudiooutput_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AudioDataOutputPrivate : public AbstractAudioOutputPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AudioDataOutput)
|
||
+ PHONON_PRIVATECLASS
|
||
+ protected:
|
||
+ AudioDataOutputPrivate()
|
||
+ : format(AudioDataOutput::IntegerFormat)
|
||
+ , dataSize(512)
|
||
+ {
|
||
+ }
|
||
+
|
||
+ AudioDataOutput::Format format;
|
||
+ int dataSize;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // AUDIODATAOUTPUT_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audiodataoutputinterface.h b/src/3rdparty/phonon/phonon/experimental/audiodataoutputinterface.h
|
||
new file mode 100644
|
||
index 0000000..866c7a2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audiodataoutputinterface.h
|
||
@@ -0,0 +1,47 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_AUDIODATAOUTPUTINTERFACE_H
|
||
+#define PHONON_X_AUDIODATAOUTPUTINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AbstractAudioDataOutput;
|
||
+
|
||
+class AudioDataOutputInterface
|
||
+{
|
||
+ public:
|
||
+ virtual ~AudioDataOutputInterface() {}
|
||
+
|
||
+ virtual AbstractAudioDataOutput *frontendObject() const = 0;
|
||
+ virtual void setFrontendObject(AbstractAudioDataOutput *) = 0;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::Experimental::AudioDataOutputInterface, "0AudioDataOutputInterface.phonon.kde.org")
|
||
+
|
||
+#endif // PHONON_X_AUDIODATAOUTPUTINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audioformat.cpp b/src/3rdparty/phonon/phonon/experimental/audioformat.cpp
|
||
new file mode 100644
|
||
index 0000000..502e0b0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audioformat.cpp
|
||
@@ -0,0 +1,111 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "audioformat.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AudioFormatPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AudioFormat)
|
||
+ protected:
|
||
+ AudioFormat *q_ptr;
|
||
+};
|
||
+
|
||
+AudioFormat::AudioFormat(int sampleRate, int channelCount, Phonon::Experimental::BitRate bitRate, QSysInfo::Endian byteOrder)
|
||
+{
|
||
+ s.m_sampleRate = sampleRate;
|
||
+ s.m_channelCount = channelCount;
|
||
+ s.m_bitRate = bitRate;
|
||
+ s.m_byteOrder = byteOrder;
|
||
+}
|
||
+
|
||
+AudioFormat::~AudioFormat()
|
||
+{
|
||
+}
|
||
+
|
||
+int AudioFormat::sampleRate() const
|
||
+{
|
||
+ return s.m_sampleRate;
|
||
+}
|
||
+
|
||
+int AudioFormat::channelCount() const
|
||
+{
|
||
+ return s.m_channelCount;
|
||
+}
|
||
+
|
||
+Phonon::Experimental::BitRate AudioFormat::bitRate() const
|
||
+{
|
||
+ return s.m_bitRate;
|
||
+}
|
||
+
|
||
+QSysInfo::Endian AudioFormat::byteOrder() const
|
||
+{
|
||
+ return s.m_byteOrder;
|
||
+}
|
||
+
|
||
+AudioFormat::AudioFormat(const AudioFormat &f)
|
||
+{
|
||
+ s.m_sampleRate = f.sampleRate();
|
||
+ s.m_channelCount = f.channelCount();
|
||
+ s.m_bitRate = f.bitRate();
|
||
+ s.m_byteOrder = f.byteOrder();
|
||
+}
|
||
+
|
||
+AudioFormat &AudioFormat::operator=(const AudioFormat &f)
|
||
+{
|
||
+ s.m_sampleRate = f.sampleRate();
|
||
+ s.m_channelCount = f.channelCount();
|
||
+ s.m_bitRate = f.bitRate();
|
||
+ s.m_byteOrder = f.byteOrder();
|
||
+ return *this;
|
||
+}
|
||
+
|
||
+bool AudioFormat::operator==(const AudioFormat &f) const
|
||
+{
|
||
+ return s.m_sampleRate == f.sampleRate() &&
|
||
+ s.m_channelCount == f.channelCount() &&
|
||
+ s.m_bitRate == f.bitRate() &&
|
||
+ s.m_byteOrder == f.byteOrder();
|
||
+}
|
||
+
|
||
+bool AudioFormat::operator<(const AudioFormat &f) const
|
||
+{
|
||
+ return s.m_bitRate < f.bitRate() ||
|
||
+ (s.m_bitRate == f.bitRate() && (s.m_sampleRate < f.sampleRate() ||
|
||
+ (s.m_sampleRate == f.sampleRate() && (s.m_channelCount < f.channelCount() ||
|
||
+ (s.m_channelCount == f.channelCount() && s.m_byteOrder != QSysInfo::ByteOrder && f.byteOrder() == QSysInfo::ByteOrder)))));
|
||
+}
|
||
+
|
||
+quint32 AudioFormat::key() const
|
||
+{
|
||
+ return (s.m_byteOrder == QSysInfo::ByteOrder ? 1 : 0) + // 1 bit least significant
|
||
+ (s.m_channelCount << 1) + // give it 8 bits
|
||
+ (s.m_sampleRate) + // 192kHz ~ 18 bits (let the (unimportant) lower 9 bits overlap with channels + byteOrder)
|
||
+ (s.m_bitRate << 18); // most significant
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audioformat.h b/src/3rdparty/phonon/phonon/experimental/audioformat.h
|
||
new file mode 100644
|
||
index 0000000..ee19e44
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audioformat.h
|
||
@@ -0,0 +1,100 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_AUDIOFORMAT_H
|
||
+#define PHONON_X_AUDIOFORMAT_H
|
||
+
|
||
+#include <QtCore/QtGlobal>
|
||
+#include "phononnamespace.h"
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AudioFormatPrivate;
|
||
+class AudioFormat
|
||
+{
|
||
+ //Q_DECLARE_PRIVATE(AudioFormat)
|
||
+ public:
|
||
+ AudioFormat(int sampleRate = 48000, int channelCount = 2, Phonon::Experimental::BitRate bitRate = Phonon::Experimental::Signed16Bit, QSysInfo::Endian byteOrder = QSysInfo::ByteOrder);
|
||
+ AudioFormat(const AudioFormat &);
|
||
+ ~AudioFormat();
|
||
+
|
||
+ AudioFormat &operator=(const AudioFormat &);
|
||
+
|
||
+ int sampleRate() const;
|
||
+ int channelCount() const;
|
||
+ Phonon::Experimental::BitRate bitRate() const;
|
||
+ QSysInfo::Endian byteOrder() const;
|
||
+
|
||
+ bool operator==(const AudioFormat &) const;
|
||
+ inline bool operator!=(const AudioFormat &f) const { return !operator==(f); }
|
||
+
|
||
+ /**
|
||
+ * ess than operator for sorting:
|
||
+ * A Format is considered smaller if
|
||
+ * - smaller bit rate
|
||
+ * - smaller sample rate
|
||
+ * - less channels
|
||
+ * - non-native byte order
|
||
+ */
|
||
+ bool operator<(const AudioFormat &) const;
|
||
+
|
||
+ quint32 key() const;
|
||
+
|
||
+ private:
|
||
+ union
|
||
+ {
|
||
+ struct
|
||
+ {
|
||
+ int m_sampleRate;
|
||
+ int m_channelCount;
|
||
+ Phonon::Experimental::BitRate m_bitRate;
|
||
+ QSysInfo::Endian m_byteOrder;
|
||
+ } s;
|
||
+ // for future use:
|
||
+ AudioFormatPrivate *d_ptr;
|
||
+ };
|
||
+};
|
||
+
|
||
+inline uint qHash(const AudioFormat &p)
|
||
+{
|
||
+ return p.key();
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#if defined(Q_CC_MSVC) && _MSC_VER <= 1300
|
||
+//this ensures that code outside Phonon can use the hash function
|
||
+//it also a workaround for some compilers
|
||
+inline uint qHash(const Phonon::Experimental::AudioFormat &p) { return Phonon::Experimental::qHash(p); } //krazy:exclude=inline
|
||
+#endif
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+#endif // PHONON_X_AUDIOFORMAT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/audiowriter.h b/src/3rdparty/phonon/phonon/experimental/audiowriter.h
|
||
new file mode 100644
|
||
index 0000000..36c44c4
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/audiowriter.h
|
||
@@ -0,0 +1,61 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_AUDIOWRITER_H
|
||
+#define PHONON_AUDIOWRITER_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../abstractaudiooutput.h"
|
||
+#include "../phonondefs.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AudioWriterPrivate;
|
||
+class PHONONEXPERIMENTAL_EXPORT AudioWriter : public AbstractAudioOutput
|
||
+{
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(AudioWriter)
|
||
+ PHONON_HEIR(AudioWriter)
|
||
+ /**
|
||
+ * This property defines the codec to be used for encoding the audio signal.
|
||
+ * Possible codecs can be retrieved from BackendCapabilities using the
|
||
+ * availableAudioCodecs() function.
|
||
+ *
|
||
+ * The default codec is an invalid codec (audioCodec().isValid() == false)
|
||
+ */
|
||
+ Q_PROPERTY(AudioCodec audioCodec READ audioCodec WRITE setAudioCodec)
|
||
+ public:
|
||
+ AudioCodec audioCodec() const;
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ setAudioCodec(AudioCodec audioCodec);
|
||
+ // codec parameters? reuse EffectParameter class?
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_AUDIOWRITER_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avcapture.cpp b/src/3rdparty/phonon/phonon/experimental/avcapture.cpp
|
||
new file mode 100644
|
||
index 0000000..570ed7e
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avcapture.cpp
|
||
@@ -0,0 +1,131 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2006, 2008 Matthias Kretz <kretz@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 "avcapture.h"
|
||
+#include "avcaptureinterface.h"
|
||
+#include "avcapture_p.h"
|
||
+#include "factory_p.h"
|
||
+#include "objectdescription.h"
|
||
+#include "globalconfig.h"
|
||
+
|
||
+#define PHONON_CLASSNAME AvCapture
|
||
+#define PHONON_INTERFACENAME AvCaptureInterface
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+PHONON_OBJECT_IMPL
|
||
+
|
||
+void AvCapture::start()
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ if (d->backendObject()) {
|
||
+ INTERFACE_CALL(start());
|
||
+ }
|
||
+}
|
||
+
|
||
+void AvCapture::stop()
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ if (d->backendObject()) {
|
||
+ INTERFACE_CALL(stop());
|
||
+ }
|
||
+}
|
||
+
|
||
+AudioCaptureDevice AvCapture::audioCaptureDevice() const
|
||
+{
|
||
+ K_D(const AvCapture);
|
||
+ if (d->m_backendObject) {
|
||
+ return INTERFACE_CALL(audioCaptureDevice());
|
||
+ }
|
||
+ return d->audioCaptureDevice;
|
||
+}
|
||
+
|
||
+void AvCapture::setAudioCaptureDevice(const AudioCaptureDevice &audioCaptureDevice)
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ d->audioCaptureDevice = audioCaptureDevice;
|
||
+ if (d->m_backendObject) {
|
||
+ INTERFACE_CALL(setAudioCaptureDevice(d->audioCaptureDevice));
|
||
+ }
|
||
+}
|
||
+
|
||
+void AvCapture::setAudioCaptureDevice(Phonon::Category category)
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ d->audioCaptureDevice = AudioCaptureDevice::fromIndex(GlobalConfig().audioCaptureDeviceFor(category));
|
||
+ if (d->m_backendObject) {
|
||
+ INTERFACE_CALL(setAudioCaptureDevice(d->audioCaptureDevice));
|
||
+ }
|
||
+}
|
||
+
|
||
+VideoCaptureDevice AvCapture::videoCaptureDevice() const
|
||
+{
|
||
+ K_D(const AvCapture);
|
||
+ if (d->m_backendObject) {
|
||
+ return INTERFACE_CALL(videoCaptureDevice());
|
||
+ }
|
||
+ return d->videoCaptureDevice;
|
||
+}
|
||
+
|
||
+void AvCapture::setVideoCaptureDevice(const VideoCaptureDevice &videoCaptureDevice)
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ d->videoCaptureDevice = videoCaptureDevice;
|
||
+ if (d->m_backendObject) {
|
||
+ INTERFACE_CALL(setVideoCaptureDevice(d->videoCaptureDevice));
|
||
+ }
|
||
+}
|
||
+
|
||
+void AvCapture::setVideoCaptureDevice(Phonon::Category category)
|
||
+{
|
||
+ K_D(AvCapture);
|
||
+ d->videoCaptureDevice = VideoCaptureDevice::fromIndex(GlobalConfig().videoCaptureDeviceFor(category));
|
||
+ if (d->m_backendObject) {
|
||
+ INTERFACE_CALL(setVideoCaptureDevice(d->videoCaptureDevice));
|
||
+ }
|
||
+}
|
||
+
|
||
+bool AvCapturePrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ audioCaptureDevice = pINTERFACE_CALL(audioCaptureDevice());
|
||
+ videoCaptureDevice = pINTERFACE_CALL(videoCaptureDevice());
|
||
+ return true;
|
||
+}
|
||
+
|
||
+void AvCapturePrivate::setupBackendObject()
|
||
+{
|
||
+ Q_ASSERT(m_backendObject);
|
||
+
|
||
+ // set up attributes
|
||
+ pINTERFACE_CALL(setAudioCaptureDevice(audioCaptureDevice));
|
||
+ pINTERFACE_CALL(setVideoCaptureDevice(videoCaptureDevice));
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "moc_avcapture.cpp"
|
||
+
|
||
+#undef PHONON_CLASSNAME
|
||
+#undef PHONON_INTERFACENAME
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avcapture.h b/src/3rdparty/phonon/phonon/experimental/avcapture.h
|
||
new file mode 100644
|
||
index 0000000..cf3e6bf
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avcapture.h
|
||
@@ -0,0 +1,123 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2006, 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_AVCAPTURE_H
|
||
+#define PHONON_EXPERIMENTAL_AVCAPTURE_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../medianode.h"
|
||
+#include "../phonondefs.h"
|
||
+#include "objectdescription.h"
|
||
+#include "../phononnamespace.h"
|
||
+
|
||
+class QString;
|
||
+class QStringList;
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+ class AvCapturePrivate;
|
||
+
|
||
+ /**
|
||
+ * @short Media data from a soundcard, soundserver, camera or any other
|
||
+ * hardware device supported by the backend.
|
||
+ *
|
||
+ * This class gives you access to the capture capabilities of the backend.
|
||
+ * There might be more than only one possible capture source, for audio, as
|
||
+ * well as for video. The list of available sources is available through
|
||
+ * BackendCapabilities::availableAudioCaptureDevices and
|
||
+ * BackendCapabilities::availableVideoCaptureDevices.
|
||
+ *
|
||
+ * @ingroup Recording
|
||
+ * @author Matthias Kretz <kretz@kde.org>
|
||
+ * @see BackendCapabilities::availableAudioCaptureDevices
|
||
+ * @see BackendCapabilities::availableVideoCaptureDevices
|
||
+ */
|
||
+ class PHONONEXPERIMENTAL_EXPORT AvCapture : public QObject, public Phonon::MediaNode
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(AvCapture)
|
||
+ PHONON_OBJECT(AvCapture)
|
||
+ Q_PROPERTY(AudioCaptureDevice audioCaptureDevice READ audioCaptureDevice WRITE setAudioCaptureDevice)
|
||
+ Q_PROPERTY(VideoCaptureDevice videoCaptureDevice READ videoCaptureDevice WRITE setVideoCaptureDevice)
|
||
+ public:
|
||
+ /**
|
||
+ * Returns the currently used capture source for the audio signal.
|
||
+ *
|
||
+ * @see AudioCaptureDevice
|
||
+ * @see setAudioCaptureDevice(const AudioCaptureDevice &)
|
||
+ * @see setAudioCaptureDevice(int)
|
||
+ */
|
||
+ AudioCaptureDevice audioCaptureDevice() const;
|
||
+
|
||
+ /**
|
||
+ * Returns the currently used capture source for the video signal.
|
||
+ *
|
||
+ * @see VideoCaptureDevice
|
||
+ * @see setVideoCaptureDevice(const VideoCaptureDevice &)
|
||
+ * @see setVideoCaptureDevice(int)
|
||
+ */
|
||
+ VideoCaptureDevice videoCaptureDevice() const;
|
||
+
|
||
+ /**
|
||
+ * Sets the audio capture source to use.
|
||
+ *
|
||
+ * @param source An object of class AudioCaptureDevice. A list of
|
||
+ * available objects can be queried from
|
||
+ * BackendCapabilities::availableAudioCaptureDevices.
|
||
+ *
|
||
+ * @see audioCaptureDevice
|
||
+ * @see setAudioCaptureDevice(int)
|
||
+ */
|
||
+ void setAudioCaptureDevice(const AudioCaptureDevice &source);
|
||
+ void setAudioCaptureDevice(Phonon::Category category);
|
||
+
|
||
+ /**
|
||
+ * Sets the video capture source to use.
|
||
+ *
|
||
+ * @param source An object of class VideoCaptureDevice. A list of
|
||
+ * available objects can be queried from
|
||
+ * BackendCapabilities::availableVideoCaptureDevices.
|
||
+ *
|
||
+ * @see videoCaptureDevice
|
||
+ * @see setVideoCaptureDevice(int)
|
||
+ */
|
||
+ void setVideoCaptureDevice(const VideoCaptureDevice &source);
|
||
+ void setVideoCaptureDevice(Phonon::Category category);
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ /**
|
||
+ * Start capture.
|
||
+ */
|
||
+ void start();
|
||
+
|
||
+ /**
|
||
+ * Stop capture.
|
||
+ */
|
||
+ void stop();
|
||
+ };
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_AVCAPTURE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avcapture_p.h b/src/3rdparty/phonon/phonon/experimental/avcapture_p.h
|
||
new file mode 100644
|
||
index 0000000..34627ed
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avcapture_p.h
|
||
@@ -0,0 +1,49 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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 AVCAPTURE_P_H
|
||
+#define AVCAPTURE_P_H
|
||
+
|
||
+#include "avcapture.h"
|
||
+#include "../medianode_p.h"
|
||
+#include "../phonondefs_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AvCapturePrivate : public MediaNodePrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AvCapture)
|
||
+ PHONON_PRIVATECLASS
|
||
+ public:
|
||
+ protected:
|
||
+ AudioCaptureDevice audioCaptureDevice;
|
||
+ VideoCaptureDevice videoCaptureDevice;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // AVCAPTURE_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avcaptureinterface.h b/src/3rdparty/phonon/phonon/experimental/avcaptureinterface.h
|
||
new file mode 100644
|
||
index 0000000..1641769
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avcaptureinterface.h
|
||
@@ -0,0 +1,50 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_AVCAPTUREINTERFACE_H
|
||
+#define PHONON_EXPERIMENTAL_AVCAPTUREINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AvCaptureInterface
|
||
+{
|
||
+ public:
|
||
+ virtual ~AvCaptureInterface() {}
|
||
+
|
||
+ virtual void start() = 0;
|
||
+ virtual void stop() = 0;
|
||
+
|
||
+ virtual AudioCaptureDevice audioCaptureDevice() const = 0;
|
||
+ virtual VideoCaptureDevice videoCaptureDevice() const = 0;
|
||
+ virtual void setAudioCaptureDevice(const AudioCaptureDevice &) = 0;
|
||
+ virtual void setVideoCaptureDevice(const VideoCaptureDevice &) = 0;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::Experimental::AvCaptureInterface, "0AvCaptureInterface.Phonon.kde.org")
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_AVCAPTUREINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avwriter.cpp b/src/3rdparty/phonon/phonon/experimental/avwriter.cpp
|
||
new file mode 100644
|
||
index 0000000..3019580
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avwriter.cpp
|
||
@@ -0,0 +1,43 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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 "avwriter.h"
|
||
+#include "avwriter_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+AvWriter::AvWriter(QObject *parent)
|
||
+ : QObject(parent)
|
||
+ , k_ptr(new AvWriterPrivate)
|
||
+{
|
||
+ K_D(AvWriter);
|
||
+ d->q_ptr = this;
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "avwriter.moc"
|
||
+// vim: sw=4 ts=4
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avwriter.h b/src/3rdparty/phonon/phonon/experimental/avwriter.h
|
||
new file mode 100644
|
||
index 0000000..3f0facf
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avwriter.h
|
||
@@ -0,0 +1,86 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_AVWRITER_H
|
||
+#define PHONON_AVWRITER_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../phonondefs.h"
|
||
+#include "../abstractaudiooutput.h"
|
||
+#include "../abstractvideooutput.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AvWriterPrivate;
|
||
+
|
||
+//TODO:
|
||
+// Container formats can support multiple audio, video and subtitle streams, a
|
||
+// control track (menus) and chapters. Anything else?
|
||
+// How should those features be mapped to this API? Multiple audio and video
|
||
+// streams should be covered already. Are the subtitle streams implicit
|
||
+// depending on the source material?
|
||
+// Chapters: call a method when to add a chapter? How does that map to a
|
||
+// specific frame/sample? Chapter support is probably overkill for Phonon.
|
||
+class PHONONEXPERIMENTAL_EXPORT AvWriter : public QObject
|
||
+{
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(AvWriter)
|
||
+ Q_PROPERTY(ContainerFormat containerFormat READ containerFormat WRITE setContainerFormat)
|
||
+ Q_PROPERTY(KUrl url READ url WRITE setUrl)
|
||
+ public:
|
||
+ /**
|
||
+ * Standard QObject constructor.
|
||
+ *
|
||
+ * \param parent QObject parent
|
||
+ */
|
||
+ AvWriter(QObject *parent);
|
||
+
|
||
+ KUrl url() const;
|
||
+ setUrl(const KUrl &url);
|
||
+
|
||
+ /**
|
||
+ * Creates a new AudioWriter object to be used for sending the audio
|
||
+ * data to this file
|
||
+ *
|
||
+ * \param streamName A name identifying the stream. Often this name is
|
||
+ * used for the language identifier.
|
||
+ *
|
||
+ * \return Returns the new AudioWriter object or 0 if the container
|
||
+ * format does not support multiple audio streams.
|
||
+ */
|
||
+ AudioWriter *addAudioStream(const QString &streamName);
|
||
+ VideoWriter *addVideoStream(const QString &streamName);
|
||
+
|
||
+ ContainerFormat containerFormat() const;
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ void setContainerFormat(ContainerFormat format);
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_AVWRITER_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/avwriter_p.h b/src/3rdparty/phonon/phonon/experimental/avwriter_p.h
|
||
new file mode 100644
|
||
index 0000000..8f42479
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/avwriter_p.h
|
||
@@ -0,0 +1,44 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_AVWRITER_P_H
|
||
+#define PHONON_AVWRITER_P_H
|
||
+
|
||
+#include "rtpsender.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AvWriterPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(AvWriter)
|
||
+ protected:
|
||
+ AvWriter *q_ptr;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_AVWRITER_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/backendcapabilities.cpp b/src/3rdparty/phonon/phonon/experimental/backendcapabilities.cpp
|
||
new file mode 100644
|
||
index 0000000..331c6d6
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/backendcapabilities.cpp
|
||
@@ -0,0 +1,41 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU General Public License as
|
||
+ published by the Free Software Foundation; either version 2 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 14 of version 3 of the license.
|
||
+
|
||
+ This program 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 General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU General Public License
|
||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+
|
||
+*/
|
||
+#include "backendcapabilities.h"
|
||
+#include "globalconfig.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+QList<VideoCaptureDevice> BackendCapabilities::availableVideoCaptureDevices()
|
||
+{
|
||
+ QList<VideoCaptureDevice> ret;
|
||
+ const QList<int> deviceIndexes = GlobalConfig().videoCaptureDeviceListFor(Phonon::NoCategory);
|
||
+ foreach (int i, deviceIndexes) {
|
||
+ ret.append(VideoCaptureDevice::fromIndex(i));
|
||
+ }
|
||
+ return ret;
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/backendcapabilities.h b/src/3rdparty/phonon/phonon/experimental/backendcapabilities.h
|
||
new file mode 100644
|
||
index 0000000..2a63f73
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/backendcapabilities.h
|
||
@@ -0,0 +1,46 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_BACKENDCAPABILITIES_H
|
||
+#define PHONON_EXPERIMENTAL_BACKENDCAPABILITIES_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "objectdescription.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+namespace BackendCapabilities
|
||
+{
|
||
+
|
||
+ /**
|
||
+ * Returns the video capture devices the backend supports.
|
||
+ *
|
||
+ * \return A list of VideoCaptureDevice objects that give a name and
|
||
+ * description for every supported video capture device.
|
||
+ */
|
||
+ PHONONEXPERIMENTAL_EXPORT QList<VideoCaptureDevice> availableVideoCaptureDevices();
|
||
+
|
||
+} // namespace BackendCapabilities
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+#endif // PHONON_EXPERIMENTAL_BACKENDCAPABILITIES_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/backendinterface.h b/src/3rdparty/phonon/phonon/experimental/backendinterface.h
|
||
new file mode 100644
|
||
index 0000000..1590dc1
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/backendinterface.h
|
||
@@ -0,0 +1,41 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_BACKENDINTERFACE_H
|
||
+#define PHONON_EXPERIMENTAL_BACKENDINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+namespace BackendInterface
|
||
+{
|
||
+enum Class {
|
||
+ VideoDataOutputClass = 0x10000,
|
||
+ AudioDataOutputClass,
|
||
+ VisualizationClass,
|
||
+ AvCaptureClass
|
||
+};
|
||
+} // namespace BackendInterface
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_BACKENDINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/export.h b/src/3rdparty/phonon/phonon/experimental/export.h
|
||
new file mode 100644
|
||
index 0000000..2ca8fba
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/export.h
|
||
@@ -0,0 +1,39 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007 Matthias Kretz <kretz@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_EXPERIMENTAL_EXPORT_H
|
||
+#define PHONON_EXPERIMENTAL_EXPORT_H
|
||
+
|
||
+/* needed for KDE_EXPORT and KDE_IMPORT macros */
|
||
+#include <QtCore/QtGlobal>
|
||
+
|
||
+#ifndef PHONONEXPERIMENTAL_EXPORT
|
||
+# if defined(MAKE_PHONONEXPERIMENTAL_LIB)
|
||
+ /* We are building this library */
|
||
+# define PHONONEXPERIMENTAL_EXPORT Q_DECL_EXPORT
|
||
+# else
|
||
+ /* We are using this library */
|
||
+# define PHONONEXPERIMENTAL_EXPORT Q_DECL_IMPORT
|
||
+# endif
|
||
+#endif
|
||
+
|
||
+#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/factory.cpp b/src/3rdparty/phonon/phonon/experimental/factory.cpp
|
||
new file mode 100644
|
||
index 0000000..f2b7daf
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/factory.cpp
|
||
@@ -0,0 +1,129 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU General Public License as
|
||
+ published by the Free Software Foundation; either version 2 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 14 of version 3 of the license.
|
||
+
|
||
+ This program 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 General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU General Public License
|
||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+
|
||
+*/
|
||
+
|
||
+#include "factory_p.h"
|
||
+#include "objectdescription.h"
|
||
+#include "../factory_p.h"
|
||
+#include "../globalstatic_p.h"
|
||
+#include "../backendinterface.h"
|
||
+#include "backendinterface.h"
|
||
+#include <QtCore/QtDebug>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class FactoryPrivate : public Phonon::Experimental::Factory::Sender
|
||
+{
|
||
+ public:
|
||
+ FactoryPrivate();
|
||
+ ~FactoryPrivate();
|
||
+ //QPointer<QObject> m_backendObject;
|
||
+
|
||
+ private Q_SLOTS:
|
||
+ void objectDescriptionChanged(ObjectDescriptionType);
|
||
+};
|
||
+
|
||
+PHONON_GLOBAL_STATIC(Phonon::Experimental::FactoryPrivate, globalFactory)
|
||
+
|
||
+FactoryPrivate::FactoryPrivate()
|
||
+{
|
||
+ QObject *backendObj = Phonon::Factory::backend();
|
||
+ Q_ASSERT(backendObj);
|
||
+ //QMetaObject::invokeMethod(backendObj, "experimentalBackend", Qt::DirectConnection,
|
||
+ //Q_RETURN_ARG(QObject *, m_backendObject));
|
||
+ //if (!m_backendObject) {
|
||
+ //qDebug() << "The backend does not support Phonon::Experimental";
|
||
+ //return;
|
||
+ //}
|
||
+ connect(backendObj, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)),
|
||
+ SLOT(objectDescriptionChanged(ObjectDescriptionType)));
|
||
+}
|
||
+
|
||
+FactoryPrivate::~FactoryPrivate()
|
||
+{
|
||
+}
|
||
+
|
||
+void FactoryPrivate::objectDescriptionChanged(ObjectDescriptionType type)
|
||
+{
|
||
+ qDebug() << Q_FUNC_INFO << type;
|
||
+ switch (type) {
|
||
+ case VideoCaptureDeviceType:
|
||
+ emit availableVideoCaptureDevicesChanged();
|
||
+ break;
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+}
|
||
+
|
||
+Factory::Sender *Factory::sender()
|
||
+{
|
||
+ return globalFactory;
|
||
+}
|
||
+
|
||
+QObject *Factory::createAudioDataOutput(QObject *parent)
|
||
+{
|
||
+ Phonon::BackendInterface *b = qobject_cast<Phonon::BackendInterface *>(Phonon::Factory::backend());
|
||
+ if (b) {
|
||
+ return Phonon::Factory::registerQObject(b->createObject(
|
||
+ static_cast<Phonon::BackendInterface::Class>(Phonon::BackendInterface::AudioDataOutputClass),
|
||
+ parent));
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+QObject *Factory::createVideoDataOutput(QObject *parent)
|
||
+{
|
||
+ Phonon::BackendInterface *b = qobject_cast<Phonon::BackendInterface *>(Phonon::Factory::backend());
|
||
+ if (b) {
|
||
+ return Phonon::Factory::registerQObject(b->createObject(
|
||
+ static_cast<Phonon::BackendInterface::Class>(Phonon::Experimental::BackendInterface::VideoDataOutputClass),
|
||
+ parent));
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+QObject *Factory::createAvCapture(QObject *parent)
|
||
+{
|
||
+ Phonon::BackendInterface *b = qobject_cast<Phonon::BackendInterface *>(Phonon::Factory::backend());
|
||
+ if (b) {
|
||
+ return Phonon::Factory::registerQObject(b->createObject(
|
||
+ static_cast<Phonon::BackendInterface::Class>(Phonon::Experimental::BackendInterface::AvCaptureClass),
|
||
+ parent));
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+QObject *Factory::createVisualization(QObject *parent)
|
||
+{
|
||
+ Phonon::BackendInterface *b = qobject_cast<Phonon::BackendInterface *>(Phonon::Factory::backend());
|
||
+ if (b) {
|
||
+ return Phonon::Factory::registerQObject(b->createObject(
|
||
+ static_cast<Phonon::BackendInterface::Class>(Phonon::Experimental::BackendInterface::VisualizationClass),
|
||
+ parent));
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/factory_p.h b/src/3rdparty/phonon/phonon/experimental/factory_p.h
|
||
new file mode 100644
|
||
index 0000000..68ab77b
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/factory_p.h
|
||
@@ -0,0 +1,76 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_FACTORY_P_H
|
||
+#define PHONON_EXPERIMENTAL_FACTORY_P_H
|
||
+
|
||
+#include <QtCore/QObject>
|
||
+#include "export.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+namespace Factory
|
||
+{
|
||
+ /**
|
||
+ * Emits signals for Phonon::Experimental::Factory.
|
||
+ */
|
||
+ class Sender : public QObject
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ Q_SIGNALS:
|
||
+ /**
|
||
+ * \copydoc Phonon::Experimental::BackendCapabilities::Notifier::availableVideoCaptureDevicesChanged
|
||
+ */
|
||
+ void availableVideoCaptureDevicesChanged();
|
||
+ };
|
||
+
|
||
+ PHONONEXPERIMENTAL_EXPORT Sender *sender();
|
||
+
|
||
+ /**
|
||
+ * Create a new backend object for a AudioDataOutput.
|
||
+ *
|
||
+ * \return a pointer to the AudioDataOutput the backend provides.
|
||
+ */
|
||
+ PHONONEXPERIMENTAL_EXPORT QObject *createAudioDataOutput(QObject *parent = 0);
|
||
+
|
||
+ /**
|
||
+ * Create a new backend object for a VideoDataOutput.
|
||
+ *
|
||
+ * \return a pointer to the VideoDataOutput the backend provides.
|
||
+ */
|
||
+ QObject *createVideoDataOutput(QObject *parent = 0);
|
||
+
|
||
+ QObject *createAvCapture(QObject *parent = 0);
|
||
+
|
||
+ /**
|
||
+ * Create a new backend object for a Visualization.
|
||
+ *
|
||
+ * \return a pointer to the Visualization the backend provides.
|
||
+ */
|
||
+ PHONONEXPERIMENTAL_EXPORT QObject *createVisualization(QObject *parent = 0);
|
||
+
|
||
+} // namespace Factory
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_FACTORY_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/globalconfig.cpp b/src/3rdparty/phonon/phonon/experimental/globalconfig.cpp
|
||
new file mode 100644
|
||
index 0000000..6f118c5
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/globalconfig.cpp
|
||
@@ -0,0 +1,131 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006-2008 Matthias Kretz <kretz@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 "globalconfig.h"
|
||
+#include "../globalconfig_p.h"
|
||
+
|
||
+#include "../factory_p.h"
|
||
+#include "objectdescription.h"
|
||
+#include "../phonondefs_p.h"
|
||
+#include "../backendinterface.h"
|
||
+#include "../qsettingsgroup_p.h"
|
||
+
|
||
+#include <QtCore/QList>
|
||
+#include <QtCore/QVariant>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+enum WhatToFilter {
|
||
+ FilterAdvancedDevices = 1,
|
||
+ FilterUnavailableDevices = 4
|
||
+};
|
||
+
|
||
+static void filter(BackendInterface *backendIface, QList<int> *list, int whatToFilter)
|
||
+{
|
||
+ QMutableListIterator<int> it(*list);
|
||
+ while (it.hasNext()) {
|
||
+ const QHash<QByteArray, QVariant> properties = backendIface->objectDescriptionProperties(
|
||
+ static_cast<Phonon::ObjectDescriptionType>(Phonon::Experimental::VideoCaptureDeviceType), it.next());
|
||
+ QVariant var;
|
||
+ if (whatToFilter & FilterAdvancedDevices) {
|
||
+ var = properties.value("isAdvanced");
|
||
+ if (var.isValid() && var.toBool()) {
|
||
+ it.remove();
|
||
+ continue;
|
||
+ }
|
||
+ }
|
||
+ if (whatToFilter & FilterUnavailableDevices) {
|
||
+ var = properties.value("available");
|
||
+ if (var.isValid() && !var.toBool()) {
|
||
+ it.remove();
|
||
+ continue;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+QList<int> GlobalConfig::videoCaptureDeviceListFor(Phonon::Category category, int override) const
|
||
+{
|
||
+ K_D(const GlobalConfig);
|
||
+
|
||
+ //The devices need to be stored independently for every backend
|
||
+ const QSettingsGroup backendConfig(&d->config, QLatin1String("VideoCaptureDevice")); // + Factory::identifier());
|
||
+ const QSettingsGroup generalGroup(&d->config, QLatin1String("General"));
|
||
+ const bool hideAdvancedDevices = ((override & AdvancedDevicesFromSettings)
|
||
+ ? generalGroup.value(QLatin1String("HideAdvancedDevices"), true)
|
||
+ : static_cast<bool>(override & HideAdvancedDevices));
|
||
+
|
||
+ //First we lookup the available devices directly from the backend
|
||
+ BackendInterface *backendIface = qobject_cast<BackendInterface *>(Phonon::Factory::backend());
|
||
+ if (!backendIface) {
|
||
+ return QList<int>();
|
||
+ }
|
||
+
|
||
+ // this list already is in default order (as defined by the backend)
|
||
+ QList<int> defaultList = backendIface->objectDescriptionIndexes(static_cast<Phonon::ObjectDescriptionType>(Phonon::Experimental::VideoCaptureDeviceType));
|
||
+ if (hideAdvancedDevices || (override & HideUnavailableDevices)) {
|
||
+ filter(backendIface, &defaultList,
|
||
+ (hideAdvancedDevices ? FilterAdvancedDevices : 0) |
|
||
+ ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||
+ );
|
||
+ }
|
||
+
|
||
+ QString categoryKey = QLatin1String("Category") + QString::number(static_cast<int>(category));
|
||
+ if (!backendConfig.hasKey(categoryKey)) {
|
||
+ // no list in config for the given category
|
||
+ QString categoryKey = QLatin1String("Category") + QString::number(static_cast<int>(Phonon::NoCategory));
|
||
+ if (!backendConfig.hasKey(categoryKey)) {
|
||
+ // no list in config for NoCategory
|
||
+ return defaultList;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ //Now the list from d->config
|
||
+ QList<int> 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()) {
|
||
+ if (0 == defaultList.removeAll(i.next())) {
|
||
+ i.remove();
|
||
+ }
|
||
+ }
|
||
+
|
||
+ //if the backend reports more devices that are not in d->config append them to the list
|
||
+ deviceList += defaultList;
|
||
+
|
||
+ return deviceList;
|
||
+}
|
||
+
|
||
+int GlobalConfig::videoCaptureDeviceFor(Phonon::Category category, int override) const
|
||
+{
|
||
+ QList<int> ret = videoCaptureDeviceListFor(category, override);
|
||
+ if (ret.isEmpty())
|
||
+ return -1;
|
||
+ return ret.first();
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/globalconfig.h b/src/3rdparty/phonon/phonon/experimental/globalconfig.h
|
||
new file mode 100644
|
||
index 0000000..8a5dba9
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/globalconfig.h
|
||
@@ -0,0 +1,57 @@
|
||
+/* This file is part of the KDE project
|
||
+Copyright (C) 2006-2008 Matthias Kretz <kretz@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_EXPERIMENTAL_GLOBALCONFIG_P_H
|
||
+#define PHONON_EXPERIMENTAL_GLOBALCONFIG_P_H
|
||
+
|
||
+#include <QtCore/QObject>
|
||
+#include <QtCore/QSettings>
|
||
+
|
||
+#include "../phononnamespace.h"
|
||
+#include "../globalconfig.h"
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class GlobalConfig : public Phonon::GlobalConfig
|
||
+{
|
||
+ K_DECLARE_PRIVATE(Phonon::GlobalConfig)
|
||
+public:
|
||
+ QList<int> videoCaptureDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+ int videoCaptureDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+
|
||
+Q_SIGNALS:
|
||
+ void videoCaptureDeviceConfigChanged();
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_GLOBALCONFIG_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/lockfreequeue.cpp b/src/3rdparty/phonon/phonon/experimental/lockfreequeue.cpp
|
||
new file mode 100644
|
||
index 0000000..6153697
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/lockfreequeue.cpp
|
||
@@ -0,0 +1,309 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "lockfreequeue_p.h"
|
||
+#include <QtCore/QHash>
|
||
+#include <QtCore/QWriteLocker>
|
||
+#include <QtCore/QReadWriteLock>
|
||
+#include <stdlib.h>
|
||
+#include "globalstatic_p.h"
|
||
+
|
||
+struct MemoryPool
|
||
+{
|
||
+ ~MemoryPool();
|
||
+ // Stack structure:
|
||
+ QAtomicPointer<LockFreeQueueBase::NodeBase> stack;
|
||
+ QAtomicInt count;
|
||
+ QAtomicInt size;
|
||
+
|
||
+ void clear();
|
||
+};
|
||
+
|
||
+void MemoryPool::clear()
|
||
+{
|
||
+ LockFreeQueueBase::NodeBase *node = stack;
|
||
+ while (node) {
|
||
+ if (stack.testAndSetAcquire(node, const_cast<LockFreeQueueBase::NodeBase *>(node->next))) {
|
||
+ count.deref();
|
||
+ free(node);
|
||
+ }
|
||
+ node = stack;
|
||
+ }
|
||
+}
|
||
+
|
||
+MemoryPool::~MemoryPool()
|
||
+{
|
||
+ LockFreeQueueBase::NodeBase *node = stack;
|
||
+ while (node) {
|
||
+ void *toDelete = node;
|
||
+ node = const_cast<LockFreeQueueBase::NodeBase *>(node->next);
|
||
+ ::free(toDelete);
|
||
+ }
|
||
+}
|
||
+
|
||
+struct MemoryPoolVector
|
||
+{
|
||
+ static const int POOL_COUNT = 16;
|
||
+ ~MemoryPoolVector() { delete next; }
|
||
+ inline MemoryPool &operator[](size_t s)
|
||
+ {
|
||
+ for (int i = 0; i < POOL_COUNT; ++i) {
|
||
+ if (m_pools[i].size == static_cast<int>(s)) {
|
||
+ return m_pools[i];
|
||
+ } else if (m_pools[i].size == 0) {
|
||
+ if (m_pools[i].size.testAndSetRelaxed(0, static_cast<int>(s))) {
|
||
+ return m_pools[i];
|
||
+ }
|
||
+ if (m_pools[i].size == static_cast<int>(s)) {
|
||
+ return m_pools[i];
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ if (!next) {
|
||
+ MemoryPoolVector *newPoolVector = new MemoryPoolVector;
|
||
+ if (!next.testAndSetRelaxed(0, newPoolVector)) {
|
||
+ delete newPoolVector;
|
||
+ }
|
||
+ }
|
||
+ return (*next)[s];
|
||
+ }
|
||
+
|
||
+ void clearAllPools()
|
||
+ {
|
||
+ for (int i = 0; i < POOL_COUNT; ++i) {
|
||
+ if (0 == m_pools[i].size) {
|
||
+ return;
|
||
+ }
|
||
+ m_pools[i].clear();
|
||
+ }
|
||
+ if (next) {
|
||
+ next->clearAllPools();
|
||
+ }
|
||
+ }
|
||
+
|
||
+ MemoryPool m_pools[POOL_COUNT];
|
||
+ QAtomicPointer<MemoryPoolVector> next;
|
||
+};
|
||
+
|
||
+static int s_poolSize = 128;
|
||
+PHONON_GLOBAL_STATIC(MemoryPoolVector, s_memoryPool)
|
||
+
|
||
+void *LockFreeQueueBase::NodeBaseKeepNodePool::operator new(size_t s)
|
||
+{
|
||
+ MemoryPool &p = (*s_memoryPool)[s];
|
||
+ NodeBase *node = p.stack;
|
||
+ if (node) {
|
||
+ if (!p.stack.testAndSetAcquire(node, const_cast<NodeBase *>(node->next))) {
|
||
+ return ::malloc(s);
|
||
+ }
|
||
+ p.count.deref();
|
||
+ return node;
|
||
+ }
|
||
+ return ::malloc(s);
|
||
+}
|
||
+
|
||
+void LockFreeQueueBase::NodeBaseKeepNodePool::operator delete(void *ptr, size_t s)
|
||
+{
|
||
+ MemoryPool &p = (*s_memoryPool)[s];
|
||
+ if (p.count > s_poolSize) {
|
||
+ ::free(ptr);
|
||
+ return;
|
||
+ }
|
||
+ NodeBase *node = static_cast<NodeBase *>(ptr);
|
||
+ NodeBase *next = p.stack;
|
||
+ node->next = next;
|
||
+ if (!p.stack.testAndSetOrdered(next, node)) {
|
||
+ ::free(ptr);
|
||
+ return;
|
||
+ }
|
||
+ p.count.ref();
|
||
+}
|
||
+
|
||
+void LockFreeQueueBase::NodeBaseKeepNodePool::clear()
|
||
+{
|
||
+ s_memoryPool->clearAllPools();
|
||
+}
|
||
+
|
||
+void LockFreeQueueBase::NodeBaseKeepNodePool::setPoolSize(int s)
|
||
+{
|
||
+ s_poolSize = s;
|
||
+}
|
||
+
|
||
+int LockFreeQueueBase::NodeBaseKeepNodePool::poolSize()
|
||
+{
|
||
+ return s_poolSize;
|
||
+}
|
||
+
|
||
+class LockFreeQueueBasePrivate
|
||
+{
|
||
+ public:
|
||
+ LockFreeQueueBasePrivate();
|
||
+ ~LockFreeQueueBasePrivate();
|
||
+ QReadWriteLock dataReadyHandlerMutex;
|
||
+ LockFreeQueueBase::NodeBase *sentinel; // end marker
|
||
+ LockFreeQueueBase::NodeBase *lastHeadNode;
|
||
+ QAtomicPointer<LockFreeQueueBase::NodeBasePointer> queueHead;
|
||
+ QAtomicPointer<LockFreeQueueBase::NodeBasePointer> queueTail;
|
||
+ QAtomicInt size;
|
||
+ LockFreeQueueBase::DataReadyHandler *dataReadyHandler;
|
||
+};
|
||
+
|
||
+LockFreeQueueBasePrivate::LockFreeQueueBasePrivate()
|
||
+ : sentinel(new LockFreeQueueBase::NodeBase(0)),
|
||
+ lastHeadNode(new LockFreeQueueBase::NodeBase(sentinel)),
|
||
+ queueHead(&lastHeadNode->next),
|
||
+ queueTail(&lastHeadNode->next),
|
||
+ size(0),
|
||
+ dataReadyHandler(0)
|
||
+{
|
||
+ // let d->sentinel point to itself so that we can use d->sentinel->next as
|
||
+ // QAtomicPointer<Node> for d->queueHead and d->queueTail
|
||
+ sentinel->next = sentinel;
|
||
+}
|
||
+
|
||
+LockFreeQueueBasePrivate::~LockFreeQueueBasePrivate()
|
||
+{
|
||
+ Q_ASSERT(queueHead);
|
||
+ LockFreeQueueBase::NodeBase *node = lastHeadNode;
|
||
+ while (node != sentinel) {
|
||
+ LockFreeQueueBase::NodeBase *toDelete = node;
|
||
+ node = const_cast<LockFreeQueueBase::NodeBase *>(node->next);
|
||
+ toDelete->deref();
|
||
+ }
|
||
+}
|
||
+
|
||
+LockFreeQueueBase::LockFreeQueueBase()
|
||
+ : d(new LockFreeQueueBasePrivate)
|
||
+{
|
||
+}
|
||
+
|
||
+LockFreeQueueBase::~LockFreeQueueBase()
|
||
+{
|
||
+ delete d;
|
||
+}
|
||
+
|
||
+void LockFreeQueueBase::setDataReadyHandler(DataReadyHandler *h)
|
||
+{
|
||
+ QWriteLocker lock(&d->dataReadyHandlerMutex);
|
||
+ d->dataReadyHandler = h;
|
||
+}
|
||
+
|
||
+void LockFreeQueueBase::_enqueue(NodeBase *newNode)
|
||
+{
|
||
+ newNode->ref();
|
||
+ newNode->next = d->sentinel;
|
||
+ /*if (d->size > 0 && newNode->priority > std::numeric_limits<int>::min()) {
|
||
+ NodeBasePointer *node = d->queueHead.fetchAndStoreRelaxed(&d->sentinel->next);
|
||
+ if (node == &d->sentinel->next) {
|
||
+ // Another thread got the real node, we just got the placeholder telling us to not touch
|
||
+ // anything. As we replaced &d->sentinel->next with &d->sentinel->next in
|
||
+ // d->queueHead we don't have to reset anything.
|
||
+ }
|
||
+ // node is a pointer to a Node::next member pointing to the first entry in
|
||
+ // the list
|
||
+ if (*node == d->sentinel) {
|
||
+ // the list is empty, good
|
||
+ }
|
||
+ } else {*/
|
||
+ // just append
|
||
+ NodeBasePointer &lastNextPointer = *d->queueTail.fetchAndStoreAcquire(&newNode->next);
|
||
+ lastNextPointer = newNode;
|
||
+ d->size.ref();
|
||
+
|
||
+ if (d->dataReadyHandler) {
|
||
+ QReadLocker lock(&d->dataReadyHandlerMutex);
|
||
+ if (d->dataReadyHandler) {
|
||
+ d->dataReadyHandler->dataReady();
|
||
+ }
|
||
+ }
|
||
+ //}
|
||
+}
|
||
+
|
||
+LockFreeQueueBase::NodeBase *LockFreeQueueBase::_acquireHeadNodeBlocking()
|
||
+{
|
||
+ NodeBasePointer *node = 0;
|
||
+ while (d->size > 0) {
|
||
+ if ((node = d->queueHead.fetchAndStoreRelaxed(&d->sentinel->next)) != &d->sentinel->next) {
|
||
+ // node is a pointer to a Node::next member pointing to the first entry in the list
|
||
+ if (*node != d->sentinel) {
|
||
+ d->size.deref();
|
||
+ NodeBase *_node = const_cast<NodeBase *>(*node); // cast volatile away
|
||
+ _node->ref();
|
||
+
|
||
+ NodeBase *toDeref = d->lastHeadNode;
|
||
+ d->lastHeadNode = _node;
|
||
+ const bool check = d->queueHead.testAndSetRelease(&d->sentinel->next, &_node->next);
|
||
+ Q_ASSERT(check); Q_UNUSED(check);
|
||
+ toDeref->deref();
|
||
+
|
||
+ return _node;
|
||
+ }
|
||
+ // empty (d->size == 0), put it back
|
||
+ const bool check = d->queueHead.testAndSetRelaxed(&d->sentinel->next, node);
|
||
+ Q_ASSERT(check); Q_UNUSED(check);
|
||
+ // try again, with some luck d->size is > 0 again
|
||
+ }
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+LockFreeQueueBase::NodeBase *LockFreeQueueBase::_acquireHeadNode()
|
||
+{
|
||
+ if (*d->queueHead == d->sentinel || d->queueHead == &d->sentinel->next) {
|
||
+ return 0;
|
||
+ }
|
||
+ // setting d->queueHead to &d->sentinel->next makes the above check fail (i.e. all
|
||
+ // other threads in a dequeue function will exit). Also enqueue will not modify
|
||
+ // this as d->queueTail references d->lastHeadNode->next which != d->sentinel->next
|
||
+ NodeBasePointer *node = d->queueHead.fetchAndStoreRelaxed(&d->sentinel->next);
|
||
+ if (node == &d->sentinel->next) {
|
||
+ // Another thread got the real node, we just got the placeholder telling us to not touch
|
||
+ // anything. As we replaced &d->sentinel->next with &d->sentinel->next in
|
||
+ // d->queueHead we don't have to reset anything.
|
||
+ return 0;
|
||
+ }
|
||
+ // node is a pointer to a Node::next member pointing to the first entry in
|
||
+ // the list
|
||
+ if (*node == d->sentinel) {
|
||
+ //qDebug() << "empty, put it back";
|
||
+ const bool check = d->queueHead.testAndSetRelaxed(&d->sentinel->next, node);
|
||
+ Q_ASSERT(check); Q_UNUSED(check);
|
||
+ return 0;
|
||
+ }
|
||
+ d->size.deref();
|
||
+
|
||
+ NodeBase *_node = const_cast<NodeBase *>(*node);
|
||
+ _node->ref();
|
||
+
|
||
+ NodeBase *toDeref = d->lastHeadNode;
|
||
+ d->lastHeadNode = _node;
|
||
+ const bool check = d->queueHead.testAndSetRelease(&d->sentinel->next, &_node->next);
|
||
+ Q_ASSERT(check); Q_UNUSED(check);
|
||
+ toDeref->deref();
|
||
+
|
||
+ return _node;
|
||
+}
|
||
+
|
||
+int LockFreeQueueBase::size() const
|
||
+{
|
||
+ return d->size;
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/lockfreequeue_p.h b/src/3rdparty/phonon/phonon/experimental/lockfreequeue_p.h
|
||
new file mode 100644
|
||
index 0000000..dace7f0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/lockfreequeue_p.h
|
||
@@ -0,0 +1,156 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 LOCKFREEQUEUE_P_H
|
||
+#define LOCKFREEQUEUE_P_H
|
||
+
|
||
+#include <QtCore/QVector>
|
||
+
|
||
+class LockFreeQueueBasePrivate;
|
||
+struct MemoryPool;
|
||
+class LockFreeQueueBase
|
||
+{
|
||
+ friend class LockFreeQueueBasePrivate;
|
||
+ public:
|
||
+ struct DataReadyHandler
|
||
+ {
|
||
+ virtual ~DataReadyHandler() {}
|
||
+ virtual void dataReady() = 0;
|
||
+ };
|
||
+
|
||
+ void setDataReadyHandler(DataReadyHandler *);
|
||
+
|
||
+ int size() const;
|
||
+ bool isEmpty() const { return 0 == size(); }
|
||
+
|
||
+ protected:
|
||
+ friend struct MemoryPool;
|
||
+ LockFreeQueueBase();
|
||
+ ~LockFreeQueueBase();
|
||
+
|
||
+ public:
|
||
+ class NodeBase;
|
||
+ typedef volatile NodeBase * NodeBasePointer;
|
||
+ class NodeBase
|
||
+ {
|
||
+ public:
|
||
+ inline NodeBase(int p) : priority(p) {}
|
||
+ inline NodeBase(NodeBase *n) : next(n), priority(0) {}
|
||
+ NodeBasePointer next;
|
||
+ int priority;
|
||
+
|
||
+ inline void ref() { refCount.ref(); }
|
||
+ inline void deref() { if (!refCount.deref()) delete this; }
|
||
+
|
||
+ protected:
|
||
+ ~NodeBase() { Q_ASSERT(refCount == 0); }
|
||
+ private:
|
||
+ QAtomicInt refCount;
|
||
+ };
|
||
+
|
||
+ struct NodeBaseKeepNodePool : public NodeBase
|
||
+ {
|
||
+ inline NodeBaseKeepNodePool(int priority) : NodeBase(priority) {}
|
||
+ // allocation is a bottleneck in _enqueue
|
||
+ void *operator new(size_t s);
|
||
+ void operator delete(void *p, size_t s);
|
||
+
|
||
+ static void clear();
|
||
+ static void setPoolSize(int);
|
||
+ static int poolSize();
|
||
+ };
|
||
+
|
||
+ typedef NodeBase StdNewDeleteMemoryManagement;
|
||
+ typedef NodeBaseKeepNodePool KeepNodePoolMemoryManagement;
|
||
+ protected:
|
||
+
|
||
+ void _enqueue(NodeBase *);
|
||
+ NodeBase *_acquireHeadNode();
|
||
+ NodeBase *_acquireHeadNodeBlocking();
|
||
+
|
||
+ LockFreeQueueBasePrivate *const d;
|
||
+
|
||
+};
|
||
+
|
||
+template<class T, class MemoryManagementNodeBase = LockFreeQueueBase::StdNewDeleteMemoryManagement>
|
||
+class LockFreeQueue : public LockFreeQueueBase
|
||
+{
|
||
+ public:
|
||
+ enum BlockingSwitch {
|
||
+ BlockUnlessEmpty,
|
||
+ NeverBlock
|
||
+ };
|
||
+
|
||
+ struct Node : public MemoryManagementNodeBase
|
||
+ {
|
||
+ inline Node(const T &d, int priority) : MemoryManagementNodeBase(priority), data(d) {}
|
||
+ T data;
|
||
+ };
|
||
+
|
||
+ inline void enqueue(const T &data, int priority = 0)
|
||
+ {
|
||
+ _enqueue(new Node(data, 0));
|
||
+ }
|
||
+
|
||
+ inline void dequeue(QVector<T> &data, BlockingSwitch block = BlockUnlessEmpty)
|
||
+ {
|
||
+ int count = 0;
|
||
+ while (count < data.capacity()) {
|
||
+ NodeBase *node = (block == NeverBlock) ? _acquireHeadNode() : _acquireHeadNodeBlocking();
|
||
+ if (!node) {
|
||
+ break;
|
||
+ }
|
||
+ if (count < data.size()) {
|
||
+ data[count] = static_cast<Node *>(node)->data;
|
||
+ } else {
|
||
+ data << static_cast<Node *>(node)->data;
|
||
+ }
|
||
+ ++count;
|
||
+ node->deref();
|
||
+ }
|
||
+ data.resize(count);
|
||
+ }
|
||
+
|
||
+ inline bool dequeue(T *data, BlockingSwitch block = BlockUnlessEmpty)
|
||
+ {
|
||
+ NodeBase *node = (block == NeverBlock) ? _acquireHeadNode() : _acquireHeadNodeBlocking();
|
||
+ if (node) {
|
||
+ *data = static_cast<Node *>(node)->data;
|
||
+ node->deref();
|
||
+ return true;
|
||
+ }
|
||
+ return false;
|
||
+ }
|
||
+
|
||
+ inline LockFreeQueue<T> &operator<<(const T &data) { enqueue(data); return *this; }
|
||
+ inline LockFreeQueue<T> &operator>>(T &data)
|
||
+ {
|
||
+ NodeBase *node = _acquireHeadNodeBlocking();
|
||
+ if (node) {
|
||
+ data = static_cast<Node *>(node)->data;
|
||
+ node->deref();
|
||
+ }
|
||
+ return *this;
|
||
+ }
|
||
+};
|
||
+
|
||
+#endif // LOCKFREEQUEUE_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/mediasource.cpp b/src/3rdparty/phonon/phonon/experimental/mediasource.cpp
|
||
new file mode 100644
|
||
index 0000000..1fd0d93
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/mediasource.cpp
|
||
@@ -0,0 +1,79 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU General Public License as
|
||
+ published by the Free Software Foundation; either version 2 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 14 of version 3 of the license.
|
||
+
|
||
+ This program 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 General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU General Public License
|
||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+
|
||
+*/
|
||
+
|
||
+#include "mediasource.h"
|
||
+#include "mediasource_p.h"
|
||
+
|
||
+#define S_D(Class) Class##Private *d = reinterpret_cast<Class##Private *>(Phonon::MediaSource::d.data())
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+MediaSource::MediaSource(const MediaSource &rhs)
|
||
+ : Phonon::MediaSource(rhs)
|
||
+{
|
||
+}
|
||
+
|
||
+MediaSource &MediaSource::operator=(const MediaSource &rhs)
|
||
+{
|
||
+ d = rhs.d;
|
||
+ return *this;
|
||
+}
|
||
+
|
||
+bool MediaSource::operator==(const MediaSource &rhs) const
|
||
+{
|
||
+ return d == rhs.d;
|
||
+}
|
||
+
|
||
+VideoCaptureDevice MediaSource::videoCaptureDevice() const
|
||
+{
|
||
+ S_D(const MediaSource);
|
||
+ return d->videoCaptureDevice;
|
||
+}
|
||
+
|
||
+MediaSource::MediaSource(const VideoCaptureDevice &videoDevice)
|
||
+ : Phonon::MediaSource(*new MediaSourcePrivate(VideoCaptureDeviceSource))
|
||
+{
|
||
+ S_D(MediaSource);
|
||
+ d->videoCaptureDevice = videoDevice;
|
||
+}
|
||
+
|
||
+MediaSource::MediaSource(const QList<Phonon::MediaSource> &mediaList)
|
||
+ : Phonon::MediaSource(*new MediaSourcePrivate(Link))
|
||
+{
|
||
+ S_D(MediaSource);
|
||
+ d->linkedSources = mediaList;
|
||
+ foreach (const Phonon::MediaSource &ms, mediaList) {
|
||
+ Q_ASSERT(static_cast<MediaSource::Type>(ms.type()) != Link);
|
||
+ }
|
||
+}
|
||
+
|
||
+QList<Phonon::MediaSource> MediaSource::substreams() const
|
||
+{
|
||
+ S_D(MediaSource);
|
||
+ return d->linkedSources;
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/mediasource.h b/src/3rdparty/phonon/phonon/experimental/mediasource.h
|
||
new file mode 100644
|
||
index 0000000..a68446f
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/mediasource.h
|
||
@@ -0,0 +1,73 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_MEDIASOURCE_H
|
||
+#define PHONON_EXPERIMENTAL_MEDIASOURCE_H
|
||
+
|
||
+#include "../mediasource.h"
|
||
+#include "export.h"
|
||
+#include "objectdescription.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class PHONONEXPERIMENTAL_EXPORT MediaSource : public Phonon::MediaSource
|
||
+{
|
||
+ public:
|
||
+ enum Type {
|
||
+ Link = 0xffff,
|
||
+ VideoCaptureDeviceSource
|
||
+ };
|
||
+
|
||
+ /**
|
||
+ * Constructs a copy of \p rhs.
|
||
+ *
|
||
+ * This constructor is fast thanks to explicit sharing.
|
||
+ */
|
||
+ MediaSource(const MediaSource &rhs);
|
||
+
|
||
+ /**
|
||
+ * Assigns \p rhs to this MediaSource and returns a reference to this MediaSource.
|
||
+ *
|
||
+ * This operation is fast thanks to explicit sharing.
|
||
+ */
|
||
+ MediaSource &operator=(const MediaSource &rhs);
|
||
+
|
||
+ /**
|
||
+ * Returns \p true if this MediaSource is equal to \p rhs; otherwise returns \p false.
|
||
+ */
|
||
+ bool operator==(const MediaSource &rhs) const;
|
||
+
|
||
+ VideoCaptureDevice videoCaptureDevice() const;
|
||
+
|
||
+ MediaSource(const VideoCaptureDevice &videoDevice);
|
||
+ MediaSource(const QList<Phonon::MediaSource> &mediaList);
|
||
+
|
||
+ QList<Phonon::MediaSource> substreams() const;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_MEDIASOURCE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/mediasource_p.h b/src/3rdparty/phonon/phonon/experimental/mediasource_p.h
|
||
new file mode 100644
|
||
index 0000000..ee3d1dd
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/mediasource_p.h
|
||
@@ -0,0 +1,50 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_MEDIASOURCE_P_H
|
||
+#define PHONON_EXPERIMENTAL_MEDIASOURCE_P_H
|
||
+
|
||
+#include "mediasource.h"
|
||
+#include "../mediasource_p.h"
|
||
+#include "objectdescription.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class MediaSourcePrivate : public Phonon::MediaSourcePrivate
|
||
+{
|
||
+ public:
|
||
+ MediaSourcePrivate(MediaSource::Type t)
|
||
+ : Phonon::MediaSourcePrivate(static_cast<Phonon::MediaSource::Type>(t))
|
||
+ {
|
||
+ }
|
||
+
|
||
+ VideoCaptureDevice videoCaptureDevice;
|
||
+ QList<Phonon::MediaSource> linkedSources;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_MEDIASOURCE_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/objectdescription.h b/src/3rdparty/phonon/phonon/experimental/objectdescription.h
|
||
new file mode 100644
|
||
index 0000000..334e262
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/objectdescription.h
|
||
@@ -0,0 +1,42 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_OBJECTDESCRIPTION_H
|
||
+#define PHONON_EXPERIMENTAL_OBJECTDESCRIPTION_H
|
||
+
|
||
+#include "../objectdescription.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+enum ObjectDescriptionType
|
||
+{
|
||
+ VideoCaptureDeviceType = 0x10000
|
||
+};
|
||
+
|
||
+typedef Phonon::ObjectDescription<static_cast<Phonon::ObjectDescriptionType>(Phonon::Experimental::VideoCaptureDeviceType)> VideoCaptureDevice;
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_OBJECTDESCRIPTION_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packet.cpp b/src/3rdparty/phonon/phonon/experimental/packet.cpp
|
||
new file mode 100644
|
||
index 0000000..d60e624
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packet.cpp
|
||
@@ -0,0 +1,60 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This library is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License version 2 as published by the Free Software Foundation.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+#include "packet.h"
|
||
+#include "packet_p.h"
|
||
+#include "packetpool.h"
|
||
+#include "packetpool_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+Q_GLOBAL_STATIC(PacketPrivate, shared_null_packet)
|
||
+
|
||
+Packet::Packet() : d_ptr(shared_null_packet()) { d_ptr->ref.ref(); }
|
||
+Packet::Packet(PacketPool &pool) : d_ptr(pool.d_ptr->acquirePacket().d_ptr) { d_ptr->ref.ref(); }
|
||
+Packet::Packet(const Packet &rhs) : d_ptr(rhs.d_ptr) { d_ptr->ref.ref(); }
|
||
+Packet::Packet(PacketPrivate &dd) : d_ptr(&dd) { d_ptr->ref.ref(); }
|
||
+Packet &Packet::operator=(const Packet &rhs)
|
||
+{
|
||
+ if (!d_ptr->ref.deref()) {
|
||
+ Q_ASSERT(d_ptr->m_pool);
|
||
+ d_ptr->m_pool->releasePacket(*this);
|
||
+ }
|
||
+ d_ptr = rhs.d_ptr;
|
||
+ d_ptr->ref.ref();
|
||
+ return *this;
|
||
+}
|
||
+Packet::~Packet()
|
||
+{
|
||
+ if (!d_ptr->ref.deref()) {
|
||
+ Q_ASSERT(d_ptr->m_pool);
|
||
+ d_ptr->m_pool->releasePacket(*this);
|
||
+ }
|
||
+}
|
||
+bool Packet::operator==(const Packet &rhs) const { return d_ptr == rhs.d_ptr; }
|
||
+bool Packet::operator!=(const Packet &rhs) const { return d_ptr != rhs.d_ptr; }
|
||
+bool Packet::isNull() const { return d_ptr->m_pool == 0; }
|
||
+const char *Packet::data() const { return d_ptr->m_data; }
|
||
+char *Packet::data() { return d_ptr->m_data; }
|
||
+int Packet::size() const { return d_ptr->m_size; }
|
||
+void Packet::setSize(int size) { d_ptr->m_size = size; }
|
||
+int Packet::capacity() const { return d_ptr->m_pool ? d_ptr->m_pool->packetSize : 0; }
|
||
+
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packet.h b/src/3rdparty/phonon/phonon/experimental/packet.h
|
||
new file mode 100644
|
||
index 0000000..ca4d9a2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packet.h
|
||
@@ -0,0 +1,129 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This library is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License version 2 as published by the Free Software Foundation.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+#ifndef PHONON_PACKET_H
|
||
+#define PHONON_PACKET_H
|
||
+
|
||
+#include "export.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class PacketPool;
|
||
+
|
||
+struct PacketPrivate;
|
||
+/** \class Packet packetpool.h Phonon/Packet
|
||
+ * \brief Class to access memory preallocated by PacketPool
|
||
+ *
|
||
+ * \note PacketPool and Packet are threadsafe.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT Packet
|
||
+{
|
||
+ friend class PacketPoolPrivate;
|
||
+ Q_DECLARE_PRIVATE(Packet)
|
||
+ public:
|
||
+ /**
|
||
+ * Constructs a null packet.
|
||
+ *
|
||
+ * \see isNull
|
||
+ */
|
||
+ Packet();
|
||
+ /**
|
||
+ * Returns a packet with a capacity of pool.packetSize if there is still free data in the
|
||
+ * PacketPool. Returns a null packet otherwise. The size will initially be set to 0.
|
||
+ */
|
||
+ explicit Packet(PacketPool &pool);
|
||
+ /**
|
||
+ * Returns a shared copy of the object. Note that Packet will not detach (and it can not
|
||
+ * detach as there's a fixed amount of memory preallocated. If you want to copy the actual
|
||
+ * memory data you have to request another packet from the pool and copy the memory
|
||
+ * yourself.)
|
||
+ */
|
||
+ Packet(const Packet &rhs);
|
||
+ /**
|
||
+ * Assigns a shared copy of the object. Note that Packet will not detach (and it can not
|
||
+ * detach as there's a fixed amount of memory preallocated. If you want to copy the actual
|
||
+ * memory data you have to request another packet from the pool and copy the memory
|
||
+ * yourself.)
|
||
+ */
|
||
+ Packet &operator=(const Packet &rhs);
|
||
+
|
||
+ /**
|
||
+ * Dereferences the packet data. If this is the last reference that gets released the packet
|
||
+ * becomes available in the PacketPool again automatically.
|
||
+ */
|
||
+ ~Packet();
|
||
+
|
||
+ /**
|
||
+ * Returns whether the packets reference the same data.
|
||
+ */
|
||
+ bool operator==(const Packet &rhs) const;
|
||
+
|
||
+ /**
|
||
+ * Returns whether the packets reference different data.
|
||
+ */
|
||
+ bool operator!=(const Packet &rhs) const;
|
||
+
|
||
+ /**
|
||
+ * Returns whether this object is a null packet.
|
||
+ *
|
||
+ * \see Packet()
|
||
+ */
|
||
+ bool isNull() const;
|
||
+
|
||
+ /**
|
||
+ * Returns a pointer to read the data this packet references.
|
||
+ *
|
||
+ * You may read size() bytes.
|
||
+ */
|
||
+ const char *data() const;
|
||
+
|
||
+ /**
|
||
+ * Returns a pointer to read and write the data this packet references.
|
||
+ *
|
||
+ * You may read size() bytes.
|
||
+ * You may write capacity() bytes.
|
||
+ * If you write to this pointer do not forget to adjust the size by calling setSize().
|
||
+ */
|
||
+ char *data();
|
||
+
|
||
+ /**
|
||
+ * Returns the number of bytes that have a defined value.
|
||
+ */
|
||
+ int size() const;
|
||
+
|
||
+ /**
|
||
+ * Sets how many bytes in the data pointer have a defined value.
|
||
+ */
|
||
+ void setSize(int size);
|
||
+
|
||
+ /**
|
||
+ * Returns the number of bytes that may be accessed.
|
||
+ */
|
||
+ int capacity() const;
|
||
+
|
||
+ protected:
|
||
+ explicit Packet(PacketPrivate &dd);
|
||
+ PacketPrivate *d_ptr;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+#endif // PHONON_PACKET_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packet_p.h b/src/3rdparty/phonon/phonon/experimental/packet_p.h
|
||
new file mode 100644
|
||
index 0000000..30824cc
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packet_p.h
|
||
@@ -0,0 +1,45 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License as published by the Free Software Foundation; either
|
||
+ version 2 of the License, or (at your option) version 3.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+#ifndef PHONON_PACKET_P_H
|
||
+#define PHONON_PACKET_P_H
|
||
+
|
||
+#include <QtCore/QAtomicInt>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class PacketPoolPrivate;
|
||
+struct PacketPrivate
|
||
+{
|
||
+ inline PacketPrivate(char *_data, PacketPoolPrivate *_pool)
|
||
+ : ref(0), m_size(0), m_data(_data), m_pool(_pool) {}
|
||
+ inline PacketPrivate() : ref(1), m_size(0), m_data(0), m_pool(0) {}
|
||
+
|
||
+ QAtomicInt ref;
|
||
+
|
||
+ int m_size;
|
||
+ char *const m_data;
|
||
+ PacketPoolPrivate *const m_pool;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_PACKET_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packetpool.cpp b/src/3rdparty/phonon/phonon/experimental/packetpool.cpp
|
||
new file mode 100644
|
||
index 0000000..e9c47dd
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packetpool.cpp
|
||
@@ -0,0 +1,115 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This library is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License version 2 as published by the Free Software Foundation.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+#include "packetpool.h"
|
||
+#include "packetpool_p.h"
|
||
+#include "packet.h"
|
||
+#include "packet_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+int PacketPool::packetSize() const { return d_ptr->packetSize; }
|
||
+int PacketPool::poolSize() const { return d_ptr->poolSize; }
|
||
+int PacketPool::unusedPackets() const { return d_ptr->ringBufferSize; }
|
||
+
|
||
+PacketPoolPrivate::PacketPoolPrivate(int _packetSize, int _poolSize)
|
||
+ : freePackets(new PacketPrivate *[_poolSize]),
|
||
+ packetMemory(new char[packetSize * _poolSize]),
|
||
+ readPosition(0), writePosition(0),
|
||
+ ringBufferSize(_poolSize),
|
||
+ packetSize(_packetSize),
|
||
+ poolSize(_poolSize)
|
||
+{
|
||
+ for (int i = 0; i < _poolSize; ++i) {
|
||
+ freePackets[i] = new PacketPrivate(&packetMemory[i * packetSize], this);
|
||
+ }
|
||
+}
|
||
+
|
||
+PacketPoolPrivate::~PacketPoolPrivate()
|
||
+{
|
||
+ Q_ASSERT(poolSize == ringBufferSize);
|
||
+ for (int i = 0; i < poolSize; ++i) {
|
||
+ delete freePackets[i];
|
||
+ }
|
||
+ delete[] freePackets;
|
||
+ delete[] packetMemory;
|
||
+}
|
||
+
|
||
+void PacketPoolPrivate::releasePacket(const Packet &packet)
|
||
+{
|
||
+ const int _writePos = writePosition.fetchAndAddAcquire(1);
|
||
+ int pos = _writePos;
|
||
+ while (pos >= poolSize) {
|
||
+ pos -= poolSize;
|
||
+ }
|
||
+ writePosition.testAndSetRelease(_writePos, pos);
|
||
+ freePackets[pos] = packet.d_ptr;
|
||
+ ringBufferSize.ref();
|
||
+}
|
||
+
|
||
+Packet PacketPoolPrivate::acquirePacket()
|
||
+{
|
||
+ const int s = ringBufferSize.fetchAndAddRelaxed(-1);
|
||
+ if (s <= 0) {
|
||
+ ringBufferSize.fetchAndAddRelaxed(1);
|
||
+ return Packet();
|
||
+ }
|
||
+ const int _readPos = readPosition.fetchAndAddRelaxed(1);
|
||
+ int pos = _readPos;
|
||
+ while (pos >= poolSize) {
|
||
+ pos -= poolSize;
|
||
+ }
|
||
+ readPosition.testAndSetRelease(_readPos, pos);
|
||
+ freePackets[pos]->m_size = 0;
|
||
+ return Packet(*freePackets[pos]);
|
||
+}
|
||
+
|
||
+PacketPool::PacketPool(int packetSize, int _poolSize)
|
||
+ : d_ptr(new PacketPoolPrivate(packetSize, _poolSize))
|
||
+{
|
||
+ d_ptr->ref.ref();
|
||
+}
|
||
+
|
||
+PacketPool::PacketPool(const PacketPool &rhs)
|
||
+ : d_ptr(rhs.d_ptr)
|
||
+{
|
||
+ d_ptr->ref.ref();
|
||
+}
|
||
+
|
||
+PacketPool &PacketPool::operator=(const PacketPool &rhs)
|
||
+{
|
||
+ if (d_ptr != rhs.d_ptr) {
|
||
+ if (!d_ptr->ref.deref()) {
|
||
+ delete d_ptr;
|
||
+ }
|
||
+ d_ptr = rhs.d_ptr;
|
||
+ d_ptr->ref.ref();
|
||
+ }
|
||
+ return *this;
|
||
+}
|
||
+
|
||
+PacketPool::~PacketPool()
|
||
+{
|
||
+ if (!d_ptr->ref.deref()) {
|
||
+ delete d_ptr;
|
||
+ }
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packetpool.h b/src/3rdparty/phonon/phonon/experimental/packetpool.h
|
||
new file mode 100644
|
||
index 0000000..6d527a9
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packetpool.h
|
||
@@ -0,0 +1,79 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2007-2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This library is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License version 2 as published by the Free Software Foundation.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+#ifndef PHONON_PACKETPOOL_H
|
||
+#define PHONON_PACKETPOOL_H
|
||
+
|
||
+#include "export.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class Packet;
|
||
+class PacketPoolPrivate;
|
||
+/** \class PacketPool packetpool.h Phonon/PacketPool
|
||
+ * \brief Class to preallocate memory.
|
||
+ *
|
||
+ * \note PacketPool and Packet are threadsafe.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT PacketPool
|
||
+{
|
||
+ Q_DECLARE_PRIVATE(PacketPool)
|
||
+ friend class Packet;
|
||
+ public:
|
||
+ /**
|
||
+ * Allocates \p numberOfPackets packets of \p packetSize bytes each. The memory can be
|
||
+ * accessed through Packet objects.
|
||
+ */
|
||
+ PacketPool(int packetSize, int numberOfPackets);
|
||
+ /**
|
||
+ * Copy constructor. Copying is fast since the class is explicitly shared.
|
||
+ */
|
||
+ PacketPool(const PacketPool &);
|
||
+ /**
|
||
+ * Destructs this object. If this is the last reference to the pool the memory will be
|
||
+ * freed.
|
||
+ */
|
||
+ ~PacketPool();
|
||
+ /**
|
||
+ * Assignmen operator. Copying is fast since the class is explicitly shared.
|
||
+ */
|
||
+ PacketPool &operator=(const PacketPool &);
|
||
+
|
||
+ /**
|
||
+ * Returns the packet size that was set in the constructor.
|
||
+ */
|
||
+ int packetSize() const;
|
||
+ /**
|
||
+ * Returns the number of packets that was requested in the constructor.
|
||
+ */
|
||
+ int poolSize() const;
|
||
+ /**
|
||
+ * Returns the number of packets that are still available for use.
|
||
+ */
|
||
+ int unusedPackets() const;
|
||
+
|
||
+ private:
|
||
+ PacketPoolPrivate *d_ptr;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+#endif // PHONON_PACKETPOOL_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/packetpool_p.h b/src/3rdparty/phonon/phonon/experimental/packetpool_p.h
|
||
new file mode 100644
|
||
index 0000000..05d7375
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/packetpool_p.h
|
||
@@ -0,0 +1,61 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@kde.org>
|
||
+
|
||
+ This program is free software; you can redistribute it and/or
|
||
+ modify it under the terms of the GNU Library General Public
|
||
+ License as published by the Free Software Foundation; either
|
||
+ version 2 of the License, or (at your option) version 3.
|
||
+
|
||
+ 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
|
||
+ Library General Public License for more details.
|
||
+
|
||
+ You should have received a copy of the GNU Library General Public License
|
||
+ along with this library; see the file COPYING.LIB. If not, write to
|
||
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
+ Boston, MA 02110-1301, USA.
|
||
+
|
||
+*/
|
||
+
|
||
+
|
||
+#ifndef PHONON_PACKETPOOL_P_H
|
||
+#define PHONON_PACKETPOOL_P_H
|
||
+
|
||
+#include <QtCore/QAtomicInt>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+struct PacketPrivate;
|
||
+class PacketPoolPrivate
|
||
+{
|
||
+ friend class PacketPool;
|
||
+ friend class Packet;
|
||
+ public:
|
||
+ ~PacketPoolPrivate();
|
||
+
|
||
+ Packet acquirePacket();
|
||
+ void releasePacket(const Packet &);
|
||
+
|
||
+ protected:
|
||
+ QAtomicInt ref;
|
||
+
|
||
+ private:
|
||
+ PacketPoolPrivate(int packetSize, int _poolSize);
|
||
+
|
||
+ // C-array of PacketPrivate*
|
||
+ PacketPrivate **freePackets;
|
||
+ char *const packetMemory;
|
||
+
|
||
+ QAtomicInt readPosition;
|
||
+ QAtomicInt writePosition;
|
||
+ QAtomicInt ringBufferSize;
|
||
+
|
||
+ const int packetSize;
|
||
+ const int poolSize;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_PACKETPOOL_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/phononnamespace.h b/src/3rdparty/phonon/phonon/experimental/phononnamespace.h
|
||
new file mode 100644
|
||
index 0000000..d727238
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/phononnamespace.h
|
||
@@ -0,0 +1,67 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_PHONONNAMESPACE_H
|
||
+#define PHONON_X_PHONONNAMESPACE_H
|
||
+
|
||
+#include "../phononnamespace.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+ enum BitRate {
|
||
+ UnknownBitRate = -1,
|
||
+ /**
|
||
+ * Audio Data is transported as values from -128 to 127.
|
||
+ */
|
||
+ Signed8Bit = 100,
|
||
+ /**
|
||
+ * Audio Data is transported as values from 0 to 255
|
||
+ */
|
||
+ Unsigned8Bit = 200,
|
||
+ /**
|
||
+ * Audio Data is transported as values from -2^15 to 2^15-1
|
||
+ */
|
||
+ Signed16Bit = 300,
|
||
+ Signed18Bit = 400,
|
||
+ Signed20Bit = 500,
|
||
+ /**
|
||
+ * Audio Data is transported as values from -2^23 to 2^23-1. The data is packed in 3
|
||
+ * Bytes and not padded with a 0 Byte.
|
||
+ */
|
||
+ Signed24Bit = 600,
|
||
+ /**
|
||
+ * Audio Data is transported as values from -2^31 to 2^31-1
|
||
+ */
|
||
+ Signed32Bit = 700,
|
||
+ /**
|
||
+ * Audio Data is transported as values from -1.0 to 1.0
|
||
+ */
|
||
+ Float32Bit = 800
|
||
+ };
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_X_PHONONNAMESPACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/rtpreceiver.h b/src/3rdparty/phonon/phonon/experimental/rtpreceiver.h
|
||
new file mode 100644
|
||
index 0000000..34238e7
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/rtpreceiver.h
|
||
@@ -0,0 +1,47 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_RTPRECEIVER_H
|
||
+#define PHONON_RTPRECEIVER_H
|
||
+
|
||
+#include "../mediaobject.h"
|
||
+#include "../phonondefs.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class RtpReceiver : public MediaProducer
|
||
+{
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(RtpReceiver)
|
||
+ PHONON_HEIR(VideoDataOutput)
|
||
+ public:
|
||
+ setUrl(const KUrl &);
|
||
+ setBandwidth(int kiloBitPerSecond);
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_RTPRECEIVER_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/snapshotinterface.h b/src/3rdparty/phonon/phonon/experimental/snapshotinterface.h
|
||
new file mode 100644
|
||
index 0000000..950fbdb
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/snapshotinterface.h
|
||
@@ -0,0 +1,44 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_SNAPSHOTINTERFACE_H
|
||
+#define PHONON_EXPERIMENTAL_SNAPSHOTINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class SnapshotInterface
|
||
+{
|
||
+ public:
|
||
+ virtual ~SnapshotInterface() {}
|
||
+
|
||
+ virtual QImage snapshot() const = 0;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::Experimental::SnapshotInterface, "0SnapshotInterface.Phonon.kde.org")
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_SNAPSHOTINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/streameventqueue.cpp b/src/3rdparty/phonon/phonon/experimental/streameventqueue.cpp
|
||
new file mode 100644
|
||
index 0000000..a75286b
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/streameventqueue.cpp
|
||
@@ -0,0 +1,123 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "streameventqueue_p.h"
|
||
+#include "phononnamespace_p.h"
|
||
+#include <QtCore/QtDebug>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+//////////////////////////////////////////
|
||
+// any thread
|
||
+
|
||
+StreamEventQueue::StreamEventQueue()
|
||
+ : m_dropWriteCommands(0),
|
||
+ m_connecting(0)
|
||
+{
|
||
+}
|
||
+
|
||
+StreamEventQueue::~StreamEventQueue()
|
||
+{
|
||
+}
|
||
+
|
||
+void StreamEventQueue::setBackendCommandHandler(LockFreeQueueBase::DataReadyHandler *h)
|
||
+{
|
||
+ m_forBackend.setDataReadyHandler(h);
|
||
+}
|
||
+
|
||
+void StreamEventQueue::setFrontendCommandHandler(LockFreeQueueBase::DataReadyHandler *h)
|
||
+{
|
||
+ m_forFrontend.setDataReadyHandler(h);
|
||
+}
|
||
+
|
||
+
|
||
+//////////////////////////////////////////
|
||
+// frontend thread
|
||
+
|
||
+void StreamEventQueue::sendToBackend(CommandType command, const QVariant &data)
|
||
+{
|
||
+ m_forBackend.enqueue(Command(command, data));
|
||
+}
|
||
+
|
||
+bool StreamEventQueue::nextCommandForFrontend(Command *command)
|
||
+{
|
||
+ Q_ASSERT(command);
|
||
+ return m_forFrontend.dequeue(command);
|
||
+}
|
||
+
|
||
+
|
||
+//////////////////////////////////////////
|
||
+// backend thread
|
||
+
|
||
+void StreamEventQueue::sendToFrontend(CommandType command, const QVariant &data)
|
||
+{
|
||
+ switch (command) {
|
||
+ case Seek:
|
||
+ case Reset:
|
||
+ ++m_dropWriteCommands;
|
||
+ break;
|
||
+ case Connect:
|
||
+ ++m_connecting;
|
||
+ m_dropWriteCommands = 0;
|
||
+ break;
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ m_forFrontend.enqueue(Command(command, data));
|
||
+}
|
||
+
|
||
+bool StreamEventQueue::nextCommandForBackend(Command *command)
|
||
+{
|
||
+ Q_ASSERT(command);
|
||
+ bool valid = m_forBackend.dequeue(command);
|
||
+ while (valid) {
|
||
+ if (m_connecting) {
|
||
+ if (command->command == ConnectDone) {
|
||
+ --m_connecting;
|
||
+ }
|
||
+ // drop all other commands until m_connecting == 0
|
||
+ } else if (m_dropWriteCommands) {
|
||
+ switch (command->command) {
|
||
+ case Write:
|
||
+ case EndOfData:
|
||
+ // drop until m_dropWriteCommands == 0
|
||
+ break;
|
||
+ case SeekDone:
|
||
+ case ResetDone:
|
||
+ --m_dropWriteCommands;
|
||
+ break;
|
||
+ case ConnectDone:
|
||
+ pFatal("received a ConnectDone, but there was no Connect request");
|
||
+ break;
|
||
+ default:
|
||
+ return valid;
|
||
+ }
|
||
+ } else {
|
||
+ return valid;
|
||
+ }
|
||
+ valid = m_forBackend.dequeue(command);
|
||
+ }
|
||
+ return valid;
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/streameventqueue_p.h b/src/3rdparty/phonon/phonon/experimental/streameventqueue_p.h
|
||
new file mode 100644
|
||
index 0000000..66b5858
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/streameventqueue_p.h
|
||
@@ -0,0 +1,92 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_STREAMEVENTQUEUE_P_H
|
||
+#define PHONON_STREAMEVENTQUEUE_P_H
|
||
+
|
||
+#include <QtCore/QVariant>
|
||
+#include "lockfreequeue_p.h"
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+class StreamEventQueue
|
||
+{
|
||
+ public:
|
||
+ StreamEventQueue();
|
||
+ ~StreamEventQueue();
|
||
+
|
||
+ void setBackendCommandHandler(LockFreeQueueBase::DataReadyHandler *);
|
||
+ void setFrontendCommandHandler(LockFreeQueueBase::DataReadyHandler *);
|
||
+
|
||
+ enum CommandType {
|
||
+ // Frontend -> Backend
|
||
+ SetStreamSize,
|
||
+ SetSeekable,
|
||
+ Write,
|
||
+ EndOfData,
|
||
+ SeekDone,
|
||
+ ResetDone,
|
||
+ ConnectDone,
|
||
+
|
||
+ // Backend -> Frontend
|
||
+ NeedData,
|
||
+ EnoughData,
|
||
+ Seek,
|
||
+ Reset,
|
||
+ Connect
|
||
+ };
|
||
+
|
||
+ struct Command
|
||
+ {
|
||
+ inline Command(CommandType &c, const QVariant &d) : data(d), command(c) {}
|
||
+ inline Command() {}
|
||
+ QVariant data;
|
||
+ CommandType command;
|
||
+ };
|
||
+
|
||
+ // called from AbstractMediaStream thread
|
||
+ void sendToBackend(CommandType, const QVariant & = QVariant());
|
||
+ bool nextCommandForFrontend(Command *);
|
||
+
|
||
+ // called from StreamInterface thread
|
||
+ void sendToFrontend(CommandType, const QVariant & = QVariant());
|
||
+ bool nextCommandForBackend(Command *);
|
||
+
|
||
+ void ref() { m_references.ref(); }
|
||
+ void deref() { if (!m_references.deref()) delete this; }
|
||
+
|
||
+ private:
|
||
+ LockFreeQueue<Command, LockFreeQueueBase::KeepNodePoolMemoryManagement> m_forBackend;
|
||
+ LockFreeQueue<Command, LockFreeQueueBase::KeepNodePoolMemoryManagement> m_forFrontend;
|
||
+ int m_dropWriteCommands;
|
||
+ int m_connecting;
|
||
+ QAtomicInt m_references;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+#endif // PHONON_STREAMEVENTQUEUE_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/CMakeLists.txt b/src/3rdparty/phonon/phonon/experimental/tests/CMakeLists.txt
|
||
new file mode 100644
|
||
index 0000000..558204d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/CMakeLists.txt
|
||
@@ -0,0 +1,54 @@
|
||
+set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
|
||
+
|
||
+MACRO(PHONON_UNIT_TESTS)
|
||
+ FOREACH(_testname ${ARGN})
|
||
+ set(srcs ${_testname}.cpp)
|
||
+ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ qt4_add_resources(srcs ${_testname}.qrc)
|
||
+ endif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ phonon_add_unit_test(${_testname} ${srcs})
|
||
+ target_link_libraries(${_testname} ${PHONON_LIBS} phononexperimental ${QT_QTTEST_LIBRARY})
|
||
+ ENDFOREACH(_testname)
|
||
+ENDMACRO(PHONON_UNIT_TESTS)
|
||
+
|
||
+# same as above but using the fake backend
|
||
+MACRO(PHONON_UNIT_TESTS_FAKE)
|
||
+ FOREACH(_testname ${ARGN})
|
||
+ set(srcs ${_testname}.cpp)
|
||
+ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ qt4_add_resources(srcs ${_testname}.qrc)
|
||
+ endif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ phonon_add_unit_test(${_testname}_fake ${srcs})
|
||
+ target_link_libraries(${_testname}_fake ${PHONON_LIBS} phononexperimental ${QT_QTTEST_LIBRARY} phonon_fake)
|
||
+ SET_TARGET_PROPERTIES(${_testname}_fake PROPERTIES COMPILE_FLAGS -DUSE_FAKE_BACKEND)
|
||
+ ENDFOREACH(_testname)
|
||
+ENDMACRO(PHONON_UNIT_TESTS_FAKE)
|
||
+
|
||
+MACRO(PHONON_EXECUTABLE_TESTS)
|
||
+ FOREACH(_testname ${ARGN})
|
||
+ set(_add_executable_param)
|
||
+ if (Q_WS_MAC)
|
||
+ set(_add_executable_param MACOSX_BUNDLE)
|
||
+ endif (Q_WS_MAC)
|
||
+# this breaks compilation
|
||
+# if (WIN32)
|
||
+# set(_add_executable_param WIN32)
|
||
+# endif (WIN32)
|
||
+ if (NOT PHONON_BUILD_TESTS)
|
||
+ set(_add_executable_param ${_add_executable_param} EXCLUDE_FROM_ALL)
|
||
+ endif (NOT PHONON_BUILD_TESTS)
|
||
+ set(srcs ${_testname}.cpp)
|
||
+ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ qt4_add_resources(srcs ${_testname}.qrc)
|
||
+ endif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_testname}.qrc)
|
||
+ automoc4_add_executable(${_testname} ${_add_executable_param} ${srcs})
|
||
+ target_link_libraries(${_testname} ${PHONON_LIBS} phononexperimental ${QT_QTTEST_LIBRARY})
|
||
+ ENDFOREACH(_testname)
|
||
+ENDMACRO(PHONON_EXECUTABLE_TESTS)
|
||
+
|
||
+PHONON_EXECUTABLE_TESTS(
|
||
+ videodataoutputtest
|
||
+ )
|
||
+
|
||
+PHONON_UNIT_TESTS_FAKE(
|
||
+ )
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/audiodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/audiodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..ff017b2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/methods/audiodataoutput.cpp
|
||
@@ -0,0 +1,8 @@
|
||
+addSignal("dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<qint16>>&)");
|
||
+addMethod("int", "sampleRate()");
|
||
+addMethod("", "setFormat(Phonon::Experimental::AudioDataOutput::Format)");
|
||
+addMethod("Phonon::Experimental::AudioDataOutput::Format", "format()");
|
||
+addSignal("endOfMedia(int)");
|
||
+addMethod("int", "dataSize()");
|
||
+addSignal("dataReady(const QMap<Phonon::Experimental::AudioDataOutput::Channel, QVector<float>>&)");
|
||
+addMethod("", "setDataSize(int)");
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/avcapture.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/avcapture.cpp
|
||
new file mode 100644
|
||
index 0000000..d645946
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/methods/avcapture.cpp
|
||
@@ -0,0 +1,4 @@
|
||
+addMethod("int", "videoCaptureDevice()");
|
||
+addMethod("", "setAudioCaptureDevice(int)");
|
||
+addMethod("int", "audioCaptureDevice()");
|
||
+addMethod("", "setVideoCaptureDevice(int)");
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/avwriter.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/avwriter.cpp
|
||
new file mode 100644
|
||
index 0000000..e69de29
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/overlayapi.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/overlayapi.cpp
|
||
new file mode 100644
|
||
index 0000000..d952a0d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/methods/overlayapi.cpp
|
||
@@ -0,0 +1 @@
|
||
+addMethod("bool", "createOverlay(QWidget*,int)", true);
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/videodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/videodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..8a9e21b
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/methods/videodataoutput.cpp
|
||
@@ -0,0 +1,9 @@
|
||
+addSignal("endOfMedia()");
|
||
+addMethod("", "setFrameRate(int)");
|
||
+addMethod("quint32", "format()");
|
||
+addMethod("QSize", "frameSize()");
|
||
+addSignal("frameReady(const Phonon::Experimental::VideoFrame&)");
|
||
+addMethod("QSize", "naturalFrameSize()");
|
||
+addMethod("", "setFormat(quint32)");
|
||
+addMethod("int", "frameRate()");
|
||
+addMethod("", "setFrameSize(QSize)");
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/methods/visualization.cpp b/src/3rdparty/phonon/phonon/experimental/tests/methods/visualization.cpp
|
||
new file mode 100644
|
||
index 0000000..3ec7900
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/methods/visualization.cpp
|
||
@@ -0,0 +1,4 @@
|
||
+addMethod("", "setVisualization(int)");
|
||
+addMethod("", "setVideoOutput(QObject*)");
|
||
+addMethod("", "setAudioPath(QObject*)");
|
||
+addMethod("int", "visualization()");
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/test.mng b/src/3rdparty/phonon/phonon/experimental/tests/test.mng
|
||
new file mode 100644
|
||
index 0000000..3911090
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/tests/test.mng differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.cpp b/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.cpp
|
||
new file mode 100644
|
||
index 0000000..7fe0af0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.cpp
|
||
@@ -0,0 +1,135 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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/>.
|
||
+
|
||
+*/
|
||
+
|
||
+#define QT_GUI_LIB
|
||
+#include "../abstractvideodataoutput.h"
|
||
+#include "../videoframe2.h"
|
||
+#include "../../mediaobject.h"
|
||
+#include "../../tests/qtesthelper.h"
|
||
+#include <QtCore/QMutexLocker>
|
||
+#include <QtGui/QImageReader>
|
||
+#include <QtGui/QLabel>
|
||
+#include <QtGui/QPixmap>
|
||
+#include <QtTest/QtTest>
|
||
+#ifdef Q_OS_WIN
|
||
+#include <windows.h>
|
||
+#endif
|
||
+
|
||
+class Output : public QObject, public Phonon::Experimental::AbstractVideoDataOutput
|
||
+{
|
||
+ Q_OBJECT
|
||
+ public:
|
||
+ Output() : receivedEnd(0) {}
|
||
+ virtual QSet<Phonon::Experimental::VideoFrame2::Format> allowedFormats() const;
|
||
+ virtual void frameReady(const Phonon::Experimental::VideoFrame2 &);
|
||
+ virtual void endOfMedia();
|
||
+
|
||
+ QList<QImage> frames;
|
||
+ int receivedEnd;
|
||
+ QMutex mutex;
|
||
+};
|
||
+
|
||
+QSet<Phonon::Experimental::VideoFrame2::Format> Output::allowedFormats() const
|
||
+{
|
||
+ return QSet<Phonon::Experimental::VideoFrame2::Format>() << Phonon::Experimental::VideoFrame2::Format_RGB888;
|
||
+}
|
||
+
|
||
+void Output::frameReady(const Phonon::Experimental::VideoFrame2 &frame)
|
||
+{
|
||
+ qDebug() << Q_FUNC_INFO;
|
||
+ Q_ASSERT(frame.format == Phonon::Experimental::VideoFrame2::Format_RGB888);
|
||
+ QMutexLocker lock(&mutex);
|
||
+ frames << frame.qImage();
|
||
+}
|
||
+
|
||
+void Output::endOfMedia()
|
||
+{
|
||
+ ++receivedEnd;
|
||
+}
|
||
+
|
||
+class VideoDataOutputTest : public QObject
|
||
+{
|
||
+ Q_OBJECT
|
||
+ private slots:
|
||
+ void initTestCase();
|
||
+ void testDelete();
|
||
+ void playMedia();
|
||
+ void cleanupTestCase();
|
||
+ private:
|
||
+ Phonon::MediaObject *m_media;
|
||
+ Output *m_output;
|
||
+};
|
||
+
|
||
+void VideoDataOutputTest::initTestCase()
|
||
+{
|
||
+ m_media = new Phonon::MediaObject;
|
||
+ m_output = new Output;
|
||
+ Phonon::createPath(m_media, m_output);
|
||
+}
|
||
+
|
||
+void VideoDataOutputTest::testDelete()
|
||
+{
|
||
+ delete m_output;
|
||
+ m_output = new Output;
|
||
+ m_output->start();
|
||
+ QVERIFY(m_output->isRunning());
|
||
+ Phonon::createPath(m_media, m_output);
|
||
+#ifdef Q_OS_WIN
|
||
+ Sleep(1000);
|
||
+#else
|
||
+ sleep(1);
|
||
+#endif
|
||
+}
|
||
+
|
||
+void VideoDataOutputTest::playMedia()
|
||
+{
|
||
+ m_media->setCurrentSource(QString(":/test.mng"));
|
||
+ m_media->play();
|
||
+ QVERIFY(QTest::kWaitForSignal(m_media, SIGNAL(finished()), 4000));
|
||
+ QEXPECT_FAIL("", "endOfMedia not yet implemented for xine", Continue);
|
||
+ QCOMPARE(m_output->receivedEnd, 1);
|
||
+ QList<QImage> frames;
|
||
+ {
|
||
+ QImageReader movie(":/test.mng");
|
||
+ QImage frame;
|
||
+ while (movie.read(&frame)) {
|
||
+ frames << frame.convertToFormat(QImage::Format_RGB888);
|
||
+ }
|
||
+ }
|
||
+ qDebug() << frames.size();
|
||
+ QMutexLocker lock(&m_output->mutex);
|
||
+ QVERIFY(!m_output->frames.isEmpty());
|
||
+ QCOMPARE(m_output->frames.size(), frames.size());
|
||
+ for (int i = 0; i < frames.size(); ++i) {
|
||
+ QCOMPARE(m_output->frames[i], frames[i]);
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDataOutputTest::cleanupTestCase()
|
||
+{
|
||
+ delete m_output;
|
||
+ delete m_media;
|
||
+}
|
||
+
|
||
+QTEST_MAIN(VideoDataOutputTest)
|
||
+
|
||
+#include "videodataoutputtest.moc"
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.qrc b/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.qrc
|
||
new file mode 100644
|
||
index 0000000..dd6243d
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/tests/videodataoutputtest.qrc
|
||
@@ -0,0 +1,5 @@
|
||
+<RCC>
|
||
+ <qresource prefix="/" >
|
||
+ <file>test.mng</file>
|
||
+ </qresource>
|
||
+</RCC>
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/CMakeLists.txt b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/CMakeLists.txt
|
||
new file mode 100644
|
||
index 0000000..a070fe5
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/CMakeLists.txt
|
||
@@ -0,0 +1,16 @@
|
||
+project(videocapturetestapp)
|
||
+
|
||
+include(CheckIncludeFile)
|
||
+include(CheckIncludeFiles)
|
||
+
|
||
+
|
||
+check_include_files(linux/videodev2.h V4L2_FOUND)
|
||
+
|
||
+if(NOT V4L2_FOUND)
|
||
+ message(FATAL_ERROR "Video4Linux2 not found")
|
||
+endif(NOT V4L2_FOUND)
|
||
+
|
||
+find_package(KDE4 REQUIRED)
|
||
+
|
||
+add_subdirectory( videocapture )
|
||
+add_subdirectory( videocapturetestapp )
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/CMakeLists.txt b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/CMakeLists.txt
|
||
new file mode 100644
|
||
index 0000000..6944b0b
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/CMakeLists.txt
|
||
@@ -0,0 +1,12 @@
|
||
+add_definitions(-DQT3_SUPPORT -DQT3_SUPPORT_WARNINGS)
|
||
+
|
||
+include_directories( ${KDE4_INCLUDES} )
|
||
+add_definitions( ${KDE4_DEFINITIONS} )
|
||
+
|
||
+set(videocapture_LIB_SRCS bayer.cpp sonix_compress.cpp videodevice.cpp videodevicemodelpool.cpp videodevicepool.cpp videoinput.cpp)
|
||
+
|
||
+kde4_add_library(videocapture SHARED ${videocapture_LIB_SRCS} )
|
||
+
|
||
+target_link_libraries(videocapture ${KDE4_KDECORE_LIBS} ${KDE4_SOLID_LIBS})
|
||
+
|
||
+install(TARGETS videocapture ${INSTALL_TARGETS_DEFAULT_ARGS})
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.cpp
|
||
new file mode 100644
|
||
index 0000000..69189ba
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.cpp
|
||
@@ -0,0 +1,118 @@
|
||
+/*
|
||
+ * BAYER2RGB24 ROUTINE TAKEN FROM:
|
||
+ *
|
||
+ * Sonix SN9C101 based webcam basic I/F routines
|
||
+ * Copyright (C) 2004 Takafumi Mizuno <taka-qce@ls-a.jp>
|
||
+ *
|
||
+ * Redistribution and use in source and binary forms, with or without
|
||
+ * modification, are permitted provided that the following conditions
|
||
+ * are met:
|
||
+ * 1. Redistributions of source code must retain the above copyright
|
||
+ * notice, this list of conditions and the following disclaimer.
|
||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||
+ * notice, this list of conditions and the following disclaimer in the
|
||
+ * documentation and/or other materials provided with the distribution.
|
||
+ *
|
||
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
+ * SUCH DAMAGE.
|
||
+ */
|
||
+
|
||
+void bayer2rgb24(unsigned char *dst, unsigned char *src, long int WIDTH, long int HEIGHT)
|
||
+{
|
||
+ long int i;
|
||
+ unsigned char *rawpt, *scanpt;
|
||
+ long int size;
|
||
+
|
||
+ rawpt = src;
|
||
+ scanpt = dst;
|
||
+ size = WIDTH*HEIGHT;
|
||
+
|
||
+ for ( i = 0; i < size; i++ )
|
||
+ {
|
||
+ if ( (i/WIDTH) % 2 == 0 )
|
||
+ {
|
||
+ if ( (i % 2) == 0 )
|
||
+ {
|
||
+ // B
|
||
+ if ( (i > WIDTH) && ((i % WIDTH) > 0) )
|
||
+ {
|
||
+ *scanpt++ = (*(rawpt-WIDTH-1)+*(rawpt-WIDTH+1)+*(rawpt+WIDTH-1)+*(rawpt+WIDTH+1))/4; // R
|
||
+ *scanpt++ = (*(rawpt-1)+*(rawpt+1)+*(rawpt+WIDTH)+*(rawpt-WIDTH))/4; // G
|
||
+ *scanpt++ = *rawpt; // B
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // first line or left column
|
||
+ *scanpt++ = *(rawpt+WIDTH+1); // R
|
||
+ *scanpt++ = (*(rawpt+1)+*(rawpt+WIDTH))/2; // G
|
||
+ *scanpt++ = *rawpt; // B
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // (B)G
|
||
+ if ( (i > WIDTH) && ((i % WIDTH) < (WIDTH-1)) )
|
||
+ {
|
||
+ *scanpt++ = (*(rawpt+WIDTH)+*(rawpt-WIDTH))/2; // R
|
||
+ *scanpt++ = *rawpt; // G
|
||
+ *scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; // B
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // first line or right column
|
||
+ *scanpt++ = *(rawpt+WIDTH); // R
|
||
+ *scanpt++ = *rawpt; // G
|
||
+ *scanpt++ = *(rawpt-1); // B
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if ( (i % 2) == 0 )
|
||
+ {
|
||
+ // G(R)
|
||
+ if ( (i < (WIDTH*(HEIGHT-1))) && ((i % WIDTH) > 0) )
|
||
+ {
|
||
+ *scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; // R
|
||
+ *scanpt++ = *rawpt; // G
|
||
+ *scanpt++ = (*(rawpt+WIDTH)+*(rawpt-WIDTH))/2; // B
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // bottom line or left column
|
||
+ *scanpt++ = *(rawpt+1); /* R */
|
||
+ *scanpt++ = *rawpt; /* G */
|
||
+ *scanpt++ = *(rawpt-WIDTH); /* B */
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // R
|
||
+ if ( i < (WIDTH*(HEIGHT-1)) && ((i % WIDTH) < (WIDTH-1)) )
|
||
+ {
|
||
+ *scanpt++ = *rawpt; // R
|
||
+ *scanpt++ = (*(rawpt-1)+*(rawpt+1)+*(rawpt-WIDTH)+*(rawpt+WIDTH))/4; // G
|
||
+ *scanpt++ = (*(rawpt-WIDTH-1)+*(rawpt-WIDTH+1)+*(rawpt+WIDTH-1)+*(rawpt+WIDTH+1))/4; // B
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // bottom line or right column
|
||
+ *scanpt++ = *rawpt; /* R */
|
||
+ *scanpt++ = (*(rawpt-1)+*(rawpt-WIDTH))/2; /* G */
|
||
+ *scanpt++ = *(rawpt-WIDTH-1); /* B */
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ rawpt++;
|
||
+ }
|
||
+}
|
||
+
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.h
|
||
new file mode 100644
|
||
index 0000000..af6d8ba
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/bayer.h
|
||
@@ -0,0 +1,30 @@
|
||
+/*
|
||
+ * BAYER2RGB24 ROUTINE TAKEN FROM:
|
||
+ *
|
||
+ * Sonix SN9C101 based webcam basic I/F routines
|
||
+ * Copyright (C) 2004 Takafumi Mizuno <taka-qce@ls-a.jp>
|
||
+ *
|
||
+ * Redistribution and use in source and binary forms, with or without
|
||
+ * modification, are permitted provided that the following conditions
|
||
+ * are met:
|
||
+ * 1. Redistributions of source code must retain the above copyright
|
||
+ * notice, this list of conditions and the following disclaimer.
|
||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||
+ * notice, this list of conditions and the following disclaimer in the
|
||
+ * documentation and/or other materials provided with the distribution.
|
||
+ *
|
||
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
+ * SUCH DAMAGE.
|
||
+ */
|
||
+
|
||
+
|
||
+void bayer2rgb24 (unsigned char *dst, unsigned char *src, long int WIDTH, long int HEIGHT);
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.cpp
|
||
new file mode 100644
|
||
index 0000000..400635c
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.cpp
|
||
@@ -0,0 +1,180 @@
|
||
+#include "sonix_compress.h"
|
||
+
|
||
+#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
|
||
+
|
||
+typedef struct {
|
||
+ int is_abs;
|
||
+ int len;
|
||
+ int val;
|
||
+ int unk;
|
||
+} code_table_t;
|
||
+
|
||
+
|
||
+/* local storage */
|
||
+static code_table_t table[256];
|
||
+static int init_done = 0;
|
||
+
|
||
+/* global variable */
|
||
+int sonix_unknown = 0;
|
||
+
|
||
+/*
|
||
+ sonix_decompress_init
|
||
+ =====================
|
||
+ pre-calculates a locally stored table for efficient huffman-decoding.
|
||
+
|
||
+ Each entry at index x in the table represents the codeword
|
||
+ present at the MSB of byte x.
|
||
+
|
||
+*/
|
||
+void sonix_decompress_init(void)
|
||
+{
|
||
+ int i;
|
||
+ int is_abs, val, len, unk;
|
||
+
|
||
+ for (i = 0; i < 256; i++) {
|
||
+ is_abs = 0;
|
||
+ val = 0;
|
||
+ len = 0;
|
||
+ unk = 0;
|
||
+ if ((i & 0x80) == 0) {
|
||
+ /* code 0 */
|
||
+ val = 0;
|
||
+ len = 1;
|
||
+ }
|
||
+ else if ((i & 0xE0) == 0x80) {
|
||
+ /* code 100 */
|
||
+ val = +4;
|
||
+ len = 3;
|
||
+ }
|
||
+ else if ((i & 0xE0) == 0xA0) {
|
||
+ /* code 101 */
|
||
+ val = -4;
|
||
+ len = 3;
|
||
+ }
|
||
+ else if ((i & 0xF0) == 0xD0) {
|
||
+ /* code 1101 */
|
||
+ val = +11;
|
||
+ len = 4;
|
||
+ }
|
||
+ else if ((i & 0xF0) == 0xF0) {
|
||
+ /* code 1111 */
|
||
+ val = -11;
|
||
+ len = 4;
|
||
+ }
|
||
+ else if ((i & 0xF8) == 0xC8) {
|
||
+ /* code 11001 */
|
||
+ val = +20;
|
||
+ len = 5;
|
||
+ }
|
||
+ else if ((i & 0xFC) == 0xC0) {
|
||
+ /* code 110000 */
|
||
+ val = -20;
|
||
+ len = 6;
|
||
+ }
|
||
+ else if ((i & 0xFC) == 0xC4) {
|
||
+ /* code 110001xx: unknown */
|
||
+ val = 0;
|
||
+ len = 8;
|
||
+ unk = 1;
|
||
+ }
|
||
+ else if ((i & 0xF0) == 0xE0) {
|
||
+ /* code 1110xxxx */
|
||
+ is_abs = 1;
|
||
+ val = (i & 0x0F) << 4;
|
||
+ len = 8;
|
||
+ }
|
||
+ table[i].is_abs = is_abs;
|
||
+ table[i].val = val;
|
||
+ table[i].len = len;
|
||
+ table[i].unk = unk;
|
||
+ }
|
||
+
|
||
+ sonix_unknown = 0;
|
||
+ init_done = 1;
|
||
+}
|
||
+
|
||
+
|
||
+/*
|
||
+ sonix_decompress
|
||
+ ================
|
||
+ decompresses an image encoded by a SN9C101 camera controller chip.
|
||
+
|
||
+ IN width
|
||
+ height
|
||
+ inp pointer to compressed frame (with header already stripped)
|
||
+ OUT outp pointer to decompressed frame
|
||
+
|
||
+ Returns 0 if the operation was successful.
|
||
+ Returns <0 if operation failed.
|
||
+
|
||
+*/
|
||
+int sonix_decompress(int width, int height, unsigned char *inp, unsigned char *outp)
|
||
+{
|
||
+ int row, col;
|
||
+ int val;
|
||
+ int bitpos;
|
||
+ unsigned char code;
|
||
+ unsigned char *addr;
|
||
+
|
||
+ if (!init_done) {
|
||
+ /* do sonix_decompress_init first! */
|
||
+ return -1;
|
||
+ }
|
||
+
|
||
+ bitpos = 0;
|
||
+ for (row = 0; row < height; row++) {
|
||
+
|
||
+ col = 0;
|
||
+
|
||
+ /* first two pixels in first two rows are stored as raw 8-bit */
|
||
+ if (row < 2) {
|
||
+ addr = inp + (bitpos >> 3);
|
||
+ code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
|
||
+ bitpos += 8;
|
||
+ *outp++ = code;
|
||
+
|
||
+ addr = inp + (bitpos >> 3);
|
||
+ code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
|
||
+ bitpos += 8;
|
||
+ *outp++ = code;
|
||
+
|
||
+ col += 2;
|
||
+ }
|
||
+
|
||
+ while (col < width) {
|
||
+ /* get bitcode from bitstream */
|
||
+ addr = inp + (bitpos >> 3);
|
||
+ code = (addr[0] << (bitpos & 7)) | (addr[1] >> (8 - (bitpos & 7)));
|
||
+
|
||
+ /* update bit position */
|
||
+ bitpos += table[code].len;
|
||
+
|
||
+ /* update code statistics */
|
||
+ sonix_unknown += table[code].unk;
|
||
+
|
||
+ /* calculate pixel value */
|
||
+ val = table[code].val;
|
||
+ if (!table[code].is_abs) {
|
||
+ /* value is relative to top and left pixel */
|
||
+ if (col < 2) {
|
||
+ /* left column: relative to top pixel */
|
||
+ val += outp[-2*width];
|
||
+ }
|
||
+ else if (row < 2) {
|
||
+ /* top row: relative to left pixel */
|
||
+ val += outp[-2];
|
||
+ }
|
||
+ else {
|
||
+ /* main area: average of left pixel and top pixel */
|
||
+ val += (outp[-2] + outp[-2*width]) / 2;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ /* store pixel */
|
||
+ *outp++ = CLAMP(val);
|
||
+ col++;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ return 0;
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.h
|
||
new file mode 100644
|
||
index 0000000..509bcb0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/sonix_compress.h
|
||
@@ -0,0 +1,8 @@
|
||
+// Call this function first (just once is needed), before calling sonix_decompress
|
||
+void sonix_decompress_init(void);
|
||
+
|
||
+// decompresses data at inp until a full image of widthxheight has been written to outp
|
||
+int sonix_decompress(int width, int height, unsigned char *inp, unsigned char *outp);
|
||
+
|
||
+// counter to detect presence of currently unknown huffman codes
|
||
+extern int sonix_unknown;
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.cpp
|
||
new file mode 100644
|
||
index 0000000..cd87bea
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.cpp
|
||
@@ -0,0 +1,2847 @@
|
||
+/*
|
||
+ videodevice.cpp - Video Device Low-level Support
|
||
+
|
||
+ Copyright (c) 2005-2006 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#define ENABLE_AV
|
||
+
|
||
+#include <cstdlib>
|
||
+#include <cerrno>
|
||
+#include <cstring>
|
||
+
|
||
+#include <kdebug.h>
|
||
+
|
||
+#include "videoinput.h"
|
||
+#include "videodevice.h"
|
||
+
|
||
+#include "bayer.h"
|
||
+#include "sonix_compress.h"
|
||
+
|
||
+#define CLEAR(x) memset (&(x), 0, sizeof (x))
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+VideoDevice::VideoDevice()
|
||
+{
|
||
+// kDebug() << "libkopete (avdevice): VideoDevice() called";
|
||
+ descriptor = -1;
|
||
+ m_streambuffers = 0;
|
||
+ m_current_input = 0;
|
||
+// kDebug() << "libkopete (avdevice): VideoDevice() exited successfuly";
|
||
+}
|
||
+
|
||
+
|
||
+VideoDevice::~VideoDevice()
|
||
+{
|
||
+}
|
||
+
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+
|
||
+void VideoDevice::enumerateControls (void)
|
||
+{
|
||
+// -----------------------------------------------------------------------------------------------------------------
|
||
+// This must turn up to be a proper method to check for controls' existence.
|
||
+ CLEAR (queryctrl);
|
||
+// v4l2_queryctrl may zero the .id in some cases, even if the IOCTL returns EXIT_SUCCESS (tested with a bttv card, when testing for V4L2_CID_AUDIO_VOLUME).
|
||
+// As of 6th Aug 2007, according to the V4L2 specification version 0.21, this behavior is undocumented, and the example 1-8 code found at
|
||
+// http://www.linuxtv.org/downloads/video4linux/API/V4L2_API/spec/x519.htm fails because of this behavior with a bttv card.
|
||
+
|
||
+ int currentid = V4L2_CID_BASE;
|
||
+
|
||
+kDebug() << "Checking CID controls";
|
||
+
|
||
+ for (currentid = V4L2_CID_BASE; currentid < V4L2_CID_LASTP1; currentid++)
|
||
+//for (queryctrl.id = 9963776; queryctrl.id < 9963800; queryctrl.id++)
|
||
+ {
|
||
+ queryctrl.id = currentid;
|
||
+ if (0 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ continue;
|
||
+
|
||
+kDebug() << " Control: " << QString::fromLocal8Bit((const char*)queryctrl.name) << " Values from " << queryctrl.minimum << " to " << queryctrl.maximum << " with steps of " << queryctrl.step << ". Default: " << queryctrl.default_value;
|
||
+
|
||
+// switch (queryctrl.type)
|
||
+// {
|
||
+// case V4L2_CTRL_TYPE_INTEGER :
|
||
+// }
|
||
+ if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
|
||
+ enumerateMenu ();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if (errno == EINVAL)
|
||
+ continue;
|
||
+
|
||
+ perror ("VIDIOC_QUERYCTRL");
|
||
+// exit (EXIT_FAILURE);
|
||
+ }
|
||
+ }
|
||
+
|
||
+kDebug() << "Checking CID private controls";
|
||
+
|
||
+ for (currentid = V4L2_CID_PRIVATE_BASE;; currentid++)
|
||
+ {
|
||
+ queryctrl.id = currentid;
|
||
+ if ( 0 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ continue;
|
||
+
|
||
+kDebug() << " Control: " << QString::fromLocal8Bit((const char*)queryctrl.name) << " Values from " << queryctrl.minimum << " to " << queryctrl.maximum << " with steps of " << queryctrl.step << ". Default: " << queryctrl.default_value;
|
||
+
|
||
+ if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
|
||
+ enumerateMenu ();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if (errno == EINVAL)
|
||
+ break;
|
||
+
|
||
+ perror ("VIDIOC_QUERYCTRL");
|
||
+// exit (EXIT_FAILURE);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDevice::enumerateMenu (void)
|
||
+{
|
||
+ kDebug() << " Menu items:";
|
||
+
|
||
+ memset (&querymenu, 0, sizeof (querymenu));
|
||
+ querymenu.id = queryctrl.id;
|
||
+
|
||
+ for (querymenu.index = queryctrl.minimum; querymenu.index <= queryctrl.maximum; querymenu.index++)
|
||
+ {
|
||
+ if (0 == xioctl (VIDIOC_QUERYMENU, &querymenu))
|
||
+ {
|
||
+ kDebug() << " " << QString::fromLocal8Bit((const char*)querymenu.name);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ perror ("VIDIOC_QUERYMENU");
|
||
+ exit (EXIT_FAILURE);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+#endif
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::xioctl(int fd, int request, void *arg)
|
||
+ */
|
||
+int VideoDevice::xioctl(int request, void *arg)
|
||
+{
|
||
+ int r;
|
||
+
|
||
+ do r = ioctl (descriptor, request, arg);
|
||
+ while (-1 == r && EINTR == errno);
|
||
+ return r;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::errnoReturn(const char* s)
|
||
+ */
|
||
+int VideoDevice::errnoReturn(const char* s)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ fprintf (stderr, "%s error %d, %s\n",s, errno, strerror (errno));
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::setFileName(QString name)
|
||
+ */
|
||
+int VideoDevice::setFileName(QString filename)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ full_filename=filename;
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::open()
|
||
+ */
|
||
+int VideoDevice::open()
|
||
+{
|
||
+ /// @todo implement me
|
||
+
|
||
+ kDebug() << "called";
|
||
+ if(-1 != descriptor)
|
||
+ {
|
||
+ kDebug() << "Device is already open";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ descriptor = ::open (QFile::encodeName(full_filename), O_RDWR, 0);
|
||
+ if(isOpen())
|
||
+ {
|
||
+ kDebug() << "File " << full_filename << " was opened successfuly";
|
||
+ if(EXIT_FAILURE==checkDevice())
|
||
+ {
|
||
+ kDebug() << "File " << full_filename << " could not be opened";
|
||
+ close();
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ kDebug() << "Unable to open file " << full_filename << "Err: "<< errno;
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+ initDevice();
|
||
+ selectInput(m_current_input);
|
||
+ kDebug() << "exited successfuly";
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+bool VideoDevice::isOpen()
|
||
+{
|
||
+ if(-1 == descriptor)
|
||
+ {
|
||
+// kDebug() << "VideoDevice::isOpen() File is not open";
|
||
+ return false;
|
||
+ }
|
||
+// kDebug() << "VideoDevice::isOpen() File is open";
|
||
+ return true;
|
||
+}
|
||
+
|
||
+int VideoDevice::checkDevice()
|
||
+{
|
||
+ kDebug() << "checkDevice() called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ m_videocapture=false;
|
||
+ m_videochromakey=false;
|
||
+ m_videoscale=false;
|
||
+ m_videooverlay=false;
|
||
+ m_videoread=false;
|
||
+ m_videoasyncio=false;
|
||
+ m_videostream=false;
|
||
+
|
||
+ m_driver=VIDEODEV_DRIVER_NONE;
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+
|
||
+ CLEAR(V4L2_capabilities);
|
||
+
|
||
+ if (-1 != xioctl (VIDIOC_QUERYCAP, &V4L2_capabilities))
|
||
+ {
|
||
+ if (!(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_CAPTURE))
|
||
+ {
|
||
+ kDebug() << "checkDevice(): " << full_filename << " is not a video capture device.";
|
||
+ m_driver = VIDEODEV_DRIVER_NONE;
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ m_videocapture=true;
|
||
+ kDebug() << "checkDevice(): " << full_filename << " is a V4L2 device.";
|
||
+ m_driver = VIDEODEV_DRIVER_V4L2;
|
||
+ m_model=QString::fromLocal8Bit((const char*)V4L2_capabilities.card);
|
||
+
|
||
+
|
||
+// Detect maximum and minimum resolution supported by the V4L2 device. VIDIOC_ENUM_FRAMESIZES is still experimental.
|
||
+ CLEAR (fmt);
|
||
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
|
||
+ kDebug() << "VIDIOC_G_FMT failed (" << errno << ").";
|
||
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ fmt.fmt.pix.width = 32767;
|
||
+ fmt.fmt.pix.height = 32767;
|
||
+ fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
||
+ if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
|
||
+ {
|
||
+ kDebug() << "Detecting maximum size with VIDIOC_S_FMT failed (" << errno << ").Returned maxwidth: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ // Note VIDIOC_S_FMT may change width and height.
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ maxwidth = fmt.fmt.pix.width;
|
||
+ maxheight = fmt.fmt.pix.height;
|
||
+ }
|
||
+ if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
|
||
+ kDebug() << "VIDIOC_G_FMT failed (" << errno << ").";
|
||
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ fmt.fmt.pix.width = 1;
|
||
+ fmt.fmt.pix.height = 1;
|
||
+ fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
||
+ if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
|
||
+ {
|
||
+ kDebug() << "Detecting minimum size with VIDIOC_S_FMT failed (" << errno << ").Returned maxwidth: " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ // Note VIDIOC_S_FMT may change width and height.
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ minwidth = fmt.fmt.pix.width;
|
||
+ minheight = fmt.fmt.pix.height;
|
||
+ }
|
||
+
|
||
+// Buggy driver paranoia
|
||
+/* min = fmt.fmt.pix.width * 2;
|
||
+ if (fmt.fmt.pix.bytesperline < min)
|
||
+ fmt.fmt.pix.bytesperline = min;
|
||
+ min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
|
||
+ if (fmt.fmt.pix.sizeimage < min)
|
||
+ fmt.fmt.pix.sizeimage = min;
|
||
+ m_buffer_size=fmt.fmt.pix.sizeimage ;*/
|
||
+
|
||
+ int inputisok=EXIT_SUCCESS;
|
||
+ m_input.clear();
|
||
+ for(unsigned int loop=0; inputisok==EXIT_SUCCESS; loop++)
|
||
+ {
|
||
+ struct v4l2_input videoinput;
|
||
+ CLEAR(videoinput);
|
||
+ videoinput.index = loop;
|
||
+ inputisok=xioctl(VIDIOC_ENUMINPUT, &videoinput);
|
||
+ if(inputisok==EXIT_SUCCESS)
|
||
+ {
|
||
+ VideoInput tempinput;
|
||
+ tempinput.name = QString::fromLocal8Bit((const char*)videoinput.name);
|
||
+ tempinput.hastuner = videoinput.type & V4L2_INPUT_TYPE_TUNER;
|
||
+detectSignalStandards();
|
||
+ tempinput.m_standards = videoinput.std;
|
||
+ m_input.push_back(tempinput);
|
||
+ kDebug() << "Input " << loop << ": " << tempinput.name << " (tuner: " << ((videoinput.type & V4L2_INPUT_TYPE_TUNER) != 0) << ")";
|
||
+ if((videoinput.type & V4L2_INPUT_TYPE_TUNER) != 0)
|
||
+ {
|
||
+// _tunerForInput[name] = desc.tuner;
|
||
+// _isTuner = true;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+// _tunerForInput[name] = -1;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+// V4L-only drivers should return an EINVAL in errno to indicate they cannot handle V4L2 calls. Not every driver is compliant, so
|
||
+// it will try the V4L api even if the error code is different than expected.
|
||
+ kDebug() << "checkDevice(): " << full_filename << " is not a V4L2 device.";
|
||
+ }
|
||
+
|
||
+#endif
|
||
+
|
||
+ CLEAR(V4L_capabilities);
|
||
+
|
||
+ if(m_driver==VIDEODEV_DRIVER_NONE)
|
||
+ {
|
||
+ kDebug() << "checkDevice(): " << full_filename << " Trying V4L API.";
|
||
+ if (-1 == xioctl (VIDIOCGCAP, &V4L_capabilities))
|
||
+ {
|
||
+ perror ("ioctl (VIDIOCGCAP)");
|
||
+ m_driver = VIDEODEV_DRIVER_NONE;
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ kDebug() << full_filename << " is a V4L device.";
|
||
+ m_driver = VIDEODEV_DRIVER_V4L;
|
||
+ m_model=QString::fromLocal8Bit((const char*)V4L_capabilities.name);
|
||
+ if(V4L_capabilities.type & VID_TYPE_CAPTURE)
|
||
+ m_videocapture=true;
|
||
+ if(V4L_capabilities.type & VID_TYPE_CHROMAKEY)
|
||
+ m_videochromakey=true;
|
||
+ if(V4L_capabilities.type & VID_TYPE_SCALES)
|
||
+ m_videoscale=true;
|
||
+ if(V4L_capabilities.type & VID_TYPE_OVERLAY)
|
||
+ m_videooverlay=true;
|
||
+// kDebug() << "libkopete (avdevice): Inputs : " << V4L_capabilities.channels;
|
||
+// kDebug() << "libkopete (avdevice): Audios : " << V4L_capabilities.audios;
|
||
+ minwidth = V4L_capabilities.minwidth;
|
||
+ maxwidth = V4L_capabilities.maxwidth;
|
||
+ minheight = V4L_capabilities.minheight;
|
||
+ maxheight = V4L_capabilities.maxheight;
|
||
+
|
||
+
|
||
+ int inputisok=EXIT_SUCCESS;
|
||
+ m_input.clear();
|
||
+ for(int loop=0; loop < V4L_capabilities.channels; loop++)
|
||
+ {
|
||
+ struct video_channel videoinput;
|
||
+ CLEAR(videoinput);
|
||
+ videoinput.channel = loop;
|
||
+ videoinput.norm = 1;
|
||
+ inputisok=xioctl(VIDIOCGCHAN, &videoinput);
|
||
+ if(inputisok==EXIT_SUCCESS)
|
||
+ {
|
||
+ VideoInput tempinput;
|
||
+ tempinput.name = QString::fromLocal8Bit((const char*)videoinput.name);
|
||
+ tempinput.hastuner=videoinput.flags & VIDEO_VC_TUNER;
|
||
+// TODO: The routine to detect the appropriate video standards for V4L must be placed here
|
||
+ m_input.push_back(tempinput);
|
||
+// kDebug() << "libkopete (avdevice): Input " << loop << ": " << tempinput.name << " (tuner: " << ((videoinput.flags & VIDEO_VC_TUNER) != 0) << ")";
|
||
+/* if((input.type & V4L2_INPUT_TYPE_TUNER) != 0)
|
||
+ {
|
||
+// _tunerForInput[name] = desc.tuner;
|
||
+// _isTuner = true;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+// _tunerForInput[name] = -1;
|
||
+ }
|
||
+*/ }
|
||
+ }
|
||
+
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+ m_name=m_model; // Take care about changing the name to be different from the model itself...
|
||
+
|
||
+ detectPixelFormats();
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ enumerateControls();
|
||
+#endif
|
||
+// TODO: Now we must execute the proper initialization according to the type of the driver.
|
||
+ kDebug() << "checkDevice() exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::showDeviceCapabilities()
|
||
+ */
|
||
+int VideoDevice::showDeviceCapabilities()
|
||
+{
|
||
+ kDebug() << "showDeviceCapabilities() called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+/* kDebug() << "libkopete (avdevice): Driver: " << (const char*)V4L2_capabilities.driver << " "
|
||
+ << ((V4L2_capabilities.version>>16) & 0xFF) << "."
|
||
+ << ((V4L2_capabilities.version>> 8) & 0xFF) << "."
|
||
+ << ((V4L2_capabilities.version ) & 0xFF) << endl;
|
||
+ kDebug() << "libkopete (avdevice): Device: " << name;
|
||
+ kDebug() << "libkopete (avdevice): Capabilities:";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_CAPTURE)
|
||
+ kDebug() << "libkopete (avdevice): Video capture";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_OUTPUT)
|
||
+ kDebug() << "libkopete (avdevice): Video output";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_OVERLAY)
|
||
+ kDebug() << "libkopete (avdevice): Video overlay";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_VBI_CAPTURE)
|
||
+ kDebug() << "libkopete (avdevice): VBI capture";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_VBI_OUTPUT)
|
||
+ kDebug() << "libkopete (avdevice): VBI output";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_RDS_CAPTURE)
|
||
+ kDebug() << "libkopete (avdevice): RDS capture";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_TUNER)
|
||
+ kDebug() << "libkopete (avdevice): Tuner IO";
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_AUDIO)
|
||
+ kDebug() << "libkopete (avdevice): Audio IO";
|
||
+;*/
|
||
+ kDebug() << "Device model: " << m_model;
|
||
+ kDebug() << "Device name : " << m_name;
|
||
+ kDebug() << "Capabilities:";
|
||
+ if(canCapture())
|
||
+ kDebug() << " Video capture";
|
||
+ if(canRead())
|
||
+ kDebug() << " Read";
|
||
+ if(canAsyncIO())
|
||
+ kDebug() << " Asynchronous input/output";
|
||
+ if(canStream())
|
||
+ kDebug() << " Streaming";
|
||
+ if(canChromakey())
|
||
+ kDebug() << " Video chromakey";
|
||
+ if(canScale())
|
||
+ kDebug() << " Video scales";
|
||
+ if(canOverlay())
|
||
+ kDebug() << " Video overlay";
|
||
+// kDebug() << "libkopete (avdevice): Audios : " << V4L_capabilities.audios;
|
||
+ kDebug() << " Max res: " << maxWidth() << " x " << maxHeight();
|
||
+ kDebug() << " Min res: " << minWidth() << " x " << minHeight();
|
||
+ kDebug() << " Inputs : " << inputs();
|
||
+ for (int loop=0; loop < inputs(); loop++)
|
||
+ kDebug() << "Input " << loop << ": " << m_input[loop].name << " (tuner: " << m_input[loop].hastuner << ")";
|
||
+ kDebug() << "showDeviceCapabilities() exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::initDevice()
|
||
+ */
|
||
+int VideoDevice::initDevice()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "initDevice() started";
|
||
+ if(-1 == descriptor)
|
||
+ {
|
||
+ kDebug() << "initDevice() Device is not open";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ m_io_method = IO_METHOD_NONE;
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_READWRITE)
|
||
+ {
|
||
+ m_videoread=true;
|
||
+ m_io_method = IO_METHOD_READ;
|
||
+ kDebug() << " Read/Write interface";
|
||
+ }
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_ASYNCIO)
|
||
+ {
|
||
+ m_videoasyncio=true;
|
||
+ kDebug() << " Async IO interface";
|
||
+ }
|
||
+ if(V4L2_capabilities.capabilities & V4L2_CAP_STREAMING)
|
||
+ {
|
||
+ m_videostream=true;
|
||
+ m_io_method = IO_METHOD_MMAP;
|
||
+// m_io_method = IO_METHOD_USERPTR;
|
||
+ kDebug() << " Streaming interface";
|
||
+ }
|
||
+ if(m_io_method==IO_METHOD_NONE)
|
||
+ {
|
||
+ kDebug() << "initDevice() Found no suitable input/output method for " << full_filename;
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ m_videoread=true;
|
||
+ m_io_method=IO_METHOD_READ;
|
||
+ if(-1 != xioctl(VIDIOCGFBUF,&V4L_videobuffer))
|
||
+ {
|
||
+// m_videostream=true;
|
||
+// m_io_method = IO_METHOD_MMAP;
|
||
+ kDebug() << " Streaming interface";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+
|
||
+ break;
|
||
+ }
|
||
+
|
||
+// Select video input, video standard and tune here.
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ if (-1 == xioctl (VIDIOC_CROPCAP, &cropcap))
|
||
+ { // Errors ignored.
|
||
+ }
|
||
+ crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ crop.c = cropcap.defrect; // reset to default
|
||
+ if (-1 == xioctl (VIDIOC_S_CROP, &crop))
|
||
+ {
|
||
+ switch (errno)
|
||
+ {
|
||
+ case EINVAL: break; // Cropping not supported.
|
||
+ default: break; // Errors ignored.
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+#endif
|
||
+
|
||
+ showDeviceCapabilities();
|
||
+ kDebug() << "initDevice() exited successfuly";
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+int VideoDevice::inputs()
|
||
+{
|
||
+ return m_input.size();
|
||
+}
|
||
+
|
||
+
|
||
+int VideoDevice::width()
|
||
+{
|
||
+ return currentwidth;
|
||
+}
|
||
+
|
||
+int VideoDevice::minWidth()
|
||
+{
|
||
+ return minwidth;
|
||
+}
|
||
+
|
||
+int VideoDevice::maxWidth()
|
||
+{
|
||
+ return maxwidth;
|
||
+}
|
||
+
|
||
+int VideoDevice::height()
|
||
+{
|
||
+ return currentheight;
|
||
+}
|
||
+
|
||
+int VideoDevice::minHeight()
|
||
+{
|
||
+ return minheight;
|
||
+}
|
||
+
|
||
+int VideoDevice::maxHeight()
|
||
+{
|
||
+ return maxheight;
|
||
+}
|
||
+
|
||
+int VideoDevice::setSize( int newwidth, int newheight)
|
||
+{
|
||
+kDebug() << "setSize(" << newwidth << ", " << newheight << ") called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+// It should not be there. It must remain in a completely distict place, cause this method should not change the pixelformat.
|
||
+// It shouldn't try to find a suitable pixel format this way. It should use values discovered by - detectPixelFormats() - to choose a valid one.
|
||
+ kDebug() << "Trying YUY422P";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUV422P))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support YUV422P format. Trying YUYV.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUYV))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support YUYV format. Trying UYVY.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_UYVY))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support UYVY format. Trying YUV420P.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUV420P))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support YUV420P format. Trying RGB24.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_RGB24))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support RGB24 format. Trying BGR24.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_BGR24))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support RGB24 format. Trying RGB32.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_RGB32))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support RGB32 format. Trying BGR32.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_BGR32))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support BGR32 format. Trying SBGGR8.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_SBGGR8))
|
||
+ {
|
||
+ kDebug() << "Device doesn't seem to support SBGGR8 format. Trying SN9C10X.";
|
||
+ if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_SN9C10X))
|
||
+ kDebug() << "Device doesn't seem to support BGR32 format. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if(newwidth > maxwidth ) newwidth = maxwidth;
|
||
+ if(newheight > maxheight) newheight = maxheight;
|
||
+ if(newwidth < minwidth ) newwidth = minwidth;
|
||
+ if(newheight < minheight) newheight = minheight;
|
||
+
|
||
+ currentwidth = newwidth;
|
||
+ currentheight = newheight;
|
||
+
|
||
+//kDebug() << "width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << width() << "x" << height();
|
||
+// Change resolution for the video device
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+// CLEAR (fmt);
|
||
+ if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
|
||
+ kDebug() << "VIDIOC_G_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ fmt.fmt.pix.width = width();
|
||
+ fmt.fmt.pix.height = height();
|
||
+ fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
||
+ if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ // Note VIDIOC_S_FMT may change width and height.
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+// Buggy driver paranoia.
|
||
+kDebug() << "VIDIOC_S_FMT worked (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ unsigned int min = fmt.fmt.pix.width * 2;
|
||
+ if (fmt.fmt.pix.bytesperline < min)
|
||
+ fmt.fmt.pix.bytesperline = min;
|
||
+ min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
|
||
+ if (fmt.fmt.pix.sizeimage < min)
|
||
+ fmt.fmt.pix.sizeimage = min;
|
||
+ m_buffer_size=fmt.fmt.pix.sizeimage ;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_window V4L_videowindow;
|
||
+
|
||
+ if (xioctl (VIDIOCGWIN, &V4L_videowindow)== -1)
|
||
+ {
|
||
+ perror ("ioctl VIDIOCGWIN");
|
||
+// return (NULL);
|
||
+ }
|
||
+ V4L_videowindow.width = width();
|
||
+ V4L_videowindow.height = height();
|
||
+ V4L_videowindow.clipcount=0;
|
||
+ if (xioctl (VIDIOCSWIN, &V4L_videowindow)== -1)
|
||
+ {
|
||
+ perror ("ioctl VIDIOCSWIN");
|
||
+// return (NULL);
|
||
+ }
|
||
+kDebug() << "------------- width: " << V4L_videowindow.width << " Height: " << V4L_videowindow.height << " Clipcount: " << V4L_videowindow.clipcount << " -----------------";
|
||
+
|
||
+// kDebug() << "libkopete (avdevice): V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
|
||
+
|
||
+/* if(-1 == xioctl(VIDIOCGFBUF,&V4L_videobuffer))
|
||
+ kDebug() << "libkopete (avdevice): VIDIOCGFBUF failed (" << errno << "): Device cannot stream";*/
|
||
+
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ m_buffer_size = width() * height() * pixelFormatDepth(m_pixelformat) / 8;
|
||
+kDebug() << "------------------------- ------- -- m_buffer_size: " << m_buffer_size << " !!! -- ------- -----------------------------------------";
|
||
+
|
||
+ m_currentbuffer.pixelformat=m_pixelformat;
|
||
+ m_currentbuffer.data.resize(m_buffer_size);
|
||
+
|
||
+ switch (m_io_method)
|
||
+ {
|
||
+ case IO_METHOD_NONE: break;
|
||
+ case IO_METHOD_READ: initRead (); break;
|
||
+ case IO_METHOD_MMAP: initMmap (); break;
|
||
+ case IO_METHOD_USERPTR: initUserptr (); break;
|
||
+ }
|
||
+
|
||
+kDebug() << "setSize(" << newwidth << ", " << newheight << ") exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+kDebug() << "setSize(" << newwidth << ", " << newheight << ") Device is not open.";
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+pixel_format VideoDevice::setPixelFormat(pixel_format newformat)
|
||
+{
|
||
+ pixel_format ret = PIXELFORMAT_NONE;
|
||
+//kDebug() << "called.";
|
||
+// Change the pixel format for the video device
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+// CLEAR (fmt);
|
||
+ if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
|
||
+ {
|
||
+// return errnoReturn ("VIDIOC_S_FMT");
|
||
+// kDebug() << "VIDIOC_G_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ }
|
||
+ else
|
||
+ m_pixelformat = pixelFormatForPalette(fmt.fmt.pix.pixelformat);
|
||
+
|
||
+ fmt.fmt.pix.pixelformat = pixelFormatCode(newformat);
|
||
+ if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
|
||
+ {
|
||
+// kDebug() << "VIDIOC_S_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if (fmt.fmt.pix.pixelformat == pixelFormatCode(newformat)) // Thih "if" (not what is contained within) is a fix for a bug in sn9c102 driver.
|
||
+ {
|
||
+ m_pixelformat = newformat;
|
||
+ ret = m_pixelformat;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+// kDebug() << "V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
|
||
+ V4L_picture.palette = pixelFormatCode(newformat);
|
||
+ V4L_picture.depth = pixelFormatDepth(newformat);
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ {
|
||
+// kDebug() << "Device seems to not support " << pixelFormatName(newformat) << " format. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+
|
||
+// kDebug() << "V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
|
||
+ m_pixelformat=pixelFormatForPalette(V4L_picture.palette);
|
||
+ if (m_pixelformat == newformat)
|
||
+ ret = newformat;
|
||
+
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return ret;
|
||
+}
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevice::currentInput()
|
||
+ */
|
||
+int VideoDevice::currentInput()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if(isOpen())
|
||
+ {
|
||
+ return m_current_input;
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevice::selectInput(int input)
|
||
+ */
|
||
+int VideoDevice::selectInput(int newinput)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if(m_current_input >= inputs())
|
||
+ return EXIT_FAILURE;
|
||
+
|
||
+ if(isOpen())
|
||
+ {
|
||
+ switch (m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ if (-1 == ioctl (descriptor, VIDIOC_S_INPUT, &newinput))
|
||
+ {
|
||
+ perror ("VIDIOC_S_INPUT");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ struct video_channel V4L_input;
|
||
+ V4L_input.channel=newinput;
|
||
+ V4L_input.norm=4; // Hey, it's plain wrong! It should be input's signal standard!
|
||
+ if (-1 == ioctl (descriptor, VIDIOCSCHAN, &V4L_input))
|
||
+ {
|
||
+ perror ("ioctl (VIDIOCSCHAN)");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ kDebug() << "Selected input " << newinput << " (" << m_input[newinput].name << ")";
|
||
+ m_current_input = newinput;
|
||
+ setInputParameters();
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevice::setInputParameters()
|
||
+ */
|
||
+int VideoDevice::setInputParameters()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if( (isOpen()) && (m_current_input < inputs() ) )
|
||
+ {
|
||
+ setBrightness( getBrightness() );
|
||
+ setContrast( getContrast() );
|
||
+ setSaturation( getSaturation() );
|
||
+ setWhiteness( getWhiteness() );
|
||
+ setHue( getHue() );
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::startCapturing()
|
||
+ */
|
||
+int VideoDevice::startCapturing()
|
||
+{
|
||
+
|
||
+ kDebug() << "called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ switch (m_io_method)
|
||
+ {
|
||
+ case IO_METHOD_NONE: // Device cannot capture frames
|
||
+ return EXIT_FAILURE;
|
||
+ break;
|
||
+ case IO_METHOD_READ: // Nothing to do
|
||
+ break;
|
||
+ case IO_METHOD_MMAP:
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ {
|
||
+ unsigned int loop;
|
||
+ for (loop = 0; loop < m_streambuffers; ++loop)
|
||
+ {
|
||
+ struct v4l2_buffer buf;
|
||
+ CLEAR (buf);
|
||
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ buf.memory = V4L2_MEMORY_MMAP;
|
||
+ buf.index = loop;
|
||
+ if (-1 == xioctl (VIDIOC_QBUF, &buf))
|
||
+ return errnoReturn ("VIDIOC_QBUF");
|
||
+ }
|
||
+ enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ if (-1 == xioctl (VIDIOC_STREAMON, &type))
|
||
+ return errnoReturn ("VIDIOC_STREAMON");
|
||
+ }
|
||
+#endif
|
||
+#endif
|
||
+ break;
|
||
+ case IO_METHOD_USERPTR:
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ {
|
||
+ unsigned int loop;
|
||
+ for (loop = 0; loop < m_streambuffers; ++loop)
|
||
+ {
|
||
+ struct v4l2_buffer buf;
|
||
+ CLEAR (buf);
|
||
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ buf.memory = V4L2_MEMORY_USERPTR;
|
||
+ buf.m.userptr = (unsigned long) m_rawbuffers[loop].start;
|
||
+ buf.length = m_rawbuffers[loop].length;
|
||
+ if (-1 == xioctl (VIDIOC_QBUF, &buf))
|
||
+ return errnoReturn ("VIDIOC_QBUF");
|
||
+ }
|
||
+ enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ if (-1 == xioctl (VIDIOC_STREAMON, &type))
|
||
+ return errnoReturn ("VIDIOC_STREAMON");
|
||
+ }
|
||
+#endif
|
||
+#endif
|
||
+ break;
|
||
+ }
|
||
+
|
||
+ kDebug() << "exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::getFrame()
|
||
+ */
|
||
+int VideoDevice::getFrame()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ ssize_t bytesread;
|
||
+
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ struct v4l2_buffer v4l2buffer;
|
||
+#endif
|
||
+#endif
|
||
+// kDebug() << "getFrame() called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ switch (m_io_method)
|
||
+ {
|
||
+ case IO_METHOD_NONE: // Device cannot capture frames
|
||
+ return EXIT_FAILURE;
|
||
+ break;
|
||
+ case IO_METHOD_READ:
|
||
+// kDebug() << "Using IO_METHOD_READ.File descriptor: " << descriptor << " Buffer address: " << &m_currentbuffer.data[0] << " Size: " << m_currentbuffer.data.size();
|
||
+ bytesread = read (descriptor, &m_currentbuffer.data[0], m_currentbuffer.data.size());
|
||
+ if (-1 == bytesread) // must verify this point with ov511 driver.
|
||
+ {
|
||
+ kDebug() << "IO_METHOD_READ failed.";
|
||
+ switch (errno)
|
||
+ {
|
||
+ case EAGAIN:
|
||
+ return EXIT_FAILURE;
|
||
+ case EIO: /* Could ignore EIO, see spec. fall through */
|
||
+ default:
|
||
+ return errnoReturn ("read");
|
||
+ }
|
||
+ }
|
||
+ if((int)m_currentbuffer.data.size() < bytesread)
|
||
+ {
|
||
+ kDebug() << "IO_METHOD_READ returned less bytes (" << bytesread << ") than it was asked for (" << m_currentbuffer.data.size() <<").";
|
||
+ }
|
||
+ break;
|
||
+ case IO_METHOD_MMAP:
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ CLEAR (v4l2buffer);
|
||
+ v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ v4l2buffer.memory = V4L2_MEMORY_MMAP;
|
||
+ if (-1 == xioctl (VIDIOC_DQBUF, &v4l2buffer))
|
||
+ {
|
||
+ kDebug() << full_filename << " MMAPed getFrame failed.";
|
||
+ switch (errno)
|
||
+ {
|
||
+ case EAGAIN:
|
||
+ {
|
||
+ kDebug() << full_filename << " MMAPed getFrame failed: EAGAIN. Pointer: ";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ case EIO: /* Could ignore EIO, see spec. fall through */
|
||
+ default:
|
||
+ return errnoReturn ("VIDIOC_DQBUF");
|
||
+ }
|
||
+ }
|
||
+/* if (v4l2buffer.index < m_streambuffers)
|
||
+ return EXIT_FAILURE;*/ //it was an assert()
|
||
+// kDebug() << "m_rawbuffers[" << v4l2buffer.index << "].start: " << (void *)m_rawbuffers[v4l2buffer.index].start << " Size: " << m_currentbuffer.data.size();
|
||
+
|
||
+memcpy(&m_currentbuffer.data[0], m_rawbuffers[v4l2buffer.index].start, m_currentbuffer.data.size());
|
||
+ if (-1 == xioctl (VIDIOC_QBUF, &v4l2buffer))
|
||
+ return errnoReturn ("VIDIOC_QBUF");
|
||
+#endif
|
||
+#endif
|
||
+ break;
|
||
+ case IO_METHOD_USERPTR:
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ {
|
||
+ unsigned int i;
|
||
+ CLEAR (v4l2buffer);
|
||
+ v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ v4l2buffer.memory = V4L2_MEMORY_USERPTR;
|
||
+ if (-1 == xioctl (VIDIOC_DQBUF, &v4l2buffer))
|
||
+ {
|
||
+ switch (errno)
|
||
+ {
|
||
+ case EAGAIN:
|
||
+ return EXIT_FAILURE;
|
||
+ case EIO: /* Could ignore EIO, see spec. fall through */
|
||
+ default:
|
||
+ return errnoReturn ("VIDIOC_DQBUF");
|
||
+ }
|
||
+ }
|
||
+ for (i = 0; i < m_streambuffers; ++i)
|
||
+ if (v4l2buffer.m.userptr == (unsigned long) m_rawbuffers[i].start && v4l2buffer.length == m_rawbuffers[i].length)
|
||
+ break;
|
||
+ if (i < m_streambuffers)
|
||
+ return EXIT_FAILURE;
|
||
+ if (-1 == xioctl (VIDIOC_QBUF, &v4l2buffer))
|
||
+ return errnoReturn ("VIDIOC_QBUF");
|
||
+ }
|
||
+#endif
|
||
+#endif
|
||
+ break;
|
||
+ }
|
||
+// kDebug() << "exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::getFrame(imagebuffer *imgbuffer)
|
||
+ */
|
||
+int VideoDevice::getFrame(imagebuffer *imgbuffer)
|
||
+{
|
||
+ if(imgbuffer)
|
||
+ {
|
||
+ getFrame();
|
||
+ imgbuffer->height = m_currentbuffer.height;
|
||
+ imgbuffer->width = m_currentbuffer.width;
|
||
+ imgbuffer->pixelformat = m_currentbuffer.pixelformat;
|
||
+ imgbuffer->data = m_currentbuffer.data;
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevice::getImage(const QImage *qimage)
|
||
+ */
|
||
+int VideoDevice::getImage(QImage *qimage)
|
||
+{
|
||
+ /// @todo implement me
|
||
+
|
||
+ // do NOT delete qimage here, as it is received as a parameter
|
||
+ if (qimage->width() != width() || qimage->height() != height())
|
||
+ *qimage = QImage(width(), height(), QImage::Format_RGB32);
|
||
+
|
||
+ uchar *bits=qimage->bits();
|
||
+// kDebug() << "Capturing in " << pixelFormatName(m_currentbuffer.pixelformat);
|
||
+ switch(m_currentbuffer.pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case PIXELFORMAT_RGB332 :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = (m_currentbuffer.data[step]>>5<<5)+(m_currentbuffer.data[step]>>5<<2)+(m_currentbuffer.data[step]>>6);
|
||
+ bits[loop+1] = (m_currentbuffer.data[step]>>2<<5)+(m_currentbuffer.data[step]<<3>>5<<2)+(m_currentbuffer.data[step]<<3>>6);
|
||
+ bits[loop+2] = (m_currentbuffer.data[step]<<6)+(m_currentbuffer.data[step]<<6>>2)+(m_currentbuffer.data[step]<<6>>4)+(m_currentbuffer.data[step]<<6>>6);
|
||
+ bits[loop+3] = 255;
|
||
+ step++;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_RGB444 : break;
|
||
+ case PIXELFORMAT_RGB555 : break;
|
||
+ case PIXELFORMAT_RGB565 :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = (m_currentbuffer.data[step]<<3)+(m_currentbuffer.data[step]<<3>>5);
|
||
+ bits[loop+1] = ((m_currentbuffer.data[step+1])<<5)|m_currentbuffer.data[step]>>5;
|
||
+ bits[loop+2] = ((m_currentbuffer.data[step+1])&248)+((m_currentbuffer.data[step+1])>>5);
|
||
+ bits[loop+3] = 255;
|
||
+ step+=2;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_RGB555X: break;
|
||
+ case PIXELFORMAT_RGB565X: break;
|
||
+ case PIXELFORMAT_BGR24 :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_currentbuffer.data[step+2];
|
||
+ bits[loop+1] = m_currentbuffer.data[step+1];
|
||
+ bits[loop+2] = m_currentbuffer.data[step];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_RGB24 :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_currentbuffer.data[step];
|
||
+ bits[loop+1] = m_currentbuffer.data[step+1];
|
||
+ bits[loop+2] = m_currentbuffer.data[step+2];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_BGR32 :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_currentbuffer.data[step+2];
|
||
+ bits[loop+1] = m_currentbuffer.data[step+1];
|
||
+ bits[loop+2] = m_currentbuffer.data[step];
|
||
+ bits[loop+3] = m_currentbuffer.data[step+3];
|
||
+ step+=4;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_RGB32 : memcpy(bits,&m_currentbuffer.data[0], m_currentbuffer.data.size());
|
||
+ break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case PIXELFORMAT_SBGGR8 :
|
||
+ {
|
||
+ unsigned char *d = (unsigned char *) malloc (width() * height() * 3);
|
||
+ bayer2rgb24(d, &m_currentbuffer.data.first(), width(), height());
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = d[step+2];
|
||
+ bits[loop+1] = d[step+1];
|
||
+ bits[loop+2] = d[step];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ free(d);
|
||
+ }
|
||
+ break;
|
||
+
|
||
+// YUV formats
|
||
+ case PIXELFORMAT_GREY :
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_currentbuffer.data[step];
|
||
+ bits[loop+1] = m_currentbuffer.data[step];
|
||
+ bits[loop+2] = m_currentbuffer.data[step];
|
||
+ bits[loop+3] = 255;
|
||
+ step++;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_YUYV:
|
||
+ case PIXELFORMAT_UYVY:
|
||
+ case PIXELFORMAT_YUV420P:
|
||
+ case PIXELFORMAT_YUV422P:
|
||
+ {
|
||
+ uchar *yptr, *cbptr, *crptr;
|
||
+ bool halfheight=false;
|
||
+ bool packed=false;
|
||
+// Adjust algorythm to specific YUV data arrangements.
|
||
+ if (m_currentbuffer.pixelformat == PIXELFORMAT_YUV420P)
|
||
+ halfheight=true;
|
||
+ if (m_currentbuffer.pixelformat == PIXELFORMAT_YUYV)
|
||
+ {
|
||
+ yptr = &m_currentbuffer.data[0];
|
||
+ cbptr = yptr + 1;
|
||
+ crptr = yptr + 3;
|
||
+ packed=true;
|
||
+ }
|
||
+ else if (m_currentbuffer.pixelformat == PIXELFORMAT_UYVY)
|
||
+ {
|
||
+ cbptr = &m_currentbuffer.data[0];
|
||
+ yptr = cbptr + 1;
|
||
+ crptr = cbptr + 2;
|
||
+ packed=true;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ yptr = &m_currentbuffer.data[0];
|
||
+ cbptr = yptr + (width()*height());
|
||
+ crptr = cbptr + (width()*height()/(halfheight ? 4:2));
|
||
+ }
|
||
+
|
||
+ for(int y=0; y<height(); y++)
|
||
+ {
|
||
+// Decode scanline
|
||
+ for(int x=0; x<width(); x++)
|
||
+ {
|
||
+ int c,d,e;
|
||
+
|
||
+ if (packed)
|
||
+ {
|
||
+ c = (yptr[x<<1])-16;
|
||
+ d = (cbptr[x>>1<<2])-128;
|
||
+ e = (crptr[x>>1<<2])-128;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ c = (yptr[x])-16;
|
||
+ d = (cbptr[x>>1])-128;
|
||
+ e = (crptr[x>>1])-128;
|
||
+ }
|
||
+
|
||
+ int r = (298 * c + 409 * e + 128)>>8;
|
||
+ int g = (298 * c - 100 * d - 208 * e + 128)>>8;
|
||
+ int b = (298 * c + 516 * d + 128)>>8;
|
||
+
|
||
+ if (r<0) r=0; if (r>255) r=255;
|
||
+ if (g<0) g=0; if (g>255) g=255;
|
||
+ if (b<0) b=0; if (b>255) b=255;
|
||
+
|
||
+ uint *p = (uint*)qimage->scanLine(y)+x;
|
||
+ *p = qRgba(r,g,b,255);
|
||
+
|
||
+ }
|
||
+// Jump to next line
|
||
+ if (packed)
|
||
+ {
|
||
+ yptr+=width()*2;
|
||
+ cbptr+=width()*2;
|
||
+ crptr+=width()*2;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ yptr+=width();
|
||
+ if (!halfheight || y&1)
|
||
+ {
|
||
+ cbptr+=width()/2;
|
||
+ crptr+=width()/2;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+
|
||
+// Compressed formats
|
||
+ case PIXELFORMAT_JPEG : break;
|
||
+ case PIXELFORMAT_MPEG : break;
|
||
+
|
||
+// Reserved formats
|
||
+ case PIXELFORMAT_DV : break;
|
||
+ case PIXELFORMAT_ET61X251:break;
|
||
+ case PIXELFORMAT_HI240 : break;
|
||
+ case PIXELFORMAT_HM12 : break;
|
||
+ case PIXELFORMAT_MJPEG : break;
|
||
+ case PIXELFORMAT_PWC1 : break;
|
||
+ case PIXELFORMAT_PWC2 : break;
|
||
+ case PIXELFORMAT_SN9C10X:
|
||
+ {
|
||
+ unsigned char *s = new unsigned char [width() * height()];
|
||
+ unsigned char *d = new unsigned char [width() * height() * 3];
|
||
+ sonix_decompress_init();
|
||
+ sonix_decompress(width(), height(), &m_currentbuffer.data.first(), s);
|
||
+ bayer2rgb24(d, s, width(), height());
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = d[step+2];
|
||
+ bits[loop+1] = d[step+1];
|
||
+ bits[loop+2] = d[step];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ delete[] s;
|
||
+ delete[] d;
|
||
+ }
|
||
+ case PIXELFORMAT_WNVA : break;
|
||
+ case PIXELFORMAT_YYUV : break;
|
||
+ }
|
||
+
|
||
+// Proccesses image for automatic Brightness/Contrast/Color correction
|
||
+ if (getAutoBrightnessContrast()||getAutoColorCorrection())
|
||
+ {
|
||
+ unsigned long long result=0;
|
||
+ unsigned long long R=0, G=0, B=0, A=0, global=0;
|
||
+ int Rmax=0, Gmax=0, Bmax=0, Amax=0, globalmax=0;
|
||
+ int Rmin=255, Gmin=255, Bmin=255, Amin=255, globalmin=255;
|
||
+ int Rrange=255, Grange=255, Brange=255, Arange=255, globarange=255;
|
||
+
|
||
+// Finds minimum and maximum intensity for each color component
|
||
+ for(unsigned int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ R+=bits[loop];
|
||
+ G+=bits[loop+1];
|
||
+ B+=bits[loop+2];
|
||
+// A+=bits[loop+3];
|
||
+ if (bits[loop] < Rmin) Rmin = bits[loop];
|
||
+ if (bits[loop+1] < Gmin) Gmin = bits[loop+1];
|
||
+ if (bits[loop+2] < Bmin) Bmin = bits[loop+2];
|
||
+// if (bits[loop+3] < Amin) Amin = bits[loop+3];
|
||
+ if (bits[loop] > Rmax) Rmax = bits[loop];
|
||
+ if (bits[loop+1] > Gmax) Gmax = bits[loop+1];
|
||
+ if (bits[loop+2] > Bmax) Bmax = bits[loop+2];
|
||
+// if (bits[loop+3] > Amax) Amax = bits[loop+3];
|
||
+ }
|
||
+ global = R + G + B;
|
||
+// Finds overall minimum and maximum intensity
|
||
+ if (Rmin > Gmin) globalmin = Gmin; else globalmin = Rmin; if (Bmin < globalmin) globalmin = Bmin;
|
||
+ if (Rmax > Gmax) globalmax = Rmax; else globalmax = Gmax; if (Bmax > globalmax) globalmax = Bmax;
|
||
+// If no color correction should be performed, simply level all the intensities so they're just the same.
|
||
+// In fact color correction should use the R, G and B variables to detect color deviation and "bump up" the saturation,
|
||
+// but it's computationally more expensive and the current way returns better results to the user.
|
||
+ if(!getAutoColorCorrection())
|
||
+ {
|
||
+ Rmin = globalmin ; Rmax = globalmax;
|
||
+ Gmin = globalmin ; Gmax = globalmax;
|
||
+ Bmin = globalmin ; Bmax = globalmax;
|
||
+// Amin = globalmin ; Amax = globalmax;
|
||
+ }
|
||
+// Calculates ranges and prevent a division by zero later on.
|
||
+ Rrange = Rmax - Rmin; if (Rrange == 0) Rrange = 255;
|
||
+ Grange = Gmax - Gmin; if (Grange == 0) Grange = 255;
|
||
+ Brange = Bmax - Bmin; if (Brange == 0) Brange = 255;
|
||
+// Arange = Amax - Amin; if (Arange == 0) Arange = 255;
|
||
+
|
||
+ kDebug() << " R: " << R << " G: " << G << " B: " << B << " A: " << A << " global: " << global <<
|
||
+ " Rmin: " << Rmin << " Gmin: " << Gmin << " Bmin: " << Bmin << " Amin: " << Amin << " globalmin: " << globalmin <<
|
||
+ " Rmax: " << Rmax << " Gmax: " << Gmax << " Bmax: " << Bmax << " Amax: " << Amax << " globalmax: " << globalmax ;
|
||
+
|
||
+ for(unsigned int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = (bits[loop] - Rmin) * 255 / (Rrange);
|
||
+ bits[loop+1] = (bits[loop+1] - Gmin) * 255 / (Grange);
|
||
+ bits[loop+2] = (bits[loop+2] - Bmin) * 255 / (Brange);
|
||
+// bits[loop+3] = (bits[loop+3] - Amin) * 255 / (Arange);
|
||
+ }
|
||
+ }
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::stopCapturing()
|
||
+ */
|
||
+int VideoDevice::stopCapturing()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ switch (m_io_method)
|
||
+ {
|
||
+ case IO_METHOD_NONE: // Device cannot capture frames
|
||
+ return EXIT_FAILURE;
|
||
+ break;
|
||
+ case IO_METHOD_READ: // Nothing to do
|
||
+ break;
|
||
+ case IO_METHOD_MMAP:
|
||
+ case IO_METHOD_USERPTR:
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ {
|
||
+ enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ if (-1 == xioctl (VIDIOC_STREAMOFF, &type))
|
||
+ return errnoReturn ("VIDIOC_STREAMOFF");
|
||
+
|
||
+ if (m_io_method == IO_METHOD_MMAP)
|
||
+ {
|
||
+ unsigned int loop;
|
||
+ for (loop = 0; loop < m_streambuffers; ++loop)
|
||
+ {
|
||
+ if (munmap(m_rawbuffers[loop].start,m_rawbuffers[loop].length) != 0)
|
||
+ {
|
||
+ kDebug() << "unable to munmap.";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+ break;
|
||
+ }
|
||
+ kDebug() << "exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::close()
|
||
+ */
|
||
+int VideoDevice::close()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << " called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ kDebug() << " Device is open. Trying to properly shutdown the device.";
|
||
+ stopCapturing();
|
||
+ kDebug() << "::close() returns " << ::close(descriptor);
|
||
+ }
|
||
+ descriptor = -1;
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+float VideoDevice::getBrightness()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getBrightness();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+float VideoDevice::setBrightness(float brightness)
|
||
+{
|
||
+ kDebug() << "(" << brightness << ") called.";
|
||
+ m_input[m_current_input].setBrightness(brightness); // Just to check bounds
|
||
+
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ {
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_control control;
|
||
+
|
||
+ CLEAR (queryctrl);
|
||
+ queryctrl.id = V4L2_CID_BRIGHTNESS;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (errno != EINVAL)
|
||
+ {
|
||
+ kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
|
||
+ } else
|
||
+ {
|
||
+ kDebug() << "Device doesn't support the Brightness control.";
|
||
+ }
|
||
+ } else
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ {
|
||
+ kDebug() << "Brightness control is disabled.";
|
||
+ } else
|
||
+ {
|
||
+ CLEAR (control);
|
||
+ control.id = V4L2_CID_BRIGHTNESS;
|
||
+ control.value = (__s32)((queryctrl.maximum - queryctrl.minimum)*getBrightness());
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_S_CTRL, &control))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+ V4L_picture.brightness = uint(65535 * getBrightness());
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ kDebug() << "Device seems to not support adjusting image brightness. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return getBrightness();
|
||
+}
|
||
+
|
||
+float VideoDevice::getContrast()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getContrast();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+float VideoDevice::setContrast(float contrast)
|
||
+{
|
||
+ kDebug() << "(" << contrast << ") called.";
|
||
+ m_input[m_current_input].setContrast(contrast); // Just to check bounds
|
||
+
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ {
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_control control;
|
||
+
|
||
+ CLEAR (queryctrl);
|
||
+ queryctrl.id = V4L2_CID_CONTRAST;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (errno != EINVAL)
|
||
+ {
|
||
+ kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
|
||
+ } else
|
||
+ {
|
||
+ kDebug() << "Device doesn't support the Contrast control.";
|
||
+ }
|
||
+ } else
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ {
|
||
+ kDebug() << "Contrast control is disabled.";
|
||
+ } else
|
||
+ {
|
||
+ CLEAR (control);
|
||
+ control.id = V4L2_CID_CONTRAST;
|
||
+ control.value = (__s32)((queryctrl.maximum - queryctrl.minimum)*getContrast());
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_S_CTRL, &control))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+ V4L_picture.contrast = uint(65535*getContrast());
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ kDebug() << "Device seems to not support adjusting image contrast. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return getContrast();
|
||
+}
|
||
+
|
||
+float VideoDevice::getSaturation()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getSaturation();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+float VideoDevice::setSaturation(float saturation)
|
||
+{
|
||
+ kDebug() << "(" << saturation << ") called.";
|
||
+ m_input[m_current_input].setSaturation(saturation); // Just to check bounds
|
||
+
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ {
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_control control;
|
||
+
|
||
+ CLEAR (queryctrl);
|
||
+ queryctrl.id = V4L2_CID_SATURATION;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (errno != EINVAL)
|
||
+ {
|
||
+ kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
|
||
+ } else
|
||
+ {
|
||
+ kDebug() << "Device doesn't support the Saturation control.";
|
||
+ }
|
||
+ } else
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ {
|
||
+ kDebug() << "Saturation control is disabled.";
|
||
+ } else
|
||
+ {
|
||
+ CLEAR (control);
|
||
+ control.id = V4L2_CID_SATURATION;
|
||
+ control.value = (__s32)((queryctrl.maximum - queryctrl.minimum)*getSaturation());
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_S_CTRL, &control))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+ V4L_picture.colour = uint(65535*getSaturation());
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ kDebug() << "Device seems to not support adjusting image saturation. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return getSaturation();
|
||
+}
|
||
+
|
||
+float VideoDevice::getWhiteness()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getWhiteness();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+float VideoDevice::setWhiteness(float whiteness)
|
||
+{
|
||
+ kDebug() << "(" << whiteness << ") called.";
|
||
+ m_input[m_current_input].setWhiteness(whiteness); // Just to check bounds
|
||
+
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ {
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_control control;
|
||
+
|
||
+ CLEAR (queryctrl);
|
||
+ queryctrl.id = V4L2_CID_WHITENESS;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (errno != EINVAL)
|
||
+ {
|
||
+ kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
|
||
+ } else
|
||
+ {
|
||
+ kDebug() << "Device doesn't support the Whiteness control.";
|
||
+ }
|
||
+ } else
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ {
|
||
+ kDebug() << "Whiteness control is disabled.";
|
||
+ } else
|
||
+ {
|
||
+ CLEAR (control);
|
||
+ control.id = V4L2_CID_WHITENESS;
|
||
+ control.value = (__s32)((queryctrl.maximum - queryctrl.minimum)*getWhiteness());
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_S_CTRL, &control))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+ V4L_picture.whiteness = uint(65535*getWhiteness());
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ kDebug() << "Device seems to not support adjusting white level. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return getWhiteness();
|
||
+}
|
||
+
|
||
+float VideoDevice::getHue()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getHue();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+float VideoDevice::setHue(float hue)
|
||
+{
|
||
+ kDebug() << "(" << hue << ") called.";
|
||
+ m_input[m_current_input].setHue(hue); // Just to check bounds
|
||
+
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ {
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_control control;
|
||
+
|
||
+ CLEAR (queryctrl);
|
||
+ queryctrl.id = V4L2_CID_HUE;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYCTRL, &queryctrl))
|
||
+ {
|
||
+ if (errno != EINVAL)
|
||
+ {
|
||
+ kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
|
||
+ } else
|
||
+ {
|
||
+ kDebug() << "Device doesn't support the Hue control.";
|
||
+ }
|
||
+ } else
|
||
+ if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
|
||
+ {
|
||
+ kDebug() << "Hue control is disabled.";
|
||
+ } else
|
||
+ {
|
||
+ CLEAR (control);
|
||
+ control.id = V4L2_CID_HUE;
|
||
+ control.value = (__s32)((queryctrl.maximum - queryctrl.minimum)*getHue());
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_S_CTRL, &control))
|
||
+ {
|
||
+ kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ {
|
||
+ struct video_picture V4L_picture;
|
||
+ if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
|
||
+ kDebug() << "VIDIOCGPICT failed (" << errno << ").";
|
||
+ V4L_picture.hue = uint(65535*getHue());
|
||
+ if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
|
||
+ kDebug() << "Device seems to not support adjusting image hue. Fallback to it is not yet implemented.";
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return getHue();
|
||
+}
|
||
+
|
||
+
|
||
+bool VideoDevice::getAutoBrightnessContrast()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getAutoBrightnessContrast();
|
||
+ else
|
||
+ return false;
|
||
+}
|
||
+
|
||
+bool VideoDevice::setAutoBrightnessContrast(bool brightnesscontrast)
|
||
+{
|
||
+ kDebug() << "VideoDevice::setAutoBrightnessContrast(" << brightnesscontrast << ") called.";
|
||
+ if (m_current_input < m_input.size() )
|
||
+ {
|
||
+ m_input[m_current_input].setAutoBrightnessContrast(brightnesscontrast);
|
||
+ return m_input[m_current_input].getAutoBrightnessContrast();
|
||
+ }
|
||
+ else
|
||
+ return false;
|
||
+
|
||
+}
|
||
+
|
||
+bool VideoDevice::getAutoColorCorrection()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getAutoColorCorrection();
|
||
+ else
|
||
+ return false;
|
||
+}
|
||
+
|
||
+bool VideoDevice::setAutoColorCorrection(bool colorcorrection)
|
||
+{
|
||
+ kDebug() << "VideoDevice::setAutoColorCorrection(" << colorcorrection << ") called.";
|
||
+ if (m_current_input < m_input.size() )
|
||
+ {
|
||
+ m_input[m_current_input].setAutoColorCorrection(colorcorrection);
|
||
+ return m_input[m_current_input].getAutoColorCorrection();
|
||
+ }
|
||
+ else
|
||
+ return false;
|
||
+}
|
||
+
|
||
+bool VideoDevice::getImageAsMirror()
|
||
+{
|
||
+ if (m_current_input < m_input.size() )
|
||
+ return m_input[m_current_input].getImageAsMirror();
|
||
+ else
|
||
+ return false;
|
||
+}
|
||
+
|
||
+bool VideoDevice::setImageAsMirror(bool imageasmirror)
|
||
+{
|
||
+ kDebug() << "VideoDevice::setImageAsMirror(" << imageasmirror << ") called.";
|
||
+ if (m_current_input < m_input.size() )
|
||
+ {
|
||
+ m_input[m_current_input].setImageAsMirror(imageasmirror);
|
||
+ return m_input[m_current_input].getImageAsMirror();
|
||
+ }
|
||
+ else
|
||
+ return false;
|
||
+}
|
||
+
|
||
+pixel_format VideoDevice::pixelFormatForPalette( int palette )
|
||
+{
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ switch(palette)
|
||
+ {
|
||
+ case 0 : return PIXELFORMAT_NONE; break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case V4L2_PIX_FMT_RGB332 : return PIXELFORMAT_RGB332; break;
|
||
+#if defined( V4L2_PIX_FMT_RGB444 )
|
||
+ case V4L2_PIX_FMT_RGB444 : return PIXELFORMAT_RGB444; break;
|
||
+#endif
|
||
+ case V4L2_PIX_FMT_RGB555 : return PIXELFORMAT_RGB555; break;
|
||
+ case V4L2_PIX_FMT_RGB565 : return PIXELFORMAT_RGB565; break;
|
||
+ case V4L2_PIX_FMT_RGB555X : return PIXELFORMAT_RGB555X; break;
|
||
+ case V4L2_PIX_FMT_RGB565X : return PIXELFORMAT_RGB565X; break;
|
||
+ case V4L2_PIX_FMT_BGR24 : return PIXELFORMAT_BGR24; break;
|
||
+ case V4L2_PIX_FMT_RGB24 : return PIXELFORMAT_RGB24; break;
|
||
+ case V4L2_PIX_FMT_BGR32 : return PIXELFORMAT_BGR32; break;
|
||
+ case V4L2_PIX_FMT_RGB32 : return PIXELFORMAT_RGB32; break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case V4L2_PIX_FMT_SBGGR8 : return PIXELFORMAT_SBGGR8; break;
|
||
+
|
||
+// YUV formats
|
||
+ case V4L2_PIX_FMT_GREY : return PIXELFORMAT_GREY; break;
|
||
+ case V4L2_PIX_FMT_YUYV : return PIXELFORMAT_YUYV; break;
|
||
+ case V4L2_PIX_FMT_UYVY : return PIXELFORMAT_UYVY; break;
|
||
+ case V4L2_PIX_FMT_YUV420 : return PIXELFORMAT_YUV420P; break;
|
||
+ case V4L2_PIX_FMT_YUV422P : return PIXELFORMAT_YUV422P; break;
|
||
+
|
||
+// Compressed formats
|
||
+ case V4L2_PIX_FMT_JPEG : return PIXELFORMAT_JPEG; break;
|
||
+ case V4L2_PIX_FMT_MPEG : return PIXELFORMAT_MPEG; break;
|
||
+
|
||
+// Reserved formats
|
||
+ case V4L2_PIX_FMT_DV : return PIXELFORMAT_DV; break;
|
||
+ case V4L2_PIX_FMT_ET61X251 : return PIXELFORMAT_ET61X251; break;
|
||
+ case V4L2_PIX_FMT_HI240 : return PIXELFORMAT_HI240; break;
|
||
+#if defined( V4L2_PIX_FMT_HM12 )
|
||
+ case V4L2_PIX_FMT_HM12 : return PIXELFORMAT_HM12; break;
|
||
+#endif
|
||
+ case V4L2_PIX_FMT_MJPEG : return PIXELFORMAT_MJPEG; break;
|
||
+ case V4L2_PIX_FMT_PWC1 : return PIXELFORMAT_PWC1; break;
|
||
+ case V4L2_PIX_FMT_PWC2 : return PIXELFORMAT_PWC2; break;
|
||
+ case V4L2_PIX_FMT_SN9C10X : return PIXELFORMAT_SN9C10X; break;
|
||
+ case V4L2_PIX_FMT_WNVA : return PIXELFORMAT_WNVA; break;
|
||
+ case V4L2_PIX_FMT_YYUV : return PIXELFORMAT_YYUV; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ switch(palette)
|
||
+ {
|
||
+ case 0 : return PIXELFORMAT_NONE; break;
|
||
+ case VIDEO_PALETTE_GREY : return PIXELFORMAT_GREY; break;
|
||
+ case VIDEO_PALETTE_HI240 : return PIXELFORMAT_RGB332; break;
|
||
+ case VIDEO_PALETTE_RGB555 : return PIXELFORMAT_RGB555; break;
|
||
+ case VIDEO_PALETTE_RGB565 : return PIXELFORMAT_RGB565; break;
|
||
+ case VIDEO_PALETTE_RGB24 : return PIXELFORMAT_RGB24; break;
|
||
+ case VIDEO_PALETTE_RGB32 : return PIXELFORMAT_RGB32; break;
|
||
+ case VIDEO_PALETTE_YUYV : return PIXELFORMAT_YUYV; break;
|
||
+ case VIDEO_PALETTE_UYVY : return PIXELFORMAT_UYVY; break;
|
||
+ case VIDEO_PALETTE_YUV420 :
|
||
+ case VIDEO_PALETTE_YUV420P : return PIXELFORMAT_YUV420P; break;
|
||
+ case VIDEO_PALETTE_YUV422P : return PIXELFORMAT_YUV422P; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ return PIXELFORMAT_NONE; break;
|
||
+ }
|
||
+ return PIXELFORMAT_NONE;
|
||
+}
|
||
+
|
||
+int VideoDevice::pixelFormatCode(pixel_format pixelformat)
|
||
+{
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : return 0; break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case PIXELFORMAT_RGB332 : return V4L2_PIX_FMT_RGB332; break;
|
||
+#if defined( V4L2_PIX_FMT_RGB444 )
|
||
+ case PIXELFORMAT_RGB444 : return V4L2_PIX_FMT_RGB444; break;
|
||
+#endif
|
||
+ case PIXELFORMAT_RGB555 : return V4L2_PIX_FMT_RGB555; break;
|
||
+ case PIXELFORMAT_RGB565 : return V4L2_PIX_FMT_RGB565; break;
|
||
+ case PIXELFORMAT_RGB555X: return V4L2_PIX_FMT_RGB555X; break;
|
||
+ case PIXELFORMAT_RGB565X: return V4L2_PIX_FMT_RGB565X; break;
|
||
+ case PIXELFORMAT_BGR24 : return V4L2_PIX_FMT_BGR24; break;
|
||
+ case PIXELFORMAT_RGB24 : return V4L2_PIX_FMT_RGB24; break;
|
||
+ case PIXELFORMAT_BGR32 : return V4L2_PIX_FMT_BGR32; break;
|
||
+ case PIXELFORMAT_RGB32 : return V4L2_PIX_FMT_RGB32; break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case PIXELFORMAT_SBGGR8 : return V4L2_PIX_FMT_SBGGR8; break;
|
||
+
|
||
+// YUV formats
|
||
+ case PIXELFORMAT_GREY : return V4L2_PIX_FMT_GREY; break;
|
||
+ case PIXELFORMAT_YUYV : return V4L2_PIX_FMT_YUYV; break;
|
||
+ case PIXELFORMAT_UYVY : return V4L2_PIX_FMT_UYVY; break;
|
||
+ case PIXELFORMAT_YUV420P: return V4L2_PIX_FMT_YUV420; break;
|
||
+ case PIXELFORMAT_YUV422P: return V4L2_PIX_FMT_YUV422P; break;
|
||
+
|
||
+// Compressed formats
|
||
+ case PIXELFORMAT_JPEG : return V4L2_PIX_FMT_JPEG; break;
|
||
+ case PIXELFORMAT_MPEG : return V4L2_PIX_FMT_MPEG; break;
|
||
+
|
||
+// Reserved formats
|
||
+ case PIXELFORMAT_DV : return V4L2_PIX_FMT_DV; break;
|
||
+ case PIXELFORMAT_ET61X251:return V4L2_PIX_FMT_ET61X251;break;
|
||
+ case PIXELFORMAT_HI240 : return V4L2_PIX_FMT_HI240; break;
|
||
+#if defined( V4L2_PIX_FMT_HM12 )
|
||
+ case PIXELFORMAT_HM12 : return V4L2_PIX_FMT_HM12; break;
|
||
+#endif
|
||
+ case PIXELFORMAT_MJPEG : return V4L2_PIX_FMT_MJPEG; break;
|
||
+ case PIXELFORMAT_PWC1 : return V4L2_PIX_FMT_PWC1; break;
|
||
+ case PIXELFORMAT_PWC2 : return V4L2_PIX_FMT_PWC2; break;
|
||
+ case PIXELFORMAT_SN9C10X: return V4L2_PIX_FMT_SN9C10X; break;
|
||
+ case PIXELFORMAT_WNVA : return V4L2_PIX_FMT_WNVA; break;
|
||
+ case PIXELFORMAT_YYUV : return V4L2_PIX_FMT_YYUV; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : return 0; break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case PIXELFORMAT_RGB332 : return VIDEO_PALETTE_HI240; break;
|
||
+ case PIXELFORMAT_RGB444 : return 0; break;
|
||
+ case PIXELFORMAT_RGB555 : return VIDEO_PALETTE_RGB555; break;
|
||
+ case PIXELFORMAT_RGB565 : return VIDEO_PALETTE_RGB565; break;
|
||
+ case PIXELFORMAT_RGB555X: return 0; break;
|
||
+ case PIXELFORMAT_RGB565X: return 0; break;
|
||
+ case PIXELFORMAT_BGR24 : return 0; break;
|
||
+ case PIXELFORMAT_RGB24 : return VIDEO_PALETTE_RGB24; break;
|
||
+ case PIXELFORMAT_BGR32 : return 0; break;
|
||
+ case PIXELFORMAT_RGB32 : return VIDEO_PALETTE_RGB32; break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case PIXELFORMAT_SBGGR8 : return 0; break;
|
||
+
|
||
+// YUV formats
|
||
+ case PIXELFORMAT_GREY : return VIDEO_PALETTE_GREY; break;
|
||
+ case PIXELFORMAT_YUYV : return VIDEO_PALETTE_YUYV; break;
|
||
+ case PIXELFORMAT_UYVY : return VIDEO_PALETTE_UYVY; break;
|
||
+ case PIXELFORMAT_YUV420P: return VIDEO_PALETTE_YUV420; break;
|
||
+ case PIXELFORMAT_YUV422P: return VIDEO_PALETTE_YUV422P; break;
|
||
+
|
||
+// Compressed formats
|
||
+ case PIXELFORMAT_JPEG : return 0; break;
|
||
+ case PIXELFORMAT_MPEG : return 0; break;
|
||
+
|
||
+// Reserved formats
|
||
+ case PIXELFORMAT_DV : return 0; break;
|
||
+ case PIXELFORMAT_ET61X251:return 0; break;
|
||
+ case PIXELFORMAT_HI240 : return VIDEO_PALETTE_HI240; break;
|
||
+ case PIXELFORMAT_HM12 : return 0; break;
|
||
+ case PIXELFORMAT_MJPEG : return 0; break;
|
||
+ case PIXELFORMAT_PWC1 : return 0; break;
|
||
+ case PIXELFORMAT_PWC2 : return 0; break;
|
||
+ case PIXELFORMAT_SN9C10X: return 0; break;
|
||
+ case PIXELFORMAT_WNVA : return 0; break;
|
||
+ case PIXELFORMAT_YYUV : return 0; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ return PIXELFORMAT_NONE; break;
|
||
+ }
|
||
+ return PIXELFORMAT_NONE;
|
||
+}
|
||
+
|
||
+int VideoDevice::pixelFormatDepth(pixel_format pixelformat)
|
||
+{
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : return 0; break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case PIXELFORMAT_RGB332 : return 8; break;
|
||
+ case PIXELFORMAT_RGB444 : return 16; break;
|
||
+ case PIXELFORMAT_RGB555 : return 16; break;
|
||
+ case PIXELFORMAT_RGB565 : return 16; break;
|
||
+ case PIXELFORMAT_RGB555X: return 16; break;
|
||
+ case PIXELFORMAT_RGB565X: return 16; break;
|
||
+ case PIXELFORMAT_BGR24 : return 24; break;
|
||
+ case PIXELFORMAT_RGB24 : return 24; break;
|
||
+ case PIXELFORMAT_BGR32 : return 32; break;
|
||
+ case PIXELFORMAT_RGB32 : return 32; break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case PIXELFORMAT_SBGGR8 : return 0; break;
|
||
+
|
||
+// YUV formats
|
||
+ case PIXELFORMAT_GREY : return 8; break;
|
||
+ case PIXELFORMAT_YUYV : return 16; break;
|
||
+ case PIXELFORMAT_UYVY : return 16; break;
|
||
+ case PIXELFORMAT_YUV420P: return 16; break;
|
||
+ case PIXELFORMAT_YUV422P: return 16; break;
|
||
+
|
||
+// Compressed formats
|
||
+ case PIXELFORMAT_JPEG : return 0; break;
|
||
+ case PIXELFORMAT_MPEG : return 0; break;
|
||
+
|
||
+// Reserved formats
|
||
+ case PIXELFORMAT_DV : return 0; break;
|
||
+ case PIXELFORMAT_ET61X251:return 0; break;
|
||
+ case PIXELFORMAT_HI240 : return 8; break;
|
||
+ case PIXELFORMAT_HM12 : return 0; break;
|
||
+ case PIXELFORMAT_MJPEG : return 0; break;
|
||
+ case PIXELFORMAT_PWC1 : return 0; break;
|
||
+ case PIXELFORMAT_PWC2 : return 0; break;
|
||
+ case PIXELFORMAT_SN9C10X: return 0; break;
|
||
+ case PIXELFORMAT_WNVA : return 0; break;
|
||
+ case PIXELFORMAT_YYUV : return 0; break;
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+QString VideoDevice::pixelFormatName(pixel_format pixelformat)
|
||
+{
|
||
+ QString returnvalue;
|
||
+ returnvalue = "None";
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : returnvalue = "None"; break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case PIXELFORMAT_RGB332 : returnvalue = "8-bit RGB332"; break;
|
||
+ case PIXELFORMAT_RGB444 : returnvalue = "8-bit RGB444"; break;
|
||
+ case PIXELFORMAT_RGB555 : returnvalue = "16-bit RGB555"; break;
|
||
+ case PIXELFORMAT_RGB565 : returnvalue = "16-bit RGB565"; break;
|
||
+ case PIXELFORMAT_RGB555X: returnvalue = "16-bit RGB555X"; break;
|
||
+ case PIXELFORMAT_RGB565X: returnvalue = "16-bit RGB565X"; break;
|
||
+ case PIXELFORMAT_BGR24 : returnvalue = "24-bit BGR24"; break;
|
||
+ case PIXELFORMAT_RGB24 : returnvalue = "24-bit RGB24"; break;
|
||
+ case PIXELFORMAT_BGR32 : returnvalue = "32-bit BGR32"; break;
|
||
+ case PIXELFORMAT_RGB32 : returnvalue = "32-bit RGB32"; break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case PIXELFORMAT_SBGGR8 : returnvalue = "Bayer RGB format"; break;
|
||
+
|
||
+// YUV formats
|
||
+ case PIXELFORMAT_GREY : returnvalue = "8-bit Grayscale"; break;
|
||
+ case PIXELFORMAT_YUYV : returnvalue = "Packed YUV 4:2:2"; break;
|
||
+ case PIXELFORMAT_UYVY : returnvalue = "Packed YVU 4:2:2"; break;
|
||
+ case PIXELFORMAT_YUV420P: returnvalue = "Planar YUV 4:2:0"; break;
|
||
+ case PIXELFORMAT_YUV422P: returnvalue = "Planar YUV 4:2:2"; break;
|
||
+
|
||
+
|
||
+// Compressed formats
|
||
+ case PIXELFORMAT_JPEG : returnvalue = "JPEG image"; break;
|
||
+ case PIXELFORMAT_MPEG : returnvalue = "MPEG stream"; break;
|
||
+
|
||
+// Reserved formats
|
||
+ case PIXELFORMAT_DV : returnvalue = "DV (unknown)"; break;
|
||
+ case PIXELFORMAT_ET61X251:returnvalue = "ET61X251"; break;
|
||
+ case PIXELFORMAT_HI240 : returnvalue = "8-bit HI240 (RGB332)"; break;
|
||
+ case PIXELFORMAT_HM12 : returnvalue = "Packed YUV 4:2:2"; break;
|
||
+ case PIXELFORMAT_MJPEG : returnvalue = "8-bit Grayscale"; break;
|
||
+ case PIXELFORMAT_PWC1 : returnvalue = "PWC1"; break;
|
||
+ case PIXELFORMAT_PWC2 : returnvalue = "PWC2"; break;
|
||
+ case PIXELFORMAT_SN9C10X: returnvalue = "SN9C102"; break;
|
||
+ case PIXELFORMAT_WNVA : returnvalue = "Winnov Videum"; break;
|
||
+ case PIXELFORMAT_YYUV : returnvalue = "YYUV (unknown)"; break;
|
||
+ }
|
||
+ return returnvalue;
|
||
+}
|
||
+
|
||
+QString VideoDevice::pixelFormatName(int pixelformat)
|
||
+{
|
||
+ QString returnvalue;
|
||
+ returnvalue = "None";
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case 0 : returnvalue = pixelFormatName(PIXELFORMAT_NONE); break;
|
||
+
|
||
+// Packed RGB formats
|
||
+ case V4L2_PIX_FMT_RGB332 : returnvalue = pixelFormatName(PIXELFORMAT_RGB332); break;
|
||
+#if defined( V4L2_PIX_FMT_RGB444 )
|
||
+ case V4L2_PIX_FMT_RGB444 : returnvalue = pixelFormatName(PIXELFORMAT_RGB444); break;
|
||
+#endif
|
||
+ case V4L2_PIX_FMT_RGB555 : returnvalue = pixelFormatName(PIXELFORMAT_RGB555); break;
|
||
+ case V4L2_PIX_FMT_RGB565 : returnvalue = pixelFormatName(PIXELFORMAT_RGB565); break;
|
||
+ case V4L2_PIX_FMT_RGB555X : returnvalue = pixelFormatName(PIXELFORMAT_RGB555X); break;
|
||
+ case V4L2_PIX_FMT_RGB565X : returnvalue = pixelFormatName(PIXELFORMAT_RGB565X); break;
|
||
+ case V4L2_PIX_FMT_BGR24 : returnvalue = pixelFormatName(PIXELFORMAT_BGR24); break;
|
||
+ case V4L2_PIX_FMT_RGB24 : returnvalue = pixelFormatName(PIXELFORMAT_RGB24); break;
|
||
+ case V4L2_PIX_FMT_BGR32 : returnvalue = pixelFormatName(PIXELFORMAT_BGR32); break;
|
||
+ case V4L2_PIX_FMT_RGB32 : returnvalue = pixelFormatName(PIXELFORMAT_RGB32); break;
|
||
+
|
||
+// Bayer RGB format
|
||
+ case V4L2_PIX_FMT_SBGGR8 : returnvalue = pixelFormatName(PIXELFORMAT_SBGGR8); break;
|
||
+
|
||
+// YUV formats
|
||
+ case V4L2_PIX_FMT_GREY : returnvalue = pixelFormatName(PIXELFORMAT_GREY); break;
|
||
+ case V4L2_PIX_FMT_YUYV : returnvalue = pixelFormatName(PIXELFORMAT_YUYV); break;
|
||
+ case V4L2_PIX_FMT_UYVY : returnvalue = pixelFormatName(PIXELFORMAT_UYVY); break;
|
||
+ case V4L2_PIX_FMT_YUV420 : returnvalue = pixelFormatName(PIXELFORMAT_YUV420P); break;
|
||
+ case V4L2_PIX_FMT_YUV422P : returnvalue = pixelFormatName(PIXELFORMAT_YUV422P); break;
|
||
+
|
||
+// Compressed formats
|
||
+ case V4L2_PIX_FMT_JPEG : returnvalue = pixelFormatName(PIXELFORMAT_JPEG); break;
|
||
+ case V4L2_PIX_FMT_MPEG : returnvalue = pixelFormatName(PIXELFORMAT_MPEG); break;
|
||
+
|
||
+// Reserved formats
|
||
+ case V4L2_PIX_FMT_DV : returnvalue = pixelFormatName(PIXELFORMAT_DV); break;
|
||
+ case V4L2_PIX_FMT_ET61X251 : returnvalue = pixelFormatName(PIXELFORMAT_ET61X251); break;
|
||
+ case V4L2_PIX_FMT_HI240 : returnvalue = pixelFormatName(PIXELFORMAT_HI240); break;
|
||
+#if defined( V4L2_PIX_FMT_HM12 )
|
||
+ case V4L2_PIX_FMT_HM12 : returnvalue = pixelFormatName(PIXELFORMAT_HM12); break;
|
||
+#endif
|
||
+ case V4L2_PIX_FMT_MJPEG : returnvalue = pixelFormatName(PIXELFORMAT_MJPEG); break;
|
||
+ case V4L2_PIX_FMT_PWC1 : returnvalue = pixelFormatName(PIXELFORMAT_PWC1); break;
|
||
+ case V4L2_PIX_FMT_PWC2 : returnvalue = pixelFormatName(PIXELFORMAT_PWC2); break;
|
||
+ case V4L2_PIX_FMT_SN9C10X : returnvalue = pixelFormatName(PIXELFORMAT_SN9C10X); break;
|
||
+ case V4L2_PIX_FMT_WNVA : returnvalue = pixelFormatName(PIXELFORMAT_WNVA); break;
|
||
+ case V4L2_PIX_FMT_YYUV : returnvalue = pixelFormatName(PIXELFORMAT_YYUV); break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ switch(pixelformat)
|
||
+ {
|
||
+ case VIDEO_PALETTE_GREY : returnvalue = pixelFormatName(PIXELFORMAT_GREY); break;
|
||
+ case VIDEO_PALETTE_HI240 : returnvalue = pixelFormatName(PIXELFORMAT_RGB332); break;
|
||
+ case VIDEO_PALETTE_RGB555 : returnvalue = pixelFormatName(PIXELFORMAT_RGB555); break;
|
||
+ case VIDEO_PALETTE_RGB565 : returnvalue = pixelFormatName(PIXELFORMAT_RGB565); break;
|
||
+ case VIDEO_PALETTE_RGB24 : returnvalue = pixelFormatName(PIXELFORMAT_RGB24); break;
|
||
+ case VIDEO_PALETTE_RGB32 : returnvalue = pixelFormatName(PIXELFORMAT_RGB32); break;
|
||
+ case VIDEO_PALETTE_YUYV : returnvalue = pixelFormatName(PIXELFORMAT_YUYV); break;
|
||
+ case VIDEO_PALETTE_UYVY : returnvalue = pixelFormatName(PIXELFORMAT_UYVY); break;
|
||
+ case VIDEO_PALETTE_YUV420 :
|
||
+ case VIDEO_PALETTE_YUV420P : returnvalue = pixelFormatName(PIXELFORMAT_YUV420P); break;
|
||
+ case VIDEO_PALETTE_YUV422P : returnvalue = pixelFormatName(PIXELFORMAT_YUV422P); break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return returnvalue;
|
||
+}
|
||
+
|
||
+int VideoDevice::detectPixelFormats()
|
||
+{
|
||
+ int err = 0;
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ fmtdesc.index = 0;
|
||
+ fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+
|
||
+ while ( err == 0 )
|
||
+ {
|
||
+ if (-1 == xioctl (VIDIOC_ENUM_FMT, &fmtdesc))
|
||
+// if (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) < 0 )
|
||
+ {
|
||
+ perror("VIDIOC_ENUM_FMT");
|
||
+ err = errno;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ kDebug () << fmtdesc.pixelformat << " " << pixelFormatName(fmtdesc.pixelformat); // Need a cleanup. PixelFormatForPalette is a really bad name
|
||
+ fmtdesc.index++;
|
||
+ }
|
||
+ }
|
||
+// break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+// TODO: THis thing can be used to detec what pixel formats are supported in a API-independent way, but V4L2 has VIDIOC_ENUM_PIXFMT.
|
||
+// The correct thing to do is to isolate these calls and do a proper implementation for V4L and another for V4L2 when this thing will be migrated to a plugin architecture.
|
||
+
|
||
+// Packed RGB formats
|
||
+ kDebug() << "Supported pixel formats:";
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB332)) kDebug() << pixelFormatName(PIXELFORMAT_RGB332);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB444)) kDebug() << pixelFormatName(PIXELFORMAT_RGB444);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB555)) kDebug() << pixelFormatName(PIXELFORMAT_RGB555);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB565)) kDebug() << pixelFormatName(PIXELFORMAT_RGB565);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB555X)) kDebug() << pixelFormatName(PIXELFORMAT_RGB555X);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB565X)) kDebug() << pixelFormatName(PIXELFORMAT_RGB565X);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_BGR24)) kDebug() << pixelFormatName(PIXELFORMAT_BGR24);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB24)) kDebug() << pixelFormatName(PIXELFORMAT_RGB24);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_BGR32)) kDebug() << pixelFormatName(PIXELFORMAT_BGR32);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB32)) kDebug() << pixelFormatName(PIXELFORMAT_RGB32);
|
||
+
|
||
+// Bayer RGB format
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_SBGGR8)) kDebug() << pixelFormatName(PIXELFORMAT_SBGGR8);
|
||
+
|
||
+// YUV formats
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_GREY)) kDebug() << pixelFormatName(PIXELFORMAT_GREY);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUYV)) kDebug() << pixelFormatName(PIXELFORMAT_YUYV);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_UYVY)) kDebug() << pixelFormatName(PIXELFORMAT_UYVY);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUV420P)) kDebug() << pixelFormatName(PIXELFORMAT_YUV420P);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUV422P)) kDebug() << pixelFormatName(PIXELFORMAT_YUV422P);
|
||
+
|
||
+// Compressed formats
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_JPEG)) kDebug() << pixelFormatName(PIXELFORMAT_JPEG);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_MPEG)) kDebug() << pixelFormatName(PIXELFORMAT_MPEG);
|
||
+
|
||
+// Reserved formats
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_DV)) kDebug() << pixelFormatName(PIXELFORMAT_DV);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_ET61X251)) kDebug() << pixelFormatName(PIXELFORMAT_ET61X251);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_HI240)) kDebug() << pixelFormatName(PIXELFORMAT_HI240);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_HM12)) kDebug() << pixelFormatName(PIXELFORMAT_HM12);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_MJPEG)) kDebug() << pixelFormatName(PIXELFORMAT_MJPEG);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_PWC1)) kDebug() << pixelFormatName(PIXELFORMAT_PWC1);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_PWC2)) kDebug() << pixelFormatName(PIXELFORMAT_PWC2);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_SN9C10X)) kDebug() << pixelFormatName(PIXELFORMAT_SN9C10X);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_WNVA)) kDebug() << pixelFormatName(PIXELFORMAT_WNVA);
|
||
+ if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YYUV)) kDebug() << pixelFormatName(PIXELFORMAT_YYUV);
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ return PIXELFORMAT_NONE; break;
|
||
+ }
|
||
+ return PIXELFORMAT_NONE;
|
||
+}
|
||
+
|
||
+__u64 VideoDevice::signalStandardCode(signal_standard standard)
|
||
+{
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ switch(standard)
|
||
+ {
|
||
+ case STANDARD_PAL_B : return V4L2_STD_PAL_B; break;
|
||
+ case STANDARD_PAL_B1 : return V4L2_STD_PAL_B1; break;
|
||
+ case STANDARD_PAL_G : return V4L2_STD_PAL_G; break;
|
||
+ case STANDARD_PAL_H : return V4L2_STD_PAL_H; break;
|
||
+ case STANDARD_PAL_I : return V4L2_STD_PAL_I; break;
|
||
+ case STANDARD_PAL_D : return V4L2_STD_PAL_D; break;
|
||
+ case STANDARD_PAL_D1 : return V4L2_STD_PAL_D1; break;
|
||
+ case STANDARD_PAL_K : return V4L2_STD_PAL_K; break;
|
||
+
|
||
+ case STANDARD_PAL_M : return V4L2_STD_PAL_M; break;
|
||
+ case STANDARD_PAL_N : return V4L2_STD_PAL_N; break;
|
||
+ case STANDARD_PAL_Nc : return V4L2_STD_PAL_Nc; break;
|
||
+ case STANDARD_PAL_60 : return V4L2_STD_PAL_60; break;
|
||
+
|
||
+ case STANDARD_NTSC_M : return V4L2_STD_NTSC_M; break;
|
||
+ case STANDARD_NTSC_M_JP : return V4L2_STD_NTSC_M_JP; break;
|
||
+ case STANDARD_NTSC_443 : return V4L2_STD_NTSC_443; break;
|
||
+ case STANDARD_NTSC_M_KR : return V4L2_STD_NTSC_M_KR; break;
|
||
+
|
||
+ case STANDARD_SECAM_B : return V4L2_STD_SECAM_B; break;
|
||
+ case STANDARD_SECAM_D : return V4L2_STD_SECAM_D; break;
|
||
+ case STANDARD_SECAM_G : return V4L2_STD_SECAM_G; break;
|
||
+ case STANDARD_SECAM_H : return V4L2_STD_SECAM_H; break;
|
||
+ case STANDARD_SECAM_K : return V4L2_STD_SECAM_K; break;
|
||
+ case STANDARD_SECAM_K1 : return V4L2_STD_SECAM_K1; break;
|
||
+ case STANDARD_SECAM_L : return V4L2_STD_SECAM_L; break;
|
||
+ case STANDARD_SECAM_LC : return V4L2_STD_SECAM_LC; break;
|
||
+
|
||
+ case STANDARD_ATSC_8_VSB: return V4L2_STD_ATSC_8_VSB; break;
|
||
+ case STANDARD_ATSC_16_VSB:return V4L2_STD_ATSC_16_VSB; break;
|
||
+
|
||
+ case STANDARD_PAL_BG : return V4L2_STD_PAL_BG; break;
|
||
+ case STANDARD_PAL_DK : return V4L2_STD_PAL_DK; break;
|
||
+ case STANDARD_PAL : return V4L2_STD_PAL; break;
|
||
+ case STANDARD_NTSC : return V4L2_STD_NTSC; break;
|
||
+ case STANDARD_SECAM_DK : return V4L2_STD_SECAM_DK; break;
|
||
+ case STANDARD_SECAM : return V4L2_STD_SECAM; break;
|
||
+
|
||
+ case STANDARD_MN : return V4L2_STD_MN; break;
|
||
+ case STANDARD_B : return V4L2_STD_B; break;
|
||
+ case STANDARD_GH : return V4L2_STD_GH; break;
|
||
+ case STANDARD_DK : return V4L2_STD_DK; break;
|
||
+
|
||
+ case STANDARD_525_60 : return V4L2_STD_525_60; break;
|
||
+ case STANDARD_625_50 : return V4L2_STD_625_50; break;
|
||
+ case STANDARD_ATSC : return V4L2_STD_ATSC; break;
|
||
+
|
||
+ case STANDARD_UNKNOWN : return V4L2_STD_UNKNOWN; break;
|
||
+ case STANDARD_ALL : return V4L2_STD_ALL; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ switch(standard)
|
||
+ {
|
||
+ case STANDARD_PAL_B : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_B1 : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_G : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_H : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_I : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_D : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_D1 : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_K : return VIDEO_MODE_PAL; break;
|
||
+
|
||
+ case STANDARD_PAL_M : return 5; break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case STANDARD_PAL_N : return 6; break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case STANDARD_PAL_Nc : return 4; break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case STANDARD_PAL_60 : return VIDEO_MODE_PAL; break;
|
||
+
|
||
+ case STANDARD_NTSC_M : return VIDEO_MODE_NTSC; break;
|
||
+ case STANDARD_NTSC_M_JP : return 7; break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case STANDARD_NTSC_443 : return VIDEO_MODE_NTSC; break;
|
||
+ case STANDARD_NTSC_M_KR : return VIDEO_MODE_NTSC; break;
|
||
+
|
||
+ case STANDARD_SECAM_B : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_D : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_G : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_H : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_K : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_K1 : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_L : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM_LC : return VIDEO_MODE_SECAM; break;
|
||
+
|
||
+ case STANDARD_ATSC_8_VSB: return VIDEO_MODE_AUTO; break;
|
||
+ case STANDARD_ATSC_16_VSB:return VIDEO_MODE_AUTO; break;
|
||
+
|
||
+ case STANDARD_PAL_BG : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL_DK : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_PAL : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_NTSC : return VIDEO_MODE_NTSC; break;
|
||
+ case STANDARD_SECAM_DK : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_SECAM : return VIDEO_MODE_SECAM; break;
|
||
+
|
||
+ case STANDARD_MN : return VIDEO_MODE_AUTO; break;
|
||
+ case STANDARD_B : return VIDEO_MODE_AUTO; break;
|
||
+ case STANDARD_GH : return VIDEO_MODE_AUTO; break;
|
||
+ case STANDARD_DK : return VIDEO_MODE_AUTO; break;
|
||
+
|
||
+ case STANDARD_525_60 : return VIDEO_MODE_PAL; break;
|
||
+ case STANDARD_625_50 : return VIDEO_MODE_SECAM; break;
|
||
+ case STANDARD_ATSC : return VIDEO_MODE_AUTO; break;
|
||
+
|
||
+ case STANDARD_UNKNOWN : return VIDEO_MODE_AUTO; break;
|
||
+ case STANDARD_ALL : return VIDEO_MODE_AUTO; break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ return STANDARD_UNKNOWN; break;
|
||
+ }
|
||
+ return STANDARD_UNKNOWN;
|
||
+}
|
||
+
|
||
+QString VideoDevice::signalStandardName(signal_standard standard)
|
||
+{
|
||
+ QString returnvalue;
|
||
+ returnvalue = "None";
|
||
+ switch(standard)
|
||
+ {
|
||
+ case STANDARD_PAL_B : returnvalue = "PAL-B"; break;
|
||
+ case STANDARD_PAL_B1 : returnvalue = "PAL-B1"; break;
|
||
+ case STANDARD_PAL_G : returnvalue = "PAL-G"; break;
|
||
+ case STANDARD_PAL_H : returnvalue = "PAL-H"; break;
|
||
+ case STANDARD_PAL_I : returnvalue = "PAL-I"; break;
|
||
+ case STANDARD_PAL_D : returnvalue = "PAL-D"; break;
|
||
+ case STANDARD_PAL_D1 : returnvalue = "PAL-D1"; break;
|
||
+ case STANDARD_PAL_K : returnvalue = "PAL-K"; break;
|
||
+
|
||
+ case STANDARD_PAL_M : returnvalue = "PAL-M"; break;
|
||
+ case STANDARD_PAL_N : returnvalue = "PAL-N"; break;
|
||
+ case STANDARD_PAL_Nc : returnvalue = "PAL-Nc"; break;
|
||
+ case STANDARD_PAL_60 : returnvalue = "PAL-60"; break;
|
||
+
|
||
+ case STANDARD_NTSC_M : returnvalue = "NTSC-M"; break;
|
||
+ case STANDARD_NTSC_M_JP : returnvalue = "NTSC-M(JP)"; break;
|
||
+ case STANDARD_NTSC_443 : returnvalue = "NTSC-443"; break;
|
||
+ case STANDARD_NTSC_M_KR : returnvalue = "NTSC-M(KR)"; break;
|
||
+
|
||
+ case STANDARD_SECAM_B : returnvalue = "SECAM-B"; break;
|
||
+ case STANDARD_SECAM_D : returnvalue = "SECAM-D"; break;
|
||
+ case STANDARD_SECAM_G : returnvalue = "SECAM-G"; break;
|
||
+ case STANDARD_SECAM_H : returnvalue = "SECAM-H"; break;
|
||
+ case STANDARD_SECAM_K : returnvalue = "SECAM-K"; break;
|
||
+ case STANDARD_SECAM_K1 : returnvalue = "SECAM-K1"; break;
|
||
+ case STANDARD_SECAM_L : returnvalue = "SECAM-L"; break;
|
||
+ case STANDARD_SECAM_LC : returnvalue = "SECAM-LC"; break;
|
||
+
|
||
+ case STANDARD_ATSC_8_VSB: returnvalue = "ATSC-8-VSB"; break;
|
||
+ case STANDARD_ATSC_16_VSB:returnvalue = "ATSC-16-VSB"; break;
|
||
+
|
||
+ case STANDARD_PAL_BG : returnvalue = "PAL-BG"; break;
|
||
+ case STANDARD_PAL_DK : returnvalue = "PAL-DK"; break;
|
||
+ case STANDARD_PAL : returnvalue = "PAL"; break;
|
||
+ case STANDARD_NTSC : returnvalue = "NTSC"; break;
|
||
+ case STANDARD_SECAM_DK : returnvalue = "SECAM-DK"; break;
|
||
+ case STANDARD_SECAM : returnvalue = "SECAM"; break;
|
||
+
|
||
+ case STANDARD_MN : returnvalue = "DK"; break;
|
||
+ case STANDARD_B : returnvalue = "B"; break;
|
||
+ case STANDARD_GH : returnvalue = "GH"; break;
|
||
+ case STANDARD_DK : returnvalue = "DK"; break;
|
||
+
|
||
+ case STANDARD_525_60 : returnvalue = "525 lines 60Hz";break;
|
||
+ case STANDARD_625_50 : returnvalue = "625 lines 50Hz";break;
|
||
+ case STANDARD_ATSC : returnvalue = "ATSC"; break;
|
||
+
|
||
+ case STANDARD_UNKNOWN : returnvalue = "Unknown"; break;
|
||
+ case STANDARD_ALL : returnvalue = "All"; break;
|
||
+ }
|
||
+ return returnvalue;
|
||
+}
|
||
+
|
||
+QString VideoDevice::signalStandardName(int standard)
|
||
+{
|
||
+ QString returnvalue;
|
||
+ returnvalue = "None";
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+ switch(standard)
|
||
+ {
|
||
+ case V4L2_STD_PAL_B : returnvalue = signalStandardName(STANDARD_PAL_B); break;
|
||
+ case V4L2_STD_PAL_B1 : returnvalue = signalStandardName(STANDARD_PAL_B1); break;
|
||
+ case V4L2_STD_PAL_G : returnvalue = signalStandardName(STANDARD_PAL_G); break;
|
||
+ case V4L2_STD_PAL_H : returnvalue = signalStandardName(STANDARD_PAL_H); break;
|
||
+ case V4L2_STD_PAL_I : returnvalue = signalStandardName(STANDARD_PAL_I); break;
|
||
+ case V4L2_STD_PAL_D : returnvalue = signalStandardName(STANDARD_PAL_D); break;
|
||
+ case V4L2_STD_PAL_D1 : returnvalue = signalStandardName(STANDARD_PAL_D1); break;
|
||
+ case V4L2_STD_PAL_K : returnvalue = signalStandardName(STANDARD_PAL_K); break;
|
||
+ case V4L2_STD_PAL_M : returnvalue = signalStandardName(STANDARD_PAL_M); break;
|
||
+ case V4L2_STD_PAL_N : returnvalue = signalStandardName(STANDARD_PAL_N); break;
|
||
+ case V4L2_STD_PAL_Nc : returnvalue = signalStandardName(STANDARD_PAL_Nc); break;
|
||
+ case V4L2_STD_PAL_60 : returnvalue = signalStandardName(STANDARD_PAL_60); break;
|
||
+ case V4L2_STD_NTSC_M : returnvalue = signalStandardName(STANDARD_NTSC_M); break;
|
||
+ case V4L2_STD_NTSC_M_JP : returnvalue = signalStandardName(STANDARD_NTSC_M_JP); break;
|
||
+ case V4L2_STD_NTSC_443 : returnvalue = signalStandardName(STANDARD_NTSC_443); break; // Commented out because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
|
||
+ case V4L2_STD_NTSC_M_KR : returnvalue = signalStandardName(STANDARD_NTSC_M_KR); break; // Commented out because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
|
||
+ case V4L2_STD_SECAM_B : returnvalue = signalStandardName(STANDARD_SECAM_B); break;
|
||
+ case V4L2_STD_SECAM_D : returnvalue = signalStandardName(STANDARD_SECAM_D); break;
|
||
+ case V4L2_STD_SECAM_G : returnvalue = signalStandardName(STANDARD_SECAM_G); break;
|
||
+ case V4L2_STD_SECAM_H : returnvalue = signalStandardName(STANDARD_SECAM_H); break;
|
||
+ case V4L2_STD_SECAM_K : returnvalue = signalStandardName(STANDARD_SECAM_K); break;
|
||
+ case V4L2_STD_SECAM_K1 : returnvalue = signalStandardName(STANDARD_SECAM_K1); break;
|
||
+ case V4L2_STD_SECAM_L : returnvalue = signalStandardName(STANDARD_SECAM_L); break;
|
||
+ case V4L2_STD_SECAM_LC : returnvalue = signalStandardName(STANDARD_SECAM_LC); break;
|
||
+
|
||
+ case V4L2_STD_ATSC_8_VSB: returnvalue = signalStandardName(STANDARD_ATSC_8_VSB);break;
|
||
+ case V4L2_STD_ATSC_16_VSB:returnvalue = signalStandardName(STANDARD_ATSC_16_VSB);break;
|
||
+
|
||
+ case V4L2_STD_PAL_BG : returnvalue = signalStandardName(STANDARD_PAL_BG); break;
|
||
+ case V4L2_STD_PAL_DK : returnvalue = signalStandardName(STANDARD_PAL_DK); break;
|
||
+ case V4L2_STD_PAL : returnvalue = signalStandardName(STANDARD_PAL); break;
|
||
+ case V4L2_STD_NTSC : returnvalue = signalStandardName(STANDARD_NTSC); break;
|
||
+ case V4L2_STD_SECAM_DK : returnvalue = signalStandardName(STANDARD_SECAM_DK); break;
|
||
+ case V4L2_STD_SECAM : returnvalue = signalStandardName(STANDARD_SECAM); break;
|
||
+
|
||
+ case V4L2_STD_MN : returnvalue = signalStandardName(STANDARD_MN); break;
|
||
+ case V4L2_STD_B : returnvalue = signalStandardName(STANDARD_B); break;
|
||
+ case V4L2_STD_GH : returnvalue = signalStandardName(STANDARD_GH); break;
|
||
+ case V4L2_STD_DK : returnvalue = signalStandardName(STANDARD_DK); break;
|
||
+
|
||
+ case V4L2_STD_525_60 : returnvalue = signalStandardName(STANDARD_525_60); break;
|
||
+ case V4L2_STD_625_50 : returnvalue = signalStandardName(STANDARD_625_50); break;
|
||
+ case V4L2_STD_ATSC : returnvalue = signalStandardName(STANDARD_ATSC); break;
|
||
+
|
||
+ case V4L2_STD_UNKNOWN : returnvalue = signalStandardName(STANDARD_UNKNOWN); break;
|
||
+ case V4L2_STD_ALL : returnvalue = signalStandardName(STANDARD_ALL); break;
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ switch(standard)
|
||
+ {
|
||
+ case VIDEO_MODE_PAL : returnvalue = signalStandardName(STANDARD_PAL); break;
|
||
+ case VIDEO_MODE_NTSC : returnvalue = signalStandardName(STANDARD_NTSC); break;
|
||
+ case VIDEO_MODE_SECAM : returnvalue = signalStandardName(STANDARD_SECAM); break;
|
||
+ case VIDEO_MODE_AUTO : returnvalue = signalStandardName(STANDARD_ALL); break; // It must be disabled until I find a correct way to handle those non-standard bttv modes
|
||
+// case VIDEO_MODE_PAL_Nc : returnvalue = signalStandardName(STANDARD_PAL_Nc); break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case VIDEO_MODE_PAL_M : returnvalue = signalStandardName(STANDARD_PAL_M); break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case VIDEO_MODE_PAL_N : returnvalue = signalStandardName(STANDARD_PAL_N); break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ case VIDEO_MODE_NTSC_JP : returnvalue = signalStandardName(STANDARD_NTSC_M_JP); break; // Undocumented value found to be compatible with V4L bttv driver
|
||
+ }
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ return returnvalue;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::detectSignalStandards()
|
||
+// this must be done once for each _input_.
|
||
+ */
|
||
+int VideoDevice::detectSignalStandards()
|
||
+{
|
||
+ kDebug() << "called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ switch(m_driver)
|
||
+ {
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ case VIDEODEV_DRIVER_V4L2:
|
||
+
|
||
+
|
||
+ struct v4l2_input input;
|
||
+ struct v4l2_standard standard;
|
||
+
|
||
+ memset (&input, 0, sizeof (input));
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_G_INPUT, &input.index)) {
|
||
+ perror ("VIDIOC_G_INPUT");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_ENUMINPUT, &input)) {
|
||
+ perror ("VIDIOC_ENUM_INPUT");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+// printf ("Current input %s supports:\n", input.name);
|
||
+
|
||
+ memset (&standard, 0, sizeof (standard));
|
||
+ standard.index = 0;
|
||
+
|
||
+ while (0 == xioctl (VIDIOC_ENUMSTD, &standard)) {
|
||
+ if (standard.id & input.std)
|
||
+// kDebug() << standard.name;
|
||
+ kDebug() << signalStandardName(standard.id) << " (" << standard.id << ")" << V4L2_STD_NTSC;
|
||
+
|
||
+ standard.index++;
|
||
+ }
|
||
+
|
||
+/* EINVAL indicates the end of the enumeration, which cannot be
|
||
+ empty unless this device falls under the USB exception. */
|
||
+
|
||
+ if (errno != EINVAL || standard.index == 0) {
|
||
+ perror ("VIDIOC_ENUMSTD");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_V4L:
|
||
+ break;
|
||
+#endif
|
||
+ case VIDEODEV_DRIVER_NONE:
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ //FIXME: return a real value
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::initRead()
|
||
+ */
|
||
+int VideoDevice::initRead()
|
||
+{
|
||
+ /// @todo implement me
|
||
+
|
||
+ kDebug() << "called.";
|
||
+ if(isOpen())
|
||
+ {
|
||
+ m_rawbuffers.resize(1);
|
||
+ if (m_rawbuffers.size()==0)
|
||
+ {
|
||
+ fprintf (stderr, "Out of memory\n");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ kDebug() << "m_buffer_size: " << m_buffer_size;
|
||
+
|
||
+// m_rawbuffers[0].pixelformat=m_pixelformat;
|
||
+ m_rawbuffers[0].length = m_buffer_size;
|
||
+ m_rawbuffers[0].start = (uchar *)malloc (m_buffer_size);
|
||
+
|
||
+ if (!m_rawbuffers[0].start)
|
||
+ {
|
||
+ fprintf (stderr, "Out of memory\n");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ kDebug() << "exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::initMmap()
|
||
+ */
|
||
+int VideoDevice::initMmap()
|
||
+{
|
||
+ /// @todo implement me
|
||
+#define BUFFERS 2
|
||
+ if(isOpen())
|
||
+ {
|
||
+ kDebug() << full_filename << " Trying to MMAP";
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ struct v4l2_requestbuffers req;
|
||
+
|
||
+ CLEAR (req);
|
||
+
|
||
+ req.count = BUFFERS;
|
||
+ req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ req.memory = V4L2_MEMORY_MMAP;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_REQBUFS, &req))
|
||
+ {
|
||
+ if (EINVAL == errno)
|
||
+ {
|
||
+ kDebug() << full_filename << " does not support memory mapping";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ return errnoReturn ("VIDIOC_REQBUFS");
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if (req.count < BUFFERS)
|
||
+ {
|
||
+ kDebug() << "Insufficient buffer memory on " << full_filename;
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+ m_rawbuffers.resize(req.count);
|
||
+
|
||
+ if (m_rawbuffers.size()==0)
|
||
+ {
|
||
+ kDebug() << "Out of memory";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+ for (m_streambuffers = 0; m_streambuffers < req.count; ++m_streambuffers)
|
||
+ {
|
||
+ struct v4l2_buffer v4l2buffer;
|
||
+
|
||
+ CLEAR (v4l2buffer);
|
||
+
|
||
+ v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ v4l2buffer.memory = V4L2_MEMORY_MMAP;
|
||
+ v4l2buffer.index = m_streambuffers;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_QUERYBUF, &v4l2buffer))
|
||
+ return errnoReturn ("VIDIOC_QUERYBUF");
|
||
+
|
||
+ m_rawbuffers[m_streambuffers].length = v4l2buffer.length;
|
||
+ m_rawbuffers[m_streambuffers].start = (uchar *) mmap (NULL /* start anywhere */, v4l2buffer.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, descriptor, v4l2buffer.m.offset);
|
||
+
|
||
+ if (MAP_FAILED == m_rawbuffers[m_streambuffers].start)
|
||
+ return errnoReturn ("mmap");
|
||
+ }
|
||
+#endif
|
||
+ m_currentbuffer.data.resize(m_rawbuffers[0].length); // Makes the imagesize.data buffer size equal to the rawbuffer size
|
||
+ kDebug() << full_filename << " m_currentbuffer.data.size(): " << m_currentbuffer.data.size();
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevice::initUserptr()
|
||
+ */
|
||
+int VideoDevice::initUserptr()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if(isOpen())
|
||
+ {
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ struct v4l2_requestbuffers req;
|
||
+
|
||
+ CLEAR (req);
|
||
+
|
||
+ req.count = 2;
|
||
+ req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||
+ req.memory = V4L2_MEMORY_USERPTR;
|
||
+
|
||
+ if (-1 == xioctl (VIDIOC_REQBUFS, &req))
|
||
+ {
|
||
+ if (EINVAL == errno)
|
||
+ {
|
||
+ kDebug() << full_filename << " does not support memory mapping";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ return errnoReturn ("VIDIOC_REQBUFS");
|
||
+ }
|
||
+ }
|
||
+
|
||
+ m_rawbuffers.resize(4);
|
||
+
|
||
+ if (m_rawbuffers.size()==0)
|
||
+ {
|
||
+ fprintf (stderr, "Out of memory\n");
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+
|
||
+ for (m_streambuffers = 0; m_streambuffers < 4; ++m_streambuffers)
|
||
+ {
|
||
+ m_rawbuffers[m_streambuffers].length = m_buffer_size;
|
||
+ m_rawbuffers[m_streambuffers].start = (uchar *) malloc (m_buffer_size);
|
||
+
|
||
+ if (!m_rawbuffers[m_streambuffers].start)
|
||
+ {
|
||
+ kDebug() << "Out of memory";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canCapture()
|
||
+{
|
||
+ return m_videocapture;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canChromakey()
|
||
+{
|
||
+ return m_videochromakey;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canScale()
|
||
+{
|
||
+ return m_videoscale;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canOverlay()
|
||
+{
|
||
+ return m_videooverlay;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canRead()
|
||
+{
|
||
+ return m_videoread;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canAsyncIO()
|
||
+{
|
||
+ return m_videoasyncio;
|
||
+}
|
||
+
|
||
+bool VideoDevice::canStream()
|
||
+{
|
||
+ return m_videostream;
|
||
+}
|
||
+
|
||
+void VideoDevice::setUdi( const QString & udi )
|
||
+{
|
||
+ m_udi = udi;
|
||
+}
|
||
+
|
||
+QString VideoDevice::udi() const
|
||
+{
|
||
+ return m_udi;
|
||
+}
|
||
+
|
||
+}
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.h
|
||
new file mode 100644
|
||
index 0000000..bebbba5
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevice.h
|
||
@@ -0,0 +1,338 @@
|
||
+/*
|
||
+ videodevice.cpp - Video Device Low-level Support
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#define ENABLE_AV
|
||
+
|
||
+#ifndef VIDEODEVICELISTITEM_H
|
||
+#define VIDEODEVICELISTITEM_H
|
||
+
|
||
+#include <sys/time.h>
|
||
+#include <sys/mman.h>
|
||
+#include <sys/ioctl.h>
|
||
+#include <sys/types.h>
|
||
+#include <sys/stat.h>
|
||
+#include <fcntl.h>
|
||
+#include <unistd.h>
|
||
+#include <signal.h>
|
||
+
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+
|
||
+#include <asm/types.h>
|
||
+#undef __STRICT_ANSI__
|
||
+#ifndef __u64 //required by videodev.h
|
||
+#define __u64 unsigned long long
|
||
+#endif // __u64
|
||
+#ifndef __s64 //required by videodev.h
|
||
+#define __s64 signed long long
|
||
+#endif // __s64
|
||
+
|
||
+
|
||
+#ifndef pgoff_t
|
||
+#define pgoff_t unsigned long
|
||
+#endif
|
||
+
|
||
+#include <linux/fs.h>
|
||
+#include <linux/kernel.h>
|
||
+#include <linux/videodev.h>
|
||
+#define VIDEO_MODE_PAL_Nc 3
|
||
+#define VIDEO_MODE_PAL_M 4
|
||
+#define VIDEO_MODE_PAL_N 5
|
||
+#define VIDEO_MODE_NTSC_JP 6
|
||
+#define __STRICT_ANSI__
|
||
+
|
||
+#endif // __linux__
|
||
+
|
||
+#include <qstring.h>
|
||
+#include <qfile.h>
|
||
+#include <qimage.h>
|
||
+#include <q3valuevector.h>
|
||
+#include <kcombobox.h>
|
||
+
|
||
+#include "videoinput.h"
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+/**
|
||
+@author Kopete Developers
|
||
+*/
|
||
+typedef enum
|
||
+{
|
||
+ VIDEODEV_DRIVER_NONE
|
||
+#if defined( __linux__) && defined(ENABLE_AV)
|
||
+ ,
|
||
+ VIDEODEV_DRIVER_V4L
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ ,
|
||
+ VIDEODEV_DRIVER_V4L2
|
||
+#endif
|
||
+#endif
|
||
+} videodev_driver;
|
||
+
|
||
+typedef enum
|
||
+{
|
||
+// Packed RGB formats
|
||
+ PIXELFORMAT_NONE = 0,
|
||
+ PIXELFORMAT_GREY = (1 << 0),
|
||
+ PIXELFORMAT_RGB332 = (1 << 1),
|
||
+ PIXELFORMAT_RGB444 = (1 << 2),
|
||
+ PIXELFORMAT_RGB555 = (1 << 3),
|
||
+ PIXELFORMAT_RGB565 = (1 << 4),
|
||
+ PIXELFORMAT_RGB555X = (1 << 5),
|
||
+ PIXELFORMAT_RGB565X = (1 << 6),
|
||
+ PIXELFORMAT_BGR24 = (1 << 7),
|
||
+ PIXELFORMAT_RGB24 = (1 << 8),
|
||
+ PIXELFORMAT_BGR32 = (1 << 9),
|
||
+ PIXELFORMAT_RGB32 = (1 << 10),
|
||
+
|
||
+// Bayer RGB format
|
||
+ PIXELFORMAT_SBGGR8 = (1 << 11),
|
||
+
|
||
+// YUV formats
|
||
+ PIXELFORMAT_YUYV = (1 << 12),
|
||
+ PIXELFORMAT_UYVY = (1 << 13),
|
||
+ PIXELFORMAT_YUV420P = (1 << 14),
|
||
+ PIXELFORMAT_YUV422P = (1 << 15),
|
||
+
|
||
+// Compressed formats
|
||
+ PIXELFORMAT_JPEG = (1 << 16),
|
||
+ PIXELFORMAT_MPEG = (1 << 17),
|
||
+
|
||
+// Reserved formats
|
||
+ PIXELFORMAT_DV = (1 << 18),
|
||
+ PIXELFORMAT_ET61X251 = (1 << 19),
|
||
+ PIXELFORMAT_HI240 = (1 << 20),
|
||
+ PIXELFORMAT_HM12 = (1 << 21),
|
||
+ PIXELFORMAT_MJPEG = (1 << 22),
|
||
+ PIXELFORMAT_PWC1 = (1 << 23),
|
||
+ PIXELFORMAT_PWC2 = (1 << 24),
|
||
+ PIXELFORMAT_SN9C10X = (1 << 25),
|
||
+ PIXELFORMAT_WNVA = (1 << 26),
|
||
+ PIXELFORMAT_YYUV = (1 << 27)
|
||
+
|
||
+// PIXELFORMAT_ALL = 0x00003FFF
|
||
+} pixel_format;
|
||
+
|
||
+typedef enum
|
||
+{
|
||
+// One bit for each
|
||
+ STANDARD_PAL_B = (1 << 0),
|
||
+ STANDARD_PAL_B1 = (1 << 1),
|
||
+ STANDARD_PAL_G = (1 << 2),
|
||
+ STANDARD_PAL_H = (1 << 3),
|
||
+ STANDARD_PAL_I = (1 << 4),
|
||
+ STANDARD_PAL_D = (1 << 5),
|
||
+ STANDARD_PAL_D1 = (1 << 6),
|
||
+ STANDARD_PAL_K = (1 << 7),
|
||
+
|
||
+ STANDARD_PAL_M = (1 << 8),
|
||
+ STANDARD_PAL_N = (1 << 9),
|
||
+ STANDARD_PAL_Nc = (1 << 10),
|
||
+ STANDARD_PAL_60 = (1 << 11),
|
||
+// STANDARD_PAL_60 is a hybrid standard with 525 lines, 60 Hz refresh rate, and PAL color modulation with a 4.43 MHz color subcarrier. Some PAL video recorders can play back NTSC tapes in this mode for display on a 50/60 Hz agnostic PAL TV.
|
||
+
|
||
+ STANDARD_NTSC_M = (1 << 12),
|
||
+ STANDARD_NTSC_M_JP = (1 << 13),
|
||
+ STANDARD_NTSC_443 = (1 << 14),
|
||
+// STANDARD_NTSC_443 is a hybrid standard with 525 lines, 60 Hz refresh rate, and NTSC color modulation with a 4.43 MHz color subcarrier.
|
||
+ STANDARD_NTSC_M_KR = (1 << 15),
|
||
+
|
||
+ STANDARD_SECAM_B = (1 << 16),
|
||
+ STANDARD_SECAM_D = (1 << 17),
|
||
+ STANDARD_SECAM_G = (1 << 18),
|
||
+ STANDARD_SECAM_H = (1 << 19),
|
||
+ STANDARD_SECAM_K = (1 << 20),
|
||
+ STANDARD_SECAM_K1 = (1 << 21),
|
||
+ STANDARD_SECAM_L = (1 << 22),
|
||
+ STANDARD_SECAM_LC = (1 << 23),
|
||
+
|
||
+// ATSC/HDTV
|
||
+ STANDARD_ATSC_8_VSB = (1 << 24),
|
||
+ STANDARD_ATSC_16_VSB = (1 << 25),
|
||
+
|
||
+// Some common needed stuff
|
||
+ STANDARD_PAL_BG = ( STANDARD_PAL_B | STANDARD_PAL_B1 | STANDARD_PAL_G ),
|
||
+ STANDARD_PAL_DK = ( STANDARD_PAL_D | STANDARD_PAL_D1 | STANDARD_PAL_K ),
|
||
+ STANDARD_PAL = ( STANDARD_PAL_BG | STANDARD_PAL_DK | STANDARD_PAL_H | STANDARD_PAL_I ),
|
||
+ STANDARD_NTSC = ( STANDARD_NTSC_M | STANDARD_NTSC_M_JP| STANDARD_NTSC_M_KR ),
|
||
+ STANDARD_SECAM_DK = ( STANDARD_SECAM_D | STANDARD_SECAM_K | STANDARD_SECAM_K1 ),
|
||
+ STANDARD_SECAM = ( STANDARD_SECAM_B | STANDARD_SECAM_G | STANDARD_SECAM_H | STANDARD_SECAM_DK | STANDARD_SECAM_L | STANDARD_SECAM_LC ),
|
||
+
|
||
+// some merged standards */
|
||
+ STANDARD_MN = ( STANDARD_PAL_M | STANDARD_PAL_N | STANDARD_PAL_Nc | STANDARD_NTSC ),
|
||
+ STANDARD_B = ( STANDARD_PAL_B | STANDARD_PAL_B1 | STANDARD_SECAM_B ),
|
||
+ STANDARD_GH = ( STANDARD_PAL_G | STANDARD_PAL_H | STANDARD_SECAM_G | STANDARD_SECAM_H ),
|
||
+ STANDARD_DK = ( STANDARD_PAL_DK | STANDARD_SECAM_DK ),
|
||
+
|
||
+ STANDARD_525_60 = ( STANDARD_PAL_M | STANDARD_PAL_60 | STANDARD_NTSC | STANDARD_NTSC_443),
|
||
+ STANDARD_625_50 = ( STANDARD_PAL | STANDARD_PAL_N | STANDARD_PAL_Nc | STANDARD_SECAM),
|
||
+ STANDARD_ATSC = ( STANDARD_ATSC_8_VSB | STANDARD_ATSC_16_VSB ),
|
||
+
|
||
+ STANDARD_UNKNOWN = 0,
|
||
+ STANDARD_ALL = ( STANDARD_525_60 | STANDARD_625_50)
|
||
+} signal_standard;
|
||
+
|
||
+
|
||
+typedef enum
|
||
+{
|
||
+ IO_METHOD_NONE,
|
||
+ IO_METHOD_READ,
|
||
+ IO_METHOD_MMAP,
|
||
+ IO_METHOD_USERPTR
|
||
+} io_method;
|
||
+
|
||
+struct imagebuffer
|
||
+{
|
||
+ int height;
|
||
+ int width;
|
||
+ pixel_format pixelformat;
|
||
+ QVector <uchar> data; // maybe it should be a rawbuffer instead of it? It could make us avoid a memory copy
|
||
+};
|
||
+struct rawbuffer // raw buffer
|
||
+{
|
||
+ uchar * start;
|
||
+ size_t length;
|
||
+};
|
||
+
|
||
+
|
||
+class VideoDevice{
|
||
+public:
|
||
+ VideoDevice();
|
||
+ ~VideoDevice();
|
||
+ int setFileName(QString filename);
|
||
+ int open();
|
||
+ bool isOpen();
|
||
+ int checkDevice();
|
||
+ int showDeviceCapabilities();
|
||
+ int initDevice();
|
||
+ int inputs();
|
||
+ int width();
|
||
+ int minWidth();
|
||
+ int maxWidth();
|
||
+ int height();
|
||
+ int minHeight();
|
||
+ int maxHeight();
|
||
+ int setSize( int newwidth, int newheight);
|
||
+
|
||
+ pixel_format setPixelFormat(pixel_format newformat);
|
||
+ int pixelFormatCode(pixel_format pixelformat);
|
||
+ pixel_format pixelFormatForPalette( int palette );
|
||
+ int pixelFormatDepth(pixel_format pixelformat);
|
||
+ QString pixelFormatName(pixel_format pixelformat);
|
||
+ QString pixelFormatName(int pixelformat);
|
||
+ int detectPixelFormats();
|
||
+
|
||
+ __u64 signalStandardCode(signal_standard standard);
|
||
+ QString signalStandardName(signal_standard standard);
|
||
+ QString signalStandardName(int standard);
|
||
+ int detectSignalStandards();
|
||
+
|
||
+ int currentInput();
|
||
+ int selectInput(int input);
|
||
+ int setInputParameters();
|
||
+ int startCapturing();
|
||
+ int getFrame();
|
||
+ int getFrame(imagebuffer *imgbuffer);
|
||
+ int getImage(QImage *qimage);
|
||
+ int stopCapturing();
|
||
+ int close();
|
||
+
|
||
+ float getBrightness();
|
||
+ float setBrightness(float brightness);
|
||
+ float getContrast();
|
||
+ float setContrast(float contrast);
|
||
+ float getSaturation();
|
||
+ float setSaturation(float saturation);
|
||
+ float getWhiteness();
|
||
+ float setWhiteness(float whiteness);
|
||
+ float getHue();
|
||
+ float setHue(float Hue);
|
||
+
|
||
+ bool getAutoBrightnessContrast();
|
||
+ bool setAutoBrightnessContrast(bool brightnesscontrast);
|
||
+ bool getAutoColorCorrection();
|
||
+ bool setAutoColorCorrection(bool colorcorrection);
|
||
+ bool getImageAsMirror();
|
||
+ bool setImageAsMirror(bool imageasmirror);
|
||
+
|
||
+ bool canCapture();
|
||
+ bool canChromakey();
|
||
+ bool canScale();
|
||
+ bool canOverlay();
|
||
+ bool canRead();
|
||
+ bool canAsyncIO();
|
||
+ bool canStream();
|
||
+
|
||
+ void setUdi( const QString & );
|
||
+ QString udi() const;
|
||
+ QString m_model;
|
||
+ QString m_name;
|
||
+ size_t m_modelindex; // Defines what's the number of a device when more than 1 device of a given model is present;
|
||
+ QString full_filename;
|
||
+ videodev_driver m_driver;
|
||
+ int descriptor;
|
||
+
|
||
+//protected:
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+#ifdef V4L2_CAP_VIDEO_CAPTURE
|
||
+ struct v4l2_capability V4L2_capabilities;
|
||
+ struct v4l2_cropcap cropcap;
|
||
+ struct v4l2_crop crop;
|
||
+ struct v4l2_format fmt;
|
||
+ struct v4l2_fmtdesc fmtdesc; // Not sure if it must be here or inside detectPixelFormats(). Should inve
|
||
+// struct v4l2_input m_input;
|
||
+ struct v4l2_queryctrl queryctrl;
|
||
+ struct v4l2_querymenu querymenu;
|
||
+ void enumerateControls (void);
|
||
+ void enumerateMenu (void);
|
||
+#endif
|
||
+ struct video_capability V4L_capabilities;
|
||
+ struct video_buffer V4L_videobuffer;
|
||
+#endif
|
||
+ QVector<Phonon::VideoCapture::VideoInput> m_input;
|
||
+// QFile file;
|
||
+protected:
|
||
+ int currentwidth, minwidth, maxwidth, currentheight, minheight, maxheight;
|
||
+
|
||
+ QVector<rawbuffer> m_rawbuffers;
|
||
+ unsigned int m_streambuffers;
|
||
+ imagebuffer m_currentbuffer;
|
||
+ int m_buffer_size;
|
||
+
|
||
+ int m_current_input;
|
||
+ pixel_format m_pixelformat;
|
||
+
|
||
+ io_method m_io_method;
|
||
+ bool m_videocapture;
|
||
+ bool m_videochromakey;
|
||
+ bool m_videoscale;
|
||
+ bool m_videooverlay;
|
||
+ bool m_videoread;
|
||
+ bool m_videoasyncio;
|
||
+ bool m_videostream;
|
||
+
|
||
+ int xioctl(int request, void *arg);
|
||
+ int errnoReturn(const char* s);
|
||
+ int initRead();
|
||
+ int initMmap();
|
||
+ int initUserptr();
|
||
+
|
||
+ QString m_udi;
|
||
+};
|
||
+
|
||
+}
|
||
+}
|
||
+
|
||
+#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.cpp
|
||
new file mode 100644
|
||
index 0000000..c3e6972
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.cpp
|
||
@@ -0,0 +1,64 @@
|
||
+/*
|
||
+ videodevicemodelpool.h - Multiple Video Device Model Handler Class
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#include "videodevicemodelpool.h"
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+VideoDeviceModelPool::VideoDeviceModelPool()
|
||
+{
|
||
+}
|
||
+
|
||
+
|
||
+VideoDeviceModelPool::~VideoDeviceModelPool()
|
||
+{
|
||
+}
|
||
+
|
||
+void VideoDeviceModelPool::clear()
|
||
+{
|
||
+ m_devicemodel.clear();
|
||
+}
|
||
+
|
||
+size_t VideoDeviceModelPool::size()
|
||
+{
|
||
+ return m_devicemodel.size();
|
||
+}
|
||
+
|
||
+size_t VideoDeviceModelPool::addModel( QString newmodel )
|
||
+{
|
||
+ VideoDeviceModel newdevicemodel;
|
||
+ newdevicemodel.model=newmodel;
|
||
+ newdevicemodel.count=0;
|
||
+
|
||
+ if(m_devicemodel.size())
|
||
+ {
|
||
+ for ( int loop = 0 ; loop < m_devicemodel.size(); loop++)
|
||
+ if (newmodel == m_devicemodel[loop].model)
|
||
+ {
|
||
+ kDebug() << "Model " << newmodel << " already exists.";
|
||
+ m_devicemodel[loop].count++;
|
||
+ return m_devicemodel[loop].count;
|
||
+ }
|
||
+ }
|
||
+ m_devicemodel.push_back(newdevicemodel);
|
||
+ m_devicemodel[m_devicemodel.size()-1].model = newmodel;
|
||
+ m_devicemodel[m_devicemodel.size()-1].count = 0;
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+
|
||
+}
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.h
|
||
new file mode 100644
|
||
index 0000000..d7d35e0
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicemodelpool.h
|
||
@@ -0,0 +1,48 @@
|
||
+/*
|
||
+ videodevicemodelpool.h - Multiple Video Device Model Handler Class
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#ifndef VIDEODEVICEMODELPOOL_H
|
||
+#define VIDEODEVICEMODELPOOL_H
|
||
+
|
||
+#include <qstring.h>
|
||
+#include <qvector.h>
|
||
+#include <kdebug.h>
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+/**
|
||
+ @author Kopete Developers <kopete-devel@kde.org>
|
||
+*/
|
||
+class VideoDeviceModelPool{
|
||
+
|
||
+ struct VideoDeviceModel
|
||
+ {
|
||
+ QString model;
|
||
+ size_t count;
|
||
+ };
|
||
+ QVector<VideoDeviceModel> m_devicemodel;
|
||
+public:
|
||
+ VideoDeviceModelPool();
|
||
+ ~VideoDeviceModelPool();
|
||
+ void clear();
|
||
+ size_t size();
|
||
+ size_t addModel(QString newmodel);
|
||
+};
|
||
+
|
||
+}
|
||
+}
|
||
+
|
||
+#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.cpp
|
||
new file mode 100644
|
||
index 0000000..623e382
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.cpp
|
||
@@ -0,0 +1,894 @@
|
||
+/*
|
||
+ videodevicepool.cpp - Multiple Video Device Handler Class
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#define ENABLE_AV
|
||
+
|
||
+#include <assert.h>
|
||
+#include <cstdlib>
|
||
+#include <cerrno>
|
||
+#include <cstring>
|
||
+
|
||
+#include <kdebug.h>
|
||
+#include <klocale.h>
|
||
+#include <kglobal.h>
|
||
+#include <kconfig.h>
|
||
+#include <kconfiggroup.h>
|
||
+#include <qdir.h>
|
||
+#include <solid/device.h>
|
||
+#include <solid/devicenotifier.h>
|
||
+#include <solid/deviceinterface.h>
|
||
+#include <solid/video.h>
|
||
+
|
||
+
|
||
+#include "videodevice.h"
|
||
+#include "videodevicepool.h"
|
||
+
|
||
+#define CLEAR(x) memset (&(x), 0, sizeof (x))
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+VideoDevicePool *VideoDevicePool::s_self = NULL;
|
||
+__u64 VideoDevicePool::m_clients = 0;
|
||
+
|
||
+VideoDevicePool* VideoDevicePool::self()
|
||
+{
|
||
+// kDebug() << "libkopete (avdevice): self() called";
|
||
+ if (s_self == NULL)
|
||
+ {
|
||
+ s_self = new VideoDevicePool;
|
||
+ if (s_self)
|
||
+ m_clients = 0;
|
||
+ }
|
||
+// kDebug() << "libkopete (avdevice): self() exited successfuly";
|
||
+ return s_self;
|
||
+}
|
||
+
|
||
+VideoDevicePool::VideoDevicePool()
|
||
+{
|
||
+ connect( Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString&)), SLOT(deviceAdded(const QString &)) );
|
||
+ connect( Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString&)), SLOT(deviceRemoved(const QString &)) );
|
||
+}
|
||
+
|
||
+
|
||
+VideoDevicePool::~VideoDevicePool()
|
||
+{
|
||
+}
|
||
+
|
||
+
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::open()
|
||
+ */
|
||
+int VideoDevicePool::open()
|
||
+{
|
||
+ /// @todo implement me
|
||
+
|
||
+ m_ready.lock();
|
||
+ if(!m_videodevice.size())
|
||
+ {
|
||
+ kDebug() << "open(): No devices found. Must scan for available devices." << m_current_device;
|
||
+ scanDevices();
|
||
+ }
|
||
+ if(!m_videodevice.size())
|
||
+ {
|
||
+ kDebug() << "open(): No devices found. bailing out." << m_current_device;
|
||
+ m_ready.unlock();
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ if(m_current_device >= m_videodevice.size())
|
||
+ {
|
||
+ kDebug() << "open(): Device out of scope (" << m_current_device << "). Defaulting to the first one.";
|
||
+ m_current_device = 0;
|
||
+ }
|
||
+ int isopen = m_videodevice[currentDevice()].open();
|
||
+ if ( isopen == EXIT_SUCCESS)
|
||
+ {
|
||
+ loadConfig(); // Temporary hack. The open() seems to clean the input parameters. Need to find a way to fix it.
|
||
+
|
||
+ }
|
||
+ m_clients++;
|
||
+ kDebug() << "Number of clients: " << m_clients;
|
||
+ m_ready.unlock();
|
||
+ return isopen;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::open(int device)
|
||
+ */
|
||
+int VideoDevicePool::open(int device)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "open(" << device << ") called.";
|
||
+ if(device >= m_videodevice.size())
|
||
+ {
|
||
+ kDebug() << "open(" << device <<"): Device does not exist.";
|
||
+ return EXIT_FAILURE;
|
||
+ }
|
||
+ close();
|
||
+ kDebug() << "open(" << device << ") Setting m_current_Device to " << device;
|
||
+ m_current_device = device;
|
||
+ kDebug() << "open(" << device << ") Calling open().";
|
||
+ saveConfig();
|
||
+
|
||
+ return open();
|
||
+}
|
||
+
|
||
+bool VideoDevicePool::isOpen()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].isOpen();
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::showDeviceCapabilities(int device)
|
||
+ */
|
||
+int VideoDevicePool::showDeviceCapabilities(unsigned int device)
|
||
+{
|
||
+ return m_videodevice[device].showDeviceCapabilities();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::width()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].width();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::minWidth()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].minWidth();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::maxWidth()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].maxWidth();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::height()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].height();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::minHeight()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].minHeight();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::maxHeight()
|
||
+{
|
||
+ return m_videodevice[currentDevice()].maxHeight();
|
||
+}
|
||
+
|
||
+int VideoDevicePool::setSize( int newwidth, int newheight)
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].setSize(newwidth, newheight);
|
||
+ else
|
||
+ {
|
||
+ kDebug() << "VideoDevicePool::setSize() fallback for no device.";
|
||
+ m_buffer.width=newwidth;
|
||
+ m_buffer.height=newheight;
|
||
+ m_buffer.pixelformat= PIXELFORMAT_RGB24;
|
||
+ m_buffer.data.resize(m_buffer.width*m_buffer.height*3);
|
||
+ kDebug() << "VideoDevicePool::setSize() buffer size: "<< m_buffer.data.size();
|
||
+ }
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::close()
|
||
+ */
|
||
+int VideoDevicePool::close()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if(m_clients)
|
||
+ m_clients--;
|
||
+ if((currentDevice() < m_videodevice.size())&&(!m_clients))
|
||
+ return m_videodevice[currentDevice()].close();
|
||
+ if(m_clients)
|
||
+ kDebug() << "VideoDevicePool::close() The video device is still in use.";
|
||
+ if(currentDevice() >= m_videodevice.size())
|
||
+ kDebug() << "VideoDevicePool::close() Current device out of range.";
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::startCapturing()
|
||
+ */
|
||
+int VideoDevicePool::startCapturing()
|
||
+{
|
||
+ kDebug() << "startCapturing() called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].startCapturing();
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::stopCapturing()
|
||
+ */
|
||
+int VideoDevicePool::stopCapturing()
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].stopCapturing();
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+// Implementation of the methods that get / set input's adjustment parameters
|
||
+/*!
|
||
+ \fn VideoDevicePool::getBrightness()
|
||
+ */
|
||
+float VideoDevicePool::getBrightness()
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].getBrightness();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setBrightness(float brightness)
|
||
+ */
|
||
+float VideoDevicePool::setBrightness(float brightness)
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].setBrightness(brightness);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getContrast()
|
||
+ */
|
||
+float VideoDevicePool::getContrast()
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].getContrast();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setContrast(float contrast)
|
||
+ */
|
||
+float VideoDevicePool::setContrast(float contrast)
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].setContrast(contrast);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getSaturation()
|
||
+ */
|
||
+float VideoDevicePool::getSaturation()
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].getSaturation();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setSaturation(float saturation)
|
||
+ */
|
||
+float VideoDevicePool::setSaturation(float saturation)
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].setSaturation(saturation);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getWhiteness()
|
||
+ */
|
||
+float VideoDevicePool::getWhiteness()
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].getWhiteness();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setWhiteness(float whiteness)
|
||
+ */
|
||
+float VideoDevicePool::setWhiteness(float whiteness)
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].setWhiteness(whiteness);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getHue()
|
||
+ */
|
||
+float VideoDevicePool::getHue()
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].getHue();
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setHue(float hue)
|
||
+ */
|
||
+float VideoDevicePool::setHue(float hue)
|
||
+{
|
||
+ if (currentDevice() < m_videodevice.size() )
|
||
+ return m_videodevice[currentDevice()].setHue(hue);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getAutoBrightnessContrast()
|
||
+ */
|
||
+bool VideoDevicePool::getAutoBrightnessContrast()
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].getAutoBrightnessContrast();
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setAutoBrightnessContrast(bool brightnesscontrast)
|
||
+ */
|
||
+bool VideoDevicePool::setAutoBrightnessContrast(bool brightnesscontrast)
|
||
+{
|
||
+ kDebug() << "VideoDevicePool::setAutoBrightnessContrast(" << brightnesscontrast << ") called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].setAutoBrightnessContrast(brightnesscontrast);
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getAutoColorCorrection()
|
||
+ */
|
||
+bool VideoDevicePool::getAutoColorCorrection()
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].getAutoColorCorrection();
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setAutoColorCorrection(bool colorcorrection)
|
||
+ */
|
||
+bool VideoDevicePool::setAutoColorCorrection(bool colorcorrection)
|
||
+{
|
||
+ kDebug() << "VideoDevicePool::setAutoColorCorrection(" << colorcorrection << ") called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].setAutoColorCorrection(colorcorrection);
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getIMageAsMirror()
|
||
+ */
|
||
+bool VideoDevicePool::getImageAsMirror()
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].getImageAsMirror();
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::setImageAsMirror(bool imageasmirror)
|
||
+ */
|
||
+bool VideoDevicePool::setImageAsMirror(bool imageasmirror)
|
||
+{
|
||
+ kDebug() << "VideoDevicePool::setImageAsMirror(" << imageasmirror << ") called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].setImageAsMirror(imageasmirror);
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getFrame()
|
||
+ */
|
||
+int VideoDevicePool::getFrame()
|
||
+{
|
||
+// kDebug() << "VideoDevicePool::getFrame() called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].getFrame();
|
||
+ else
|
||
+ {
|
||
+ kDebug() << "VideoDevicePool::getFrame() fallback for no device.";
|
||
+ for(int loop=0; loop < m_buffer.data.size(); loop+=3)
|
||
+ {
|
||
+ m_buffer.data[loop] = 255;
|
||
+ m_buffer.data[loop+1] = 0;
|
||
+ m_buffer.data[loop+2] = 0;
|
||
+ }
|
||
+ }
|
||
+ kDebug() << "VideoDevicePool::getFrame() exited successfuly.";
|
||
+
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn VideoDevicePool::getQImage(QImage *qimage)
|
||
+ */
|
||
+int VideoDevicePool::getImage(QImage *qimage)
|
||
+{
|
||
+// kDebug() << "VideoDevicePool::getImage() called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].getImage(qimage);
|
||
+ else
|
||
+ {
|
||
+ kDebug() << "VideoDevicePool::getImage() fallback for no device.";
|
||
+
|
||
+ // do NOT delete qimage here, as it is received as a parameter
|
||
+ if (qimage->width() != width() || qimage->height() != height())
|
||
+ *qimage = QImage(width(), height(), QImage::Format_RGB32);
|
||
+
|
||
+ uchar *bits=qimage->bits();
|
||
+ switch(m_buffer.pixelformat)
|
||
+ {
|
||
+ case PIXELFORMAT_NONE : break;
|
||
+ case PIXELFORMAT_GREY : break;
|
||
+ case PIXELFORMAT_RGB332 : break;
|
||
+ case PIXELFORMAT_RGB555 : break;
|
||
+ case PIXELFORMAT_RGB555X: break;
|
||
+ case PIXELFORMAT_RGB565 : break;
|
||
+ case PIXELFORMAT_RGB565X: break;
|
||
+ case PIXELFORMAT_RGB24 :
|
||
+ {
|
||
+ kDebug() << "VideoDevicePool::getImage() fallback for no device - RGB24.";
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_buffer.data[step];
|
||
+ bits[loop+1] = m_buffer.data[step+1];
|
||
+ bits[loop+2] = m_buffer.data[step+2];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_BGR24 : break;
|
||
+ {
|
||
+ int step=0;
|
||
+ for(int loop=0;loop < qimage->numBytes();loop+=4)
|
||
+ {
|
||
+ bits[loop] = m_buffer.data[step+2];
|
||
+ bits[loop+1] = m_buffer.data[step+1];
|
||
+ bits[loop+2] = m_buffer.data[step];
|
||
+ bits[loop+3] = 255;
|
||
+ step+=3;
|
||
+ }
|
||
+ }
|
||
+ break;
|
||
+ case PIXELFORMAT_RGB32 : memcpy(bits,&m_buffer.data[0], m_buffer.data.size());
|
||
+ break;
|
||
+ case PIXELFORMAT_BGR32 : break;
|
||
+ case PIXELFORMAT_YUYV : break;
|
||
+ case PIXELFORMAT_UYVY : break;
|
||
+ case PIXELFORMAT_YUV420P: break;
|
||
+ case PIXELFORMAT_YUV422P: break;
|
||
+ }
|
||
+ }
|
||
+ kDebug() << "VideoDevicePool::getImage() exited successfuly.";
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::selectInput(int input)
|
||
+ */
|
||
+int VideoDevicePool::selectInput(int newinput)
|
||
+{
|
||
+ kDebug() << "VideoDevicePool::selectInput(" << newinput << ") called.";
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].selectInput(newinput);
|
||
+ else
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::setInputParameters()
|
||
+ */
|
||
+int VideoDevicePool::setInputParameters()
|
||
+{
|
||
+ if(m_videodevice.size())
|
||
+ return m_videodevice[currentDevice()].setInputParameters();
|
||
+ else
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::fillDeviceKComboBox(KComboBox *combobox)
|
||
+ */
|
||
+int VideoDevicePool::fillDeviceKComboBox(KComboBox *combobox)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "Called.";
|
||
+// check if KComboBox is a valid pointer.
|
||
+ if (combobox != NULL)
|
||
+ {
|
||
+ combobox->clear();
|
||
+ kDebug() << "Combobox cleaned.";
|
||
+ if(m_videodevice.size())
|
||
+ {
|
||
+ for (int loop=0; loop < m_videodevice.size(); loop++)
|
||
+ {
|
||
+ combobox->addItem(m_videodevice[loop].m_name);
|
||
+ kDebug() << "Added device " << loop << ": " << m_videodevice[loop].m_name;
|
||
+ }
|
||
+ combobox->setCurrentIndex(currentDevice());
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::fillInputKComboBox(KComboBox *combobox)
|
||
+ */
|
||
+int VideoDevicePool::fillInputKComboBox(KComboBox *combobox)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "Called.";
|
||
+ if (combobox != NULL)
|
||
+ {
|
||
+ combobox->clear();
|
||
+ if ( !m_videodevice.isEmpty() && (currentDevice()>=0) && currentDevice() < m_videodevice.size() )
|
||
+ {
|
||
+ if(m_videodevice[currentDevice()].inputs()>0)
|
||
+ {
|
||
+ for (int loop=0; loop < m_videodevice[currentDevice()].inputs(); loop++)
|
||
+ {
|
||
+ combobox->addItem(m_videodevice[currentDevice()].m_input[loop].name);
|
||
+ kDebug() << "Added input " << loop << ": " << m_videodevice[currentDevice()].m_input[loop].name << " (tuner: " << m_videodevice[currentDevice()].m_input[loop].hastuner << ")";
|
||
+ }
|
||
+ combobox->setCurrentIndex(currentInput());
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::fillStandardKComboBox(KComboBox *combobox)
|
||
+ */
|
||
+int VideoDevicePool::fillStandardKComboBox(KComboBox *combobox)
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "Called.";
|
||
+ if (combobox != NULL)
|
||
+ {
|
||
+ combobox->clear();
|
||
+ if ( !m_videodevice.isEmpty() && currentDevice() < m_videodevice.size() )
|
||
+ {
|
||
+ if(m_videodevice[currentDevice()].inputs()>0)
|
||
+ {
|
||
+ for (unsigned int loop=0; loop < 25; loop++)
|
||
+ {
|
||
+ if ( (m_videodevice[currentDevice()].m_input[currentInput()].m_standards) & (1 << loop) )
|
||
+ combobox->addItem(m_videodevice[currentDevice()].signalStandardName( 1 << loop));
|
||
+/*
|
||
+ case STANDARD_PAL_B1 : return V4L2_STD_PAL_B1; break;
|
||
+ case STANDARD_PAL_G : return V4L2_STD_PAL_G; break;
|
||
+ case STANDARD_PAL_H : return V4L2_STD_PAL_H; break;
|
||
+ case STANDARD_PAL_I : return V4L2_STD_PAL_I; break;
|
||
+ case STANDARD_PAL_D : return V4L2_STD_PAL_D; break;
|
||
+ case STANDARD_PAL_D1 : return V4L2_STD_PAL_D1; break;
|
||
+ case STANDARD_PAL_K : return V4L2_STD_PAL_K; break;
|
||
+ case STANDARD_PAL_M : return V4L2_STD_PAL_M; break;
|
||
+ case STANDARD_PAL_N : return V4L2_STD_PAL_N; break;
|
||
+ case STANDARD_PAL_Nc : return V4L2_STD_PAL_Nc; break;
|
||
+ case STANDARD_PAL_60 : return V4L2_STD_PAL_60; break;
|
||
+ case STANDARD_NTSC_M : return V4L2_STD_NTSC_M; break;
|
||
+ case STANDARD_NTSC_M_JP : return V4L2_STD_NTSC_M_JP; break;
|
||
+ case STANDARD_NTSC_443 : return V4L2_STD_NTSC; break; // Using workaround value because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
|
||
+ case STANDARD_SECAM_B : return V4L2_STD_SECAM_B; break;
|
||
+ case STANDARD_SECAM_D : return V4L2_STD_SECAM_D; break;
|
||
+ case STANDARD_SECAM_G : return V4L2_STD_SECAM_G; break;
|
||
+ case STANDARD_SECAM_H : return V4L2_STD_SECAM_H; break;
|
||
+ case STANDARD_SECAM_K : return V4L2_STD_SECAM_K; break;
|
||
+ case STANDARD_SECAM_K1 : return V4L2_STD_SECAM_K1; break;
|
||
+ case STANDARD_SECAM_L : return V4L2_STD_SECAM_L; break;
|
||
+ case STANDARD_SECAM_LC : return V4L2_STD_SECAM; break; // Using workaround value because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
|
||
+ case STANDARD_ATSC_8_VSB : return V4L2_STD_ATSC_8_VSB; break; // ATSC/HDTV Standard officially not supported by V4L2 but exists in videodev2.h
|
||
+ case STANDARD_ATSC_16_VSB : return V4L2_STD_ATSC_16_VSB; break; // ATSC/HDTV Standard officially not supported by V4L2 but exists in videodev2.h
|
||
+ case STANDARD_PAL_BG : return V4L2_STD_PAL_BG; break;
|
||
+ case STANDARD_PAL_DK : return V4L2_STD_PAL_DK; break;
|
||
+ case STANDARD_PAL : return V4L2_STD_PAL; break;
|
||
+ case STANDARD_NTSC : return V4L2_STD_NTSC; break;
|
||
+ case STANDARD_SECAM_DK : return V4L2_STD_SECAM_DK; break;
|
||
+ case STANDARD_SECAM : return V4L2_STD_SECAM; break;
|
||
+ case STANDARD_525_60 : return V4L2_STD_525_60; break;
|
||
+ case STANDARD_625_50 : return V4L2_STD_625_50; break;
|
||
+ case STANDARD_ALL : return V4L2_STD_ALL; break;
|
||
+
|
||
+ combobox->insertItem(m_videodevice[currentDevice()].m_input[loop].name);
|
||
+ kDebug() << "StandardKCombobox: Added input " << loop << ": " << m_videodevice[currentDevice()].m_input[loop].name << " (tuner: " << m_videodevice[currentDevice()].m_input[loop].hastuner << ")";*/
|
||
+ }
|
||
+ combobox->setCurrentIndex(currentInput());
|
||
+ return EXIT_SUCCESS;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ return EXIT_FAILURE;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::scanDevices()
|
||
+ */
|
||
+int VideoDevicePool::scanDevices()
|
||
+{
|
||
+ /// @todo implement me
|
||
+
|
||
+ kDebug() << "called";
|
||
+#if defined(__linux__) && defined(ENABLE_AV)
|
||
+ foreach (Solid::Device device,
|
||
+ Solid::Device::listFromType(Solid::DeviceInterface::Video, QString())) {
|
||
+ registerDevice( device );
|
||
+ }
|
||
+
|
||
+#endif
|
||
+ kDebug() << "exited successfuly";
|
||
+ return EXIT_SUCCESS;
|
||
+}
|
||
+
|
||
+void VideoDevicePool::registerDevice( Solid::Device & device )
|
||
+{
|
||
+ kDebug() << "New video device at " << device.udi();
|
||
+ const Solid::Device * vendorDevice = &device;
|
||
+ while ( vendorDevice->isValid() && vendorDevice->vendor().isEmpty() )
|
||
+ {
|
||
+ vendorDevice = new Solid::Device( vendorDevice->parentUdi() );
|
||
+ }
|
||
+ if ( vendorDevice->isValid() )
|
||
+ {
|
||
+ kDebug() << "vendor: " << vendorDevice->vendor() << ", product: " << vendorDevice->product();
|
||
+ }
|
||
+ Solid::Video * solidVideoDevice = device.as<Solid::Video>();
|
||
+ if ( solidVideoDevice ) {
|
||
+ QStringList protocols = solidVideoDevice->supportedProtocols();
|
||
+ if ( protocols.contains( "video4linux" ) )
|
||
+ {
|
||
+ QStringList drivers = solidVideoDevice->supportedDrivers( "video4linux" );
|
||
+ if ( drivers.contains( "video4linux" ) )
|
||
+ {
|
||
+ kDebug() << "V4L device path is" << solidVideoDevice->driverHandle( "video4linux" ).toString();
|
||
+ VideoDevice videodevice;
|
||
+ videodevice.setUdi( device.udi() );
|
||
+ videodevice.setFileName(solidVideoDevice->driverHandle( "video4linux" ).toString());
|
||
+ kDebug() << "Found device " << videodevice.full_filename;
|
||
+ videodevice.open();
|
||
+ if(videodevice.isOpen())
|
||
+ {
|
||
+ kDebug() << "File " << videodevice.full_filename << " was opened successfuly";
|
||
+ videodevice.close();
|
||
+ videodevice.m_modelindex=m_modelvector.addModel (videodevice.m_model); // Adds device to the device list and sets model number
|
||
+ m_videodevice.push_back(videodevice);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::hasDevices()
|
||
+ */
|
||
+bool VideoDevicePool::hasDevices()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ if(m_videodevice.size())
|
||
+ return true;
|
||
+ return false;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::size()
|
||
+ */
|
||
+size_t VideoDevicePool::size()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ return m_videodevice.size();
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::currentDevice()
|
||
+ */
|
||
+int VideoDevicePool::currentDevice()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ return m_current_device;
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::currentInput()
|
||
+ */
|
||
+int VideoDevicePool::currentInput()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ return m_videodevice[currentDevice()].currentInput();
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::currentInput()
|
||
+ */
|
||
+unsigned int VideoDevicePool::inputs()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ return m_videodevice[currentDevice()].inputs();
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::loadConfig()
|
||
+ */
|
||
+void VideoDevicePool::loadConfig()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "called";
|
||
+ if((hasDevices())&&(m_clients==0))
|
||
+ {
|
||
+ KConfigGroup config(KGlobal::config(), "Video Device Settings");
|
||
+ QString currentdevice = config.readEntry("Current Device", QString());
|
||
+ kDebug() << "Current device: " << currentdevice;
|
||
+
|
||
+// m_current_device = 0; // Must check this thing because of the fact that multiple loadConfig in other methodas can do bad things. Watch out!
|
||
+
|
||
+ VideoDeviceVector::iterator vditerator;
|
||
+ for( vditerator = m_videodevice.begin(); vditerator != m_videodevice.end(); ++vditerator )
|
||
+ {
|
||
+ const QString modelindex = QString::fromLocal8Bit ( "Model %1 Device %2") .arg ((*vditerator).m_name ) .arg ((*vditerator).m_modelindex);
|
||
+ if(modelindex == currentdevice)
|
||
+ {
|
||
+ m_current_device = std::distance (m_videodevice.begin(), vditerator);
|
||
+// kDebug() << "This place will be used to set " << modelindex << " as the current device ( " << std::distance(m_videodevice.begin(), vditerator ) << " ).";
|
||
+ }
|
||
+ const QString name = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Name") .arg ((*vditerator).m_name ) .arg ((*vditerator).m_modelindex)), (*vditerator).m_model);
|
||
+ const int currentinput = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Current input") .arg ((*vditerator).m_name ) .arg ((*vditerator).m_modelindex)), 0);
|
||
+ kDebug() << "Device name: " << name;
|
||
+ kDebug() << "Device current input: " << currentinput;
|
||
+ (*vditerator).selectInput(currentinput);
|
||
+
|
||
+ for (int input = 0 ; input < (*vditerator).m_input.size(); input++)
|
||
+ {
|
||
+ const float brightness = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Brightness").arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , 0.5 );
|
||
+ const float contrast = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Contrast") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , 0.5 );
|
||
+ const float saturation = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Saturation").arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , 0.5 );
|
||
+ const float whiteness = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Whiteness") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , 0.5 );
|
||
+ const float hue = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Hue") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , 0.5 );
|
||
+ const bool autobrightnesscontrast = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 AutoBrightnessContrast") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , false );
|
||
+ const bool autocolorcorrection = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 AutoColorCorrection") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , false );
|
||
+ const bool imageasmirror = config.readEntry((QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 mageAsMirror") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input)) , false );
|
||
+ (*vditerator).setBrightness(brightness);
|
||
+ (*vditerator).setContrast(contrast);
|
||
+ (*vditerator).setSaturation(saturation);
|
||
+ (*vditerator).setHue(hue);
|
||
+ (*vditerator).setAutoBrightnessContrast(autobrightnesscontrast);
|
||
+ (*vditerator).setAutoColorCorrection(autocolorcorrection);
|
||
+ (*vditerator).setImageAsMirror(imageasmirror);
|
||
+ kDebug() << "Brightness:" << brightness;
|
||
+ kDebug() << "Contrast :" << contrast;
|
||
+ kDebug() << "Saturation:" << saturation;
|
||
+ kDebug() << "Whiteness :" << whiteness;
|
||
+ kDebug() << "Hue :" << hue;
|
||
+ kDebug() << "AutoBrightnessContrast:" << autobrightnesscontrast;
|
||
+ kDebug() << "AutoColorCorrection :" << autocolorcorrection;
|
||
+ kDebug() << "ImageAsMirror :" << imageasmirror;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+/*!
|
||
+ \fn Kopete::AV::VideoDevicePool::saveConfig()
|
||
+ */
|
||
+void VideoDevicePool::saveConfig()
|
||
+{
|
||
+ /// @todo implement me
|
||
+ kDebug() << "called";
|
||
+ if(hasDevices())
|
||
+ {
|
||
+ KConfigGroup config(KGlobal::config(), "Video Device Settings");
|
||
+
|
||
+/* if(m_modelvector.size())
|
||
+ {
|
||
+ VideoDeviceModelPool::m_devicemodel::iterator vmiterator;
|
||
+ for( vmiterator = m_modelvector.begin(); vmiterator != m_modelvector.end(); ++vmiterator )
|
||
+ {
|
||
+ kDebug() << "Device Model: " << (*vmiterator).name;
|
||
+ kDebug() << "Device Count: " << (*vmiterator).count;
|
||
+ }
|
||
+ }
|
||
+*/
|
||
+// Stores what is the current video device in use
|
||
+ const QString currentdevice = QString::fromLocal8Bit ( "Model %1 Device %2" ) .arg(m_videodevice[m_current_device].m_model) .arg(m_videodevice[m_current_device].m_modelindex);
|
||
+ config.writeEntry( "Current Device", currentdevice);
|
||
+
|
||
+ VideoDeviceVector::iterator vditerator;
|
||
+ for( vditerator = m_videodevice.begin(); vditerator != m_videodevice.end(); ++vditerator )
|
||
+ {
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Name:" << (*vditerator).m_name;
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Current input:" << (*vditerator).currentInput();
|
||
+
|
||
+// Stores current input for the given video device
|
||
+ const QString name = QString::fromLocal8Bit ( "Model %1 Device %2 Name") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex);
|
||
+ const QString currentinput = QString::fromLocal8Bit ( "Model %1 Device %2 Current input") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex);
|
||
+ config.writeEntry( name, (*vditerator).m_name);
|
||
+ config.writeEntry( currentinput, (*vditerator).currentInput());
|
||
+
|
||
+ for (int input = 0 ; input < (*vditerator).m_input.size(); input++)
|
||
+ {
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Brightness: " << (*vditerator).m_input[input].getBrightness();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Contrast : " << (*vditerator).m_input[input].getContrast();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Saturation: " << (*vditerator).m_input[input].getSaturation();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Whiteness : " << (*vditerator).m_input[input].getWhiteness();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Hue : " << (*vditerator).m_input[input].getHue();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Automatic brightness / contrast: " << (*vditerator).m_input[input].getAutoBrightnessContrast();
|
||
+ kDebug() << "Model:" << (*vditerator).m_model << ":Index:" << (*vditerator).m_modelindex << ":Input:" << input << ":Automatic color correction : " << (*vditerator).m_input[input].getAutoColorCorrection();
|
||
+
|
||
+// Stores configuration about each channel
|
||
+ const QString brightness = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Brightness") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString contrast = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Contrast") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString saturation = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Saturation") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString whiteness = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Whiteness") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString hue = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 Hue") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString autobrightnesscontrast = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 AutoBrightnessContrast") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString autocolorcorrection = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 AutoColorCorrection") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ const QString imageasmirror = QString::fromLocal8Bit ( "Model %1 Device %2 Input %3 ImageAsMirror") .arg ((*vditerator).m_model ) .arg ((*vditerator).m_modelindex) .arg (input);
|
||
+ config.writeEntry( brightness, (double)(*vditerator).m_input[input].getBrightness());
|
||
+ config.writeEntry( contrast, (double)(*vditerator).m_input[input].getContrast());
|
||
+ config.writeEntry( saturation, (double)(*vditerator).m_input[input].getSaturation());
|
||
+ config.writeEntry( whiteness, (double)(*vditerator).m_input[input].getWhiteness());
|
||
+ config.writeEntry( hue, (double)(*vditerator).m_input[input].getHue());
|
||
+ config.writeEntry( autobrightnesscontrast, (*vditerator).m_input[input].getAutoBrightnessContrast());
|
||
+ config.writeEntry( autocolorcorrection, (*vditerator).m_input[input].getAutoColorCorrection());
|
||
+ config.writeEntry( imageasmirror, (*vditerator).m_input[input].getImageAsMirror());
|
||
+ }
|
||
+ }
|
||
+ config.sync();
|
||
+ kDebug();
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDevicePool::deviceAdded( const QString & udi )
|
||
+{
|
||
+ kDebug() << "("<< udi << ") called";
|
||
+ Solid::Device dev( udi );
|
||
+ if ( dev.is<Solid::Video>() )
|
||
+ {
|
||
+ registerDevice( dev );
|
||
+ emit deviceRegistered( udi );
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDevicePool::deviceRemoved( const QString & udi )
|
||
+{
|
||
+ kDebug() << "("<< udi << ") called";
|
||
+ int i = 0;
|
||
+ foreach ( VideoDevice vd, m_videodevice ) {
|
||
+
|
||
+ if ( vd.udi() == udi ) {
|
||
+ kDebug() << "Video device '" << udi << "' has been removed!";
|
||
+ }
|
||
+ emit deviceUnregistered( udi );
|
||
+ m_videodevice.remove( i ); // not sure if this is safe but at this point the device node is
|
||
+ // gone already anyway
|
||
+ i++;
|
||
+ }
|
||
+}
|
||
+
|
||
+}
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.h
|
||
new file mode 100644
|
||
index 0000000..b35310a
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videodevicepool.h
|
||
@@ -0,0 +1,134 @@
|
||
+/*
|
||
+ videodevicepool.h - Multiple Video Device Handler Class
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#ifndef VIDEODEVICEPOOL_H
|
||
+#define VIDEODEVICEPOOL_H
|
||
+
|
||
+#include <iostream>
|
||
+
|
||
+
|
||
+#include "videoinput.h"
|
||
+#include "videodevicemodelpool.h"
|
||
+#include <qstring.h>
|
||
+#include <qimage.h>
|
||
+#include <q3valuevector.h>
|
||
+#include <qmutex.h>
|
||
+#include <kcombobox.h>
|
||
+#include "videodevice.h"
|
||
+#include <kconfig.h>
|
||
+#include <kglobal.h>
|
||
+#include <solid/device.h>
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+/**
|
||
+This class allows kopete to check for the existence, open, configure, test, set parameters, grab frames from and close a given video capture card using the Video4Linux API.
|
||
+
|
||
+@author Cláudio da Silveira Pinheiro
|
||
+*/
|
||
+
|
||
+typedef QVector<Phonon::VideoCapture::VideoDevice> VideoDeviceVector;
|
||
+
|
||
+
|
||
+class KDE_EXPORT VideoDevicePool : public QObject
|
||
+{
|
||
+Q_OBJECT
|
||
+public:
|
||
+ static VideoDevicePool* self();
|
||
+ int open();
|
||
+ int open(int device);
|
||
+ bool isOpen();
|
||
+ int getFrame();
|
||
+ int width();
|
||
+ int minWidth();
|
||
+ int maxWidth();
|
||
+ int height();
|
||
+ int minHeight();
|
||
+ int maxHeight();
|
||
+ int setSize( int newwidth, int newheight);
|
||
+ int close();
|
||
+ int startCapturing();
|
||
+ int stopCapturing();
|
||
+ int readFrame();
|
||
+ int getImage(QImage *qimage);
|
||
+ int selectInput(int newinput);
|
||
+ int setInputParameters();
|
||
+ int scanDevices();
|
||
+ void registerDevice( Solid::Device & dev );
|
||
+ bool hasDevices();
|
||
+ size_t size();
|
||
+ ~VideoDevicePool();
|
||
+ VideoDeviceVector m_videodevice; // Vector to be filled with found devices
|
||
+ VideoDeviceModelPool m_modelvector; // Vector to be filled with unique device models
|
||
+ int fillDeviceKComboBox(KComboBox *combobox);
|
||
+ int fillInputKComboBox(KComboBox *combobox);
|
||
+ int fillStandardKComboBox(KComboBox *combobox);
|
||
+ int currentDevice();
|
||
+ int currentInput();
|
||
+ unsigned int inputs();
|
||
+
|
||
+ float getBrightness();
|
||
+ float setBrightness(float brightness);
|
||
+ float getContrast();
|
||
+ float setContrast(float contrast);
|
||
+ float getSaturation();
|
||
+ float setSaturation(float saturation);
|
||
+ float getWhiteness();
|
||
+ float setWhiteness(float whiteness);
|
||
+ float getHue();
|
||
+ float setHue(float hue);
|
||
+
|
||
+ bool getAutoBrightnessContrast();
|
||
+ bool setAutoBrightnessContrast(bool brightnesscontrast);
|
||
+ bool getAutoColorCorrection();
|
||
+ bool setAutoColorCorrection(bool colorcorrection);
|
||
+ bool getImageAsMirror();
|
||
+ bool setImageAsMirror(bool imageasmirror);
|
||
+
|
||
+ void loadConfig(); // Load configuration parameters;
|
||
+ void saveConfig(); // Save configuretion parameters;
|
||
+
|
||
+signals:
|
||
+ /**
|
||
+ * Provisional signatures, probably more useful to indicate which device was registered
|
||
+ */
|
||
+ void deviceRegistered( const QString & udi );
|
||
+ void deviceUnregistered( const QString & udi );
|
||
+protected slots:
|
||
+ /**
|
||
+ * Slot called when a new device is added to the system
|
||
+ */
|
||
+ void deviceAdded( const QString & udi );
|
||
+ void deviceRemoved( const QString & udi );
|
||
+protected:
|
||
+ int xioctl(int request, void *arg);
|
||
+ int errnoReturn(const char* s);
|
||
+ int showDeviceCapabilities(unsigned int device);
|
||
+ void guessDriver();
|
||
+ int m_current_device;
|
||
+ struct imagebuffer m_buffer; // only used when no devices were found
|
||
+
|
||
+ QMutex m_ready;
|
||
+private:
|
||
+ VideoDevicePool();
|
||
+ static VideoDevicePool* s_self;
|
||
+ static __u64 m_clients; // Number of instances
|
||
+};
|
||
+
|
||
+}
|
||
+}
|
||
+
|
||
+#endif // VIDEODEVICEPOOL_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.cpp
|
||
new file mode 100644
|
||
index 0000000..f959cf1
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.cpp
|
||
@@ -0,0 +1,168 @@
|
||
+/*
|
||
+ videoinput.cpp - Video Input Class
|
||
+
|
||
+ Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#include "videoinput.h"
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+VideoInput::VideoInput()
|
||
+{
|
||
+ kDebug() << "Executing Video Input's constructor!!!";
|
||
+ m_brightness = 0.5;
|
||
+ m_contrast = 0.5;
|
||
+ m_saturation = 0.5;
|
||
+ m_hue = 0.5;
|
||
+ m_autobrightnesscontrast = false;
|
||
+ m_autocolorcorrection = false;
|
||
+}
|
||
+
|
||
+
|
||
+VideoInput::~VideoInput()
|
||
+{
|
||
+}
|
||
+
|
||
+float VideoInput::getBrightness()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_brightness;
|
||
+}
|
||
+
|
||
+float VideoInput::setBrightness(float brightness)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ if ( brightness > 1 )
|
||
+ brightness = 1;
|
||
+ else
|
||
+ if ( brightness < 0 )
|
||
+ brightness = 0;
|
||
+ m_brightness = brightness;
|
||
+ return getBrightness();
|
||
+}
|
||
+
|
||
+float VideoInput::getContrast()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_contrast;
|
||
+}
|
||
+
|
||
+float VideoInput::setContrast(float contrast)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ if ( contrast > 1 )
|
||
+ contrast = 1;
|
||
+ else
|
||
+ if ( contrast < 0 )
|
||
+ contrast = 0;
|
||
+ m_contrast = contrast;
|
||
+ return getContrast();
|
||
+}
|
||
+
|
||
+float VideoInput::getSaturation()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_saturation;
|
||
+}
|
||
+
|
||
+float VideoInput::setSaturation(float saturation)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ if ( saturation > 1 )
|
||
+ saturation = 1;
|
||
+ else
|
||
+ if ( saturation < 0 )
|
||
+ saturation = 0;
|
||
+ m_saturation = saturation;
|
||
+ return getSaturation();
|
||
+}
|
||
+
|
||
+float VideoInput::getWhiteness()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_whiteness;
|
||
+}
|
||
+
|
||
+float VideoInput::setWhiteness(float whiteness)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ if ( whiteness > 1 )
|
||
+ whiteness = 1;
|
||
+ else
|
||
+ if ( whiteness < 0 )
|
||
+ whiteness = 0;
|
||
+ m_whiteness = whiteness;
|
||
+ return getWhiteness();
|
||
+}
|
||
+
|
||
+float VideoInput::getHue()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_hue;
|
||
+}
|
||
+
|
||
+float VideoInput::setHue(float hue)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ if ( hue > 1 )
|
||
+ hue = 1;
|
||
+ else
|
||
+ if ( hue < 0 )
|
||
+ hue = 0;
|
||
+ m_hue = hue;
|
||
+ return getHue();
|
||
+}
|
||
+
|
||
+
|
||
+bool VideoInput::getAutoBrightnessContrast()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_autobrightnesscontrast;
|
||
+}
|
||
+
|
||
+bool VideoInput::setAutoBrightnessContrast(bool brightnesscontrast)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ m_autobrightnesscontrast = brightnesscontrast;
|
||
+ return getAutoBrightnessContrast();
|
||
+}
|
||
+
|
||
+bool VideoInput::getAutoColorCorrection()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_autocolorcorrection;
|
||
+}
|
||
+
|
||
+bool VideoInput::setAutoColorCorrection(bool colorcorrection)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ m_autocolorcorrection = colorcorrection;
|
||
+ return getAutoColorCorrection();
|
||
+}
|
||
+
|
||
+bool VideoInput::getImageAsMirror()
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ return m_imageasmirror;
|
||
+}
|
||
+
|
||
+bool VideoInput::setImageAsMirror(bool imageasmirror)
|
||
+{
|
||
+// kDebug() << " called.";
|
||
+ m_imageasmirror = imageasmirror;
|
||
+ return getImageAsMirror();
|
||
+}
|
||
+
|
||
+}
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.h
|
||
new file mode 100644
|
||
index 0000000..932f66a
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapture/videoinput.h
|
||
@@ -0,0 +1,81 @@
|
||
+/*
|
||
+ videoinput.h - Video Input Class
|
||
+
|
||
+ Copyright (c) 2005-2006 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+ *************************************************************************
|
||
+ * *
|
||
+ * 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 of the License, or (at your option) any later version. *
|
||
+ * *
|
||
+ *************************************************************************
|
||
+*/
|
||
+
|
||
+#define ENABLE_AV
|
||
+
|
||
+#ifndef VIDEOINPUT_H
|
||
+#define VIDEOINPUT_H
|
||
+
|
||
+#ifdef __linux__
|
||
+#include <asm/types.h>
|
||
+#undef __STRICT_ANSI__
|
||
+#endif // __linux__
|
||
+#ifndef __u64 //required by videodev.h
|
||
+#define __u64 unsigned long long
|
||
+#endif // __u64*/
|
||
+
|
||
+#include <qstring.h>
|
||
+#include <kdebug.h>
|
||
+
|
||
+namespace Phonon {
|
||
+namespace VideoCapture {
|
||
+
|
||
+/**
|
||
+@author Kopete Developers
|
||
+*/
|
||
+class VideoInput{
|
||
+public:
|
||
+ VideoInput();
|
||
+ ~VideoInput();
|
||
+ QString name;
|
||
+ int hastuner;
|
||
+ __u64 m_standards;
|
||
+ float getBrightness();
|
||
+ float setBrightness(float brightness);
|
||
+ float getContrast();
|
||
+ float setContrast(float contrast);
|
||
+ float getSaturation();
|
||
+ float setSaturation(float saturation);
|
||
+ float getWhiteness();
|
||
+ float setWhiteness(float whiteness);
|
||
+ float getHue();
|
||
+ float setHue(float Hue);
|
||
+ bool getAutoBrightnessContrast();
|
||
+ bool setAutoBrightnessContrast(bool brightnesscontrast);
|
||
+ bool getAutoColorCorrection();
|
||
+ bool setAutoColorCorrection(bool colorcorrection);
|
||
+ bool getImageAsMirror();
|
||
+ bool setImageAsMirror(bool imageasmirror);
|
||
+
|
||
+protected:
|
||
+// this block must be changed to use a vector of controls instead of fixed ones
|
||
+ float m_brightness;
|
||
+ float m_contrast;
|
||
+ float m_saturation;
|
||
+ float m_whiteness;
|
||
+ float m_hue;
|
||
+
|
||
+ bool m_autobrightnesscontrast;
|
||
+ bool m_autocolorcorrection;
|
||
+ bool m_imageasmirror;
|
||
+
|
||
+
|
||
+};
|
||
+
|
||
+}
|
||
+}
|
||
+
|
||
+
|
||
+#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/CMakeLists.txt b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/CMakeLists.txt
|
||
new file mode 100644
|
||
index 0000000..006c388
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/CMakeLists.txt
|
||
@@ -0,0 +1,17 @@
|
||
+include_directories( ${KDE4_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/videocapture/)
|
||
+
|
||
+add_definitions( ${KDE4_DEFINITIONS} )
|
||
+
|
||
+set(videocapturetestapp_SRCS videocapturetestappmain.cpp mainwindow.cpp )
|
||
+
|
||
+kde4_add_ui_files(videocapturetestapp_SRCS mainwidget.ui )
|
||
+
|
||
+kde4_add_executable(videocapturetestapp_bin ${videocapturetestapp_SRCS})
|
||
+
|
||
+set_target_properties(videocapturetestapp_bin PROPERTIES OUTPUT_NAME videocapturetestapp)
|
||
+
|
||
+target_link_libraries( videocapturetestapp_bin ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} videocapture)
|
||
+
|
||
+install(TARGETS videocapturetestapp_bin DESTINATION ${BIN_INSTALL_DIR} )
|
||
+install(FILES videocapturetestapp.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
|
||
+kde4_install_icons(${ICON_INSTALL_DIR} )
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi128-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi128-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..0bb33f4
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi128-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi16-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi16-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..db115cd
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi16-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi22-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi22-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..8a0b339
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi22-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi32-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi32-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..f9d3213
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi32-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi48-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi48-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..696bc13
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi48-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi64-app-videocapturetestapp.png b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi64-app-videocapturetestapp.png
|
||
new file mode 100644
|
||
index 0000000..c95f65c
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hi64-app-videocapturetestapp.png differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hisc-app-videocapturetestapp.svgz b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hisc-app-videocapturetestapp.svgz
|
||
new file mode 100644
|
||
index 0000000..d315496
|
||
Binary files /dev/null and b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/hisc-app-videocapturetestapp.svgz differ
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwidget.ui b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwidget.ui
|
||
new file mode 100644
|
||
index 0000000..2510eb7
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwidget.ui
|
||
@@ -0,0 +1,528 @@
|
||
+<ui version="4.0" >
|
||
+ <class>MainWidget</class>
|
||
+ <widget class="QWidget" name="MainWidget" >
|
||
+ <property name="geometry" >
|
||
+ <rect>
|
||
+ <x>0</x>
|
||
+ <y>0</y>
|
||
+ <width>352</width>
|
||
+ <height>519</height>
|
||
+ </rect>
|
||
+ </property>
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="windowTitle" >
|
||
+ <string>videocapturetestapp</string>
|
||
+ </property>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <item>
|
||
+ <layout class="QHBoxLayout" >
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>0</width>
|
||
+ <height>20</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QLabel" name="video_image_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="minimumSize" >
|
||
+ <size>
|
||
+ <width>320</width>
|
||
+ <height>240</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ <property name="frameShape" >
|
||
+ <enum>QFrame::Box</enum>
|
||
+ </property>
|
||
+ <property name="scaledContents" >
|
||
+ <bool>true</bool>
|
||
+ </property>
|
||
+ <property name="alignment" >
|
||
+ <set>Qt::AlignCenter</set>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>0</width>
|
||
+ <height>20</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ <item>
|
||
+ <layout class="QHBoxLayout" >
|
||
+ <item>
|
||
+ <widget class="KPushButton" name="take_photo_button" >
|
||
+ <property name="text" >
|
||
+ <string>Take a Photo</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>40</width>
|
||
+ <height>20</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="KPushButton" name="help_button" >
|
||
+ <property name="text" >
|
||
+ <string>Help</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="KPushButton" name="quit_button" >
|
||
+ <property name="text" >
|
||
+ <string>Quit</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QTabWidget" name="video_tab_widget" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Minimum" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="currentIndex" >
|
||
+ <number>1</number>
|
||
+ </property>
|
||
+ <widget class="QWidget" name="device_tab" >
|
||
+ <attribute name="title" >
|
||
+ <string>Device</string>
|
||
+ </attribute>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <item>
|
||
+ <layout class="QHBoxLayout" >
|
||
+ <item>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <item>
|
||
+ <widget class="QLabel" name="device_label" >
|
||
+ <property name="text" >
|
||
+ <string>Device:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QLabel" name="input_label" >
|
||
+ <property name="text" >
|
||
+ <string>Input:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QLabel" name="standard_label" >
|
||
+ <property name="text" >
|
||
+ <string>Standard:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ <item>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <property name="leftMargin" >
|
||
+ <number>0</number>
|
||
+ </property>
|
||
+ <property name="topMargin" >
|
||
+ <number>0</number>
|
||
+ </property>
|
||
+ <property name="bottomMargin" >
|
||
+ <number>0</number>
|
||
+ </property>
|
||
+ <item>
|
||
+ <widget class="KComboBox" name="device_combo_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Select the device to take video input from</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="KComboBox" name="input_combo_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Select from multiple inputs provided by some devices</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="KComboBox" name="standard_combo_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Select the video standard to use</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Vertical</enum>
|
||
+ </property>
|
||
+ <property name="sizeType" >
|
||
+ <enum>QSizePolicy::MinimumExpanding</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>20</width>
|
||
+ <height>0</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </widget>
|
||
+ <widget class="QWidget" name="options_tab" >
|
||
+ <attribute name="title" >
|
||
+ <string>Optio&ns</string>
|
||
+ </attribute>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <item>
|
||
+ <widget class="QCheckBox" name="adjust_brightness_combo_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Minimum" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Enable automatic brightness/contrast adjustment</string>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Adjust brightness/contrast</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QCheckBox" name="correct_colors_combo_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Minimum" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Enable automatic color correction</string>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Correct colors</string>
|
||
+ </property>
|
||
+ <property name="shortcut" >
|
||
+ <string/>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <widget class="QCheckBox" name="mirror_preview_check_box" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Minimum" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="toolTip" >
|
||
+ <string>Show the video input mirrored</string>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Mirror preview</string>
|
||
+ </property>
|
||
+ <property name="shortcut" >
|
||
+ <string/>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Vertical</enum>
|
||
+ </property>
|
||
+ <property name="sizeType" >
|
||
+ <enum>QSizePolicy::MinimumExpanding</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>20</width>
|
||
+ <height>0</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </widget>
|
||
+ <widget class="QWidget" name="controls_tab" >
|
||
+ <attribute name="title" >
|
||
+ <string>Con&trols</string>
|
||
+ </attribute>
|
||
+ <layout class="QVBoxLayout" >
|
||
+ <item>
|
||
+ <layout class="QGridLayout" >
|
||
+ <item row="0" column="0" >
|
||
+ <widget class="QLabel" name="brightness_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Brightness:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="0" column="1" >
|
||
+ <widget class="QSlider" name="brightness_slider" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="maximum" >
|
||
+ <number>65535</number>
|
||
+ </property>
|
||
+ <property name="singleStep" >
|
||
+ <number>256</number>
|
||
+ </property>
|
||
+ <property name="pageStep" >
|
||
+ <number>4096</number>
|
||
+ </property>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="1" column="0" >
|
||
+ <widget class="QLabel" name="contrast_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Contrast:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="1" column="1" >
|
||
+ <widget class="QSlider" name="contrast_slider" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="maximum" >
|
||
+ <number>65535</number>
|
||
+ </property>
|
||
+ <property name="singleStep" >
|
||
+ <number>256</number>
|
||
+ </property>
|
||
+ <property name="pageStep" >
|
||
+ <number>4096</number>
|
||
+ </property>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="2" column="0" >
|
||
+ <widget class="QLabel" name="saturation_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Saturation:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="2" column="1" >
|
||
+ <widget class="QSlider" name="saturation_slider" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="maximum" >
|
||
+ <number>65535</number>
|
||
+ </property>
|
||
+ <property name="singleStep" >
|
||
+ <number>256</number>
|
||
+ </property>
|
||
+ <property name="pageStep" >
|
||
+ <number>4096</number>
|
||
+ </property>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="3" column="0" >
|
||
+ <widget class="QLabel" name="whiteness_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Whiteness:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="3" column="1" >
|
||
+ <widget class="QSlider" name="whiteness_slider" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="maximum" >
|
||
+ <number>65535</number>
|
||
+ </property>
|
||
+ <property name="singleStep" >
|
||
+ <number>256</number>
|
||
+ </property>
|
||
+ <property name="pageStep" >
|
||
+ <number>4096</number>
|
||
+ </property>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="4" column="0" >
|
||
+ <widget class="QLabel" name="hue_label" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="text" >
|
||
+ <string>Hue:</string>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ <item row="4" column="1" >
|
||
+ <widget class="QSlider" name="hue_slider" >
|
||
+ <property name="sizePolicy" >
|
||
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
|
||
+ <horstretch>0</horstretch>
|
||
+ <verstretch>0</verstretch>
|
||
+ </sizepolicy>
|
||
+ </property>
|
||
+ <property name="maximum" >
|
||
+ <number>65535</number>
|
||
+ </property>
|
||
+ <property name="singleStep" >
|
||
+ <number>256</number>
|
||
+ </property>
|
||
+ <property name="pageStep" >
|
||
+ <number>4096</number>
|
||
+ </property>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Horizontal</enum>
|
||
+ </property>
|
||
+ </widget>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </item>
|
||
+ <item>
|
||
+ <spacer>
|
||
+ <property name="orientation" >
|
||
+ <enum>Qt::Vertical</enum>
|
||
+ </property>
|
||
+ <property name="sizeType" >
|
||
+ <enum>QSizePolicy::MinimumExpanding</enum>
|
||
+ </property>
|
||
+ <property name="sizeHint" >
|
||
+ <size>
|
||
+ <width>20</width>
|
||
+ <height>0</height>
|
||
+ </size>
|
||
+ </property>
|
||
+ </spacer>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </widget>
|
||
+ </widget>
|
||
+ </item>
|
||
+ </layout>
|
||
+ </widget>
|
||
+ <layoutdefault spacing="6" margin="11" />
|
||
+ <customwidgets>
|
||
+ <customwidget>
|
||
+ <class>KComboBox</class>
|
||
+ <extends>QComboBox</extends>
|
||
+ <header>kcombobox.h</header>
|
||
+ </customwidget>
|
||
+ <customwidget>
|
||
+ <class>KPushButton</class>
|
||
+ <extends>QPushButton</extends>
|
||
+ <header>kpushbutton.h</header>
|
||
+ </customwidget>
|
||
+ </customwidgets>
|
||
+ <resources/>
|
||
+ <connections/>
|
||
+</ui>
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.cpp
|
||
new file mode 100644
|
||
index 0000000..d8421dd
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.cpp
|
||
@@ -0,0 +1,290 @@
|
||
+/*
|
||
+mainwindow.cpp - MainWindow class implementation
|
||
+
|
||
+Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+This program is free software; you can redistribute it and/or
|
||
+modify it under the terms of the GNU General Public License as
|
||
+published by the Free Software Foundation; either version 2 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.), which shall act as a proxy
|
||
+defined in Section 14 of version 3 of the license.
|
||
+
|
||
+This program 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 General Public License for more details.
|
||
+
|
||
+You should have received a copy of the GNU General Public License
|
||
+along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+*/
|
||
+
|
||
+#include "mainwindow.h"
|
||
+
|
||
+#include <QImage>
|
||
+#include <QPixmap>
|
||
+#include <QDir>
|
||
+#include <QImageWriter>
|
||
+
|
||
+#include <KPushButton>
|
||
+#include <KComboBox>
|
||
+#include <KTemporaryFile>
|
||
+#include <KHelpMenu>
|
||
+#include <KMenu>
|
||
+#include <KDialog>
|
||
+#include <KApplication>
|
||
+#include <KImageIO>
|
||
+#include <KFileDialog>
|
||
+#include <KImageFilePreview>
|
||
+#include <KUrl>
|
||
+#include <KMessageBox>
|
||
+#include <KIO/NetAccess>
|
||
+
|
||
+MainWindow::MainWindow( QWidget *parent )
|
||
+: QWidget( parent )
|
||
+{
|
||
+ main_widget = new Ui_MainWidget();
|
||
+ main_widget->setupUi( this );
|
||
+
|
||
+ main_widget->video_image_label->setScaledContents( false );
|
||
+ main_widget->video_image_label->setPixmap( KIcon( "videocapturetestapp" ).pixmap( 128, 128 ) );
|
||
+
|
||
+ connect( main_widget->device_combo_box, SIGNAL( activated( int ) ), this, SLOT( deviceChanged( int ) ) );
|
||
+ connect( main_widget->input_combo_box, SIGNAL( activated( int ) ), this, SLOT( inputChanged( int ) ) );
|
||
+
|
||
+ connect( main_widget->standard_combo_box, SIGNAL( activated( int ) ), this, SLOT( standardChanged( int ) ) );
|
||
+ connect( main_widget->brightness_slider, SIGNAL( valueChanged( int ) ), this, SLOT( brightnessChanged( int ) ) );
|
||
+ connect( main_widget->contrast_slider, SIGNAL( valueChanged( int ) ), this, SLOT( contrastChanged( int ) ) );
|
||
+ connect( main_widget->saturation_slider, SIGNAL( valueChanged( int ) ), this, SLOT( saturationChanged( int ) ) );
|
||
+ connect( main_widget->whiteness_slider, SIGNAL( valueChanged( int ) ), this, SLOT( whitenessChanged( int ) ) );
|
||
+ connect( main_widget->hue_slider, SIGNAL( valueChanged( int ) ), this, SLOT( hueChanged( int ) ) );
|
||
+
|
||
+ connect( main_widget->adjust_brightness_combo_box, SIGNAL( toggled( bool ) ), this, SLOT( adjustBrightnessContrastChanged( bool ) ) );
|
||
+ connect( main_widget->correct_colors_combo_box, SIGNAL( toggled( bool ) ), this, SLOT( colorCorrectionChanged( bool ) ) );
|
||
+ connect( main_widget->mirror_preview_check_box, SIGNAL( toggled( bool ) ), this, SLOT( mirrorPreviewChanged( bool ) ) );
|
||
+
|
||
+ connect( main_widget->take_photo_button, SIGNAL( clicked( bool ) ), this, SLOT( takePhoto( bool ) ) );
|
||
+ connect(main_widget->quit_button, SIGNAL( clicked() ), KApplication::kApplication(), SLOT( quit() ) );
|
||
+
|
||
+ vdpool = Phonon::VideoCapture::VideoDevicePool::self();
|
||
+ vdpool->open();
|
||
+ vdpool->setSize( 320, 240 );
|
||
+
|
||
+ vdpool->fillDeviceKComboBox( main_widget->device_combo_box );
|
||
+ vdpool->fillInputKComboBox( main_widget->input_combo_box );
|
||
+ vdpool->fillStandardKComboBox( main_widget->standard_combo_box );
|
||
+
|
||
+ vdpool->setBrightness( 0 );
|
||
+ vdpool->setHue( 0 );
|
||
+
|
||
+ setVideoInputParameters();
|
||
+
|
||
+ vdpool->startCapturing();
|
||
+
|
||
+ connect( vdpool, SIGNAL( deviceRegistered( const QString & ) ), SLOT( deviceRegistered( const QString & ) ) );
|
||
+ connect( vdpool, SIGNAL( deviceUnregistered( const QString & ) ), SLOT( deviceUnregistered( const QString & ) ) );
|
||
+
|
||
+ connect( &update_timer, SIGNAL( timeout() ), this, SLOT( updateImage() ) );
|
||
+
|
||
+ if( vdpool->hasDevices() ) {
|
||
+ update_timer.start( 80 );
|
||
+ main_widget->video_image_label->setScaledContents( true );
|
||
+ }
|
||
+
|
||
+ KHelpMenu *help_menu = new KHelpMenu( this, KGlobal::mainComponent().aboutData(), false );
|
||
+ main_widget->help_button->setMenu( help_menu->menu() );
|
||
+ main_widget->help_button->setIcon( KIcon( "help-contents" ) );
|
||
+ main_widget->quit_button->setIcon( KIcon( "application-exit" ) );
|
||
+ main_widget->take_photo_button->setIcon( KIcon( "videocapturetestapp" ) );
|
||
+
|
||
+}
|
||
+
|
||
+
|
||
+MainWindow::~MainWindow()
|
||
+{
|
||
+ vdpool->close();
|
||
+}
|
||
+
|
||
+
|
||
+void MainWindow::setVideoInputParameters()
|
||
+{
|
||
+ if( vdpool->size() ) {
|
||
+ main_widget->brightness_slider->setValue( ( int )( vdpool->getBrightness() * main_widget->brightness_slider->maximum() ) );
|
||
+ main_widget->contrast_slider->setValue( ( int )( vdpool->getContrast() * main_widget->contrast_slider->maximum() ) );
|
||
+ main_widget->saturation_slider->setValue( ( int )( vdpool->getSaturation() * main_widget->saturation_slider->maximum() ) );
|
||
+ main_widget->whiteness_slider->setValue( ( int )( vdpool->getWhiteness() * main_widget->whiteness_slider->maximum() ) );
|
||
+ main_widget->hue_slider->setValue( ( int )( vdpool->getHue() * main_widget->hue_slider->maximum() ) );
|
||
+ main_widget->adjust_brightness_combo_box->setChecked( vdpool->getAutoBrightnessContrast() );
|
||
+ main_widget->correct_colors_combo_box->setChecked( vdpool->getAutoColorCorrection() );
|
||
+ main_widget->mirror_preview_check_box->setChecked( vdpool->getImageAsMirror() );
|
||
+ }
|
||
+}
|
||
+
|
||
+void MainWindow::deviceChanged( int )
|
||
+{
|
||
+ int new_device = main_widget->device_combo_box->currentIndex();
|
||
+
|
||
+ if( ( new_device < vdpool->m_videodevice.size() ) && ( new_device != vdpool->currentDevice() ) ) {
|
||
+ vdpool->open( new_device );
|
||
+ vdpool->setSize( 320, 240 );
|
||
+ vdpool->fillInputKComboBox( main_widget->input_combo_box );
|
||
+ vdpool->startCapturing();
|
||
+ setVideoInputParameters();
|
||
+ }
|
||
+}
|
||
+
|
||
+void MainWindow::inputChanged( int )
|
||
+{
|
||
+ int new_input = main_widget->input_combo_box->currentIndex();
|
||
+
|
||
+ if( ( new_input < vdpool->inputs() ) && ( new_input != vdpool->currentInput() ) ) {
|
||
+ vdpool->selectInput( main_widget->input_combo_box->currentIndex() );
|
||
+ vdpool->fillStandardKComboBox( main_widget->standard_combo_box );
|
||
+ setVideoInputParameters();
|
||
+ }
|
||
+}
|
||
+
|
||
+void MainWindow::standardChanged( int )
|
||
+{
|
||
+}
|
||
+
|
||
+void MainWindow::brightnessChanged( int )
|
||
+{
|
||
+ vdpool->setBrightness( main_widget->brightness_slider->value() / (float)main_widget->brightness_slider->maximum() );
|
||
+}
|
||
+
|
||
+void MainWindow::contrastChanged( int )
|
||
+{
|
||
+ vdpool->setContrast( main_widget->contrast_slider->value() / (float)main_widget->contrast_slider->maximum() );
|
||
+}
|
||
+
|
||
+void MainWindow::saturationChanged( int )
|
||
+{
|
||
+ vdpool->setSaturation( main_widget->saturation_slider->value() / (float)main_widget->saturation_slider->maximum() );
|
||
+}
|
||
+
|
||
+void MainWindow::whitenessChanged( int )
|
||
+{
|
||
+ vdpool->setWhiteness( main_widget->whiteness_slider->value() / (float)main_widget->whiteness_slider->maximum() );
|
||
+}
|
||
+
|
||
+void MainWindow::hueChanged( int )
|
||
+{
|
||
+ vdpool->setHue( main_widget->hue_slider->value() / (float)main_widget->hue_slider->maximum() );
|
||
+}
|
||
+
|
||
+void MainWindow::adjustBrightnessContrastChanged( bool )
|
||
+{
|
||
+ vdpool->setAutoBrightnessContrast( main_widget->adjust_brightness_combo_box->isChecked() );
|
||
+}
|
||
+
|
||
+void MainWindow::colorCorrectionChanged( bool )
|
||
+{
|
||
+ vdpool->setAutoColorCorrection( main_widget->correct_colors_combo_box->isChecked() );
|
||
+}
|
||
+
|
||
+void MainWindow::mirrorPreviewChanged( bool )
|
||
+{
|
||
+ vdpool->setImageAsMirror( main_widget->mirror_preview_check_box->isChecked() );
|
||
+}
|
||
+
|
||
+void MainWindow::updateImage()
|
||
+{
|
||
+ vdpool->getFrame();
|
||
+ vdpool->getImage( &captured_frame );
|
||
+ main_widget->video_image_label->setPixmap( QPixmap::fromImage( captured_frame.mirrored( vdpool->getImageAsMirror(), false ) ) );
|
||
+}
|
||
+
|
||
+void MainWindow::deviceRegistered( const QString& )
|
||
+{
|
||
+ vdpool->fillDeviceKComboBox( main_widget->device_combo_box );
|
||
+ vdpool->fillInputKComboBox( main_widget->input_combo_box );
|
||
+ vdpool->fillStandardKComboBox( main_widget->standard_combo_box );
|
||
+}
|
||
+
|
||
+
|
||
+void MainWindow::deviceUnregistered( const QString& )
|
||
+{
|
||
+ vdpool->fillDeviceKComboBox( main_widget->device_combo_box );
|
||
+ vdpool->fillInputKComboBox( main_widget->input_combo_box );
|
||
+ vdpool->fillStandardKComboBox( main_widget->standard_combo_box );
|
||
+}
|
||
+
|
||
+void MainWindow::takePhoto( bool )
|
||
+{
|
||
+ QPixmap captured_image = QPixmap::fromImage( captured_frame );
|
||
+
|
||
+ KUrl image_url( QDir::currentPath() + '/' + "videocapturetestapp_image.png" );
|
||
+ QStringList mime_types = KImageIO::mimeTypes( KImageIO::Writing );
|
||
+ KFileDialog file_dilaog( image_url, mime_types.join( " " ), this );
|
||
+
|
||
+ file_dilaog.setOperationMode( KFileDialog::Saving );
|
||
+ file_dilaog.setCaption( i18n( "Save As" ) );
|
||
+
|
||
+ KImageFilePreview *image_preview = new KImageFilePreview( &file_dilaog );
|
||
+ file_dilaog.setPreviewWidget( image_preview );
|
||
+
|
||
+ if ( !file_dilaog.exec() ) {
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ image_url = file_dilaog.selectedUrl();
|
||
+ if ( !image_url.isValid() ) {
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ saveImage( captured_image, image_url );
|
||
+
|
||
+}
|
||
+
|
||
+
|
||
+void MainWindow::saveImage( const QPixmap &image, const KUrl &image_url)
|
||
+{
|
||
+ if( KIO::NetAccess::exists( image_url, KIO::NetAccess::DestinationSide, this ) ) {
|
||
+ const QString title = i18n( "File Exists" );
|
||
+ const QString text = i18n( "<qt>Do you really want to overwrite <b>%1</b>?</qt>", image_url.prettyUrl() );
|
||
+ if( KMessageBox::Continue != KMessageBox::warningContinueCancel( this, text, title, KGuiItem( i18n( "Overwrite" ) ) ) ) {
|
||
+ return;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ QByteArray type = "PNG";
|
||
+ QString mime_type = KMimeType::findByUrl( image_url.url(), 0, image_url.isLocalFile(), true )->name();
|
||
+ QStringList types = KImageIO::typeForMime( mime_type );
|
||
+ if( !types.isEmpty() ) {
|
||
+ type = types.first().toLatin1();
|
||
+ }
|
||
+
|
||
+ bool ok = false;
|
||
+
|
||
+ if( image_url.isLocalFile() ) {
|
||
+ bool supported = false;
|
||
+ QByteArray format;
|
||
+ foreach( format, QImageWriter::supportedImageFormats() ) {
|
||
+ if( format.toLower() == type.toLower() ) {
|
||
+ supported = true;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if( supported && image.save( image_url.path(), type ) ) {
|
||
+ ok = true;
|
||
+ }
|
||
+ }
|
||
+ else {
|
||
+ KTemporaryFile temp_file;
|
||
+ if( temp_file.open() ) {
|
||
+ if( image.save( &temp_file, type ) ) {
|
||
+ ok = KIO::NetAccess::upload( temp_file.fileName(), image_url, this );
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ QApplication::restoreOverrideCursor();
|
||
+
|
||
+ if( !ok ) {
|
||
+ QString caption = i18n( "Unable to Save Image" );
|
||
+ QString text = i18n( "videocapturetestapp was unable to save the image to\n%1.", image_url.prettyUrl() );
|
||
+ KMessageBox::error( this, text, caption );
|
||
+ }
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.h b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.h
|
||
new file mode 100644
|
||
index 0000000..47bd584
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/mainwindow.h
|
||
@@ -0,0 +1,86 @@
|
||
+/*
|
||
+mainwindow.h - MainWindow class header
|
||
+
|
||
+Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+This program is free software; you can redistribute it and/or
|
||
+modify it under the terms of the GNU General Public License as
|
||
+published by the Free Software Foundation; either version 2 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.), which shall act as a proxy
|
||
+defined in Section 14 of version 3 of the license.
|
||
+
|
||
+This program 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 General Public License for more details.
|
||
+
|
||
+You should have received a copy of the GNU General Public License
|
||
+along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+*/
|
||
+
|
||
+#ifndef MAINWINDOW_H
|
||
+#define MAINWINDOW_H
|
||
+
|
||
+#include <QImage>
|
||
+#include <QTimer>
|
||
+
|
||
+class QPixmap;
|
||
+class KUrl;
|
||
+
|
||
+#include "videodevicepool.h"
|
||
+#include "ui_mainwidget.h"
|
||
+
|
||
+class MainWindow : public QWidget
|
||
+{
|
||
+
|
||
+Q_OBJECT
|
||
+
|
||
+public:
|
||
+
|
||
+ MainWindow( QWidget *parent = 0 );
|
||
+
|
||
+ ~MainWindow();
|
||
+
|
||
+
|
||
+private slots:
|
||
+
|
||
+ void deviceChanged( int );
|
||
+ void inputChanged( int );
|
||
+ void standardChanged( int );
|
||
+
|
||
+ void brightnessChanged( int );
|
||
+ void contrastChanged( int );
|
||
+ void saturationChanged( int );
|
||
+ void whitenessChanged( int );
|
||
+ void hueChanged( int );
|
||
+
|
||
+ void adjustBrightnessContrastChanged( bool );
|
||
+ void colorCorrectionChanged( bool );
|
||
+ void mirrorPreviewChanged( bool );
|
||
+
|
||
+ void updateImage();
|
||
+
|
||
+ void deviceRegistered( const QString & );
|
||
+ void deviceUnregistered( const QString & );
|
||
+
|
||
+ void takePhoto( bool );
|
||
+
|
||
+private:
|
||
+
|
||
+ Ui_MainWidget *main_widget;
|
||
+
|
||
+ Phonon::VideoCapture::VideoDevicePool *vdpool;
|
||
+
|
||
+ QImage captured_frame;
|
||
+
|
||
+ QTimer update_timer;
|
||
+
|
||
+ void saveImage( const QPixmap&, const KUrl& );
|
||
+
|
||
+ void setVideoInputParameters();
|
||
+
|
||
+};
|
||
+
|
||
+#endif
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestapp.desktop b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestapp.desktop
|
||
new file mode 100644
|
||
index 0000000..14afae1
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestapp.desktop
|
||
@@ -0,0 +1,96 @@
|
||
+[Desktop Entry]
|
||
+Categories=Qt;KDE;Graphics;
|
||
+Comment=
|
||
+Exec=videocapturetestapp
|
||
+GenericName=Video Capture Test Application
|
||
+GenericName[bg]=Пробно приложение за прихващане на видео
|
||
+GenericName[ca]=Aplicació de proves de captura de vídeo
|
||
+GenericName[cs]=Testovací aplikace pro nahrávání videa
|
||
+GenericName[da]=Testprogram til videooptagelse
|
||
+GenericName[de]=Videoaufnahme-Testanwendung
|
||
+GenericName[el]=Δοκιμαστική εφαρμογή σύλληψης βίντεο
|
||
+GenericName[en_GB]=Video Capture Test Application
|
||
+GenericName[es]=Aplicación para probar la de captura de vídeo
|
||
+GenericName[et]=Videohõive testrakendus
|
||
+GenericName[eu]=Bideoa jasotzeko froga egiteko aplikazioa
|
||
+GenericName[fr]=Application de test pour la capture vidéo
|
||
+GenericName[ga]=Feidhmchlár Tástála Físghabhála
|
||
+GenericName[gl]=Programa de probas para a captura de vídeo
|
||
+GenericName[hsb]=Testowa aplikacija za widejo-capture
|
||
+GenericName[hu]=Teszt videofelvétel
|
||
+GenericName[is]=Prófunarforrit fyrir vídeóupptökur
|
||
+GenericName[it]=Applicazione di prova per l'acquisizione video
|
||
+GenericName[ja]=映像キャプチャをテストするアプリケーション
|
||
+GenericName[ko]=비디오 캡처 테스트 프로그램
|
||
+GenericName[ku]=Sepana Ceribandina Girtina Vîdeoyê
|
||
+GenericName[lt]=Video įrašymo bandomoji programa
|
||
+GenericName[lv]=Video tveršanas testa programma
|
||
+GenericName[nds]=Video-Opnehm-Testprogramm
|
||
+GenericName[nl]=Testprogramma voor video-opname
|
||
+GenericName[nn]=Testprogram for videoopptak
|
||
+GenericName[pa]=ਵੀਡਿਓ ਕੈਪਚਰ ਟੈਸਟ ਐਪਲੀਕੇਸ਼ਨ
|
||
+GenericName[pl]=Program testowy do nagrywania wideo
|
||
+GenericName[pt]=Aplicação de Testes de Captura de Vídeo
|
||
+GenericName[pt_BR]=Aplicativo de teste de captura de vídeo
|
||
+GenericName[se]=Videobádden geahččalanprográmma
|
||
+GenericName[sk]=Video testovacia aplikácia
|
||
+GenericName[sl]=Program za preizkus zajema videa
|
||
+GenericName[sr]=Програм за пробу хватања видеа
|
||
+GenericName[sr@latin]=Program za probu hvatanja videa
|
||
+GenericName[sv]=Testprogram för videoinspelning
|
||
+GenericName[tr]=Video Yakalama Test Uygulaması
|
||
+GenericName[uk]=Тестова програма для захоплення відео
|
||
+GenericName[x-test]=xxVideo Capture Test Applicationxx
|
||
+GenericName[zh_CN]=视频捕获测试程序
|
||
+GenericName[zh_TW]=影像擷取測試應用程式
|
||
+Icon=videocapturetestapp
|
||
+MimeType=
|
||
+Name=videocapturetestapp
|
||
+Name[bg]=Пробно прихващане на видео
|
||
+Name[ca]=videocapturetestapp
|
||
+Name[cs]=videocapturetestapp
|
||
+Name[da]=videooptager-testprogram
|
||
+Name[de]=videocapturetestapp
|
||
+Name[el]=videocapturetestapp
|
||
+Name[en_GB]=videocapturetestapp
|
||
+Name[es]=videocapturetestapp
|
||
+Name[et]=videocapturetestapp
|
||
+Name[eu]=videocapturetestapp
|
||
+Name[fr]=videocapturetestapp
|
||
+Name[ga]=videocapturetestapp
|
||
+Name[gl]=videocapturetestapp
|
||
+Name[hsb]=videocapturetestapp
|
||
+Name[hu]=videocapturetestapp
|
||
+Name[is]=videocapturetestapp
|
||
+Name[it]=videocapturetestapp
|
||
+Name[ja]=videocapturetestapp
|
||
+Name[ko]=videocapturetestapp
|
||
+Name[ku]=videocapturetestapp
|
||
+Name[lt]=videocapturetestapp
|
||
+Name[lv]=videocapturetestapp
|
||
+Name[nds]=videocapturetestapp
|
||
+Name[nl]=videocapturetestapp
|
||
+Name[nn]=videocapturetestapp
|
||
+Name[pa]=videocapturetestapp
|
||
+Name[pl]=videocapturetestapp
|
||
+Name[pt]=videocapturetestapp
|
||
+Name[pt_BR]=videocapturetestapp
|
||
+Name[se]=videocapturetestapp
|
||
+Name[sk]=Video testovacia aplikácia
|
||
+Name[sl]=videocapturetestapp
|
||
+Name[sr]=videocapturetestapp
|
||
+Name[sr@latin]=videocapturetestapp
|
||
+Name[sv]=Videoinspelningstest
|
||
+Name[tr]=videocapturetestapp
|
||
+Name[uk]=videocapturetestapp
|
||
+Name[x-test]=xxvideocapturetestappxx
|
||
+Name[zh_CN]=videocapturetestapp
|
||
+Name[zh_TW]=videocapturetestapp
|
||
+Path=
|
||
+StartupNotify=true
|
||
+Terminal=false
|
||
+TerminalOptions=
|
||
+Type=Application
|
||
+X-DBUS-StartupType=
|
||
+X-KDE-SubstituteUID=false
|
||
+X-KDE-Username=
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestappmain.cpp b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestappmain.cpp
|
||
new file mode 100644
|
||
index 0000000..97c08bc
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videocapturedevice/videocapturetestapp/videocapturetestappmain.cpp
|
||
@@ -0,0 +1,47 @@
|
||
+/*
|
||
+videocapturetestapp.cpp - main() function
|
||
+
|
||
+Copyright (c) 2005-2008 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
|
||
+
|
||
+This program is free software; you can redistribute it and/or
|
||
+modify it under the terms of the GNU General Public License as
|
||
+published by the Free Software Foundation; either version 2 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.), which shall act as a proxy
|
||
+defined in Section 14 of version 3 of the license.
|
||
+
|
||
+This program 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 General Public License for more details.
|
||
+
|
||
+You should have received a copy of the GNU General Public License
|
||
+along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
+*/
|
||
+
|
||
+#include <KApplication>
|
||
+#include <KAboutData>
|
||
+#include <KCmdLineArgs>
|
||
+
|
||
+#include "mainwindow.h"
|
||
+
|
||
+#define VIDEOCAPTURETESTAPP_VERSION "0.1"
|
||
+
|
||
+int main( int argc, char *argv[] )
|
||
+{
|
||
+ KAboutData about_data( "videocapturetestapp", 0,
|
||
+ ki18n( "videocapturetestapp" ), VIDEOCAPTURETESTAPP_VERSION,
|
||
+ ki18n( "Video Capture Test Application." ),
|
||
+ KAboutData::License_GPL,
|
||
+ ki18n( "Copyright 2005-2008 Cláudio da Silveira Pinheiro" ), ki18n( "taupter@gmail.com" ) );
|
||
+
|
||
+ KCmdLineArgs::init( argc, argv, &about_data );
|
||
+
|
||
+ KApplication app;
|
||
+
|
||
+ MainWindow* window = new MainWindow();
|
||
+ window->show();
|
||
+
|
||
+ return app.exec();
|
||
+}
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput.cpp b/src/3rdparty/phonon/phonon/experimental/videodataoutput.cpp
|
||
new file mode 100644
|
||
index 0000000..0acbe20
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput.cpp
|
||
@@ -0,0 +1,115 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2007 Matthias Kretz <kretz@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 "videodataoutput.h"
|
||
+#include "videodataoutput_p.h"
|
||
+#include "factory_p.h"
|
||
+#include <QtCore/QSize>
|
||
+
|
||
+#define PHONON_CLASSNAME VideoDataOutput
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+VideoDataOutput::VideoDataOutput(QObject *parent)
|
||
+ : QObject(parent)
|
||
+ , AbstractVideoOutput(*new VideoDataOutputPrivate)
|
||
+{
|
||
+ K_D(VideoDataOutput);
|
||
+ d->createBackendObject();
|
||
+}
|
||
+
|
||
+void VideoDataOutputPrivate::createBackendObject()
|
||
+{
|
||
+ if (m_backendObject)
|
||
+ return;
|
||
+ Q_Q(VideoDataOutput);
|
||
+ m_backendObject = Factory::createVideoDataOutput(q);
|
||
+ if (m_backendObject) {
|
||
+ setupBackendObject();
|
||
+ }
|
||
+}
|
||
+
|
||
+
|
||
+PHONON_GETTER(int, latency, d->latency)
|
||
+
|
||
+bool VideoDataOutputPrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ Q_ASSERT(m_backendObject);
|
||
+
|
||
+ return AbstractVideoOutputPrivate::aboutToDeleteBackendObject();
|
||
+}
|
||
+
|
||
+void VideoDataOutputPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_Q(VideoDataOutput);
|
||
+ Q_ASSERT(m_backendObject);
|
||
+ //AbstractVideoOutputPrivate::setupBackendObject();
|
||
+
|
||
+ //QObject::connect(m_backendObject, SIGNAL(frameReady(const Phonon::Experimental::VideoFrame &)),
|
||
+ // q, SIGNAL(frameReady(const Phonon::Experimental::VideoFrame &)));
|
||
+
|
||
+ QObject::connect(m_backendObject, SIGNAL(displayFrame(qint64, qint64)),
|
||
+ q, SIGNAL(displayFrame(qint64, qint64)));
|
||
+ QObject::connect(m_backendObject, SIGNAL(endOfMedia()), q, SIGNAL(endOfMedia()));
|
||
+}
|
||
+
|
||
+bool VideoDataOutput::isRunning() const
|
||
+{
|
||
+ //K_D(const VideoDataOutput);
|
||
+ //return d->m_backendObject->isRunning();
|
||
+ return false;
|
||
+}
|
||
+
|
||
+VideoFrame VideoDataOutput::frameForTime(qint64 timestamp)
|
||
+{
|
||
+ Q_UNUSED(timestamp);
|
||
+
|
||
+ //return d->m_backendObject->frameForTime(timestamp);
|
||
+ return VideoFrame();
|
||
+}
|
||
+
|
||
+void VideoDataOutput::setRunning(bool running)
|
||
+{
|
||
+ Q_UNUSED(running);
|
||
+
|
||
+ //return d->m_backendObject->setRunning(running);
|
||
+}
|
||
+
|
||
+void VideoDataOutput::start()
|
||
+{
|
||
+ //return d->m_backendObject->setRunning(true);
|
||
+}
|
||
+
|
||
+void VideoDataOutput::stop()
|
||
+{
|
||
+ //return d->m_backendObject->setRunning(false);
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "videodataoutput.moc"
|
||
+
|
||
+#undef PHONON_CLASSNAME
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput.h b/src/3rdparty/phonon/phonon/experimental/videodataoutput.h
|
||
new file mode 100644
|
||
index 0000000..8f49761
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput.h
|
||
@@ -0,0 +1,114 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2005-2007 Matthias Kretz <kretz@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_VIDEODATAOUTPUT_H
|
||
+#define PHONON_VIDEODATAOUTPUT_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../abstractvideooutput.h"
|
||
+#include "../phonondefs.h"
|
||
+#include <QtCore/QObject>
|
||
+
|
||
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||
+template<typename T> class QVector;
|
||
+template<typename Key, typename T> class QMap;
|
||
+#endif
|
||
+class QSize;
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+ class VideoDataOutputPrivate;
|
||
+ struct VideoFrame;
|
||
+
|
||
+ /**
|
||
+ * \short This class gives you nothing. ;-)
|
||
+ * \deprecated
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+ class PHONONEXPERIMENTAL_EXPORT VideoDataOutput : public QObject, public AbstractVideoOutput
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(VideoDataOutput)
|
||
+ /**
|
||
+ * This property retrieves the nominal latency of the
|
||
+ * backend.
|
||
+ */
|
||
+ Q_PROPERTY(int latency READ latency)
|
||
+
|
||
+ /**
|
||
+ * This property indicates the state of the data output.
|
||
+ */
|
||
+ Q_PROPERTY(bool running READ isRunning WRITE setRunning)
|
||
+
|
||
+ PHONON_HEIR(VideoDataOutput)
|
||
+ public:
|
||
+ int latency() const;
|
||
+
|
||
+ bool isRunning() const;
|
||
+
|
||
+ Phonon::Experimental::VideoFrame frameForTime(qint64 timestamp);
|
||
+
|
||
+ public Q_SLOTS:
|
||
+ void setRunning(bool running);
|
||
+ void start();
|
||
+ void stop();
|
||
+
|
||
+ Q_SIGNALS:
|
||
+ /* FIXME: disabled this piece of documentation - add another * to enable
|
||
+ * Fixme: I don't think this makes sense, but I've been wrong before.
|
||
+ *
|
||
+ * Emitted whenever another dataSize number of samples are ready and
|
||
+ * format is set to IntegerFormat.
|
||
+ *
|
||
+ * If format is set to FloatFormat the signal is not emitted at all.
|
||
+ *
|
||
+ * \param frame An object of class VideoFrame holding the video data
|
||
+ * and some additional information.
|
||
+ * void frameReady(const Phonon::Experimental::VideoFrame &frame);
|
||
+ */
|
||
+
|
||
+ /**
|
||
+ * The signal is emitted whenever a frame should be displayed.
|
||
+ *
|
||
+ * The relevant frames should be fetched and displayed using frameForTime
|
||
+ * method.
|
||
+ *
|
||
+ * \param nowStamp the current time
|
||
+ * \param outStamp the time the frame should be displayed with
|
||
+ */
|
||
+ void displayFrame(qint64 nowStamp, qint64 outStamp);
|
||
+
|
||
+ /**
|
||
+ * This signal is emitted after the last frameReady signal of a
|
||
+ * media is emitted.
|
||
+ */
|
||
+ void endOfMedia();
|
||
+ };
|
||
+
|
||
+} // namespace Experimental
|
||
+} //namespace Phonon
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // PHONON_VIDEODATAOUTPUT_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput2.cpp b/src/3rdparty/phonon/phonon/experimental/videodataoutput2.cpp
|
||
new file mode 100644
|
||
index 0000000..f201951
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput2.cpp
|
||
@@ -0,0 +1,81 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "videodataoutput2.h"
|
||
+#include "videodataoutput2_p.h"
|
||
+#include "../factory_p.h"
|
||
+#include <QtCore/QSize>
|
||
+#include <QtCore/QThread>
|
||
+
|
||
+#define PHONON_CLASSNAME VideoDataOutput2
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+VideoDataOutput2::VideoDataOutput2(QObject *parent)
|
||
+ : QObject(parent),
|
||
+ AbstractVideoDataOutput(*new VideoDataOutput2Private)
|
||
+{
|
||
+}
|
||
+
|
||
+void VideoDataOutput2::frameReady(const VideoFrame2 &frame)
|
||
+{
|
||
+ if (QThread::currentThread() == thread()) {
|
||
+ emit frameReadySignal(frame);
|
||
+ } else {
|
||
+ QMetaObject::invokeMethod(this, "frameReadySignal", Qt::BlockingQueuedConnection, Q_ARG(VideoFrame2, frame));
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDataOutput2::endOfMedia()
|
||
+{
|
||
+ if (QThread::currentThread() == thread()) {
|
||
+ emit endOfMediaSignal();
|
||
+ } else {
|
||
+ QMetaObject::invokeMethod(this, "endOfMediaSignal", Qt::BlockingQueuedConnection);
|
||
+ }
|
||
+}
|
||
+
|
||
+void VideoDataOutput2Private::createBackendObject()
|
||
+{
|
||
+ AbstractVideoDataOutputPrivate::createBackendObject();
|
||
+}
|
||
+
|
||
+bool VideoDataOutput2Private::aboutToDeleteBackendObject()
|
||
+{
|
||
+ return AbstractVideoDataOutputPrivate::aboutToDeleteBackendObject();
|
||
+}
|
||
+
|
||
+void VideoDataOutput2Private::setupBackendObject()
|
||
+{
|
||
+ AbstractVideoDataOutputPrivate::setupBackendObject();
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "videodataoutput2.moc"
|
||
+
|
||
+#undef PHONON_CLASSNAME
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput2.h b/src/3rdparty/phonon/phonon/experimental/videodataoutput2.h
|
||
new file mode 100644
|
||
index 0000000..13b7577
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput2.h
|
||
@@ -0,0 +1,80 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_VIDEODATAOUTPUT2_H
|
||
+#define PHONON_VIDEODATAOUTPUT2_H
|
||
+
|
||
+#include "export.h"
|
||
+#include <QtCore/QObject>
|
||
+#include "abstractvideodataoutput.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class VideoDataOutput2Private;
|
||
+
|
||
+/**
|
||
+ * \short This class gives you the video data.
|
||
+ *
|
||
+ * This class implements a special AbstractVideoOutput that gives your
|
||
+ * application the video data.
|
||
+ *
|
||
+ * You can also use the video data for further processing (e.g. encoding and
|
||
+ * saving to a file).
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT VideoDataOutput2 : public QObject, public AbstractVideoDataOutput
|
||
+{
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(VideoDataOutput2)
|
||
+ PHONON_HEIR(VideoDataOutput2)
|
||
+
|
||
+ protected:
|
||
+ virtual void frameReady(const VideoFrame2 &);
|
||
+
|
||
+ virtual void endOfMedia();
|
||
+
|
||
+ Q_SIGNALS:
|
||
+ /**
|
||
+ * The signal is emitted whenever a frame should be displayed.
|
||
+ * nowStamp is the current time, outStamp tells the users
|
||
+ * what time the frame should be displayed with.
|
||
+ *
|
||
+ * The relevant frames should be fetched and displayed using frameForTime
|
||
+ * method.
|
||
+ */
|
||
+ void frameReadySignal(const VideoFrame2 &);
|
||
+
|
||
+ /**
|
||
+ * This signal is emitted after the last frameReady signal of a
|
||
+ * media is emitted.
|
||
+ */
|
||
+ void endOfMediaSignal();
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} //namespace Phonon
|
||
+
|
||
+#endif // PHONON_VIDEODATAOUTPUT2_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput2_p.h b/src/3rdparty/phonon/phonon/experimental/videodataoutput2_p.h
|
||
new file mode 100644
|
||
index 0000000..fbf1de2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput2_p.h
|
||
@@ -0,0 +1,45 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_VIDEODATAOUTPUT2_P_H
|
||
+#define PHONON_VIDEODATAOUTPUT2_P_H
|
||
+
|
||
+#include "videodataoutput2.h"
|
||
+#include "abstractvideodataoutput_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class VideoDataOutput2Private : public AbstractVideoDataOutputPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(VideoDataOutput2)
|
||
+ PHONON_PRIVATECLASS
|
||
+ public:
|
||
+ virtual QObject *qObject() { return q_func(); }
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_VIDEODATAOUTPUT2_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutput_p.h b/src/3rdparty/phonon/phonon/experimental/videodataoutput_p.h
|
||
new file mode 100644
|
||
index 0000000..bb883df
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutput_p.h
|
||
@@ -0,0 +1,54 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_VIDEODATAOUTPUT_P_H
|
||
+#define PHONON_VIDEODATAOUTPUT_P_H
|
||
+
|
||
+#include "videodataoutput.h"
|
||
+#include "../abstractvideooutput_p.h"
|
||
+#include "videoframe.h"
|
||
+#include <QtCore/QSize>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+class VideoDataOutputPrivate : public AbstractVideoOutputPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(VideoDataOutput)
|
||
+ PHONON_PRIVATECLASS
|
||
+ public:
|
||
+ virtual QObject *qObject() { return q_func(); }
|
||
+ protected:
|
||
+ VideoDataOutputPrivate()
|
||
+ : latency(0)
|
||
+ {
|
||
+ }
|
||
+
|
||
+ int latency;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_VIDEODATAOUTPUT_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videodataoutputinterface.h b/src/3rdparty/phonon/phonon/experimental/videodataoutputinterface.h
|
||
new file mode 100644
|
||
index 0000000..2411212
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videodataoutputinterface.h
|
||
@@ -0,0 +1,47 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_X_VIDEODATAOUTPUTINTERFACE_H
|
||
+#define PHONON_X_VIDEODATAOUTPUTINTERFACE_H
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class AbstractVideoDataOutput;
|
||
+
|
||
+class VideoDataOutputInterface
|
||
+{
|
||
+ public:
|
||
+ virtual ~VideoDataOutputInterface() {}
|
||
+
|
||
+ virtual AbstractVideoDataOutput *frontendObject() const = 0;
|
||
+ virtual void setFrontendObject(AbstractVideoDataOutput *) = 0;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::Experimental::VideoDataOutputInterface, "0VideoDataOutputInterface.phonon.kde.org")
|
||
+
|
||
+#endif // PHONON_X_VIDEODATAOUTPUTINTERFACE_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videoframe.h b/src/3rdparty/phonon/phonon/experimental/videoframe.h
|
||
new file mode 100644
|
||
index 0000000..0a4eee8
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videoframe.h
|
||
@@ -0,0 +1,73 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_EXPERIMENTAL_VIDEOFRAME_H
|
||
+#define PHONON_EXPERIMENTAL_VIDEOFRAME_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "videodataoutput.h"
|
||
+#include <QtCore/QByteRef>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+ /**
|
||
+ * \brief A single video frame.
|
||
+ *
|
||
+ * This simple class contains the data of a frame and metadata describing
|
||
+ * how to interpret the data.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+ struct PHONONEXPERIMENTAL_EXPORT VideoFrame
|
||
+ {
|
||
+ enum Format {
|
||
+ Format_YUV422,
|
||
+ Format_YUV420,
|
||
+ Format_RGBA8
|
||
+ //Format_RGBA8_Premultiplied,
|
||
+ //Format_RGBA16F,
|
||
+ //Format_RGBA32F,
|
||
+ //Colorspace_XVYCC
|
||
+ };
|
||
+ //Qt::HANDLE handle() const;
|
||
+
|
||
+ QByteArray data;
|
||
+ /**
|
||
+ * The width of the video frame in pixels.
|
||
+ */
|
||
+ int width;
|
||
+ /**
|
||
+ * The height of the video frame in pixels.
|
||
+ */
|
||
+ int height;
|
||
+ /**
|
||
+ * Colorspace of the frame
|
||
+ */
|
||
+ Format colorspace;
|
||
+ };
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // PHONON_EXPERIMENTAL_VIDEOFRAME_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videoframe2.h b/src/3rdparty/phonon/phonon/experimental/videoframe2.h
|
||
new file mode 100644
|
||
index 0000000..beb5474
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videoframe2.h
|
||
@@ -0,0 +1,158 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006,2008 Matthias Kretz <kretz@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_EXPERIMENTAL_VIDEOFRAME2_H
|
||
+#define PHONON_EXPERIMENTAL_VIDEOFRAME2_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "videodataoutput.h"
|
||
+#include <QtGui/QImage>
|
||
+#include <QtCore/QByteRef>
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+ /**
|
||
+ * \brief A single video frame.
|
||
+ *
|
||
+ * This simple class contains the data of a frame and metadata describing
|
||
+ * how to interpret the data.
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ */
|
||
+ struct PHONONEXPERIMENTAL_EXPORT VideoFrame2
|
||
+ {
|
||
+ /**
|
||
+ * Video frames come in a variety of formats. Depending on the format
|
||
+ * you have to process it differently to convert it for displaying or
|
||
+ * encoding.
|
||
+ */
|
||
+ enum Format {
|
||
+ /**
|
||
+ * The frame is invalid.
|
||
+ */
|
||
+ Format_Invalid = QImage::Format_Invalid,
|
||
+ /**
|
||
+ * The frame is stored in data0 using a 24-bit RGB format (8-8-8).
|
||
+ */
|
||
+ Format_RGB888 = QImage::Format_RGB888,
|
||
+ /**
|
||
+ * The frame is stored in data0, data1 and data2 using data0 for the
|
||
+ * Y data, data1 for the Cb data and data2 for the Cr data.
|
||
+ *
|
||
+ * data1 and data2 contain one byte per for adjacent pixels whereas data0
|
||
+ * has one byte per pixel.
|
||
+ */
|
||
+ Format_YCbCr420 = 0x10000,
|
||
+ Format_YV12 = Format_YCbCr420,
|
||
+ /**
|
||
+ * The frame is stored in data0 using a 32-bit Y0-Cb-Y1-Cr format (8-8-8-8).
|
||
+ */
|
||
+ Format_YCbCr422 = 0x10001,
|
||
+ Format_YUY2 = Format_YCbCr422
|
||
+ };
|
||
+
|
||
+ /**
|
||
+ * The width of the video frame in number of pixels.
|
||
+ */
|
||
+ int width;
|
||
+
|
||
+ /**
|
||
+ * The height of the video frame in number of pixels.
|
||
+ */
|
||
+ int height;
|
||
+
|
||
+ /**
|
||
+ * The aspect ratio the frame should be displayed with.
|
||
+ *
|
||
+ * Common values are 4/3, 16/9.
|
||
+ */
|
||
+ double aspectRatio;
|
||
+
|
||
+ /**
|
||
+ * Convenience function to calculate the aspect corrected width from the
|
||
+ * aspectRatio and height values.
|
||
+ *
|
||
+ * It is recommended to display video frames with aspectCorrectedWidth x height
|
||
+ */
|
||
+ inline int aspectCorrectedWidth() const { return qRound(aspectRatio * height); }
|
||
+
|
||
+ /**
|
||
+ * Convenience function to calculate the aspect corrected height from the
|
||
+ * aspectRatio and width values.
|
||
+ *
|
||
+ * It is recommended to display video frames with aspectCorrectedWidth x height
|
||
+ */
|
||
+ inline int aspectCorrectedHeight() const { return qRound(width / aspectRatio); }
|
||
+
|
||
+ /**
|
||
+ * Format of the frame.
|
||
+ *
|
||
+ * \see Format
|
||
+ */
|
||
+ Format format;
|
||
+
|
||
+ /**
|
||
+ * RGB8, YUY2 or Y-plane
|
||
+ *
|
||
+ * If format is Format_RGB888 then the data contains each pixel as three
|
||
+ * consecutive bytes for red, green and blue.
|
||
+ *
|
||
+ * If format is Format_YUY2 the data contains every two pixels as four
|
||
+ * consecutive bytes for Y0, Cb, Y1, Cr
|
||
+ *
|
||
+ * If format is Format_YV12 the data contains one byte per pixel with
|
||
+ * the Y value.
|
||
+ */
|
||
+ QByteArray data0;
|
||
+
|
||
+ /**
|
||
+ * YV12 U-plane
|
||
+ *
|
||
+ * If format is Format_YV12 the data contains one byte per four adjacent
|
||
+ * pixels with the Cb value.
|
||
+ */
|
||
+ QByteArray data1;
|
||
+
|
||
+ /**
|
||
+ * YV12 V-plane
|
||
+ *
|
||
+ * If format is Format_YV12 the data contains one byte per four adjacent
|
||
+ * pixels with the Cr value.
|
||
+ */
|
||
+ QByteArray data2;
|
||
+
|
||
+ inline QImage qImage() const
|
||
+ {
|
||
+ if (format == Format_RGB888) {
|
||
+ return QImage(reinterpret_cast<const uchar *>(data0.constData()),
|
||
+ width, height, QImage::Format_RGB888);
|
||
+ }
|
||
+ return QImage();
|
||
+ }
|
||
+ };
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+// vim: sw=4 ts=4 tw=80
|
||
+#endif // PHONON_EXPERIMENTAL_VIDEOFRAME2_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videowidget.cpp b/src/3rdparty/phonon/phonon/experimental/videowidget.cpp
|
||
new file mode 100644
|
||
index 0000000..0e17cf2
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videowidget.cpp
|
||
@@ -0,0 +1,48 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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 "videowidget.h"
|
||
+#include "snapshotinterface.h"
|
||
+#include "videowidget_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+VideoWidget::VideoWidget(QWidget *w)
|
||
+ : Phonon::VideoWidget(w)
|
||
+{
|
||
+}
|
||
+
|
||
+QImage VideoWidget::snapshot() const
|
||
+{
|
||
+ K_D(const Phonon::VideoWidget);
|
||
+ SnapshotInterface *iface = qobject_cast<SnapshotInterface *>(d->m_backendObject);
|
||
+ if (iface) {
|
||
+ return iface->snapshot();
|
||
+ }
|
||
+ return QImage();
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videowidget.h b/src/3rdparty/phonon/phonon/experimental/videowidget.h
|
||
new file mode 100644
|
||
index 0000000..bbc7d3e
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videowidget.h
|
||
@@ -0,0 +1,46 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_VIDEOWIDGET_H
|
||
+#define PHONON_EXPERIMENTAL_VIDEOWIDGET_H
|
||
+
|
||
+#include "../videowidget.h"
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class VideoWidgetPrivate;
|
||
+class VideoWidget : public Phonon::VideoWidget
|
||
+{
|
||
+ K_DECLARE_PRIVATE(VideoWidget)
|
||
+ Q_OBJECT
|
||
+ public:
|
||
+ VideoWidget(QWidget *parent = 0);
|
||
+
|
||
+ QImage snapshot() const;
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_VIDEOWIDGET_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/videowidget_p.h b/src/3rdparty/phonon/phonon/experimental/videowidget_p.h
|
||
new file mode 100644
|
||
index 0000000..6038e74
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/videowidget_p.h
|
||
@@ -0,0 +1,46 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2008 Matthias Kretz <kretz@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_EXPERIMENTAL_VIDEOWIDGET_P_H
|
||
+#define PHONON_EXPERIMENTAL_VIDEOWIDGET_P_H
|
||
+
|
||
+#include "videowidget.h"
|
||
+#include "../videowidget_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+
|
||
+class VideoWidgetPrivate : public Phonon::VideoWidgetPrivate
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(VideoWidget)
|
||
+ protected:
|
||
+ VideoWidgetPrivate(VideoWidget *parent)
|
||
+ : Phonon::VideoWidgetPrivate(parent)
|
||
+ {
|
||
+ }
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_EXPERIMENTAL_VIDEOWIDGET_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/visualization.cpp b/src/3rdparty/phonon/phonon/experimental/visualization.cpp
|
||
new file mode 100644
|
||
index 0000000..0dfb184
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/visualization.cpp
|
||
@@ -0,0 +1,130 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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 "visualization.h"
|
||
+#include "visualization_p.h"
|
||
+#include "../objectdescription.h"
|
||
+#include "../path.h"
|
||
+#include "factory_p.h"
|
||
+
|
||
+#define PHONON_CLASSNAME Visualization
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+PHONON_OBJECT_IMPL
|
||
+
|
||
+Visualization::~Visualization()
|
||
+{
|
||
+}
|
||
+
|
||
+VisualizationDescription Visualization::visualization() const
|
||
+{
|
||
+ K_D(const Visualization);
|
||
+ if (!d->m_backendObject) {
|
||
+ return d->description;
|
||
+ }
|
||
+ int index;
|
||
+ BACKEND_GET(int, index, "visualization");
|
||
+ return VisualizationDescription::fromIndex(index);
|
||
+}
|
||
+
|
||
+void Visualization::setVisualization(const VisualizationDescription &newVisualization)
|
||
+{
|
||
+ K_D(Visualization);
|
||
+ d->description = newVisualization;
|
||
+ if (k_ptr->backendObject()) {
|
||
+ BACKEND_CALL1("setVisualization", int, newVisualization.index());
|
||
+ }
|
||
+}
|
||
+
|
||
+/*
|
||
+bool Visualization::hasParameterWidget() const
|
||
+{
|
||
+ K_D(const Visualization);
|
||
+ if (d->m_backendObject)
|
||
+ {
|
||
+ bool ret;
|
||
+ BACKEND_GET(bool, ret, "hasParameterWidget");
|
||
+ return ret;
|
||
+ }
|
||
+ return false;
|
||
+}
|
||
+
|
||
+QWidget *Visualization::createParameterWidget(QWidget *parent)
|
||
+{
|
||
+ K_D(Visualization);
|
||
+ if (k_ptr->backendObject())
|
||
+ {
|
||
+ QWidget *ret;
|
||
+ BACKEND_GET1(QWidget *, ret, "createParameterWidget", QWidget *, parent);
|
||
+ return ret;
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+*/
|
||
+
|
||
+void VisualizationPrivate::phononObjectDestroyed(MediaNodePrivate *bp)
|
||
+{
|
||
+ Q_UNUSED(bp);
|
||
+ // this method is called from Phonon::MediaNodePrivate::~MediaNodePrivate(), meaning the AudioEffect
|
||
+ // dtor has already been called and the private class is down to MediaNodePrivate
|
||
+ /*
|
||
+ Q_ASSERT(bp);
|
||
+ if (audioPath->k_ptr == bp)
|
||
+ {
|
||
+ pBACKEND_CALL1("setAudioPath", QObject *, static_cast<QObject *>(0));
|
||
+ audioPath = 0;
|
||
+ }
|
||
+ else if (videoOutput->k_ptr == bp)
|
||
+ {
|
||
+ pBACKEND_CALL1("setVideoOutput", QObject *, static_cast<QObject *>(0));
|
||
+ videoOutput = 0;
|
||
+ }
|
||
+ */
|
||
+}
|
||
+
|
||
+bool VisualizationPrivate::aboutToDeleteBackendObject()
|
||
+{
|
||
+ return true;
|
||
+}
|
||
+
|
||
+void VisualizationPrivate::setupBackendObject()
|
||
+{
|
||
+ Q_ASSERT(m_backendObject);
|
||
+
|
||
+ pBACKEND_CALL1("setVisualization", int, description.index());
|
||
+ /*
|
||
+ if (audioPath)
|
||
+ pBACKEND_CALL1("setAudioPath", QObject *, audioPath->k_ptr->backendObject());
|
||
+ if (videoOutput)
|
||
+ pBACKEND_CALL1("setVideoOutput", QObject *, videoOutput->k_ptr->backendObject());
|
||
+ */
|
||
+}
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#include "visualization.moc"
|
||
+#undef PHONON_CLASSNAME
|
||
+// vim: sw=4 ts=4
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/visualization.h b/src/3rdparty/phonon/phonon/experimental/visualization.h
|
||
new file mode 100644
|
||
index 0000000..33074d7
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/visualization.h
|
||
@@ -0,0 +1,107 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006-2007 Matthias Kretz <kretz@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_VISUALIZATION_H
|
||
+#define PHONON_VISUALIZATION_H
|
||
+
|
||
+#include "export.h"
|
||
+#include "../phonondefs.h"
|
||
+#include <QtCore/QObject>
|
||
+#include "../objectdescription.h"
|
||
+#include "../objectdescriptionmodel.h"
|
||
+#include "../medianode.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+class AudioPath;
|
||
+class AbstractVideoOutput;
|
||
+
|
||
+namespace Experimental
|
||
+{
|
||
+ class VisualizationPrivate;
|
||
+
|
||
+enum {
|
||
+ VisualizationType = 0xfffffffe
|
||
+};
|
||
+typedef ObjectDescription<static_cast<Phonon::ObjectDescriptionType>(VisualizationType)> VisualizationDescription;
|
||
+typedef ObjectDescriptionModel<static_cast<Phonon::ObjectDescriptionType>(VisualizationType)> VisualizationDescriptionModel;
|
||
+
|
||
+/**
|
||
+ * \short A class to create visual effects from an audio signal.
|
||
+ *
|
||
+ * This class is used to define how an audio signal from an AudioPath object
|
||
+ * should be visualized. What visualization effects are available depends solely
|
||
+ * on the backend. You can list the available visualization effects using
|
||
+ * BackendCapabilities::availableVisualizationEffects().
|
||
+ *
|
||
+ * The following example code takes the first effect from the list and uses that
|
||
+ * to display a visualization on a new VideoWidget.
|
||
+ * \code
|
||
+ * QList<VisualizationDescription> list = BackendCapabilities::availableVisualizationEffects();
|
||
+ * if (list.size() > 0)
|
||
+ * {
|
||
+ * VideoWidget *visWidget = new VideoWidget(parent);
|
||
+ * Visualization *vis = new Visualization(visWidget);
|
||
+ * vis->setAudioPath(audioPath);
|
||
+ * vis->setVideoOutput(visWidget);
|
||
+ * vis->setVisualization(list.first());
|
||
+ * }
|
||
+ * \endcode
|
||
+ *
|
||
+ * \author Matthias Kretz <kretz@kde.org>
|
||
+ * \see AudioDataOutput
|
||
+ * \see BackendCapabilities::availableVisualizationEffects()
|
||
+ */
|
||
+class PHONONEXPERIMENTAL_EXPORT Visualization : public QObject, public MediaNode
|
||
+{
|
||
+ Q_OBJECT
|
||
+ K_DECLARE_PRIVATE(Visualization)
|
||
+ PHONON_OBJECT(Visualization)
|
||
+ Q_PROPERTY(VisualizationDescription visualization READ visualization WRITE setVisualization)
|
||
+
|
||
+ public:
|
||
+ ~Visualization();
|
||
+
|
||
+ VisualizationDescription visualization() const;
|
||
+ void setVisualization(const VisualizationDescription &newVisualization);
|
||
+
|
||
+ /**
|
||
+ * Returns whether the selected visualization effect can be configured
|
||
+ * by the user with a widget returned by createParameterWidget(). In
|
||
+ * short it tells you whether createParameterWidget() will return 0 or
|
||
+ * not.
|
||
+ */
|
||
+ //bool hasParameterWidget() const;
|
||
+
|
||
+ /**
|
||
+ * Returns a widget that displays effect parameter controls to the user.
|
||
+ *
|
||
+ * \param parent The parent widget for the new widget.
|
||
+ */
|
||
+ //QWidget *createParameterWidget(QWidget *parent = 0);
|
||
+};
|
||
+
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_VISUALIZATION_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/experimental/visualization_p.h b/src/3rdparty/phonon/phonon/experimental/visualization_p.h
|
||
new file mode 100644
|
||
index 0000000..2c1a0db
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/experimental/visualization_p.h
|
||
@@ -0,0 +1,51 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006 Matthias Kretz <kretz@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_VISUALIZATION_P_H
|
||
+#define PHONON_VISUALIZATION_P_H
|
||
+
|
||
+#include "visualization.h"
|
||
+#include "../medianode_p.h"
|
||
+#include "../medianodedestructionhandler_p.h"
|
||
+#include "../phonondefs_p.h"
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+namespace Experimental
|
||
+{
|
||
+class VisualizationPrivate : public MediaNodePrivate, private MediaNodeDestructionHandler
|
||
+{
|
||
+ Q_DECLARE_PUBLIC(Visualization)
|
||
+ PHONON_PRIVATECLASS
|
||
+ public:
|
||
+ virtual QObject *qObject() { return q_func(); }
|
||
+ protected:
|
||
+ VisualizationDescription description;
|
||
+
|
||
+ private:
|
||
+ void phononObjectDestroyed(MediaNodePrivate *);
|
||
+};
|
||
+} // namespace Experimental
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif // PHONON_VISUALIZATION_P_H
|
||
+// vim: sw=4 ts=4 tw=80
|
||
diff --git a/src/3rdparty/phonon/phonon/factory.cpp b/src/3rdparty/phonon/phonon/factory.cpp
|
||
index d5010e7..b26c4f3 100644
|
||
--- a/src/3rdparty/phonon/phonon/factory.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/factory.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -111,7 +111,6 @@ void Factory::setBackend(QObject *b)
|
||
|
||
bool FactoryPrivate::createBackend()
|
||
{
|
||
-#ifndef QT_NO_LIBRARY
|
||
Q_ASSERT(m_backendObject == 0);
|
||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||
PlatformPlugin *f = globalFactory->platformPlugin();
|
||
@@ -125,39 +124,15 @@ bool FactoryPrivate::createBackend()
|
||
// could not load a backend through the platform plugin. Falling back to the default
|
||
// (finding the first loadable backend).
|
||
const QLatin1String suffix("/phonon_backend/");
|
||
- const QStringList paths = QCoreApplication::libraryPaths();
|
||
- for (int i = 0; i < paths.count(); ++i) {
|
||
- const QString libPath = paths.at(i) + suffix;
|
||
+ foreach (QString libPath, QCoreApplication::libraryPaths()) {
|
||
+ libPath += suffix;
|
||
const QDir dir(libPath);
|
||
if (!dir.exists()) {
|
||
pDebug() << Q_FUNC_INFO << dir.absolutePath() << "does not exist";
|
||
continue;
|
||
}
|
||
-
|
||
- QStringList plugins(dir.entryList(QDir::Files));
|
||
-
|
||
-#ifdef Q_OS_SYMBIAN
|
||
- /* On Symbian OS we might have two plugins, one which uses Symbian
|
||
- * MMF framework("phonon_mmf"), and one which uses Real Networks's
|
||
- * Helix("hxphonon"). We prefer the latter because it's more
|
||
- * sophisticated, so we make sure the Helix backend is attempted
|
||
- * to be loaded first, and the MMF backend is used for backup. */
|
||
- {
|
||
-
|
||
- const int hxphonon = plugins.indexOf(QLatin1String("hxphonon"));
|
||
- if (hxphonon != -1)
|
||
- plugins.move(hxphonon, 0);
|
||
-
|
||
- // Code for debugging the MMF backend.
|
||
- if(hxphonon != -1) {
|
||
- qDebug() << "Found hxphonon backend and removed it from the lookup list.";
|
||
- plugins.removeAll(QLatin1String("hxphonon"));
|
||
- }
|
||
- }
|
||
-#endif
|
||
-
|
||
- for (int i = 0; i < plugins.count(); ++i) {
|
||
- QPluginLoader pluginLoader(libPath + plugins.at(i));
|
||
+ foreach (const QString &pluginName, dir.entryList(QDir::Files)) {
|
||
+ QPluginLoader pluginLoader(libPath + pluginName);
|
||
if (!pluginLoader.load()) {
|
||
pDebug() << Q_FUNC_INFO << " load failed:"
|
||
<< pluginLoader.errorString();
|
||
@@ -187,20 +162,14 @@ bool FactoryPrivate::createBackend()
|
||
SLOT(objectDescriptionChanged(ObjectDescriptionType)));
|
||
|
||
return true;
|
||
-#else //QT_NO_LIBRARY
|
||
- pWarning() << Q_FUNC_INFO << "Trying to use Phonon with QT_NO_LIBRARY defined. "
|
||
- "That is currently not supported";
|
||
- return false;
|
||
-#endif
|
||
}
|
||
|
||
FactoryPrivate::FactoryPrivate()
|
||
- :
|
||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||
- m_platformPlugin(0),
|
||
- m_noPlatformPlugin(false),
|
||
+ : m_platformPlugin(0),
|
||
+ m_noPlatformPlugin(false)
|
||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||
- m_backendObject(0)
|
||
+ , m_backendObject(0)
|
||
{
|
||
// Add the post routine to make sure that all other global statics (especially the ones from Qt)
|
||
// are still available. If the FactoryPrivate dtor is called too late many bad things can happen
|
||
@@ -214,8 +183,14 @@ FactoryPrivate::FactoryPrivate()
|
||
|
||
FactoryPrivate::~FactoryPrivate()
|
||
{
|
||
- for (int i = 0; i < mediaNodePrivateList.count(); ++i) {
|
||
- mediaNodePrivateList.at(i)->deleteBackendObject();
|
||
+ foreach (QObject *o, objects) {
|
||
+ MediaObject *m = qobject_cast<MediaObject *>(o);
|
||
+ if (m) {
|
||
+ m->stop();
|
||
+ }
|
||
+ }
|
||
+ foreach (MediaNodePrivate *bp, mediaNodePrivateList) {
|
||
+ bp->deleteBackendObject();
|
||
}
|
||
if (objects.size() > 0) {
|
||
pError() << "The backend objects are not deleted as was requested.";
|
||
@@ -283,8 +258,8 @@ void Factory::deregisterFrontendObject(MediaNodePrivate *bp)
|
||
void FactoryPrivate::phononBackendChanged()
|
||
{
|
||
if (m_backendObject) {
|
||
- for (int i = 0; i < mediaNodePrivateList.count(); ++i) {
|
||
- mediaNodePrivateList.at(i)->deleteBackendObject();
|
||
+ foreach (MediaNodePrivate *bp, mediaNodePrivateList) {
|
||
+ bp->deleteBackendObject();
|
||
}
|
||
if (objects.size() > 0) {
|
||
pDebug() << "WARNING: we were asked to change the backend but the application did\n"
|
||
@@ -293,8 +268,8 @@ void FactoryPrivate::phononBackendChanged()
|
||
"backendswitching possible.";
|
||
// in case there were objects deleted give 'em a chance to recreate
|
||
// them now
|
||
- for (int i = 0; i < mediaNodePrivateList.count(); ++i) {
|
||
- mediaNodePrivateList.at(i)->createBackendObject();
|
||
+ foreach (MediaNodePrivate *bp, mediaNodePrivateList) {
|
||
+ bp->createBackendObject();
|
||
}
|
||
return;
|
||
}
|
||
@@ -302,8 +277,8 @@ void FactoryPrivate::phononBackendChanged()
|
||
m_backendObject = 0;
|
||
}
|
||
createBackend();
|
||
- for (int i = 0; i < mediaNodePrivateList.count(); ++i) {
|
||
- mediaNodePrivateList.at(i)->createBackendObject();
|
||
+ foreach (MediaNodePrivate *bp, mediaNodePrivateList) {
|
||
+ bp->createBackendObject();
|
||
}
|
||
emit backendChanged();
|
||
}
|
||
@@ -350,6 +325,7 @@ FACTORY_IMPL(AudioOutput)
|
||
#ifndef QT_NO_PHONON_VIDEO
|
||
FACTORY_IMPL(VideoWidget)
|
||
#endif //QT_NO_PHONON_VIDEO
|
||
+FACTORY_IMPL(AudioDataOutput)
|
||
|
||
#undef FACTORY_IMPL
|
||
|
||
@@ -387,17 +363,15 @@ PlatformPlugin *FactoryPrivate::platformPlugin()
|
||
QStringList())
|
||
);
|
||
dir.setFilter(QDir::Files);
|
||
- const QStringList libPaths = QCoreApplication::libraryPaths();
|
||
forever {
|
||
- for (int i = 0; i < libPaths.count(); ++i) {
|
||
- const QString libPath = libPaths.at(i) + suffix;
|
||
+ foreach (QString libPath, QCoreApplication::libraryPaths()) {
|
||
+ libPath += suffix;
|
||
dir.setPath(libPath);
|
||
if (!dir.exists()) {
|
||
continue;
|
||
}
|
||
- const QStringList files = dir.entryList(QDir::Files);
|
||
- for (int i = 0; i < files.count(); ++i) {
|
||
- QPluginLoader pluginLoader(libPath + files.at(i));
|
||
+ foreach (const QString &pluginName, dir.entryList()) {
|
||
+ QPluginLoader pluginLoader(libPath + pluginName);
|
||
if (!pluginLoader.load()) {
|
||
pDebug() << Q_FUNC_INFO << " platform plugin load failed:"
|
||
<< pluginLoader.errorString();
|
||
@@ -449,7 +423,6 @@ QObject *Factory::backend(bool createWhenNull)
|
||
return globalFactory->m_backendObject;
|
||
}
|
||
|
||
-#ifndef QT_NO_PROPERTIES
|
||
#define GET_STRING_PROPERTY(name) \
|
||
QString Factory::name() \
|
||
{ \
|
||
@@ -465,7 +438,7 @@ GET_STRING_PROPERTY(backendComment)
|
||
GET_STRING_PROPERTY(backendVersion)
|
||
GET_STRING_PROPERTY(backendIcon)
|
||
GET_STRING_PROPERTY(backendWebsite)
|
||
-#endif //QT_NO_PROPERTIES
|
||
+
|
||
QObject *Factory::registerQObject(QObject *o)
|
||
{
|
||
if (o) {
|
||
diff --git a/src/3rdparty/phonon/phonon/factory_p.h b/src/3rdparty/phonon/phonon/factory_p.h
|
||
index de059f8..41b8c5b 100644
|
||
--- a/src/3rdparty/phonon/phonon/factory_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/factory_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -122,6 +122,13 @@ namespace Factory
|
||
#endif //QT_NO_PHONON_VIDEO
|
||
|
||
/**
|
||
+ * Create a new backend object for a AudioDataOutput.
|
||
+ *
|
||
+ * \return a pointer to the AudioDataOutput the backend provides.
|
||
+ */
|
||
+ PHONON_EXPORT QObject *createAudioDataOutput(QObject *parent = 0);
|
||
+
|
||
+ /**
|
||
* \return a pointer to the backend interface.
|
||
*/
|
||
PHONON_EXPORT QObject *backend(bool createWhenNull = true);
|
||
diff --git a/src/3rdparty/phonon/phonon/frontendinterface_p.h b/src/3rdparty/phonon/phonon/frontendinterface_p.h
|
||
index b6c76ce..83ad780 100644
|
||
--- a/src/3rdparty/phonon/phonon/frontendinterface_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/frontendinterface_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/globalconfig.cpp b/src/3rdparty/phonon/phonon/globalconfig.cpp
|
||
index 3718c6a..44bf49a 100644
|
||
--- a/src/3rdparty/phonon/phonon/globalconfig.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/globalconfig.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -20,6 +20,7 @@
|
||
|
||
*/
|
||
|
||
+#include "globalconfig.h"
|
||
#include "globalconfig_p.h"
|
||
|
||
#include "factory_p.h"
|
||
@@ -29,6 +30,7 @@
|
||
#include "backendinterface.h"
|
||
#include "qsettingsgroup_p.h"
|
||
#include "phononnamespace_p.h"
|
||
+#include "pulsesupport.h"
|
||
|
||
#include <QtCore/QList>
|
||
#include <QtCore/QVariant>
|
||
@@ -38,15 +40,18 @@ QT_BEGIN_NAMESPACE
|
||
namespace Phonon
|
||
{
|
||
|
||
+GlobalConfigPrivate::GlobalConfigPrivate() : config(QLatin1String("kde.org"), QLatin1String("libphonon"))
|
||
+{
|
||
+}
|
||
+
|
||
GlobalConfig::GlobalConfig()
|
||
-#ifndef QT_NO_SETTINGS
|
||
- : m_config(QLatin1String("kde.org"), QLatin1String("libphonon"))
|
||
-#endif //QT_NO_SETTINGS
|
||
+ : k_ptr(new GlobalConfigPrivate)
|
||
{
|
||
}
|
||
|
||
GlobalConfig::~GlobalConfig()
|
||
{
|
||
+ delete k_ptr;
|
||
}
|
||
|
||
enum WhatToFilter {
|
||
@@ -85,9 +90,12 @@ static void filter(ObjectDescriptionType type, BackendInterface *backendIface, Q
|
||
}
|
||
}
|
||
|
||
-#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||
-static QList<int> listSortedByConfig(const QSettingsGroup &backendConfig, Phonon::Category category, QList<int> &defaultList)
|
||
+static QList<int> sortDevicesByCategoryPriority(const GlobalConfig *config, const QSettingsGroup *backendConfig, ObjectDescriptionType type, Phonon::Category category, QList<int> &defaultList)
|
||
{
|
||
+ Q_ASSERT(config);
|
||
+ Q_ASSERT(backendConfig);
|
||
+ Q_ASSERT(type == AudioOutputDeviceType || type == AudioCaptureDeviceType);
|
||
+
|
||
if (defaultList.size() <= 1) {
|
||
// nothing to sort
|
||
return defaultList;
|
||
@@ -104,20 +112,26 @@ static QList<int> listSortedByConfig(const QSettingsGroup &backendConfig, Phonon
|
||
}
|
||
}
|
||
|
||
- 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>(Phonon::NoCategory));
|
||
- if (!backendConfig.hasKey(categoryKey)) {
|
||
- // no list in config for NoCategory
|
||
- return defaultList;
|
||
+ 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));
|
||
+ if (!backendConfig->hasKey(categoryKey)) {
|
||
+ // no list in config for the given category
|
||
+ categoryKey = QLatin1String("Category_") + QString::number(static_cast<int>(Phonon::NoCategory));
|
||
+ if (!backendConfig->hasKey(categoryKey)) {
|
||
+ // no list in config for NoCategory
|
||
+ return defaultList;
|
||
+ }
|
||
}
|
||
- }
|
||
|
||
- //Now the list from m_config
|
||
- QList<int> deviceList = backendConfig.value(categoryKey, QList<int>());
|
||
+ //Now the list from d->config
|
||
+ deviceList = backendConfig->value(categoryKey, QList<int>());
|
||
+ }
|
||
|
||
- //if there are devices in m_config that the backend doesn't report, remove them from the list
|
||
+ //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()) {
|
||
if (0 == defaultList.removeAll(i.next())) {
|
||
@@ -125,49 +139,176 @@ static QList<int> listSortedByConfig(const QSettingsGroup &backendConfig, Phonon
|
||
}
|
||
}
|
||
|
||
- //if the backend reports more devices that are not in m_config append them to the list
|
||
+ //if the backend reports more devices that are not in d->config append them to the list
|
||
deviceList += defaultList;
|
||
|
||
return deviceList;
|
||
}
|
||
-#endif //QT_NO_PHONON_SETTINGSGROUP
|
||
|
||
-#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||
-QList<int> GlobalConfig::audioOutputDeviceListFor(Phonon::Category category, int override) const
|
||
+bool GlobalConfig::hideAdvancedDevices() const
|
||
{
|
||
+ K_D(const GlobalConfig);
|
||
//The devices need to be stored independently for every backend
|
||
- const QSettingsGroup backendConfig(&m_config, QLatin1String("AudioOutputDevice")); // + Factory::identifier());
|
||
- const QSettingsGroup generalGroup(&m_config, QLatin1String("General"));
|
||
- const bool hideAdvancedDevices = ((override & AdvancedDevicesFromSettings)
|
||
- ? generalGroup.value(QLatin1String("HideAdvancedDevices"), true)
|
||
+ const QSettingsGroup generalGroup(&d->config, QLatin1String("General"));
|
||
+ return generalGroup.value(QLatin1String("HideAdvancedDevices"), true);
|
||
+}
|
||
+
|
||
+void GlobalConfig::setHideAdvancedDevices(bool hide)
|
||
+{
|
||
+ K_D(GlobalConfig);
|
||
+ QSettingsGroup generalGroup(&d->config, QLatin1String("General"));
|
||
+ generalGroup.setValue(QLatin1String("HideAdvancedDevices"), hide);
|
||
+}
|
||
+
|
||
+static bool isHiddenAudioOutputDevice(const GlobalConfig *config, int i)
|
||
+{
|
||
+ Q_ASSERT(config);
|
||
+
|
||
+ if (!config->hideAdvancedDevices())
|
||
+ return false;
|
||
+
|
||
+ AudioOutputDevice ad = AudioOutputDevice::fromIndex(i);
|
||
+ const QVariant var = ad.property("isAdvanced");
|
||
+ return (var.isValid() && var.toBool());
|
||
+}
|
||
+
|
||
+#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
+static bool isHiddenAudioCaptureDevice(const GlobalConfig *config, int i)
|
||
+{
|
||
+ Q_ASSERT(config);
|
||
+
|
||
+ if (!config->hideAdvancedDevices())
|
||
+ return false;
|
||
+
|
||
+ AudioCaptureDevice ad = AudioCaptureDevice::fromIndex(i);
|
||
+ const QVariant var = ad.property("isAdvanced");
|
||
+ return (var.isValid() && var.toBool());
|
||
+}
|
||
+#endif
|
||
+
|
||
+static QList<int> reindexList(const GlobalConfig *config, Phonon::Category category, QList<int>newOrder, bool output)
|
||
+{
|
||
+ Q_ASSERT(config);
|
||
+#ifdef QT_NO_PHONON_AUDIOCAPTURE
|
||
+ Q_ASSERT(output);
|
||
+#endif
|
||
+
|
||
+ /*QString sb;
|
||
+ sb = QString("(Size %1)").arg(currentList.size());
|
||
+ foreach (int i, currentList)
|
||
+ sb += QString("%1, ").arg(i);
|
||
+ fprintf(stderr, "=== Reindex Current: %s\n", sb.toUtf8().constData());
|
||
+ sb = QString("(Size %1)").arg(newOrder.size());
|
||
+ foreach (int i, newOrder)
|
||
+ sb += QString("%1, ").arg(i);
|
||
+ fprintf(stderr, "=== Reindex Before : %s\n", sb.toUtf8().constData());*/
|
||
+
|
||
+ QList<int> currentList;
|
||
+ if (output)
|
||
+ currentList = config->audioOutputDeviceListFor(category, GlobalConfig::ShowUnavailableDevices|GlobalConfig::ShowAdvancedDevices);
|
||
+#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
+ else
|
||
+ currentList = config->audioCaptureDeviceListFor(category, GlobalConfig::ShowUnavailableDevices|GlobalConfig::ShowAdvancedDevices);
|
||
+#endif
|
||
+
|
||
+ QList<int> newList;
|
||
+
|
||
+ foreach (int i, newOrder) {
|
||
+ int found = currentList.indexOf(i);
|
||
+ if (found < 0) {
|
||
+ // It's not in the list, so something is odd (e.g. client error). Ignore it.
|
||
+ continue;
|
||
+ }
|
||
+
|
||
+ // Iterate through the list from this point onward. If there are hidden devices
|
||
+ // immediately following, take them too.
|
||
+ newList.append(currentList.takeAt(found));
|
||
+ while (found < currentList.size()) {
|
||
+ bool hidden = true;
|
||
+ if (output)
|
||
+ hidden = isHiddenAudioOutputDevice(config, currentList.at(found));
|
||
+#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
+ else
|
||
+ hidden = isHiddenAudioCaptureDevice(config, currentList.at(found));
|
||
+#endif
|
||
+
|
||
+ if (!hidden)
|
||
+ break;
|
||
+ newList.append(currentList.takeAt(found));
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // If there are any devices left in.. just tack them on the end.
|
||
+ if (currentList.size() > 0)
|
||
+ newList += currentList;
|
||
+
|
||
+ /*sb = QString("(Size %1)").arg(newList.size());
|
||
+ foreach (int i, newList)
|
||
+ sb += QString("%1, ").arg(i);
|
||
+ fprintf(stderr, "=== Reindex After : %s\n", sb.toUtf8().constData());*/
|
||
+ return newList;
|
||
+}
|
||
+
|
||
+
|
||
+void GlobalConfig::setAudioOutputDeviceListFor(Phonon::Category category, QList<int> order)
|
||
+{
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive()) {
|
||
+ pulse->setOutputDevicePriorityForCategory(category, order);
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ K_D(GlobalConfig);
|
||
+ QSettingsGroup backendConfig(&d->config, QLatin1String("AudioOutputDevice")); // + Factory::identifier());
|
||
+
|
||
+ order = reindexList(this, category, order, true);
|
||
+
|
||
+ const QList<int> noCategoryOrder = audioOutputDeviceListFor(Phonon::NoCategory, ShowUnavailableDevices|ShowAdvancedDevices);
|
||
+ if (category != Phonon::NoCategory && order == noCategoryOrder) {
|
||
+ backendConfig.removeEntry(QLatin1String("Category_") + QString::number(category));
|
||
+ } else {
|
||
+ backendConfig.setValue(QLatin1String("Category_") + QString::number(category), order);
|
||
+ }
|
||
+}
|
||
+
|
||
+QList<int> GlobalConfig::audioOutputDeviceListFor(Phonon::Category category, int override) const
|
||
+{
|
||
+ K_D(const GlobalConfig);
|
||
+
|
||
+ const bool hide = ((override & AdvancedDevicesFromSettings)
|
||
+ ? hideAdvancedDevices()
|
||
: static_cast<bool>(override & HideAdvancedDevices));
|
||
|
||
QList<int> defaultList;
|
||
+ BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||
+
|
||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||
- if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||
- // the platform plugin lists the audio devices for the platform
|
||
- // this list already is in default order (as defined by the platform plugin)
|
||
- defaultList = platformPlugin->objectDescriptionIndexes(Phonon::AudioOutputDeviceType);
|
||
- if (hideAdvancedDevices) {
|
||
- QMutableListIterator<int> it(defaultList);
|
||
- while (it.hasNext()) {
|
||
- AudioOutputDevice objDesc = AudioOutputDevice::fromIndex(it.next());
|
||
- const QVariant var = objDesc.property("isAdvanced");
|
||
- if (var.isValid() && var.toBool()) {
|
||
- it.remove();
|
||
+ if (!backendIface || !PulseSupport::getInstance()->isActive()) {
|
||
+ if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||
+ // the platform plugin lists the audio devices for the platform
|
||
+ // this list already is in default order (as defined by the platform plugin)
|
||
+ defaultList = platformPlugin->objectDescriptionIndexes(Phonon::AudioOutputDeviceType);
|
||
+ if (hide) {
|
||
+ QMutableListIterator<int> it(defaultList);
|
||
+ while (it.hasNext()) {
|
||
+ AudioOutputDevice objDesc = AudioOutputDevice::fromIndex(it.next());
|
||
+ const QVariant var = objDesc.property("isAdvanced");
|
||
+ if (var.isValid() && var.toBool()) {
|
||
+ it.remove();
|
||
+ }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||
|
||
- // lookup the available devices directly from the backend (mostly for virtual devices)
|
||
- if (BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend())) {
|
||
+ // 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(Phonon::AudioOutputDeviceType);
|
||
- if (hideAdvancedDevices || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||
+ if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||
filter(AudioOutputDeviceType, backendIface, &list,
|
||
- (hideAdvancedDevices ? FilterAdvancedDevices : 0)
|
||
+ (hide ? FilterAdvancedDevices : 0)
|
||
// the platform plugin already provided the hardware devices
|
||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||
@@ -176,9 +317,10 @@ QList<int> GlobalConfig::audioOutputDeviceListFor(Phonon::Category category, int
|
||
defaultList += list;
|
||
}
|
||
|
||
- return listSortedByConfig(backendConfig, category, defaultList);
|
||
+ const QSettingsGroup backendConfig(&d->config, QLatin1String("AudioOutputDevice")); // + Factory::identifier());
|
||
+ return sortDevicesByCategoryPriority(this, &backendConfig, AudioOutputDeviceType, category, defaultList);
|
||
}
|
||
-#endif //QT_NO_SETTINGSGROUPS
|
||
+
|
||
int GlobalConfig::audioOutputDeviceFor(Phonon::Category category, int override) const
|
||
{
|
||
QList<int> ret = audioOutputDeviceListFor(category, override);
|
||
@@ -188,42 +330,65 @@ int GlobalConfig::audioOutputDeviceFor(Phonon::Category category, int override)
|
||
}
|
||
|
||
#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
+void GlobalConfig::setAudioCaptureDeviceListFor(Phonon::Category category, QList<int> order)
|
||
+{
|
||
+ PulseSupport *pulse = PulseSupport::getInstance();
|
||
+ if (pulse->isActive()) {
|
||
+ pulse->setCaptureDevicePriorityForCategory(category, order);
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ K_D(GlobalConfig);
|
||
+ QSettingsGroup backendConfig(&d->config, QLatin1String("AudioCaptureDevice")); // + Factory::identifier());
|
||
+
|
||
+ order = reindexList(this, category, order, false);
|
||
+
|
||
+ const QList<int> noCategoryOrder = audioCaptureDeviceListFor(Phonon::NoCategory, ShowUnavailableDevices|ShowAdvancedDevices);
|
||
+ if (category != Phonon::NoCategory && order == noCategoryOrder) {
|
||
+ backendConfig.removeEntry(QLatin1String("Category_") + QString::number(category));
|
||
+ } else {
|
||
+ backendConfig.setValue(QLatin1String("Category_") + QString::number(category), order);
|
||
+ }
|
||
+}
|
||
+
|
||
QList<int> GlobalConfig::audioCaptureDeviceListFor(Phonon::Category category, int override) const
|
||
{
|
||
-#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||
- //The devices need to be stored independently for every backend
|
||
- const QSettingsGroup backendConfig(&m_config, QLatin1String("AudioCaptureDevice")); // + Factory::identifier());
|
||
- const QSettingsGroup generalGroup(&m_config, QLatin1String("General"));
|
||
- const bool hideAdvancedDevices = ((override & AdvancedDevicesFromSettings)
|
||
- ? generalGroup.value(QLatin1String("HideAdvancedDevices"), true)
|
||
+ K_D(const GlobalConfig);
|
||
+
|
||
+ const bool hide = ((override & AdvancedDevicesFromSettings)
|
||
+ ? hideAdvancedDevices()
|
||
: static_cast<bool>(override & HideAdvancedDevices));
|
||
|
||
QList<int> defaultList;
|
||
+ BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend());
|
||
+
|
||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||
- if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||
- // the platform plugin lists the audio devices for the platform
|
||
- // this list already is in default order (as defined by the platform plugin)
|
||
- defaultList = platformPlugin->objectDescriptionIndexes(Phonon::AudioCaptureDeviceType);
|
||
- if (hideAdvancedDevices) {
|
||
- QMutableListIterator<int> it(defaultList);
|
||
- while (it.hasNext()) {
|
||
- AudioCaptureDevice objDesc = AudioCaptureDevice::fromIndex(it.next());
|
||
- const QVariant var = objDesc.property("isAdvanced");
|
||
- if (var.isValid() && var.toBool()) {
|
||
- it.remove();
|
||
+ if (!backendIface || !PulseSupport::getInstance()->isActive()) {
|
||
+ if (PlatformPlugin *platformPlugin = Factory::platformPlugin()) {
|
||
+ // the platform plugin lists the audio devices for the platform
|
||
+ // this list already is in default order (as defined by the platform plugin)
|
||
+ defaultList = platformPlugin->objectDescriptionIndexes(Phonon::AudioCaptureDeviceType);
|
||
+ if (hide) {
|
||
+ QMutableListIterator<int> it(defaultList);
|
||
+ while (it.hasNext()) {
|
||
+ AudioCaptureDevice objDesc = AudioCaptureDevice::fromIndex(it.next());
|
||
+ const QVariant var = objDesc.property("isAdvanced");
|
||
+ if (var.isValid() && var.toBool()) {
|
||
+ it.remove();
|
||
+ }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||
|
||
- // lookup the available devices directly from the backend (mostly for virtual devices)
|
||
- if (BackendInterface *backendIface = qobject_cast<BackendInterface *>(Factory::backend())) {
|
||
+ // 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(Phonon::AudioCaptureDeviceType);
|
||
- if (hideAdvancedDevices || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||
+ if (hide || !defaultList.isEmpty() || (override & HideUnavailableDevices)) {
|
||
filter(AudioCaptureDeviceType, backendIface, &list,
|
||
- (hideAdvancedDevices ? FilterAdvancedDevices : 0)
|
||
+ (hide ? FilterAdvancedDevices : 0)
|
||
// the platform plugin already provided the hardware devices
|
||
| (defaultList.isEmpty() ? 0 : FilterHardwareDevices)
|
||
| ((override & HideUnavailableDevices) ? FilterUnavailableDevices : 0)
|
||
@@ -232,10 +397,8 @@ QList<int> GlobalConfig::audioCaptureDeviceListFor(Phonon::Category category, in
|
||
defaultList += list;
|
||
}
|
||
|
||
- return listSortedByConfig(backendConfig, category, defaultList);
|
||
-#else //QT_NO_SETTINGSGROUP
|
||
- return QList<int>();
|
||
-#endif //QT_NO_SETTINGSGROUP
|
||
+ const QSettingsGroup backendConfig(&d->config, QLatin1String("AudioCaptureDevice")); // + Factory::identifier());
|
||
+ return sortDevicesByCategoryPriority(this, &backendConfig, AudioCaptureDeviceType, category, defaultList);
|
||
}
|
||
|
||
int GlobalConfig::audioCaptureDeviceFor(Phonon::Category category, int override) const
|
||
diff --git a/src/3rdparty/phonon/phonon/globalconfig.h b/src/3rdparty/phonon/phonon/globalconfig.h
|
||
new file mode 100644
|
||
index 0000000..5233c7b
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/globalconfig.h
|
||
@@ -0,0 +1,71 @@
|
||
+/* This file is part of the KDE project
|
||
+Copyright (C) 2006-2008 Matthias Kretz <kretz@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_GLOBALCONFIG_H
|
||
+#define PHONON_GLOBALCONFIG_H
|
||
+
|
||
+#include "phonon_export.h"
|
||
+#include "phononnamespace.h"
|
||
+#include "phonondefs.h"
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+ class GlobalConfigPrivate;
|
||
+
|
||
+ class PHONON_EXPORT GlobalConfig
|
||
+ {
|
||
+ K_DECLARE_PRIVATE(GlobalConfig)
|
||
+ public:
|
||
+ GlobalConfig();
|
||
+ virtual ~GlobalConfig();
|
||
+
|
||
+ enum DevicesToHideFlag {
|
||
+ ShowUnavailableDevices = 0,
|
||
+ ShowAdvancedDevices = 0,
|
||
+ HideAdvancedDevices = 1,
|
||
+ AdvancedDevicesFromSettings = 2,
|
||
+ HideUnavailableDevices = 4
|
||
+ };
|
||
+ bool hideAdvancedDevices() const;
|
||
+ void setHideAdvancedDevices(bool hide = true);
|
||
+ void setAudioOutputDeviceListFor(Phonon::Category category, QList<int> order);
|
||
+ QList<int> audioOutputDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+ int audioOutputDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+
|
||
+#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
+ void setAudioCaptureDeviceListFor(Phonon::Category category, QList<int> order);
|
||
+ QList<int> audioCaptureDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+ int audioCaptureDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
+#endif //QT_NO_PHONON_AUDIOCAPTURE
|
||
+
|
||
+ protected:
|
||
+ GlobalConfigPrivate *const k_ptr;
|
||
+ };
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+#endif // PHONON_GLOBALCONFIG_H
|
||
diff --git a/src/3rdparty/phonon/phonon/globalconfig_p.h b/src/3rdparty/phonon/phonon/globalconfig_p.h
|
||
index 034bce3..090ca6b 100644
|
||
--- a/src/3rdparty/phonon/phonon/globalconfig_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/globalconfig_p.h
|
||
@@ -6,7 +6,7 @@ Copyright (C) 2006-2008 Matthias Kretz <kretz@kde.org>
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -26,40 +26,19 @@ Copyright (C) 2006-2008 Matthias Kretz <kretz@kde.org>
|
||
#include <QtCore/QSettings>
|
||
|
||
#include "phonon_export.h"
|
||
-#include "phononnamespace.h"
|
||
|
||
QT_BEGIN_HEADER
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
namespace Phonon
|
||
{
|
||
- class PHONON_EXPORT GlobalConfig
|
||
+ class GlobalConfigPrivate
|
||
{
|
||
- public:
|
||
- GlobalConfig();
|
||
- virtual ~GlobalConfig();
|
||
+ public:
|
||
+ GlobalConfigPrivate();
|
||
+ virtual ~GlobalConfigPrivate() {}
|
||
|
||
- enum DevicesToHideFlag {
|
||
- ShowUnavailableDevices = 0,
|
||
- ShowAdvancedDevices = 0,
|
||
- HideAdvancedDevices = 1,
|
||
- AdvancedDevicesFromSettings = 2,
|
||
- HideUnavailableDevices = 4
|
||
- };
|
||
-#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||
- QList<int> audioOutputDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
-#endif //QT_NO_PHONON_SETTINGSGROUP
|
||
- int audioOutputDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
-
|
||
-#ifndef QT_NO_PHONON_AUDIOCAPTURE
|
||
- QList<int> audioCaptureDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
- int audioCaptureDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const;
|
||
-#endif //QT_NO_PHONON_AUDIOCAPTURE
|
||
-
|
||
- protected:
|
||
-#ifndef QT_NO_SETTINGS
|
||
- QSettings m_config;
|
||
-#endif //QT_NO_SETTINGS
|
||
+ QSettings config;
|
||
};
|
||
} // namespace Phonon
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/globalstatic_p.h b/src/3rdparty/phonon/phonon/globalstatic_p.h
|
||
index 04f8395..cf80512 100644
|
||
--- a/src/3rdparty/phonon/phonon/globalstatic_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/globalstatic_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/iodevicestream.cpp b/src/3rdparty/phonon/phonon/iodevicestream.cpp
|
||
index 5376da3..3735f75 100644
|
||
--- a/src/3rdparty/phonon/phonon/iodevicestream.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/iodevicestream.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/iodevicestream_p.h b/src/3rdparty/phonon/phonon/iodevicestream_p.h
|
||
index 5eb90bc..cca77e3 100644
|
||
--- a/src/3rdparty/phonon/phonon/iodevicestream_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/iodevicestream_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediacontroller.cpp b/src/3rdparty/phonon/phonon/mediacontroller.cpp
|
||
index d094381..59fd5c7 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediacontroller.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/mediacontroller.cpp
|
||
@@ -7,7 +7,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediacontroller.h b/src/3rdparty/phonon/phonon/mediacontroller.h
|
||
index 19aaf13..109a79e 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediacontroller.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediacontroller.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/medianode.cpp b/src/3rdparty/phonon/phonon/medianode.cpp
|
||
index 63fa2e3..f855766 100644
|
||
--- a/src/3rdparty/phonon/phonon/medianode.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/medianode.cpp
|
||
@@ -7,7 +7,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -67,8 +67,8 @@ bool MediaNode::isValid() const
|
||
|
||
MediaNodePrivate::~MediaNodePrivate()
|
||
{
|
||
- for (int i = 0 ; i < handlers.count(); ++i) {
|
||
- handlers.at(i)->phononObjectDestroyed(this);
|
||
+ foreach (MediaNodeDestructionHandler *handler, handlers) {
|
||
+ handler->phononObjectDestroyed(this);
|
||
}
|
||
Factory::deregisterFrontendObject(this);
|
||
delete m_backendObject;
|
||
diff --git a/src/3rdparty/phonon/phonon/medianode.h b/src/3rdparty/phonon/phonon/medianode.h
|
||
index 86931ac..6aab189 100644
|
||
--- a/src/3rdparty/phonon/phonon/medianode.h
|
||
+++ b/src/3rdparty/phonon/phonon/medianode.h
|
||
@@ -7,7 +7,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/medianode_p.h b/src/3rdparty/phonon/phonon/medianode_p.h
|
||
index d5424b7..e2329a9 100644
|
||
--- a/src/3rdparty/phonon/phonon/medianode_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/medianode_p.h
|
||
@@ -6,7 +6,7 @@ Copyright (C) 2007 Matthias Kretz <kretz@kde.org>
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/medianodedestructionhandler_p.h b/src/3rdparty/phonon/phonon/medianodedestructionhandler_p.h
|
||
index 38c0907..9c893f4 100644
|
||
--- a/src/3rdparty/phonon/phonon/medianodedestructionhandler_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/medianodedestructionhandler_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediaobject.cpp b/src/3rdparty/phonon/phonon/mediaobject.cpp
|
||
index 10fefbd..0801bd7 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediaobject.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/mediaobject.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -300,15 +300,15 @@ void MediaObject::enqueue(const MediaSource &source)
|
||
|
||
void MediaObject::enqueue(const QList<MediaSource> &sources)
|
||
{
|
||
- for (int i = 0; i < sources.count(); ++i) {
|
||
- enqueue(sources.at(i));
|
||
+ foreach (const MediaSource &m, sources) {
|
||
+ enqueue(m);
|
||
}
|
||
}
|
||
|
||
void MediaObject::enqueue(const QList<QUrl> &urls)
|
||
{
|
||
- for (int i = 0; i < urls.count(); ++i) {
|
||
- enqueue(urls.at(i));
|
||
+ foreach (const QUrl &url, urls) {
|
||
+ enqueue(url);
|
||
}
|
||
}
|
||
|
||
@@ -502,8 +502,8 @@ void MediaObjectPrivate::setupBackendObject()
|
||
}
|
||
|
||
#ifndef QT_NO_PHONON_MEDIACONTROLLER
|
||
- for (int i = 0 ; i < interfaceList.count(); ++i) {
|
||
- interfaceList.at(i)->_backendObjectChanged();
|
||
+ foreach (FrontendInterfacePrivate *f, interfaceList) {
|
||
+ f->_backendObjectChanged();
|
||
}
|
||
#endif //QT_NO_PHONON_MEDIACONTROLLER
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediaobject.h b/src/3rdparty/phonon/phonon/mediaobject.h
|
||
index c56b6b5..c1fa3c6 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediaobject.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediaobject.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -15,7 +15,7 @@
|
||
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
|
||
+ 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/>.
|
||
|
||
*/
|
||
@@ -198,18 +198,18 @@ namespace Phonon
|
||
* Check whether the current media may be seeked.
|
||
*
|
||
* \warning This information cannot be known immediately. It is best
|
||
- * to also listen to the seekableChanged signal.
|
||
+ * to also listen to the hasVideoChanged signal.
|
||
*
|
||
* \code
|
||
- * connect(media, SIGNAL(seekableChanged(bool)), seekableChanged(bool));
|
||
+ * connect(media, SIGNAL(hasVideoChanged(bool)), hasVideoChanged(bool));
|
||
* media->setCurrentSource("somevideo.avi");
|
||
- * media->isSeekable(); // returns false;
|
||
+ * media->hasVideo(); // returns false;
|
||
* }
|
||
*
|
||
- * void seekableChanged(bool b)
|
||
+ * void hasVideoChanged(bool b)
|
||
* {
|
||
* // b == true
|
||
- * media->isSeekable(); // returns true;
|
||
+ * media->hasVideo(); // returns true;
|
||
* }
|
||
* \endcode
|
||
*
|
||
@@ -301,7 +301,7 @@ namespace Phonon
|
||
void setCurrentSource(const MediaSource &source);
|
||
|
||
/**
|
||
- * Returns the queued media sources. This list does not include
|
||
+ * Returns the queued media sources. This does list does not include
|
||
* the current source (returned by currentSource).
|
||
*/
|
||
QList<MediaSource> queue() const;
|
||
@@ -456,6 +456,8 @@ namespace Phonon
|
||
Q_SIGNALS:
|
||
/**
|
||
* Emitted when the state of the MediaObject has changed.
|
||
+ * In case you're not interested in the old state you can also
|
||
+ * connect to a slot that only has one State argument.
|
||
*
|
||
* @param newstate The state the Player is in now.
|
||
* @param oldstate The state the Player was in before.
|
||
@@ -585,7 +587,7 @@ namespace Phonon
|
||
/**
|
||
* This signal is emitted as soon as the total time of the media file is
|
||
* known or has changed. For most non-local media data the total
|
||
- * time of the media can only be known after some time. Initially the
|
||
+ * time of the media can only be known after some time. At that time the
|
||
* totalTime function can not return useful information. You have
|
||
* to wait for this signal to know the real total time.
|
||
*
|
||
diff --git a/src/3rdparty/phonon/phonon/mediaobject_p.h b/src/3rdparty/phonon/phonon/mediaobject_p.h
|
||
index 5419341..c164490 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediaobject_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediaobject_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediaobjectinterface.h b/src/3rdparty/phonon/phonon/mediaobjectinterface.h
|
||
index a5e2c51..26c4c8e 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediaobjectinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediaobjectinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediasource.cpp b/src/3rdparty/phonon/phonon/mediasource.cpp
|
||
index c003af9..c8db1e6 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediasource.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/mediasource.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -140,12 +140,8 @@ MediaSourcePrivate::~MediaSourcePrivate()
|
||
{
|
||
#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
if (autoDelete) {
|
||
- //here we use deleteLater because this object
|
||
- //might be destroyed from another thread
|
||
- if (stream)
|
||
- stream->deleteLater();
|
||
- if (ioDevice)
|
||
- ioDevice->deleteLater();
|
||
+ delete stream;
|
||
+ delete ioDevice;
|
||
}
|
||
#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
|
||
}
|
||
diff --git a/src/3rdparty/phonon/phonon/mediasource.h b/src/3rdparty/phonon/phonon/mediasource.h
|
||
index da010d9..4cddbad 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediasource.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediasource.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/mediasource_p.h b/src/3rdparty/phonon/phonon/mediasource_p.h
|
||
index bfac7ad..46caef3 100644
|
||
--- a/src/3rdparty/phonon/phonon/mediasource_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/mediasource_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescription.cpp b/src/3rdparty/phonon/phonon/objectdescription.cpp
|
||
index 3296792..4afd9dd 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescription.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescription.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -29,6 +29,7 @@
|
||
#include <QtCore/QStringList>
|
||
#include "backendinterface.h"
|
||
#include "platformplugin.h"
|
||
+#include "pulsesupport.h"
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
@@ -108,22 +109,24 @@ bool ObjectDescriptionData::isValid() const
|
||
|
||
ObjectDescriptionData *ObjectDescriptionData::fromIndex(ObjectDescriptionType type, int index)
|
||
{
|
||
+ BackendInterface *iface = qobject_cast<BackendInterface *>(Factory::backend());
|
||
+
|
||
// prefer to get the ObjectDescriptionData from the platform plugin for audio devices
|
||
#ifndef QT_NO_PHONON_PLATFORMPLUGIN
|
||
- if (type == AudioOutputDeviceType || type == AudioCaptureDeviceType) {
|
||
- PlatformPlugin *platformPlugin = Factory::platformPlugin();
|
||
- if (platformPlugin) {
|
||
- QList<int> indexes = platformPlugin->objectDescriptionIndexes(type);
|
||
- if (indexes.contains(index)) {
|
||
- QHash<QByteArray, QVariant> properties = platformPlugin->objectDescriptionProperties(type, index);
|
||
- return new ObjectDescriptionData(index, properties);
|
||
+ if (!iface || !PulseSupport::getInstance()->isActive()) {
|
||
+ if (type == AudioOutputDeviceType || type == AudioCaptureDeviceType) {
|
||
+ PlatformPlugin *platformPlugin = Factory::platformPlugin();
|
||
+ if (platformPlugin) {
|
||
+ QList<int> indexes = platformPlugin->objectDescriptionIndexes(type);
|
||
+ if (indexes.contains(index)) {
|
||
+ QHash<QByteArray, QVariant> properties = platformPlugin->objectDescriptionProperties(type, index);
|
||
+ return new ObjectDescriptionData(index, properties);
|
||
+ }
|
||
}
|
||
}
|
||
}
|
||
#endif //QT_NO_PHONON_PLATFORMPLUGIN
|
||
|
||
- QObject *b = Factory::backend();
|
||
- BackendInterface *iface = qobject_cast<BackendInterface *>(b);
|
||
if (iface) {
|
||
QList<int> indexes = iface->objectDescriptionIndexes(type);
|
||
if (indexes.contains(index)) {
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescription.h b/src/3rdparty/phonon/phonon/objectdescription.h
|
||
index 108f02c..985cdcc 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescription.h
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescription.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescription_p.h b/src/3rdparty/phonon/phonon/objectdescription_p.h
|
||
index 1069f11..bcf56de 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescription_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescription_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescriptionmodel.cpp b/src/3rdparty/phonon/phonon/objectdescriptionmodel.cpp
|
||
index b67344f..3d48a46 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescriptionmodel.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescriptionmodel.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -67,8 +67,6 @@ static const char qt_meta_stringdata_Phonon__ObjectDescriptionModel_Visualizatio
|
||
namespace Phonon
|
||
{
|
||
|
||
-#if !defined(Q_CC_MINGW) || __MINGW32_MAJOR_VERSION >= 4
|
||
-
|
||
template<> const QMetaObject ObjectDescriptionModel<AudioOutputDeviceType>::staticMetaObject = {
|
||
{ &QAbstractListModel::staticMetaObject, qt_meta_stringdata_Phonon__ObjectDescriptionModel_AudioOutputDeviceType,
|
||
qt_meta_data_Phonon__ObjectDescriptionModel, 0 }
|
||
@@ -139,7 +137,6 @@ int ObjectDescriptionModel<type>::qt_metacall(QMetaObject::Call _c, int _id, voi
|
||
return QAbstractListModel::qt_metacall(_c, _id, _a);
|
||
}
|
||
*/
|
||
-#endif
|
||
|
||
int ObjectDescriptionModelData::rowCount(const QModelIndex &parent) const
|
||
{
|
||
@@ -321,8 +318,8 @@ bool ObjectDescriptionModelData::dropMimeData(ObjectDescriptionType type, const
|
||
}
|
||
}
|
||
d->model->beginInsertRows(QModelIndex(), row, row + toInsert.size() - 1);
|
||
- for (int i = 0 ; i < toInsert.count(); ++i) {
|
||
- d->data.insert(row, toInsert.at(i));
|
||
+ foreach (const QExplicitlySharedDataPointer<ObjectDescriptionData> &obj, toInsert) {
|
||
+ d->data.insert(row, obj);
|
||
}
|
||
d->model->endInsertRows();
|
||
return true;
|
||
@@ -365,8 +362,7 @@ QStringList ObjectDescriptionModelData::mimeTypes(ObjectDescriptionType type) co
|
||
return QStringList(QLatin1String("application/x-phonon-objectdescription") + QString::number(static_cast<int>(type)));
|
||
}
|
||
|
||
-#if !defined(Q_CC_MINGW) || __MINGW32_MAJOR_VERSION >= 4
|
||
-#if !defined(Q_CC_MSVC) || _MSC_VER > 1300 || defined(Q_CC_INTEL)
|
||
+#if !defined(Q_CC_MSVC) || _MSC_VER > 1300 || defined(Q_CC_INTEL) || defined(Q_CC_MINGW)
|
||
#define INSTANTIATE_META_FUNCTIONS(type) \
|
||
template const QMetaObject *ObjectDescriptionModel<type>::metaObject() const; \
|
||
template void *ObjectDescriptionModel<type>::qt_metacast(const char *)
|
||
@@ -384,7 +380,6 @@ INSTANTIATE_META_FUNCTIONS(VideoCodecType);
|
||
INSTANTIATE_META_FUNCTIONS(ContainerFormatType);
|
||
INSTANTIATE_META_FUNCTIONS(VisualizationType);
|
||
*/
|
||
-#endif //Q_CC_MINGW
|
||
} // namespace Phonon
|
||
|
||
#endif //QT_NO_PHONON_OBJECTDESCRIPTIONMODEL
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescriptionmodel.h b/src/3rdparty/phonon/phonon/objectdescriptionmodel.h
|
||
index a3c72b2..495225e 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescriptionmodel.h
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescriptionmodel.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -35,6 +35,18 @@ QT_BEGIN_NAMESPACE
|
||
|
||
#ifndef QT_NO_PHONON_OBJECTDESCRIPTIONMODEL
|
||
|
||
+/* MinGW 3.4.x gives an ICE when trying to instantiate one of the
|
||
+ ObjectDescriptionModel<foo> classes because it can't handle
|
||
+ half exported classes correct. gcc 4.3.x has a fix for this but
|
||
+ we currently there's no official gcc 4.3 on windows available.
|
||
+ Because of this we need this little hack
|
||
+ */
|
||
+#if defined(Q_CC_MINGW)
|
||
+#define PHONON_EXPORT_ODM
|
||
+#else
|
||
+#define PHONON_EXPORT_ODM PHONON_EXPORT
|
||
+#endif
|
||
+
|
||
namespace Phonon
|
||
{
|
||
class ObjectDescriptionModelDataPrivate;
|
||
@@ -139,21 +151,6 @@ namespace Phonon
|
||
ObjectDescriptionModelDataPrivate *const d;
|
||
};
|
||
|
||
-/* Required to ensure template class vtables are exported on both symbian
|
||
-and existing builds. */
|
||
-#if defined(Q_OS_SYMBIAN) && defined(Q_CC_RVCT)
|
||
-// RVCT compiler (2.2.686) requires the export declaration to be on the class to export vtables
|
||
-// MWC compiler works both ways
|
||
-// GCCE compiler is unknown (it can't compile QtCore yet)
|
||
-#define PHONON_TEMPLATE_CLASS_EXPORT PHONON_EXPORT
|
||
-#define PHONON_TEMPLATE_CLASS_MEMBER_EXPORT
|
||
-#else
|
||
-// Windows builds (at least) do not support export declaration on templated class
|
||
-// But if you export a member function, the vtable is implicitly exported
|
||
-#define PHONON_TEMPLATE_CLASS_EXPORT
|
||
-#define PHONON_TEMPLATE_CLASS_MEMBER_EXPORT PHONON_EXPORT
|
||
-#endif
|
||
-
|
||
/** \class ObjectDescriptionModel objectdescriptionmodel.h Phonon/ObjectDescriptionModel
|
||
* \short The ObjectDescriptionModel class provides a model from
|
||
* a list of ObjectDescription objects.
|
||
@@ -190,26 +187,17 @@ and existing builds. */
|
||
* \author Matthias Kretz <kretz@kde.org>
|
||
*/
|
||
template<ObjectDescriptionType type>
|
||
- class PHONON_TEMPLATE_CLASS_EXPORT ObjectDescriptionModel : public QAbstractListModel
|
||
+ class ObjectDescriptionModel : public QAbstractListModel
|
||
{
|
||
public:
|
||
Q_OBJECT_CHECK
|
||
-
|
||
-/* MinGW 3.4.x gives an ICE when trying to instantiate one of the
|
||
- ObjectDescriptionModel<foo> classes because it can't handle
|
||
- half exported classes correct. gcc 4.3.x has a fix for this but
|
||
- we currently there's no official gcc 4.3 on windows available.
|
||
- Because of this we need this little hack
|
||
- */
|
||
-#if !defined(Q_CC_MINGW) || __MINGW32_MAJOR_VERSION >= 4
|
||
/** \internal */
|
||
- static PHONON_TEMPLATE_CLASS_MEMBER_EXPORT const QMetaObject staticMetaObject;
|
||
+ static PHONON_EXPORT const QMetaObject staticMetaObject;
|
||
/** \internal */
|
||
- PHONON_TEMPLATE_CLASS_MEMBER_EXPORT const QMetaObject *metaObject() const;
|
||
+ PHONON_EXPORT_ODM const QMetaObject *metaObject() const;
|
||
/** \internal */
|
||
- PHONON_TEMPLATE_CLASS_MEMBER_EXPORT void *qt_metacast(const char *_clname);
|
||
+ PHONON_EXPORT_ODM void *qt_metacast(const char *_clname);
|
||
//int qt_metacall(QMetaObject::Call _c, int _id, void **_a);
|
||
-#endif
|
||
|
||
/**
|
||
* Returns the number of rows in the model. This value corresponds
|
||
@@ -307,8 +295,8 @@ and existing builds. */
|
||
*/
|
||
inline void setModelData(const QList<ObjectDescription<type> > &data) { //krazy:exclude=inline
|
||
QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > list;
|
||
- for (int i = 0; i < data.count(); ++i) {
|
||
- list += data.at(i).d;
|
||
+ Q_FOREACH (const ObjectDescription<type> &desc, data) {
|
||
+ list << desc.d;
|
||
}
|
||
d->setModelData(list);
|
||
}
|
||
@@ -322,8 +310,8 @@ and existing builds. */
|
||
inline QList<ObjectDescription<type> > modelData() const { //krazy:exclude=inline
|
||
QList<ObjectDescription<type> > ret;
|
||
QList<QExplicitlySharedDataPointer<ObjectDescriptionData> > list = d->modelData();
|
||
- for (int i = 0; i < list.count(); ++i) {
|
||
- ret << ObjectDescription<type>(list.at(i));
|
||
+ Q_FOREACH (const QExplicitlySharedDataPointer<ObjectDescriptionData> &data, list) {
|
||
+ ret << ObjectDescription<type>(data);
|
||
}
|
||
return ret;
|
||
}
|
||
diff --git a/src/3rdparty/phonon/phonon/objectdescriptionmodel_p.h b/src/3rdparty/phonon/phonon/objectdescriptionmodel_p.h
|
||
index f036bc8..2200c8d 100644
|
||
--- a/src/3rdparty/phonon/phonon/objectdescriptionmodel_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/objectdescriptionmodel_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/path.cpp b/src/3rdparty/phonon/phonon/path.cpp
|
||
index ef3530c..b225697 100644
|
||
--- a/src/3rdparty/phonon/phonon/path.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/path.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -58,8 +58,8 @@ class ConnectionTransaction
|
||
PathPrivate::~PathPrivate()
|
||
{
|
||
#ifndef QT_NO_PHONON_EFFECT
|
||
- for (int i = 0; i < effects.count(); ++i) {
|
||
- effects.at(i)->k_ptr->removeDestructionHandler(this);
|
||
+ foreach (Effect *e, effects) {
|
||
+ e->k_ptr->removeDestructionHandler(this);
|
||
}
|
||
delete effectsParent;
|
||
#endif
|
||
@@ -233,8 +233,8 @@ bool Path::disconnect()
|
||
if (d->sourceNode)
|
||
list << d->sourceNode->k_ptr->backendObject();
|
||
#ifndef QT_NO_PHONON_EFFECT
|
||
- for (int i = 0; i < d->effects.count(); ++i) {
|
||
- list << d->effects.at(i)->k_ptr->backendObject();
|
||
+ foreach(Effect *e, d->effects) {
|
||
+ list << e->k_ptr->backendObject();
|
||
}
|
||
#endif
|
||
if (d->sinkNode) {
|
||
@@ -244,8 +244,8 @@ bool Path::disconnect()
|
||
//lets build the disconnection list
|
||
QList<QObjectPair> disco;
|
||
if (list.count() >=2 ) {
|
||
- QObjectList::const_iterator it = list.begin();
|
||
- for(;it+1 != list.end();++it) {
|
||
+ QObjectList::const_iterator it = list.constBegin();
|
||
+ for(;it+1 != list.constEnd();++it) {
|
||
disco << QObjectPair(*it, *(it+1));
|
||
}
|
||
}
|
||
@@ -260,8 +260,8 @@ bool Path::disconnect()
|
||
d->sourceNode = 0;
|
||
|
||
#ifndef QT_NO_PHONON_EFFECT
|
||
- for (int i = 0; i < d->effects.count(); ++i) {
|
||
- d->effects.at(i)->k_ptr->removeDestructionHandler(d.data());
|
||
+ foreach(Effect *e, d->effects) {
|
||
+ e->k_ptr->removeDestructionHandler(d.data());
|
||
}
|
||
d->effects.clear();
|
||
#endif
|
||
@@ -292,13 +292,11 @@ MediaNode *Path::sink() const
|
||
bool PathPrivate::executeTransaction( const QList<QObjectPair> &disconnections, const QList<QObjectPair> &connections)
|
||
{
|
||
QSet<QObject*> nodesForTransaction;
|
||
- for (int i = 0; i < disconnections.count(); ++i) {
|
||
- const QObjectPair &pair = disconnections.at(i);
|
||
+ foreach(const QObjectPair &pair, disconnections) {
|
||
nodesForTransaction << pair.first;
|
||
nodesForTransaction << pair.second;
|
||
}
|
||
- for (int i = 0; i < connections.count(); ++i) {
|
||
- const QObjectPair &pair = connections.at(i);
|
||
+ foreach(const QObjectPair &pair, connections) {
|
||
nodesForTransaction << pair.first;
|
||
nodesForTransaction << pair.second;
|
||
}
|
||
@@ -310,8 +308,8 @@ bool PathPrivate::executeTransaction( const QList<QObjectPair> &disconnections,
|
||
if (!transaction)
|
||
return false;
|
||
|
||
- QList<QObjectPair>::const_iterator it = disconnections.constBegin();
|
||
- for(;it != disconnections.constEnd();++it) {
|
||
+ QList<QObjectPair>::const_iterator it = disconnections.begin();
|
||
+ for(;it != disconnections.end();++it) {
|
||
const QObjectPair &pair = *it;
|
||
if (!backend->disconnectNodes(pair.first, pair.second)) {
|
||
|
||
@@ -327,8 +325,8 @@ bool PathPrivate::executeTransaction( const QList<QObjectPair> &disconnections,
|
||
}
|
||
}
|
||
|
||
- for(it = connections.constBegin(); it != connections.constEnd(); ++it) {
|
||
- const QObjectPair pair = *it;
|
||
+ for(it = connections.begin(); it != connections.end();++it) {
|
||
+ const QObjectPair &pair = *it;
|
||
if (!backend->connectNodes(pair.first, pair.second)) {
|
||
//Error: a connection failed
|
||
QList<QObjectPair>::const_iterator it2 = connections.begin();
|
||
@@ -340,8 +338,7 @@ bool PathPrivate::executeTransaction( const QList<QObjectPair> &disconnections,
|
||
}
|
||
|
||
//and now let's reconnect the nodes that were disconnected: rollback
|
||
- for (int i = 0; i < disconnections.count(); ++i) {
|
||
- const QObjectPair &pair = disconnections.at(i);
|
||
+ foreach(const QObjectPair &pair, disconnections) {
|
||
bool success = backend->connectNodes(pair.first, pair.second);
|
||
Q_ASSERT(success); //a failure here means it is impossible to reestablish the connection
|
||
Q_UNUSED(success);
|
||
@@ -420,8 +417,7 @@ void PathPrivate::phononObjectDestroyed(MediaNodePrivate *mediaNodePrivate)
|
||
sinkNode = 0;
|
||
} else {
|
||
#ifndef QT_NO_PHONON_EFFECT
|
||
- for (int i = 0; i < effects.count(); ++i) {
|
||
- Effect *e = effects.at(i);
|
||
+ foreach (Effect *e, effects) {
|
||
if (e->k_ptr == mediaNodePrivate) {
|
||
removeEffect(e);
|
||
}
|
||
diff --git a/src/3rdparty/phonon/phonon/path.h b/src/3rdparty/phonon/phonon/path.h
|
||
index eeabe82..6193054 100644
|
||
--- a/src/3rdparty/phonon/phonon/path.h
|
||
+++ b/src/3rdparty/phonon/phonon/path.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/path_p.h b/src/3rdparty/phonon/phonon/path_p.h
|
||
index 1345ad5..51b7e83 100644
|
||
--- a/src/3rdparty/phonon/phonon/path_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/path_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/phonon_export.h b/src/3rdparty/phonon/phonon/phonon_export.h
|
||
index 5f93ea0..96b5159 100644
|
||
--- a/src/3rdparty/phonon/phonon/phonon_export.h
|
||
+++ b/src/3rdparty/phonon/phonon/phonon_export.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/phonondefs.h b/src/3rdparty/phonon/phonon/phonondefs.h
|
||
index d1a114a..765eb1c 100644
|
||
--- a/src/3rdparty/phonon/phonon/phonondefs.h
|
||
+++ b/src/3rdparty/phonon/phonon/phonondefs.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -29,6 +29,11 @@
|
||
QT_BEGIN_HEADER
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
+#ifdef PHONON_BACKEND_VERSION_4_4
|
||
+# ifndef PHONON_BACKEND_VERSION_4_3
|
||
+# define PHONON_BACKEND_VERSION_4_3
|
||
+# endif
|
||
+#endif
|
||
#ifdef PHONON_BACKEND_VERSION_4_3
|
||
# ifndef PHONON_BACKEND_VERSION_4_2
|
||
# define PHONON_BACKEND_VERSION_4_2
|
||
diff --git a/src/3rdparty/phonon/phonon/phonondefs_p.h b/src/3rdparty/phonon/phonon/phonondefs_p.h
|
||
index 09037b5..778d7f6 100644
|
||
--- a/src/3rdparty/phonon/phonon/phonondefs_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/phonondefs_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/phononnamespace.cpp b/src/3rdparty/phonon/phonon/phononnamespace.cpp
|
||
index f594d3c..ba20aa5 100644
|
||
--- a/src/3rdparty/phonon/phonon/phononnamespace.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/phononnamespace.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/phononnamespace.h.in b/src/3rdparty/phonon/phonon/phononnamespace.h.in
|
||
index 54c5578..c65c121 100644
|
||
--- a/src/3rdparty/phonon/phonon/phononnamespace.h.in
|
||
+++ b/src/3rdparty/phonon/phonon/phononnamespace.h.in
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -90,7 +90,7 @@ namespace Phonon
|
||
};
|
||
|
||
/**
|
||
- * Provided as keys for \ref MediaObject::metaData for convenience, in addition to the strings defined in
|
||
+ * Provided as keys for MediaObject::metaData for convenience, in addition to the strings defined in
|
||
* the Ogg Vorbis specification.
|
||
*/
|
||
enum MetaData {
|
||
diff --git a/src/3rdparty/phonon/phonon/phononnamespace_p.h b/src/3rdparty/phonon/phonon/phononnamespace_p.h
|
||
index 4dd0ee8..2fa520a 100644
|
||
--- a/src/3rdparty/phonon/phonon/phononnamespace_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/phononnamespace_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/platform.cpp b/src/3rdparty/phonon/phonon/platform.cpp
|
||
index ed660dc..49c4561 100644
|
||
--- a/src/3rdparty/phonon/phonon/platform.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/platform.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/platform_p.h b/src/3rdparty/phonon/phonon/platform_p.h
|
||
index 379c54b..c4edb2f 100644
|
||
--- a/src/3rdparty/phonon/phonon/platform_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/platform_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/platformplugin.h b/src/3rdparty/phonon/phonon/platformplugin.h
|
||
index e1ab1b7..c75bc96 100644
|
||
--- a/src/3rdparty/phonon/phonon/platformplugin.h
|
||
+++ b/src/3rdparty/phonon/phonon/platformplugin.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/pulsesupport.cpp b/src/3rdparty/phonon/phonon/pulsesupport.cpp
|
||
new file mode 100644
|
||
index 0000000..997df9a
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/pulsesupport.cpp
|
||
@@ -0,0 +1,966 @@
|
||
+/* 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/>.
|
||
+
|
||
+*/
|
||
+
|
||
+#include <QtCore/QtGlobal>
|
||
+#include <QtCore/QEventLoop>
|
||
+#include <QtCore/QDebug>
|
||
+#include <QtCore/QStringList>
|
||
+
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+#include <glib.h>
|
||
+#include <pulse/pulseaudio.h>
|
||
+#include <pulse/xmalloc.h>
|
||
+#include <pulse/glib-mainloop.h>
|
||
+#include <pulse/ext-device-manager.h>
|
||
+#endif // HAVE_PULSEAUDIO
|
||
+
|
||
+#include "pulsesupport.h"
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+static PulseSupport* s_instance = NULL;
|
||
+
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+/***
|
||
+* Prints a conditional debug message based on the current debug level
|
||
+* If obj is provided, classname and objectname will be printed as well
|
||
+*
|
||
+* see debugLevel()
|
||
+*/
|
||
+
|
||
+static int debugLevel() {
|
||
+ static int level = -1;
|
||
+ if (level < 1) {
|
||
+ level = 0;
|
||
+ QString pulseenv = qgetenv("PHONON_PULSEAUDIO_DEBUG");
|
||
+ int l = pulseenv.toInt();
|
||
+ if (l > 0)
|
||
+ level = (l > 2 ? 2 : l);
|
||
+ }
|
||
+ return level;
|
||
+}
|
||
+
|
||
+static void logMessage(const QString &message, int priority = 2, QObject *obj=0);
|
||
+static void logMessage(const QString &message, int priority, QObject *obj)
|
||
+{
|
||
+ if (debugLevel() > 0) {
|
||
+ QString output;
|
||
+ if (obj) {
|
||
+ // Strip away namespace from className
|
||
+ QString className(obj->metaObject()->className());
|
||
+ int nameLength = className.length() - className.lastIndexOf(':') - 1;
|
||
+ className = className.right(nameLength);
|
||
+ output.sprintf("%s %s (%s %p)", message.toLatin1().constData(),
|
||
+ obj->objectName().toLatin1().constData(),
|
||
+ className.toLatin1().constData(), obj);
|
||
+ }
|
||
+ else {
|
||
+ output = message;
|
||
+ }
|
||
+ if (priority <= debugLevel()) {
|
||
+ qDebug() << QString("PulseSupport(%1): %2").arg(priority).arg(output);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+
|
||
+class AudioDevice
|
||
+{
|
||
+ public:
|
||
+ inline
|
||
+ AudioDevice(QString name, QString desc, QString icon, uint32_t index)
|
||
+ : pulseName(name), pulseIndex(index)
|
||
+ {
|
||
+ properties["name"] = desc;
|
||
+ properties["description"] = ""; // We don't have descriptions (well we do, but we use them as the name!)
|
||
+ properties["icon"] = icon;
|
||
+ properties["available"] = (index != PA_INVALID_INDEX);
|
||
+ properties["isAdvanced"] = false; // Nothing is advanced!
|
||
+ }
|
||
+
|
||
+ // Needed for QMap
|
||
+ inline AudioDevice() {}
|
||
+
|
||
+ QString pulseName;
|
||
+ uint32_t pulseIndex;
|
||
+ QHash<QByteArray, QVariant> properties;
|
||
+};
|
||
+bool operator!=(const AudioDevice &a, const AudioDevice &b)
|
||
+{
|
||
+ return !(a.pulseName == b.pulseName && a.properties == b.properties);
|
||
+}
|
||
+
|
||
+class PulseUserData
|
||
+{
|
||
+ public:
|
||
+ inline
|
||
+ PulseUserData()
|
||
+ {
|
||
+ }
|
||
+
|
||
+ QMap<QString, AudioDevice> newOutputDevices;
|
||
+ QMap<Phonon::Category, QMap<int, int> > newOutputDevicePriorities; // prio, device
|
||
+
|
||
+ QMap<QString, AudioDevice> newCaptureDevices;
|
||
+ QMap<Phonon::Category, QMap<int, int> > newCaptureDevicePriorities; // prio, device
|
||
+};
|
||
+
|
||
+static QMap<QString, Phonon::Category> s_roleCategoryMap;
|
||
+
|
||
+static bool s_pulseActive = false;
|
||
+
|
||
+static pa_glib_mainloop *s_mainloop = NULL;
|
||
+static pa_context *s_context = NULL;
|
||
+static QEventLoop *s_connectionEventloop = NULL;
|
||
+
|
||
+
|
||
+
|
||
+static int s_deviceIndexCounter = 0;
|
||
+
|
||
+static QMap<QString, int> s_outputDeviceIndexes;
|
||
+static QMap<int, AudioDevice> s_outputDevices;
|
||
+static QMap<Phonon::Category, QMap<int, int> > s_outputDevicePriorities; // prio, device
|
||
+static QMap<QString, uint32_t> s_outputStreamIndexMap;
|
||
+static QMap<QString, int> s_outputStreamMoveQueue;
|
||
+
|
||
+static QMap<QString, int> s_captureDeviceIndexes;
|
||
+static QMap<int, AudioDevice> s_captureDevices;
|
||
+static QMap<Phonon::Category, QMap<int, int> > s_captureDevicePriorities; // prio, device
|
||
+static QMap<QString, uint32_t> s_captureStreamIndexMap;
|
||
+static QMap<QString, int> s_captureStreamMoveQueue;
|
||
+
|
||
+
|
||
+static void ext_device_manager_subscribe_cb(pa_context *, void *);
|
||
+static void ext_device_manager_read_cb(pa_context *c, const pa_ext_device_manager_info *info, int eol, void *userdata) {
|
||
+ Q_ASSERT(c);
|
||
+ Q_ASSERT(userdata);
|
||
+
|
||
+ // If this is our first iteration, set things up properly
|
||
+ if (s_connectionEventloop) {
|
||
+ s_connectionEventloop->exit(0);
|
||
+ s_connectionEventloop = NULL;
|
||
+ s_pulseActive = true;
|
||
+
|
||
+ pa_operation *o;
|
||
+ pa_ext_device_manager_set_subscribe_cb(c, ext_device_manager_subscribe_cb, NULL);
|
||
+ if ((o = pa_ext_device_manager_subscribe(c, 1, NULL, NULL)))
|
||
+ pa_operation_unref(o);
|
||
+ }
|
||
+
|
||
+ if (eol < 0) {
|
||
+ logMessage(QString("Failed to initialize device manager extension: %1").arg(pa_strerror(pa_context_errno(c))));
|
||
+ // OK so we don't have the device manager extension, but we can show a single device and fake it.
|
||
+ int index;
|
||
+ s_outputDeviceIndexes.clear();
|
||
+ s_outputDevices.clear();
|
||
+ s_outputDevicePriorities.clear();
|
||
+ index = s_deviceIndexCounter++;
|
||
+ s_outputDeviceIndexes.insert("sink:default", index);
|
||
+ s_outputDevices.insert(index, AudioDevice("sink:default", QObject::tr("PulseAudio Sound Server").toUtf8(), "audio-backend-pulseaudio", 0));
|
||
+ for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
|
||
+ Phonon::Category cat = static_cast<Phonon::Category>(i);
|
||
+ s_outputDevicePriorities[cat].insert(0, index);
|
||
+ }
|
||
+
|
||
+ s_captureDeviceIndexes.clear();
|
||
+ s_captureDevices.clear();
|
||
+ s_captureDevicePriorities.clear();
|
||
+ index = s_deviceIndexCounter++;
|
||
+ s_captureDeviceIndexes.insert("source:default", index);
|
||
+ s_captureDevices.insert(index, AudioDevice("source:default", QObject::tr("PulseAudio Sound Server").toUtf8(), "audio-backend-pulseaudio", 0));
|
||
+ for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
|
||
+ Phonon::Category cat = static_cast<Phonon::Category>(i);
|
||
+ s_captureDevicePriorities[cat].insert(0, index);
|
||
+ }
|
||
+
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ PulseUserData *u = reinterpret_cast<PulseUserData*>(userdata);
|
||
+ if (eol) {
|
||
+ // We're done reading the data, so order it by priority and copy it into the
|
||
+ // static variables where it can then be accessed by those classes that need it.
|
||
+
|
||
+ QMap<QString, AudioDevice>::iterator newdev_it;
|
||
+
|
||
+ // Check for new output devices or things changing about known output devices.
|
||
+ bool output_changed = false;
|
||
+ for (newdev_it = u->newOutputDevices.begin(); newdev_it != u->newOutputDevices.end(); ++newdev_it) {
|
||
+ QString name = newdev_it.key();
|
||
+
|
||
+ // The name + index map is always written when a new device is added.
|
||
+ Q_ASSERT(s_outputDeviceIndexes.contains(name));
|
||
+
|
||
+ int index = s_outputDeviceIndexes[name];
|
||
+ if (!s_outputDevices.contains(index)) {
|
||
+ // This is a totally new device
|
||
+ output_changed = true;
|
||
+ logMessage(QString("Brand New Output Device Found."));
|
||
+ s_outputDevices.insert(index, *newdev_it);
|
||
+ } else if (s_outputDevices[index] != *newdev_it) {
|
||
+ // We have this device already, but is it different?
|
||
+ output_changed = true;
|
||
+ logMessage(QString("Change to Existing Output Device (may be Added/Removed or something else)"));
|
||
+ s_outputDevices.remove(index);
|
||
+ s_outputDevices.insert(index, *newdev_it);
|
||
+ }
|
||
+ }
|
||
+ // Go through the output devices we know about and see if any are no longer mentioned in the list.
|
||
+ QMutableMapIterator<QString, int> output_existing_it(s_outputDeviceIndexes);
|
||
+ while (output_existing_it.hasNext()) {
|
||
+ output_existing_it.next();
|
||
+ if (!u->newOutputDevices.contains(output_existing_it.key())) {
|
||
+ output_changed = true;
|
||
+ logMessage(QString("Output Device Completely Removed"));
|
||
+ s_outputDevices.remove(output_existing_it.value());
|
||
+ output_existing_it.remove();
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // Check for new capture devices or things changing about known capture devices.
|
||
+ bool capture_changed = false;
|
||
+ for (newdev_it = u->newCaptureDevices.begin(); newdev_it != u->newCaptureDevices.end(); ++newdev_it) {
|
||
+ QString name = newdev_it.key();
|
||
+
|
||
+ // The name + index map is always written when a new device is added.
|
||
+ Q_ASSERT(s_captureDeviceIndexes.contains(name));
|
||
+
|
||
+ int index = s_captureDeviceIndexes[name];
|
||
+ if (!s_captureDevices.contains(index)) {
|
||
+ // This is a totally new device
|
||
+ capture_changed = true;
|
||
+ logMessage(QString("Brand New Capture Device Found."));
|
||
+ s_captureDevices.insert(index, *newdev_it);
|
||
+ } else if (s_captureDevices[index] != *newdev_it) {
|
||
+ // We have this device already, but is it different?
|
||
+ capture_changed = true;
|
||
+ logMessage(QString("Change to Existing Capture Device (may be Added/Removed or something else)"));
|
||
+ s_captureDevices.remove(index);
|
||
+ s_captureDevices.insert(index, *newdev_it);
|
||
+ }
|
||
+ }
|
||
+ // Go through the capture devices we know about and see if any are no longer mentioned in the list.
|
||
+ QMutableMapIterator<QString, int> capture_existing_it(s_captureDeviceIndexes);
|
||
+ while (capture_existing_it.hasNext()) {
|
||
+ capture_existing_it.next();
|
||
+ if (!u->newCaptureDevices.contains(capture_existing_it.key())) {
|
||
+ capture_changed = true;
|
||
+ logMessage(QString("Capture Device Completely Removed"));
|
||
+ s_captureDevices.remove(capture_existing_it.value());
|
||
+ capture_existing_it.remove();
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // Just copy accross the new priority lists as we know they are valid
|
||
+ if (s_outputDevicePriorities != u->newOutputDevicePriorities) {
|
||
+ output_changed = true;
|
||
+ s_outputDevicePriorities = u->newOutputDevicePriorities;
|
||
+ }
|
||
+ if (s_captureDevicePriorities != u->newCaptureDevicePriorities) {
|
||
+ capture_changed = true;
|
||
+ s_captureDevicePriorities = u->newCaptureDevicePriorities;
|
||
+ }
|
||
+
|
||
+ if (s_instance) {
|
||
+ if (output_changed)
|
||
+ s_instance->emitObjectDescriptionChanged(AudioOutputDeviceType);
|
||
+ if (capture_changed)
|
||
+ s_instance->emitObjectDescriptionChanged(AudioCaptureDeviceType);
|
||
+ }
|
||
+
|
||
+ // We can free the user data as we will not be called again.
|
||
+ delete u;
|
||
+
|
||
+ // Some debug
|
||
+ logMessage(QString("Output Device Priority List:"));
|
||
+ for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
|
||
+ Phonon::Category cat = static_cast<Phonon::Category>(i);
|
||
+ if (s_outputDevicePriorities.contains(cat)) {
|
||
+ logMessage(QString(" Phonon Category %1").arg(cat));
|
||
+ int count = 0;
|
||
+ foreach (int j, s_outputDevicePriorities[cat]) {
|
||
+ QHash<QByteArray, QVariant> &props = s_outputDevices[j].properties;
|
||
+ logMessage(QString(" %1. %2 (Available: %3)").arg(++count).arg(props["name"].toString()).arg(props["available"].toBool()));
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ logMessage(QString("Capture Device Priority List:"));
|
||
+ for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
|
||
+ Phonon::Category cat = static_cast<Phonon::Category>(i);
|
||
+ if (s_captureDevicePriorities.contains(cat)) {
|
||
+ logMessage(QString(" Phonon Category %1").arg(cat));
|
||
+ int count = 0;
|
||
+ foreach (int j, s_captureDevicePriorities[cat]) {
|
||
+ QHash<QByteArray, QVariant> &props = s_captureDevices[j].properties;
|
||
+ logMessage(QString(" %1. %2 (Available: %3)").arg(++count).arg(props["name"].toString()).arg(props["available"].toBool()));
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if (!info)
|
||
+ return;
|
||
+
|
||
+ Q_ASSERT(info->name);
|
||
+ Q_ASSERT(info->description);
|
||
+ Q_ASSERT(info->icon);
|
||
+
|
||
+ // QString wrapper
|
||
+ QString name(info->name);
|
||
+ int index;
|
||
+ QMap<Phonon::Category, QMap<int, int> > *new_prio_map_cats; // prio, device
|
||
+ QMap<QString, AudioDevice> *new_devices;
|
||
+
|
||
+ if (name.startsWith("sink:")) {
|
||
+ new_devices = &u->newOutputDevices;
|
||
+ new_prio_map_cats = &u->newOutputDevicePriorities;
|
||
+
|
||
+ if (s_outputDeviceIndexes.contains(name))
|
||
+ index = s_outputDeviceIndexes[name];
|
||
+ else
|
||
+ index = s_outputDeviceIndexes[name] = s_deviceIndexCounter++;
|
||
+ } else if (name.startsWith("source:")) {
|
||
+ new_devices = &u->newCaptureDevices;
|
||
+ new_prio_map_cats = &u->newCaptureDevicePriorities;
|
||
+
|
||
+ if (s_captureDeviceIndexes.contains(name))
|
||
+ index = s_captureDeviceIndexes[name];
|
||
+ else
|
||
+ index = s_captureDeviceIndexes[name] = s_deviceIndexCounter++;
|
||
+ } else {
|
||
+ // This indicates a bug in pulseaudio.
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ // Add the new device itself.
|
||
+ new_devices->insert(name, AudioDevice(name, info->description, info->icon, info->index));
|
||
+
|
||
+ // For each role in the priority, map it to a phonon category and store the order.
|
||
+ for (uint32_t i = 0; i < info->n_role_priorities; ++i) {
|
||
+ pa_ext_device_manager_role_priority_info* role_prio = &info->role_priorities[i];
|
||
+ Q_ASSERT(role_prio->role);
|
||
+
|
||
+ if (s_roleCategoryMap.contains(role_prio->role)) {
|
||
+ Phonon::Category cat = s_roleCategoryMap[role_prio->role];
|
||
+
|
||
+ (*new_prio_map_cats)[cat].insert(role_prio->priority, index);
|
||
+ }
|
||
+ }
|
||
+}
|
||
+
|
||
+static void set_output_device(QString streamUuid)
|
||
+{
|
||
+ // If we only have one device, bail. This will be true if we are not using module-device-manager
|
||
+ if (s_outputDevices.size() < 2)
|
||
+ return;
|
||
+
|
||
+ if (!s_outputStreamMoveQueue.contains(streamUuid))
|
||
+ return;
|
||
+
|
||
+ if (!s_outputStreamIndexMap.contains(streamUuid))
|
||
+ return;
|
||
+
|
||
+ if (s_outputStreamIndexMap[streamUuid] == PA_INVALID_INDEX)
|
||
+ return;
|
||
+
|
||
+ int device = s_outputStreamMoveQueue[streamUuid];
|
||
+ if (!s_outputDevices.contains(device))
|
||
+ return;
|
||
+
|
||
+ // We don't remove the uuid from the s_captureStreamMoveQueue
|
||
+ // as an application may reuse the phonon AudioOutput object
|
||
+
|
||
+ uint32_t pulse_device_index = s_outputDevices[device].pulseIndex;
|
||
+ uint32_t pulse_stream_index = s_outputStreamIndexMap[streamUuid];
|
||
+
|
||
+ const QVariant var = s_outputDevices[device].properties["name"];
|
||
+ logMessage(QString("Moving Pulse Sink Input %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
|
||
+
|
||
+ /// @todo Find a way to move the stream without saving it... We don't want to pollute the stream restore db.
|
||
+ pa_operation* o;
|
||
+ if (!(o = pa_context_move_sink_input_by_index(s_context, pulse_stream_index, pulse_device_index, NULL, NULL))) {
|
||
+ logMessage(QString("pa_context_move_sink_input_by_index() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+}
|
||
+
|
||
+static void set_capture_device(QString streamUuid)
|
||
+{
|
||
+ // If we only have one device, bail. This will be true if we are not using module-device-manager
|
||
+ if (s_captureDevices.size() < 2)
|
||
+ return;
|
||
+
|
||
+ if (!s_captureStreamMoveQueue.contains(streamUuid))
|
||
+ return;
|
||
+
|
||
+ if (!s_captureStreamIndexMap.contains(streamUuid))
|
||
+ return;
|
||
+
|
||
+ if (s_captureStreamIndexMap[streamUuid] == PA_INVALID_INDEX)
|
||
+ return;
|
||
+
|
||
+ int device = s_captureStreamMoveQueue[streamUuid];
|
||
+ if (!s_captureDevices.contains(device))
|
||
+ return;
|
||
+
|
||
+ // We don't remove the uuid from the s_captureStreamMoveQueue
|
||
+ // as an application may reuse the phonon AudioCapture object (when it exists!)
|
||
+
|
||
+ uint32_t pulse_device_index = s_captureDevices[device].pulseIndex;
|
||
+ uint32_t pulse_stream_index = s_captureStreamIndexMap[streamUuid];
|
||
+
|
||
+ const QVariant var = s_captureDevices[device].properties["name"];
|
||
+ logMessage(QString("Moving Pulse Source Output %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
|
||
+
|
||
+ /// @todo Find a way to move the stream without saving it... We don't want to pollute the stream restore db.
|
||
+ pa_operation* o;
|
||
+ if (!(o = pa_context_move_source_output_by_index(s_context, pulse_stream_index, pulse_device_index, NULL, NULL))) {
|
||
+ logMessage(QString("pa_context_move_source_output_by_index() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+}
|
||
+
|
||
+void sink_input_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) {
|
||
+ Q_UNUSED(userdata);
|
||
+ Q_ASSERT(c);
|
||
+
|
||
+ if (eol < 0) {
|
||
+ if (pa_context_errno(c) == PA_ERR_NOENTITY)
|
||
+ return;
|
||
+
|
||
+ logMessage(QString("Sink input callback failure"));
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ if (eol > 0)
|
||
+ return;
|
||
+
|
||
+ Q_ASSERT(i);
|
||
+
|
||
+ // loop through (*i) and extract phonon->streamindex...
|
||
+ const char *t;
|
||
+ if ((t = pa_proplist_gets(i->proplist, "phonon.streamid"))) {
|
||
+ logMessage(QString("Found PulseAudio stream index %1 for Phonon Output Stream %2").arg(i->index).arg(t));
|
||
+ s_outputStreamIndexMap[QString(t)] = i->index;
|
||
+ // Process any pending moves...
|
||
+ set_output_device(QString(t));
|
||
+ }
|
||
+}
|
||
+
|
||
+void source_output_cb(pa_context *c, const pa_source_output_info *i, int eol, void *userdata) {
|
||
+ Q_UNUSED(userdata);
|
||
+ Q_ASSERT(c);
|
||
+
|
||
+ if (eol < 0) {
|
||
+ if (pa_context_errno(c) == PA_ERR_NOENTITY)
|
||
+ return;
|
||
+
|
||
+ logMessage(QString("Source output callback failure"));
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ if (eol > 0)
|
||
+ return;
|
||
+
|
||
+ Q_ASSERT(i);
|
||
+
|
||
+ // loop through (*i) and extract phonon->streamindex...
|
||
+ const char *t;
|
||
+ if ((t = pa_proplist_gets(i->proplist, "phonon.streamid"))) {
|
||
+ logMessage(QString("Found PulseAudio stream index %1 for Phonon Capture Stream %2").arg(i->index).arg(t));
|
||
+ s_captureStreamIndexMap[QString(t)] = i->index;
|
||
+ // Process any pending moves...
|
||
+ set_capture_device(QString(t));
|
||
+ }
|
||
+}
|
||
+
|
||
+static void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata) {
|
||
+ Q_UNUSED(userdata);
|
||
+
|
||
+ switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
|
||
+ case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
|
||
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
|
||
+ QString phononid = s_outputStreamIndexMap.key(index);
|
||
+ if (!phononid.isEmpty()) {
|
||
+ if (s_outputStreamIndexMap.contains(phononid)) {
|
||
+ logMessage(QString("Phonon Output Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
|
||
+ s_outputStreamIndexMap[phononid] = PA_INVALID_INDEX;
|
||
+ } else {
|
||
+ logMessage(QString("Removing Phonon Output Stream %1 (it's gone!)").arg(phononid));
|
||
+ s_outputStreamIndexMap.remove(phononid);
|
||
+ s_outputStreamMoveQueue.remove(phononid);
|
||
+ }
|
||
+ }
|
||
+ } else {
|
||
+ pa_operation *o;
|
||
+ if (!(o = pa_context_get_sink_input_info(c, index, sink_input_cb, NULL))) {
|
||
+ logMessage(QString("pa_context_get_sink_input_info() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+ }
|
||
+ break;
|
||
+
|
||
+ case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
|
||
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
|
||
+ QString phononid = s_captureStreamIndexMap.key(index);
|
||
+ if (!phononid.isEmpty()) {
|
||
+ if (s_captureStreamIndexMap.contains(phononid)) {
|
||
+ logMessage(QString("Phonon Capture Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
|
||
+ s_captureStreamIndexMap[phononid] = PA_INVALID_INDEX;
|
||
+ } else {
|
||
+ logMessage(QString("Removing Phonon Capture Stream %1 (it's gone!)").arg(phononid));
|
||
+ s_captureStreamIndexMap.remove(phononid);
|
||
+ s_captureStreamMoveQueue.remove(phononid);
|
||
+ }
|
||
+ }
|
||
+ } else {
|
||
+ pa_operation *o;
|
||
+ if (!(o = pa_context_get_source_output_info(c, index, source_output_cb, NULL))) {
|
||
+ logMessage(QString("pa_context_get_sink_input_info() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+}
|
||
+
|
||
+
|
||
+static void ext_device_manager_subscribe_cb(pa_context *c, void *) {
|
||
+ Q_ASSERT(c);
|
||
+
|
||
+ pa_operation *o;
|
||
+ PulseUserData *u = new PulseUserData; /** @todo Make some object to receive the info... */
|
||
+ if (!(o = pa_ext_device_manager_read(c, ext_device_manager_read_cb, u))) {
|
||
+ // We need to deal with failure on first iteration
|
||
+ if (s_connectionEventloop) {
|
||
+ s_connectionEventloop->exit(0);
|
||
+ s_connectionEventloop = NULL;
|
||
+ }
|
||
+ logMessage(QString("pa_ext_device_manager_read() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+
|
||
+
|
||
+ // Register for the stream changes...
|
||
+ pa_context_set_subscribe_callback(c, subscribe_cb, NULL);
|
||
+
|
||
+ if (!(o = pa_context_subscribe(c, (pa_subscription_mask_t)
|
||
+ (PA_SUBSCRIPTION_MASK_SINK_INPUT|
|
||
+ PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT), NULL, NULL))) {
|
||
+ logMessage(QString("pa_context_subscribe() failed"));
|
||
+ return;
|
||
+ }
|
||
+ pa_operation_unref(o);
|
||
+}
|
||
+
|
||
+static void context_state_callback(pa_context *c, void *)
|
||
+{
|
||
+ Q_ASSERT(c);
|
||
+
|
||
+ switch (pa_context_get_state(c)) {
|
||
+ case PA_CONTEXT_UNCONNECTED:
|
||
+ case PA_CONTEXT_CONNECTING:
|
||
+ case PA_CONTEXT_AUTHORIZING:
|
||
+ case PA_CONTEXT_SETTING_NAME:
|
||
+ break;
|
||
+
|
||
+ case PA_CONTEXT_READY:
|
||
+ // Attempt to load things up
|
||
+ ext_device_manager_subscribe_cb(c, NULL);
|
||
+ break;
|
||
+
|
||
+ case PA_CONTEXT_FAILED:
|
||
+ s_pulseActive = false;
|
||
+ if (s_connectionEventloop) {
|
||
+ s_connectionEventloop->exit(0);
|
||
+ s_connectionEventloop = NULL;
|
||
+ }
|
||
+ break;
|
||
+
|
||
+ case PA_CONTEXT_TERMINATED:
|
||
+ default:
|
||
+ s_pulseActive = false;
|
||
+ /// @todo Deal with reconnection...
|
||
+ break;
|
||
+ }
|
||
+}
|
||
+#endif // HAVE_PULSEAUDIO
|
||
+
|
||
+
|
||
+PulseSupport* PulseSupport::getInstance()
|
||
+{
|
||
+ if (NULL == s_instance) {
|
||
+ s_instance = new PulseSupport();
|
||
+ }
|
||
+ return s_instance;
|
||
+}
|
||
+
|
||
+void PulseSupport::shutdown()
|
||
+{
|
||
+ if (NULL != s_instance) {
|
||
+ delete s_instance;
|
||
+ s_instance = NULL;
|
||
+ }
|
||
+}
|
||
+
|
||
+PulseSupport::PulseSupport()
|
||
+ : QObject()
|
||
+{
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+ // Initialise our map (is there a better way to do this?)
|
||
+ s_roleCategoryMap["none"] = Phonon::NoCategory;
|
||
+ s_roleCategoryMap["video"] = Phonon::VideoCategory;
|
||
+ s_roleCategoryMap["music"] = Phonon::MusicCategory;
|
||
+ s_roleCategoryMap["game"] = Phonon::GameCategory;
|
||
+ s_roleCategoryMap["event"] = Phonon::NotificationCategory;
|
||
+ s_roleCategoryMap["phone"] = Phonon::CommunicationCategory;
|
||
+ //s_roleCategoryMap["animation"]; // No Mapping
|
||
+ //s_roleCategoryMap["production"]; // No Mapping
|
||
+ s_roleCategoryMap["a11y"] = Phonon::AccessibilityCategory;
|
||
+
|
||
+ // To allow for easy debugging, give an easy way to disable this pulseaudio check
|
||
+ QString pulseenv = qgetenv("PHONON_PULSEAUDIO_DISABLE");
|
||
+ if (pulseenv.toInt())
|
||
+ return;
|
||
+
|
||
+ s_mainloop = pa_glib_mainloop_new(NULL);
|
||
+ Q_ASSERT(s_mainloop);
|
||
+ pa_mainloop_api *api = pa_glib_mainloop_get_api(s_mainloop);
|
||
+
|
||
+ // We create a simple event loop to allow the glib loop
|
||
+ // to iterate until we've connected or not to the server.
|
||
+ s_connectionEventloop = new QEventLoop;
|
||
+
|
||
+ // XXX I don't want to show up in the client list. All I want to know is the list of sources
|
||
+ // and sinks...
|
||
+ s_context = pa_context_new(api, "libphonon");
|
||
+ // (cg) Convert to PA_CONTEXT_NOFLAGS when PulseAudio 0.9.19 is required
|
||
+ if (pa_context_connect(s_context, NULL, static_cast<pa_context_flags_t>(0), 0) >= 0) {
|
||
+ pa_context_set_state_callback(s_context, &context_state_callback, s_connectionEventloop);
|
||
+ // Now we block until we connect or otherwise...
|
||
+ s_connectionEventloop->exec();
|
||
+ }
|
||
+#endif
|
||
+}
|
||
+
|
||
+PulseSupport::~PulseSupport()
|
||
+{
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+ if (s_context) {
|
||
+ pa_context_disconnect(s_context);
|
||
+ s_context = NULL;
|
||
+ }
|
||
+
|
||
+ if (s_mainloop) {
|
||
+ pa_glib_mainloop_free(s_mainloop);
|
||
+ s_mainloop = NULL;
|
||
+ }
|
||
+
|
||
+ if (s_connectionEventloop) {
|
||
+ delete s_connectionEventloop;
|
||
+ s_connectionEventloop = NULL;
|
||
+ }
|
||
+#endif
|
||
+}
|
||
+
|
||
+bool PulseSupport::isActive()
|
||
+{
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+ return s_pulseActive;
|
||
+#else
|
||
+ return false;
|
||
+#endif
|
||
+}
|
||
+
|
||
+void PulseSupport::disable()
|
||
+{
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+ s_pulseActive = false;
|
||
+#endif
|
||
+}
|
||
+
|
||
+QList<int> PulseSupport::objectDescriptionIndexes(ObjectDescriptionType type) const
|
||
+{
|
||
+ QList<int> list;
|
||
+
|
||
+ if (type != AudioOutputDeviceType && type != AudioCaptureDeviceType)
|
||
+ return list;
|
||
+
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+ if (s_pulseActive) {
|
||
+ switch (type) {
|
||
+
|
||
+ case AudioOutputDeviceType: {
|
||
+ QMap<QString, int>::iterator it;
|
||
+ for (it = s_outputDeviceIndexes.begin(); it != s_outputDeviceIndexes.end(); ++it) {
|
||
+ list.append(*it);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ case AudioCaptureDeviceType: {
|
||
+ QMap<QString, int>::iterator it;
|
||
+ for (it = s_captureDeviceIndexes.begin(); it != s_captureDeviceIndexes.end(); ++it) {
|
||
+ list.append(*it);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+
|
||
+ return list;
|
||
+}
|
||
+
|
||
+QHash<QByteArray, QVariant> PulseSupport::objectDescriptionProperties(ObjectDescriptionType type, int index) const
|
||
+{
|
||
+ QHash<QByteArray, QVariant> ret;
|
||
+
|
||
+ if (type != AudioOutputDeviceType && type != AudioCaptureDeviceType)
|
||
+ return ret;
|
||
+
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(index);
|
||
+#else
|
||
+ if (s_pulseActive) {
|
||
+ switch (type) {
|
||
+
|
||
+ case AudioOutputDeviceType:
|
||
+ Q_ASSERT(s_outputDevices.contains(index));
|
||
+ ret = s_outputDevices[index].properties;
|
||
+ break;
|
||
+
|
||
+ case AudioCaptureDeviceType:
|
||
+ Q_ASSERT(s_captureDevices.contains(index));
|
||
+ ret = s_captureDevices[index].properties;
|
||
+ break;
|
||
+
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+
|
||
+ return ret;
|
||
+}
|
||
+
|
||
+QList<int> PulseSupport::objectIndexesByCategory(ObjectDescriptionType type, Category category) const
|
||
+{
|
||
+ QList<int> ret;
|
||
+
|
||
+ if (type != AudioOutputDeviceType && type != AudioCaptureDeviceType)
|
||
+ return ret;
|
||
+
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(category);
|
||
+#else
|
||
+ if (s_pulseActive) {
|
||
+ switch (type) {
|
||
+
|
||
+ case AudioOutputDeviceType:
|
||
+ if (s_outputDevicePriorities.contains(category))
|
||
+ ret = s_outputDevicePriorities[category].values();
|
||
+ break;
|
||
+
|
||
+ case AudioCaptureDeviceType:
|
||
+ if (s_captureDevicePriorities.contains(category))
|
||
+ ret = s_captureDevicePriorities[category].values();
|
||
+ break;
|
||
+
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+#endif
|
||
+
|
||
+ return ret;
|
||
+}
|
||
+
|
||
+#ifdef HAVE_PULSEAUDIO
|
||
+static void setDevicePriority(Category category, QStringList list)
|
||
+{
|
||
+ QString role = s_roleCategoryMap.key(category);
|
||
+ if (role.isEmpty())
|
||
+ return;
|
||
+
|
||
+ logMessage(QString("Reindexing %1: %2").arg(role).arg(list.join(", ")));
|
||
+
|
||
+ char **devices;
|
||
+ devices = pa_xnew(char *, list.size()+1);
|
||
+ int i = 0;
|
||
+ foreach (QString str, list) {
|
||
+ devices[i++] = pa_xstrdup(str.toUtf8().constData());
|
||
+ }
|
||
+ devices[list.size()] = NULL;
|
||
+
|
||
+ pa_operation *o;
|
||
+ if (!(o = pa_ext_device_manager_reorder_devices_for_role(s_context, role.toUtf8().constData(), (const char**)devices, NULL, NULL)))
|
||
+ logMessage(QString("pa_ext_device_manager_reorder_devices_for_role() failed"));
|
||
+ else
|
||
+ pa_operation_unref(o);
|
||
+
|
||
+ for (i = 0; i < list.size(); ++i)
|
||
+ pa_xfree(devices[i]);
|
||
+ pa_xfree(devices);
|
||
+}
|
||
+#endif
|
||
+
|
||
+void PulseSupport::setOutputDevicePriorityForCategory(Category category, QList<int> order)
|
||
+{
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(category);
|
||
+ Q_UNUSED(order);
|
||
+#else
|
||
+ QStringList list;
|
||
+ QList<int>::iterator it;
|
||
+
|
||
+ for (it = order.begin(); it != order.end(); ++it) {
|
||
+ if (s_outputDevices.contains(*it)) {
|
||
+ list << s_outputDeviceIndexes.key(*it);
|
||
+ }
|
||
+ }
|
||
+ setDevicePriority(category, list);
|
||
+#endif
|
||
+}
|
||
+
|
||
+void PulseSupport::setCaptureDevicePriorityForCategory(Category category, QList<int> order)
|
||
+{
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(category);
|
||
+ Q_UNUSED(order);
|
||
+#else
|
||
+ QStringList list;
|
||
+ QList<int>::iterator it;
|
||
+
|
||
+ for (it = order.begin(); it != order.end(); ++it) {
|
||
+ if (s_captureDevices.contains(*it)) {
|
||
+ list << s_captureDeviceIndexes.key(*it);
|
||
+ }
|
||
+ }
|
||
+ setDevicePriority(category, list);
|
||
+#endif
|
||
+}
|
||
+
|
||
+void PulseSupport::setStreamPropList(Category category, QString streamUuid)
|
||
+{
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(category);
|
||
+ Q_UNUSED(streamUuid);
|
||
+#else
|
||
+ QString role = s_roleCategoryMap.key(category);
|
||
+ if (role.isEmpty())
|
||
+ return;
|
||
+
|
||
+ logMessage(QString("Setting role to %1 for streamindex %2").arg(role).arg(streamUuid));
|
||
+ setenv("PULSE_PROP_media.role", role.toLatin1().constData(), 1);
|
||
+ setenv("PULSE_PROP_phonon.streamid", streamUuid.toLatin1().constData(), 1);
|
||
+#endif
|
||
+}
|
||
+
|
||
+void PulseSupport::emitObjectDescriptionChanged(ObjectDescriptionType type)
|
||
+{
|
||
+ emit objectDescriptionChanged(type);
|
||
+}
|
||
+
|
||
+bool PulseSupport::setOutputDevice(QString streamUuid, int device) {
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(streamUuid);
|
||
+ Q_UNUSED(device);
|
||
+ return false;
|
||
+#else
|
||
+ if (s_outputDevices.size() < 2)
|
||
+ return true;
|
||
+
|
||
+ if (!s_outputDevices.contains(device)) {
|
||
+ logMessage(QString("Attempting to set Output Device for invalid device id %1.").arg(device));
|
||
+ return false;
|
||
+ }
|
||
+ const QVariant var = s_outputDevices[device].properties["name"];
|
||
+ logMessage(QString("Attempting to set Output Device to '%1' for Output Stream %2").arg(var.toString()).arg(streamUuid));
|
||
+
|
||
+ s_outputStreamMoveQueue[streamUuid] = device;
|
||
+ // Attempt to look up the pulse stream index.
|
||
+ if (s_outputStreamIndexMap.contains(streamUuid) && s_outputStreamIndexMap[streamUuid] != PA_INVALID_INDEX) {
|
||
+ logMessage(QString("... Found in map. Moving now"));
|
||
+ set_output_device(streamUuid);
|
||
+ } else {
|
||
+ logMessage(QString("... Not found in map. Saving move for when the stream appears"));
|
||
+ }
|
||
+ return true;
|
||
+#endif
|
||
+}
|
||
+
|
||
+bool PulseSupport::setCaptureDevice(QString streamUuid, int device) {
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(streamUuid);
|
||
+ Q_UNUSED(device);
|
||
+ return false;
|
||
+#else
|
||
+ if (s_captureDevices.size() < 2)
|
||
+ return true;
|
||
+
|
||
+ if (!s_captureDevices.contains(device)) {
|
||
+ logMessage(QString("Attempting to set Capture Device for invalid device id %1.").arg(device));
|
||
+ return false;
|
||
+ }
|
||
+ const QVariant var = s_captureDevices[device].properties["name"];
|
||
+ logMessage(QString("Attempting to set Capture Device to '%1' for Capture Stream %2").arg(var.toString()).arg(streamUuid));
|
||
+
|
||
+ s_captureStreamMoveQueue[streamUuid] = device;
|
||
+ // Attempt to look up the pulse stream index.
|
||
+ if (s_captureStreamIndexMap.contains(streamUuid) && s_captureStreamIndexMap[streamUuid] == PA_INVALID_INDEX) {
|
||
+ logMessage(QString("... Found in map. Moving now"));
|
||
+ set_capture_device(streamUuid);
|
||
+ } else {
|
||
+ logMessage(QString("... Not found in map. Saving move for when the stream appears"));
|
||
+ }
|
||
+ return true;
|
||
+#endif
|
||
+}
|
||
+
|
||
+void PulseSupport::clearStreamCache(QString streamUuid) {
|
||
+#ifndef HAVE_PULSEAUDIO
|
||
+ Q_UNUSED(streamUuid);
|
||
+ return;
|
||
+#else
|
||
+ logMessage(QString("Clearing stream cache for stream %1").arg(streamUuid));
|
||
+ s_outputStreamIndexMap.remove(streamUuid);
|
||
+ s_outputStreamMoveQueue.remove(streamUuid);
|
||
+ s_captureStreamIndexMap.remove(streamUuid);
|
||
+ s_captureStreamMoveQueue.remove(streamUuid);
|
||
+#endif
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+// vim: sw=4 ts=4
|
||
diff --git a/src/3rdparty/phonon/phonon/pulsesupport.h b/src/3rdparty/phonon/phonon/pulsesupport.h
|
||
new file mode 100644
|
||
index 0000000..434b559
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/pulsesupport.h
|
||
@@ -0,0 +1,74 @@
|
||
+/* 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>
|
||
+
|
||
+QT_BEGIN_HEADER
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+ class PHONON_EXPORT PulseSupport : public QObject
|
||
+ {
|
||
+ Q_OBJECT
|
||
+ public:
|
||
+ static PulseSupport* getInstance();
|
||
+ static void shutdown();
|
||
+
|
||
+ bool isActive();
|
||
+ void disable();
|
||
+
|
||
+ QList<int> objectDescriptionIndexes(ObjectDescriptionType type) const;
|
||
+ QHash<QByteArray, QVariant> objectDescriptionProperties(ObjectDescriptionType type, int index) const;
|
||
+ QList<int> objectIndexesByCategory(ObjectDescriptionType type, Category category) const;
|
||
+
|
||
+ void setOutputDevicePriorityForCategory(Category category, QList<int> order);
|
||
+ void setCaptureDevicePriorityForCategory(Category category, QList<int> order);
|
||
+
|
||
+ void setStreamPropList(Category category, QString streamUuid);
|
||
+ void emitObjectDescriptionChanged(ObjectDescriptionType);
|
||
+
|
||
+ bool setOutputDevice(QString streamUuid, int device);
|
||
+ bool setCaptureDevice(QString streamUuid, int device);
|
||
+ void clearStreamCache(QString streamUuid);
|
||
+
|
||
+ signals:
|
||
+ void objectDescriptionChanged(ObjectDescriptionType);
|
||
+ private:
|
||
+ PulseSupport();
|
||
+ ~PulseSupport();
|
||
+ };
|
||
+} // namespace Phonon
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+QT_END_HEADER
|
||
+
|
||
+#endif // PHONON_PULSESUPPORT_H
|
||
+
|
||
diff --git a/src/3rdparty/phonon/phonon/qsettingsgroup_p.h b/src/3rdparty/phonon/phonon/qsettingsgroup_p.h
|
||
index 501fe37..ac7ca8d 100644
|
||
--- a/src/3rdparty/phonon/phonon/qsettingsgroup_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/qsettingsgroup_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -27,8 +27,6 @@
|
||
#include <QtCore/QString>
|
||
#include <QtCore/QVariant>
|
||
|
||
-#ifndef QT_NO_PHONON_SETTINGSGROUP
|
||
-
|
||
QT_BEGIN_HEADER
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
@@ -89,6 +87,5 @@ class QSettingsGroup
|
||
|
||
QT_END_NAMESPACE
|
||
QT_END_HEADER
|
||
-#endif //QT_NO_PHONON_SETTINGSGROUP
|
||
|
||
#endif // PHONON_QSETTINGSGROUP_P_H
|
||
diff --git a/src/3rdparty/phonon/phonon/seekslider.cpp b/src/3rdparty/phonon/phonon/seekslider.cpp
|
||
index e1eea54..b5b25f0 100644
|
||
--- a/src/3rdparty/phonon/phonon/seekslider.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/seekslider.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/seekslider.h b/src/3rdparty/phonon/phonon/seekslider.h
|
||
index 540079e..0005029 100644
|
||
--- a/src/3rdparty/phonon/phonon/seekslider.h
|
||
+++ b/src/3rdparty/phonon/phonon/seekslider.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/seekslider_p.h b/src/3rdparty/phonon/phonon/seekslider_p.h
|
||
index f4ed616..911ab25 100644
|
||
--- a/src/3rdparty/phonon/phonon/seekslider_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/seekslider_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -24,8 +24,8 @@
|
||
#define SEEKSLIDER_P_H
|
||
|
||
#include "seekslider.h"
|
||
+#include "swiftslider_p.h"
|
||
#include <QtGui/QBoxLayout>
|
||
-#include <QtGui/QSlider>
|
||
#include <QtGui/QLabel>
|
||
#include <QtGui/QPixmap>
|
||
#include <QtGui/QIcon>
|
||
@@ -84,7 +84,7 @@ class SeekSliderPrivate
|
||
void _k_currentSourceChanged();
|
||
|
||
QBoxLayout layout;
|
||
- QSlider slider;
|
||
+ SwiftSlider slider;
|
||
QLabel iconLabel;
|
||
QPointer<MediaObject> media;
|
||
bool ticking;
|
||
diff --git a/src/3rdparty/phonon/phonon/streaminterface.cpp b/src/3rdparty/phonon/phonon/streaminterface.cpp
|
||
index 3646fc1..666cb1e 100644
|
||
--- a/src/3rdparty/phonon/phonon/streaminterface.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/streaminterface.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/streaminterface.h b/src/3rdparty/phonon/phonon/streaminterface.h
|
||
index 10cc061..67df05d 100644
|
||
--- a/src/3rdparty/phonon/phonon/streaminterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/streaminterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/streaminterface_p.h b/src/3rdparty/phonon/phonon/streaminterface_p.h
|
||
index cc41156..426c58d 100644
|
||
--- a/src/3rdparty/phonon/phonon/streaminterface_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/streaminterface_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/swiftslider.cpp b/src/3rdparty/phonon/phonon/swiftslider.cpp
|
||
new file mode 100644
|
||
index 0000000..1e274aa
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/swiftslider.cpp
|
||
@@ -0,0 +1,103 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006-2008 Ricardo Villalba <rvm@escomposlinux.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 "swiftslider_p.h"
|
||
+
|
||
+#include <QtGui/QMouseEvent>
|
||
+#include <QtGui/QStyle>
|
||
+#include <QtGui/QStyleOption>
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+#if !defined(QT_NO_PHONON_SEEKSLIDER) && !defined(QT_NO_PHONON_VOLUMESLIDER)
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+SwiftSlider::SwiftSlider(Qt::Orientation orientation, QWidget * parent)
|
||
+ : QSlider(orientation, parent)
|
||
+{
|
||
+}
|
||
+
|
||
+SwiftSlider::~SwiftSlider()
|
||
+{
|
||
+}
|
||
+
|
||
+// Function copied from qslider.cpp
|
||
+inline int SwiftSlider::pick(const QPoint &pt) const
|
||
+{
|
||
+ return orientation() == Qt::Horizontal ? pt.x() : pt.y();
|
||
+}
|
||
+
|
||
+// Function copied from qslider.cpp and modified to make it compile
|
||
+int SwiftSlider::pixelPosToRangeValue(int pos) const
|
||
+{
|
||
+ QStyleOptionSlider opt;
|
||
+ initStyleOption(&opt);
|
||
+ QRect gr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
|
||
+ QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
|
||
+ int sliderMin, sliderMax, sliderLength;
|
||
+
|
||
+ if (orientation() == Qt::Horizontal) {
|
||
+ sliderLength = sr.width();
|
||
+ sliderMin = gr.x();
|
||
+ sliderMax = gr.right() - sliderLength + 1;
|
||
+ } else {
|
||
+ sliderLength = sr.height();
|
||
+ sliderMin = gr.y();
|
||
+ sliderMax = gr.bottom() - sliderLength + 1;
|
||
+ }
|
||
+ return QStyle::sliderValueFromPosition(minimum(), maximum(), pos - sliderMin,
|
||
+ sliderMax - sliderMin, opt.upsideDown);
|
||
+}
|
||
+
|
||
+// Based on code from qslider.cpp
|
||
+void SwiftSlider::mousePressEvent(QMouseEvent *event)
|
||
+{
|
||
+ if (event->button() == Qt::LeftButton) {
|
||
+ QStyleOptionSlider opt;
|
||
+ initStyleOption(&opt);
|
||
+ const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
|
||
+ const QPoint center = sliderRect.center() - sliderRect.topLeft();
|
||
+ // to take half of the slider off for the setSliderPosition call we use the center - topLeft
|
||
+
|
||
+ if (!sliderRect.contains(event->pos())) {
|
||
+ event->accept();
|
||
+
|
||
+ setSliderPosition(pixelPosToRangeValue(pick(event->pos() - center)));
|
||
+ triggerAction(SliderMove);
|
||
+ setRepeatAction(SliderNoAction);
|
||
+ } else {
|
||
+ QSlider::mousePressEvent(event);
|
||
+ }
|
||
+ } else {
|
||
+ QSlider::mousePressEvent(event);
|
||
+ }
|
||
+}
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif //QT_NO_PHONON_VOLUMESLIDER && QT_NO_PHONON_VOLUMESLIDER
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+#include "moc_swiftslider_p.cpp"
|
||
diff --git a/src/3rdparty/phonon/phonon/swiftslider_p.h b/src/3rdparty/phonon/phonon/swiftslider_p.h
|
||
new file mode 100644
|
||
index 0000000..f1e9c88
|
||
--- /dev/null
|
||
+++ b/src/3rdparty/phonon/phonon/swiftslider_p.h
|
||
@@ -0,0 +1,68 @@
|
||
+/* This file is part of the KDE project
|
||
+ Copyright (C) 2006-2008 Ricardo Villalba <rvm@escomposlinux.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 SWIFTSLIDER_H
|
||
+#define SWIFTSLIDER_H
|
||
+
|
||
+#include <QtGui/QSlider>
|
||
+
|
||
+QT_BEGIN_NAMESPACE
|
||
+
|
||
+#if !defined(QT_NO_PHONON_SEEKSLIDER) && !defined(QT_NO_PHONON_VOLUMESLIDER)
|
||
+
|
||
+namespace Phonon
|
||
+{
|
||
+
|
||
+/** \class SwiftSlider swiftslider_p.h Phonon/SwiftSlider
|
||
+ * \short Modified QSlider that allows sudden/quick moves instead of stepped moves ("Click'n'Go" QSlider)
|
||
+ *
|
||
+ * This is an internal class used by SeekSlider and VolumeSlider.
|
||
+ *
|
||
+ * Ricardo Villalba, the original author of MySlider.cpp (from the SMPlayer project)
|
||
+ * gave his permission for the inclusion of this code inside Phonon by
|
||
+ * switching MySlider.cpp to the LGPLv2.1+ license.
|
||
+ * See http://smplayer.svn.sourceforge.net/viewvc/smplayer/smplayer/trunk/src/myslider.cpp?revision=2406&view=markup
|
||
+ *
|
||
+ * The original discussion about a "Click'n'Go QSlider": http://lists.trolltech.com/qt-interest/2006-11/msg00363.html
|
||
+ *
|
||
+ * \ingroup PhononWidgets
|
||
+ */
|
||
+class SwiftSlider : public QSlider
|
||
+{
|
||
+ Q_OBJECT
|
||
+public:
|
||
+ SwiftSlider(Qt::Orientation orientation, QWidget * parent);
|
||
+ ~SwiftSlider();
|
||
+
|
||
+private:
|
||
+ void mousePressEvent(QMouseEvent *event);
|
||
+ inline int pick(const QPoint &pt) const;
|
||
+ int pixelPosToRangeValue(int pos) const;
|
||
+};
|
||
+
|
||
+} // namespace Phonon
|
||
+
|
||
+#endif //QT_NO_PHONON_VOLUMESLIDER && QT_NO_PHONON_VOLUMESLIDER
|
||
+
|
||
+QT_END_NAMESPACE
|
||
+
|
||
+#endif //SWIFTSLIDER_H
|
||
diff --git a/src/3rdparty/phonon/phonon/videoplayer.cpp b/src/3rdparty/phonon/phonon/videoplayer.cpp
|
||
index 8f76d4c..8851b05 100644
|
||
--- a/src/3rdparty/phonon/phonon/videoplayer.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/videoplayer.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/videoplayer.h b/src/3rdparty/phonon/phonon/videoplayer.h
|
||
index 6da1d98..7970f04 100644
|
||
--- a/src/3rdparty/phonon/phonon/videoplayer.h
|
||
+++ b/src/3rdparty/phonon/phonon/videoplayer.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/videowidget.cpp b/src/3rdparty/phonon/phonon/videowidget.cpp
|
||
index 63f6899..4575dfd 100644
|
||
--- a/src/3rdparty/phonon/phonon/videowidget.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/videowidget.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -28,8 +28,9 @@
|
||
#include "phononnamespace_p.h"
|
||
|
||
#include <QtGui/QAction>
|
||
-
|
||
-#define PHONON_INTERFACENAME VideoWidgetInterface
|
||
+#define IFACES4 VideoWidgetInterface44
|
||
+#define IFACES0 VideoWidgetInterface, IFACES4
|
||
+#define PHONON_INTERFACENAME IFACES0
|
||
|
||
QT_BEGIN_NAMESPACE
|
||
|
||
@@ -48,6 +49,8 @@ VideoWidget::VideoWidget(QWidget *parent)
|
||
setMouseTracking(true);
|
||
}
|
||
|
||
+
|
||
+
|
||
VideoWidget::VideoWidget(VideoWidgetPrivate &dd, QWidget *parent)
|
||
: QWidget(parent),
|
||
Phonon::AbstractVideoOutput(dd)
|
||
@@ -98,6 +101,15 @@ PHONON_INTERFACE_SETTER(setHue, hue, qreal)
|
||
PHONON_INTERFACE_GETTER(qreal, saturation, d->saturation)
|
||
PHONON_INTERFACE_SETTER(setSaturation, saturation, qreal)
|
||
|
||
+
|
||
+QImage VideoWidget::snapshot() const {
|
||
+ K_D(const VideoWidget);
|
||
+ ConstIface<IFACES4> iface(d);
|
||
+ if(iface) return iface->snapshot();
|
||
+ return QImage(); // TODO not implemented in VideoInterface
|
||
+}
|
||
+
|
||
+
|
||
void VideoWidget::setFullScreen(bool newFullScreen)
|
||
{
|
||
pDebug() << Q_FUNC_INFO << newFullScreen;
|
||
diff --git a/src/3rdparty/phonon/phonon/videowidget.h b/src/3rdparty/phonon/phonon/videowidget.h
|
||
index bde7333..804e61a 100644
|
||
--- a/src/3rdparty/phonon/phonon/videowidget.h
|
||
+++ b/src/3rdparty/phonon/phonon/videowidget.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -172,6 +172,7 @@ class AbstractVideoOutput;
|
||
qreal contrast() const;
|
||
qreal hue() const;
|
||
qreal saturation() const;
|
||
+ QImage snapshot() const;
|
||
|
||
//TODO: bar colors property
|
||
public Q_SLOTS:
|
||
diff --git a/src/3rdparty/phonon/phonon/videowidget_p.h b/src/3rdparty/phonon/phonon/videowidget_p.h
|
||
index c2434f2..3335135 100644
|
||
--- a/src/3rdparty/phonon/phonon/videowidget_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/videowidget_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/videowidgetinterface.h b/src/3rdparty/phonon/phonon/videowidgetinterface.h
|
||
index 7ed8a8a..0c33956 100644
|
||
--- a/src/3rdparty/phonon/phonon/videowidgetinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/videowidgetinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -53,8 +53,21 @@ class VideoWidgetInterface
|
||
//X virtual int overlayCapabilities() const = 0;
|
||
//X virtual bool createOverlay(QWidget *widget, int type) = 0;
|
||
};
|
||
+
|
||
+class VideoWidgetInterface44 : public VideoWidgetInterface
|
||
+{
|
||
+ public:
|
||
+ virtual QImage snapshot() const = 0;
|
||
+};
|
||
}
|
||
|
||
+#ifdef PHONON_BACKEND_VERSION_4_4
|
||
+namespace Phonon { typedef VideoWidgetInterface44 VideoWidgetInterfaceLatest; }
|
||
+#else
|
||
+namespace Phonon { typedef VideoWidgetInterface VideoWidgetInterfaceLatest; }
|
||
+#endif
|
||
+
|
||
+Q_DECLARE_INTERFACE(Phonon::VideoWidgetInterface44, "VideoWidgetInterface44.phonon.kde.org")
|
||
Q_DECLARE_INTERFACE(Phonon::VideoWidgetInterface, "VideoWidgetInterface3.phonon.kde.org")
|
||
|
||
#endif //QT_NO_PHONON_VIDEO
|
||
diff --git a/src/3rdparty/phonon/phonon/volumefadereffect.cpp b/src/3rdparty/phonon/phonon/volumefadereffect.cpp
|
||
index 066199e..15d34ee 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumefadereffect.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/volumefadereffect.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/volumefadereffect.h b/src/3rdparty/phonon/phonon/volumefadereffect.h
|
||
index 22f2137..528bffa 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumefadereffect.h
|
||
+++ b/src/3rdparty/phonon/phonon/volumefadereffect.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/volumefadereffect_p.h b/src/3rdparty/phonon/phonon/volumefadereffect_p.h
|
||
index cdd4e00..7937e63 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumefadereffect_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/volumefadereffect_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/volumefaderinterface.h b/src/3rdparty/phonon/phonon/volumefaderinterface.h
|
||
index da4262b..8c6e3a4 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumefaderinterface.h
|
||
+++ b/src/3rdparty/phonon/phonon/volumefaderinterface.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/volumeslider.cpp b/src/3rdparty/phonon/phonon/volumeslider.cpp
|
||
index 1888cb6..923f8d0 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumeslider.cpp
|
||
+++ b/src/3rdparty/phonon/phonon/volumeslider.cpp
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -85,7 +85,7 @@ VolumeSlider::~VolumeSlider()
|
||
|
||
bool VolumeSlider::isMuteVisible() const
|
||
{
|
||
- return !k_ptr->muteButton.isHidden();
|
||
+ return k_ptr->muteButton.isVisible();
|
||
}
|
||
|
||
void VolumeSlider::setMuteVisible(bool visible)
|
||
diff --git a/src/3rdparty/phonon/phonon/volumeslider.h b/src/3rdparty/phonon/phonon/volumeslider.h
|
||
index 47863a8..f5ef34f 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumeslider.h
|
||
+++ b/src/3rdparty/phonon/phonon/volumeslider.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
diff --git a/src/3rdparty/phonon/phonon/volumeslider_p.h b/src/3rdparty/phonon/phonon/volumeslider_p.h
|
||
index 6d8009a..623275f 100644
|
||
--- a/src/3rdparty/phonon/phonon/volumeslider_p.h
|
||
+++ b/src/3rdparty/phonon/phonon/volumeslider_p.h
|
||
@@ -6,7 +6,7 @@
|
||
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.), Trolltech ASA
|
||
+ 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.
|
||
|
||
@@ -24,8 +24,8 @@
|
||
#define VOLUMESLIDER_P_H
|
||
|
||
#include "volumeslider.h"
|
||
+#include "swiftslider_p.h"
|
||
#include <QtGui/QBoxLayout>
|
||
-#include <QtGui/QSlider>
|
||
#include <QtGui/QLabel>
|
||
#include <QtGui/QPixmap>
|
||
#include <QtGui/QToolButton>
|
||
@@ -83,7 +83,7 @@ class VolumeSliderPrivate
|
||
|
||
private:
|
||
QBoxLayout layout;
|
||
- QSlider slider;
|
||
+ SwiftSlider slider;
|
||
QToolButton muteButton;
|
||
QIcon volumeIcon;
|
||
QIcon mutedIcon;
|
||
diff --git a/src/phonon/phonon.pro b/src/phonon/phonon.pro
|
||
index 0469839..f62e958 100644
|
||
--- a/src/phonon/phonon.pro
|
||
+++ b/src/phonon/phonon.pro
|
||
@@ -3,7 +3,7 @@ include(../qbase.pri)
|
||
|
||
PHONON_MAJOR_VERSION = $${QT_MAJOR_VERSION}
|
||
PHONON_MINOR_VERSION = 3
|
||
-PHONON_PATCH_VERSION = 1
|
||
+PHONON_PATCH_VERSION = 80
|
||
VERSION = $${PHONON_MAJOR_VERSION}.$${PHONON_MINOR_VERSION}.$${PHONON_PATCH_VERSION}
|
||
|
||
DEPENDPATH += .
|
||
@@ -21,6 +21,9 @@ HEADERS += $$PHONON_DIR/abstractaudiooutput.h \
|
||
$$PHONON_DIR/abstractvideooutput.h \
|
||
$$PHONON_DIR/abstractvideooutput_p.h \
|
||
$$PHONON_DIR/addoninterface.h \
|
||
+ $$PHONON_DIR/audiodataoutput.h \
|
||
+ $$PHONON_DIR/audiodataoutput_p.h \
|
||
+ $$PHONON_DIR/audiodataoutputinterface.h \
|
||
$$PHONON_DIR/audiooutput.h \
|
||
$$PHONON_DIR/audiooutput_p.h \
|
||
$$PHONON_DIR/audiooutputinterface.h \
|
||
@@ -36,6 +39,7 @@ HEADERS += $$PHONON_DIR/abstractaudiooutput.h \
|
||
$$PHONON_DIR/effectwidget_p.h \
|
||
$$PHONON_DIR/factory_p.h \
|
||
$$PHONON_DIR/frontendinterface_p.h \
|
||
+ $$PHONON_DIR/globalconfig.h \
|
||
$$PHONON_DIR/globalconfig_p.h \
|
||
$$PHONON_DIR/iodevicestream_p.h \
|
||
$$PHONON_DIR/mediacontroller.h \
|
||
@@ -59,11 +63,13 @@ HEADERS += $$PHONON_DIR/abstractaudiooutput.h \
|
||
$$PHONON_DIR/phononnamespace_p.h \
|
||
$$PHONON_DIR/platform_p.h \
|
||
$$PHONON_DIR/platformplugin.h \
|
||
+ $$PHONON_DIR/pulsesupport.h \
|
||
$$PHONON_DIR/qsettingsgroup_p.h \
|
||
$$PHONON_DIR/seekslider.h \
|
||
$$PHONON_DIR/seekslider_p.h \
|
||
$$PHONON_DIR/streaminterface.h \
|
||
$$PHONON_DIR/streaminterface_p.h \
|
||
+ $$PHONON_DIR/swiftslider_p.h \
|
||
$$PHONON_DIR/videoplayer.h \
|
||
$$PHONON_DIR/videowidget.h \
|
||
$$PHONON_DIR/videowidget_p.h \
|
||
@@ -73,35 +79,39 @@ HEADERS += $$PHONON_DIR/abstractaudiooutput.h \
|
||
$$PHONON_DIR/volumefaderinterface.h \
|
||
$$PHONON_DIR/volumeslider.h \
|
||
$$PHONON_DIR/volumeslider_p.h
|
||
-SOURCES += $$PHONON_DIR/objectdescription.cpp \
|
||
- $$PHONON_DIR/objectdescriptionmodel.cpp \
|
||
- $$PHONON_DIR/phononnamespace.cpp \
|
||
- $$PHONON_DIR/mediasource.cpp \
|
||
- $$PHONON_DIR/abstractmediastream.cpp \
|
||
- $$PHONON_DIR/streaminterface.cpp \
|
||
- $$PHONON_DIR/mediaobject.cpp \
|
||
- $$PHONON_DIR/medianode.cpp \
|
||
- $$PHONON_DIR/path.cpp \
|
||
- $$PHONON_DIR/effectparameter.cpp \
|
||
- $$PHONON_DIR/effect.cpp \
|
||
- $$PHONON_DIR/volumefadereffect.cpp \
|
||
- $$PHONON_DIR/abstractaudiooutput.cpp \
|
||
+
|
||
+SOURCES += $$PHONON_DIR/abstractaudiooutput.cpp \
|
||
$$PHONON_DIR/abstractaudiooutput_p.cpp \
|
||
- $$PHONON_DIR/audiooutput.cpp \
|
||
- $$PHONON_DIR/audiooutputinterface.cpp \
|
||
+ $$PHONON_DIR/abstractmediastream.cpp \
|
||
$$PHONON_DIR/abstractvideooutput.cpp \
|
||
$$PHONON_DIR/abstractvideooutput_p.cpp \
|
||
+ $$PHONON_DIR/audiodataoutput.cpp \
|
||
+ $$PHONON_DIR/audiooutput.cpp \
|
||
+ $$PHONON_DIR/audiooutputinterface.cpp \
|
||
$$PHONON_DIR/backendcapabilities.cpp \
|
||
- $$PHONON_DIR/globalconfig.cpp \
|
||
+ $$PHONON_DIR/effect.cpp \
|
||
+ $$PHONON_DIR/effectparameter.cpp \
|
||
+ $$PHONON_DIR/effectwidget.cpp \
|
||
$$PHONON_DIR/factory.cpp \
|
||
- $$PHONON_DIR/platform.cpp \
|
||
+ $$PHONON_DIR/globalconfig.cpp \
|
||
+ $$PHONON_DIR/iodevicestream.cpp \
|
||
$$PHONON_DIR/mediacontroller.cpp \
|
||
- $$PHONON_DIR/videowidget.cpp \
|
||
- $$PHONON_DIR/videoplayer.cpp \
|
||
+ $$PHONON_DIR/medianode.cpp \
|
||
+ $$PHONON_DIR/mediaobject.cpp \
|
||
+ $$PHONON_DIR/mediasource.cpp \
|
||
+ $$PHONON_DIR/objectdescription.cpp \
|
||
+ $$PHONON_DIR/objectdescriptionmodel.cpp \
|
||
+ $$PHONON_DIR/path.cpp \
|
||
+ $$PHONON_DIR/phononnamespace.cpp \
|
||
+ $$PHONON_DIR/platform.cpp \
|
||
+ $$PHONON_DIR/pulsesupport.cpp \
|
||
$$PHONON_DIR/seekslider.cpp \
|
||
- $$PHONON_DIR/volumeslider.cpp \
|
||
- $$PHONON_DIR/effectwidget.cpp \
|
||
- $$PHONON_DIR/iodevicestream.cpp
|
||
+ $$PHONON_DIR/streaminterface.cpp \
|
||
+ $$PHONON_DIR/swiftslider.cpp \
|
||
+ $$PHONON_DIR/videoplayer.cpp \
|
||
+ $$PHONON_DIR/videowidget.cpp \
|
||
+ $$PHONON_DIR/volumefadereffect.cpp \
|
||
+ $$PHONON_DIR/volumeslider.cpp
|
||
|
||
contains(QT_CONFIG, dbus) {
|
||
QT += dbus
|