サウンドフォントを変更して「適用」するとアプリケーションごとのボリュームも変更される場合がある

Issue #557 resolved
暗黒 騎士 created an issue

黒鉄の風斬り羽根の人さんの報告です。

https://twitter.com/cw_rom/status/901113355426947072

自分の方では上記のような構成にしても再現しなかったのですが、DMでのやりとりで、「コピーでは症状が継続しないが、移動では継続する」ということで、そういえば一時期自分もそういうことがあったなぁと思い、通知領域の音声アイコン右クリック→ミキサーを確認して頂いたところビンゴのようでした。

再現のためにPy2.0β4を新規に落とし直して、2~3回再現を確認とのことです。

Comments (9)

  1. k4nagatsuki repo owner

    ご報告ありがとうございます。

    手許のWindows 10で見てみたところ、Windowsのアプリケーションごとの音量とCWPyの設定音量は連動して動いているようでした。以前のバージョンのWindowsではこの辺りが違うのかもしれませんが、そうなるとアプリケーション側から書き換えてしまえる事が謎になります。

    サウンドフォントの変更時にはBASS Audioを再初期化していますが、それによって設定の変化が起きているのであれば、再初期化を抑止する事で問題を軽減できるはずです。以下はそれを試しに実装してみたものです。

    https://bitbucket.org/k4nagatsuki/cardwirthpy-reboot-k4nagatsuki/downloads/CardWirthPy_test_20170826a.zip

    しかしそもそもエンジンの起動時に初期化を行っているので、そこでもこの問題が起きる可能性は残ります。

  2. 暗黒 騎士 reporter

    テスト版でもかなりガチャガチャやると再現する、 また、原因とは無関係かも知れないが適用時にフリーズしてエラーログが出た、とのことでした。

    パスワード:abc

    (転載許可は頂きました)

    サウンドフォントを全て削除してPyを再起動する時、Windowsの音量ミキサーを同時に表示していると、(WinMMで)DefOpenが流れた瞬間に音量ミキサー上のPyの音量が下がっており、(WinMMで再生されているため)そのタイミングでは下がっているのがわからず、サウンドフォントにチェックを入れた時に(BASSからの出力でPy側の音量が適用されるので)発覚しているのかも、という流れ?のようです。

    見た感じ、またSDLmixerの厄介な競合が起こってるのかなという感じですね。

  3. k4nagatsuki repo owner

    サウンドフォントを全て削除してPyを再起動する時、

    たしかにSDL_mixerっぽいですね。

    もういっそSDL_mixerを使う処理を削除してしまった方がよさそうですが、今の時期にそれをやるのは他の問題を入れてしまいそうなので躊躇する所です。

  4. k4nagatsuki repo owner

    新しいエラーログは全てSDL_mixerのものなので、サウンドフォントを全く使わない設定にしない限りは発生しないと思います。

  5. k4nagatsuki repo owner

    事故じみていますがpull request #1983でBASSを初期化しないようにする変更をマージしました。

    「かなりガチャガチャやると再現する」との事ですが、たぶん全てのサウンドフォントを使用しない設定を挟まなければ大丈夫になっているのではないかと思います。ただ、起動時の初期化でこの現象が起きるのではという不安は依然としてあります。

  6. 暗黒 騎士 reporter

    もういっそSDL_mixerを使う処理を削除してしまった方がよさそう

    自分の方でSDLmixer関係のコードを削って、件の方に試して頂いたところ、「サウンドフォントの全削除後、再起動しても(無音なので)ボリュームミキサーにPyが出現しないので、恐らく再現しなくなった」ということでした。 隠し設定として残すということですのでPRは差し控えますが、#573で解決としていいと思います。ありがとうございました。

    (書かれるまでもないとは思いますが、)一応編集箇所です。initの初期化判定に使っていたif文を削るとなぜか音が鳴らない?のでそのままになりました。

  7. k4nagatsuki repo owner

    手をつける箇所は同じになるはずなので、参考にさせていただきます。

    initのif文はBASSの初期化を行ってそれに失敗したら……というものですので、中身のinit_bassだけ実行するようにしてみてください。

  8. 暗黒 騎士 reporter

    あ、この1行で実行もしてるんですね。

    ご教示の通りで鳴るようになりました。糞初心者でお恥ずかしい限りです。

  9. Log in to comment