トップページ > 記事閲覧
Android版のサウンド関連
名前:ギウ 日時: 2019/12/15 14:14

お世話になっております。 最新版ではなく、少し前のDXライブラリを使用しています。(PC版の日本語入力の修正をして頂いた時のバージョンです) <問題点> Android版でゲーム起動後、暫く画面を暗くしたり、他のアプリをする等の放置をした後、 再びゲームに戻ると、稀にサウンドが鳴らなくなることがあります。 (ゲームは問題なく動いています) 1度鳴らなくなると、ゲームを閉じて、再起動するまでは鳴りません。 <使用関数> 下記の関数で、100個ほどサウンドデータを読み込み(3KB〜40KBくらいのOGG)、  SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS);  id[no] = LoadSoundMemByMemImage(map,size); 下記の関数で必要に応じて再生しています。  PlaySoundMem(id[no],DX_PLAYTYPE_BACK,TRUE); <予想> PlaySoundMemの戻り値がエラーになっていましたので、 LoadSoundMemByMemImageで作られたメモリが失われているとかでしょうか(?) 因みに、LoadSoundMemByMemImageに渡したデータは直ぐに開放してますが、問題ないでしょうか。 ご確認お願いいたします。
メンテ

Page: 1 | 2 |

Re: Android版のサウンド関連 ( No.6 )
名前:管理人 日時:2019/12/23 04:01

