First version of VLC Phonon backend
[phonon:phonon-mplayer.git] / phonon-vlc / mediaobject.cpp
1 /*
2  * VLC backend for the Phonon library
3  * Copyright (C) 2007-2008  Tanguy Krotoff <tkrotoff@gmail.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "mediaobject.h"
20
21 #include "vlcloader.h"
22 #include "vlcevents.h"
23
24 namespace Phonon
25 {
26 namespace VLC
27 {
28
29 MediaObject::MediaObject(QObject * parent)
30         : QObject(parent) {
31
32         _mediaInstance = NULL;
33
34         VLCEvents::get()->libvlc_event_attach(libvlc_MediaInstanceTimeChanged);
35         connect(VLCEvents::get(), SIGNAL(timeChanged(const libvlc_event_t *, void *)),
36                 SLOT(timeChanged(const libvlc_event_t *, void *)));
37 }
38
39 MediaObject::~MediaObject() {
40 }
41
42 void MediaObject::play() {
43         qDebug() << "MediaObject::play()";
44
45         switch (_mediaSource.type()) {
46         case MediaSource::Invalid:
47                 break;
48         case MediaSource::LocalFile: {
49                 //Create a new item
50                 libvlc_media_descriptor_t * md = VLCLoader::get()->libvlc_media_descriptor_new(_mediaSource.fileName());
51
52                 //Create a media instance playing environement
53                 _mediaInstance = VLCLoader::get()->libvlc_media_instance_new_from_media_descriptor(md);
54
55                 //Hook into a window
56                 VLCLoader::get()->libvlc_media_instance_set_drawable(_mediaInstance, VLCLoader::get()->getDrawableWidget());
57
58                 //No need to keep the media descriptor now
59                 VLCLoader::get()->libvlc_media_descriptor_release(md);
60
61                 //Play the media_instance
62                 VLCLoader::get()->libvlc_media_instance_play(_mediaInstance);
63
64                 break;
65         }
66         case MediaSource::Url:
67                 break;
68         case MediaSource::Disc: {
69                 switch (_mediaSource.discType()) {
70                 case Phonon::NoDisc:
71                         //kFatal(610) << "I should never get to see a MediaSource that is a disc but doesn't specify which one";
72                         return;
73                 case Phonon::Cd:
74                         break;
75                 case Phonon::Dvd:
76                         break;
77                 case Phonon::Vcd:
78                         break;
79                 default:
80                         return;
81                 }
82                 break;
83         }
84         case MediaSource::Stream:
85                 break;
86         }
87 }
88
89 void MediaObject::pause() {
90         VLCLoader::get()->libvlc_media_instance_pause(_mediaInstance);
91 }
92
93 void MediaObject::stop() {
94         VLCLoader::get()->libvlc_media_instance_stop(_mediaInstance);
95
96         //Free the media_instance
97         VLCLoader::get()->libvlc_media_instance_release(_mediaInstance);
98         _mediaInstance = NULL;
99 }
100
101 void MediaObject::seek(qint64 milliseconds) {
102 }
103
104 qint32 MediaObject::tickInterval() const {
105         return 0;
106 }
107
108 void MediaObject::setTickInterval(qint32 interval) {
109 }
110
111 bool MediaObject::hasVideo() const {
112         return true;
113 }
114
115 bool MediaObject::isSeekable() const {
116         return true;
117 }
118
119 qint64 MediaObject::currentTime() const {
120         return VLCLoader::get()->libvlc_media_instance_get_time(_mediaInstance);
121 }
122
123 Phonon::State MediaObject::state() const {
124         return Phonon::StoppedState;
125 }
126
127 QString MediaObject::errorString() const {
128         return "";
129 }
130
131 Phonon::ErrorType MediaObject::errorType() const {
132         return Phonon::NormalError;
133 }
134
135 qint64 MediaObject::totalTime() const {
136         return 0;
137 }
138
139 MediaSource MediaObject::source() const {
140         return _mediaSource;
141 }
142
143 void MediaObject::setSource(const MediaSource & source) {
144         _mediaSource = source;
145
146         switch (source.type()) {
147         case MediaSource::Invalid:
148                 break;
149         case MediaSource::LocalFile:
150                 break;
151         case MediaSource::Url:
152                 break;
153         case MediaSource::Disc: {
154                 switch (source.discType()) {
155                 case Phonon::NoDisc:
156                         //kFatal(610) << "I should never get to see a MediaSource that is a disc but doesn't specify which one";
157                         return;
158                 case Phonon::Cd:
159                         break;
160                 case Phonon::Dvd:
161                         break;
162                 case Phonon::Vcd:
163                         break;
164                 default:
165                         return;
166                 }
167                 }
168                 break;
169         case MediaSource::Stream:
170                 break;
171         }
172 }
173
174 void MediaObject::setNextSource(const MediaSource & source) {
175         _mediaSource = source;
176 }
177
178 qint32 MediaObject::prefinishMark() const {
179         return 0;
180 }
181
182 void MediaObject::setPrefinishMark(qint32) {
183 }
184
185 qint32 MediaObject::transitionTime() const {
186         return 0;
187 }
188
189 void MediaObject::setTransitionTime(qint32) {
190 }
191
192 bool MediaObject::hasInterface(Interface iface) const {
193         return true;
194 }
195
196 QVariant MediaObject::interfaceCall(Interface iface, int command, const QList<QVariant> & arguments) {
197         return new QVariant();
198 }
199
200 void MediaObject::timeChanged(const libvlc_event_t * event, void * user_data) {
201         emit tick(/*event->event_type_specific->media_instance_time_changed->new_time*/100);
202 }
203
204 }}      //Namespace Phonon::VLC