■元スレ過去ログへ■
初心者はここで聞け!DirectX相談室
- 727 名前: vberr ◆P/ECE33A   投稿日: 02/01/25 19:18
 
-  DirectX7 for VB の DirectSound ではサウンドの出力フォーマットが変えられなくて困ってたのですが、 
 DirectSound8 でプライマリバッファが取れるようになったので、早速試してみました。
 
 …が、どうしても変わらなくて困ってます。
 協調レベルは SetCooperativeLevel で DSSCL_PRIORITY にしてあって、
 set DSPrimaryBuffer = DS8.CreatePrimarySoundBuffer(desc) も成功してるんですが…
 
 コードはこんな感じです。
 
 --------
 
 Dim fmt As WAVEFORMATEX
 With fmt
 .nChannels = 2
 .lSamplesPerSec = 44100
 .nBitsPerSample = 16
 .nBlockAlign = .nChannels * .nBitsPerSample \ 8
 .lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign
 .nFormatTag = WAVE_FORMAT_PCM
 .lExtra = 0
 End With
 DSPrimaryBuffer.SetFormat fmt
 
 --------
 
 エラーは発生しません。
 
 このあと、 GetFormat すると、きちんと lSamplesPerSec は 44100 になっているのですが。
 試しに lSamplesPerSec = 11025, nChannels = 1 等も試してみましたが音は全然変わりません。
 
 やり方間違ってるのかなー…サンプルも無いし…
 
 
 
- 728 名前: デフォルトの名無しさん  投稿日: 02/01/25 20:03
 
-  サウウンドカード何使っているかわからないぞ ゴルァ 
 普通のサウウンドカードは、48KHzに変換して出力だYO
 プライマリーバッファに書き込めないと思うYO
 セカンダリーバッファに8Kzとか、ショボイ音
 入れればそれなりの音になるYO
 
 
 
- 729 名前: vberr ◆P/ECE33A   投稿日: 02/01/25 20:18
 
-  >>728 
 すんません。環境は Win2kPro(SP2) + VB6(SP5) + DirectX8 で。
 サウンドカードは Xwave6000 です。
 
 が、ウチだけで発生している問題ではないので…。
 そもそも、ウチはなぜか何もしなくても(コレも問題) 44.1kHz な音で再生されるんですけど、
 Win9x 系の OS だとどうしても 22kHz 8bit Stereo なままで変わらないらしいのです。
 
 ショボイ音はソレで良いんですが、44.1kHz 16bit Stereoな音なんかが
 22kHz 8bitで再生されるのは勘弁なのです。
 
 # プライマリバッファに直接書き込みはしてないです
 
 
 
- 730 名前: デフォルトの名無しさん  投稿日: 02/01/25 20:38
 
-  セカンダリーバッファ Createする時 
 sbDesc.lpwfxFormatに44.1kHz 16bit Stereo指定すれば
 その音で出るYO
 
 
 
- 731 名前: vberr ◆P/ECE33A   投稿日: 02/01/25 20:57
 
-  >>730 
 …ダメでした。( DirectSound8.CreateSoundBufferFromFile )
 というか、 セカンダリバッファで fxFormat 変えると再生速度が変わってしまうのでは...。
 
 # プライマリバッファへの SetFormat だけで変わるんじゃなかったのかyo...(;´Д`)
 
 
 
- 732 名前: デフォルトの名無しさん  投稿日: 02/01/25 21:30
 
-  ># プライマリバッファへの SetFormat だけで変わるんじゃなかったのかyo...(;´Д`) 
 プライマリバッファへの SetFormatは、一応ドライバーがサポートしているか
 確認するため.... うそ言うドライバーが多い
 
 >セカンダリバッファで fxFormat 変えると再生速度が変わってしまうのでは
 元々の音と同じフォーマットにすれば変わらないYO
 
 
 
 
 
- 736 名前: vberr ◇P/ECE33A  投稿日: 02/01/26 11:40
 
-  トリップ忘れた(帰れ 
 
 http://www.microsoft.com/japan/developer/library/jpdx8_vb/dsound_iface_vb_6e76.htm
 > メソッドは、データそのものから形式およびサイズを判断するため、fxFormat および lBufferBytes メンバは無視される。
 
 との事なので、セカンダリバッファにformat指定は無意味なようです。
 …くそっ。どうすれば変わるんだ…。
 
 
 
- 737 名前: デフォルトの名無しさん  投稿日: 02/01/26 14:07
 
-  >>736 
 そんなこと 当たり前
 
 CreateSoundBufferFromFile... ファイルのフォーマットのなる
 CreateSoundBuffer...これで可
 
 
 
- 741 名前: vberr ◆P/ECE33A   投稿日: 02/01/26 15:25
 
-  >>737 
 ってことは先に自前でリサンプリングしろ、ってことですか? ソンナ...(;´Д`)
 ていうかどちらにしろ出力が変わらないので意味がネー....
 
 
 
- 769 名前: デフォルトの名無しさん  投稿日: 02/01/29 00:32
 
-  >>727 
 
 OSおよびドライバの仕様の違いのせい。
 Win2kなどのWDMモデルと、Win9xのMMEモデルでは、
 プライマリバッファの動作が違う。
 
 WDMでは、プライマリは実際には存在していなく、
 すべての入力はkmixerにリダイレクトされる。
 kmixerは、設定の如何に関わらず、現在アクティブなすべてのストリームのうち、
 最大のサンプリングレート/ビット深度でミキシング/再生する。
 なので、キミの例の、
 22.05kHzを指定しても、44.1kHzのセカンダリが再生されていれば、
 44.1kHzでミキシングが行われるので、違いはでない。
 
 一方、MMEでは、kmixerがないので、DirectSound内部のmixerが動作する。
 これが本来のプライマリバッファ。
 こいつは、再生しているストリームのフォーマットの如何に関わらず、
 強制的に設定したフォーマットで再生する。
 プライマリ作成時には、基本的に22.05kHz/8bit(16bitだったかも?)に設定されているので、
 明示的に設定してやらないと、セカンダリで44.1kHzとか鳴らすと、
 22.05kHzへのダウンサンプリングが行われた後、22.05kHzミキシング/再生される。
 
 つまりは、WDMでは自動的に音質が下がらないように設定を変えてくれるが、
 ミキシングのフォーマットは自由に設定できないということ。
 MMEでは、自由に設定が可能だが、自動的になにかやってくれるということはない。
 なお、WDMでも、再生しているストリームより上位のフォーマットを指定した場合は、
 そのフォーマットでミキシングさせることができる模様。
 例として、44.1kHz/16bitのセカンダリを再生している時に、
 プライマリに48kHz/32bitIEEEFloatを指定すると、
 48kHz/32bitIEEEFloatでミキシング/再生が行われる。
 
 
 
 
- 770 名前: vberr ◆P/ECE33A   投稿日: 02/01/29 00:57
 
-  >>769 
 そうなんですか! 詳細ありがとうございます。
 確かにWDMとMMEで動作に違いがあるというのは確かめて分かったんですが、違いがよく解らなくて。
 だからw2kでは何も指定しなくても44kで出力されたりしてたんですね...
 セカンダリで44kのwave再生させた途端音が変わったので、変だなーとは思ってたんですが。
 
 つまり、w2kではSetFormatしても、上位のフォーマットでない限りは出力フォーマットは変わらないんですね。
 逆に、9xではSetFormat通りになると...
 
 手元に9xの環境がなかったので確かめられずずっとwin2kで悩んでました。
 明日にでもまた試してみます。ありがとう。
 
 
 
- 771 名前: デフォルトの名無しさん  投稿日: 02/01/29 06:57
 
-  >>769 
 参考になったアリガト
 
 
 
- 772 名前: 769  投稿日: 02/01/29 22:25
 
-  >>770 
 >>771
 他にも、MMEとWDMで、2ch超のチャネルや、
 16bit超のビット深度を扱う場合、
 色々と違うことあるけどね。
 ま、その辺は必要になったらまた質問してくれや。
 
 ちなみに、AC3(DolbyDigital)とかDTSのPassThroughする方法誰か教えてくれ……
 どうもうまくできない。
 PCMとして出ちゃうのよね。
 
 
 
2ちゃんねるは、ここのサーバを使ってるです。。。