首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >alDeleteBuffers函数的“'Invalid”错误

alDeleteBuffers函数的“'Invalid”错误
EN

Stack Overflow用户
提问于 2015-09-10 08:47:13
回答 1查看 531关注 0票数 1

在此程序中,函数alDeleteBuffers在几秒钟后生成Invalid Name错误:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>


#ifdef __APPLE__
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
#elif __linux
#include <AL/al.h>
#include <AL/alut.h>
#include <AL/alc.h>
#endif


#include <iostream>
#include <thread>
using namespace std;


class Sound
{
public:
    ALCdevice* openal_output_device;
    ALCcontext* openal_output_context;


    int al_check_error(const char * given_label)
    {
        ALenum al_error = alGetError();

        if(al_error != AL_NO_ERROR)
        {
            printf("ERROR - %s  (%s)\n", alGetString(al_error), given_label);
            return al_error;
        }
        return 0;
    }

    void StartAl()
    {
        const char* defname = alcGetString(0,ALC_DEFAULT_DEVICE_SPECIFIER);
        openal_output_device  = alcOpenDevice(defname);
        openal_output_context = alcCreateContext(openal_output_device,0);
        alcMakeContextCurrent(openal_output_context);
    }

    void EndAl()
    {
        alcMakeContextCurrent(0);
        al_check_error("EndAl1");
        alcDestroyContext(openal_output_context);
        al_check_error("EndAl2");
        alcCloseDevice(openal_output_device);
        al_check_error("EndAl3");
    }

    void Beep(float frequency, float seconds)
    {
        seconds *= 2;

        ALuint internal_buffer;
        ALuint streaming_source[1];

        alGenBuffers(1,&internal_buffer);
        al_check_error("failed call to alGenBuffers");

        /* Fill buffer with Sine-Wave */
        unsigned sample_rate = 10000;

        size_t buf_size = seconds*sample_rate;

        // allocate PCM audio buffer
        short* samples = new short[buf_size];

        for(int i = 0; i < buf_size; i++)
            samples[i] = 32760*sin(2*M_PI*i*frequency/sample_rate);


        /* upload buffer to OpenAL */
        alBufferData(internal_buffer, AL_FORMAT_MONO16, samples, buf_size, sample_rate);
        al_check_error("alBufferData Failed");

        delete[] samples;//free(samples);

        /* Set-up sound source and play buffer */

        alGenSources(1,&streaming_source[0]);
        alSourcei(streaming_source[0], AL_BUFFER, internal_buffer);
        alSourcePlay(streaming_source[0]);


        ALenum current_playing_state;
        alGetSourcei(streaming_source[0],AL_SOURCE_STATE,&current_playing_state);
        al_check_error("alGetSourcei Failed");

        alutSleep(seconds);
        while(current_playing_state == AL_PLAYING)
        {
            alGetSourcei(streaming_source[0], AL_SOURCE_STATE, &current_playing_state);
            if(al_check_error("alGetSourcei in while loop") != 0)
                break;
            alutSleep(0.1);
        }

        alSourceStopv(1,&streaming_source[0]);
        al_check_error("alSourceStopv");
        alSourcei(streaming_source[0],AL_BUFFER,0);
        al_check_error("alSourcei");
        alDeleteSources(1,&streaming_source[0]);
        al_check_error("alDeleteSources");

        alDeleteBuffers(16,&streaming_source[0]); // HERE HERE HERE HERE
        al_check_error("alDeleteBuffers");
    }

    Sound()
    {
        StartAl();
    }
    ~Sound()
    {
        EndAl();
    }
};


void Beep(float frequency = 440, float seconds = 1)
{
    static Sound s;
    s.Beep(frequency,seconds);
}


int main()
{
   for(int i = 0; i < 1000; i++)
   {
        thread t(Beep, 840,0.5);
        t.detach();
        alutSleep(0.01);
        cout<< i << "\n";
   }
    cin.get();
}     

此外,EndAl方法中的所有OpenAl函数都会产生(null)错误。

为什么会发生这种情况,有没有办法解决它?

就是这条线

代码语言:javascript
复制
alDeleteBuffers(16,&streaming_source[0]);

是否需要释放缓冲区和占用的内存?

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 17:04:53

我建议你改变

代码语言:javascript
复制
alDeleteBuffers(16,&streaming_source[0]); // HERE HERE HERE HERE

代码语言:javascript
复制
alDeleteBuffers(1,&internal_buffer); // HERE HERE HERE HERE

因为这个函数似乎是一个缓冲区删除器。

此外,您也不需要使用数组:

代码语言:javascript
复制
ALuint streaming_source[1];

使用变量代替,以获得更简单的代码。

关于(null)错误,我不知道,可能不是错误,因为OpenAl已经结束了,alGetError在这种情况下可能不能使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32491292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档