■元スレ過去ログへ■
初心者はここで聞け!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ちゃんねるは、ここのサーバを使ってるです。。。