質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

1372閲覧

DirectSoundによるループ

Dxcaster

総合スコア3

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/06/12 12:13

編集2021/06/16 02:26

DirectSoundにて曲の再生をしています。
Sin波の「A(ラ)」が録音されたwavを再生しており、全体の秒数は1秒で、最初の0.5秒は無音です。
そのためDSBPLAY_LOOPINGではなくSetCurrentPositionにてループ再生を行いたいと思っています。
そこで作ったコードが以下のコードです。

c

1DWORD Status; 2lpSec->GetStatus(&Status); 3if((Status & DSBSTATUS_PLAYING) == 0){ 4 lpSec->SetCurrentPosition(WavSize / 10 * 5); 5 lpSec->Play(0,0,0); 6} 7//もし再生が終了したら0.5秒からループ開始

1回目のループは上手く行きますが、2回目以降でループする際に無音が入ります。
この無音を無くすにはどうすればいいでしょうか?

【追記】

c

1DWORD Status; 2lpSec->GetStatus(&Status); 3if((Status & DSBSTATUS_PLAYING) == 0){ 4 lpSec->SetCurrentPosition(WavSize / 10 * 5); 5} 6//もし再生が終了したら0.5秒からループ開始 7lpSec->Play(0,0,0);

のように書き換えたら正常に動作しましたが、60FPSにフレームレートを設定すると、
無音が入ってしまいました。
ちなみに60FPSに設定する前は4000FPSほどで動作していました。

【環境】
VisualStudio2012
DirectXSDK June 2010
Windows7 32bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

DSBPLAY_LOOPINGを指定していないのであれば再生終了後に停止するので、停止時間から再生開始までのギャップで当然無音は入るでしょう。DSBPLAY_LOOPINGでループ再生し、バッファをリアルタイムに書き換えるしかないと思います。

(1) 初期状態(□:未再生バッファ ■:再生済バッファ)
0 □□□□□ 0.5 □□□□□ 1.0

(2) 0.5秒まで再生
0 ■■■■■ 0.5 □□□□□ 1.0

(3) 1秒まで再生
0 ■■■■■ 0.5 ■■■■■ 1.0

この(2)と(3)の間に、0-0.5秒のバッファをループの続きの音に書き換えます。

(2.5) 全て再生が終わる前に、新しいデータを0~0.5秒のバッファに書き込む
0 □□□□□ 0.5 ■■■□□ 1.0

こうすることで、音が途切れる事なく繋がります。再生位置をチェックしながら、0-0.5秒 と0.5-1.0秒のバッファを交互に上書きしていきます。バッファ管理用に別スレッドを作成した方がよいでしょう。

投稿2021/06/24 05:57

編集2021/06/24 06:01
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dxcaster

2021/06/24 19:55

なるほど... 回答ありがとうございます。 DirectSoundのストリーミング再生について学ぶ必要がありそうですね...
guest

0

毎回lpSec->Play(0,0,0);を行うことで二回目以降も無音がなくなることが多くなりました。
しかし不安定で無音状態があるときとないときがあります。

投稿2021/06/13 06:40

編集2021/06/13 09:51
Dxcaster

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問