diff options
author | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2013-03-13 23:55:58 -0400 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-03-15 11:53:16 -0700 |
commit | 4ad029a76d573a8b00ea2bb11cadcfce3ac9334c (patch) | |
tree | 8d8e86536ac0eb5b0836c1d706425e7e8536f1d4 /tests/openal_playback.cpp | |
parent | 0dd0d506f77e981258dad30e916c95daeb4aef13 (diff) |
Add a testcase for simple OpenAL playback
Diffstat (limited to 'tests/openal_playback.cpp')
-rw-r--r-- | tests/openal_playback.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/openal_playback.cpp b/tests/openal_playback.cpp new file mode 100644 index 00000000..4afa55fb --- /dev/null +++ b/tests/openal_playback.cpp @@ -0,0 +1,87 @@ +#include <stdio.h> +#include <stdlib.h> +#include <AL/al.h> +#include <AL/alc.h> + +int main() { + ALCdevice* device = alcOpenDevice(NULL); + ALCcontext* context = alcCreateContext(device, NULL); + alcMakeContextCurrent(context); + + ALfloat listenerPos[] = {0.0, 0.0, 0.0}; + ALfloat listenerVel[] = {0.0, 0.0, 0.0}; + ALfloat listenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0}; + + alListenerfv(AL_POSITION, listenerPos); + alListenerfv(AL_VELOCITY, listenerVel); + alListenerfv(AL_ORIENTATION, listenerOri); + + ALuint buffers[1]; + + alGenBuffers(1, buffers); + + FILE* source = fopen("audio.wav", "rb"); + fseek(source, 0, SEEK_END); + int size = ftell(source); + fseek(source, 0, SEEK_SET); + + unsigned char* buffer = (unsigned char*) malloc(size); + fread(buffer, size, 1, source); + + unsigned offset = 12; // ignore the RIFF header + offset += 8; // ignore the fmt header + offset += 2; // ignore the format type + + unsigned channels = buffer[offset + 1] << 8; + channels |= buffer[offset]; + offset += 2; + printf("Channels: %u\n", channels); + + unsigned frequency = buffer[offset + 3] << 24; + frequency |= buffer[offset + 2] << 16; + frequency |= buffer[offset + 1] << 8; + frequency |= buffer[offset]; + offset += 4; + printf("Frequency: %u\n", frequency); + + offset += 6; // ignore block size and bps + + unsigned bits = buffer[offset + 1] << 8; + bits |= buffer[offset]; + offset += 2; + printf("Bits: %u\n", bits); + + ALenum format = 0; + if(bits == 8) + { + if(channels == 1) + format = AL_FORMAT_MONO8; + else if(channels == 2) + format = AL_FORMAT_STEREO8; + } + else if(bits == 16) + { + if(channels == 1) + format = AL_FORMAT_MONO16; + else if(channels == 2) + format = AL_FORMAT_STEREO16; + } + + offset += 8; // ignore the data chunk + + printf("Start offset: %d\n", offset); + + alBufferData(buffers[0], format, &buffer[offset], size - offset, frequency); + + ALuint sources[1]; + alGenSources(1, sources); + + alSourcei(sources[0], AL_BUFFER, buffers[0]); + + alSourcePlay(sources[0]); + + int result = 1; + REPORT_RESULT(); + + return 0; +} |