[gens-sdl] Connected the '--frequency', '--stereo', and '--mono' options.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Tue, 8 Sep 2015 05:02:30 +0000 (01:02 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Tue, 8 Sep 2015 05:02:30 +0000 (01:02 -0400)
EventLoop::run() now takes an Options object as a parameter.
This is used to get the audio frequency and stereo value,
which are passed to SdlHandler::init_audio().

SdlHandler::init_audio(): Added frequency and stereo parameters.

Options: Added an alias "--freq" for "--frequency".

src/gens-sdl/CrazyEffectLoop.cpp
src/gens-sdl/EmuLoop.cpp
src/gens-sdl/Options.cpp
src/gens-sdl/SdlHandler.cpp
src/gens-sdl/SdlHandler.hpp

index 842ed9e..0f5ed7f 100644 (file)
@@ -110,7 +110,7 @@ int CrazyEffectLoop::run(const Options *options)
        if (d->sdlHandler->init_video() < 0)
                return EXIT_FAILURE;
        // No audio here.
-       //if (d->sdlHandler->init_audio() < 0)
+       //if (d->sdlHandler->init_audio(options->sound_freq(), options->stereo()) < 0)
        //      return EXIT_FAILURE;
        d->vBackend = d->sdlHandler->vBackend();
 
index b3ab686..f531ec7 100644 (file)
@@ -606,7 +606,7 @@ int EmuLoop::run(const Options *options)
        d->sdlHandler = new SdlHandler();
        if (d->sdlHandler->init_video() < 0)
                return EXIT_FAILURE;
-       if (d->sdlHandler->init_audio() < 0)
+       if (d->sdlHandler->init_audio(options->sound_freq(), options->stereo()) < 0)
                return EXIT_FAILURE;
        d->vBackend = d->sdlHandler->vBackend();
 
index cd91454..e4297e9 100644 (file)
@@ -307,6 +307,18 @@ int Options::parse(int argc, const char *argv[])
                poptAddAlias(optCon, help_alias, 0);
        }
 
+       // popt: Alias '--freq' to '--frequency'.
+       // NOTE: freq_argv must be free()able, so it
+       // can't be static or allocated on the stack.
+       {
+               const char **freq_argv = (const char**)malloc(sizeof(const char*) * 2);
+               freq_argv[0] = "--frequency";
+               freq_argv[1] = NULL;
+               // TODO: Change all 0 chars to '\0'.
+               struct poptAlias freq_alias = {"freq", '\0', 1, freq_argv};
+               poptAddAlias(optCon, freq_alias, 0);
+       }
+
        // Process options.
        int c;
        while ((c = poptGetNextOpt(optCon)) >= 0) {
index 1cb1262..aecb19b 100644 (file)
@@ -46,6 +46,7 @@ SdlHandler::SdlHandler()
        , m_audioDevice(0)
        , m_audioBuffer(nullptr)
        , m_sampleSize(0)
+       , m_stereo(false)
        , m_segBuffer(nullptr)
        , m_segBufferLen(0)
        , m_segBufferSamples(0)
@@ -183,9 +184,11 @@ VBackend *SdlHandler::vBackend(void) const
 
 /**
  * Initialize SDL audio.
+ * @param freq Frequency.
+ * @param stereo If true, use stereo.
  * @return 0 on success; non-zero on error.
  */
-int SdlHandler::init_audio(void)
+int SdlHandler::init_audio(int freq, bool stereo)
 {
        SDL_AudioSpec wanted_spec, actual_spec;
 
@@ -204,9 +207,9 @@ int SdlHandler::init_audio(void)
 
        // Number of samples to buffer.
        // FIXME: Should be segment size, rounded up to pow2.
-       wanted_spec.freq        = 44100;
+       wanted_spec.freq        = freq;
        wanted_spec.format      = AUDIO_S16SYS;
-       wanted_spec.channels    = 2;
+       wanted_spec.channels    = (stereo ? 2 : 1);
        wanted_spec.samples     = 1024;
        wanted_spec.callback    = sdl_audio_callback;
        wanted_spec.userdata    = this;
@@ -227,13 +230,17 @@ int SdlHandler::init_audio(void)
        if (m_audioBuffer) {
                delete m_audioBuffer;
        }
-       // Buffer should be (SegLength * 4) + actual samples.
-       int samples = (SoundMgr::GetSegLength() * 4) + actual_spec.samples;
+
+       // Determine the sample size.
+       m_stereo = stereo;
+       m_sampleSize = (stereo ? 4 : 2);
+
+       // Buffer should be: (SegLength * m_sampleSize) + actual samples.
+       int samples = (SoundMgr::GetSegLength() * m_sampleSize) + actual_spec.samples;
        m_audioBuffer = new RingBuffer(samples);
 
        // Segment buffer.
        // Needed to convert "int32_t" to int16_t.
-       m_sampleSize = 4; // TODO: Move to RingBuffer?
        m_segBufferSamples = SoundMgr::GetSegLength();
        m_segBufferLen = m_segBufferSamples * m_sampleSize;
        m_segBuffer = (int16_t*)aligned_malloc(16, m_segBufferLen);
@@ -325,7 +332,12 @@ void SdlHandler::update_audio(void)
 
        // FIXME: If our buffer is too small, we'll lose
        // some of the audio.
-       int samples = SoundMgr::writeStereo(m_segBuffer, m_segBufferSamples);
+       int samples;
+       if (m_stereo) {
+               samples = SoundMgr::writeStereo(m_segBuffer, m_segBufferSamples);
+       } else {
+               samples = SoundMgr::writeMono(m_segBuffer, m_segBufferSamples);
+       }
 
        // Write to the ringbuffer.
        if (m_audioDevice > 0 && samples > 0) {
index 28787cd..6b9008f 100644 (file)
@@ -120,9 +120,11 @@ class SdlHandler {
 
                /**
                 * Initialize SDL audio.
+                * @param freq Frequency.
+                * @param stereo If true, use stereo.
                 * @return 0 on success; non-zero on error.
                 */
-               int init_audio(void);
+               int init_audio(int freq, bool stereo);
 
                /**
                 * Shut down SDL audio.
@@ -168,6 +170,7 @@ class SdlHandler {
                SDL_AudioDeviceID m_audioDevice;
                RingBuffer *m_audioBuffer;
                int m_sampleSize;
+               bool m_stereo;
 
                // Segment buffer.
                int16_t *m_segBuffer;