9VAeきゅうべえ開発記録
今日は以下の作業を実施
- 日本語メニューの搭載
- 音の再生
日本語メニュー
サンプルプログラム CoreTextPageViewer のツールバーを改造して、メニューバーを作成。日本語と英語の切り替え機能を搭載。
音の再生
以下を参照
AudioPlayerを使っての音を鳴らしてみた - Object for cutie
AVAudioPlayer - AVFoundation | Apple Developer Documentation
iphone - AVAudioPlayer working in Simulator, but not on device - Stack Overflow
音のファイルは、9VAeと同じフォルダにあるとして、ファイルパス、ファイル名を取得できるので、NSString, NSURL を生成し再生させる。
上に書かれた方法を試してみると、音のファイルを準備するところでエラーが発生し、原因がわからなかった。ファイルを読みだした時に発生するエラーメッセージを取得するには、次のように @try @catch で囲むとよいようだ。エラー内容がアラートで取得できる。
case qVAcPMSCinp: // 音楽再生
{
if ([qvaView.musicPlayer isPlaying]){
[qvaView.musicPlayer stop];
[qvaView.musicPlayer release];
qvaView.musicPlayer=nil;
}
@try {
qvaView.musicURL = [qvaView getIoFilePath]; //音楽ファイルパスを取得
qvaView.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: qvaView.musicURL error:nil];
}
@catch (NSException *exception) {
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Error"
message:exception.description
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
qvaView.musicPlayer.delegate = qvaView; //delegate設定
[qvaView.musicPlayer play]; //音楽再生
このエラーメッセージから、音楽プレーヤーを@property (copy, nonatomic) で確保していたのが原因と判明(copy処理中にエラー)。@property (retain, nonatomic) に変更すると音が鳴るようになった。
音楽の再生終了を取得するために、delegateを設定する
- delegate(コールバック関数)をおく場所を指定、サンプルでは self と書かれていた。ここでは、qvaView.musicPlayer.delegate = qvaView; と記載
- delegateをおくクラスには、<AVAudioPlayerDelegate>をつける
@interface QvaeView : UIView <AVAudioPlayerDelegate>
- delegate関数を以下のように記載。これは、OSのバージョンによって引数の定義が変わっているようだ。delegate関数の定義から正しいものを記載。上の関数が再生終了通知。下の関数はデコードエラー通知。
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
}
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error{
}