From d3dd4224463d954691048c3a8ffb64a7e599117f Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Fri, 10 Jul 2009 14:43:54 +0000 Subject: [PATCH] AmAudio device for playing/sinking silence, optionally a certain length git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1464 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- core/AmAdvancedAudio.cpp | 51 ++++++++++++++++++++++++++++++++++++++++ core/AmAdvancedAudio.h | 34 +++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/core/AmAdvancedAudio.cpp b/core/AmAdvancedAudio.cpp index 106402cc..5fa6c5b9 100644 --- a/core/AmAdvancedAudio.cpp +++ b/core/AmAdvancedAudio.cpp @@ -279,3 +279,54 @@ int AmAudioFrontlist::get(unsigned int user_ts, unsigned char* buffer, unsigned ba_mut.unlock(); return res; } + + +int AmNullAudio::write(unsigned int user_ts, unsigned int size) { + // need to stop at some point? + if (write_msec < 0) + return size; + + if (!write_end_ts_i) { + write_end_ts_i = true; + write_end_ts = user_ts + write_msec*fmt->rate/1000; + } + + if (!ts_less()(user_ts, write_end_ts)) { + DBG("%dms of silence ended (write)\n", write_msec); + return -1; + } + + return size; +} + +int AmNullAudio::read(unsigned int user_ts, unsigned int size) { + // need to stop at some point? + if (read_msec < 0) { + memset((unsigned char*) samples, 0, size); + return size; + } + + if (!read_end_ts_i) { + read_end_ts_i = true; + read_end_ts = user_ts + read_msec*fmt->rate/1000; + } + + if (!ts_less()(user_ts, read_end_ts)) { + DBG("%dms of silence ended (read)\n", read_msec); + return -1; + } + + memset((unsigned char*) samples, 0, size); + return size; +} + +void AmNullAudio::setReadLength(int n_msec) { + read_msec = n_msec; + read_end_ts_i = false; +} + +void AmNullAudio::setWriteLength(int n_msec) { + write_msec = n_msec; + write_end_ts_i = false; +} + diff --git a/core/AmAdvancedAudio.h b/core/AmAdvancedAudio.h index 97e022d6..d97c6efd 100644 --- a/core/AmAdvancedAudio.h +++ b/core/AmAdvancedAudio.h @@ -143,5 +143,39 @@ class AmAudioDelay : public AmAudio { int read(unsigned int user_ts, unsigned int size); }; +/** + * AmNullAudio plays silence, and recording goes to void. + * it can be parametrized with a maximum length (in milliseconds), + * after which it is ended. + * Read and write length can also be set after creation (and possibly even + * when in use). + */ +class AmNullAudio +: public AmAudio { + int read_msec; + int write_msec; + + bool read_end_ts_i; + unsigned int read_end_ts; + + bool write_end_ts_i; + unsigned int write_end_ts; + + public: + AmNullAudio(int read_msec = -1, int write_msec = -1) + : read_msec(read_msec), write_msec(write_msec), + read_end_ts_i(false), write_end_ts_i(false) { } + ~AmNullAudio() { } + + /** (re) set maximum read length*/ + void setReadLength(int n_msec); + /** (re) set maximum write length*/ + void setWriteLength(int n_msec); + + protected: + int write(unsigned int user_ts, unsigned int size); + int read(unsigned int user_ts, unsigned int size); +}; + #endif // _AmAdvancedAudio_h_