OpenAL не воспроизводит звуки правильно? - PullRequest
1 голос
/ 06 июня 2019

Я настраиваю рендеринг звука 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, и я не знаю, что делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...