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>
|
2015-12-07 09:35:58 -05:00
|
|
|
extern "C" {
|
|
|
|
#include <core/collection.h>
|
2015-12-12 09:04:25 -05:00
|
|
|
#include <core/history.h>
|
2015-12-07 09:35:58 -05:00
|
|
|
}
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/deck.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
|
|
|
|
2015-10-24 19:34:45 -04:00
|
|
|
static struct track *cur_track = NULL;
|
2015-09-10 10:33:24 -04:00
|
|
|
static struct file f_cur_track;
|
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
|
|
|
{
|
2015-09-10 09:46:33 -04:00
|
|
|
file_open(&f_cur_track, OPEN_WRITE);
|
2015-11-12 08:41:46 -05:00
|
|
|
file_writef(&f_cur_track, "%u\n", cur_track->tr_dbe.dbe_index);
|
2015-09-10 09:12:48 -04:00
|
|
|
file_close(&f_cur_track);
|
2013-12-24 20:17:44 -05:00
|
|
|
}
|
|
|
|
|
2015-10-24 19:34:45 -04:00
|
|
|
static void _load_track(struct 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) {
|
2015-09-29 09:34:06 -04:00
|
|
|
track_played(cur_track);
|
2015-12-05 12:12:01 -05:00
|
|
|
queue_updated(collection_get_queue(), cur_track);
|
2014-12-20 16:05:01 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_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
|
|
|
|
2015-09-10 10:33:24 -04:00
|
|
|
file_init(&f_cur_track, "cur_track", 0);
|
2015-09-10 08:23:09 -04:00
|
|
|
if (file_exists(&f_cur_track)) {
|
2015-09-10 09:46:33 -04:00
|
|
|
file_open(&f_cur_track, OPEN_READ);
|
2015-10-08 11:16:38 -04:00
|
|
|
file_readf(&f_cur_track, "%u", &id);
|
2015-09-10 09:12:48 -04:00
|
|
|
file_close(&f_cur_track);
|
2015-09-28 15:54:21 -04:00
|
|
|
audio :: load_track(track_get(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());
|
2015-12-12 11:26:59 -05:00
|
|
|
if (cur_track)
|
|
|
|
history_add(cur_track);
|
2014-06-01 17:52:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void audio :: prev()
|
|
|
|
{
|
2015-12-12 11:26:59 -05:00
|
|
|
_load_track(history_prev(), cur_driver->is_playing());
|
2014-06-01 17:52:49 -04:00
|
|
|
}
|
|
|
|
|
2015-10-24 19:34:45 -04:00
|
|
|
void audio :: load_track(struct track *track)
|
2014-06-01 17:52:49 -04:00
|
|
|
{
|
|
|
|
if (!track || track == cur_track)
|
|
|
|
return;
|
|
|
|
|
2014-12-19 14:53:42 -05:00
|
|
|
_load_track(track, cur_driver->is_playing());
|
2015-12-12 09:46:29 -05:00
|
|
|
history_add(cur_track);
|
2014-06-01 17:52:49 -04:00
|
|
|
}
|
|
|
|
|
2015-10-24 19:34:45 -04:00
|
|
|
struct track *audio :: current_track()
|
2014-06-01 17:52:49 -04:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|