Audio API first pass
This commit is contained in:
@ -8,8 +8,6 @@ target_link_libraries(${DAWN_TARGET_NAME}
|
||||
PUBLIC
|
||||
glfw
|
||||
glad
|
||||
OpenAL
|
||||
AudioFile
|
||||
)
|
||||
|
||||
# Includes
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user