1/*
2 Copyright (C) 2007 Matthias Kretz <kretz@kde.org>
3 Copyright (C) 2008 Ian Monroe <ian@monroe.nu>
4 Copyright (C) 2011 Harald Sitter <sitter@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) version 3, or any
10 later version accepted by the membership of KDE e.V. (or its
11 successor approved by the membership of KDE e.V.), Nokia Corporation
12 (or its successors, if any) and the KDE Free Qt Foundation, which shall
13 act as a proxy defined in Section 6 of version 3 of the license.
14
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library. If not, see <http://www.gnu.org/licenses/>.
22
23*/
24
25#include "mediacontroller.h"
26#include "mediaobject.h"
27#include "addoninterface.h"
28#include <QList>
29#include <QVariant>
30#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
31#include <QTextCodec>
32#else
33#include <QStringDecoder>
34#endif
35#include <QFont>
36#include "frontendinterface_p.h"
37
38#ifndef QT_NO_PHONON_MEDIACONTROLLER
39
40namespace Phonon
41{
42
43class MediaControllerPrivate : public FrontendInterfacePrivate
44{
45 public:
46 MediaControllerPrivate(MediaObject *mp) : FrontendInterfacePrivate(mp) {}
47
48 void backendObjectChanged(QObject *) override;
49 MediaController *q;
50};
51
52MediaController::MediaController(MediaObject *mp)
53 : QObject(mp)
54 , d(new MediaControllerPrivate(mp))
55{
56 d->q = this;
57 d->_backendObjectChanged();
58 setSubtitleAutodetect(true);
59}
60
61void MediaControllerPrivate::backendObjectChanged(QObject *m_backendObject)
62{
63 QObject::connect(sender: m_backendObject, SIGNAL(availableSubtitlesChanged()), receiver: q, SIGNAL(availableSubtitlesChanged()));
64 QObject::connect(sender: m_backendObject, SIGNAL(availableAudioChannelsChanged()), receiver: q, SIGNAL(availableAudioChannelsChanged()));
65 QObject::connect(sender: m_backendObject, SIGNAL(titleChanged(int)), receiver: q, SIGNAL(titleChanged(int)));
66 QObject::connect(sender: m_backendObject, SIGNAL(availableTitlesChanged(int)), receiver: q, SIGNAL(availableTitlesChanged(int)));
67 QObject::connect(sender: m_backendObject, SIGNAL(chapterChanged(int)), receiver: q, SIGNAL(chapterChanged(int)));
68 QObject::connect(sender: m_backendObject, SIGNAL(availableChaptersChanged(int)), receiver: q, SIGNAL(availableChaptersChanged(int)));
69 QObject::connect(sender: m_backendObject, SIGNAL(angleChanged(int)), receiver: q, SIGNAL(angleChanged(int)));
70 QObject::connect(sender: m_backendObject, SIGNAL(availableAnglesChanged(int)), receiver: q, SIGNAL(availableAnglesChanged(int)));
71}
72
73MediaController::~MediaController()
74{
75 delete d;
76}
77
78#define IFACE \
79 AddonInterface *iface = d->iface(); \
80 if (!iface) return
81
82MediaController::Features MediaController::supportedFeatures() const
83{
84 if (!d || !d->media) {
85 return Features();
86 }
87 IFACE Features();
88 Features ret;
89 if (iface->hasInterface(iface: AddonInterface::AngleInterface)) {
90 ret |= Angles;
91 }
92 if (iface->hasInterface(iface: AddonInterface::ChapterInterface)) {
93 ret |= Chapters;
94 }
95 if (iface->hasInterface(iface: AddonInterface::NavigationInterface)) {
96 ret |= Navigations;
97 }
98 if (iface->hasInterface(iface: AddonInterface::TitleInterface)) {
99 ret |= Titles;
100 }
101 if (iface->hasInterface(iface: AddonInterface::SubtitleInterface)) {
102 ret |= Subtitles;
103 }
104 if(iface->hasInterface(iface: AddonInterface::AudioChannelInterface)) {
105 ret |= AudioChannels;
106 }
107 return ret;
108}
109
110// -- Angle Control -- //
111
112int MediaController::availableAngles() const
113{
114 IFACE 0;
115 return iface->interfaceCall(iface: AddonInterface::AngleInterface,
116 command: AddonInterface::availableAngles).toInt();
117}
118
119int MediaController::currentAngle() const
120{
121 IFACE 0;
122 return iface->interfaceCall(iface: AddonInterface::AngleInterface,
123 command: AddonInterface::angle).toInt();
124}
125
126void MediaController::setCurrentAngle(int titleNumber)
127{
128 IFACE;
129 iface->interfaceCall(iface: AddonInterface::AngleInterface,
130 command: AddonInterface::setAngle, arguments: QList<QVariant>() << QVariant(titleNumber));
131}
132
133// -- Chapter Control -- //
134
135int MediaController::availableChapters() const
136{
137 IFACE 0;
138 return iface->interfaceCall(iface: AddonInterface::ChapterInterface,
139 command: AddonInterface::availableChapters).toInt();
140}
141
142int MediaController::currentChapter() const
143{
144 IFACE 0;
145 return iface->interfaceCall(iface: AddonInterface::ChapterInterface,
146 command: AddonInterface::chapter).toInt();
147}
148
149void MediaController::setCurrentChapter(int titleNumber)
150{
151 IFACE;
152 iface->interfaceCall(iface: AddonInterface::ChapterInterface,
153 command: AddonInterface::setChapter, arguments: QList<QVariant>() << QVariant(titleNumber));
154}
155
156// -- Navigation Menu Control -- //
157
158QString MediaController::navigationMenuToString(NavigationMenu menu)
159{
160 switch (menu) {
161 case RootMenu:
162 return tr(s: "Main Menu");
163 case TitleMenu :
164 return tr(s: "Title Menu");
165 case AudioMenu:
166 return tr(s: "Audio Menu");
167 case SubtitleMenu:
168 return tr(s: "Subtitle Menu");
169 case ChapterMenu:
170 return tr(s: "Chapter Menu");
171 case AngleMenu:
172 return tr(s: "Angle Menu");
173 }
174 return QString();
175}
176
177QList<MediaController::NavigationMenu> MediaController::availableMenus() const
178{
179 QList<NavigationMenu> menus;
180 IFACE menus;
181 menus =
182 iface->interfaceCall(iface: AddonInterface::NavigationInterface,
183 command: AddonInterface::availableMenus).value< QList<NavigationMenu> >();
184
185 return menus;
186}
187
188void MediaController::setCurrentMenu(NavigationMenu menu)
189{
190 IFACE;
191 iface->interfaceCall(iface: AddonInterface::NavigationInterface,
192 command: AddonInterface::setMenu, arguments: QList<QVariant>() << QVariant::fromValue(value: menu));
193}
194// -- Title Control -- //
195
196int MediaController::availableTitles() const
197{
198 IFACE 0;
199 return iface->interfaceCall(iface: AddonInterface::TitleInterface,
200 command: AddonInterface::availableTitles).toInt();
201}
202
203int MediaController::currentTitle() const
204{
205 IFACE 0;
206 return iface->interfaceCall(iface: AddonInterface::TitleInterface,
207 command: AddonInterface::title).toInt();
208}
209
210void MediaController::setCurrentTitle(int titleNumber)
211{
212 IFACE;
213 iface->interfaceCall(iface: AddonInterface::TitleInterface,
214 command: AddonInterface::setTitle, arguments: QList<QVariant>() << QVariant(titleNumber));
215}
216
217bool MediaController::autoplayTitles() const
218{
219 IFACE true;
220 return iface->interfaceCall(iface: AddonInterface::TitleInterface,
221 command: AddonInterface::autoplayTitles).toBool();
222}
223
224void MediaController::setAutoplayTitles(bool b)
225{
226 IFACE;
227 iface->interfaceCall(iface: AddonInterface::TitleInterface,
228 command: AddonInterface::setAutoplayTitles, arguments: QList<QVariant>() << QVariant(b));
229}
230
231void MediaController::nextTitle()
232{
233 setCurrentTitle(currentTitle() + 1);
234}
235
236void MediaController::previousTitle()
237{
238 setCurrentTitle(currentTitle() - 1);
239}
240
241// -- Audio Channel & Subtitle Control -- //
242
243AudioChannelDescription MediaController::currentAudioChannel() const
244{
245 IFACE AudioChannelDescription();
246 return iface->interfaceCall(iface: AddonInterface::AudioChannelInterface,
247 command: AddonInterface::currentAudioChannel).value<AudioChannelDescription>();
248}
249
250bool MediaController::subtitleAutodetect() const
251{
252 IFACE true;
253 return iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
254 command: AddonInterface::subtitleAutodetect).toBool();
255}
256
257void MediaController::setSubtitleAutodetect(bool enable)
258{
259 IFACE;
260 iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
261 command: AddonInterface::setSubtitleAutodetect, arguments: QList<QVariant>() << QVariant(enable));
262}
263
264QString MediaController::subtitleEncoding() const
265{
266 IFACE QString();
267 return iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
268 command: AddonInterface::subtitleEncoding).toString();
269}
270
271void MediaController::setSubtitleEncoding(const QString &encoding)
272{
273 IFACE;
274#if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0)
275 if (!QTextCodec::availableCodecs().contains(encoding.toLocal8Bit()))
276 return;
277#else
278 if (!QStringDecoder(encoding.toUtf8().constData()).isValid())
279 return;
280#endif
281 iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
282 command: AddonInterface::setSubtitleEncoding, arguments: QList<QVariant>() << QVariant(encoding));
283}
284
285void MediaController::setSubtitleFont(const QFont &font)
286{
287 IFACE;
288 iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
289 command: AddonInterface::setSubtitleFont, arguments: QList<QVariant>() << QVariant(font));
290}
291
292QFont MediaController::subtitleFont() const
293{
294 IFACE QFont();
295 return iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
296 command: AddonInterface::subtitleFont).value<QFont>();
297}
298
299SubtitleDescription MediaController::currentSubtitle() const
300{
301 IFACE SubtitleDescription();
302 return iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
303 command: AddonInterface::currentSubtitle).value<SubtitleDescription>();
304}
305
306QList<AudioChannelDescription> MediaController::availableAudioChannels() const
307{
308 QList<AudioChannelDescription> retList;
309 IFACE retList;
310 retList = iface->interfaceCall(iface: AddonInterface::AudioChannelInterface,
311 command: AddonInterface::availableAudioChannels).value< QList<AudioChannelDescription> >();
312 return retList;
313}
314
315QList<SubtitleDescription> MediaController::availableSubtitles() const
316{
317 QList<SubtitleDescription> retList;
318 IFACE retList;
319 retList = iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
320 command: AddonInterface::availableSubtitles)
321 .value< QList<SubtitleDescription> >();
322 return retList;
323}
324
325void MediaController::setCurrentAudioChannel(const Phonon::AudioChannelDescription &stream)
326{
327 IFACE;
328 iface->interfaceCall(iface: AddonInterface::AudioChannelInterface,
329 command: AddonInterface::setCurrentAudioChannel, arguments: QList<QVariant>() << QVariant::fromValue(value: stream));
330}
331
332void MediaController::setCurrentSubtitle(const Phonon::SubtitleDescription &stream)
333{
334 IFACE;
335 iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
336 command: AddonInterface::setCurrentSubtitle, arguments: QList<QVariant>() << QVariant::fromValue(value: stream));
337}
338
339void MediaController::setCurrentSubtitle(const QUrl &url)
340{
341 IFACE;
342 iface->interfaceCall(iface: AddonInterface::SubtitleInterface,
343 command: AddonInterface::setCurrentSubtitleFile, arguments: QList<QVariant>() << url);
344}
345
346#undef IFACE
347
348} // namespace Phonon
349
350#endif //QT_NO_PHONON_MEDIACONTROLLER
351
352#include "moc_mediacontroller.cpp"
353
354// vim: sw=4 sts=4 et tw=100
355

source code of phonon/phonon/mediacontroller.cpp