我在我的iPhone项目中使用OpenAL创建的声音在离听众更远时会衰减.
但是 - 我也想播放一些不会被距离衰减的声音效果.
到目前为止,我通过使用不会衰减的立体声来解决这个问题.但是现在我添加了大量的声音,这需要相当大的空间 - 所以我希望它们是单声道的,现在再次出现问题,它们会被距离衰减.
我的下一个解决方案是将播放语音样本的源的"AL_MIN_GAIN"设置为1.0,但这似乎仅在模拟器上工作,而不是在设备上.
是否有其他方法可以播放openAL不会因距离而减弱的声音效果?
我之前使用过SDL_Mixer,它可以正确地完成这项工作:当我按顺序播放一个单一函数调用一个声音时,所有声音都会混合在一起.但是在OpenAL中,当我用alSourcePlay()播放声音时,它只播放一个声音,而不会混合到之前的声音中.
那么,我怎么能同时播放超过1个声音呢?
在我的iOS应用程序中,我不想使用OpenAL播放声音.我有AudioManager类,负责声音管理(单例).创建所有声源和缓冲区(在第一次instance调用时).
因此,播放我需要的声音 - 是停止先前的声音,清除旧的缓冲区(必要的源),连接新的缓冲区,设置音高和增益,最后播放声音.所有这些操作都在playSound:(AMSound)sound方法中(AMSound是一个简单的枚举).
对于UI效果,我从主线程调用此方法.但我的应用程序有很多背景工作,有时还伴有声音效果.
我可以playSound:直接从后台线程调用,还是应该只在主线程上调用它?那么同步声音呢:一个是从主线程创建的,另一个是从背景创建的?
我正在尝试编译一个在Mac OS X 10.7上使用OpenAL的项目.如果我将使用XCode,我可以链接OpenAL.framework,但在目录中
/System/Library/Frameworks/OpenAL.framework/
Run Code Online (Sandbox Code Playgroud)
没有名为'Libraries'的子目录.那么我应该链接什么呢?
我正在尝试使用OpenAL创建语音聊天程序.事情的网络方面似乎没问题,但我会接受建议=]
我目前遇到的问题是尝试从麦克风播放捕获的音频数据.我按照这里找到的代码获取麦克风输入并将其回显给扬声器.
这工作正常,但我似乎无法在捕获完成后播放完全捕获的音频.
当一些声音被捕获时,我将它存储在如此的列表中......
for (int i = 0; i < CAP_SIZE; i++)
{
playbackBuffer.push_back( buffer[i] );
}
Run Code Online (Sandbox Code Playgroud)
捕获完成后,我尝试(并失败)使用以下代码播放该音频
ALuint playbackSource;
alGenSources(1, &playbackSource);
errorCode = alGetError();
ALuint tempPlayback;
alBufferData(tempPlayback, AL_FORMAT_MONO16, &playbackBuffer.front(), playbackBuffer.size()*sizeof(ALuint), FREQ);
// Attach the playback buffer to the new playback source
alSourcei(playbackSource, AL_BUFFER, tempPlayback);
alSourcePlay(playbackSource);
ALint sState = 0;
do
{
alGetSourcei(playbackSource, AL_SOURCE_STATE, &sState);
}
while ((sState == AL_PLAYING));
Run Code Online (Sandbox Code Playgroud)
调试时,我可以看到playbackBuffer中有很多数据,此时播放的噪音有一瞬间,但远不及捕获的噪声.
编辑:我添加了该行
alGenBuffers(1, &tempPlayback);
Run Code Online (Sandbox Code Playgroud)
在创建tempPlayback之后和调用alBufferData(...)之前,现在播放正确的时间,但我听到的只是一个高音调的噪音.
我已经在互联网上到处搜索了解决方案,但似乎找不到确切的答案。
基本上,我希望在android平台上实现3D音频环境。我正在寻找的是一个能够使用类似坐标系的东西将声音放置在虚拟空间中的android库。
我知道iOS具有OpenAL,但是否有Android等效产品?我也知道AudioTrack该类的存在,但是我正在寻找一些不太原始的东西。
提前致谢。
为了一切的热爱,我已经呆了三个小时。
当我移动监听器时,OpenAL完全打破了衰减。我不知道为什么。
如果我不更改侦听器设置,则可以正常工作。但不幸的是,这不是3D游戏中可行的解决方案。
我已经尝试了所有方法,从标准化所有发声组件的位置和速度,到手动设置所有衰减设置。但是,毫无疑问地更改监听器上的任何设置总是会破坏衰减。如果我移动收听者,我会听到距离我100个单位的声音,好像它的位置没有作用。
我什至使用过alGet参数来检查并查看值是否正确通过。他们是。
游戏中的每个单位为1x1,因此在许多情况下,两个实体之间的距离约为100个单位。
alListener3f(AL_POSITION, pos.x, pos.y, pos.z);
alListener3f(AL_VELOCITY, vel.x, vel.y, vel.z);
alListener(AL_ORIENTATION, system.listener.getOrientationBuffer());
alListenerf(AL_GAIN, system.listener.getMasterGain());
Run Code Online (Sandbox Code Playgroud)
这就是负责更改侦听器的所有代码。根据指示,主增益为0.5f,声音本身也为0.5f。距离模型为AL_LINEAR_DISTANCE_CLAMPED,参考距离为1f,最大距离为2f。衰减仍然不起作用,并且放置也没有区别。在LINEAR_DISTANCE_CLAMPED模式下,无论如何,距离都不起作用。如果我将其保留为默认模型,则当我不移动侦听器时,它将不起作用。
方向已保留为默认值 (0, 0, -1f, 0, 1f, 0f)
不,我的声音驱动程序很好,这台计算机是在不到一个月前用最新部件制造的。
是的,声音采用单声道格式。
有人请帮助我。
我正在尝试将16位立体声声音从WAVE文件转换为16位单声道声音,但我有些困难.我试图将8位立体声转换为单声道,它的工作效果很好.这是一段代码:
if( bitsPerSample == 8 )
{
dataSize /= 2;
openALFormat = AL_FORMAT_MONO8;
for( SizeType i = 0; i < dataSize; i++ )
{
pData[ i ] = static_cast<Uint8>(
( static_cast<Uint16>( pData[ i * 2 ] ) +
static_cast<Uint16>( pData[ i * 2 + 1 ] ) ) / 2
);
}
Run Code Online (Sandbox Code Playgroud)
但是,现在我试图用16位音频做同样的事情,但我无法让它工作.我只能听到某种奇怪的声音.我试图将"monoSample"设置为"left"(Uint16 monoSample = left;),来自该频道的音频数据效果非常好.正确的渠道.谁能看到我做错了什么?这是代码(pData是一个字节数组):
if( bitsPerSample == 16 )
{
dataSize /= 2;
openALFormat = AL_FORMAT_MONO16;
for( SizeType i = 0; i < dataSize / 2; i++ ) …Run Code Online (Sandbox Code Playgroud) 我正在一台带有两个声卡的计算机上开发一个Linux应用程序,我想在OpenAL中同时使用它们,每个都在自己的上下文中.当我调用OpenAL的枚举扩展名alcGetString(NULL,ALC_DEVICE_SPECIFIER)以获取可能的输出设备列表时,该列表仅包含"ALSA软件"和"OSS软件".我知道这些只是OpenAL对软件设备的看法所以当我选择其中任何一个时,OpenAL只会将音频输出到ALSA或OSS中配置的默认设备.我甚至不确定它是否可行,但有没有办法将OpenAL上下文的音频输出定向到特定设备?这样我可以创建两个上下文,每个设备一个,并为每个上下文发送单独的音频.
谢谢,-Al
使用OpenAL,我正在以AL_FORMAT_STEREO16格式加载声音.我试图在iOS/iPhone平台的OpenAL中设置平移?我是否需要为源设置AL_POSITION?我该如何设置?