summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/DSoundStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/AudioCommon/DSoundStream.cpp')
-rw-r--r--Source/Core/AudioCommon/DSoundStream.cpp170
1 files changed, 0 insertions, 170 deletions
diff --git a/Source/Core/AudioCommon/DSoundStream.cpp b/Source/Core/AudioCommon/DSoundStream.cpp
deleted file mode 100644
index dd56754286..0000000000
--- a/Source/Core/AudioCommon/DSoundStream.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2013 Dolphin Emulator Project
-// Licensed under GPLv2
-// Refer to the license.txt file included.
-
-#include <cmath>
-#include <thread>
-#include <Windows.h>
-
-#include "AudioCommon/AudioCommon.h"
-#include "AudioCommon/DSoundStream.h"
-#include "Common/Thread.h"
-
-bool DSound::CreateBuffer()
-{
- PCMWAVEFORMAT pcmwf;
- DSBUFFERDESC dsbdesc;
-
- memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT));
- memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
-
- pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM;
- pcmwf.wf.nChannels = 2;
- pcmwf.wf.nSamplesPerSec = m_mixer->GetSampleRate();
- pcmwf.wf.nBlockAlign = 4;
- pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign;
- pcmwf.wBitsPerSample = 16;
-
- // Fill out DSound buffer description.
- dsbdesc.dwSize = sizeof(DSBUFFERDESC);
- dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
- dsbdesc.dwBufferBytes = bufferSize = BUFSIZE;
- dsbdesc.lpwfxFormat = (WAVEFORMATEX *)&pcmwf;
- dsbdesc.guid3DAlgorithm = DS3DALG_DEFAULT;
-
- HRESULT res = ds->CreateSoundBuffer(&dsbdesc, &dsBuffer, nullptr);
- if (SUCCEEDED(res))
- {
- dsBuffer->SetCurrentPosition(0);
- dsBuffer->SetVolume(m_volume);
- return true;
- }
- else
- {
- // Failed.
- PanicAlertT("Sound buffer creation failed: %08x", res);
- dsBuffer = nullptr;
- return false;
- }
-}
-
-bool DSound::WriteDataToBuffer(DWORD dwOffset, // Our own write cursor.
- char* soundData, // Start of our data.
- DWORD dwSoundBytes) // Size of block to copy.
-{
- // I want to record the regular audio to, how do I do that?
-
- void *ptr1, *ptr2;
- DWORD numBytes1, numBytes2;
- // Obtain memory address of write block. This will be in two parts if the block wraps around.
- HRESULT hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0);
-
- // If the buffer was lost, restore and retry lock.
- if (DSERR_BUFFERLOST == hr)
- {
- dsBuffer->Restore();
- hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0);
- }
- if (SUCCEEDED(hr))
- {
- memcpy(ptr1, soundData, numBytes1);
- if (ptr2 != 0)
- memcpy(ptr2, soundData + numBytes1, numBytes2);
-
- // Release the data back to DirectSound.
- dsBuffer->Unlock(ptr1, numBytes1, ptr2, numBytes2);
- return true;
- }
-
- return false;
-}
-
-// The audio thread.
-void DSound::SoundLoop()
-{
- Common::SetCurrentThreadName("Audio thread - dsound");
-
- currentPos = 0;
- lastPos = 0;
- dsBuffer->Play(0, 0, DSBPLAY_LOOPING);
-
- while (!threadData)
- {
- // No blocking inside the csection
- dsBuffer->GetCurrentPosition((DWORD*)&currentPos, 0);
- int numBytesToRender = FIX128(ModBufferSize(currentPos - lastPos));
- if (numBytesToRender >= 256)
- {
- if (numBytesToRender > sizeof(realtimeBuffer))
- PanicAlert("soundThread: too big render call");
- m_mixer->Mix(realtimeBuffer, numBytesToRender / 4);
- WriteDataToBuffer(lastPos, (char*)realtimeBuffer, numBytesToRender);
- lastPos = ModBufferSize(lastPos + numBytesToRender);
- }
- soundSyncEvent.Wait();
- }
-}
-
-bool DSound::Start()
-{
- if (FAILED(DirectSoundCreate8(0, &ds, 0)))
- return false;
- if (hWnd)
- {
- HRESULT hr = ds->SetCooperativeLevel((HWND)hWnd, DSSCL_PRIORITY);
- }
- if (!CreateBuffer())
- return false;
-
- DWORD num1;
- short* p1;
- dsBuffer->Lock(0, bufferSize, (void* *)&p1, &num1, 0, 0, DSBLOCK_ENTIREBUFFER);
- memset(p1, 0, num1);
- dsBuffer->Unlock(p1, num1, 0, 0);
- thread = std::thread(&DSound::SoundLoop, this);
- return true;
-}
-
-void DSound::SetVolume(int volume)
-{
- // This is in "dBA attenuation" from 0 to -10000, logarithmic
- m_volume = (int)floor(log10((float)volume) * 5000.0f) - 10000;
-
- if (dsBuffer != nullptr)
- dsBuffer->SetVolume(m_volume);
-}
-
-void DSound::Update()
-{
- soundSyncEvent.Set();
-}
-
-void DSound::Clear(bool mute)
-{
- m_muted = mute;
-
- if (dsBuffer != nullptr)
- {
- if (m_muted)
- {
- dsBuffer->Stop();
- }
- else
- {
- dsBuffer->Play(0, 0, DSBPLAY_LOOPING);
- }
- }
-}
-
-void DSound::Stop()
-{
- threadData = 1;
- // kick the thread if it's waiting
- soundSyncEvent.Set();
-
- thread.join();
- dsBuffer->Stop();
- dsBuffer->Release();
- ds->Release();
-}
-