Pedro [email protected]
IntroduçãoOpenAL é uma API multiplataforma para áudio
3DObjetivo de situar fontes de áudio (sources)
num espaço tridimensional, em volta de um ouvinte (listener)
Código fonte abertoDesenvolvida em CUtiliza a notação de OpenGL para descrever
comandos e argumentosglBegin, glEnd, glIsEnable, etc.alBuffer, alSource, alListener, etc.
IntroduçãoCreative Labs suporta OpenAL em seu
hardware
Engines que utilizamDoom 3Jedi Knight e Jedi Knight 2Jedi AcademyQuake 4Prey
IntroduçãoPossui tipos primitivos bem definidos
ALboolean, ALchar, ALbyte, etc.Detecta algumas condições que podem levar a
errosalGetError
Implementa efeito DopplerSources, listener e o próprio som possuem uma
velocidade associadaalDopplerFactor
Diferentes modelos de distânciaAL_LINEAR_DISTANCEAL_INVERSE_DISTANCEAL_EXPONENCIAL_DISTANCE
IntroduçãoOpenAL fornece uma máquina de estados simples
alGetBooleanv, alGetIntegerv, alGetFloatv, alGetDoublev
alGetBoolean, alGetInteger, alGetFloat, alGetDoubleTempo e freqüência
Métrica padrão definida em segundos e HertzEspaço e distância
Nenhuma métrica definidaA critério do desenvolvedor
Assim como OpenGL, OpenAL fornece um mecanismo para extensõesCada vendendor pode prover extensões diferentes
em suas placas de som
BuffersEncapsula os dados do áudioBuffers em OpenAL possuem dados de áudio
no formato PCMUtiliza 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 - PropriedadesFreqüência
Samples por segundo (Hertz)AL_FREQUENCY
TamanhoQuantidade de bytesAL_SIZE
BitsQuantidade de bits por sampleAL_BITS
CanaisQuantidade de canais para os dados contidos no
bufferAL_CHANNELS
Buffers - CriaçãoPodem 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
alGenBuffersFormatos incluem Mono e Stereo com 8 ou 16 bits
AL_FORMAT_MONO8AL_FORMAT_MONO16AL_FORMAT_STEREO8AL_FORMAT_STEREO16
Buffers - EstadosUNUSED
Não está incluído em nenhuma fila para nenhum source
O nome do buffer pode ser deletado neste estadoPROCESSED
Está na fila de pelo menos algum sourceO áudio já foi consumido
PENDINGEstá na fila de pelo menos algum sourceO áudio ainda não foi totalmente consumido
ListenerEntidade estática que percebe o som
OpenAL define somente um listener por contexto
Não possui nome
Listener - PropriedadesPosição
alListenerfv(AL_POSITION, listener_position);Velocidade
Não atualiza a posição do listener com o tempoalListenerfv(AL_VELOCITY, listener_velocity);
GanhoDefine um multiplicador de amplitude escalaralListenerf(AL_GAIN, listener_gain);alListenerf(AL_MIN_GAIN, listener_min_gain);alListenerf(AL_MAX_GAIN, listener_max_gain);
OrientaçãoDois vetores: direção (“at”) e normal (“up”)alListenerfv(AL_ORIENTATION, listener_orientation);
SourcesFontes sonoras
OpenAL permite a criação de vários sourcesPossuem um buffer de dados associado
Som a ser emitido pelo sourceDefinem um som localizado e um conjunto de
atributos a serem aplicados ao som, em sua origemPrimeiro estágio de processamento no caminho
ao listener
Sources - PropriedadesPosição
alSourcefv(AL_POSITION, source_position);Velocidade
Não atualiza a posição do listener com o tempoalSourcefv(AL_VELOCITY, source_velocity);
GanhoDefine um multiplicador de amplitude escalaralSourcef(AL_GAIN, source_gain);alSourcef(AL_MIN_GAIN, source_min_gain);alSourcef(AL_MAX_GAIN, source_max_gain);
PitchPorcentagem da freqüência do áudio a ser utilizadaalSourcef(AL_PITCH, source_pitch);
Sources - PropriedadesPosicionamento
Em relação ao listener ou globalalSourcei(AL_SOURCE_RELATIVE,
source_relative);Tipo
Tipo da fonte pode ser estática, streaming ou indeterminada
LoopingIndica se o source deve estar ou não em loop
alSourcei(AL_LOOPING, source_loop);
Sources - PropriedadesCone
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çãoPodem 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
estaticamentealSourcei(source_id, AL_BUFFER, buffer_name)
Sources podem ser do tipo streamingalSourceQueueBufferalSourceUnqueueBuffer
Sources - EstadosAL_INITIAL
Quando o source é criado ou quando a função alSourceRewind foi devidamente chamada
Próximos estados: AL_PLAYINGAL_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_STOPPEDAL_PAUSED
O source foi pausado através da função alSourcePausePróximos estados: AL_INITIAL, AL_STOPPED, AL_PLAYING
AL_STOPPEDO source foi parado através da função alSourceStopPróximos estados: AL_INITIAL
Modelos de DistânciaOpenAL possui diferentes modelos de distância
Ganho de cada source é atenuado pela distânciaDefinido pelo bit AL_DISTANCE_MODELBits AL_REFERENCE_DISTANCE e
AL_ROLLOFF_FACTOR influem diretamente no modelo escolhidoAL_REFERENCE_DISTANCE é a distância
máxima do source no qual o listener possui ganho
Modelos de DistânciaAL_NONE
Nenhum modelo associadoAL_INVERSE_DISTANCE
Ganho inversamente proporcional à distância
AL_INVERSE_DISTANCE_CLAMPEDNão permite ganho maior que 1
a
Modelos de DistânciaAL_LINEAR_DISTANCE
Ganho calculado através de uma função linear
AL_LINEAR_DISTANCE_CLAMPEDNão permite ganho maior que 1
a
Modelos de DistânciaAL_EXPONENCIAL_DISTANCE
ganho calculado através de uma função exponencial
AL_EXPONENCIAL_DISTANCE_CLAMPEDNão permite ganho maior que 1
ConclusãoPontos fortes
MultiplataformaCódigo fonte abertoGrandes empresas e projetos utilizandoFácil utilização no desenvolvimento
Pontos fracosVersão no Linux ainda está na 0.0.8Somente uma empresa fornece aceleração em
hardware