Tag: openal

IOS OpenAL和静音开关

我正在使用4.3.2 IOS和OpenAL,它似乎不关心无声开关。 (虽然它与以前的IOS版本很好地工作) 此外使用AudioSessionGetProperty来“读”开关状态的技巧已经不再适用了。 因此,我甚至无法使用代码静音。 任何暗示,最近的消息呢?

logging使用OpenAL播放的样本

我在iOS上使用OpenAL同时播放9个循环。 为了使循环100%同步,它们开始在不同的线程上播放。 任何使用OpenALlogging正在播放的指针/教程。 威尔我遇到的问题录音给我使用不同的线程?

使用OpenAL在iOS上进行离线audio录制

我正在使用openAL以特定的时间间隔播放声音样本,我想将其导出到文件(无论是caf或aac或其他)。 我怎样才能用OpenAL做到这一点,而不通过扬声器/耳机实时播放我的样品?

使用iOS上的OpenAL进行声音捕捉

我正在尝试使用OpenAL在iOS上进行声音捕捉(我正在编写一个跨平台的库,这就是为什么我要避免使用特定于iOS的方式来录制声音的原因)。 开箱即用OpenAL捕获不起作用,但是存在已知的解决方法: 在开始捕获之前打开输出上下文 。 这个解决scheme在iOS 5.0上为我工作。 但是,在iOS 5.1.1上,解决方法仅对我尝试logging的第一个示例有帮助。 (我开始捕获之前将AudioSession切换到PlayAndRecord,然后打开默认的输出设备,logging我的样本后closures设备并将会话切换回原来的状态)。对于第二个示例,重新打开输出上下文不会帮助和没有声音被捕获。 有没有一种已知的方法来处理这个问题? // Here's what I do before starting the recording oldAudioSessionCategory = [audioSession category]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; // We need to have an active context. If there is none, create one. if (!alcGetCurrentContext()) { outputDevice = alcOpenDevice(NULL); outputContext = alcCreateContext(outputDevice, NULL); alcMakeContextCurrent(outputContext); } […]

我怎样才能使用AVAudioPlayer播放audio更快*和*更高音?

问题陈述: 我在我的应用程序中存储了一系列以.m4a文件(AAC格式,48 KHz,16位)存储的声音效果,我希望以各种速度和音高播放,而无需预先生成所有变体文件。 虽然AVAudioPlayer对象的AVAudioPlayer属性可以改变播放速度,但它始终保持原始音高,这不是我想要的。 相反,我只是想要更快或更慢地播放声音样本,并使音高向上或向下匹配 – 就像加速或减慢旧式的卷轴式磁带录音机一样。 换句话说,我需要一些方法来改变audio采样率,如+2个半音(快12%),-5个半音(慢33%),+ 12个半音(快两倍)等等。 题: 有什么方法从AVAudioPlayer对象中获取线性PCMaudio数据,使用不同的iOS框架应用采样率转换,并将生成的audio数据填充到新的AVAudioPlayer对象中,然后可以正常播放? 可能的途径: 我正在读AudioConverterConvertComplexBuffer 。 特别是kAudioConverterSampleRateConverterComplexity_Mastering , kAudioConverterQuality_Max和AudioConverterFillComplexBuffer()引起了我的注意。 所以看起来这个audio转换框架是可能的。 这是我应该进一步探索的途径吗? 要求: 我其实不需要立即开始播放。 如果采样率转换稍微延迟,那没问题。 我所有的样品都是4秒或更less,所以我想可以快速进行任何即时重采样,大约在1/10秒或更短。 (尽pipe如此,超过1/2将会太多。) 如果有更简单的方法来使用iOS提供的转换框架,我真的宁愿不进入OpenAL或Core Audio等重量级的东西。 但是,如果使用OpenAL或Core Audio的这个问题有一个简单的解决scheme,我很乐意考虑这个问题。 我所说的“简单”是指可以用50-100行代码实现的东西,并且不需要启动额外的线程将数据传送到声音设备。 我宁愿将所有的东西都自动处理 – 这就是为什么我愿意在播放前转换audio剪辑。 我想在这里避免任何第三方库,因为这不是火箭科学,我知道它本来可以在iOS框架下实现。 再次,我需要一起调整音高和播放速度,而不是分开 。 所以,如果播放速度减慢了2倍,人声就会变得非常深沉而缓慢。 如果播放速度加快2-3倍,人声就像一个快速通话的花栗鼠。 换句话说,我绝对不希望在保持audio持续时间不变的情况下改变音调,因为当向上弯曲音高超过几个半音时,该操作导致不希望的“细小”的声音。 我只是想加快整个过程,把音调作为一个自然的副作用,就像老式的录音机以前那样。 需要在iOS 6或更高版本上工作,但iOS 5支持将是一个不错的奖励。

如何正确处理audio中断?

我已经创build了一个OpenGL 3D游戏,利用OpenAL进行audio播放,如果在audio设备初始化之前按下“Home”button,则会遇到audio丢失的问题。 我试图挂接到audio会话中断处理程序,但我的callback永远不会被调用。 无论我是否最小化或最大化我的申请。 我的“OpenALInterruptionListener”永远不会被调用。 我究竟做错了什么? AudioSessionInitialize(NULL, NULL, OpenALInterriptionListener, this); void OpenALInterriptionListener(void * inClientData, UInt32 inInterruptionState) { OpenALDevice * device = (OpenALDevice *) inClientData; if (inInterruptionState == kAudioSessionBeginInterruption) { alcSuspendContext(_context); alcMakeContextCurrent(_context); AudioSessionSetActive(false); } else if (inInterruptionState == kAudioSessionEndInterruption) { UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); AudioSessionSetActive(true); alcMakeContextCurrent(_context); alcProcessContext(_context); } }