Pergunta

Eu estou usando OpenAL no iPhone para jogar várias amostras de áudio simultaneamente.

Posso obter OpenAL para me avisar quando uma única amostra é feito jogando?

Eu gostaria de evitar codificar o comprimento da amostra e definir um temporizador.

Foi útil?

Solução

Se você tiver a fonte OpenAL captada em uma classe, eu acho que você pode simplesmente chamar performSelector:afterDelay: quando você iniciar o som:

- (void) play
{
    [delegate performSelector:@selector(soundHasFinishedPlaying)
        afterDelay:self.length];
    …
}

(Se você parar o som manualmente, entretanto, o retorno pode ser cancelada, consulte o NSObject Classe Referência ) ou pode consultar o AL_SOURCE_STATE:.

- (void) checkStatus
{
    ALint state;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING)
        return;
    [timer invalidate];
    [delegate soundHasFinishedPlaying];
}

Eu não sei como ter OpenAL chamá-lo de volta. O que exatamente você quer o retorno de chamada para? Algumas coisas podem ser resolvidos melhor sem uma chamada de retorno.

Outras dicas

Eu não tive muita sorte com retornos de chamada em OpenAL. Em minhas máquinas de estado, eu simplesmente pesquisar a fonte e atrasar a transição até que seja feito.


    - (BOOL)playing {
        ALint sourceState;
        alGetSourcei(sourceID, AL_SOURCE_STATE, &sourceState);
        return sourceState == AL_PLAYING;
    }

// ... //

    case QSTATE_DYING:
        if (![audioSource playing])
            [self transitionTo:QSTATE_DEAD];

Se isto não é o que você precisa, então você está melhor aposta é provavelmente um temporizador. Você não precisa codificar quaisquer valores. Você pode determinar o tempo de reprodução quando você está preenchendo seus buffers.

Um pouco de visão sobre o "porquê" da questão pode oferecer algumas opções adicionais.

Este guia OpenAL sugere uma possível solução:

A função 'stream' também nos diz se o fluxo é jogo acabado.

... e fornece código fonte de exemplo para ilustrar o uso.

Espere, você está falando de ter terminado uma amostra (por exemplo, 1/44100 segundo para 44,1 áudio KHz)? Ou você está falando sabendo que uma fonte tenha jogado através de seu buffer e não tem mais de áudio para reproduzir?

Para o último, eu tive bons resultados do polling uma fonte para a propriedade AL_BUFFERS_PROCESSED durante a transmissão buffers a uma fonte; ele pode trabalhar para o caso-buffer único a olhar para um valor diferente de zero desta propriedade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top