概要: iPhoneのドックコネクタに接続するシリアルケーブルを紹介します。シリアル端子は、組み込み機器との接続によく使われるインタフェースですが、iPhoneにはこれまで汎用シリアルインタフェースがありませんでした。また独自の開発をスタートするには、まずMFiプログラムという壁を超える必要がありました。今回Redpark社から発売されたドックコネクタ接続のシリアルケーブルは、価格59米ドル、57.6kpbsまでのシリアル通信ができるもので、従来の障壁を崩すことができるものです。その内容を紹介します。 |
2011年7月27日水曜日
iPhoneのドックコネクタ接続シリアルケーブルのまとめ
2011年5月31日火曜日
iPhoneの動画編集アプリ開発での、動画の向き(Portrait/Landcape)の扱い方
|
|
概要: iOS SDKで、編集した動画を正しい方向(横向き/縦向き)でプレビュ/サムネイル画像生成/外部ファイル出力する方法を紹介します。例えば、標準のカメラアプリで撮影されたiPodライブラリにある動画ファイルは、AVPlayerクラスを使えば、その動画が撮影された(縦向き/横向き)の正しい向きで表示されます。しかし、この動画を編集すると、ソースの動画の向き情報が伝わらないので常に横向きで表示されてしまい、意図した表示となりません。ここではLayerInstructionを使い強制的に正しい向きで動画を表示するサンプルアプリを使って、この方法を紹介します。ソースコードはthe New BSDライセンスのもと、Githubで公開しています:https://github.com/reinforce-lab/ObjC_Codes/tree/master/moviePortraitLandscape 。
|
はじめに
編集動画の向きを設定する
|
|
サムネイル画像生成と動画ファイル出力
まとめ
2010年11月23日火曜日
iPhone_イヤホンジャックから電源を取る
概要:iPhoneのドックコネクタを使うにはApple社との秘密保持契約が必須です。iPhoneに外部機器を接続するインタフェースは、Jail Breakでもしない限り、イヤホン端子くらいしかありません。ここではiPhoneのイヤホン端子から電源を取る方法と、その出力電流-電圧特性を示します。イヤホン端子から正弦波を出力して、シリコンダイオードを使った倍圧整流回路[1]を通すと、開放電圧1.5 V、出力電流1 mAで1.2 Vの電圧が取れます。電圧損失が大きいのは、シリコンダイオードの大きな順方向電圧のためです。マイクロホン入力も電源として使うことができます。その開放電圧は2.7V、出力抵抗は2.3 kΩです。出力電力自体は数mWと小さいですが、動作クロック1MHzあたりの消費電流が0.3 mAの、ATMEL社のローパワーなAVRマイコンを動かすには十分です。 |
iPhoneの外部機器を簡単に開発するために、ソフトウェア・モデムのプロジェクトがいくつか立ち上がっています [2]。これらのプロジェクにより、外部機器はオーディオ信号を通してiPhoneとデータ送受信をできるようになります。ここでは、外部機器の電池を省略するために、オーディオ端子から電源を供給する方法を試した結果を報告します。
音声出力から電源を取る
0.95Vrmsを整流しただけでは論理回路(1.8Vまたは3.3V)を動かすには電圧が不足しますから、Fig.1に示す倍圧整流回路[1]を使いました。ダイオードには汎用小信号シリコンダイオード1S1588を使いました。
マイク端子から電源を取る
まとめ
参考
- Wikipedia: Voltage doubler, http://en.wikipedia.org/wiki/Voltage_doubler
- サウンドモデムプロジェクト, http://www.reinforce-lab.com/projects/iphone-software-modem
- MonoTouch Audio Unit sample code, http://blog.reinforce-lab.com/2010/08/monotouchaudiounitsamplecodes.html
2010年8月2日月曜日
MonoTouch_AudioUnit_サンプルコード
概要: MonoTouchでAudioUnitを使った3つのサンプルコード、サイン波生成、AIFFオーディオファイル再生そしてマイクロフォンのモニタリング、を紹介します。iPhoneで利用出来る他のオーディオフレームワーク(Audio Queue ServiceとOpenAL)と比較して、AudioUnitを使うことで、楽器アプリや音が動作トリガになるアプリケーションに都合が良い、リアルタイムの波形操作と最小の出力遅延時間(~ 3ミリ秒)が実現できますサンプルコードはGithubにMITラインセスで公開しています [1]。 |
iPhoneのサウンドモデム開発で、当初はスピーカーとマイクロフォンにアクセスするのにAudioQueueを使うことにしました。しかし、AudioQueueの出力遅延時間は最小でも23ミリ秒でした。ロボットの制御にはこの遅延時間は、少々大きすぎます。したがって約3ミリ秒の出力遅延時間が得られるAudioUnitを試すことにしました。
MonoTouch で AudioUnit を使う
AudioUnit はAudioToolboxフレームワークに含まれるC言語の関数群です。したがってMonoTouchから使うためにはアンマネージコードの呼び出しが必要になります [2]. この操作は、一般のC#からのC言語ライブラリの呼び出しと同じで、その詳細は(サンプルコードの プロジェクト MonoTouch.AudioUnit にある) ソースコードを参照してください。クラス名などは、AudioUnitの関数および構造体と1対1対応で作成しています。AudioUnitでの任意波形出力は、基本はAudio Queue Service の解説記事 (http://jp.blog.reinforce-lab.com/2010/05/monotouchaudioqueue.html) で述べたものと同じです。
手順は:
- 出力する Audio Unit (Remote IO) を設定する、
- レンダリング処理のイベントハンドラを設定する、
- ハンドラ内でバッファに波形データを書き込む。
AudioUnit (Remote IO unit) の生成手順などはAppleの開発者ドキュメントなどで詳しく述べられています。まず, audio unit (Remote IO unit) を以下のコードで作成します:
1: void prepareAudioUnit()
2: {3: // Creating AudioComponentDescription instance of RemoteIO Audio Unit
4: AudioComponentDescription cd = new AudioComponentDescription()
5: { 6: componentType = AudioComponentDescription.AudioComponentType.kAudioUnitType_Output, 7: componentSubType = AudioComponentDescription.AudioComponentSubType.kAudioUnitSubType_RemoteIO, 8: componentManufacturer = AudioComponentDescription.AudioComponentManufacturerType.kAudioUnitManufacturer_Apple, 9: componentFlags = 0, 10: componentFlagsMask = 0 11: }; 12: 13: // Getting AudioComponent from the description
14: _component = AudioComponent.FindComponent(cd); 15: 16: // Getting Audiounit
17: _audioUnit = AudioUnit.CreateInstance(_component); 18: 19: // setting AudioStreamBasicDescription
20: int AudioUnitSampleTypeSize;
21: if (MonoTouch.ObjCRuntime.Runtime.Arch == MonoTouch.ObjCRuntime.Arch.SIMULATOR)
22: {23: AudioUnitSampleTypeSize = sizeof(float);
24: }25: else
26: {27: AudioUnitSampleTypeSize = sizeof(int);
28: }29: AudioStreamBasicDescription audioFormat = new AudioStreamBasicDescription()
30: { 31: SampleRate = _sampleRate, 32: Format = AudioFormatType.LinearPCM,33: //kAudioFormatFlagsAudioUnitCanonical = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved | (kAudioUnitSampleFractionBits << kLinearPCMFormatFlagsSampleFractionShift),
34: FormatFlags = (AudioFormatFlags)((int)AudioFormatFlags.IsSignedInteger | (int)AudioFormatFlags.IsPacked | (int)AudioFormatFlags.IsNonInterleaved | (int)(kAudioUnitSampleFractionBits << (int)AudioFormatFlags.LinearPCMSampleFractionShift)),
35: ChannelsPerFrame = 2, 36: BytesPerPacket = AudioUnitSampleTypeSize, 37: BytesPerFrame = AudioUnitSampleTypeSize, 38: FramesPerPacket = 1, 39: BitsPerChannel = 8 * AudioUnitSampleTypeSize, 40: Reserved = 0 41: }; 42: _audioUnit.SetAudioFormat(audioFormat, AudioUnit.AudioUnitScopeType.kAudioUnitScope_Input, 0); 43: 44: // setting callback
45: _audioUnit.RenderCallback += new EventHandler<AudioUnitEventArgs>(callback);
46: }AudioUnitの1サンプルを表すAudio unit sample type はシミュレータ (32-bit 浮動小数点) とデバイス(32-bit 整数)で異なります。その違いはコード (line #21-28) で吸収します。Audio Unitがバッファを必要とするたびに、設定された (line #45) レンダリングのイベントハンドラが、以下のように呼び出されます:
1: void callback(object sender, AudioUnitEventArgs args)
2: { 3: // Generating sin waveform
4: double dphai = 440 * 2.0 * Math.PI / _sampleRate;
5: 6: // Getting a pointer to a buffer to be filled
7: IntPtr outL = args.Data.mBuffers[0].mData; 8: IntPtr outR = args.Data.mBuffers[1].mData; 9: 10: // filling sin waveform.
11: // AudioUnitSampleType is different between a simulator (float32) and a real device (int32).
12: if (MonoTouch.ObjCRuntime.Runtime.Arch == MonoTouch.ObjCRuntime.Arch.SIMULATOR)
13: {14: unsafe
15: {16: var outLPtr = (float *) outL.ToPointer();
17: var outRPtr = (float *) outR.ToPointer();
18: for (int i = 0; i < args.NumberFrames; i++)
19: { 20: float sample = (float)Math.Sin(_phase) / 2048;
21: *outLPtr++ = sample; 22: *outRPtr++ = sample; 23: _phase += dphai; 24: } 25: } 26: }27: else
28: {29: unsafe
30: {31: var outLPtr = (int*)outL.ToPointer();
32: var outRPtr = (int*)outR.ToPointer();
33: for (int i = 0; i < args.NumberFrames; i++)
34: { 35: int sample = (int)(Math.Sin(_phase) * int.MaxValue / 128); // signal waveform format is fixed-point (8.24)
36: *outLPtr++ = sample; 37: *outRPtr++ = sample; 38: _phase += dphai; 39: } 40: } 41: } 42: 43: _phase %= 2 * Math.PI; 44: }AudioBufferは32-bit浮動小数点または32-bit整数の単なる配列です。したがってunsafeブロック内で直接配列に波形データを書き込みます。配列長はAudioSessionを使って設定でき、デフォルトで 512、最小 128まで設定できます。配列長を短くするほど出力遅延時間は短くなりますが、よりCPUパワーを消費します。
その他のサンプル
ExtAudioFileを使った任意フォーマットの音楽ファイル再生およびマイクロフォンからの音入力とその録音処理のサンプルがあるのですが、もう面倒なので以下略です。ソースコードを参照ください。
References
- Sample codes, http://github.com/reinforce-lab/MonoTouch.AudioUnit
- Interoperating with unmanaged code, http://msdn.microsoft.com/en-us/library/sd10k43k.aspx