トップページ > 過去ログ > 記事閲覧
サウンドの一時停止、再開
名前:ももちゃん 日時: 2010/02/11 15:43

音楽再生中に一時停止が押されると曲が止まり、 プレイボタンが押されるとそこから音楽を再開する プログラムを組みたいのですが既存関数で可能でしょうか? 流れとしては プレイボタンで再生 ↓ 一時停止が押される ↓ 曲が再生されてなければ無反応 曲が再生されていれば ・一時停止 ・どこで止まったかの位置ををByteか秒数で取得 ・一時停止フラグを立てる ↓ プレイボタンが押されたとき一時停止フラグが 立っていない:頭から再生 立っている:取得しておいた止まった位置を再生位置として設定後再生 っていう感じだと思うのですが StopSoundFile は止められた位置取得される訳でもないみたいなので 他の関数を探し GetStreamSoundCurrentPosition GetStreamSoundCurrentTime などを見つけましたが使い方がよくわかりません。私の行った方法が Get〜で取得したものを変数にいれといて Setで再生位置をその変数指定 これでも頭から再生されてしまいました(汗 説明には書いてませんでしたが関数の名前からして ストリーム風再生にしか効果がないのでしょうか? といっても私はストリーム風というものがよくわかっていないので・・・ そもそもこのGet〜は私の思っている関数なのかすらもわかりません(T_T) 何か方法があればお願いします<(_ _)>

Page: 1 |

Re: サウンドの一時停止、再開 ( No.1 )
名前:いっち 日時:2010/02/13 03:18

音楽の一時停止についてですが、停止された位置から音楽を再開すると言う機能については、 PlaySoundMem関数に第3の引数を指定することで実現できます。 以下のURLを参考になさってみてください。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=494
Re: サウンドの一時停止、再開 ( No.2 )
名前:いっち 日時:

自分でも色々と試してみているのですが、 "SetCreateSoundDataType"関数で"DX_SOUNDDATATYPE_MEMNOPRESS"を指定したときに "SetSoundCurrentTime"関数がうまく動かないのは仕様なのでしょうか? 最初の1回は必ず成功するのですが、2回目以降の"SetSoundCurrentTime"関数が 成功するときと失敗するときがあります。 ("DX_SOUNDDATATYPE_MEMPRESS"と"DX_SOUNDDATATYPE_FILE"は問題ないように見受けられます) //-- 以下テストソース (Windows XP Startup.wavを使用) --// // Pキーで再生を開始するたびに決まった位置から再生したいがそうはならない。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMNOPRESS ); // うまくいかない //SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ); // うまくいく //SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ); // うまくいく int iSoundHandle = LoadSoundMem( "Windows XP Startup.wav" ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { if ( CheckHitKey( KEY_INPUT_P ) ) { if ( CheckSoundMem( iSoundHandle ) ) { StopSoundMem( iSoundHandle ); } else { SetSoundCurrentTime( 1000, iSoundHandle ); // 開始位置を決め打ち PlaySoundMem( iSoundHandle, DX_PLAYTYPE_BACK, FALSE ); } WaitTimer( 333 ); } ClearDrawScreen( ); if ( CheckSoundMem( iSoundHandle ) ) DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "再生 > %d", GetSoundCurrentTime( iSoundHandle ) ); else DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "待機中 > %d", GetSoundCurrentTime( iSoundHa
2010/02/13 04:20 ( No.ndle ) );
ScreenFlip( );
}
DxLib_End( );
return 0;
}
)
名前:143.90.220.114 日時:   <AEZ6jtfAv9rao>

Re: サウンドの一時停止、再開 ( No.3 )
名前:sy(サイ) 日時:2010/02/13 10:10

僕も2回目以降の"SetSoundCurrentTime"関数が必ず失敗します。mp3だけでなくoggでもなるので、修正お願いしたいですorz
Re: サウンドの一時停止、再開 ( No.4 )
名前:管理人 日時:2010/02/15 00:18

ご報告ありがとうございます DX_SOUNDDATATYPE_MEMNOPRESS のサウンドハンドルは同時に音を鳴らせられるようにするために バッファを幾つも持っているのですが、その管理が上手くいっていませんでした ( 2回目以降の SetSoundCurrentTime で再生位置を変更している内部バッファ番号は0なのに、 次の PlaySoundMem では内部バッファ番号2が再生されていた、という感じに・・・ ) 修正版をアップしましたので、よろしければお試し下さい m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: サウンドの一時停止、再開 ( No.5 )
名前:いっち 日時:2010/02/15 02:47

> 管理人さん お疲れ様です。 修正確認しました。 せっかくなので複数ファイルを読み込んでテストしてみましたが問題ありませんでした。 すばやい対応ありがとうございます。
Re: サウンドの一時停止、再開 ( No.6 )
名前:sy(サイ) 日時:2010/02/22 19:04

