From 13dfc70d91905ea76b7ade0edad2c7aa736acd28 Mon Sep 17 00:00:00 2001 From: bruceperens Date: Wed, 28 May 2014 19:01:08 +0000 Subject: [PATCH] More fixes for audio output overrun. git-svn-id: https://svn.code.sf.net/p/freetel/code@1602 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/codec2.cpp | 2 +- freedv-server/source/drivers.h | 10 +++++----- freedv-server/source/platform/linux/alsa.cpp | 19 +++++++++++-------- .../source/platform/linux/audio_in_alsa.cpp | 2 +- freedv-server/source/run.cpp | 3 ++- freedv-server/source/tone.cpp | 4 ++-- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/freedv-server/source/codec2.cpp b/freedv-server/source/codec2.cpp index 44c5c0f3..e1b0bd12 100644 --- a/freedv-server/source/codec2.cpp +++ b/freedv-server/source/codec2.cpp @@ -163,7 +163,7 @@ namespace FreeDV { static std::ostream & Codec2Enumerator(std::ostream & stream) { - stream << "\"codec2:1400\" (1200,1300,1400,1600,2400,3200)" << std::endl; + stream << "\"codec2:1600\" (1200,1300,1400,1600,2400,3200)" << std::endl; return stream; } diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index a8a233a6..0682e5b8 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -59,21 +59,21 @@ const unsigned int SampleRate = 48000; /// const unsigned int SamplesPerMillisecond = ((double)SampleRate / 1000.0); -/// The audio frame duration in milliseconds. The audio interfaces will -/// use this as a period size. It should be 1/2 of the smallest codec frame -/// size we expect to use. -const unsigned int AudioFrameDuration = 10; /// The number of audio samples in an audio frame. Audio frames must be a /// power of two (this is a common hardware requirement) and must be shorter /// than any codec/modem frame in the program. const unsigned int AudioFrameSamples = 512; +/// The audio frame duration in milliseconds. The audio interfaces will +/// use this as a period size. +const unsigned int AudioFrameDuration = ((double)SampleRate / (double)AudioFrameSamples); + /// The number of audio samples in the maximum-duration frame. /// This must be a power of two (this is a common hardware requirement) and /// must be at least twice the value of AudioFrameSamples. /// -const unsigned int MaximumFrameSamples = 32768; +const unsigned int MaximumFrameSamples = AudioFrameSamples * 2; /// Allocate memory and copy a string into it, so that it is permanently /// stored. diff --git a/freedv-server/source/platform/linux/alsa.cpp b/freedv-server/source/platform/linux/alsa.cpp index 5ce142d2..e38c46a8 100644 --- a/freedv-server/source/platform/linux/alsa.cpp +++ b/freedv-server/source/platform/linux/alsa.cpp @@ -233,15 +233,18 @@ namespace FreeDV { error = open_by_longname(&handle, name, stream, mode); if ( error < 0 ) { - error = snd_pcm_open( - &handle, - name, - stream, - mode); - - if ( error < 0 ) - return 0; + if ( strcmp(name, "default") == 0 + || strncmp(name, "hw:", 3) == 0 + || strncmp(name, "plughw:", 7) == 0 ) { + error = snd_pcm_open( + &handle, + name, + stream, + mode); + } } + if ( error < 0 ) + return 0; try { if ( (error = snd_pcm_hw_params_malloc(&hw_params)) < 0 ) diff --git a/freedv-server/source/platform/linux/audio_in_alsa.cpp b/freedv-server/source/platform/linux/audio_in_alsa.cpp index 0bd9174d..e5a194f6 100644 --- a/freedv-server/source/platform/linux/audio_in_alsa.cpp +++ b/freedv-server/source/platform/linux/audio_in_alsa.cpp @@ -23,7 +23,7 @@ namespace FreeDV { /// class AudioInALSA : public AudioInput { private: - static const int overlong_delay = AudioFrameSamples * 4; + static const int overlong_delay = AudioFrameSamples * 8; snd_pcm_t * handle; char * const parameters; diff --git a/freedv-server/source/run.cpp b/freedv-server/source/run.cpp index 46e25b46..52231027 100644 --- a/freedv-server/source/run.cpp +++ b/freedv-server/source/run.cpp @@ -363,6 +363,7 @@ namespace FreeDV { } if ( out_fifo.get_available() > 0 ) { + // std::cerr << out_fifo.get_available() / 2 << ' '; // There are samples queued for the loudspeaker. Wake when there is room // in its buffer. if ( output_fd_base < 0 ) { @@ -441,7 +442,7 @@ namespace FreeDV { struct timespec request; struct timespec remainder; request.tv_sec = 0; - request.tv_nsec = AudioFrameDuration * 1000000; + request.tv_nsec = AudioFrameDuration * 1000000; nanosleep(&request, &remainder); } diff --git a/freedv-server/source/tone.cpp b/freedv-server/source/tone.cpp index 12e4aac3..d2c66c26 100644 --- a/freedv-server/source/tone.cpp +++ b/freedv-server/source/tone.cpp @@ -17,7 +17,7 @@ namespace FreeDV { /// class Tone : public AudioInput { private: - unsigned int clock; + unsigned long long clock; struct tone_info { float frequency; @@ -133,7 +133,7 @@ namespace FreeDV { value * master_amplitude * ((1 << 15) - 1)); array[i] = v; } - clock = (clock + length) % SampleRate; + clock = (clock + length); return length; } -- 2.25.1