HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0205
DrakujiLinux上HSP3Dishのmmplayの不都合について13解決


Drakuji

リンク

2024/2/5(Mon) 05:03:08|NO.101162

お世話になります、Drakujiと申します。

Linux(Raspbian)上で動くゲームを作っていまして、
音が鳴らない問題を見つけました。
GitHubからgit cloneで取得した環境で作っています。

OpenHSP/sanple/game/shoot.hspという
シューティングゲームのサンプルを実行すると、
正常にwavファイルが効果音として正常に再生されていますが、
当方で作っているプログラムではうまく再生できませんでした。

原因を追究してみたところ、
ウィンドウの大きさや全画面表示をさせるために、
screen命令やbgscr命令を使用しており、
この命令後に突然mmplay命令でwavファイルが再生できなくなることを確認いたしました。

この症状をshoot.hspでも再現ができました。
以下、ソースの*init部分のサンプルです。

*init ; 画面の準備 ; //フルスクリーンや指定の画面サイズで実行したいときに以下2行を追加する。 screen 0,640,480,0 //screenを行うとこの後wavが再生できない ;bgscr 0,640,480,0 //bgscrも同様にこの後wavが再生できない celload "./sample/game/title.png",2 celload "./sample/game/chr.png",3 celdiv 3,48,48 celload "./sample/game/bg.png",4 mmload "./sample/game/explos.wav",0 mmload "./sample/game/inject.wav",1 mmload "./sample/game/sel.wav",2 mmload "./sample/game/cappi08.ogg",4 mmload "./sample/game/smart_and_active.mp3",3

この症状をが当方の環境だけで起こっているのかもしれませんので、
Linuxで開発をされている方で何か対策か情報をご存じの方、教えていただけないでしょうか。

よろしくお願いいたします。



この記事に返信する


おにたま(管理人)

リンク

2024/2/8(Thu) 20:52:25|NO.101178

>Drakuji さん

ご報告ありがとうございます。
Linux版の動作について、こちらでも確認してみたいと思います。
Linux(Raspbian)ということは、RaspberryPiでしょうか?
不具合であればこちらで修正させて頂きます。



Drakuji

リンク

2024/2/10(Sat) 18:17:06|NO.101198

おにたま様

返信ありがとうございます。
OSはRaspbian Desktop for PC(x86)です。

よろしくお願いいたします。



Drakuji

リンク

2025/1/15(Wed) 00:54:38|NO.102918

screen命令およびbgscr命令を使用すると、
mmplayでwavファイルのみ再生されない問題について、
こちらで調査できる範囲で見てみました。

OpenHSP/src/hsp3dish/emscripten/mmman.cpp 377行目付近
以下の1行を入れて値を調査してみました。
Alertf( "[MMMan] Play INTWAVE m->channnel %d m->vol %d",m->channel,m->vol );

screen命令およびbgscr命令を使わない場合、正常にwavファイルは再生され、
m->channelの値はサウンド再生都度0以上の値になります。

screen命令およびbgscr命令を使う場合、正常にwavファイルは再生されず、
m->channelの値はサウンド再生されるであろうタイミングで全て-1となるようです。



zakki

リンク

2025/1/15(Wed) 13:05:27|NO.102921

Windowsでもscreenやbgscrでmmloadやesspriteの内容は失われるのでscreen→mmloadの順に呼び出す
必要がありますが、それとは別ですか?
LinuxやEmscriptenではhsp3excmd_rebuild_windowのあたりをコメントアウトすれば対応できるかもしれませんが、
Windowsではウィンドウに紐づくので対応大変そうに見えます。



Drakuji

リンク

2025/1/15(Wed) 23:20:05|NO.102924

>zakkiさん。
返信ありがとうございます。
hsp3excmd_rebuild_windowについて、こちらで調べられる範囲で試してみたいと思います。

音が再生されない現象は、Linux版のみで、
screen→mmloadの順に処理していますが、
拡張子".wav"の音声ファイルのみ、mmplayで再生されないという現象になります。

※Windows版は問題なく再生できています。
※WebGL版ではscreen命令とbgscr命令が
 実際どのように処理されているかは今しがた詳しく調べておりませんが、
 wavファイルは粗方再生できています。



Drakuji

リンク

2025/1/16(Thu) 02:28:35|NO.102925

>zakkiさん。
hsp3excmd_rebuild_windowについて試したところ、
Linuxでscreenまたはbgscrでウィンドウ初期化後にmmloadでwavファイルをロードし、
mmplayでひとまずwavファイルを粗方再生できるようになりました。
(WebGL版とほぼ似た再生パフォーマンス。最後の補足を参照)

【検証1】
・OpenHSP/src/hsp3dish/linux/hsp3dish.cpp:1008行目の以下をコメントアウト
//hsp3excmd_rebuild_window();
【結果1】screen→mmloadでロードしたwavファイルはmmplayで再生できるようになった。

