driver: Create an audio driver class
The driver is used to select between gstreamer playback and a fake playback mode used only when testing. Currently the GSTDriver has empty functions. It will be implemented as the audio.cpp file is updated. Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
f8f389c7ed
commit
edc4a2f4ee
62
DESIGN
62
DESIGN
|
@ -1299,6 +1299,68 @@ Deck:
|
||||||
Return the RecentQueue to the caller.
|
Return the RecentQueue to the caller.
|
||||||
|
|
||||||
|
|
||||||
|
Audio Driver:
|
||||||
|
The audio driver creates a way to fake audio playback for testing. This
|
||||||
|
will allow for more accurate tests, since I will know in advance what
|
||||||
|
values are returned to the Audio layer. This layer will derive from
|
||||||
|
the Driver class to implement either the GSTDriver or the TestDriver.
|
||||||
|
|
||||||
|
- Driver:
|
||||||
|
class Driver {
|
||||||
|
protected:
|
||||||
|
void (*on_eos)();
|
||||||
|
|
||||||
|
public:
|
||||||
|
Driver();
|
||||||
|
~Driver();
|
||||||
|
virtual void init(int *, char ***, void (*)()) = 0;
|
||||||
|
|
||||||
|
virtual void load(const std::string &) = 0;
|
||||||
|
virtual void play() = 0;
|
||||||
|
virtual void pause() = 0;
|
||||||
|
|
||||||
|
virtual void seek_to(long) = 0;
|
||||||
|
virtual long position() = 0;
|
||||||
|
virtual long duration() = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
- Driver API:
|
||||||
|
void Driver :: Driver();
|
||||||
|
Initialize the audio driver. This involves setting up a GST
|
||||||
|
Bus in the GSTDriver case.
|
||||||
|
|
||||||
|
void Driver :: ~Driver();
|
||||||
|
In the GSTDriver case, call gst_deinit() to avoid memory leak
|
||||||
|
false positives.
|
||||||
|
|
||||||
|
void Driver :: init(int argc, char **argv, void (*eos_cb)());
|
||||||
|
The GSTDriver will use this function to set up the playbin2.
|
||||||
|
When an end-of-stream message is received, call eos_cb().
|
||||||
|
|
||||||
|
void Driver :: load(const std::string &file);
|
||||||
|
Load file for playback, but do not begin playback yet.
|
||||||
|
|
||||||
|
void Driver :: play();
|
||||||
|
Start playback.
|
||||||
|
|
||||||
|
void Driver :: pause();
|
||||||
|
Pause playback.
|
||||||
|
|
||||||
|
void Driver :: seek_to(long pos);
|
||||||
|
Change playback position in the current track in nanoseconds.
|
||||||
|
|
||||||
|
long Driver :: position();
|
||||||
|
Return the current position in the track in nanoseconds.
|
||||||
|
|
||||||
|
long Driver :: duration();
|
||||||
|
Return the duration of the track in nanoseconds.
|
||||||
|
|
||||||
|
- API:
|
||||||
|
Driver *driver :: get_driver();
|
||||||
|
Return the current driver to be used for audio playback. This
|
||||||
|
could be either the GSTDriver or the TestDriver depending on
|
||||||
|
if CONFIG_TEST is set when compiling.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 (c) Anna Schumaker.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class Driver {
|
||||||
|
protected:
|
||||||
|
void (*on_eos)();
|
||||||
|
|
||||||
|
public:
|
||||||
|
Driver();
|
||||||
|
~Driver();
|
||||||
|
virtual void init(int *, char ***, void (*)()) = 0;
|
||||||
|
|
||||||
|
virtual void load(const std::string &) = 0;
|
||||||
|
virtual void play() = 0;
|
||||||
|
virtual void pause() = 0;
|
||||||
|
|
||||||
|
virtual void seek_to(long) = 0;
|
||||||
|
virtual long position() = 0;
|
||||||
|
virtual long duration() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_TEST
|
||||||
|
class TestDriver : public Driver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool playing;
|
||||||
|
long cur_pos;
|
||||||
|
long cur_duration;
|
||||||
|
std::string cur_file;
|
||||||
|
|
||||||
|
TestDriver();
|
||||||
|
~TestDriver();
|
||||||
|
void init(int *, char ***, void (*)());
|
||||||
|
|
||||||
|
void load(const std::string &);
|
||||||
|
void play();
|
||||||
|
void pause();
|
||||||
|
|
||||||
|
void seek_to(long);
|
||||||
|
long position();
|
||||||
|
long duration();
|
||||||
|
|
||||||
|
void eos();
|
||||||
|
};
|
||||||
|
#else /* CONFIG_TEST */
|
||||||
|
class GSTDriver : public Driver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GSTDriver();
|
||||||
|
~GSTDriver();
|
||||||
|
void init(int *, char ***, void (*)());
|
||||||
|
|
||||||
|
void load(const std::string &);
|
||||||
|
void play();
|
||||||
|
void pause();
|
||||||
|
|
||||||
|
void seek_to(long);
|
||||||
|
long position();
|
||||||
|
long duration();
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_TEST */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace driver
|
||||||
|
{
|
||||||
|
|
||||||
|
Driver *get_driver();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 (c) Anna Schumaker.
|
||||||
|
*/
|
||||||
|
#include <driver.h>
|
||||||
|
|
||||||
|
|
||||||
|
Driver :: Driver() {}
|
||||||
|
Driver :: ~Driver() {}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_TEST
|
||||||
|
|
||||||
|
TestDriver :: TestDriver() : playing(false), cur_pos(0), cur_duration(0) {}
|
||||||
|
TestDriver :: ~TestDriver() {}
|
||||||
|
|
||||||
|
void TestDriver :: init(int *argc, char ***argv, void (*eos_cb)()) { on_eos = eos_cb; }
|
||||||
|
void TestDriver :: load(const std::string &file) { cur_file = file; }
|
||||||
|
void TestDriver :: play() { playing = true; }
|
||||||
|
void TestDriver :: pause() { playing = false; }
|
||||||
|
|
||||||
|
void TestDriver :: seek_to(long pos) { cur_pos = pos; }
|
||||||
|
long TestDriver :: position() { return cur_pos; }
|
||||||
|
long TestDriver :: duration() { return cur_duration; }
|
||||||
|
|
||||||
|
void TestDriver :: eos() { on_eos(); }
|
||||||
|
|
||||||
|
#else /* CONFIG_TEST */
|
||||||
|
|
||||||
|
GSTDriver :: GSTDriver() {}
|
||||||
|
GSTDriver :: ~GSTDriver() {}
|
||||||
|
|
||||||
|
void GSTDriver :: init(int argc, char **argv, void (*eos_cb)()) { }
|
||||||
|
void GSTDriver :: load(const std::string &file) { }
|
||||||
|
void GSTDriver :: play() { }
|
||||||
|
void GSTDriver :: pause() { }
|
||||||
|
|
||||||
|
void GSTDriver :: seek_to(long pos) { }
|
||||||
|
long GSTDriver :: position() { return 0; }
|
||||||
|
long GSTDriver :: duration() { return 0; }
|
||||||
|
|
||||||
|
#endif /* CONFIG_TEST */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_TEST
|
||||||
|
static TestDriver cur_driver;
|
||||||
|
#else /* CONFIG_TEST */
|
||||||
|
static GSTDriver cur_driver;
|
||||||
|
#endif /* CONFIG_TEST */
|
||||||
|
|
||||||
|
|
||||||
|
Driver *driver :: get_driver()
|
||||||
|
{
|
||||||
|
return &cur_driver;
|
||||||
|
}
|
|
@ -10,3 +10,4 @@ queue
|
||||||
library
|
library
|
||||||
playlist
|
playlist
|
||||||
deck
|
deck
|
||||||
|
driver
|
||||||
|
|
|
@ -21,6 +21,7 @@ tests = [
|
||||||
("library.cpp", True, [ "idle.cpp" ], []),
|
("library.cpp", True, [ "idle.cpp" ], []),
|
||||||
("playlist.cpp", True, [], []),
|
("playlist.cpp", True, [], []),
|
||||||
("deck.cpp", True, [], []),
|
("deck.cpp", True, [], []),
|
||||||
|
("driver.cpp", False, [ "driver.cpp" ], []),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 (c) Anna Schumaker.
|
||||||
|
*/
|
||||||
|
#include <driver.h>
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
|
static TestDriver *DRIVER_NULL = NULL;
|
||||||
|
static unsigned int eos_count = 0;
|
||||||
|
|
||||||
|
void on_eos()
|
||||||
|
{
|
||||||
|
eos_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_driver()
|
||||||
|
{
|
||||||
|
TestDriver *driver = (TestDriver *)driver :: get_driver();
|
||||||
|
const std::string file = "/home/Zelda/Music/Wind Waker/1 - Outset Isle.ogg";
|
||||||
|
|
||||||
|
test_not_equal(driver, DRIVER_NULL);
|
||||||
|
|
||||||
|
driver->init(0, NULL, on_eos);
|
||||||
|
|
||||||
|
driver->load(file);
|
||||||
|
test_equal(driver->cur_file, file);
|
||||||
|
|
||||||
|
driver->play();
|
||||||
|
test_equal(driver->playing, true);
|
||||||
|
driver->pause();
|
||||||
|
test_equal(driver->playing, false);
|
||||||
|
|
||||||
|
driver->seek_to(4242);
|
||||||
|
test_equal(driver->cur_pos, (long)4242);
|
||||||
|
test_equal(driver->position(), (long)4242);
|
||||||
|
|
||||||
|
driver->cur_duration = 424242;
|
||||||
|
test_equal(driver->duration(), (long)424242);
|
||||||
|
|
||||||
|
driver->eos();
|
||||||
|
test_equal(eos_count, (unsigned)1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
run_test("Test Audio Driver", test_driver);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue