2010年11月10日水曜日

サウンドの連続再生

ゲーム等でボタンを連射した時の様に、同じサウンドを連続して再生させるには、以下のようにします。


・
・
    // soundはAVAudioPlayerクラスのインスタンスです
    if( sound.playing ) {
        [sound pause];
    }
    sound.currentTime = 0;
    [sound play];
・
・

普通にstopしてplayすれば良さそうですが、実際にstop・playすると、再生が終了しないと次の再生が行われません。
ゆっくりした操作の場合はこれでも良いのですが、ゲームなどでボタンを連射する操作が必要な場合はサウンド再生が1テンポ遅れて聞こえてくるようになります。
上記のように、サウンドが再生中の場合はpauseメソッドで一時停止しておき、currentTimeプロパティで再生位置を最初に設定、その後、playメソッドで再生するというやりかたで、連射しても1テンポ遅れることなく再生されるようになります。

追記:
上記はAVAudioPlayerのplayingプロパティでサウンドが再生中だったらpauseメソッドで一時停止させていますが、この処理があると処理が若干重くなるようです。
ですので、以下のように判定処理自体を省いてしまってもいいかもしれません。


    sound.currentTime = 0;
    [sound play];

2010年11月5日金曜日

サウンドファイルの変換

IOSがサポートするサウンドには以下の物があります。

フォーマット内容ハードウェアサポート
CAFApple Core Audio(.caf)なし
ALACApple Lossless Audio Codec。可逆圧縮サウンド形式(.m4a)有り
AIFFAudio Interchange File Format(.aif, .aiff)なし
AACAdvanced Audio Coding:iTunes Storeの配信用(.m4a)有り
MP3MPEG Audio Layer-3音楽圧縮用(.mp3)有り

サポートファイルは他にもありますが、後述するafconvertコマンドで-hfオプションを付けると見ることができます。

ハードウェアサポート有りのものはCPU負荷が軽くなりますが、サウンドの同時再生は行えません。
逆にハードウェアサポートなしのものはCPU負荷が高くなりますが、サウンドの同時再生が可能です。

ファイル形式の変換はターミナルからafconvertコマンドを使用します。
以下は、sound.m4aファイルをsound.cafファイルに変換する例です。

/usr/bin/afconvert -f caff -d aac sound.m4a sound.caf

サポートファイルや形式名はafconvert -hfで見ることができます。

再生確認は、ターミナルからafplayコマンドを使用します。

afplay sound.caf


追記:
ちなみにMP3ファイルをcafファイルに変換するには、以下のようにします。

afconvert -f caff -d ima4 sound.mp3 sound.caf


WAV形式→caf形式は以下の様にします。

afconvert -f caff -d LEI16 sound.wav







2010年10月25日月曜日

NSMutableStringの文字列を入れ替える

NSMutableStringの文字列を入れ替えるには、「setString」メソッドを使用します。



    NSMutableString* str = [[NSMutableString alloc] initWithString:@"AAA"];
    [str setString:@"BBB"];


上記例では、"AAA"で初期化したNSMutableStringの文字列を"BBB"に入れ替えています。

2010年10月24日日曜日

iPadかどうかの判定

デバイスがiPadかどうかを判定するには、「UI_USER_INTERFACE_IDIOM()」関数を使用します。



-(BOOL)isIpad
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
        return TRUE;
    }else {
        return FALSE;
    }
}


使い方はまぁ、見たままです。

iPhone / iPodのバージョン判定

iPhoneのバージョン判定を行うには、uname 関数を使います。

使い方はLinuxで使われるシステムコールと同じです。
utsname型の構造体にバージョンの文字列が返るので、それを判定します。




-(BOOL)deviceIsiPhone4OrLater
{
    struct utsname u;
    uname(&u);
    NSString* machine = [NSString stringWithCString:(const char*)u.machine encoding:NSUTF8StringEncoding];
    if ([machine isEqualToString:@"iPhone 1,1"] == YES) {
        // iPhone 1G
        return NO;
    } else if ([machine isEqualToString:@"iPhone1,2"] == YES) {
        // iPhone 3G
        return NO;
    } else if ([machine isEqualToString:@"iPhone2,1"] == YES) {
        // iPhone 3GS
        return NO;
    } else if ([machine isEqualToString:@"iPod1,1"] == YES) {
        // iPod touch 1G
        return NO;
    } else if ([machine isEqualToString:@"iPod2,1"] == YES) {
        // iPod touch 2G
        return NO;
    } else if ([machine isEqualToString:@"iPod3,1"] == YES) {
        // iPod touch Late 2009
        return NO;
    }
  
    return YES;
}

上記の「machine」にiPhoneのバージョンを示す文字列が返ってきます。
私はiPhone 4を持っていないので何という文字列が返るのか確認できませんが、これまでの流れから言うと多分「iPhone 3,1」?とかが返ってくると思います。
(誰か持ってる方いらっしゃいましたら返却文字列を教えてもらえると嬉しいです。)


2010年10月18日月曜日

文字列の置換

文字列を置換するには、NSMutableStringクラスのreplaceOccurrencesOfStringメソッドを使用します。

replaceOccurrencesOfString:変換前文字列 withString:変換後文字列 options:検索オプション range:変換対象となる文字列の範囲

--------------------

            [tmpString replaceOccurrencesOfString:@"AAA"
                                       withString:@"BBB"
                                          options:NSLiteralSearch
                                            range:NSMakeRange(0, [tmpString length])];

--------------------
上記例では、tmpString文字列中の"AAA"が"BBB"に置き換えられます。

2010年10月17日日曜日

ファイルのフルパス取得

アプリが置かれているディレクトリの文字列を取得するには、NSHomeDirectory()関数を使用します。
これにファイル名の文字列を追加すれば特定ファイルのフルパスが取得できます。

------------------

NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"aaa.txt"];

------------------

ファイル名を追加する時は、NSMutableStringクラスのインスタンスメソッドである「stringByAppendingPathComponent」を使います。これを使うと追加する文字列の先頭にスラッシュが入ります。
普通の文字列追加メソッド「appendString」ではスラッシュは入らないので少し注意です。

起動時スプラッシュウィンドウ

iPhoneアプリで起動時に表示されるスプラッシュウィンドウを表示するのは非常に簡単です。
実はソースコードをいじる必要もありません。
プロジェクトにDefault.pngという画像を置くだけです。
たったこれだけでビルド&起動するとスプラッシュウィンドウが表示されるようになります。
iOSってこういう痒いところに手が届いてるのが評価されてるんでしょうね。

2010年9月30日木曜日

iPhone app発売

Calc touchというアプリを販売します。

有料ですがこれを使うととても計算がしやすくなります。

どうぞよろしくお願いします。

2010年9月29日水曜日

iPhone app登録

自作のiPhoneアプリを登録しました。
Waiting For Reviewからin Reviewになるまで2週間。
いつになれば販売されるのか分かりませんが、とりあえずステータスが変わったので放置されてたわけではなさそうです。
次のステータスに進むのがいつになるか分かりませんが、気長に待つことにします。


あ、アプリは電卓です。ですが今までにない操作性で使いやすいものにしたつもりです。