Re: SetCreateSoundDataType()で音切れ ( No.1 ) |
- 名前:かたぱると 日時:2008/03/11 21:09
試していないのでなんとも言えませんが
ProcessMessageを呼び出していないからではないでしょうか?
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int iMusicHandle; // 音声ファイル再生用ハンドル
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
iMusicHandle = LoadSoundMem("Sample.ogg"); // 音声ファイルを読み込みハンドルを取得
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させる
while( CheckHitKeyAll() == 0 ) // 入力待ち
{
// メッセージループに代わる処理をする
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}
DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS); // 再生形式をDX_SOUNDDATATYPE_MEMPRESSにする
iMusicHandle = LoadSoundMem("Sample.ogg"); // 再度音声ファイルを読み込みハンドルを取得
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK); // バックグラウンド再生させる
while( CheckHitKeyAll() == 0 ) // 入力待ち
{
// メッセージループに代わる処理をする
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}
DeleteSoundMem(iMusicHandle); // 読み込んだ音声を開放する
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
のようにして試してみてはどうでしょうか。
|
Re: SetCreateSoundDataType()で音切れ ( No.2 ) |
- 名前:Sura 日時:2008/03/11 20:53
>>かたぱるとさん
ご返事ありがとうございます。
提供いただいたコードを実行してみましたが
やはり同じ現象が再現されてしまいました。
>ProcessMessageを呼び出していないからではないでしょうか?
についてですがDX_PLAYTYPE_NORMALでも同じ不具合が確認できました。
また、前バージョン(DxLib2_21f)では確認されない現象だったもので
何か別の原因と思うのですがいかがでしょう?
|
Re: SetCreateSoundDataType()で音切れ ( No.3 ) |
- 名前:かたぱると 日時:2008/03/11 21:11
SetCreateSoundDataTypeの説明文から抜粋
この関数で DX_SOUNDDATATYPE_NOMEMPRESS 以外の選択をした場合は、
以後 ProcessMessage の呼び出し間隔を0.2秒以上空けないようにして下さい。
(0.2秒以上空け続けると再生中の音が途切れる現象が発生します)
とあるのでもしかしたらこのあたりが関係してそうですね。
0.2秒以上は音楽鳴らすだけだからかからないとは思いたいですが…。
|
Re: SetCreateSoundDataType()で音切れ ( No.4 ) |
- 名前:Sura 日時:2008/03/11 21:49
>かたぱるとさん
再度のご返事ありがとうございます。
と同時の言葉足らずで申し訳ありません。
実はRe:(No.2)の
>また、前バージョン(DxLib2_21f)では確認されない現象だったもので
はProcessMessageを呼んでの上です。
同時にScreenFlipも呼んでおり
リフレッシュレート毎には実行されるはずなので
>(0.2秒以上空け続けると再生中の音が途切れる現象が発生します)
ではないと考えております。
ただ、あまりにも余分なコード除いたサンプルコードを
提示してしまって誤解を与えてしまいました。
コードの概要
#include"Dxlib.h"
int iMusicHandle;
void LoadAndPlayMusic1(TCHAR*);
void LoadAndPlayMusic2(TCHAR*);
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
if(DxLib_Init() == -1) return -1;
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
if(CheckHitKey(KEY_INPUT_NUMPAD1)) LoadAndPlayMusic1("Sample.ogg");
if(CheckHitKey(KEY_INPUT_NUMPAD2)) LoadAndPlayMusic2("Sample.ogg");
}
DxLib_End();
return 0;
}
void LoadAndPlayMusic1(TCHAR *str)
{
DeleteSoundMem(iMusicHandle);
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);
iMusicHandle = LoadSoundMem(str);
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK);
}
void LoadAndPlayMusic2(TCHAR *str)
{
DeleteSoundMem(iMusicHandle);
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS);
iMusicHandle = LoadSoundMem(str);
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK);
}
|
Re: SetCreateSoundDataType()で音切れ ( No.5 ) |
- 名前:優柔不断 日時:2008/03/13 19:14
実行してみましたが、全く問題ありませんでした。
ただ、このようなコードは実行する意味があるかもしれません。
#include"Dxlib.h"
int iMusicHandle;
void LoadAndPlayMusic1(TCHAR*);
void LoadAndPlayMusic2(TCHAR*);
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
int tm,white;
if(DxLib_Init() == -1) return -1;
tm=GetNowCount();
white=GetColor(255,255,255);
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
DrawFormatString(0,0,white,"%dms",GetNowCount()-tm);
tm=GetNowCount();
if(CheckHitKey(KEY_INPUT_X)) LoadAndPlayMusic1("Sample.ogg");
if(CheckHitKey(KEY_INPUT_C)) LoadAndPlayMusic2("Sample.ogg");
ClearDrawScreen();
Sleep(1);
}
DxLib_End();
return 0;
}
void LoadAndPlayMusic1(TCHAR *str)
{
DeleteSoundMem(iMusicHandle);
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);
iMusicHandle = LoadSoundMem(str);
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK);
}
void LoadAndPlayMusic2(TCHAR *str)
{
DeleteSoundMem(iMusicHandle);
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS);
iMusicHandle = LoadSoundMem(str);
PlaySoundMem(iMusicHandle, DX_PLAYTYPE_BACK);
}
ループ一回の時間を測定します。すいません、ゲームパッドではなくてキーボード指定にしました。
XでDX_SOUNDDATATYPE_MEMPRESS、CでDX_SOUNDDATATYPE_MEMNOPRESSとなります。
|
Re: SetCreateSoundDataType()で音切れ ( No.6 ) |
- 名前:Sura 日時:2008/03/13 23:10
>>優柔不断さん
ご返事ありがとうございます。
>実行してみましたが、全く問題ありませんでした。
そうですか。もしかすると環境の違いで出てくる不具合かもしれませんね。
一応、私の環境では、
VCEE2008 及び BCC5.51 双方とも不具合が発生しました。
戴いたコードを実行してみました。以下結果です。
VCEE2008
DX_SOUNDDATATYPE_MEMPRESS: 32[ms]
DX_SOUNDDATATYPE_MEMNOPRESS: 57[ms]
BCC5.51
DX_SOUNDDATATYPE_MEMPRESS: 49[ms]
DX_SOUNDDATATYPE_MEMNOPRESS: 81[ms]
以下、冗長で恐縮ですが環境を示します。
"Log.txt"
0:システムの情報を出力します
0: DXライブラリ Ver2.24b
0: OS WindowsXP ( Build 2600 Service Pack 2 )
100: CPU動作速度:大体1.87GHz
100: MMX命令を使用します
101: CPUベンダ:AuthenticAMD
102: CPU名:AMD Athlon(tm) 64 X2 Dual Core Processor 4600+
102:COMの初期化... 成功しました
109:メモリ総量:1023.23MB 空きメモリ領域:658.91MB
109:タイマーの精度を検査します
110:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
110: パフォーマンスカウンターを使用します タイマー分解能 : 2403110.000000 KHz
110: ソフトの二重起動検査... 二重起動はされていませんでした
111:ウインドウクラスを登録します... 登録に成功しました
112:フルスクリーンモード用のウインドウを作成します
142:カーソルを不可視にしました
142:IMEを無効にしました
344:DirectInput関係初期化処理
344: DirectInput7 の取得中... 成功
378: 引き続き初期化処理... 初期化成功
379: ジョイパッドの初期化...
382: 入力装置を見つけました
384: デバイスの登録名:JC-PS101U
384: デバイスの製品登録名:JC-PS101U
385: 周期的エフェクトの作成に失敗しました。
387: ジョイパッドの追加は正常に終了しました
388: ジョイパッドの初期化は正常に終了しました
388: マウスデバイスの初期化... 初期化成功
389: キーボードデバイスの初期化... 初期化成功
390:DirectInput 関連の初期化は正常に終了しました
391:DirectSound の初期化を行います
391:DirectSound インターフェースの取得を行います.... 成功
395:引き続きインターフェースの初期化処理... 成功
493: DirectSound デバイスを列挙します
495: モジュール名: ドライバ記述:プライマリ サウンド ドライバ
495: モジュール名: ALCXWDM.SYS ドライバ記述:Realtek AC97 Audio
496: 最大サンプリングレート:192.00KHz 最小サンプリングレート:0.10KHz
496: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
497: 利用可能サンプリング精度
497: プライマリ 16bit = OK 8bit = OK
498: セカンダリ 16bit = OK 8bit = OK
498: 利用可能チャンネル
499: プライマリ MONO = OK STEREO = OK
499: セカンダリ MONO = OK STEREO = OK
500:DirectSound の初期化は正常に終了しました
500:DirectDraw 関連の初期化を行います
500: DirectDraw オブジェクトの取得を行います.... 成功
507: 引き続き初期化処理... 初期化に成功しました
510: ビデオカードの情報
510: 画面モード変更処理を開始します
571: ウインドウスタイルをフルスクリーンモード用に変更します... 完了
573: 画面モードの変更処理を開始します 640 x 480 16 bit
574: 画面解像度を変更します... 成功しました
709: 画面モードの変更は正常に終了しました
710: カラー情報
712: A:00000000 B:0000f800 G:000007e0 B:0000001f
713: 出力画面用の DirectDrawSurface を作成します
740: 各スクリーンメモリの配置位置
741: PrimaryBuffer : VIDEOMEMORY
742: BaskBuffer : VIDEOMEMORY
743: 出力画面用の DirectDrawSurface の作成は正常に終了しました
743: Direct3D 関連の初期化を行います
744: Direct3Dオブジェクトを取得します
751: Direct3Dオブジェクトを取得しました
752: 3Dデバイスを作成します... 3Dデバイスの作成に成功しました
763: テクスチャ最大幅:4096 最小幅:1
764: 描画制限: D_D3DPTEXTURECAPS_POW2 = 1 D_D3DPTEXTURECAPS_SQUAREONLY = 0
764: テクスチャピクセルフォーマット
765: 通常グラフィック用
765: BIT:16 RED:5 GREEN:6 BLUE:5
766: RED:00f800 GREEN:0007e0 BLUE:00001f
766: BIT:32 RED:8 GREEN:8 BLUE:8
766: RED:ff0000 GREEN:00ff00 BLUE:0000ff
767: アルファチャンネル付きグラフィック用
767: BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4
767: ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f
768: BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8
768: ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff
770: Direct3D 関連の初期化は正常に終了しました
770: グラフィック管理系の初期化を行います
771: 3Dグラフィック描画機能を使用します
772: フォントの初期化を行います
775: フォントの初期化は正常に終了しました
776: グラフィック管理系の初期化は正常に終了しました
1788: サーフェス間転送には BitBlt を使用します
1788: BitBlt:33391μs BltFast:973796μs
1789: スキャンラインの数:480
1891: 1フレーム当たりの時間は 13 msecです
1893: Tri00:13 msec
1894: Tri01:15 msec
1894: Tri02:15 msec
1896: Tri03:13 msec
1897: 画面モード変更処理は正常に終了しました
1904: オーバーレイサーフェスを使用します UYVY
1906: DirectDraw 関連の初期化は正常に終了しました
1909: 文字コードバッファの初期化を行います... 完了しました
25155: DirectDraw 関連の終了処理をおこないます
25157: フォントの初期化を行います
25160: フォントの初期化は正常に終了しました
25161: グラフィック管理系の終了処理は正常に終了しました
25161: Direct3D 関連の終了処理を行います
25165: 3Dデバイスの削除は正常に終了しました
25166: Direct3D 関連の終了処理は正常に終了しました
25166: メインサーフェスを破棄をします... 完了しました
25179: DirectDrawオブジェクトを解放します
25466: DirectDrawオブジェクトを解放しました
25467: DirectDraw 関連の終了処理は正常に終了しました
25479: DirectInput 関連の終了処理... 完了
25492: DirectSound の終了処理は正常に終了しました
25747: ウインドウを閉じようとしています
25752: ウインドウが破棄されようとしています
25753: ソフトを終了する準備が整いました
26172:
26172: Alloc memory dump Total size:0(0.000kb) Alloc num:0
26173:
使用サンプルファイル"Sample.ogg"のプロパティ(SoundPlayerLilith Ver.0.991よる確認)
FileType Ogg Vorbis
FileSize 71538 Bytes
PlaySize 1147244 Bytes
PlayTime 0:06.503
BitRate 87 kbps (VBR)
BitsPerSample 16 bits
SampleRate 44100 Hz
Mode Stereo
|
Re: SetCreateSoundDataType()で音切れ ( No.7 ) |
- 名前:Sura 日時:2008/03/14 00:15
皆様、
たびたび恐れ入ります。
どうやらサウンドファイルの問題であることがわかりました。
別のファイルで確認したところ不具合が発生しなかったためです。
お騒がせいたしました。
ただ、その顛末の報告をお許しください。
1.問題のあるサウンドファイルの判断
Windouws Media PlayerやSound Recorderではいずれも正常に再生できてしまうため
現状では上記のプログラムで確認するしかなかった。
2.問題のあるサウンドファイルの変換に伴う影響
問題のファイルをwav, mp3, oggいずれの形式に変換しても
不具合は発生し、正常なファイルは変換しても不具合は発生しなかった。
以上
|
Re: SetCreateSoundDataType()で音切れ ( No.8 ) |
- 名前:管理人 日時:2008/03/16 21:07
Suraさんの仰る通り、ある意味ではサウンドファイルが音切れの原因といえる
かもしれませんが、wav や mp3 に変換しても問題が発生するというのが非常に気になります。
DXライブラリで正常に再生できない原因を調べてみたいので、宜しければ件の現象が
発生するサウンドファイルを BQE00322(あっとまーく)nifty.com まで送って頂け
ないでしょうか?m(_ _)m
|
Re: SetCreateSoundDataType()で音切れ ( No.9 ) |
- 名前:Sura 日時:2008/03/16 23:25
管理人様
ありがとうございます。
早速E-Mailしました。(2008/3/16/23:00頃)
ご確認のほど宜しくお願いいたします。
|
Re: SetCreateSoundDataType()で音切れ ( No.10 ) |
- 名前:管理人 日時:2008/03/17 01:18
メールを拝見しました。
サンプルプログラムまで同梱して頂いてありがとうございます。
結果ですが、私の環境でも音の途切れが再現しました、
なんで今まで気が付かなかったのだろうという程普通に・・・
原因はサウンド関係のプログラムのある一文( CurPosition = 0 という記述 )
なのですが、何のための記述なのか謎で、この一文をコメントアウトすることに
より途切れはなくなりました。(ログを見る限りでは昨年12月末頃書いたよう
なのですが・・・全く覚えがなく・・・(汗))
修正版をアップしましたので、宜しければお試しになってみてください。m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
|
Re: SetCreateSoundDataType()で音切れ ( No.11 ) |
- 名前:Sura 日時:2008/03/17 07:52
管理人様
お忙しいのにもかかわらず、素早い対応感謝いたします。
確認したところ、不具合が解消されていました。
誠にありがとうございます。
|