summaryrefslogtreecommitdiff
path: root/gr-blocks/python
diff options
context:
space:
mode:
authorRon Economos <w6rz@comcast.net>2020-06-23 14:40:40 -0700
committerMarcus Müller <marcus@hostalia.de>2020-09-01 23:26:30 +0200
commit18f64ba685cfc2533e2d7726aa43c524b007d97b (patch)
treeba7f4420cce2728ab9ccbd2c2471b851d41138fb /gr-blocks/python
parent028b2167d7c1a6e7c4eb428b1c6cdd5225add264 (diff)
gr-blocks: Transition the WAV sink and source blocks to libsndfile.
Compressed input and output with FLAC and Ogg Vorbis now supported.
Diffstat (limited to 'gr-blocks/python')
-rw-r--r--gr-blocks/python/blocks/bindings/CMakeLists.txt7
-rw-r--r--gr-blocks/python/blocks/bindings/docstrings/wavfile_sink_pydoc_template.h3
-rw-r--r--gr-blocks/python/blocks/bindings/wavfile_python.cc62
-rw-r--r--gr-blocks/python/blocks/bindings/wavfile_sink_python.cc16
-rw-r--r--gr-blocks/python/blocks/qa_wavfile.py19
-rw-r--r--gr-blocks/python/blocks/test_16bit_1chunk.wavbin74 -> 74 bytes
-rw-r--r--gr-blocks/python/blocks/test_16bit_1chunk_normal.wavbin0 -> 52 bytes
7 files changed, 52 insertions, 55 deletions
diff --git a/gr-blocks/python/blocks/bindings/CMakeLists.txt b/gr-blocks/python/blocks/bindings/CMakeLists.txt
index 976e12d180..4385c82a0f 100644
--- a/gr-blocks/python/blocks/bindings/CMakeLists.txt
+++ b/gr-blocks/python/blocks/bindings/CMakeLists.txt
@@ -1,3 +1,10 @@
+# Copyright 2020 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+
include(GrPybind)
########################################################################
diff --git a/gr-blocks/python/blocks/bindings/docstrings/wavfile_sink_pydoc_template.h b/gr-blocks/python/blocks/bindings/docstrings/wavfile_sink_pydoc_template.h
index 137dc82cd1..dc7a57fb7a 100644
--- a/gr-blocks/python/blocks/bindings/docstrings/wavfile_sink_pydoc_template.h
+++ b/gr-blocks/python/blocks/bindings/docstrings/wavfile_sink_pydoc_template.h
@@ -37,3 +37,6 @@ static const char* __doc_gr_blocks_wavfile_sink_set_sample_rate = R"doc()doc";
static const char* __doc_gr_blocks_wavfile_sink_set_bits_per_sample = R"doc()doc";
+
+
+static const char* __doc_gr_blocks_wavfile_sink_set_append = R"doc()doc";
diff --git a/gr-blocks/python/blocks/bindings/wavfile_python.cc b/gr-blocks/python/blocks/bindings/wavfile_python.cc
index 950289d156..ff84bab7eb 100644
--- a/gr-blocks/python/blocks/bindings/wavfile_python.cc
+++ b/gr-blocks/python/blocks/bindings/wavfile_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(wavfile.h) */
-/* BINDTOOL_HEADER_FILE_HASH(85a13746fd109dbc7b94ba38aaf61e4c) */
+/* BINDTOOL_HEADER_FILE_HASH(69b513925578f5e61e5c98a083388fae) */
/***********************************************************************************/
#include <pybind11/complex.h>
@@ -29,49 +29,31 @@ namespace py = pybind11;
void bind_wavfile(py::module& m)
{
- using wav_header_info = gr::blocks::wav_header_info;
+ using wav_header_info = ::gr::blocks::wav_header_info;
py::class_<wav_header_info, std::shared_ptr<wav_header_info>>(m, "wav_header_info")
.def_readwrite("sample_rate", &wav_header_info::sample_rate)
.def_readwrite("nchans", &wav_header_info::nchans)
.def_readwrite("bytes_per_sample", &wav_header_info::bytes_per_sample)
- .def_readwrite("first_sample_pos", &wav_header_info::first_sample_pos)
.def_readwrite("samples_per_chan", &wav_header_info::samples_per_chan)
- .def_readwrite("data_chunk_size", &wav_header_info::data_chunk_size);
-
- m.def("wavheader_parse",
- &::gr::blocks::wavheader_parse,
- py::arg("fp"),
- py::arg("info"),
- D(wavheader_parse));
-
- m.def("wav_read_sample",
- &::gr::blocks::wav_read_sample,
- py::arg("fp"),
- py::arg("bytes_per_sample"),
- D(wav_read_sample));
-
-
- m.def("wavheader_write",
- &::gr::blocks::wavheader_write,
- py::arg("fp"),
- py::arg("sample_rate"),
- py::arg("nchans"),
- py::arg("bytes_per_sample"),
- D(wavheader_write));
-
-
- m.def("wav_write_sample",
- &::gr::blocks::wav_write_sample,
- py::arg("fp"),
- py::arg("sample"),
- py::arg("bytes_per_sample"),
- D(wav_write_sample));
-
-
- m.def("wavheader_complete",
- &::gr::blocks::wavheader_complete,
- py::arg("fp"),
- py::arg("byte_count"),
- D(wavheader_complete));
+ .def_readwrite("format", &wav_header_info::format)
+ .def_readwrite("subformat", &wav_header_info::subformat);
+
+ py::enum_<::gr::blocks::wavfile_format_t>(m, "wavfile_format_t")
+ .value("FORMAT_WAV", ::gr::blocks::FORMAT_WAV) // 65536
+ .value("FORMAT_FLAC", ::gr::blocks::FORMAT_FLAC) // 1507328
+ .value("FORMAT_OGG", ::gr::blocks::FORMAT_OGG) // 2097152
+ .value("FORMAT_RF64", ::gr::blocks::FORMAT_RF64) // 2228224
+ .export_values();
+
+ py::enum_<::gr::blocks::wavfile_subformat_t>(m, "wavfile_subformat_t")
+ .value("FORMAT_PCM_S8", ::gr::blocks::FORMAT_PCM_S8) // 1
+ .value("FORMAT_PCM_16", ::gr::blocks::FORMAT_PCM_16) // 2
+ .value("FORMAT_PCM_24", ::gr::blocks::FORMAT_PCM_24) // 3
+ .value("FORMAT_PCM_32", ::gr::blocks::FORMAT_PCM_32) // 4
+ .value("FORMAT_PCM_U8", ::gr::blocks::FORMAT_PCM_U8) // 5
+ .value("FORMAT_FLOAT", ::gr::blocks::FORMAT_FLOAT) // 6
+ .value("FORMAT_DOUBLE", ::gr::blocks::FORMAT_DOUBLE) // 7
+ .value("FORMAT_VORBIS", ::gr::blocks::FORMAT_VORBIS) // 96
+ .export_values();
}
diff --git a/gr-blocks/python/blocks/bindings/wavfile_sink_python.cc b/gr-blocks/python/blocks/bindings/wavfile_sink_python.cc
index af7046d086..5a6e236eff 100644
--- a/gr-blocks/python/blocks/bindings/wavfile_sink_python.cc
+++ b/gr-blocks/python/blocks/bindings/wavfile_sink_python.cc
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(wavfile_sink.h) */
-/* BINDTOOL_HEADER_FILE_HASH(b8184d24184e3bd7aa4a08f5fca8ac0d) */
+/* BINDTOOL_HEADER_FILE_HASH(aef0fe37adeb3a7bb763e4ed9e807a17) */
/***********************************************************************************/
#include <pybind11/complex.h>
@@ -29,10 +29,8 @@ namespace py = pybind11;
void bind_wavfile_sink(py::module& m)
{
-
using wavfile_sink = ::gr::blocks::wavfile_sink;
-
py::class_<wavfile_sink,
gr::sync_block,
gr::block,
@@ -43,27 +41,27 @@ void bind_wavfile_sink(py::module& m)
py::arg("filename"),
py::arg("n_channels"),
py::arg("sample_rate"),
- py::arg("bits_per_sample") = 16,
+ py::arg("format"),
+ py::arg("subformat"),
py::arg("append") = false,
D(wavfile_sink, make))
-
.def("open", &wavfile_sink::open, py::arg("filename"), D(wavfile_sink, open))
-
.def("close", &wavfile_sink::close, D(wavfile_sink, close))
-
.def("set_sample_rate",
&wavfile_sink::set_sample_rate,
py::arg("sample_rate"),
D(wavfile_sink, set_sample_rate))
-
.def("set_bits_per_sample",
&wavfile_sink::set_bits_per_sample,
py::arg("bits_per_sample"),
D(wavfile_sink, set_bits_per_sample))
- ;
+ .def("set_append",
+ &wavfile_sink::set_append,
+ py::arg("append"),
+ D(wavfile_sink, set_append));
}
diff --git a/gr-blocks/python/blocks/qa_wavfile.py b/gr-blocks/python/blocks/qa_wavfile.py
index f22934d71b..0b08ce3290 100644
--- a/gr-blocks/python/blocks/qa_wavfile.py
+++ b/gr-blocks/python/blocks/qa_wavfile.py
@@ -15,6 +15,7 @@ import os
from os.path import getsize
g_in_file = os.path.join(os.getenv("srcdir"), "test_16bit_1chunk.wav")
+g_in_file_normal = os.path.join(os.getenv("srcdir"), "test_16bit_1chunk_normal.wav")
g_extra_header_offset = 36
g_extra_header_len = 22
@@ -38,7 +39,8 @@ class test_wavefile(gr_unittest.TestCase):
wf_out = blocks.wavfile_sink(outfile,
wf_in.channels(),
wf_in.sample_rate(),
- wf_in.bits_per_sample())
+ blocks.FORMAT_WAV,
+ blocks.FORMAT_PCM_16)
self.tb.connect(wf_in, wf_out)
self.tb.run()
wf_out.close()
@@ -72,7 +74,7 @@ class test_wavefile(gr_unittest.TestCase):
in_data[g_extra_header_offset + g_extra_header_len:], out_data)
def test_003_checkwav_append_copy(self):
- infile = g_in_file
+ infile = g_in_file_normal
outfile = "test_out_append.wav"
# 1. Copy input to output
@@ -84,7 +86,8 @@ class test_wavefile(gr_unittest.TestCase):
wf_out = blocks.wavfile_sink(outfile,
wf_in.channels(),
wf_in.sample_rate(),
- wf_in.bits_per_sample(),
+ blocks.FORMAT_WAV,
+ blocks.FORMAT_PCM_16,
True)
self.tb.connect(wf_in, wf_out)
self.tb.run()
@@ -96,7 +99,8 @@ class test_wavefile(gr_unittest.TestCase):
wf_out = blocks.wavfile_sink(outfile,
wf_in.channels(),
wf_in.sample_rate(),
- wf_in.bits_per_sample(),
+ blocks.FORMAT_WAV,
+ blocks.FORMAT_PCM_16,
True)
self.tb.connect(wf_in, halver, wf_out)
self.tb.run()
@@ -130,12 +134,15 @@ class test_wavefile(gr_unittest.TestCase):
data_in_halved = [int(round(d/2)) for d in data_in]
self.assertEqual(data_in_halved, data_out[2*len(data_in):])
+ os.remove(outfile)
+
def test_003_checkwav_append_non_existent_should_error(self):
outfile = "no_file.wav"
- with self.assertRaisesRegex(RuntimeError, 'WAV append mode requires target file to exist'):
- blocks.wavfile_sink(outfile, 1, 44100, 16, True)
+ with self.assertRaisesRegex(RuntimeError, "Can't open WAV file."):
+ blocks.wavfile_sink(outfile, 1, 44100, blocks.FORMAT_WAV, blocks.FORMAT_PCM_16, True)
+ os.remove(outfile)
def wav_read_frames(w):
import struct
diff --git a/gr-blocks/python/blocks/test_16bit_1chunk.wav b/gr-blocks/python/blocks/test_16bit_1chunk.wav
index 3d028a9582..e984f847a4 100644
--- a/gr-blocks/python/blocks/test_16bit_1chunk.wav
+++ b/gr-blocks/python/blocks/test_16bit_1chunk.wav
Binary files differ
diff --git a/gr-blocks/python/blocks/test_16bit_1chunk_normal.wav b/gr-blocks/python/blocks/test_16bit_1chunk_normal.wav
new file mode 100644
index 0000000000..42989ed588
--- /dev/null
+++ b/gr-blocks/python/blocks/test_16bit_1chunk_normal.wav
Binary files differ