core/audio: Move audio_eos() out of the AudioDriver

This change lets me remove the AudioDriver, too.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-12-16 15:27:23 -05:00
parent 276c56406a
commit a5556ac10a
4 changed files with 29 additions and 97 deletions

View File

@ -16,8 +16,6 @@ static GstElement *audio_player = NULL;
static struct audio_ops *audio_ops = NULL;
static int audio_pause_count = -1;
static AudioDriver *cur_driver = NULL;
static void __audio_save()
{
@ -56,46 +54,17 @@ static bool __audio_load(struct track *track, GstState state)
return true;
}
static GstState continue_playback()
static struct track *__audio_next(GstState state)
{
if (audio_pause_count >= 0) {
audio_pause_after(audio_pause_count - 1);
if (audio_pause_count == -1)
return GST_STATE_PAUSED;
}
return GST_STATE_PLAYING;
}
AudioDriver :: AudioDriver()
{
cur_driver = this;
}
AudioDriver :: ~AudioDriver()
{
cur_driver = NULL;
}
void AudioDriver :: eos()
{
struct track *track;
if (audio_track) {
track_played(audio_track);
queue_updated(collection_get_queue(), audio_track);
}
track = tempq_next();
struct track *track = tempq_next();
if (!track)
track = queue_next(collection_get_queue());
if (__audio_load(track, continue_playback()))
if (__audio_load(track, state))
history_add(track);
return track;
}
void audio_init(int *argc, char ***argv, struct audio_ops *ops)
{
unsigned int track;
@ -115,7 +84,7 @@ void audio_init(int *argc, char ***argv, struct audio_ops *ops)
void audio_deinit()
{
gst_element_set_state(audio_player, GST_STATE_NULL);
gst_object_unref(audio_player);
gst_object_unref(GST_ELEMENT(audio_player));
audio_player = NULL;
audio_track = NULL;
@ -203,12 +172,7 @@ int64_t audio_duration()
struct track *audio_next()
{
struct track *track = tempq_next();
if (!track)
track = queue_next(collection_get_queue());
if (__audio_load(track, audio_cur_state()))
history_add(audio_track);
return track;
return __audio_next(audio_cur_state());
}
struct track *audio_prev()
@ -218,6 +182,23 @@ struct track *audio_prev()
return track;
}
struct track *audio_eos()
{
/* Mark current track as played */
if (audio_track) {
track_played(audio_track);
queue_updated(collection_get_queue(), audio_track);
}
/* Check pause count and pick the next track */
if (audio_pause_count >= 0) {
audio_pause_after(audio_pause_count - 1);
if (audio_pause_count == -1)
return __audio_next(GST_STATE_PAUSED);
}
return __audio_next(GST_STATE_PLAYING);
}
void audio_pause_after(int n)
{
if (n != audio_pause_count) {
@ -226,11 +207,6 @@ void audio_pause_after(int n)
}
}
AudioDriver *audio :: get_driver()
{
return cur_driver;
}
GstElement *audio_get_player()
{
return audio_player;

View File

@ -80,8 +80,6 @@ static void on_config_pause(int n)
}
class GSTDriver : public AudioDriver {} gst_driver;
struct audio_ops audio_ops = {
on_load,
on_config_pause,
@ -119,8 +117,7 @@ static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data)
gst :: play();
break;
case GST_MESSAGE_EOS:
gst_driver.eos();
break;
audio_eos();
default:
break;
}

View File

@ -21,37 +21,6 @@ struct audio_ops {
};
/**
* The audio driver class gives us an interface for using multiple
* audio frameworks for audio playback.
*/
class AudioDriver {
public:
AudioDriver(); /**< Default AudioDriver constructor. */
virtual ~AudioDriver(); /**< AudioDriver destructor. */
/**
* Called to handle reaching the end-of-stream.
*/
void eos();
};
/**
* Namespace for higher-level audio controls.
*/
namespace audio
{
/**
* Called to access an audio driver.
*
* @return The current driver used by the application.
*/
AudioDriver *get_driver();
};
/* Called to initialize the audio manager. */
void audio_init(int *, char ***, struct audio_ops *);
@ -94,6 +63,9 @@ struct track *audio_next();
/* Called to load the previous track. */
struct track *audio_prev();
/* Called when playback has reached the end-of-stream position. */
struct track *audio_eos();
/* Called to configure automatic pausing. */
void audio_pause_after(int);

View File

@ -11,7 +11,6 @@ extern "C" {
#include <core/core.h>
#include "test.h"
struct track *TRACK_NULL = NULL;
static unsigned int load_count = 0;
static int pause_count = 0;
@ -26,17 +25,6 @@ static bool test_audio_seek(gint64 pos)
return ret;
}
class TestDriver : public AudioDriver
{
public:
bool playing;
std::string cur_file;
TestDriver() : playing(false) {}
~TestDriver() {};
bool is_playing() { return playing; }
} driver;
static void test_audio_load(struct track *track, GstState state)
{
load_count++;
@ -196,7 +184,6 @@ static void test_prev()
void test_autopause()
{
TestDriver *driver = (TestDriver *)audio :: get_driver();
struct queue *history_q = history_get_queue();
int i;
@ -214,13 +201,13 @@ void test_autopause()
test_equal(pause_count, 5);
for (i = 4; i > -1; i--) {
driver->eos();
audio_eos();
test_loop_equal(pause_count, i, i);
test_loop_equal(audio_cur_state(), GST_STATE_PLAYING, i);
test_loop_equal(queue_at(history_q, 0), audio_cur_track(), i);
} test_loop_passed();
driver->eos();
audio_eos();
test_equal(pause_count, -1);
test_not_equal(audio_cur_state(), GST_STATE_PLAYING);
}