2014-09-12 16:08:58 -04:00
|
|
|
/**
|
2013-12-24 20:17:44 -05:00
|
|
|
* Copyright 2013 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/audio.h>
|
|
|
|
#include <core/deck.h>
|
2014-12-20 15:47:10 -05:00
|
|
|
#include <core/library.h>
|
2015-01-27 08:34:32 -05:00
|
|
|
#include <core/string.h>
|
2013-12-24 20:17:44 -05:00
|
|
|
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
static bool _pause_enabled = false;
|
|
|
|
static unsigned int _pause_count = 0;
|
2013-12-25 14:35:33 -05:00
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
static Track *cur_track = NULL;
|
2014-05-26 12:10:36 -04:00
|
|
|
static File f_cur_track("cur_track", 0);
|
2014-12-20 15:47:10 -05:00
|
|
|
static AudioDriver *cur_driver = NULL;
|
2014-12-19 14:37:47 -05:00
|
|
|
|
2014-12-20 11:04:14 -05:00
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
static void save_state()
|
2013-12-24 20:17:44 -05:00
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
f_cur_track.open(OPEN_WRITE);
|
2014-11-02 10:02:35 -05:00
|
|
|
f_cur_track << cur_track->index() << std::endl;
|
2014-06-01 17:52:49 -04:00
|
|
|
f_cur_track.close();
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
static void _load_track(Track *track, bool start_playback)
|
2013-12-24 20:17:44 -05:00
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
cur_track = track;
|
|
|
|
if (!track)
|
|
|
|
return;
|
2014-05-31 20:52:40 -04:00
|
|
|
|
2014-12-20 12:00:57 -05:00
|
|
|
cur_driver->load(track);
|
2014-06-01 17:52:49 -04:00
|
|
|
if (start_playback)
|
|
|
|
audio :: play();
|
|
|
|
else
|
|
|
|
audio :: pause();
|
|
|
|
save_state();
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
static bool continue_playback()
|
2013-12-24 20:17:44 -05:00
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
bool ret = true;
|
2013-12-24 20:17:44 -05:00
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
if (_pause_enabled) {
|
|
|
|
if (_pause_count == 0) {
|
|
|
|
ret = false;
|
|
|
|
_pause_enabled = false;
|
|
|
|
} else
|
|
|
|
_pause_count--;
|
|
|
|
}
|
2014-05-31 20:52:40 -04:00
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
return ret;
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2014-12-20 16:05:01 -05:00
|
|
|
|
|
|
|
|
|
|
|
AudioDriver :: AudioDriver()
|
|
|
|
{
|
|
|
|
cur_driver = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
AudioDriver :: ~AudioDriver()
|
|
|
|
{
|
|
|
|
cur_driver = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AudioDriver :: eos()
|
|
|
|
{
|
|
|
|
if (cur_track) {
|
|
|
|
cur_track->played();
|
|
|
|
library :: get_queue()->updated(cur_track);
|
|
|
|
}
|
|
|
|
|
|
|
|
_load_track(deck :: next(), continue_playback());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-12-20 10:16:44 -05:00
|
|
|
void audio :: init()
|
2014-04-01 21:00:30 -04:00
|
|
|
{
|
|
|
|
unsigned int id;
|
2014-06-01 17:52:49 -04:00
|
|
|
|
2014-04-01 21:00:30 -04:00
|
|
|
if (f_cur_track.exists()) {
|
|
|
|
f_cur_track.open(OPEN_READ);
|
|
|
|
f_cur_track >> id;
|
|
|
|
f_cur_track.close();
|
2014-12-02 08:16:22 -05:00
|
|
|
audio :: load_track(tags :: get_track(id));
|
2014-04-01 21:00:30 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-04 13:09:44 -05:00
|
|
|
void audio :: play()
|
2013-12-24 20:17:44 -05:00
|
|
|
{
|
2014-09-08 17:25:56 -04:00
|
|
|
if (cur_track)
|
2014-12-19 14:53:42 -05:00
|
|
|
cur_driver->play();
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2014-01-04 13:09:44 -05:00
|
|
|
void audio :: pause()
|
2013-12-24 20:17:44 -05:00
|
|
|
{
|
2014-09-10 08:24:34 -04:00
|
|
|
if (cur_track)
|
2014-12-19 14:53:42 -05:00
|
|
|
cur_driver->pause();
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2015-03-05 11:22:18 -05:00
|
|
|
void audio :: seek_to(int64_t pos)
|
2013-12-24 22:07:23 -05:00
|
|
|
{
|
2014-12-20 10:29:26 -05:00
|
|
|
if (cur_track)
|
|
|
|
cur_driver->seek_to(pos);
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
void audio :: stop()
|
2014-01-26 12:42:13 -05:00
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
pause();
|
|
|
|
seek_to(0);
|
2014-01-26 12:42:13 -05:00
|
|
|
}
|
|
|
|
|
2015-03-05 11:00:33 -05:00
|
|
|
int64_t audio :: position()
|
2013-12-24 22:07:23 -05:00
|
|
|
{
|
2014-12-20 10:29:26 -05:00
|
|
|
if (cur_track)
|
|
|
|
return cur_driver->position();
|
|
|
|
return 0;
|
2013-12-24 22:07:23 -05:00
|
|
|
}
|
|
|
|
|
2015-03-05 11:00:33 -05:00
|
|
|
int64_t audio :: duration()
|
2013-12-24 22:07:23 -05:00
|
|
|
{
|
2014-12-20 10:29:26 -05:00
|
|
|
if (cur_track)
|
|
|
|
return cur_driver->duration();
|
|
|
|
return 0;
|
2013-12-24 22:07:23 -05:00
|
|
|
}
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
void audio :: next()
|
2013-12-24 22:07:23 -05:00
|
|
|
{
|
2014-12-20 15:58:29 -05:00
|
|
|
_load_track(deck :: next(), cur_driver->is_playing());
|
2014-06-01 17:52:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void audio :: prev()
|
|
|
|
{
|
2014-12-20 15:58:29 -05:00
|
|
|
_load_track(deck :: prev(), cur_driver->is_playing());
|
2014-06-01 17:52:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void audio :: load_track(Track *track)
|
|
|
|
{
|
|
|
|
if (!track || track == cur_track)
|
|
|
|
return;
|
|
|
|
|
2014-12-19 14:53:42 -05:00
|
|
|
_load_track(track, cur_driver->is_playing());
|
2014-06-01 17:52:49 -04:00
|
|
|
deck :: get_queue()->add(cur_track);
|
|
|
|
}
|
|
|
|
|
|
|
|
Track *audio :: current_track()
|
|
|
|
{
|
|
|
|
return cur_track;
|
2013-12-24 22:07:23 -05:00
|
|
|
}
|
2013-12-25 14:35:33 -05:00
|
|
|
|
|
|
|
void audio :: pause_after(bool enabled, unsigned int n)
|
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
if (n > _pause_count)
|
2014-01-24 09:20:08 -05:00
|
|
|
enabled = true;
|
|
|
|
|
2014-06-01 17:52:49 -04:00
|
|
|
_pause_enabled = enabled;
|
|
|
|
_pause_count = n;
|
2013-12-25 14:35:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
bool audio :: pause_enabled()
|
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
return _pause_enabled;
|
2013-12-25 14:35:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int audio :: pause_count()
|
|
|
|
{
|
2014-06-01 17:52:49 -04:00
|
|
|
return _pause_count;
|
2013-12-25 14:35:33 -05:00
|
|
|
}
|
2014-12-19 14:53:42 -05:00
|
|
|
|
2014-12-20 15:47:10 -05:00
|
|
|
AudioDriver *audio :: get_driver()
|
2014-12-19 14:53:42 -05:00
|
|
|
{
|
|
|
|
return cur_driver;
|
|
|
|
}
|