Я настраиваю рендеринг звука OpenAL в 16-битном моно при 44,1 кГц, и я собрал массив данных звуков, который поднимается до + -16 000 как короткое целое число, но когда я загружаю буфер AL, я не получить звук.
Я подтвердил, что мой код помещает данные в указанное мной короткое замыкание, и не смог проверить, эффективно ли AL создает буферы. Тем не менее, я проверил, что композиция записывается в краткий и что строки проходят в компиляторе. Когда я запускаю программу, AL не может обнаружить аудиоустройство и выдает ошибку: Ошибка воспроизведения ALCmmdev: Ошибка инициализации устройства.
В любом случае, вот соответствующий код:
main.cpp:
void trackPlay(){
//tracking =
ALCdevice *dev = NULL;
ALCcontext *ctx = NULL;
const char *defname = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
std::cout << "Default device: " << defname << std::endl;
dev = alcOpenDevice(defname);
ctx = alcCreateContext(dev, NULL);
alcMakeContextCurrent(ctx);
for(int i=0;i<instruments.size();i++){
instruments[i].currentStep = tracking;
instruments[i].assembleSongData();
alBufferData(instruments[i].soundbuffer, AL_FORMAT_MONO16, &instruments[i].samples, sizeof(instruments[i].samples), 44100);
instruments[i].soundsource = i;
alGenSources(i, &instruments[i].soundsource);
alSourcei(instruments[i].soundsource, AL_BUFFER, instruments[i].soundbuffer);
}
for(int i=0;i<instruments.size();i++){
alSourcePlay(instruments[i].soundsource);
}
}
entities.h:
void playVertice(short data[], float srate, float freq, float amp, float phase,
float decayf, float bpm,float am,float amfreq, float fm, float fmfreq,float step){
float ampmult = 1024.0f;
float cycle = 2.0f;
float minute = 60.0f;
float i = 0.0f;
float ampadj =ampmult* amp;
float M_PI = PI;
int sizeSS=((44100*(60/tempo))*composition.size()+ (44100*(60/tempo))*16);
//data=data;
for(float i = step*(44100*(60/tempo));i<sizeSS;(i)++){
//cout<<"\nattempting transfer at "<<i;
data[(short)i] += (ampadj*(((sin(((freq*2.0*M_PI)/44100*i)*phase+((freq*2.0*M_PI)/44100*i)*(fm*sin((fmfreq*2.0*M_PI)/44100*i))))
+(sin(((freq*2.0*M_PI)/44100*i)+((freq*2.0*M_PI)/44100*i)*(fm*sin((fmfreq*2.0*M_PI)/44100*i))))
*(sin((amfreq*2.0*M_PI)/44100*i)*am))));
}
}
short samples;
void assembleSongData(){
updateVoices();
assembleVoices();
float bpm = tempo;
//ALfloat *soundstream;
ALuint srate = 44100;
alGenBuffers(1, &soundbuffer);
short *samples=(short*)malloc(4*((44100*(60/tempo))*composition.size()+ (44100*(60/tempo))*16));
cout<<composition.size();
for (int it=0;composition.size()>it&&stepvoices.size()>it;it++){
for(int iu=0; iu < composition[it].size() && iu < stepvoices[it].size();iu++){
for (int ii=0;ii<stepvoices[it][iu].size()&&it<composition[it][iu].size();ii++){
for (int iy=0;iy<composition[it][iu].size();iy++){
for (int i=0;i<voices_spinner;i++){
//cout<<it<<"\n";
float amp=composition.at(it).at(iu).at(iy)*stepvoices[it][iu][i];
float pitch=composition.at(it).at(iu).at(iy)*stepvoices[it][iu][i];
float phase=stepvoices[it][iu][i];
float decayf=decaystep.at(it);
playVertice(samples,srate,pitch,amp,phase,
decayf,tempo,amint_spinner,am_spinner,fmint_spinner,fm_spinner,it);
}
}
}
}
}
cout<<"\nwrote composition\n";
}
Я получаю ошибку AlcDeviceFailed, но при воспроизведении песни она фактически обнаруживает мое устройство. В любом случае, раньше у меня было это программное обеспечение, работающее там, где оно воспроизводилось через мое аудиоустройство, но тогда данные записывались как все -32768 или около того, и мой динамик просто отключился на 5 минут. Теперь я ожидаю услышать звук, но что-то не так с моим кодом AL, и я не знаю, что делать.