From fc015e6a34995cf42f991c9e005a425023f005d0 Mon Sep 17 00:00:00 2001 From: bruceperens Date: Wed, 23 Apr 2014 23:01:57 +0000 Subject: [PATCH] Write SSB transmit function. git-svn-id: https://svn.code.sf.net/p/freetel/code@1548 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/run.cpp | 48 +++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/freedv-server/source/run.cpp b/freedv-server/source/run.cpp index 55cb6c43..8cb79124 100644 --- a/freedv-server/source/run.cpp +++ b/freedv-server/source/run.cpp @@ -171,16 +171,13 @@ namespace FreeDV { // FIX: Implement soft squelch. if ( samples_to_demodulate > 0 && bytes_to_demodulate > 0 ) { - std::size_t bytes_demodulated = 0; - - bytes_demodulated = i->modem->demodulate16( + const std::size_t bytes_demodulated = i->modem->demodulate16( (const std::int16_t *)in_fifo.get( samples_to_demodulate * 2), codec_fifo.put(bytes_to_demodulate), bytes_to_demodulate, &samples_to_demodulate); - if ( bytes_demodulated > 0 ) codec_fifo.put_done(bytes_demodulated); @@ -213,9 +210,9 @@ namespace FreeDV { if ( out_samples > 0 ) { const int result = i->loudspeaker->write16( - (std::int16_t *)out_fifo.get( - out_samples * 2), - out_samples); + (std::int16_t *)out_fifo.get( + out_samples * 2), + out_samples); if ( result > 0 ) out_fifo.get_done(result * 2); @@ -474,9 +471,7 @@ namespace FreeDV { const std::size_t samples_to_modulate = out_fifo.put_space() / 2; if ( bytes_to_modulate > 0 && samples_to_modulate > 0 ) { - std::size_t samples_modulated = 0; - - samples_modulated = i->modem->modulate16( + const std::size_t samples_modulated = i->modem->modulate16( codec_fifo.get(bytes_to_modulate), (std::int16_t *)out_fifo.put(samples_to_modulate * 2), &bytes_to_modulate, @@ -509,8 +504,39 @@ namespace FreeDV { void Run::transmit_ssb() { - } + // Fill any data that the microphone can provide. + const std::size_t in_samples = min( + i->microphone->ready(), + (in_fifo.put_space() / 2)); + + if ( in_samples > 0 ) { + const int result = i->microphone->read16( + (std::int16_t *)in_fifo.put(in_samples * 2), + in_samples); + + if ( result > 0 ) + in_fifo.put_done(result * 2); + else if ( result < 0 ) + std::cerr << "Microphone I/O error: " << strerror(errno) << std::endl; + } + + // Drain any data that the transmitter can take. + const std::size_t out_samples = min( + i->transmitter->ready(), + (in_fifo.get_available() / 2)); + if ( out_samples > 0 ) { + const int result = i->transmitter->write16( + (std::int16_t *)in_fifo.get(out_samples * 2), + out_samples); + + if ( result > 0 ) + in_fifo.get_done(result * 2); + else if ( result < 0 ) + std::cerr << "Transmitter I/O error: " << strerror(errno) << std::endl; + } + } + void Run::un_key() { -- 2.25.1