From 0757761ab0654219e18f416d38886b8ae619a071 Mon Sep 17 00:00:00 2001 From: bruceperens Date: Sun, 9 Mar 2014 22:07:21 +0000 Subject: [PATCH] Connect ready() to ALSA. Fix pedantic bug in alsa.cpp . git-svn-id: https://svn.code.sf.net/p/freetel/code@1421 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/platform/linux/alsa.cpp | 2 +- .../source/platform/linux/audio_in_alsa.cpp | 16 +++++++++++----- .../source/platform/linux/audio_out_alsa.cpp | 15 +++++++++++---- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/freedv-server/source/platform/linux/alsa.cpp b/freedv-server/source/platform/linux/alsa.cpp index 792c3d4e..5dface70 100644 --- a/freedv-server/source/platform/linux/alsa.cpp +++ b/freedv-server/source/platform/linux/alsa.cpp @@ -70,4 +70,4 @@ namespace FreeDV { return stream; } -}; +} diff --git a/freedv-server/source/platform/linux/audio_in_alsa.cpp b/freedv-server/source/platform/linux/audio_in_alsa.cpp index 808136e0..084581f4 100644 --- a/freedv-server/source/platform/linux/audio_in_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_in_alsa.cpp @@ -2,6 +2,7 @@ #include "drivers.h" #include +#include #include #include @@ -15,12 +16,12 @@ namespace FreeDV { public: - /// Instantiate the audio sink. + /// Instantiate the ALSA audio input. AudioInALSA(const char * parameters); ~AudioInALSA(); - /// Return the number of audio samples the device can handle in - /// a write without blocking. + /// Return the number of audio samples the device can provide in + /// a read without blocking. virtual std::size_t ready(); @@ -48,9 +49,9 @@ namespace FreeDV { AudioInALSA::~AudioInALSA() { + snd_pcm_close(handle); } - // Read audio into the "short" type. std::size_t AudioInALSA::read16(std::int16_t * array, std::size_t length) { @@ -72,7 +73,12 @@ namespace FreeDV { std::size_t AudioInALSA::ready() { - return SIZE_MAX; + snd_pcm_sframes_t available = 0; + + if ( (available = snd_pcm_avail(handle)) <= 0 ) + return available; + else + return 0; } static bool diff --git a/freedv-server/source/platform/linux/audio_out_alsa.cpp b/freedv-server/source/platform/linux/audio_out_alsa.cpp index af12e0c0..623dd234 100644 --- a/freedv-server/source/platform/linux/audio_out_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_out_alsa.cpp @@ -2,20 +2,21 @@ #include "drivers.h" #include +#include #include #include namespace FreeDV { std::ostream & ALSAEnumerate(std::ostream & stream, snd_pcm_stream_t mode); - /// Audio output "sink", discards the audio, for testing. + /// Audio output "ALSA", Uses the Linux ALSA Audio API. class AudioOutALSA : public AudioOutput { private: snd_pcm_t * handle; public: - /// Instantiate the audio sink. + /// Instantiate the audio output. AudioOutALSA(const char * parameters); ~AudioOutALSA(); @@ -24,7 +25,7 @@ namespace FreeDV { virtual std::size_t ready(); - /// Write audio into the "short" type. + /// Write audio from the "short" type. virtual std::size_t write16(const std::int16_t * array, std::size_t length); }; @@ -48,6 +49,7 @@ namespace FreeDV { AudioOutALSA::~AudioOutALSA() { + snd_pcm_close(handle); } // Write audio into the "short" type. @@ -72,7 +74,12 @@ namespace FreeDV { std::size_t AudioOutALSA::ready() { - return SIZE_MAX; + snd_pcm_sframes_t available = 0; + + if ( (available = snd_pcm_avail(handle)) <= 0 ) + return available; + else + return 0; } static bool -- 2.25.1