First version of VLC Phonon backend
[phonon:phonon-mplayer.git] / phonon-vlc / vlcloader.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 "vlcloader.h"
20
21 #include <QtCore/QCoreApplication>
22 #include <QtCore/QDir>
23 #include <QtCore/QLibrary>
24 #include <QtCore/QtDebug>
25
26 #include <QtGui/QWidget>
27
28 #include "QtCore/qt_windows.h"
29
30 namespace Phonon
31 {
32 namespace VLC
33 {
34
35 //Hack, global variable
36 VLCLoader * VLCLoader::_vlcloader = NULL;
37
38 VLCLoader::VLCLoader(QObject * parent) {
39         _vlc = new QLibrary(parent);
40         _instance = NULL;
41 }
42
43 VLCLoader::~VLCLoader() {
44         _vlc->unload();
45         delete _vlc;
46 }
47
48 VLCLoader * VLCLoader::get() {
49         //Lazy initialization
50         if (!_vlcloader) {
51                 QDir vlcPath(QCoreApplication::applicationDirPath());
52                 qDebug() << "VLC path=" << vlcPath.exists() << vlcPath.path();
53                 QDir vlcPluginsPath(vlcPath.path() + "/plugins");
54                 qDebug() << "VLC plugins path=" << vlcPluginsPath.exists() << vlcPluginsPath.path();
55
56                 QFile vlcDll(vlcPath.path() + "/libvlc-control");
57                 qDebug() << "VLC .dll path=" << vlcDll.exists() << vlcDll.fileName();
58                 _vlcloader = new VLCLoader(NULL);
59                 _vlcloader->load(vlcDll.fileName());
60
61                 //HINSTANCE pHnd = LoadLibraryA((QDir::toNativeSeparators(QString("\"") + vlcDll.fileName() + QString("\""))).toAscii().data());
62
63                 _vlcloader->libvlc_exception_init();
64
65                 char * vlcArgc[] = { vlcPath.path().toAscii().data(), "--plugin-path=", vlcPluginsPath.path().toAscii().data() };
66
67                 //Init VLC modules, should be done only once
68                 _vlcloader->libvlc_new(sizeof(vlcArgc) / sizeof(vlcArgc[0]), vlcArgc);
69         }
70
71         return _vlcloader;
72 }
73
74 void VLCLoader::checkException() {
75         if (libvlc_exception_raised()) {
76                 qCritical() << "error:" << libvlc_exception_get_message();
77         }
78 }
79
80 bool VLCLoader::load(const QString & libname) {
81         qDebug() << "VLCLoader=" << libname;
82         _vlc->setFileName(libname);
83         _vlc->load();
84         if (!_vlc->isLoaded()) {
85                 qDebug() << "libvlc couldn't be loaded:" << _vlc->errorString();
86                 return false;
87         } else {
88                 return true;
89         }
90 }
91
92 void VLCLoader::libvlc_new(int argc, const char * const * argv) {
93         typedef libvlc_instance_t * (*fct) (int, const char * const *, libvlc_exception_t *);
94         fct function = (fct) _vlc->resolve("libvlc_new");
95         if (function) {
96                 _instance = function(argc, argv, &_exception);
97                 checkException();
98         } else {
99         }
100 }
101
102 void VLCLoader::libvlc_exception_init() {
103         typedef void (*fct) (libvlc_exception_t *);
104         fct function = (fct) _vlc->resolve("libvlc_exception_init");
105         if (function) {
106                 function(&_exception);
107         } else {
108         }
109 }
110
111 const char * VLCLoader::libvlc_exception_get_message() {
112         typedef const char * (*fct) (const libvlc_exception_t *);
113         fct function = (fct) _vlc->resolve("libvlc_exception_get_message");
114         if (function) {
115                 return function(&_exception);
116         } else {
117                 return NULL;
118         }
119 }
120
121 libvlc_media_descriptor_t * VLCLoader::libvlc_media_descriptor_new(const QString & mediaDescriptor) {
122         typedef libvlc_media_descriptor_t * (*fct) (libvlc_instance_t *, const char *, libvlc_exception_t *);
123         fct function = (fct) _vlc->resolve("libvlc_media_descriptor_new");
124         if (function) {
125                 return function(_instance, mediaDescriptor.toAscii(), &_exception);
126         } else {
127                 return NULL;
128         }
129 }
130
131 libvlc_media_instance_t * VLCLoader::libvlc_media_instance_new_from_media_descriptor(libvlc_media_descriptor_t * md) {
132         typedef libvlc_media_instance_t * (*fct) (libvlc_media_descriptor_t *, libvlc_exception_t *);
133         fct function = (fct) _vlc->resolve("libvlc_media_instance_new_from_media_descriptor");
134         if (function) {
135                 return function(md, &_exception);
136                 checkException();
137         } else {
138                 return NULL;
139         }
140 }
141
142 void VLCLoader::libvlc_media_descriptor_release(libvlc_media_descriptor_t * md) {
143         typedef void (*fct) (libvlc_media_descriptor_t *);
144         fct function = (fct) _vlc->resolve("libvlc_media_descriptor_release");
145         if (function) {
146                 function(md);
147         } else {
148         }
149 }
150
151 void VLCLoader::libvlc_media_instance_play(libvlc_media_instance_t * mi) {
152         typedef void (*fct) (libvlc_media_instance_t *, libvlc_exception_t *);
153         fct function = (fct) _vlc->resolve("libvlc_media_instance_play");
154         if (function) {
155                 function(mi, &_exception);
156         } else {
157         }
158 }
159
160 void VLCLoader::libvlc_media_instance_pause(libvlc_media_instance_t * mi) {
161         typedef void (*fct) (libvlc_media_instance_t *, libvlc_exception_t *);
162         fct function = (fct) _vlc->resolve("libvlc_media_instance_pause");
163         if (function) {
164                 function(mi, &_exception);
165                 checkException();
166         } else {
167         }
168 }
169
170 void VLCLoader::libvlc_media_instance_stop(libvlc_media_instance_t * mi) {
171         typedef void (*fct) (libvlc_media_instance_t *, libvlc_exception_t *);
172         fct function = (fct) _vlc->resolve("libvlc_media_instance_stop");
173         if (function) {
174                 function(mi, &_exception);
175         } else {
176         }
177 }
178
179 void VLCLoader::setDrawableWidget(const QWidget * widget) {
180         _drawableWidget = (int) widget->winId();
181 }
182
183 int VLCLoader::getDrawableWidget() const {
184         return _drawableWidget;
185 }
186
187 void VLCLoader::libvlc_media_instance_set_drawable(libvlc_media_instance_t * mi, libvlc_drawable_t drawable) {
188         typedef void (*fct) (libvlc_media_instance_t *, libvlc_drawable_t, libvlc_exception_t *);
189         fct function = (fct) _vlc->resolve("libvlc_media_instance_set_drawable");
190         if (function) {
191                 function(mi, drawable, &_exception);
192                 checkException();
193         } else {
194         }
195 }
196
197 void VLCLoader::libvlc_video_set_parent(libvlc_drawable_t drawable) {
198         typedef void (*fct) (libvlc_instance_t *, libvlc_drawable_t, libvlc_exception_t *);
199         fct function = (fct) _vlc->resolve("libvlc_video_set_parent");
200         if (function) {
201                 function(_instance, drawable, &_exception);
202                 checkException();
203         } else {
204         }
205 }
206
207 libvlc_time_t VLCLoader::libvlc_media_instance_get_time(libvlc_media_instance_t * mi) {
208         typedef libvlc_time_t (*fct) (libvlc_media_instance_t *, libvlc_exception_t *);
209         fct function = (fct) _vlc->resolve("libvlc_media_instance_get_time");
210         if (function) {
211                 libvlc_time_t t = function(mi, &_exception);
212                 checkException();
213                 return t;
214         } else {
215                 return 0;
216         }
217 }
218
219 void VLCLoader::libvlc_media_instance_release(libvlc_media_instance_t * mi) {
220         typedef void (*fct) (libvlc_media_instance_t *);
221         fct function = (fct) _vlc->resolve("libvlc_media_instance_release");
222         if (function) {
223                 function(mi);
224         } else {
225         }
226 }
227
228 void VLCLoader::libvlc_release() {
229         typedef void (*fct) (libvlc_instance_t *);
230         fct function = (fct) _vlc->resolve("libvlc_release");
231         if (function) {
232                 function(_instance);
233                 checkException();
234         } else {
235         }
236 }
237
238 int VLCLoader::libvlc_exception_raised() {
239         typedef int (*fct) (const libvlc_exception_t *);
240         fct function = (fct) _vlc->resolve("libvlc_exception_raised");
241         if (function) {
242                 return function(&_exception);
243         } else {
244                 return 0;
245         }
246 }
247
248 }}      //Namespace Phonon::VLC