From 2cc87ce6521fe568e44446f7594e43f093ce5ebb Mon Sep 17 00:00:00 2001 From: Dimitri Diakopoulos Date: Mon, 25 Jul 2016 16:59:36 -0700 Subject: [PATCH] setup for testing; fix misnamed fields in opus encoder header generation --- examples/src/Main.cpp | 8 +++++--- src/WavEncoder.cpp | 24 +++++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/examples/src/Main.cpp b/examples/src/Main.cpp index 623bfb1..0dd8052 100644 --- a/examples/src/Main.cpp +++ b/examples/src/Main.cpp @@ -71,7 +71,7 @@ int main(int argc, const char **argv) try //loader.Load(fileData.get(), "test_data/ad_hoc/KittyPurr24_Stereo.flac"); // 2-channel opus - //loader.Load(fileData.get(), "test_data/ad_hoc/detodos.opus"); // "Firefox: From All, To All" + loader.Load(fileData.get(), "test_data/ad_hoc/detodos.opus"); // "Firefox: From All, To All" // 1 + 2 channel wavepack //loader.Load(fileData.get(), "test_data/ad_hoc/TestBeat_Float32.wv"); @@ -87,6 +87,7 @@ int main(int argc, const char **argv) try } // Test Recording Capabilities of AudioDevice + /* fileData->samples.reserve(44100 * 2); fileData->channelCount = 1; fileData->frameSize = 32; @@ -95,6 +96,7 @@ int main(int argc, const char **argv) try std::cout << "Starting recording for two seconds..." << std::endl; myDevice.Record(fileData->sampleRate * fileData->lengthSeconds, fileData->samples); + */ // Libnyquist does not (currently) perform sample rate conversion if (fileData->sampleRate != desiredSampleRate) @@ -116,8 +118,8 @@ int main(int argc, const char **argv) try myDevice.Play(fileData->samples); } - //int encoderStatus = WavEncoder::WriteFile({2, PCM_16, DITHER_NONE }, fileData.get(), "encoded.wav"); - //std::cout << "Encoder Status: " << encoderStatus << std::endl; + int encoderStatus = OggOpusEncoder::WriteFile({1, PCM_FLT, DITHER_NONE}, fileData.get(), "encoded.opus"); + std::cout << "Encoder Status: " << encoderStatus << std::endl; return EXIT_SUCCESS; } diff --git a/src/WavEncoder.cpp b/src/WavEncoder.cpp index 28d5867..92b1b6f 100644 --- a/src/WavEncoder.cpp +++ b/src/WavEncoder.cpp @@ -255,9 +255,9 @@ class OggWriter std::array _channel_family = {{ 0x1 }}; to_bytes(uint8_t(channel_count), _channel_count.data()); - to_bytes(uint16_t(preskip), _channel_count.data()); - to_bytes(uint32_t(sample_rate), _channel_count.data()); - to_bytes(uint16_t(gain), _channel_count.data()); + to_bytes(uint16_t(preskip), _preskip.data()); + to_bytes(uint32_t(sample_rate), _sample_rate.data()); + to_bytes(uint16_t(gain), _gain.data()); header.insert(header.end(), _preamble.cbegin(), _preamble.cend()); header.insert(header.end(), _channel_count.cbegin(), _channel_count.cend()); @@ -444,6 +444,10 @@ int OggOpusEncoder::WriteFile(const EncoderParams p, const AudioData * d, const assert(d->samples.size() > 0); assert(d->sampleRate == 48000); + // Cast away const because we know what we are doing (Hopefully?) + float * sampleData = const_cast(d->samples.data()); + const size_t sampleDataSize = d->samples.size(); + int opus_error; opus_int32 opus_status; @@ -452,12 +456,15 @@ int OggOpusEncoder::WriteFile(const EncoderParams p, const AudioData * d, const if (!enc) throw std::runtime_error("opus_encoder_create caused an error!"); std::ofstream fout(path.c_str(), std::ios::out | std::ios::binary); + std::vector oggMetadata; OggWriter writer(d->channelCount, d->sampleRate, GetFormatBitsPerSample(d->sourceFormat), fout, oggMetadata); std::vector outBuffer(OPUS_MAX_PACKET_SIZE); - while (true) + int totalToEncode = d->samples.size() / OPUS_FRAME_SIZE; + + while (totalToEncode > 0) { auto encoded_size = opus_encode_float(enc, d->samples.data(), OPUS_FRAME_SIZE, outBuffer.data(), OPUS_MAX_PACKET_SIZE); @@ -466,16 +473,15 @@ int OggOpusEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std::cerr << "Bad Opus Status: " << encoded_size << std::endl; return 1; } - + std::vector packet_to_use = make_opus_extended_packet(reinterpret_cast(outBuffer.data()), encoded_size); writer.write(packet_to_use.data(), packet_to_use.size(), OPUS_FRAME_SIZE, false); + + totalToEncode -= OPUS_FRAME_SIZE; } - - // Cast away const because we know what we are doing (Hopefully?) - float * sampleData = const_cast(d->samples.data()); - const size_t sampleDataSize = d->samples.size(); + fout.close(); return EncoderError::NoError; }