From 7738edb412d2493a6c4116f75f825388a40509fe Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Sun, 3 Apr 2016 20:23:32 +0200 Subject: [PATCH] Rewrote c99 like code to valid code, more changes to comply coding style --- src/SFML/Audio/SoundFileReaderOpus.cpp | 4 +- src/SFML/Audio/SoundFileWriterOpus.cpp | 83 ++++++++++++-------------- 2 files changed, 41 insertions(+), 46 deletions(-) diff --git a/src/SFML/Audio/SoundFileReaderOpus.cpp b/src/SFML/Audio/SoundFileReaderOpus.cpp index 3990461b..095113c6 100644 --- a/src/SFML/Audio/SoundFileReaderOpus.cpp +++ b/src/SFML/Audio/SoundFileReaderOpus.cpp @@ -65,7 +65,7 @@ namespace return static_cast(stream->tell()); } - static OpusFileCallbacks callbacks = {&read, &seek, &tell, NULL}; + const OpusFileCallbacks callbacks = {&read, &seek, &tell, NULL}; } namespace sf @@ -149,7 +149,6 @@ Uint64 SoundFileReaderOpus::read(Int16* samples, Uint64 maxCount) Uint64 count = 0; while (maxCount > 0) { - // since maxCount is uint64 we have to ensure that samplesToRead is <= INT_MAX (int overflow) if (maxCount > INT_MAX) { @@ -185,6 +184,7 @@ void SoundFileReaderOpus::close() if (m_opus != NULL) { op_free(m_opus); + m_opus = NULL; m_channelCount = 0; } } diff --git a/src/SFML/Audio/SoundFileWriterOpus.cpp b/src/SFML/Audio/SoundFileWriterOpus.cpp index d40ce6f7..4fff73ad 100644 --- a/src/SFML/Audio/SoundFileWriterOpus.cpp +++ b/src/SFML/Audio/SoundFileWriterOpus.cpp @@ -28,21 +28,19 @@ #include #include #include -#include -#include #include - +#include // Anonymous namespace namespace { // Make sure to write int into buffer little endian - void writeUint32(unsigned char* buffer, sf::Uint32 value) + void writeUint32(std::vector& buffer, const sf::Uint32 value) { - buffer[0] = static_cast(value & 0x000000FF); - buffer[1] = static_cast((value & 0x0000FF00) >> 8); - buffer[2] = static_cast((value & 0x00FF0000) >> 16); - buffer[3] = static_cast((value & 0xFF000000) >> 24); + buffer.push_back(static_cast(value & 0x000000FF)); + buffer.push_back(static_cast((value & 0x0000FF00) >> 8)); + buffer.push_back(static_cast((value & 0x00FF0000) >> 16)); + buffer.push_back(static_cast((value & 0xFF000000) >> 24)); } } @@ -84,7 +82,6 @@ bool SoundFileWriterOpus::open(const std::string& filename, unsigned int sampleR // Save the channel count m_channelCount = channelCount; m_sampleRate = sampleRate; - std::srand(std::time(0)); // Initialize the ogg/opus stream if (ogg_stream_init(&m_ogg, std::rand()) == -1) @@ -93,13 +90,14 @@ bool SoundFileWriterOpus::open(const std::string& filename, unsigned int sampleR close(); return false; } - int status = 0; + + int status = OPUS_OK; m_opus = opus_encoder_create(sampleRate, channelCount, OPUS_APPLICATION_AUDIO, &status); if (status != OPUS_OK) { err() << "Failed to write ogg/opus file \"" << filename << "\"" << std::endl; if (status == OPUS_BAD_ARG) - err() << "Possible wrong sample rate, allowed are 8000, 12000, 16000, 24000, or 48000 Hz." << std::endl; + err() << "Possibly wrong sample rate, allowed are 8000, 12000, 16000, 24000, or 48000 Hz." << std::endl; close(); return false; } @@ -115,19 +113,18 @@ bool SoundFileWriterOpus::open(const std::string& filename, unsigned int sampleR // Set bitrate (VBR is default) opus_encoder_ctl(m_opus, OPUS_SET_BITRATE(128000)); - // Create opus header - unsigned char headerData[19]; - memset(static_cast(headerData), 0, 19); - memcpy(static_cast(headerData), "OpusHead", 8); - headerData[8] = 1; // Version - headerData[9] = channelCount; - writeUint32(headerData + 12, static_cast(sampleRate)); - headerData[18] = channelCount > 8 ? 255 : (channelCount > 2); // Mapping family + // Create opus header MAGICBYTES VERSION + std::string magicBytes("OpusHead1"); + std::vector headerData(magicBytes.begin(), magicBytes.end()); + + headerData.push_back(channelCount); + writeUint32(headerData, static_cast(sampleRate)); + headerData.push_back(channelCount > 8 ? 255 : (channelCount > 2)); // Mapping family // Map opus header to ogg packet ogg_packet op; - op.packet = headerData; - op.bytes = 19; + op.packet = &headerData.front(); // C++11: headerData.data(); + op.bytes = headerData.size(); op.b_o_s = 1; op.e_o_s = 0; op.granulepos = 0; @@ -138,26 +135,22 @@ bool SoundFileWriterOpus::open(const std::string& filename, unsigned int sampleR flushBlocks(); // Create comment header, needs to be in a new page - const char* opusVersion = opus_get_version_string(); - Uint32 opusVersionLength = strlen(opusVersion); - const int commentLength = 8 + 4 + opusVersionLength + 4; - - unsigned char commentData[commentLength]; - - // Magic bytes - memcpy(static_cast(commentData), "OpusTags", 8); - - // unsigned 32bit integer: Length of vendor string (encoding library) - writeUint32(commentData + 8, opusVersionLength); + // commentData initialized with magic bytes + magicBytes = "OpusTags"; + std::vector commentData(magicBytes.begin(), magicBytes.end()); // C++11: commentData({'O', 'p', 'u', 's', 'T', 'a', 'g', 's'}); // Vendor string - memcpy(static_cast(commentData+12), opusVersion, opusVersionLength); + const std::string opusVersion(opus_get_version_string()); + + // unsigned 32bit integer: Length of vendor string (encoding library) + writeUint32(commentData, opusVersion.size()); + commentData.insert(commentData.end(), opusVersion.begin(), opusVersion.end()); // Length of user comments (E.g. you can add a ENCODER tag for SFML) - writeUint32(commentData + 12+opusVersionLength, 0); + writeUint32(commentData, 0); - op.packet = commentData; - op.bytes = commentLength; + op.packet = &commentData.front(); + op.bytes = commentData.size(); op.b_o_s = 0; op.e_o_s = 0; op.granulepos = 0; @@ -178,22 +171,23 @@ void SoundFileWriterOpus::write(const Int16* samples, Uint64 count) const opus_uint32 frame_size = 960; const opus_int32 buffer_size = frame_size * m_channelCount * sizeof(Int16); - unsigned char buffer[buffer_size]; + unsigned char* buffer = new unsigned char[buffer_size]; + Uint32 frame_number = 0; Uint8 endOfStream = 0; - ogg_packet op; while (count > 0) { + ogg_packet op; opus_int32 packet_size; // Check if wee need to pad the input - if (count < (frame_size * m_channelCount)) + if (count < frame_size * m_channelCount) { - Int16 pad[frame_size*m_channelCount]; - memset(pad, 0, frame_size * m_channelCount); - memcpy(pad, samples + (frame_number * frame_size * m_channelCount), count); - packet_size = opus_encode(m_opus, pad, frame_size, buffer, buffer_size); + const Uint32 begin = (frame_number * frame_size * m_channelCount); + std::vector pad(samples + begin, samples + begin + count); + pad.insert(pad.end(), (frame_size * m_channelCount) - pad.size(),0); + packet_size = opus_encode(m_opus, &pad.front(), frame_size, buffer, buffer_size); endOfStream = 1; count = 0; } @@ -221,6 +215,7 @@ void SoundFileWriterOpus::write(const Int16* samples, Uint64 count) // Flush any produced block flushBlocks(); + delete[] buffer; } @@ -228,7 +223,7 @@ void SoundFileWriterOpus::write(const Int16* samples, Uint64 count) void SoundFileWriterOpus::flushBlocks() { ogg_page page; - while (ogg_stream_pageout(&m_ogg, &page) > 0 || ogg_stream_flush(&m_ogg, &page) > 0) + while ((ogg_stream_pageout(&m_ogg, &page) > 0) || (ogg_stream_flush(&m_ogg, &page) > 0)) { m_file.write(reinterpret_cast(page.header), page.header_len); m_file.write(reinterpret_cast(page.body), page.body_len);