您的位置:首页 > 其它

iphone/iPad 搞定Audio Unit 2012/05/13

2012-05-13 09:31 435 查看
1. 研究MixherHost

* render callback呼叫duration = 11 ms

2012-05-13 09:27:32.884 MixerHost[1576:7c03] into render callback: bus no = 0
2012-05-13 09:27:32.884 MixerHost[1576:7c03] into render callback: bus no = 1
2012-05-13 09:27:32.895 MixerHost[1576:7c03] into render callback: bus no = 0
2012-05-13 09:27:32.896 MixerHost[1576:7c03] into render callback: bus no = 1
2012-05-13 09:27:32.907 MixerHost[1576:7c03] into render callback: bus no = 0

* audio data list

inBusNumber=0, inNumberFrames=512, ioData.mNumberBufers=2 ( stereo ) , ioData.mBuffers[0].mDataByteSize=2048,

inBusNumber=1, inNumberFrames=512, ioData.mNumberBufers=1 ( mono ) , ioData.mBuffers[0].mDataByteSize=2048,

* how to understand ?

result =AUGraphConnectNodeInput (

processingGraph,
mixerNode, // source node

0, // source node output bus number
iONode, // destination node
0 // desintation node input bus number

^ should beoutput bus ( butinput scope
) !!!
);

2. 读以前的笔记

Q:可以在Audio Session中设置buffer size ???

configure Audio Session: ioBufferDuration

There’s one other hardware characteristic you may want to configure: audio hardware I/O buffer duration. The default duration is about 23 ms at a 44.1 kHz sample rate, equivalent to a slice size of 1,024 samples. If I/O latency is critical in your app, you
can request a smaller duration, down to about 0.005 ms (equivalent to 256 samples), as shown here:
self.ioBufferDuration = 0.005;

[mySession setPreferredIOBufferDuration: ioBufferDuration

error: &audioSessionError];

* audio unit最近期的进展
http://blog.csdn.net/printf1998/article/details/7341628
对音量进行控制

3. 调试conference

## 使用MixherHost

* issue : ( 3:00 PM,耗时2小时)

Q: why callback render function not called after starting AUGraph ?????? 13:30

但机器狂转,感觉callback仍在执行???

跟踪发现以下语句未执行成功,从而造成Audio Unit未能成功启动:国

// NSLog (@"Setting stereo stream format for mixer unit \"guitar\" input bus");
result =AudioUnitSetProperty (
mixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
guitarBus,
&monoStreamFormat, // frnk.zou
03/14/2012 changed to mono as well.
sizeof (monoStreamFormat)
);

if (noErr
!= result) {[selfprintErrorMessage:@"AudioUnitSetProperty (set mixer unit guitar input bus stream format)"withStatus:
result];return;}

注:这里result=10868

检查setupMonoStreamFormat方法,发现参数设置错误:

//monoStreamFormat.mBitsPerChannel = BITS_PER_CHANNEL; // 03/30/2012, sound quality seems better.
monoStreamFormat.mBitsPerChannel =8 * bytesPerSample;
// 03/29/2012

注:正确的应该为8*bytesPerSample=32,不能设为BITS_PER_CHANNEL=16 ( 这是我们的数据源的宽度,似乎不应该是这里用???)
Q:应该是16还是32?

4. conference audio unit总结 (使用MixerHost)

* callback render 可以调用了,但仍然没有声音

* 可能原因:音量太小?没有声音数据(不太可能,readAudioData的buf中明显有数据的。)

* 下一步行动

再检查一下音量控制的代码

检查一下AudioSession方面的东东

Q:突然发现没有为 AudioIO定义property

Q:单步跟踪,最后发现在一个网络thread中收到 EXC_BAD_ACCESS,同时,PC端已经见ipad退出

估计是因为调试时间太长,主动断掉

5. 读以前笔记

* 2012/3/15

3:00 PM,总结一下播放的状态

大约12ms callback被呼叫一次,每次要求512 frame数据

^ 与播放的audio data参数有对应关系吗? 2012/03/15

^ 512 frames可能是指缓冲区最大长度,不代表一定要这么多。可能没有填充的部分iOS就忽略了。2012/03/15

如果每次只读160B,并发给audio unit,

声音不对

但声音的时长是对的,并且似乎随不同的声音,出来的声音会有变化

Q:以前是512 frames,现在是168 frames,到底什么东东变了?

* 2012/3/29

# 搞定混音

从12:00 - 13:30,一直没有声音。

其间,对bits-per-packet进行了调整,变成8*4=32,仍然没有声音。

注:这说明当时16/32都可以试,并不会引起AUGrauph初始化错误,考虑到inNumberFrames大小不同,可能stream format的设置还有区别或问题。

* 2012/03/30

#状态回顾

完全无声:通过设置输入、输出音量 ,已经有声

感觉:音调降低了,并且声音不饱满

怀疑:取音频数据320B,未能填满buffer,造成声音断续及拉长。

AudioUnit OUTPUT sample rate不正确

Q: 两个bus可以共用一个ASDB吗?

#最新状态

在对output sample rate值进行修改后(从44.1k改成16k),声音基本能听到了,但音质不太好。

多路音频也没有问题了

但是:在真机上,声音和播放和采集不能同时使用,但在模拟器上没有问题

(Q:以前的程序在模拟器上有问题吗?)

注:音量控制改变后就有声音了,sample rate改16K就基本能听见话音,虽然音质并不太好。

结论:目前的 stream format 和以前肯定有什么区别了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: