aboutsummaryrefslogtreecommitdiffstats
path: root/src/odr-sourcecompanion.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2018-07-18 11:04:00 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2018-07-18 11:04:00 +0200
commit5d0b852bd60fd54c24316b5bc35d44ca5530b200 (patch)
tree1ed4c97661268dd5b55ab868a01c393f18243cb9 /src/odr-sourcecompanion.cpp
parent4714fe46d8ee1bfd43fbe936d1d50402411e3446 (diff)
downloadODR-SourceCompanion-5d0b852bd60fd54c24316b5bc35d44ca5530b200.tar.gz
ODR-SourceCompanion-5d0b852bd60fd54c24316b5bc35d44ca5530b200.tar.bz2
ODR-SourceCompanion-5d0b852bd60fd54c24316b5bc35d44ca5530b200.zip
Decode AAC to measure audio levels
Diffstat (limited to 'src/odr-sourcecompanion.cpp')
-rw-r--r--src/odr-sourcecompanion.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/odr-sourcecompanion.cpp b/src/odr-sourcecompanion.cpp
index a464883..b687105 100644
--- a/src/odr-sourcecompanion.cpp
+++ b/src/odr-sourcecompanion.cpp
@@ -27,6 +27,7 @@
#include "zmq.hpp"
#include "AVTInput.h"
+#include "AACDecoder.h"
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
@@ -117,13 +118,15 @@ int main(int argc, char *argv[])
std::vector<std::string> output_uris;
+ AACDecoder decoder;
+
/* For MOT Slideshow and DLS insertion */
const char* pad_fifo = "/tmp/pad.fifo";
int pad_fd;
int padlen = 0;
/* Whether to show the 'sox'-like measurement */
- int show_level = 0;
+ bool show_level = false;
/* Data for ZMQ CURVE authentication */
char* keyfile = nullptr;
@@ -201,7 +204,7 @@ int main(int argc, char *argv[])
keyfile = optarg;
break;
case 'l':
- show_level = 1;
+ show_level = true;
break;
case 'o':
output_uris.push_back(optarg);
@@ -397,9 +400,27 @@ int main(int argc, char *argv[])
}
}
- // TODO get level information from encoder. In the meantime, set to max value to avoid alarms.
- peak_left = 0x7FFF;
- peak_right = 0x7FFF;
+ if (numOutBytes != 0) {
+ try {
+ // Drop the Reed-Solomon data
+ if (numOutBytes % 120 != 0) {
+ throw runtime_error("Invalid data length " + to_string(numOutBytes));
+ }
+ numOutBytes /= 120;
+ numOutBytes *= 110;
+
+ decoder.decode_frame(outbuf.data(), numOutBytes);
+
+ auto p = decoder.get_peaks();
+ peak_left = p.peak_left;
+ peak_right = p.peak_right;
+ }
+ catch (const runtime_error &e) {
+ fprintf(stderr, "AAC decoding failed with: %s\n", e.what());
+ peak_left = 0;
+ peak_right = 0;
+ }
+ }
read_bytes = numOutBytes;
@@ -432,15 +453,14 @@ int main(int argc, char *argv[])
}
}
- if (numOutBytes != 0)
- {
+ if (numOutBytes != 0) {
if (show_level) {
if (channels == 1) {
fprintf(stderr, "\rIn: [%-6s]",
level(1, MAX(peak_right, peak_left)));
}
else if (channels == 2) {
- fprintf(stderr, "\rIn: [%6s|%-6s]",
+ fprintf(stderr, "\rIn: [%6s|%-6s]",
level(0, peak_left),
level(1, peak_right));
}