> 管理人さん 今日試してみましたが直ってないようです・・・orz
Re: サウンドの一時停止、再開 ( No.7 )
名前:sy(サイ) 日時:2010/02/22 22:57

DX_SOUNDDATATYPE_MEMPRESSにセットすることで解決しました。 でもデフォルトでウマく行かないのは問題かもしれないです。 試したデータはoggのみです。
Re: サウンドの一時停止、再開 ( No.8 )
名前:管理人 日時:2010/02/28 22:01

うーんそうですか・・・ いっちさんが掲載してくださったサンプルプログラムでもダメでしょうか?
Re: サウンドの一時停止、再開 ( No.9 )
名前:sy(サイ) 日時:2010/03/01 02:17

すいません、直ったとか勘違いでした。 例えば1000とかキリの良い数字だと大丈夫なのですが、1001にするとGetSoundCurrentTimeでかえってくる数値は「1000」とかになります。 この数値の場合二回目以降は戻り値が「0」となりました。
Re: サウンドの一時停止、再開 ( No.10 )
名前:いっち 日時:2010/03/02 01:23

ミリ秒単位の精度の追求は難しいと思いますが、2回目以降の"GetSoundCurrentTime"関数の戻り値が"0"になるのは不思議です。 もしよろしければ、テストに使用なさっているソースとデータファイルをご提供頂けますでしょうか? 公開はご都合が悪いようでしたら、管理人さん宛てにメールで送付なさると調査して頂きやすいと思います。
Re: サウンドの一時停止、再開 ( No.11 )
名前:sy(サイ) 日時:2010/03/02 02:02

いっちさんのサンプルでwaveでもoggでもmp3でも同様の事が起こりました。 現在ミリ単位で使用する場合、DX_SOUNDDATATYPE_MEMPRESSにセットすれば可能となっています。 ミリ単位で無ければ全く問題ないようです。 製品化も目指してるのでちょっと公開は辛いです…^^;
Re: サウンドの一時停止、再開 ( No.12 )
名前:管理人 日時:2010/03/05 23:37

SetSoundCurrentTime は結構アバウトな時間指定ですので、正確な時間指定をする場合は SetSoundCurrentPosition をお使い下さい // サウンドハンドルの再生位置をバイト単位で変更する(再生が止まっている時のみ有効) int SetSoundCurrentPosition( int Byte, int SoundHandle ) ; 引数 Byte で指定する値はバイトですので、例えば秒間 44.1KHz サンプルの2チャンネル、 精度が16bitのサウンドファイルで、丁度1秒経過した箇所に再生位置を移動したい場合は // 44100 = サンプリングレート 2 = チャンネル数 2 = 精度16bitは2byte(8bit=1byteなので) SetSoundCurrentPosition( 44100 * 2 * 2, SoundHandle ) ; とします SetSoundCurrentTime が正常に動作しない問題ですが・・・謎です とりあえず私の環境でいっちさんが掲載してくださったテストプログラムを コンパイルしたものをアップしてみましたので、よろしければ正常に動作するか お試しいただけないでしょうか? https://dxlib.xsrv.jp/file/MemNoPressCurrentTimeTest.zip テスト用のサウンドファイルは同梱していませんので、テストに使用したい サウンドファイルを実行ファイルがあるフォルダにTestSound.wavという ファイル名にリネームしておいてから実行してください m(_ _;m
Re: サウンドの一時停止、再開 ( No.13 )
名前:sy(サイ) 日時:2010/03/06 00:24

すいません、1000だと成功しますよ^^; 1001とか1005指定の時に失敗するのでorz
Re: サウンドの一時停止、再開 ( No.14 )
名前:管理人 日時:2010/03/15 23:30

確認なのですが、ももちゃんさんがご報告された現象 「DX_SOUNDDATATYPE_NOMEMPRESS のサウンドタイプで 再生位置1秒目に設定→再生→停止→再生位置を1秒目に設定→再生(再生位置0秒目から再生される)」 は直っているのでしょうか? あと、すいません、SetSoundCurrentTime( 1001 ) の直後に GetSoundCurrentTime で 1000 が返ってくるのは仕様です 前回の書き込みにでも申し上げましたが、厳密な時間の指定には SetSoundCurrentPosition をお使い下さい
Re: サウンドの一時停止、再開 ( No.15 )
名前:いっち 日時:2010/03/16 00:34

ももちゃんさんは"PlaySoundMem"の3番目の引数である"TopPositionFlag"をご存じなかったのではないかと思います。 その後レスを頂けなかったので、実際のところは不明です。(私が乗っ取ってしまったようで申し訳ないです) ( No.2 )のレスで私がご報告差し上げた事象のことでしたら、修正の確認は済んでおります。(( No.5 )のレスです) ただ、sy(サイ)さんのおっしゃる事象が当方の環境で確認できておりません。 余談ですが、PlaySoundMemの途中再生は需要のある機能だと思うのですが、リファレンスに掲載しては如何でしょうか?

Page: 1 |