summaryrefslogtreecommitdiffstats
path: root/src/Outputs.h
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-05-20 08:49:29 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-05-20 08:49:29 +0200
commit7102f830e01c3d4d695c0d36608cb09064e4aedc (patch)
tree5b0bbb2a9fff3af44c4b0a7c88b96edfd3675a39 /src/Outputs.h
parent3b68a6188b4983816833dc9a20be4f6b74f4c03f (diff)
downloadODR-AudioEnc-7102f830e01c3d4d695c0d36608cb09064e4aedc.tar.gz
ODR-AudioEnc-7102f830e01c3d4d695c0d36608cb09064e4aedc.tar.bz2
ODR-AudioEnc-7102f830e01c3d4d695c0d36608cb09064e4aedc.zip
Move outputs to a separate file
Diffstat (limited to 'src/Outputs.h')
-rw-r--r--src/Outputs.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/Outputs.h b/src/Outputs.h
new file mode 100644
index 0000000..30b20c8
--- /dev/null
+++ b/src/Outputs.h
@@ -0,0 +1,126 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 2011 Martin Storsjo
+ * Copyright (C) 2019 Matthias P. Braendli
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+
+#pragma once
+#include <vector>
+#include <deque>
+#include <cstdint>
+#include <cstddef>
+#include <cstdio>
+#include "common.h"
+#include "zmq.hpp"
+extern "C" {
+#include "encryption.h"
+}
+
+namespace Output {
+
+/*! \file Outputs.h
+ *
+ * Declaration of all outputs
+ */
+
+class Base {
+ public:
+ virtual ~Base() {};
+
+ /*! Write a buffer of encoded data to the output */
+ virtual bool write_frame(const uint8_t *buf, size_t len) = 0;
+
+ /*! Update peak audio level information */
+ virtual void update_audio_levels(
+ int16_t audiolevel_left, int16_t audiolevel_right);
+
+ protected:
+ int16_t m_audio_left = 0;
+ int16_t m_audio_right = 0;
+};
+
+class File : public Base {
+ public:
+ File(const char *filename);
+ File(FILE *file);
+ File(const File&) = delete;
+ File& operator=(const File&) = delete;
+ virtual ~File() override;
+
+ virtual bool write_frame(const uint8_t *buf, size_t len) override;
+
+ private:
+ FILE *m_fd = nullptr;
+};
+
+/*! This defines the on-wire representation of a ZMQ message header.
+ * It must be compatible with the definition in ODR-DabMux.
+ *
+ * The data follows right after this header */
+struct zmq_frame_header_t
+{
+ uint16_t version; // we support version=1 now
+ uint16_t encoder; // see ZMQ_ENCODER_XYZ
+
+ /* length of the 'data' field */
+ uint32_t datasize;
+
+ /* Audio level, peak, linear PCM */
+ int16_t audiolevel_left;
+ int16_t audiolevel_right;
+
+ /* Data follows this header */
+} __attribute__ ((packed));
+
+#define ZMQ_ENCODER_FDK 1
+#define ZMQ_ENCODER_TOOLAME 2
+
+#define ZMQ_HEADER_SIZE sizeof(struct zmq_frame_header_t)
+
+/* The expected frame size incl data of the given frame */
+#define ZMQ_FRAME_SIZE(f) (sizeof(struct zmq_frame_header_t) + f->datasize)
+
+#define ZMQ_FRAME_DATA(f) ( ((uint8_t*)f)+sizeof(struct zmq_frame_header_t) )
+
+
+class ZMQ: public Base {
+ public:
+ ZMQ();
+ ZMQ(const ZMQ&) = delete;
+ ZMQ& operator=(const ZMQ&) = delete;
+ virtual ~ZMQ() override;
+
+ void connect(const char *uri, const char *keyfile);
+ void set_encoder_type(encoder_selection_t& enc, int bitrate);
+
+ virtual bool write_frame(const uint8_t *buf, size_t len) override;
+
+ private:
+ virtual bool write_toolame(const uint8_t *buf, size_t len);
+ virtual bool send_frame(const uint8_t *buf, size_t len);
+
+ zmq::context_t m_ctx;
+ zmq::socket_t m_sock;
+
+ int m_bitrate = 0;
+ char m_secretkey[CURVE_KEYLEN+1];
+ encoder_selection_t m_encoder = encoder_selection_t::fdk_dabplus;
+ using vec_u8 = std::vector<uint8_t>;
+ vec_u8 m_framebuf;
+ std::deque<uint8_t> m_toolame_buffer;
+};
+
+}