Pedro Leite [email protected] Agenda Introdução Buffers Listener Sources Modelos de Distância Demo Conclusão Referências Introdução OpenAL é uma API multiplataforma para áudio 3D Objetivo de situar fontes de áudio (sources) num espaço tridimensional, em volta de um ouvinte (listener) Código fonte aberto Desenvolvida em C Utiliza a notação de OpenGL para descrever comandos e argumentos glBegin, glEnd, glIsEnable, etc. alBuffer, alSource, alListener, etc. Introdução Creative Labs suporta OpenAL em seu hardware Engines que utilizam Doom 3 Jedi Knight e Jedi Knight 2 Jedi Academy Quake 4 Prey Introdução Possui tipos primitivos bem definidos ALboolean, ALchar, ALbyte, etc. Detecta algumas condições que podem levar a erros alGetError Implementa efeito Doppler Sources, listener e o próprio som possuem uma velocidade associada alDopplerFactor Diferentes modelos de distância AL_LINEAR_DISTANCE AL_INVERSE_DISTANCE AL_EXPONENCIAL_DISTANCE Introdução OpenAL fornece uma máquina de estados simples alGetBooleanv, alGetIntegerv, alGetFloatv, alGetDoublev alGetBoolean, alGetInteger, alGetFloat, alGetDouble Tempo e freqüência Métrica padrão definida em segundos e Hertz Espaço e distância Nenhuma métrica definida A critério do desenvolvedor Assim como OpenGL, OpenAL fornece um mecanismo para extensões Cada vendendor pode prover extensões diferentes em suas placas de som Introdução Buffers Encapsula os dados do áudio Buffers em OpenAL possuem dados de áudio no formato PCM Utiliza o byte order nativo do processador Big endian Little endian Podem ser compartilhados em vários contextos Podem ser referenciados por vários sources Buffers - Propriedades Freqüência Samples por segundo (Hertz) AL_FREQUENCY Tamanho Quantidade de bytes AL_SIZE Bits Quantidade de bits por sample AL_BITS Canais Quantidade de canais para os dados contidos no buffer AL_CHANNELS Buffers - Criação Podem ser criados e deletados dinamicamente void alGenBuffers(ALsizei n, ALuint* buffers) void alDeleteBuffers(ALsizei n,const ALuint* buffers); São referenciados pelo nome gerado na função alGenBuffers Formatos incluem Mono e Stereo com 8 ou 16 bits AL_FORMAT_MONO8 AL_FORMAT_MONO16 AL_FORMAT_STEREO8 AL_FORMAT_STEREO16 Buffers - Estados UNUSED Não está incluído em nenhuma fila para nenhum source O nome do buffer pode ser deletado neste estado PROCESSED Está na fila de pelo menos algum source O áudio já foi consumido PENDING Está na fila de pelo menos algum source O áudio ainda não foi totalmente consumido Listener Entidade estática que percebe o som OpenAL define somente um listener por contexto Não possui nome Listener - Propriedades Posição alListenerfv(AL_POSITION, listener_position); Velocidade Não atualiza a posição do listener com o tempo alListenerfv(AL_VELOCITY, listener_velocity); Ganho Define um multiplicador de amplitude escalar alListenerf(AL_GAIN, listener_gain); alListenerf(AL_MIN_GAIN, listener_min_gain); alListenerf(AL_MAX_GAIN, listener_max_gain); Orientação Dois vetores: direção (“at”) e normal (“up”) alListenerfv(AL_ORIENTATION, listener_orientation); Sources Fontes sonoras OpenAL permite a criação de vários sources Possuem um buffer de dados associado Som a ser emitido pelo source Definem um som localizado e um conjunto de atributos a serem aplicados ao som, em sua origem Primeiro estágio de processamento no caminho ao listener Sources - Propriedades Posição alSourcefv(AL_POSITION, source_position); Velocidade Não atualiza a posição do listener com o tempo alSourcefv(AL_VELOCITY, source_velocity); Ganho Define um multiplicador de amplitude escalar alSourcef(AL_GAIN, source_gain); alSourcef(AL_MIN_GAIN, source_min_gain); alSourcef(AL_MAX_GAIN, source_max_gain); Pitch Porcentagem da freqüência do áudio a ser utilizada alSourcef(AL_PITCH, source_pitch); Sources - Propriedades Posicionamento Em relação ao listener ou global alSourcei(AL_SOURCE_RELATIVE, source_relative); Tipo Tipo da fonte pode ser estática, streaming ou indeterminada Looping Indica se o source deve estar ou não em loop alSourcei(AL_LOOPING, source_loop); Sources - Propriedades Cone Define ângulo interno, externo e o ganho do externo alSourcef(AL_CONE_INNER_ANGLE, angle); alSourcef(AL_CONE_OUTER_ANGLE, angle); alSourcef(AL_CONE_OUTER_GAIN, value); Sources - Criação Podem ser criados sob demanda da aplicação void alGenSources(ALsizei n, ALuint* buffers) void alDeleteSources(ALsizei n,const ALuint* buffers); Dados podem ser atribuídos a um source estaticamente alSourcei(source_id, AL_BUFFER, buffer_name) Sources podem ser do tipo streaming alSourceQueueBuffer alSourceUnqueueBuffer Sources - Estados AL_INITIAL Quando o source é criado ou quando a função alSourceRewind foi devidamente chamada Próximos estados: AL_PLAYING AL_PLAYING O source está tocando o conteúdo do buffer associado a ele (estaticamente ou por streaming) através da função alSourcePlay Próximos estados: AL_PAUSED, AL_INITIAL, AL_STOPPED AL_PAUSED O source foi pausado através da função alSourcePause Próximos estados: AL_INITIAL, AL_STOPPED, AL_PLAYING AL_STOPPED O source foi parado através da função alSourceStop Próximos estados: AL_INITIAL Modelos de Distância OpenAL possui diferentes modelos de distância Ganho de cada source é atenuado pela distância Definido pelo bit AL_DISTANCE_MODEL Bits AL_REFERENCE_DISTANCE e AL_ROLLOFF_FACTOR influem diretamente no modelo escolhido AL_REFERENCE_DISTANCE é a distância máxima do source no qual o listener possui ganho Modelos de Distância AL_NONE Nenhum modelo associado AL_INVERSE_DISTANCE Ganho inversamente proporcional à distância AL_INVERSE_DISTANCE_CLAMPED Não permite ganho maior que 1 a Modelos de Distância Modelos de Distância AL_LINEAR_DISTANCE Ganho calculado através de uma função linear AL_LINEAR_DISTANCE_CLAMPED Não permite ganho maior que 1 a Modelos de Distância Modelos de Distância AL_EXPONENCIAL_DISTANCE ganho calculado através de uma função exponencial AL_EXPONENCIAL_DISTANCE_CLAMPED Não permite ganho maior que 1 Modelos de Distância Static Source, Looping & Fadeaway, Multiple Sources, Sharing Buffers, Streaming Conclusão Pontos fortes Multiplataforma Código fonte aberto Grandes empresas e projetos utilizando Fácil utilização no desenvolvimento Pontos fracos Versão no Linux ainda está na 0.0.8 Somente uma empresa fornece aceleração em hardware Referências OpenAL 1.1 Specification http://www.openal.org/documentation.html Creative Labs http://developer.creative.com/ Wikipedia http://en.wikipedia.org/wiki/OpenAL