現在AIRデスクトップアプリケーションを開発しているのですが、どうしても解決できなかったので、皆様のお力添えをいただけますでしょうか。
SampleDataEventの発行が止まるタイミングとしては、右上のXボタンやネイティブメニュー、左上のアイコンをクリックしたままにすると発行が止まります。
再現情報としましては、右上のXボタンは押している間中、ネイティブメニューと左上のアイコンは発行が再開しますが、メニューにフォーカスがある間不定期に発行が止まり、音声がその時のバッフ ァを再生し続けます。
そして、マウスのボタンを離したり、メニューを閉じると発行が再開し、サウンドの再生が正常に戻ります。
以下にコードを示しますので、間違いなどがあればご指摘ください。
どうぞよろしくお願いいたします。
以下コード
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="800"
height="600"
initialize="appInit()">
<fx:Declarations>
<!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import flash.events.Event;
import flash.events.SampleDataEvent;
// パラメータ
private var sampling:uint = 2048; // 1度に転送するサンプリング数
// ソース用サウンドオブジェクト作成
private var dataUrl : URLRequest = new URLRequest( "test.mp3");
private var src_obj : Sound = new Sound(dataUrl);
// 出力用サウンドオブジェクト
private var out_obj:Sound = null;
private var channel:SoundChannel = null;
private function appInit():void {
// ソース用サウンドオブジェクトの読み込みが完了
src_obj.addEventListener (Event.COMPLETE,SoundCompleteFunc);
}
private function SoundCompleteFunc (event : Event):void {
// 出力用サウンドオブジェクト作成
out_obj = new Sound();
// 新しいオーディオデータ要求時に呼び出されるイベント
out_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, SampleDataFunc);
// 再生開始
channel = out_obj.play();
}
// サウンドデータ要求時に呼び出されるイベント
private function SampleDataFunc(event:SampleDataEvent):void{
var i:uint;
// ソース用と出力用のバッファ
var src_buffer:ByteArray = new ByteArray();
var out_buffer:ByteArray = event.data;
// サウンドデータを取得
var get_sampling:Number = src_obj.extract(src_buffer,sampling);
// サウンドバッファが足りない場合は空白を埋める
for(i=get_sampling;i < sampling;i++){
src_buffer.writeFloat(0.0);
src_buffer.writeFloat(0.0);
}
// サウンドデータを出力バッファにコピー
var data:Number;
src_buffer.position = 0;
for(i=0;i < sampling;i++){
// 左チャンネル
data = src_buffer.readFloat();
out_buffer.writeFloat(data);
// 右チャンネル
data = src_buffer.readFloat();
out_buffer.writeFloat(data);
}
}
]]>
</fx:Script>
<s:Group name="mainGroup" width="100%" height="100%">
<s:Panel title="Panel"
width="75%" height="75%"
horizontalCenter="0" verticalCenter="0">
<s:VGroup width="100%" height="100%">
<s:Label text="test"/>
</s:VGroup>
</s:Panel>
</s:Group>
</s:WindowedApplication>