Pickers(9)~CustomPicker(2)

2010. 10. 10
●サウンドリソースの追加

ホイールが回転する時と、ホイールの画像が連続して3つ以上揃った際の効果音を追加します。

この効果音は本書の内容の通りに、Apress社のサイト内のサンプルコードの『07 Pickers/Custom Picker Sounds』をコピーし、XcodeのResourcesにフォルダごと追加して使用します。


●AudioToolboxフレームワークの追加

今回の効果音の再生は、Core Audio系フレームワークのAudioToolboxフレームワークにあるSystem Sound Servicesを使用します。

System Sound Servicesは、30秒以下の簡易なサウンド再生とバイブレーション機能を利用できます。

System Sound Servicesを利用するには、AudioToolbox.hのインポートと、FrameworksへのAudioToolbox.frameworkの追加が必要です。
(太字が追加した部分)

#import "CustomPickerViewController.h"
#import <AudioToolbox/AudioToolbox.h>

@implementation CustomPickerViewController

AudioToolbox.frameworkの追加は、Frameworksを右クリックしてコンテキストメニューを開き、『追加』→『既存のフレームワーク...』でリストから『AudioToolbox.framework』を選択して『追加』ボタンをクリックします。

874

875


●ソースファイルの編集

Spin!ボタンの表示制御や、ホイールの回転SEの再生、勝利判定の処理などのspinメソッドの修正と、Spin!ボタン表示用のshowButtonメソッド、および勝利条件成立時にSEを鳴らすplayWinSoundメソッドを追加します。
(太字が追加・変更した部分)

- (IBAction)spin {
    BOOL win = NO;
    int numInRow = 1;
    int lastVal = -1;
    for (int i = 0; i < 5; i++) {
        int newValue = random() % [self.column1 count];
        if (newValue == lastVal)
            numInRow++;
        else
            numInRow = 1;
        lastVal = newValue;
        [picker selectRow:newValue inComponent:i animated:YES];
        [picker reloadComponent:i];
        if (numInRow >= 3)
        win = YES;
    }
    button.hidden = YES;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"crunch" ofType:@"wav"];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
    AudioServicesPlaySystemSound (soundID);
    if (win)
        [self performSelector:@selector(playWinSound) withObject:nil afterDelay:.5];
    else
        [self performSelector:@selector(showButton) withObject:nil afterDelay:.5];
    winLabel.text = @"";

}

- (void)showButton {
    button.hidden = NO;
}

- (void)playWinSound {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"win" ofType:@"wav"];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
    AudioServicesPlaySystemSound(soundID);
    winLabel.text = @"WIN!";
    [self performSelector:@selector(showButton) withObject:nil afterDelay:1.5];
}

876


・showButtonメソッド

showButtonメソッドは、ホイール回転時に非表示にしたSpin!ボタンを再表示するメソッドで、UIButtonのスーパークラスであるUIVIewのプロパティhiddenを使って制御しています。
(hiddenプロパティについては『Control Fun(3)~SwitchとSegmented Control』を参照してください)


・playWinSoundメソッド

playWinSoundメソッドは、5つのホイールの内3つ連続で画像が揃った際に、効果音の再生と『WIN!』ラベルを表示するメソッドです。

System Sound Servicesで音声ファイルを再生するには、まずpathForResource:ofType:メソッドでバンドル内にある音声ファイルのフルパスを取得します。
(pathForResource:ofType:メソッドについては『Foundation(バンドル)』を参照してください)

System Sound Servicesで音声ファイルを扱うには、SystemSoundIDオブジェクトにする必要があります。

音声ファイルのパスをNSURLオブジェクトに変換した後、(System Sound ServicesはC言語インターフェイスなので)CFURLRefで型変換し、AudioServicesCreateSystemSoundID関数でSystemSoundIDオブジェクトを生成します。
(fileURLWithPath:メソッドについては『クロックに時報を追加する』を参照してください)

そしてAudioServicesPlaySystemSound関数で、生成したSystemSoundIDオブジェクトを再生します。

その後『WIN!』ラベルを表示し、performSelector:withObject:afterDelay:メソッドで1.5秒後にshowButtonメソッドを実行しています。
performSelector:withObject:afterDelay:メソッドについては『スライドショーのフルスクリーン化(2)』を参照してください)


・spinメソッド

spinメソッドの後半が修正されており、

1)ホイールの回転アニメーション
2)勝利条件の判定
3)WIN!ラベルの表示/非表示

という流れでしたが、SEの追加やラベルの表示タイミングの修正、Spin!ボタンの表示の制御が追加されています。

先のplayWinSoundメソッドはspinメソッド内から呼び出されており、

1)ホイールの回転アニメーション
2)Spin!ボタンの非表示
3)crunch.wav(ホイール回転時のSE)の再生
4)勝利条件の判定(成立)
5)0.5秒後にplayWinSoundの呼び出し
6)win.wavの再生
7)WIN!ラベルの表示
8)1.5秒後にSpin!ボタンの表示

という流れになっています。

勝利条件が成立しなかった場合は、

1)ホイールの回転アニメーション
2)Spin!ボタンの非表示
3)crunch.wav(ホイール回転時のSE)の再生
4)勝利条件の判定(不成立)
5)0.5秒後にshowButtonの呼び出し

となっています。


・System Sound Services

System Sound Servicesは、短い音声の再生と、バイブレーションをサポートするiOSデバイスでバイブレーションを呼び出すCインターフェイスをサポートします。

System Sound Servicesを使用して、30秒以下の音声を再生することができます。

このインターフェイスは、レベル、ポジショニング、ループ、タイミング制御を提供しておらず、playback:による同時再生もサポートしていないので、一度に一つの音声のみ再生することができます。


System Sound Servicesは警告音を使うことができます。

いくつかのiOSデバイスでは、警告音にバイブレーションを含めることができます。

iOSでの使用方法については、『Multimedia Programming Guide』の『Using Audio』を参照してください。

・AudioServicesCreateSystemSoundID
(System Sound Services)

OSStatus AudioServicesCreateSystemSoundID (
    CFURLRef inFileURL,
    SystemSoundID *outSystemSoundID
);

システムサウンドオブジェクトを生成します。

inFileURL:再生するオーディオファイルのURLを指定します。

outSystemSoundID:指定したオーディオファイルのシステムサウンドオブジェクトの出力先を指定します。


・AudioServicesPlaySystemSound
(System Sound Services)

void AudioServicesPlaySystemSound (
    SystemSoundID inSystemSoundID
);

システムサウンドオブジェクトを再生します。

この関数は30秒以下の短い音声を再生します。

音声の再生は数秒かかるので、この関数は非同期で実行されます。

音声の再生終了を知るには、コールバック関数を登録するAudioServicesAddSystemSoundCompletion関数を呼び出します。

いくつかのiOSデバイスは、バイブレーションの呼び出しにkSystemSoundID_Vibrate定数を渡すことができます。

他のiOSデバイスでは、kSystemSoundID_Vibrate定数でこの関数を呼び出しても何も起こりません。

この関数を使って再生する音声ファイルは、以下の条件である必要があります。

・長さが30秒以下
・リニアPCMまたはIMA4(IMA/ADPCM)フォーマット
・.caf、.aif、.wavファイルのパッケージ

更に、AudioServicesPlaySystemSound関数を使用する場合は、

・音声は現在のシステムオーディオボリュームで再生され、プログラムでのボリューム制御はできません
・音声はすぐに再生されます
・ループやステレオポジショニングは利用できません
・同時再生は利用できず、一度に一つの音声しか再生できません



参考文献

System Sound Services Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






Lifestyle 650 home entertainment system
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
10 | 2017/11 | 12
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Lifestyle 650 home entertainment system
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR