setup for testing; fix misnamed fields in opus encoder header generation

pull/18/head
Dimitri Diakopoulos 10 years ago
parent 75ca01d34f
commit 2cc87ce652

@ -71,7 +71,7 @@ int main(int argc, const char **argv) try
//loader.Load(fileData.get(), "test_data/ad_hoc/KittyPurr24_Stereo.flac"); //loader.Load(fileData.get(), "test_data/ad_hoc/KittyPurr24_Stereo.flac");
// 2-channel opus // 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 // 1 + 2 channel wavepack
//loader.Load(fileData.get(), "test_data/ad_hoc/TestBeat_Float32.wv"); //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 // Test Recording Capabilities of AudioDevice
/*
fileData->samples.reserve(44100 * 2); fileData->samples.reserve(44100 * 2);
fileData->channelCount = 1; fileData->channelCount = 1;
fileData->frameSize = 32; fileData->frameSize = 32;
@ -95,6 +96,7 @@ int main(int argc, const char **argv) try
std::cout << "Starting recording for two seconds..." << std::endl; std::cout << "Starting recording for two seconds..." << std::endl;
myDevice.Record(fileData->sampleRate * fileData->lengthSeconds, fileData->samples); myDevice.Record(fileData->sampleRate * fileData->lengthSeconds, fileData->samples);
*/
// Libnyquist does not (currently) perform sample rate conversion // Libnyquist does not (currently) perform sample rate conversion
if (fileData->sampleRate != desiredSampleRate) if (fileData->sampleRate != desiredSampleRate)
@ -116,8 +118,8 @@ int main(int argc, const char **argv) try
myDevice.Play(fileData->samples); myDevice.Play(fileData->samples);
} }
//int encoderStatus = WavEncoder::WriteFile({2, PCM_16, DITHER_NONE }, fileData.get(), "encoded.wav"); int encoderStatus = OggOpusEncoder::WriteFile({1, PCM_FLT, DITHER_NONE}, fileData.get(), "encoded.opus");
//std::cout << "Encoder Status: " << encoderStatus << std::endl; std::cout << "Encoder Status: " << encoderStatus << std::endl;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

@ -255,9 +255,9 @@ class OggWriter
std::array<char, 1> _channel_family = {{ 0x1 }}; std::array<char, 1> _channel_family = {{ 0x1 }};
to_bytes(uint8_t(channel_count), _channel_count.data()); to_bytes(uint8_t(channel_count), _channel_count.data());
to_bytes(uint16_t(preskip), _channel_count.data()); to_bytes(uint16_t(preskip), _preskip.data());
to_bytes(uint32_t(sample_rate), _channel_count.data()); to_bytes(uint32_t(sample_rate), _sample_rate.data());
to_bytes(uint16_t(gain), _channel_count.data()); to_bytes(uint16_t(gain), _gain.data());
header.insert(header.end(), _preamble.cbegin(), _preamble.cend()); header.insert(header.end(), _preamble.cbegin(), _preamble.cend());
header.insert(header.end(), _channel_count.cbegin(), _channel_count.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->samples.size() > 0);
assert(d->sampleRate == 48000); assert(d->sampleRate == 48000);
// Cast away const because we know what we are doing (Hopefully?)
float * sampleData = const_cast<float *>(d->samples.data());
const size_t sampleDataSize = d->samples.size();
int opus_error; int opus_error;
opus_int32 opus_status; 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!"); 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::ofstream fout(path.c_str(), std::ios::out | std::ios::binary);
std::vector<metadata_type> oggMetadata; std::vector<metadata_type> oggMetadata;
OggWriter writer(d->channelCount, d->sampleRate, GetFormatBitsPerSample(d->sourceFormat), fout, oggMetadata); OggWriter writer(d->channelCount, d->sampleRate, GetFormatBitsPerSample(d->sourceFormat), fout, oggMetadata);
std::vector<uint8_t> outBuffer(OPUS_MAX_PACKET_SIZE); std::vector<uint8_t> 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); 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; std::cerr << "Bad Opus Status: " << encoded_size << std::endl;
return 1; return 1;
} }
std::vector<char> packet_to_use = make_opus_extended_packet(reinterpret_cast<char*>(outBuffer.data()), encoded_size); std::vector<char> packet_to_use = make_opus_extended_packet(reinterpret_cast<char*>(outBuffer.data()), encoded_size);
writer.write(packet_to_use.data(), packet_to_use.size(), OPUS_FRAME_SIZE, false); writer.write(packet_to_use.data(), packet_to_use.size(), OPUS_FRAME_SIZE, false);
totalToEncode -= OPUS_FRAME_SIZE;
} }
fout.close();
// Cast away const because we know what we are doing (Hopefully?)
float * sampleData = const_cast<float *>(d->samples.data());
const size_t sampleDataSize = d->samples.size();
return EncoderError::NoError; return EncoderError::NoError;
} }

Loading…
Cancel
Save