2013-05-20 60 views
2

我正在使用DirectX XAudio2 API的SharpDX包裝。 http://sharpdx.org/如何使用XAudio2尋找以毫秒爲單位的位置

我需要能夠找到加載到SourceVoice中的WAV文件到軌道中的給定位置。我正在努力解決我應該設置PlayBegin以便跳過一定數量的毫秒或比例數量的軌道。

public void onMetronome(int bar) 
{ 
    if (voice != null) voice.DestroyVoice(); 
    voice = new SourceVoice(Player.XAudio, buffer.WaveFormat, true); 
    buffer.PlayBegin = (int)(bar * buffer.Stream.Length/4); 
    voice.SubmitSourceBuffer(buffer, buffer.DecodedPacketsInfo); 
    voice.Start(); 
} 

任何人都可以告訴我什麼樣的價值我應該設置播放開始?

我可以從文檔中看到這個值是樣本編號,它可能需要是128的倍數,但認爲我仍然在做錯事。

http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.ixaudio2sourcevoice.ixaudio2sourcevoice.submitsourcebuffer(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.xaudio2.xaudio2_buffer(v=vs.85).aspx

+0

是什麼讓你認爲你正在做的事情錯了?我懷疑你需要考慮採樣率 - 所以offset = seconds x samplesPerSecond x bytesPerSample,可能捨入爲128的倍數 – Floris

回答

1

想通了,覺得我已經乘以1000的時候我不應該有,下面的作品

var offset = (int)Math.Floor(buffer.WaveFormat.SampleRate * barDuration/128) * 128 * bar; 
+0

我會認爲'* bar'屬於'Floor()'表達式 - 但很高興你弄清楚了! – Floris

+0

@弗洛伊斯是的,這是有道理的,我認爲它可能會給一個零分的問題,這就是爲什麼我把它放在外面,但思考它,它不應該是一個問題,因爲它不是分母。乾杯:) – Tom