Powered by Google

2011年1月17日月曜日

創作活動日記 iPhoneアプリ開発編8

前回のセミナーで教えてもらった内容の簡単なまとめ。

iPhoneは電話ですので、標準でマイクとスピーカーは搭載されています。

ですのでそれらの機能を使ったアプリを作ることができますし、それを利用
しないのは勿体ないかと思いますので、マイクを入力装置として使う場合の
コードを調べてみました。

マイクを利用する際、まず録音の実装手順としては

①オーディオ使用するためにオーディオセッションを初期化する
②ディスクリプションを作成する
③キューオブジェクトを作成する
④キューからストリームディスクリプションを取得する
⑤保存するファイルをオープンする
⑥マジッククッキーを設定する
⑦オーディオキューにバッファを割り当てる
⑧キューを開始する
⑨コールバック関数を呼び出す
⑩キューを停止する
⑪オーディオを開放する

となります。

具体的コードでは


//オーディオセッション初期化
OSStatus AudioSessionInitalize(CFRunLoopRef inRunLoop, CFStringRef inRunLoopMode,
AudioSessionInterruptionListener inInterruptionListener, void *inClientDate);

//ディスクリプション生成
-(void) setAudioDesc:(UInt32)i_format_id{
UInt32 size; // サイズ

// 初期化
memset(&m_desc, 0, sizeof(m_desc));
// オーディオセッションのプロパティを取得
size = sizeof(m_desc.mSampleRate);
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareSampleRate,
&size, &m_desc.mSampleRate);
size = sizeof(m_desc.mChannelsPerFrame);
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareInputNumberChannels,
&size, &m_desc.mChannelsPerFrame);
// フォーマットIDを設定
m_desc.mFormatID = i_format_id;
// PCMの場合は符号付き16ビットのリトルエンディアンに設定
if(i_format_id == kAudioFormatLinearPCM){
m_desc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;
m_desc.mBitsPerChannel = 16;
m_desc.mBytesPerFrame = (m_desc.mBitsPerChannel / 8) * m_desc.mChannelsPerFrame;
m_desc.mBytesPerPacket = m_desc.mBytesPerFrame;
m_desc.mFramesPerPacket = 1;
}
}

-(void) setAudioDesc:(UInt32)i_format_id{
UInt32 size; // サイズ

// 初期化
memset(&m_desc, 0, sizeof(m_desc));
// オーディオセッションのプロパティを取得
size = sizeof(m_desc.mSampleRate);
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareSampleRate,
&size, &m_desc.mSampleRate);
size = sizeof(m_desc.mChannelsPerFrame);
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareInputNumberChannels,
&size, &m_desc.mChannelsPerFrame);
// フォーマットIDを設定
m_desc.mFormatID = i_format_id;
// PCMの場合は符号付き16ビットのリトルエンディアンに設定
if(i_format_id == kAudioFormatLinearPCM){
m_desc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
m_desc.mBitsPerChannel = 16;
m_desc.mBytesPerFrame = (m_desc.mBitsPerChannel / 8) * m_desc.mChannelsPerFrame;
m_desc.mBytesPerPacket = m_desc.mBytesPerFrame;
m_desc.mFramesPerPacket = 1;
}
}





詳細内容は非公開が条件でしたのでノウハウとして纏めとして書いています。
サンプルコードとして使えるものなどあればと思いまとめていってます。

本日はここまで。

2 件のコメント:

  1. iPhoneアプリで、音を出すのは難しいと聞いたことがあるので
    そこをタダで教えてくれるならすごく有意義なセミナーですね。

    コードは一見しただけじゃさっぱりわからんけど。

    返信削除
  2. このコラムはいつもさっぱり分からんけど、
    いつかiOSアプリ作ろうと思ってました。

    今はAndroidアプリに興味が移ったので、
    やる気だけもらってなんかやってみます。

    返信削除