player.cpp 6.45 KB
Newer Older
1 2 3 4 5
/***************************************************************************
                          player.cpp  -  description
                             -------------------
    begin                : Sun Feb 17 2002
    copyright            : (C) 2002 by Scott Wheeler
6
    email                : wheeler@kde.org
7
***************************************************************************/
8 9 10 11 12 13 14 15 16 17 18 19

/***************************************************************************
 *                                                                         *
 *   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) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include <kdebug.h>

20 21
#include <qfile.h>

22 23 24 25 26 27 28 29 30 31 32
#include <connect.h>
#include <flowsystem.h>

#include "player.h"

////////////////////////////////////////////////////////////////////////////////
// public methods
////////////////////////////////////////////////////////////////////////////////

Player::Player()
{
33 34 35 36 37
    // set pointers to null
    server = 0;
    volumeControl = 0;
    media = 0;
    dispatcher = 0;
38

39 40
    // startup volume of "full" volume
    currentVolume = 1.0;
41

42
    setupPlayer();
43 44
}

45
Player::Player(const QString &fileName)
46
{
47
    setupPlayer();
48
    currentFile = fileName;
49 50 51 52
}

Player::~Player()
{
53 54 55 56
    delete(volumeControl);
    delete(media);
    delete(server);
    delete(dispatcher);
57 58
}

59
void Player::play(const QString &fileName, float volume)
60
{
61 62
    currentFile=fileName;
    play(volume);
63 64
}

65
void Player::play(float volume)
66
{
67 68 69 70 71
    if(serverRunning()) {
        if(media && media->state()==posPaused) {
            media->play();
        }
        else {
72
            if(media)
73
                stop();
74

75 76 77 78 79 80 81 82 83 84 85 86
            media = new PlayObject(server->createPlayObject(QFile::encodeName(currentFile).data()));
            //      media = new PlayObject(server->createPlayObject(currentFile.latin1()));
            if(!media->isNull()) {
                setVolume(volume);
                media->play();
            }
            else {
                kdDebug() << "Media did not initialize properly! (" << currentFile << ")" << endl;
                delete(media);
                media = 0;
            }
        }
87 88 89 90 91
    }
}

void Player::pause()
{
92 93
    if(serverRunning() && media)
	media->pause();
94 95 96 97
}

void Player::stop()
{
98 99 100 101 102 103 104 105 106 107
    if(serverRunning()) {
        if(media) {
            media->halt();
            delete(media);
            media = 0;
        }
        if(volumeControl) {
            delete(volumeControl);
            volumeControl = 0;
        }
108 109 110
    }
}

111
void Player::setVolume(float volume)
112
{
113 114 115 116 117 118 119
    if(serverRunning() && media && !media->isNull()) {
        if(!volumeControl)
            setupVolumeControl();
        if(volumeControl) {
            currentVolume = volume;
            volumeControl->scaleFactor(volume);
        }
120 121 122
    }
}

123
float Player::getVolume() const
124
{
125
    return(currentVolume);
126 127
}

128 129 130 131
/////////////////////////////////////////////////////////////////////////////////
// player status functions
/////////////////////////////////////////////////////////////////////////////////

132
bool Player::playing() const
133
{
134
    if(serverRunning() && media && media->state() == posPlaying)
135
        return(true);
136
    else
137
        return(false);
138 139
}

140
bool Player::paused() const
141
{
142
    if(serverRunning() && media && media->state() == posPaused)
143
        return(true);
144
    else
145
        return(false);
146 147
}

148
long Player::totalTime() const
149
{
150
    if(serverRunning() && media)
151
        return(media->overallTime().seconds);
152
    else
153
        return(-1);
154 155
}

156
long Player::currentTime() const
157
{
158
    if(serverRunning() && media && media->state()==posPlaying)
159
        return(media->currentTime().seconds);
160
    else
161
        return(-1);
162 163
}

164
int Player::position() const
165
{
166 167 168 169 170 171 172 173
    if(serverRunning() && media && media->state()==posPlaying) {
        //    long total=media->overallTime().ms;
        //    long current=media->currentTime().ms;
        long total=media->overallTime().seconds * 1000 + media->overallTime().ms;
        long current=media->currentTime().seconds * 1000 + media->currentTime().ms;
        // add .5 to make rounding happen properly
        return(int(double(current)*1000/total+.5));
    }
174
    else
175
        return(-1);
176 177 178 179 180 181 182 183
}

/////////////////////////////////////////////////////////////////////////////////
// player seek functions
/////////////////////////////////////////////////////////////////////////////////

void Player::seek(long seekTime)
{
184 185 186 187 188
    if(serverRunning() && media) {
        poTime poSeekTime;
        poSeekTime.seconds=seekTime;
        media->seek(poSeekTime);
    }
189 190 191 192
}

void Player::seekPosition(int position)
{
193 194 195 196 197 198
    if(serverRunning() && media) {
        poTime poSeekTime;
        long total=media->overallTime().seconds;
        poSeekTime.seconds=long(double(total)*position/1000+.5);
        media->seek(poSeekTime);
    }
199 200 201
}

/////////////////////////////////////////////////////////////////////////////////
202
// private
203 204 205 206
/////////////////////////////////////////////////////////////////////////////////

void Player::setupPlayer()
{
207 208
    dispatcher=new Dispatcher;
    server=new SimpleSoundServer(Reference("global:Arts_SimpleSoundServer"));
209 210 211 212
}

void Player::setupVolumeControl()
{
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
    volumeControl = new StereoVolumeControl(DynamicCast(server->createObject("Arts::StereoVolumeControl")));
    if(volumeControl && media && !volumeControl->isNull() && !media->isNull()) {

        Synth_BUS_UPLINK uplink = Arts::DynamicCast(media->_getChild( "uplink" ));
        uplink.stop();
        Arts::disconnect(*media, "left", uplink, "left");
        Arts::disconnect(*media, "right", uplink, "right");

        volumeControl->start();
        uplink.start();
        media->_addChild(*volumeControl, "volume" );

        Arts::connect(*media, "left", *volumeControl, "inleft");
        Arts::connect(*media, "right", *volumeControl, "inright");
        Arts::connect(*volumeControl, "outleft", uplink, "left");
        Arts::connect(*volumeControl, "outright", uplink, "right");
    }
    else {
        delete(volumeControl);
        volumeControl = 0;
        kdDebug() << "Could not initialize volume control!" << endl;
    }
235 236
}

237
bool Player::serverRunning() const
238
{
239 240 241 242
    if(server)
        return(!(server->isNull()));
    else
        return(0);
243
}