aboutsummaryrefslogtreecommitdiffstats
path: root/examples/alstreamcb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/alstreamcb.cpp')
-rw-r--r--examples/alstreamcb.cpp47
1 files changed, 24 insertions, 23 deletions
diff --git a/examples/alstreamcb.cpp b/examples/alstreamcb.cpp
index 6cc24034..ebf3d3b0 100644
--- a/examples/alstreamcb.cpp
+++ b/examples/alstreamcb.cpp
@@ -24,12 +24,12 @@
/* This file contains a streaming audio player using a callback buffer. */
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
#include <atomic>
#include <chrono>
+#include <cstring>
+#include <cstdlib>
+#include <cstdio>
#include <memory>
#include <stdexcept>
#include <string>
@@ -44,6 +44,8 @@
#include "common/alhelpers.h"
+#include "win_main_utf8.h"
+
namespace {
@@ -56,8 +58,7 @@ struct StreamPlayer {
/* A lockless ring-buffer (supports single-provider, single-consumer
* operation).
*/
- std::unique_ptr<ALbyte[]> mBufferData;
- size_t mBufferDataSize{0};
+ std::vector<ALbyte> mBufferData;
std::atomic<size_t> mReadPos{0};
std::atomic<size_t> mWritePos{0};
size_t mSamplesPerBlock{1};
@@ -78,7 +79,7 @@ struct StreamPlayer {
size_t mDecoderOffset{0};
/* The format of the callback samples. */
- ALenum mFormat;
+ ALenum mFormat{};
StreamPlayer()
{
@@ -166,8 +167,8 @@ struct StreamPlayer {
mSampleFormat = SampleType::Int16;
else
{
- auto fmtbuf = std::make_unique<ALubyte[]>(inf.datalen);
- inf.data = fmtbuf.get();
+ auto fmtbuf = std::vector<ALubyte>(inf.datalen);
+ inf.data = fmtbuf.data();
if(sf_get_chunk_data(iter, &inf) != SF_ERR_NO_ERROR)
mSampleFormat = SampleType::Int16;
else
@@ -194,12 +195,12 @@ struct StreamPlayer {
if(mSampleFormat == SampleType::Int16)
{
mSamplesPerBlock = 1;
- mBytesPerBlock = static_cast<size_t>(mSfInfo.channels * 2);
+ mBytesPerBlock = static_cast<size_t>(mSfInfo.channels) * 2;
}
else if(mSampleFormat == SampleType::Float)
{
mSamplesPerBlock = 1;
- mBytesPerBlock = static_cast<size_t>(mSfInfo.channels * 4);
+ mBytesPerBlock = static_cast<size_t>(mSfInfo.channels) * 4;
}
else
{
@@ -232,7 +233,7 @@ struct StreamPlayer {
}
else if(mSfInfo.channels == 3)
{
- if(sf_command(mSndfile, SFC_WAVEX_GET_AMBISONIC, NULL, 0) == SF_AMBISONIC_B_FORMAT)
+ if(sf_command(mSndfile, SFC_WAVEX_GET_AMBISONIC, nullptr, 0) == SF_AMBISONIC_B_FORMAT)
{
if(mSampleFormat == SampleType::Int16)
mFormat = AL_FORMAT_BFORMAT2D_16;
@@ -242,7 +243,7 @@ struct StreamPlayer {
}
else if(mSfInfo.channels == 4)
{
- if(sf_command(mSndfile, SFC_WAVEX_GET_AMBISONIC, NULL, 0) == SF_AMBISONIC_B_FORMAT)
+ if(sf_command(mSndfile, SFC_WAVEX_GET_AMBISONIC, nullptr, 0) == SF_AMBISONIC_B_FORMAT)
{
if(mSampleFormat == SampleType::Int16)
mFormat = AL_FORMAT_BFORMAT3D_16;
@@ -262,8 +263,7 @@ struct StreamPlayer {
/* Set a 1s ring buffer size. */
size_t numblocks{(static_cast<ALuint>(mSfInfo.samplerate) + mSamplesPerBlock-1)
/ mSamplesPerBlock};
- mBufferDataSize = static_cast<ALuint>(numblocks * mBytesPerBlock);
- mBufferData.reset(new ALbyte[mBufferDataSize]);
+ mBufferData.resize(static_cast<ALuint>(numblocks * mBytesPerBlock));
mReadPos.store(0, std::memory_order_relaxed);
mWritePos.store(0, std::memory_order_relaxed);
mDecoderOffset = 0;
@@ -303,7 +303,7 @@ struct StreamPlayer {
* that case, otherwise read up to the write offset. Also limit the
* amount to copy given how much is remaining to write.
*/
- size_t todo{((woffset < roffset) ? mBufferDataSize : woffset) - roffset};
+ size_t todo{((woffset < roffset) ? mBufferData.size() : woffset) - roffset};
todo = std::min<size_t>(todo, static_cast<ALuint>(size-got));
/* Copy from the ring buffer to the provided output buffer. Wrap
@@ -315,7 +315,7 @@ struct StreamPlayer {
got += static_cast<ALsizei>(todo);
roffset += todo;
- if(roffset == mBufferDataSize)
+ if(roffset == mBufferData.size())
roffset = 0;
}
/* Finally, store the updated read offset, and return how many bytes
@@ -351,7 +351,7 @@ struct StreamPlayer {
if(state != AL_INITIAL)
{
const size_t roffset{mReadPos.load(std::memory_order_relaxed)};
- const size_t readable{((woffset >= roffset) ? woffset : (mBufferDataSize+woffset)) -
+ const size_t readable{((woffset >= roffset) ? woffset : (mBufferData.size()+woffset)) -
roffset};
/* For a stopped (underrun) source, the current playback offset is
* the current decoder offset excluding the readable buffered data.
@@ -362,7 +362,7 @@ struct StreamPlayer {
? (mDecoderOffset-readable) / mBytesPerBlock * mSamplesPerBlock
: (static_cast<ALuint>(pos) + mStartOffset/mBytesPerBlock*mSamplesPerBlock))
/ static_cast<ALuint>(mSfInfo.samplerate)};
- printf("\r%3zus (%3zu%% full)", curtime, readable * 100 / mBufferDataSize);
+ printf("\r%3zus (%3zu%% full)", curtime, readable * 100 / mBufferData.size());
}
else
fputs("Starting...", stdout);
@@ -415,8 +415,8 @@ struct StreamPlayer {
* data can fit, and calculate how much can go in front before
* wrapping.
*/
- const size_t writable{(!roffset ? mBufferDataSize-woffset-1 :
- (mBufferDataSize-woffset)) / mBytesPerBlock};
+ const size_t writable{(!roffset ? mBufferData.size()-woffset-1 :
+ (mBufferData.size()-woffset)) / mBytesPerBlock};
if(!writable) break;
if(mSampleFormat == SampleType::Int16)
@@ -444,7 +444,7 @@ struct StreamPlayer {
}
woffset += read_bytes;
- if(woffset == mBufferDataSize)
+ if(woffset == mBufferData.size())
woffset = 0;
}
mWritePos.store(woffset, std::memory_order_release);
@@ -459,7 +459,7 @@ struct StreamPlayer {
* what's available.
*/
const size_t roffset{mReadPos.load(std::memory_order_relaxed)};
- const size_t readable{((woffset >= roffset) ? woffset : (mBufferDataSize+woffset)) -
+ const size_t readable{((woffset >= roffset) ? woffset : (mBufferData.size()+woffset)) -
roffset};
if(readable == 0)
return false;
@@ -522,7 +522,8 @@ int main(int argc, char **argv)
/* Get the name portion, without the path, for display. */
const char *namepart{strrchr(argv[i], '/')};
- if(namepart || (namepart=strrchr(argv[i], '\\')))
+ if(!namepart) namepart = strrchr(argv[i], '\\');
+ if(namepart)
++namepart;
else
namepart = argv[i];