Yanesdk.Sound.Sound 改造
はじめまして。
BGMとしてループ再生するときに、全体をループさせるのではなく、
LoopStartとLoopEndの場所をタグなり外部ファイルなりで指定して、
頭から再生開始して、途中から途中まででループさせようとしています。SDKを通して、再生位置を知ることができれば可能かなと思って調べていたのですが、どうもよくわかりません・・・。
http://yaneu.com/cgi/yaneSDKdotNET/dobbsr.cgi?a=view&topic_id=1142199536&res_id=735-736
SDKを通さないでやるべきなのでしょうか?
SDKを通してやる方法があればご教授お願いします。
面白そうだったので、Yanesdk.Sound.Sound を途中から再生できるようにしてみました。
id:melpon:20000107
本当は演奏終了のイベントを通知しようかと思ってたんですが、Mix_ChannelFinished() が手動で停止させたか最後まで演奏して停止したかを分けてくれないので、やめておくことにしました。
なので、ループ毎に演奏が停止しているかどうかを見るべきでしょう。
Yanesdk.Sound.Sound sound = new Yanesdk.Sound.Sound(); sound.Load("hoge.ogg", 0); // 最初から最後まで1回だけ演奏 sound.Loop = 0; sound.Play(); // 毎ループ回ってると仮定 while (sound.IsPlaying()) { System.Threading.Thread.Sleep(50); } // 10秒地点から60秒地点までをループ再生 sound.Loop = -1; sound.SetPosition(10000, 60000); sound.Play();
こんな感じになるはず。
チャンク専用の操作になってしまうわけですが、実装に問題無ければ入れて頂けませんか?>やねさん
多分 CLR には思いっきり準拠してないと思いますので、ガリガリ書き換えることになるとは思いますが……。
あとセンスの無いメソッド名も書き換えて頂けると嬉しく……orz
で、あとコールバックに関してですが、どうやら SDL_mixer の内部から呼び出される規約は cdecl(?)らしくて、コールバック用の delegate を宣言する際に CallingConvention.Cdecl を指定しないと、コールバック関数が呼び出された後に落ちてしまいます。
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void channel_finished_t(int channel);
次のアップデートで反映して頂けると嬉しいですm(__)m
追記:
Sound.OnReconstruct() の時に再生位置を設定し直してやる必要があるかも……。
追記2:
バグあるので修正ちう