【検証2】
・検証1のhsp3excmd_rebuild_window();のコメントアウトを外す。
・OpenHSP/src/hsp3dish/linux/hsp3gr_dish.cpp:3939から3940行目の以下をコメントアウト
//delete mmman;
//mmman = new MMMan;
【結果2】screen→mmloadでロードしたwavファイルの再生確認OK。


【補足】粗方再生というのは、時々mmplay時に
NO.102918記す"m->channel"が-1になり、音が鳴りません。
mmplayを連続行あるいは頻発するような使い方で、
音を複数同時発音しているようなときが怪しいです。

このスレッドの問題定義
「Linux版でscreenまたはbgscr命令後にmmloadでロードしたwavファイルが再生されない」
はひとまず再生が確認できましたので、「解決」とさせていただきます。



おにたま(管理人)

リンク

2025/1/17(Fri) 10:15:45|NO.102929

>Drakuji さん

ご報告ありがとうございます。Linux版のhsp3excmd_rebuild_windowについては、再検討させて頂きます。
"m->channel"が-1になり、音が鳴らなくなる状態というのを
再現するようなスクリプトがありましたら大変参考になります。



zakki

リンク

2025/1/17(Fri) 17:17:26|NO.102931

> Linuxでscreenまたはbgscrでウィンドウ初期化後にmmloadでwavファイルをロードし

mmload -> screen出来た方が嬉しそうという勘違いのせいなのでhsp3excmd_rebuild_windowの修正は的外れでした。

そういえば、実機にスピーカー繋がってなくてもWSLgでデバッグ出来るんじゃ…と
WSLとブラウザでは音が出るようになりました。

ログ見る限りではMix_ReserveChannels()が要らなくて、
この予約分でチャンネルが足りなくなることが原因のようです。

https://github.com/onitama/OpenHSP/compare/master...zakki:mmman-sdlmixer?expand=1#diff-2463b95fee61faf4c7e521f8b98301d2f1d83d2e9bdae67ab262275290a5d823R170

とりあえず、Mix_ReserveChannelsの1行をコメントアウトでラズパイでも上手くいきませんか?



Drakuji

リンク

2025/1/18(Sat) 02:28:11|NO.102933

>おにたまさん。
>zakkiさん。

以下、「Linux版でscreenまたはbgscr命令後にmmloadでロードしたwavファイルが再生されない」
で調査していただくサンプルソースと音声ファイル一式のリンクです。
https://drakuji.main.jp/_test/caos_cms/images/bin/linux_mmplay_issue.7z

NO.102925の内容の適用前は、全く音が鳴りません。
NO.102925の内容の適用後は、音が鳴るようになりますが、
連続して同じ音をmmplayしていると、スクリプト通りのmmplayの回数音が鳴りません。

NO.102931の内容をこちらで調査した手順は以下です。
【検証3】
・NO.102925の検証1と検証2は適用しない(元のソースコードの状態に戻す)。
・OpenHSP/src/hsp3dish/emscripten/mmman.cpp 146行目のみをコメントアウト
//Mix_ReserveChannels(16);
【結果3】
音は鳴りますが連続して同じ音をmmplayしていると、スクリプト通りのmmplayの回数音は鳴りませんでした。
"m->channel"が-1になります。

※なお、この検証はRaspberry Pi OS x86 Bullseye(Linux)で検証しています。
ラズパイについてはOpenHSPを最新版に更新し、
また、HDMIとイヤフォンジャックの音声出力設定を再確認して検証します。

※HDMIとイヤフォンジャックの音声出力設定の参考資料
https://rikoubou.hatenablog.com/entry/2020/06/12/144235



zakki

リンク

2025/1/18(Sat) 13:49:35|NO.102935

ループのsw_snd_se_slot_spin.wavでも1チャンネル使ってて、
sw_snd_se_slot_stop.wav は無音時間を含めて2.8秒くらいあって0.2秒間隔で鳴らすと14チャンネル程度必要で、
今の16チャンネルはギリギリです。

無音時間削るか #define MIX_MAX_CHANNEL 16 を例えば #define MIX_MAX_CHANNEL 256 に増やすのはどうでしょう?



Drakuji

リンク

2025/1/18(Sat) 16:14:43|NO.102937

>zakkiさん。

アドバイスありがとうございます。
#define MIX_MAX_CHANNEL 16を256等大きくする方法を試しましたが、症状は改善されませんでした。
同時発音数については、サウンドデータの無音部分のカットも含めて対応したいと思います。

