終了
ロック済み

SampleDataEventの発行が止まる

Community Beginner ,
Sep 28, 2013 Sep 28, 2013

リンクをクリップボードにコピー

コピー完了

現在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>

表示

948

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Oct 07, 2013 Oct 07, 2013

リンクをクリップボードにコピー

コピー完了

最新

投稿からも色々と試してみたりしていましたが、結論から言うと解決しておりません。

しかし、ひとつわかったことがありましたので、自己レスします。

まず、発行が止まるイベントがSampleDataEventだけではない、ということです。

試しに、Event.ENTER_FRAMEのリスナーを登録してAIRアプリを起動した場合、同じ操作でENTER_FRAMEの発行が中断されてしまいます。

つまり、Xボタン、最大化ボタン、最小化ボタンを押したり、ネイティブメニュー、コンテキストメニューを開いている時には、イベントの発行が中断されている、と考えられます。

そして、ブラウザに表示しているFlashだとこういった事はないのですが、スタンドアロンプレイヤーでSWFを開くとXボタン、最大化、最小化ボタンで再現します。

メニューやコンテキストメニューでは再現しなかったので、実装の違いによるものでしょう。

結果、AIR特有のものではなくFlashそのものの不具合な気がしてきました。

できればアドビの方に確認していただきたいです。

もしくは、バグレポートみたいなものがどこかにあるのでしょうか?ちょっと探してみたいと思います。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines