Audio API first pass

This commit is contained in:
2023-01-17 10:13:08 -08:00
parent 2950bc9184
commit 9168348e6b
27 changed files with 513 additions and 95 deletions

View File

@ -8,8 +8,6 @@ target_link_libraries(${DAWN_TARGET_NAME}
PUBLIC
glfw
glad
OpenAL
AudioFile
)
# Includes

View File

@ -10,9 +10,6 @@
#include "dawnopengl.hpp"
#include "display/BackBufferRenderTarget.hpp"
#include <AL/al.h>
#include <AL/alc.h>
#include "AudioFile.h"
using namespace Dawn;
@ -26,92 +23,6 @@ DawnHost::DawnHost() {
}
int32_t DawnHost::init(DawnGame *game) {
AudioFile<double> audioFile;
audioFile.load ("C:\\sample.wav");
audioFile.printSummary();
ALCdevice* device = alcOpenDevice(nullptr);
if(!device) assertUnreachable();
ALCcontext *context;
context = alcCreateContext(device, NULL);
if(!alcMakeContextCurrent(context)) assertUnreachable();
ALfloat listenerOri[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f };
alListener3f(AL_POSITION, 0, 0, 1.0f);
alListener3f(AL_VELOCITY, 0, 0, 0);
alListenerfv(AL_ORIENTATION, listenerOri);
ALuint source;
alGenSources((ALuint)1, &source);
alSourcef(source, AL_PITCH, 1);
alSourcef(source, AL_GAIN, 1);
alSource3f(source, AL_POSITION, 0, 0, 0);
alSource3f(source, AL_VELOCITY, 0, 0, 0);
alSourcei(source, AL_LOOPING, AL_FALSE);
ALuint buffer;
alGenBuffers((ALuint)1, &buffer);
ALenum format;
switch(audioFile.getBitDepth()) {
case 16:
switch(audioFile.getNumChannels()) {
case 2:
format = AL_FORMAT_STEREO16;
break;
case 1:
format = AL_FORMAT_MONO16;
break;
default:
assertUnreachable();
}
break;
case 8:
switch(audioFile.getNumChannels()) {
case 2:
format = AL_FORMAT_STEREO8;
break;
case 1:
format = AL_FORMAT_MONO8;
break;
default:
assertUnreachable();
}
break;
default:
assertUnreachable();
}
std::vector<uint8_t> data;
for (int i = 0; i < audioFile.getNumSamplesPerChannel(); i++) {
for(int y = 0; y < audioFile.getNumChannels(); y++) {
double sample = audioFile.samples[y][i];
sample = mathClamp(sample, -1., 1.);
auto q = static_cast<int16_t> (sample * 32767.);
uint8_t bytes[2];
bytes[0] = (q >> 8) & 0xFF;
bytes[1] = q & 0xFF;
data.push_back(bytes[1]);
data.push_back(bytes[0]);
}
}
alBufferData(buffer, format, &data[0], data.size(), audioFile.getSampleRate());
ALint source_state;
alSourcei(source, AL_BUFFER, buffer);
alSourcePlay(source);
alGetSourcei(source, AL_SOURCE_STATE, &source_state);
while (source_state == AL_PLAYING) {
alGetSourcei(source, AL_SOURCE_STATE, &source_state);
}
return DAWN_HOST_INIT_RESULT_SUCCESS;
// Update values
this->game = game;
DAWN_HOST = this;