トピックからそれますが、引き続きラズパイでの動作検証をしようとしているところで、
make -f makefile.raspbianでコンパイルエラーとなり公式の環境構築で検証できません。
環境はRaspberry Pi2B+ 、Raspberry Pi OS 32Bit Bookwormで再構築しております。
以下コンパイルエラーのメッセージです。
g++ -Wno-write-strings -fpermissive --exec-charset=UTF-8 -DHSPDISH -DHSPLINUX -DHSPRASPBIAN -DHSPDEBUG -DUSE_OBAQ -I /opt/vc/include -c src/hsp3dish/raspbian/hsp3dish.cpp -o src/hsp3dish/raspbian/hsp3dish.do
src/hsp3dish/raspbian/hsp3dish.cpp: In function ‘void hsp3dish_initwindow(engine*, int, int, char*)’:
src/hsp3dish/raspbian/hsp3dish.cpp:414:11: error: ‘EGL_DISPMANX_WINDOW_T’ does not name a type
414 | static EGL_DISPMANX_WINDOW_T nativewindow;
| ^~~~~~~~~~~~~~~~~~~~~
src/hsp3dish/raspbian/hsp3dish.cpp:434:2: warning: converting to non-pointer type ‘DISPMANX_RESOURCE_HANDLE_T’ {aka ‘unsigned int’} from NULL [-Wconversion-null]
434 | };
| ^
src/hsp3dish/raspbian/hsp3dish.cpp:477:4: error: ‘nativewindow’ was not declared in this scope
477 | nativewindow.element = dispman_element;
| ^~~~~~~~~~~~
make: *** [makefile.raspbian:108: src/hsp3dish/raspbian/hsp3dish.do] エラー 1



zakki

リンク

2025/1/18(Sat) 17:07:19|NO.102938

すみません、説明端折りすぎだったのをまとめました。

Mix_ReserveChannelsをコメントアウトしただけの状態だとMIX_MAX_CHANNELが8以上でも8chが限界です。
対象はSDL2のソースコードとLinux版WSLgとEmscripten版Chromeの挙動ですが、
SDLに大きく変更がなければラズパイでも同様だと思います。

とりあえず試すなら対応2でどうでしょう?
対応3ができると自由度上がりますがコマンド体系どうするかみたいな話も…

□ 対応1
動作: screen呼び出しなどでmmanとSDL Mixerが複数回呼び出されても8チャンネル分再生できるようにする。
対応: Mix_ReserveChannels()を呼ばない。


// 1回目のmman初期化 Mix_Init(MIX_INIT_OGG|MIX_INIT_MP3); // Mix_OpenAudioが呼ばれるまでは確保されてるチャンネルは0ch Mix_ReserveChannels(16); // 0ch中16ch予約しようとするので0ch予約 int ret = Mix_OpenAudio(0, 0, 0, 0); // デフォルトの8ch作成 // 8ch中0chが予約されて8ch使える // 2回目のmman初期化 Mix_Init(MIX_INIT_OGG|MIX_INIT_MP3); Mix_ReserveChannels(16); // 8ch中16ch予約しようとするので8chが予約 int ret = Mix_OpenAudio(0, 0, 0, 0); // デフォルトの8ch作成 // 空いてるのが0chになって自動割り当てで再生できない

□ 対応2
動作: MIX_MAX_CHANNEL分だけ再生できるようにする。
対応: Mix_OpenAudioの後で、Mix_AllocateChannels(MIX_MAX_CHANNEL)を呼ぶ。Mix_ReserveChannelsは呼ばない。


Mix_Init(MIX_INIT_OGG|MIX_INIT_MP3); Mix_OpenAudio(0, 0, 0, 0); // デフォルトの8ch作成 Mix_AllocateChannels(MIX_MAX_CHANNEL); // MIX_MAX_CHANNEL ch作成 // Mix_ReserveChannelsで予約してないのでMIX_MAX_CHANNEL ch利用可能

□ 対応3
動作: HSPEMSCRIPTEN拡張?のmmplay a, bで再生チャンネルを指定できるようにする。
対応: 全chとユーザーが明示して使うための予約ch数をsetreqなどで設定できるようにする。
確実に鳴らしたい音は予約済みchを指定する。
ch指定が無ければ予約されて居なくて空いてるchを自動で使う。(現状動作)



Drakuji

リンク

2025/1/18(Sat) 19:20:15|NO.102939

>zakkiさん。

同時再生の問題まで詳細説明いただきありがとうございます。
wavファイルの多重再生を検証しました。
以下NO.102938の検証2を適用したサンプルスクリプトではなく実使用場面の動画です。

●Linux版 Raspberry Pi OS Bullseye x86(当方Linux主要開発環境)
https://www.youtube.com/watch?v=ORn9Ot00yXs

●RPi版 Raspberry Pi OS Bookworm ラズパイ2B ※FPSが出てないのでBullseyeで再検証予定
https://www.youtube.com/watch?v=4MTCwfSH1uI



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101162への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.