首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenAL alSourceUnqueueBuffers & alSourceUnqueueBuffers

OpenAL alSourceUnqueueBuffers & alSourceUnqueueBuffers
EN

Stack Overflow用户
提问于 2012-05-14 10:17:25
回答 1查看 3.1K关注 0票数 0

各位,我对API有一个问题-- alSourceUnqueueBuffers当我使用OpenAL Libaray时。

我的问题如下:

1.我通过流媒体机制播放pcm音乐。

2.应用程序可以使用alSourceQueueBuffers将一个或多个缓冲区名称排队。

当缓冲区被处理时,

  1. 。我想在我的函数中填充新的音频数据: getSourceState。但是当我使用OpenAL alSourceUnqueueBuffers的API时。它返回一个错误-- AL_INVALID_OPERATION。我这样做是作为关于OpenAL的文档。所以我测试了一种解决这个问题的方法。我在api alSourceUnqueueBuffers之前使用alSourceStop(源代码),在通过alBufferData和alSourceQueueBuffers填充新数据之后使用alSourcePlay(源代码)。但这是不好的。因为它破坏了音乐。--

谁能帮我找到这个问题?

在哪里可以找到更多关于openAL的信息和方法?

我在等你的帮助。谢谢各位。

所以我的代码如下:

.h:

代码语言:javascript
复制
    @interface myPlayback : NSObject
    {
    ALuint                  source;
    ALuint              *   buffers;
    ALCcontext*             context;
    ALCdevice*              device;
    unsigned long long      offset;
    ALenum                  m_format;
    ALsizei                 m_freq;
    void*                   data;
    }

@end

.m

代码语言:javascript
复制
    - (void)initOpenAL
    {
    ALenum          error;

    // Create a new OpenAL Device
    // Pass NULL to specify the system’s default output device
    device = alcOpenDevice(NULL);
    if (device != NULL)
    {
        // Create a new OpenAL Context
        // The new context will render to the OpenAL Device just created 
        context = alcCreateContext(device, 0);
        if (context != NULL)
        {
            // Make the new context the Current OpenAL Context
            alcMakeContextCurrent(context);

            // Create some OpenAL Buffer Objects

            buffers = (ALuint*)malloc(sizeof(ALuint) * 5);
            alGenBuffers(5, buffers);
            if((error = alGetError()) != AL_NO_ERROR) {
                NSLog(@"Error Generating Buffers: %x", error);
                exit(1);
            }

            // Create some OpenAL Source Objects
            alGenSources(1, &source);
            if(alGetError() != AL_NO_ERROR) 
            {
                NSLog(@"Error generating sources! %x\n", error);
                exit(1);
            }

        }
    }
    // clear any errors
    alGetError();

    [self initBuffer];  
        [self initSource];
}

    - (void) initBuffer
    {
    ALenum  error = AL_NO_ERROR;
    ALenum  format;
    ALsizei size;
    ALsizei freq;

    NSBundle*               bundle = [NSBundle mainBundle];

    // get some audio data from a wave file
    CFURLRef fileURL = (CFURLRef)[[NSURL fileURLWithPath:[bundle pathForResource:@"4" ofType:@"caf"]] retain];

    if (fileURL)
    {   
        data = MyGetOpenALAudioData(fileURL, &size, &format, &freq);
        CFRelease(fileURL);
        m_freq = freq;
        m_format = format;
        if((error = alGetError()) != AL_NO_ERROR) {
            NSLog(@"error loading sound: %x\n", error);
            exit(1);
        }

        alBufferData(buffers[0], format, data, READ_SIZE , freq);
        offset += READ_SIZE;
        alBufferData(buffers[1], format, data + offset, READ_SIZE, freq);
        offset += READ_SIZE;
        alBufferData(buffers[2], format, data + offset, READ_SIZE, freq);
        offset += READ_SIZE;
        alBufferData(buffers[3], format, data + offset, READ_SIZE, freq);
        offset += READ_SIZE;
        alBufferData(buffers[4], format, data + offset, READ_SIZE, freq);
        offset += READ_SIZE;

        if((error = alGetError()) != AL_NO_ERROR) {
            NSLog(@"error attaching audio to buffer: %x\n", error);
        }       
    }
    else
        NSLog(@"Could not find file!\n");
}

    - (void) initSource
    {
    ALenum error = AL_NO_ERROR;
    alGetError(); // Clear the error

    // Turn Looping ON
    alSourcei(source, AL_LOOPING, AL_TRUE);

    // Set Source Position
    float sourcePosAL[] = {sourcePos.x, kDefaultDistance, sourcePos.y};
    alSourcefv(source, AL_POSITION, sourcePosAL);

    // Set Source Reference Distance
    alSourcef(source, AL_REFERENCE_DISTANCE, 50.0f);

    alSourceQueueBuffers(source, 5, buffers);

    if((error = alGetError()) != AL_NO_ERROR) {
        NSLog(@"Error attaching buffer to source: %x\n", error);
        exit(1);
    }   
}





    - (void)startSound
        {
        ALenum error;

        NSLog(@"Start!\n");
        // Begin playing our source file
        alSourcePlay(source);
        if((error = alGetError()) != AL_NO_ERROR) {
            NSLog(@"error starting source: %x\n", error);
        } else {
            // Mark our state as playing (the view looks at this)
            self.isPlaying = YES;
        }

        while (1) {
            [self getSourceState];
        }
}
    -(void)getSourceState
    {
    int queued;
    int processed;
    int state;
    alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
    alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    NSLog(@"%d", queued);
    NSLog(@"%d", processed);

    NSLog(@"===================================");

    while (processed > 0) {
        for (int i = 0; i < processed; ++i) {
            ALuint buf;
            alGetError();
    //            alSourceStop(source);
            ALenum y = alGetError();
            NSLog(@"%d", y);
            alSourceUnqueueBuffers(source, 1, &buf);
            ALenum i = alGetError();
            NSLog(@"%d", i);
            processed --;
            alBufferData(buf, m_format, data + offset, READ_SIZE, m_freq);
            ALenum j = alGetError();
            NSLog(@"%d", j);
            alSourceQueueBuffers(source, 1, &buf);
            ALenum k = alGetError();
            NSLog(@"%d", k);
            offset += READ_SIZE;
//            alSourcePlay(source);
        }
    }

//    [self getSourceState];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 05:02:09

我找到了问题的原因。

我打开循环的原因是:alSourcei(源代码,AL_LOOPING,AL_TRUE);

如果设置此值,则在源处理缓冲区时,希望填充新数据或从源中删除缓冲区。你会得到错误的。

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

https://stackoverflow.com/questions/10581409

复制
相关文章

相似问题

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