82 lines
1.7 KiB
C++
82 lines
1.7 KiB
C++
// Copyright (c) 2023 Dominic Masters
|
|
//
|
|
// This software is released under the MIT License.
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include "AudioData.hpp"
|
|
|
|
using namespace Dawn;
|
|
|
|
AudioData::AudioData() {
|
|
|
|
}
|
|
|
|
void AudioData::init() {
|
|
alGenBuffers((ALsizei)1, &this->buffer);
|
|
|
|
// Test
|
|
AudioFile<double> audioFile;
|
|
audioFile.load ("C:\\sample.wav");
|
|
audioFile.printSummary();
|
|
|
|
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();
|
|
}
|
|
|
|
format = AL_FORMAT_MONO16;
|
|
|
|
std::vector<uint8_t> data;
|
|
for (int i = 0; i < audioFile.getNumSamplesPerChannel(); i++) {
|
|
// for(int y = 0; y < audioFile.getNumChannels(); y++) {
|
|
for(int y = 0; y < 1; 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());
|
|
|
|
|
|
|
|
|
|
|
|
this->ready = true;
|
|
}
|
|
|
|
AudioData::~AudioData() {
|
|
if(this->ready) alDeleteBuffers((ALsizei)1, &this->buffer);
|
|
} |