summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AlsaDabplus.cpp100
-rw-r--r--src/AlsaInput.cpp2
-rw-r--r--src/SampleQueue.h8
3 files changed, 69 insertions, 41 deletions
diff --git a/src/AlsaDabplus.cpp b/src/AlsaDabplus.cpp
index ea81bda..50dcddc 100644
--- a/src/AlsaDabplus.cpp
+++ b/src/AlsaDabplus.cpp
@@ -160,7 +160,6 @@ int prepare_aac_encoder(
int main(int argc, char *argv[]) {
int subchannel_index = 8; //64kbps subchannel
int ch=0;
- int err;
const char *alsa_device = "default";
const char *outuri = NULL;
int sample_rate=48000, channels=2;
@@ -238,16 +237,25 @@ int main(int argc, char *argv[]) {
return 1;
}
- fprintf(stderr, "DAB+ Encoding: framelen=%d\n", info.frameLength);
-
// Each DAB+ frame will need input_size audio bytes
- int input_size = channels * bytes_per_sample * info.frameLength;
+ const int input_size = channels * bytes_per_sample * info.frameLength;
+ fprintf(stderr, "DAB+ Encoding: framelen=%d (%dB)\n",
+ info.frameLength,
+ input_size);
+
uint8_t input_buf[input_size];
int max_size = input_size + NUM_SAMPLES_PER_CALL;
SampleQueue<uint8_t> queue(BYTES_PER_SAMPLE, channels, max_size);
+ /* symsize=8, gfpoly=0x11d, fcr=0, prim=1, nroots=10, pad=135 */
+ rs_handler = init_rs_char(8, 0x11d, 0, 1, 10, 135);
+ if (rs_handler == NULL) {
+ perror("init_rs_char failed");
+ return 1;
+ }
+
AlsaInput alsa_in(alsa_device, channels, sample_rate, queue);
if (alsa_in.prepare() != 0) {
@@ -277,6 +285,7 @@ int main(int argc, char *argv[]) {
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
+ int calls;
while (1) {
int in_identifier = IN_AUDIO_DATA;
int out_identifier = OUT_BITSTREAM_DATA;
@@ -299,7 +308,7 @@ int main(int argc, char *argv[]) {
// -------------- AAC Encoding
in_ptr = input_buf;
- in_size = input_size;
+ in_size = read;
in_elem_size = BYTES_PER_SAMPLE;
in_args.numInSamples = input_size;
in_buf.numBufs = 1;
@@ -317,6 +326,7 @@ int main(int argc, char *argv[]) {
out_buf.bufSizes = &out_size;
out_buf.bufElSizes = &out_elem_size;
+ AACENC_ERROR err;
if ((err = aacEncEncode(encoder, &in_buf, &out_buf, &in_args, &out_args))
!= AACENC_OK) {
if (err == AACENC_ENCODE_EOF)
@@ -324,59 +334,69 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "Encoding failed\n");
break;
}
- if (out_args.numOutBytes == 0)
- continue;
-
- // ----------- RS encoding
- int row, col;
- unsigned char buf_to_rs_enc[110];
- unsigned char rs_enc[10];
- for(row=0; row < subchannel_index; row++) {
- for(col=0;col < 110; col++) {
- buf_to_rs_enc[col] = outbuf[subchannel_index * col + row];
- }
- encode_rs_char(rs_handler, buf_to_rs_enc, rs_enc);
+ calls++;
- for(col=110; col<120; col++) {
- outbuf[subchannel_index * col + row] = rs_enc[col-110];
- assert(subchannel_index * col + row < outbuf_size);
+ /* Check if the encoder has generated output data */
+ if (out_args.numOutBytes != 0)
+ {
+ fprintf(stderr, "data out after %d calls\n", calls);
+ calls = 0;
+ // ----------- RS encoding
+ int row, col;
+ unsigned char buf_to_rs_enc[110];
+ unsigned char rs_enc[10];
+ for(row=0; row < subchannel_index; row++) {
+ for(col=0;col < 110; col++) {
+ buf_to_rs_enc[col] = outbuf[subchannel_index * col + row];
+ }
+
+ encode_rs_char(rs_handler, buf_to_rs_enc, rs_enc);
+
+ for(col=110; col<120; col++) {
+ outbuf[subchannel_index * col + row] = rs_enc[col-110];
+ assert(subchannel_index * col + row < outbuf_size);
+ }
}
- }
- // ------------ ZeroMQ transmit
- try {
- zmq_sock.send(outbuf, outbuf_size, ZMQ_DONTWAIT);
- }
- catch (zmq::error_t& e) {
- fprintf(stderr, "ZeroMQ send error !\n");
- send_error_count ++;
- }
+ // ------------ ZeroMQ transmit
+ try {
+ zmq_sock.send(outbuf, outbuf_size, ZMQ_DONTWAIT);
+ }
+ catch (zmq::error_t& e) {
+ fprintf(stderr, "ZeroMQ send error !\n");
+ send_error_count ++;
+ }
- if (send_error_count > 10)
- {
- fprintf(stderr, "ZeroMQ send failed ten times, aborting!\n");
- break;
- }
+ if (send_error_count > 10)
+ {
+ fprintf(stderr, "ZeroMQ send failed ten times, aborting!\n");
+ break;
+ }
- if (out_args.numOutBytes + row*10 == outbuf_size)
- fprintf(stderr, ".");
+ if (out_args.numOutBytes + row*10 == outbuf_size)
+ fprintf(stderr, ".");
+ }
- // -------------- wait 120ms (one DAB+ superframe)
- tp.tv_nsec += 120000000;
+ // -------------- wait the right amount of time
+ tp.tv_nsec += 60000000;
if (tp.tv_nsec > 1000000000L) {
tp.tv_nsec -= 1000000000L;
tp.tv_sec += 1;
}
+ fprintf(stderr, "sleep %ld.%ld\n", tp.tv_sec, tp.tv_nsec);
struct timespec tp_now;
do {
- usleep(10000);
- clock_gettime(CLOCK_MONOTONIC, &tp);
+ usleep(1000);
+ clock_gettime(CLOCK_MONOTONIC, &tp_now);
} while (tp_now.tv_sec < tp.tv_sec ||
( tp_now.tv_sec == tp.tv_sec &&
tp_now.tv_nsec < tp.tv_nsec) );
+ tp.tv_sec = tp_now.tv_sec;
+ tp.tv_nsec = tp_now.tv_nsec;
+
}
zmq_sock.close();
diff --git a/src/AlsaInput.cpp b/src/AlsaInput.cpp
index fd1feec..8b6f790 100644
--- a/src/AlsaInput.cpp
+++ b/src/AlsaInput.cpp
@@ -133,7 +133,7 @@ void AlsaInput::process()
while (m_running) {
size_t n = read(samplebuf, NUM_SAMPLES_PER_CALL);
- m_queue.push(samplebuf, n);
+ m_queue.push(samplebuf, BYTES_PER_SAMPLE*m_channels*n);
}
}
diff --git a/src/SampleQueue.h b/src/SampleQueue.h
index d00b8f9..eabc301 100644
--- a/src/SampleQueue.h
+++ b/src/SampleQueue.h
@@ -12,6 +12,8 @@
#include <boost/thread.hpp>
#include <queue>
+#include <stdio.h>
+
/* This queue is meant to be used by two threads. One producer
* that pushes elements into the queue, and one consumer that
* retrieves the elements.
@@ -37,6 +39,9 @@ public:
boost::mutex::scoped_lock lock(m_mutex);
if (m_queue.size() >= m_max_size) {
+ /*fprintf(stderr, "######## push overrun %zu, %zu\n",
+ len,
+ m_queue.size()); // */
return 0;
}
@@ -65,6 +70,9 @@ public:
size_t pop(T* buf, size_t len)
{
boost::mutex::scoped_lock lock(m_mutex);
+ fprintf(stderr, "######## pop %zu (%zu)\n",
+ len,
+ m_queue.size());
size_t ret = 0;