> こちらでも再現が難しいのですが、 > 1日寝かしておいて、復帰しようとしたときに、確率高くなる気がします。 1日寝かして、ですか…! 了解しました、早速テストプログラムを起動してから画面OFF状態にして、20時間後くらいに再度確認してみます (・・;; 1日寝かしたらOSが自動的にアプリを終了してしまいそうですが…
メンテ
Re: Android版のサウンド関連 ( No.7 )
名前:ギウ 日時:2019/12/23 07:19

確かに、最近確認したのでは、1日寝かせて、アプリが自動再起動(?)して、音が鳴らなくなってました。 (以前は、音を消して遊んでることがあったので、もしかしたら以前もこのタイミングだったのかもです) 今日も、昨日の最新版でリビルドしたのを試し、同じように自動再起動後に鳴らなくなりました。 自動再起動と、通常の起動では何か違いがあるんでしょうか。
メンテ
Re: Android版のサウンド関連 ( No.8 )
名前:管理人 日時:2019/12/24 02:46

自動再起動で鳴らなくなる、ですか… 重要なご情報ありがとうございます > 自動再起動と、通常の起動では何か違いがあるんでしょうか。 恐らくですが、こちらの『Androidアプリ開発の基礎的な情報や注意点など』のページの 『Androidアプリ開発の基礎的な情報や注意点など』 https://dxlib.xsrv.jp/lecture/Android/Android.html 項目4『Androidアプリではグローバル変数が 0 で初期化されることを前提としてはいけないことについて』の ---------------------------------------    Windowsアプリではプログラム起動直後はグローバル変数は 0 で初期化されていますが、Androidアプリでは   0 で初期化されているとは限りません、何故ならアプリを終了してもメモリが解放されず、同じアプリを起動した   際に同じメモリ領域が初期化されずに使い回されることがあるからです。    なので、グローバル変数は『前回プログラムを動作させたときに最後に代入した値』が入っている可能性が   ありますので、『プログラム起動時にグローバル変数は必ず 0 で初期化されている』ことを前提としたプログラムは   組まないように注意してください。 --------------------------------------- 上記の『アプリを終了してもメモリが解放されず、同じアプリを起動した際に同じメモリ領域が初期化されずに使い回されることがある』が 自動再起動した場合もこれにあたるのではないかと思います( 通常起動ではアプリが完全に終了している状態から新たに開始されるので グローバル変数が 0 に初期化されます ) 上記に書かれていますが、グローバル変数が 0 で初期化されていることを前提とした処理は書かれていないでしょうか? ( とはいえ、恐らく既にアプリをリリースされていられるくらいですから、その辺りはしっかり対応されていると思いますが… ) となると、DXライブラリ側が自動再起動した場合に正しく処理できていない可能性が高いのですが、 少し確認しただけでは原因となりそうな箇所は見つかりませんでした ただ、自動再起動すれば再現する可能性が非常に高いという事ですので、まずは自動再起動を発生させて現象を 再現させてみたいと思います( 昨晩起動して、1日寝かせて( 画面OFFにして )おいて今画面ONにしてみたところ、 自動再起動せずに普通にソフトが再開しました orz )
メンテ
Re: Android版のサウンド関連 ( No.9 )
名前:ギウ 日時:2019/12/24 08:20

>項目4『Androidアプリではグローバル変数が 0 で初期化されることを前提としてはいけないことについて』の 忘れてました!が、ざっと見た感じ大丈夫そうでした。 サウンド周辺も念入りに見ましたが、最初に初期化してたので問題ないはずです。 あと、ハンドルが無効な場合は、ChangeVolumeSoundMemでエラーになりますよね(?) 一先ず、再読み込みすれば鳴るようなので、「起動後の最初の再生でエラーが出たら、再読み込みする」処理を入れみます。 >自動再起動せずに普通にソフトが再開しました orz 高性能なスマホですね^^ もしそちらで確認できない場合は、私のスマホだけの問題かもしれませんので(ユーザーさんからの報告もありませんし)、一旦無視して頂いて大丈夫です。
メンテ
Re: Android版のサウンド関連 ( No.10 )
名前:管理人 日時:2019/12/25 01:47

> 忘れてました!が、ざっと見た感じ大丈夫そうでした。 > サウンド周辺も念入りに見ましたが、最初に初期化してたので問題ないはずです。 了解です! > あと、ハンドルが無効な場合は、ChangeVolumeSoundMemでエラーになりますよね(?) はい、そうなんですよね グローバル変数にそのまま残ってたハンドル値がたまたま自動再起動後の LoadSoundMem で読み込んだ サウンドハンドル値と一致していた場合も考えられますが、その場合は PlaySoundMem も成功するはずですし… > 一先ず、再読み込みすれば鳴るようなので、「起動後の最初の再生でエラーが出たら、再読み込みする」処理を入れみます。 その方法で正常に鳴るようになりそうですが、 自動再起動時にも通常の起動と同様にSEを読み込む LoadSoundMem が行われているのですよね…? となると、自動再起動後の一度目の LoadSoundMem で作成したサウンドハンドルは駄目で、 その後、再度 LoadSoundMem で作成したサウンドハンドルでは正常に再生できるという謎の結果に… > 高性能なスマホですね^^ > もしそちらで確認できない場合は、私のスマホだけの問題かもしれませんので(ユーザーさんからの報告もありませんし)、一旦無視して頂いて大丈夫です。 スマホの空きが無かったのでタブレットで試しました 本日も一日放置しておいたら、今度は完全終了してくれていました orz 検証に時間が掛かる案件ですので、並行して調査を続けたいと思います m(_ _;m
メンテ
Re: Android版のサウンド関連 ( No.11 )
名前:ギウ 日時:2019/12/26 08:16

>自動再起動時にも通常の起動と同様にSEを読み込む LoadSoundMem が行われているのですよね…? そうなんですよね。 で、確認したらダメでした; うーん。。 他のスレッド見たら↓がありましたので、  SetUseAndroidKillProcessFlag(TRUE); 今度はこれを使ってみます。 もしどこかでグローバルの初期化がもれてるのが原因なら、これで治るのかも(?)ということで。
メンテ
Re: Android版のサウンド関連 ( No.12 )
名前:ギウ 日時:2019/12/27 08:03

結果、SetUseAndroidKillProcessFlag(TRUE) もダメでした。
メンテ
Re: Android版のサウンド関連 ( No.13 )
名前:管理人 日時:2019/12/28 23:25

SetUseAndroidKillProcessFlag( TRUE ); でも駄目でしたか… ところでお使いの Android端末のOSバージョンは幾つでしょうか? 実は SetUseAndroidKillProcessFlag の機能にバグがありまして、Android 5.0 より前の バージョンでは SetUseAndroidKillProcessFlag( TRUE );を設定していても効果が無い 状態となっていましたので… もし 5.0 より前のバージョンをお使いでしたら、バグを修正したこちらのバージョンを お試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: Android版のサウンド関連 ( No.14 )
名前:ギウ 日時:2019/12/29 08:40

バージョンは9です。 最新版はDLしておきました! ありがとうございます。 他の人から同じ症状がでてこなければ問題なしで良いと思います。
メンテ
Re: Android版のサウンド関連 ( No.15 )
名前:管理人 日時:2019/12/30 10:41

ご返答ありがとうございます バージョン9でしたら問題ないですね… > 他の人から同じ症状がでてこなければ問題なしで良いと思います。 私の環境では再現しませんが、ギウさんの環境でははっきり不具合が発生していますので、 症状がギウさんの環境でのみ発生する…とは考えにくいのですよね… 今回少し大きな変更を加えてみました 原因となりそうな箇所に手を加えた他、自前ミキシングにしたので 『Android版は同時発音数が13〜16音が限界』も無くなっています ( CPU の性能の許す限り幾つも同時に発音することができます ) 大きな変更なので本件の不具合以外の不具合が発生してしまうかもしれませんが、 よろしければお試しになってみてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: Android版のサウンド関連 ( No.16 )
名前:ギウ 日時:2019/12/30 17:19

ありがとうございます。試してみます!(また書き込みます) >自前ミキシング お! 少し動かしてみましたが、大丈夫そうでした。 同時再生速度は速くなってる感じでしょうか? (以前は1フレームに沢山再生すると重くなってたので、ゲーム側で再生数を調整してます)
メンテ
Re: Android版のサウンド関連 ( No.17 )
名前:管理人 日時:2019/12/31 15:46

お試しいただきありがとうございます 自前ミキシングによる音の再生が問題なく動作しているようで何よりです > 同時再生速度は速くなってる感じでしょうか? > (以前は1フレームに沢山再生すると重くなってたので、ゲーム側で再生数を調整してます) 再生中の負荷は分かりませんが、再生開始の負荷は下がっていると思います ( 自前ミキシングなので再生開始時の OpenSL のAPI呼び出しが無くなりましたので ) あと、最新版を使用されたアプリのご提供ありがとうございます 昨日から3の状態まで進めて、本日復帰させてみましたが、正常にSE、BGM再生されていました ( これが最新版の変更によるものなのか例によって私の環境では再現しないからなのかは不明ですが… ) > こちらでは何故かPCがスマホを認識せず、LOGを見ることができませんので、 あ、LOGはスマホで確認が可能です ファイルエクスプローラー系のソフトをインストールして( 私は良いのか悪いのか分かりませんが ファイルマネージャーというアプリを使っています ) Log.txt があるフォルダに移動して Log.txt をテキストエディタで開く感じです ( 例えば DxLibTest_Android_VS2019 という Android版テスト用のプロジェクトの場合、Log.txt のパスは /storage/emulated/0/Android/data/com.DxLibTest_Android_VS2019/files/Log.txt となっています ) 今回頂いたアプリのものと思われるフォルダの中も拝見しましたが Log.txt はありませんでした SetOutApplicationLogValidFlag( FALSE ); でログを出力されないようにされていますでしょうか?
メンテ
Re: Android版のサウンド関連 ( No.18 )
名前:ギウ 日時:2020/01/01 08:00

ご確認ありがとうございます。 こちらでも問題なく再起動できていました!(2回試しました) >あ、LOGはスマホで確認が可能です なるほどです。 標準のソフトっぽいので確認できました! >SetOutApplicationLogValidFlag( FALSE ); でログを出力されないようにされていますでしょうか? ですね、申し訳ありません。 元々LOGを有効にしてたのを、無効に変えてしまってました。。 ということで、最新版ではこの件は無事解決ということで、ありがとうございました! ただ、こちらのスマホでは、以前よりも若干ノイズが入り気味になりました。 毎フレーム、複数のSEを鳴らした時に、ノイズを感じやすいです。(同じ音なら、毎回同じノイズになってる気がします) ご報告ということで。 本年も宜しくお願い致します。
メンテ
Re: Android版のサウンド関連 ( No.19 )
名前:管理人 日時:2020/01/02 06:08

お試しいただきありがとうございます 問題なく再起動できたようで何よりです! > ただ、こちらのスマホでは、以前よりも若干ノイズが入り気味になりました。 > 毎フレーム、複数のSEを鳴らした時に、ノイズを感じやすいです。(同じ音なら、毎回同じノイズになってる気がします) > ご報告ということで。 恐らく自前ミキシングでは音割れ防止処理が入っていないので、同タイミングで同じSEを再生すると 合成した音の波形が16bitの限界( -32768 〜 32767 )を簡単に超えてしまって音割れが発生しているのだと思います 少し音割れを軽減する処理を入れてみましたので、よろしければ症状が改善されるかお試しいただけないでしょうか? m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > 本年も宜しくお願い致します。 こちらこそよろしくお願いいたします m(_ _)m
メンテ
Re: Android版のサウンド関連 ( No.20 )
名前:ギウ(解決) 日時:2020/01/02 07:35

早速ありがとうございます! 音割れ大丈夫そうでした!(以前と同じように聞こえてます) 自前ミキシング、速度も速くなってますし、今後の自由度も高くなってると思いますし、完璧ですね。
メンテ
Re: Android版のサウンド関連 ( No.21 )
名前:管理人(解決) 日時:2020/01/03 07:26

お試しいただきありがとうございます 音割れ解消されたようで何よりです! 解消の仕組みとしては『音の再生を微妙にずらす』です 全くの同タイミングで音を再生しなければ波形の振幅がキッチリ倍々になることも無くなり、 -32768〜32767 の範囲から外れる時間も短くなり、音割れが気にならなくなるというわけです ( 1回のPlaySoundMem につき 1/480秒再生が遅れますので、60fpsの場合1フレームに8回以上 SEを再生すると、9回目以降は次のフレームまで再生が遅らされます ) とはいえ、波形がキッチリ倍々になる場合よりは -32768〜32767 の範囲から外れる率は 低くなるとはいえ、外れる箇所はあることはあるので、もしかしたら駄目かも、と思ったのですが 大丈夫だったようで何よりです ( この方法で駄目なら一般的な『全体の音量を下げて音割れを防ぐ』をやろうと思ったのですが、 私も別の簡単なテストをしてみて想像以上に音割れを感じなかったので今回の方法で問題無さそうです… ) > 自前ミキシング、速度も速くなってますし、今後の自由度も高くなってると思いますし、完璧ですね。 完璧…かどうかはまだ分かりませんが、お陰様で実用レベルにできたと思います m(_ _)m
メンテ
Re: Android版のサウンド関連 ( No.22 )
名前:ギウ 日時:2020/01/03 15:06

>外れる箇所はあることはあるので 確かに、偶にノイズっぽくなることがありました。 言われないと気付かないレベルかもですが。 >この方法で駄目なら一般的な『全体の音量を下げて音割れを防ぐ』をやろうと思ったのですが 速度的に重くないならこれもあった方が良い気がします。 重い場合は、速度優先か音割れ防止優先かを設定できるようにするとかでしょうか。
メンテ
Re: Android版のサウンド関連 ( No.23 )
名前:管理人 日時:2020/01/04 15:44

> 確かに、偶にノイズっぽくなることがありました。 > 言われないと気付かないレベルかもですが。 なんと、そうでしたか… > 速度的に重くないならこれもあった方が良い気がします。 > 重い場合は、速度優先か音割れ防止優先かを設定できるようにするとかでしょうか。 そこまで重いわけではありませんので、とりあえず『範囲越え時の音割れ防止音量下げ処理』は必ず行うようにしてみました 何度も申し訳ありませんが、よろしければお試しになってみてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: Android版のサウンド関連 ( No.24 )
名前:ギウ(解決) 日時:2020/01/04 10:41

ご対応ありがとうございます! 今度こそ大丈夫ではと感じました。
メンテ
Re: Android版のサウンド関連 ( No.25 )
名前:管理人(解決) 日時:2020/01/05 07:13

ご確認ありがとうございます! m(_ _)m ひとまず今の状態で次の正式版としようと思います…
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存