dnjiro’s 9VAe blog

誰でもアニメが作れる無料ソフト9VAeきゅうべえ開発者のブログ

9VAeきゅうべえiPad版 日本語メニュー、音楽再生ができた

9VAeきゅうべえ開発記録

 

今日は以下の作業を実施

  • 日本語メニューの搭載
  • 音の再生

日本語メニュー

サンプルプログラム CoreTextPageViewer のツールバーを改造して、メニューバーを作成。日本語と英語の切り替え機能を搭載。

CoreTextPageViewer

f:id:dnjiro:20170921072241p:plain

音の再生

以下を参照

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を設定する

  1. delegate(コールバック関数)をおく場所を指定、サンプルでは self と書かれていた。ここでは、qvaView.musicPlayer.delegate = qvaView; と記載
  2. delegateをおくクラスには、<AVAudioPlayerDelegate>をつける

    @interface QvaeView : UIView <AVAudioPlayerDelegate>

     

  3. delegate関数を以下のように記載。これは、OSのバージョンによって引数の定義が変わっているようだ。delegate関数の定義から正しいものを記載。上の関数が再生終了通知。下の関数はデコードエラー通知。

    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{

        

    }

    - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error{

        

    }