Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 带简介的开放式软循环_Loops_Buffer_Openal Soft - Fatal编程技术网

Loops 带简介的开放式软循环

Loops 带简介的开放式软循环,loops,buffer,openal-soft,Loops,Buffer,Openal Soft,我一直在使用Win32的OpenAL软件,我遇到了一个特殊的问题 我的目标是播放一个循环声音,它有一个单镜头的介绍部分,类似于带有循环标记的.WAV文件。据我所知,这必须在OpenAL中通过在源代码上使用多个缓冲区来实现。通常,我的方法是将两个缓冲区排队,然后等待第二个缓冲区播放,并将源设置为循环。这是可行的,但问题是,一旦我准备好停止声音,我似乎无法将最后一个缓冲区解列。我的代码大致如下所示: // set up the sound alSourceQueueBuffers(source, 1

我一直在使用Win32的OpenAL软件,我遇到了一个特殊的问题

我的目标是播放一个循环声音,它有一个单镜头的介绍部分,类似于带有循环标记的.WAV文件。据我所知,这必须在OpenAL中通过在源代码上使用多个缓冲区来实现。通常,我的方法是将两个缓冲区排队,然后等待第二个缓冲区播放,并将源设置为循环。这是可行的,但问题是,一旦我准备好停止声音,我似乎无法将最后一个缓冲区解列。我的代码大致如下所示:

// set up the sound
alSourceQueueBuffers(source, 1, &buffer1);
alSourceQueueBuffers(source, 1, &buffer2);
alSourcePlay(source);

...

// check to loop sound in update
ALint buffer;
alGetSourcei(source, AL_BUFFER, &buffer);
if (buffer == buffer2)
{
    alSourcei(source, AL_LOOPING, true);
}

..

// check to stop sound in update
if (shouldStop)
{
    alSourcei(source, AL_LOOPING, false);
    alSourceStop(source);

    alSourceUnqueueBuffers(source, 1, &buffer1);
    alSourceUnqueueBuffers(source, 1, &buffer2); // AL_INVALID_OPERATION
}
其结果似乎是缓冲区未正确排队,下次播放此源代码时将听到。我知道通常只能在缓冲区播放结束后将其解列,但我认为我可以在停止的声音上自由地将任何缓冲区解列。我想知道是否是我使用循环标志导致了这种行为

我非常感谢你的建议

谢谢,,
迈克

看来有办法解决这个问题。我无法取消播放缓冲区的队列,但我可以使用以下行完全清除队列:

alSourcei(source, AL_BUFFER, AL_NONE);

停止声音后,这将很好地工作。

我认为正确使用
以及资源队列缓冲区(source、1和buffer1)
是创建一个缓冲区数组并将其发送进来,而不是调用两次,而是在数组上调用一次,如下所示:

ALuint buffers[2] = { buffer1, buffer2 };
alSourceUnqueueBuffers(source, 2, buffers);
注意,我们使用2的大小来表示2个缓冲区