狠狠撸

狠狠撸Share a Scribd company logo
Audio QueueでSin波再生
2013.03.30
ふじしげ ゆういち
@nakiwo
? ふじしげ ゆういち
? @nakiwo
? 株式会社フィードテイラー
http://feedtailor.jp/
そら案内
8bitter
? ふじしげ ゆういち
? @nakiwo
? http://www.nakiwo.com/
洞窟物語
めがね
(Mac AppStore)
Audio QueueでSin波再生
Audio QueueでSin波再生
今日のテーマ
?Audio Queue Services で
Sin波を再生する
?https://github.com/nakiwo/
AudioQueueToneSample
音の再生
?System Sound Services
?AVAudioPlayer
?Audio Unit
?Open AL
?Audio Queue Services
Audio Queue Services
?Core Audio
?AudioToolbox
Audio Queue Services
?なにがうれしいか
Audio Queue Services
?めんどくさいだけかも!
Audio Queue Services
?単純にサウンドファイルを鳴らすだけ
なら他の方法をお勧めします。
Audio Queue Services
?録音と再生。今日は再生だけ。
Audio Queue
?オーディオのキュー
Audio Queue
?Audio Bu?erのQueue
Audio Bu?er
?波形のバッファ
?波形バッファに音を詰めてキューに放
り込むと音が鳴る
Audio QueueでSin波再生
波形データの
フォーマット
http://upload.wikimedia.org/wikipedia/commons/b/bf/Pcm.svg
Linear PCM
サンプリングレート:时间轴の解像度
量子化产颈迟数:1サンプルの产颈迟数
サンプル
フレーム
L
R
パケット
? フォーマット上都合のよいデータの区切り
? Linear PCMは1パケット1フレーム
Packet
L
R
LPCM
Packet
L
R
L
R
L
R
L
R
AAC等
Audio Queueで再生
?AudioQueueNewOutput
?AudioQueueAllocateBu?er
?AudioQueueEnqueueBu?er
?AudioQueueStart
?コールバックが呼ばれるのでバッファ
を詰める
AudioQueueNewOutput
?再生するデータのフォーマットとコー
ルバックを登録
AudioStreamBasicDescription _outpufFormat;
_outpufFormat.mFormatID = kAudioFormatLinearPCM;
_outpufFormat.mSampleRate = 44100;
_outpufFormat.mFormatFlags =
kLinearPCMFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked;
_outpufFormat.mBitsPerChannel = 16;
_outpufFormat.mChannelsPerFrame = 1;
_outpufFormat.mBytesPerFrame = 2;
_outpufFormat.mFramesPerPacket = 1;
_outpufFormat.mBytesPerPacket = 2;
AudioStreamBasicDescription
AudioQueueNewOutput(&_outpufFormat,
audioQueueOutputCallback,
(__bridge void *)self,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes,
0,
&_audioQueue);
UInt32 bufferSize =
kFramesPerBuffer * _outpufFormat.mBytesPerFrame;
for (int i = 0; i < kNumBuffers; i++) {
AudioQueueBufferRef buffer;
AudioQueueAllocateBuffer(_audioQueue, bufferSize, &buffer);
[self audioQueueOutputWithAudioQueue:_audioQueue
buffer:buffer];
}
AudioQueueStart(_audioQueue, NULL);
static void audioQueueOutputCallback(
void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer)
{
AppDelegate *object =
(__bridge AppDelegate *)inUserData;
[object audioQueueOutputWithAudioQueue:inAQ
buffer:inBuffer];
}
再生コールバック
- (void)audioQueueOutputWithAudioQueue:(AudioQueueRef)inAQ
buffer:(AudioQueueBufferRef)inBuffer
{
inBuffer->mAudioDataByteSize =
_outpufFormat.mBytesPerFrame * kFramesPerBuffer;
float freq = 440.0f;
float phasePerSample = freq / kSampleRate;
int16_t *sampleBuffer = (int16_t *)inBuffer->mAudioData;
for (int i = 0; i < kFramesPerBuffer; i++) {
*sampleBuffer =
(int16_t)((sinf((float)_frameIndex *
phasePerSample *
(M_PI*2.0f))) * 32767.0f);
sampleBuffer++;
_frameIndex++;
}
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}
?Audio Queue Services
Programming Guide
?WWDC 2010 - Fundamentals of
Digital Audio for Mac OS X and
iPhone OS
?iPhone Core Audioプログラミング」
?これを読めば無敵。しかし入手困難
おわり

More Related Content

Audio QueueでSin波再生