From f8d3a35cf878fbfbb9ef1f56e1c4e6143737cdef Mon Sep 17 00:00:00 2001 From: Nicolay Korslund Date: Fri, 1 Jan 2010 19:48:04 +0100 Subject: [PATCH] Made separate tests for audiere and openal. Fixed segfault. Everything is peachy. --- sound/outputs/openal_out.cpp | 8 +++- sound/outputs/openal_out.h | 7 ++- sound/sources/audiere_source.cpp | 2 + sound/sources/stream_source.h | 6 +-- sound/tests/Makefile | 8 +++- sound/tests/audiere_source_test.cpp | 69 ++++++++++++++++++++++++++++ sound/tests/cow.raw | Bin 0 -> 37502 bytes sound/tests/openal_audiere_test.cpp | 2 - sound/tests/openal_output_test.cpp | 46 +++++++++++++++++++ 9 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 sound/tests/audiere_source_test.cpp create mode 100644 sound/tests/cow.raw create mode 100644 sound/tests/openal_output_test.cpp diff --git a/sound/outputs/openal_out.cpp b/sound/outputs/openal_out.cpp index 99b976bc9d..e6d0b3ae7b 100644 --- a/sound/outputs/openal_out.cpp +++ b/sound/outputs/openal_out.cpp @@ -27,7 +27,13 @@ static void checkALError(const std::string &msg) { ALenum err = alGetError(); if(err != AL_NO_ERROR) - fail("\"" + std::string(alGetString(err)) + "\" while " + msg); + { + const ALchar* errmsg = alGetString(err); + if(errmsg) + fail("\"" + std::string(alGetString(err)) + "\" while " + msg); + else + fail("non-specified error while " + msg + " (did you forget to initialize OpenAL?)"); + } } static void getALFormat(SampleSourcePtr inp, int &fmt, int &rate) diff --git a/sound/outputs/openal_out.h b/sound/outputs/openal_out.h index 335880cda2..2ec5936653 100644 --- a/sound/outputs/openal_out.h +++ b/sound/outputs/openal_out.h @@ -21,8 +21,13 @@ class OpenAL_Sound : public Sound int *refCnt; public: + /// Read samples from the given input buffer OpenAL_Sound(SampleSourcePtr input); - OpenAL_Sound(ALuint buf, int *ref); // Used for cloning + + /// Play an existing buffer, with a given ref counter. Used + /// internally for cloning. + OpenAL_Sound(ALuint buf, int *ref); + ~OpenAL_Sound(); void play(); diff --git a/sound/sources/audiere_source.cpp b/sound/sources/audiere_source.cpp index 8da4fe3c7d..8a6b57ada8 100644 --- a/sound/sources/audiere_source.cpp +++ b/sound/sources/audiere_source.cpp @@ -135,6 +135,8 @@ void AudiereSource::setup() int channels, rate; sample->getFormat(channels, rate, fmt); + pullSize = 0; + // Calculate the size of one frame frameSize = GetSampleSize(fmt) * channels; diff --git a/sound/sources/stream_source.h b/sound/sources/stream_source.h index 278f701e8a..42791ccdf1 100644 --- a/sound/sources/stream_source.h +++ b/sound/sources/stream_source.h @@ -10,10 +10,10 @@ namespace Sound { class Stream2Samples : public SampleSource { int32_t rate, channels, bits; - Stream::StreamPtr inp; + Mangle::Stream::StreamPtr inp; public: - Stream2Samples(Stream::StreamPtr _inp, int32_t _rate, int32_t _channels, int32_t _bits) + Stream2Samples(Mangle::Stream::StreamPtr _inp, int32_t _rate, int32_t _channels, int32_t _bits) : inp(_inp), rate(_rate), channels(_channels), bits(_bits) { isSeekable = inp->isSeekable; @@ -24,7 +24,7 @@ class Stream2Samples : public SampleSource /// Get the sample rate, number of channels, and bits per /// sample. NULL parameters are ignored. - void getInfo(int32_t *_rate, int32_t *_channels, int32_t *_bits) const + void getInfo(int32_t *_rate, int32_t *_channels, int32_t *_bits) { if(_rate) *_rate = rate; if(_channels) *_channels = channels; diff --git a/sound/tests/Makefile b/sound/tests/Makefile index ca7a933c63..75fb1e9e63 100644 --- a/sound/tests/Makefile +++ b/sound/tests/Makefile @@ -1,6 +1,6 @@ GCC=g++ -I../ -all: openal_audiere_test +all: audiere_source_test openal_output_test openal_audiere_test #L_FFMPEG=$(shell pkg-config --libs libavcodec libavformat) L_OPENAL=$(shell pkg-config --libs openal) @@ -9,5 +9,11 @@ L_AUDIERE=-laudiere openal_audiere_test: openal_audiere_test.cpp ../sources/audiere_source.cpp ../outputs/openal_out.cpp ../../stream/clients/audiere_file.cpp $(GCC) $^ -o $@ $(L_AUDIERE) $(L_OPENAL) +openal_output_test: openal_output_test.cpp ../outputs/openal_out.cpp + $(GCC) $^ -o $@ $(L_OPENAL) + +audiere_source_test: audiere_source_test.cpp ../sources/audiere_source.cpp ../../stream/clients/audiere_file.cpp + $(GCC) $^ -o $@ $(L_AUDIERE) + clean: rm *_test diff --git a/sound/tests/audiere_source_test.cpp b/sound/tests/audiere_source_test.cpp new file mode 100644 index 0000000000..6dba37b515 --- /dev/null +++ b/sound/tests/audiere_source_test.cpp @@ -0,0 +1,69 @@ +#include + +#include "../../stream/servers/file_stream.h" +#include "../sources/audiere_source.h" +#include "../../stream/filters/buffer_stream.h" + +#include +#include + +using namespace std; +using namespace Mangle::Stream; +using namespace Mangle::Sound; + +// Contents and size of cow.raw +void *orig; +size_t orig_size; + +void run(SampleSourcePtr &src) +{ + size_t ss = src->size(); + assert(ss == orig_size); + + cout << "Source size: " << ss << endl; + int rate, channels, bits; + src->getInfo(&rate, &channels, &bits); + cout << "rate=" << rate << "\nchannels=" << channels + << "\nbits=" << bits << endl; + + cout << "Reading entire buffer into memory\n"; + void *buf = malloc(ss); + src->read(buf, ss); + + cout << "Comparing...\n"; + if(memcmp(buf, orig, ss) != 0) + { + cout << "Oops!\n"; + assert(0); + } + + cout << "Done\n"; +} + +int main() +{ + { + cout << "Reading cow.raw first\n"; + FileStream tmp("cow.raw"); + orig_size = tmp.size(); + cout << "Size: " << orig_size << endl; + orig = malloc(orig_size); + tmp.read(orig, orig_size); + cout << "Done\n"; + } + + { + cout << "\nLoading cow.wav by filename:\n"; + SampleSourcePtr cow_file( new AudiereSource("cow.wav") ); + run(cow_file); + } + + { + cout << "\nLoading cow.wav by stream:\n"; + StreamPtr inp( new FileStream("cow.wav") ); + SampleSourcePtr cow_stream( new AudiereSource(inp) ); + run(cow_stream); + } + + return 0; +} diff --git a/sound/tests/cow.raw b/sound/tests/cow.raw new file mode 100644 index 0000000000000000000000000000000000000000..c4d155bbfb1caba2e41b1a97e01f29276c945c07 GIT binary patch literal 37502 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 F{|CY68e9MX literal 0 HcmV?d00001 diff --git a/sound/tests/openal_audiere_test.cpp b/sound/tests/openal_audiere_test.cpp index a39ae3d98d..9c49356a26 100644 --- a/sound/tests/openal_audiere_test.cpp +++ b/sound/tests/openal_audiere_test.cpp @@ -1,9 +1,7 @@ #include -#include #include #include "../../stream/servers/file_stream.h" -#include "../../stream/filters/buffer_stream.h" #include "../filters/openal_audiere.h" using namespace std; diff --git a/sound/tests/openal_output_test.cpp b/sound/tests/openal_output_test.cpp new file mode 100644 index 0000000000..11b2fc42e4 --- /dev/null +++ b/sound/tests/openal_output_test.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include "../../stream/servers/file_stream.h" +#include "../sources/stream_source.h" +#include "../outputs/openal_out.h" + +using namespace std; +using namespace Mangle::Stream; +using namespace Mangle::Sound; + +int main() +{ + cout << "Loading cow.raw\n"; + + int rate = 11025; + int chan = 1; + int bits = 16; + + cout << " rate=" << rate << "\n channels=" << chan + << "\n bits=" << bits << endl; + + StreamPtr file( new FileStream("cow.raw") ); + SampleSourcePtr source( new Stream2Samples( file, rate, chan, bits)); + + cout << "Playing\n"; + + // This initializes OpenAL for us, and serves no other purpose. + OpenAL_Factory mg; + + OpenAL_Sound snd(source); + try + { + snd.play(); + + while(snd.isPlaying()) + { + usleep(10000); + } + } + catch(exception &e) + { + cout << " ERROR: " << e.what() << "\n"; + } + return 0; +}