From a854f821cad5b2d461798a214e3eba1abcf0569b Mon Sep 17 00:00:00 2001 From: Naoto Kondo Date: Sat, 25 Apr 2020 01:16:31 +0900 Subject: [PATCH] WIP: AudioFrame --- src/PyAudioFrame.cpp | 63 ------------------------------- src/PyAudioFrame.hpp | 41 --------------------- src/main.cpp | 88 ++++++++++++++++++++++++++++++-------------- 3 files changed, 61 insertions(+), 131 deletions(-) delete mode 100644 src/PyAudioFrame.cpp delete mode 100644 src/PyAudioFrame.hpp diff --git a/src/PyAudioFrame.cpp b/src/PyAudioFrame.cpp deleted file mode 100644 index 2104fad..0000000 --- a/src/PyAudioFrame.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include "PyAudioFrame.hpp" - -PyAudioFrameV2::PyAudioFrameV2(int sample_rate_, int no_channels_, - int no_samples_, int64_t timecode_, - float *p_data_, int channel_stride_in_bytes_, - const std::string &metadata_, int64_t timestamp_) - : _metadata(metadata_) { - sample_rate = sample_rate_; - no_channels = no_channels_; - no_samples = no_samples_; - timecode = timecode_; - p_data = p_data_; - channel_stride_in_bytes = channel_stride_in_bytes_; - p_metadata = _metadata.c_str(); - timestamp = timestamp_; -} - -PyAudioFrameV2::~PyAudioFrameV2() {} - -void PyAudioFrameV2::setData(py::array_t &array) { - auto info = array.request(); - p_data = reinterpret_cast(info.ptr); - channel_stride_in_bytes = info.strides[0]; -} - -const std::string &PyAudioFrameV2::getMetadata() const { return _metadata; } - -void PyAudioFrameV2::setMetadata(const std::string &data) { - _metadata = data; - p_metadata = _metadata.c_str(); -} - -PyAudioFrameV3::PyAudioFrameV3(int sample_rate_, int no_channels_, - int no_samples_, int64_t timecode_, - NDIlib_FourCC_audio_type_e FourCC_, - uint8_t *p_data_, int channel_stride_in_bytes_, - const std::string &metadata_, int64_t timestamp_) - : _metadata(metadata_) { - sample_rate = sample_rate_; - no_channels = no_channels_; - no_samples = no_samples_; - timecode = timecode_; - FourCC = FourCC_; - p_data = p_data_; - channel_stride_in_bytes = channel_stride_in_bytes_; - p_metadata = _metadata.c_str(); - timestamp = timestamp_; -} - -PyAudioFrameV3::~PyAudioFrameV3() {} - -void PyAudioFrameV3::setData(py::array_t &array) { - auto info = array.request(); - p_data = reinterpret_cast(info.ptr); - channel_stride_in_bytes = info.strides[0]; -} - -const std::string &PyAudioFrameV3::getMetadata() const { return _metadata; } - -void PyAudioFrameV3::setMetadata(const std::string &data) { - _metadata = data; - p_metadata = _metadata.c_str(); -} diff --git a/src/PyAudioFrame.hpp b/src/PyAudioFrame.hpp deleted file mode 100644 index 8c9d128..0000000 --- a/src/PyAudioFrame.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include - -#include - -namespace py = pybind11; - -class PyAudioFrameV2 : public NDIlib_audio_frame_v2_t { -public: - PyAudioFrameV2(int sample_rate_, int no_channels_, int no_samples_, - int64_t timecode_, float *p_data_, - int channel_stride_in_bytes_, const std::string &metadata_, - int64_t timestamp_); - virtual ~PyAudioFrameV2(); - - void setData(py::array_t &array); - - const std::string &getMetadata() const; - void setMetadata(const std::string &data); - -private: - std::string _metadata; -}; - -class PyAudioFrameV3 : public NDIlib_audio_frame_v3_t { -public: - PyAudioFrameV3(int sample_rate_, int no_channels_, int no_samples_, - int64_t timecode_, NDIlib_FourCC_audio_type_e FourCC_, - uint8_t *p_data_, int channel_stride_in_bytes_, - const std::string &metadata_, int64_t timestamp_); - virtual ~PyAudioFrameV3(); - - void setData(py::array_t &array); - - const std::string &getMetadata() const; - void setMetadata(const std::string &data); - -private: - std::string _metadata; -}; diff --git a/src/main.cpp b/src/main.cpp index 2b3855f..fc434ed 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include #include -#include "PyAudioFrame.hpp" +#include namespace py = pybind11; @@ -129,45 +129,79 @@ PYBIND11_MODULE(NDIlib, m) { }) .def_readwrite("timestamp", &NDIlib_video_frame_v2_t::timestamp); - py::class_(m, "AudioFrameV2") - .def(py::init(m, "AudioFrameV2") + .def(py::init<>()) + /*.def(py::init(), py::arg("sample_rate") = 48000, py::arg("no_channels") = 2, py::arg("no_samples") = 0, py::arg("timecode") = NDIlib_send_timecode_synthesize, - py::arg("data") = nullptr, py::arg("channel_stride_in_bytes") = 0, - py::arg("metadata") = nullptr, py::arg("timestamp") = 0) - .def_readwrite("sample_rate", &PyAudioFrameV2::sample_rate) - .def_readwrite("no_channels", &PyAudioFrameV2::no_channels) - .def_readwrite("no_samples", &PyAudioFrameV2::no_samples) - .def_readwrite("timecode", &PyAudioFrameV2::timecode) - .def_property("data", nullptr, &PyAudioFrameV2::setData) + py::arg("p_data") = NULL, py::arg("channel_stride_in_bytes") = 0, + py::arg("p_metadata") = NULL, py::arg("timestamp") = 0)*/ + .def_readwrite("sample_rate", &NDIlib_audio_frame_v2_t::sample_rate) + .def_readwrite("no_channels", &NDIlib_audio_frame_v2_t::no_channels) + .def_readwrite("no_samples", &NDIlib_audio_frame_v2_t::no_samples) + .def_readwrite("timecode", &NDIlib_audio_frame_v2_t::timecode) + .def_property( + "data", nullptr, + [](NDIlib_audio_frame_v2_t &self, py::array_t &array) { + auto info = array.request(); + self.p_data = reinterpret_cast(info.ptr); + self.channel_stride_in_bytes = info.strides[0]; + }) .def_readwrite("channel_stride_in_bytes", - &PyAudioFrameV2::channel_stride_in_bytes) - .def_property("metadata", &PyAudioFrameV2::getMetadata, - &PyAudioFrameV2::setMetadata) - .def_readwrite("timestamp", &PyAudioFrameV2::timestamp); + &NDIlib_audio_frame_v2_t::channel_stride_in_bytes) + .def_property( + "metadata", + [](const NDIlib_audio_frame_v2_t &self) { + auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr); + return py::reinterpret_steal(ustr); + }, + [](NDIlib_audio_frame_v2_t &self, const std::string &data) { + static std::unordered_map + strs; + strs[&self] = py::str(data); + self.p_metadata = strs[&self].c_str(); + }) + .def_readwrite("timestamp", &NDIlib_audio_frame_v2_t::timestamp); - py::class_(m, "AudioFrameV3") - .def(py::init(m, "AudioFrameV3") + .def(py::init<>()) + /*.def(py::init(), py::arg("sample_rate") = 48000, py::arg("no_channels") = 2, py::arg("no_samples") = 0, py::arg("timecode") = NDIlib_send_timecode_synthesize, py::arg("FourCC") = NDIlib_FourCC_audio_type_FLTP, py::arg("data") = nullptr, py::arg("channel_stride_in_bytes") = 0, - py::arg("metadata") = nullptr, py::arg("timestamp") = 0) - .def_readwrite("sample_rate", &PyAudioFrameV3::sample_rate) - .def_readwrite("no_channels", &PyAudioFrameV3::no_channels) - .def_readwrite("no_samples", &PyAudioFrameV3::no_samples) - .def_readwrite("timecode", &PyAudioFrameV3::timecode) - .def_readwrite("FourCC", &PyAudioFrameV3::FourCC) - .def_property("data", nullptr, &PyAudioFrameV3::setData) + py::arg("metadata") = nullptr, py::arg("timestamp") = 0)*/ + .def_readwrite("sample_rate", &NDIlib_audio_frame_v3_t::sample_rate) + .def_readwrite("no_channels", &NDIlib_audio_frame_v3_t::no_channels) + .def_readwrite("no_samples", &NDIlib_audio_frame_v3_t::no_samples) + .def_readwrite("timecode", &NDIlib_audio_frame_v3_t::timecode) + .def_readwrite("FourCC", &NDIlib_audio_frame_v3_t::FourCC) + .def_property( + "data", nullptr, + [](NDIlib_audio_frame_v3_t &self, const py::array_t &array) { + auto info = array.request(); + self.p_data = reinterpret_cast(info.ptr); + self.channel_stride_in_bytes = info.strides[0]; + }) .def_readwrite("channel_stride_in_bytes", - &PyAudioFrameV3::channel_stride_in_bytes) - .def_property("metadata", &PyAudioFrameV3::getMetadata, - &PyAudioFrameV3::setMetadata) - .def_readwrite("timestamp", &PyAudioFrameV3::timestamp); + &NDIlib_audio_frame_v3_t::channel_stride_in_bytes) + .def_property( + "metadata", + [](const NDIlib_audio_frame_v3_t &self) { + auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr); + return py::reinterpret_steal(ustr); + }, + [](NDIlib_audio_frame_v3_t &self, const std::string &data) { + static std::unordered_map + strs; + strs[&self] = py::str(data); + self.p_metadata = strs[&self].c_str(); + }) + .def_readwrite("timestamp", &NDIlib_audio_frame_v3_t::timestamp); py::class_(m, "MetadataFrame") .def(py::init(), py::arg("length") = 0,