summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/dabplus-enc-alsa-zmq.cpp89
1 files changed, 39 insertions, 50 deletions
diff --git a/src/dabplus-enc-alsa-zmq.cpp b/src/dabplus-enc-alsa-zmq.cpp
index 355a31c..caadfc9 100644
--- a/src/dabplus-enc-alsa-zmq.cpp
+++ b/src/dabplus-enc-alsa-zmq.cpp
@@ -23,8 +23,10 @@
extern "C" {
#include "encryption.h"
+#include "utils.h"
}
+
#include <string>
#include <getopt.h>
#include <cstdio>
@@ -86,7 +88,7 @@ void usage(const char* name) {
" -c, --channels={ 1, 2 } Nb of input channels for raw input (default: 2).\n"
" -r, --rate={ 32000, 48000 } Sample rate for raw input (default: 48000).\n"
" -k, --secret-key=FILE Set the secret key for encryption.\n"
- " -s, --suppress-dots Do not show the little dots.\n"
+ " -l, --level Show level indication.\n"
//" -V, --version Print version and exit.\n"
"\n"
"Only the tcp:// zeromq transport has been tested until now.\n"
@@ -182,42 +184,14 @@ int prepare_aac_encoder(
return 0;
}
-/* Get the number of columns of the terminal this runs in
- */
-int get_win_columns()
-{
- struct winsize w;
- if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == -1) {
- return 0;
- }
-
- return w.ws_col;
-}
-
-#define WINDOW_MARGIN_RIGHT 6
-
-/* Add line breaks in regular intervals to the
- * little sequence of dots because my terminal
- */
-void print_status(const char* status, int *consumed_cols)
-{
- fprintf(stdout, "%s", status);
- *consumed_cols -= strnlen(status, *consumed_cols);
-
- if (*consumed_cols <= 0) {
- fprintf(stdout, "\n");
- *consumed_cols = get_win_columns();
-
- // Guarantee that it's never negative
- if (*consumed_cols > WINDOW_MARGIN_RIGHT)
- *consumed_cols -= WINDOW_MARGIN_RIGHT;
- }
-}
-
#define no_argument 0
#define required_argument 1
#define optional_argument 2
+#define STATUS_PAD_INSERTED 0x1
+#define STATUS_OVERRUN 0x2
+#define STATUS_UNDERRUN 0x4
+
int main(int argc, char *argv[])
{
int subchannel_index = 8; //64kbps subchannel
@@ -231,13 +205,18 @@ int main(int argc, char *argv[])
bool drift_compensation = false;
AACENC_InfoStruct info = { 0 };
+ /* Keep track of peaks */
+ int peak_left = 0;
+ int peak_right = 0;
+
+
const char* pad_fifo = "/tmp/pad.fifo";
int pad_fd;
unsigned char pad_buf[128];
int padlen;
- int show_dots = 1;
-
+ int status = 0;
+ int show_level = 0;
/* Data for ZMQ CURVE authentication */
char* keyfile = NULL;
@@ -255,7 +234,7 @@ int main(int argc, char *argv[])
{"drift-comp", no_argument, 0, 'D'},
{"afterburner", no_argument, 0, 'a'},
{"help", no_argument, 0, 'h'},
- {"suppress-dots", no_argument, 0, 's'},
+ {"level", no_argument, 0, 'l'},
{0,0,0,0},
};
@@ -266,7 +245,7 @@ int main(int argc, char *argv[])
int index;
while(ch != -1) {
- ch = getopt_long(argc, argv, "hab:c:k:o:r:d:Dp:P:s", longopts, &index);
+ ch = getopt_long(argc, argv, "ahDlb:c:k:o:r:d:p:P:", longopts, &index);
switch (ch) {
case 'd':
alsa_device = optarg;
@@ -298,8 +277,8 @@ int main(int argc, char *argv[])
case 'P':
pad_fifo = optarg;
break;
- case 's':
- show_dots = 0;
+ case 'l':
+ show_level = 1;
break;
case '?':
case 'h':
@@ -428,8 +407,6 @@ int main(int argc, char *argv[])
fprintf(stderr, "Starting encoding\n");
- int remaining_line_len = get_win_columns() - 6;
-
int send_error_count = 0;
struct timespec tp_next;
clock_gettime(CLOCK_MONOTONIC, &tp_next);
@@ -495,7 +472,7 @@ int main(int argc, char *argv[])
// Otherwise, you're good to go and buffer should contain "count" bytes.
in_buf.numBufs = 2; // Samples + Data;
if (ret > 0)
- print_status("p", &remaining_line_len);
+ status |= STATUS_PAD_INSERTED;
}
else {
// Some other error occurred during read.
@@ -517,13 +494,11 @@ int main(int argc, char *argv[])
read = queue.pop(input_buf, input_size, &overruns); // returns bytes
if (read != input_size) {
- print_status("U", &remaining_line_len);
+ status |= STATUS_UNDERRUN;
}
if (overruns) {
- char status[16];
- snprintf(status, 16, "O%zu", overruns);
- print_status(status, &remaining_line_len);
+ status |= STATUS_OVERRUN;
}
}
else {
@@ -536,6 +511,13 @@ int main(int argc, char *argv[])
}
}
+ for (int i = 0; i < read; i+=4) {
+ int16_t l = input_buf[i] | (input_buf[i+1] << 8);
+ int16_t r = input_buf[i+2] | (input_buf[i+3] << 8);
+ peak_left = MAX(peak_left, l);
+ peak_right = MAX(peak_right, r);
+ }
+
// -------------- AAC Encoding
in_ptr[0] = input_buf;
@@ -616,18 +598,25 @@ int main(int argc, char *argv[])
break;
}
- if (show_dots &&
- out_args.numOutBytes + row*10 == outbuf_size)
- print_status(".", &remaining_line_len);
+ if (show_level && out_args.numOutBytes + row*10 == outbuf_size) {
+ fprintf(stderr, "\rIn: [%6s|%-6s] %1s %1s %1s",
+ level(0, &peak_left),
+ level(1, &peak_right),
+ status & STATUS_PAD_INSERTED ? "P" : " ",
+ status & STATUS_UNDERRUN ? "U" : " ",
+ status & STATUS_OVERRUN ? "O" : " ");
+ }
+
+ status = 0;
}
fflush(stdout);
}
+ fprintf(stderr, "\n");
zmq_sock.close();
free_rs_char(rs_handler);
aacEncClose(&encoder);
-
}