Re-implemented the NullSound back-end. Allows Dolphin to be used on hosts with no sound hardware. Emulates strict DSP timing in the DSP HLE plugin.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6329 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
skidau 2010-11-02 00:16:49 +00:00
parent 13dda74946
commit 0af0929a88
6 changed files with 111 additions and 0 deletions

View File

@ -413,6 +413,14 @@
<Filter <Filter
Name="SoundStreams" Name="SoundStreams"
> >
<File
RelativePath=".\Src\NullSoundStream.cpp"
>
</File>
<File
RelativePath=".\Src\NullSoundStream.h"
>
</File>
<File <File
RelativePath=".\Src\AOSoundStream.cpp" RelativePath=".\Src\AOSoundStream.cpp"
> >

View File

@ -17,6 +17,7 @@
#include "AudioCommon.h" #include "AudioCommon.h"
#include "Mixer.h" #include "Mixer.h"
#include "NullSoundStream.h"
#include "DSoundStream.h" #include "DSoundStream.h"
#include "AOSoundStream.h" #include "AOSoundStream.h"
#include "AlsaSoundStream.h" #include "AlsaSoundStream.h"
@ -37,6 +38,8 @@ namespace AudioCommon
std::string backend = ac_Config.sBackend; std::string backend = ac_Config.sBackend;
if (backend == BACKEND_OPENAL && OpenALStream::isValid()) if (backend == BACKEND_OPENAL && OpenALStream::isValid())
soundStream = new OpenALStream(mixer); soundStream = new OpenALStream(mixer);
else if (backend == BACKEND_NULLSOUND && NullSound::isValid())
soundStream = new NullSound(mixer, g_dspInitialize.hWnd);
else if (backend == BACKEND_DIRECTSOUND && DSound::isValid()) else if (backend == BACKEND_DIRECTSOUND && DSound::isValid())
soundStream = new DSound(mixer, g_dspInitialize.hWnd); soundStream = new DSound(mixer, g_dspInitialize.hWnd);
else if (backend == BACKEND_AOSOUND && AOSound::isValid()) else if (backend == BACKEND_AOSOUND && AOSound::isValid())
@ -91,6 +94,8 @@ namespace AudioCommon
{ {
std::vector<std::string> backends; std::vector<std::string> backends;
if (NullSound::isValid())
backends.push_back(BACKEND_NULLSOUND);
if (DSound::isValid()) if (DSound::isValid())
backends.push_back(BACKEND_DIRECTSOUND); backends.push_back(BACKEND_DIRECTSOUND);
if (OpenALStream::isValid()) if (OpenALStream::isValid())

View File

@ -22,6 +22,7 @@
#include "IniFile.h" #include "IniFile.h"
// Backend Types // Backend Types
#define BACKEND_NULLSOUND "No audio output"
#define BACKEND_COREAUDIO "CoreAudio" #define BACKEND_COREAUDIO "CoreAudio"
#define BACKEND_DIRECTSOUND "DSound" #define BACKEND_DIRECTSOUND "DSound"
#define BACKEND_AOSOUND "AOSound" #define BACKEND_AOSOUND "AOSound"

View File

@ -0,0 +1,48 @@
// Copyright (C) 2003 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "AudioCommon.h"
#include "NullSoundStream.h"
void NullSound::SoundLoop()
{
}
bool NullSound::Start()
{
return true;
}
void NullSound::SetVolume(int volume)
{
}
void NullSound::Update()
{
// This should equal AUDIO_DMA_PERIOD. TODO: Fix after DSP merge
int numBytesToRender = 32000 * 4 / 32;
m_mixer->Mix(realtimeBuffer, numBytesToRender / 4);
}
void NullSound::Clear(bool mute)
{
m_muted = mute;
}
void NullSound::Stop()
{
}

View File

@ -0,0 +1,48 @@
// Copyright (C) 2003 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _NULLSOUNDSTREAM_H_
#define _NULLSOUNDSTREAM_H_
#include "SoundStream.h"
#include "Thread.h"
#define BUF_SIZE (48000 * 4 / 32)
class NullSound : public SoundStream
{
// playback position
short realtimeBuffer[BUF_SIZE / sizeof(short)];
public:
NullSound(CMixer *mixer, void *hWnd = NULL)
: SoundStream(mixer)
{}
virtual ~NullSound() {}
virtual bool Start();
virtual void SoundLoop();
virtual void SetVolume(int volume);
virtual void Stop();
virtual void Clear(bool mute);
static bool isValid() { return true; }
virtual bool usesMixer() const { return true; }
virtual void Update();
};
#endif //_NULLSOUNDSTREAM_H_

View File

@ -8,6 +8,7 @@ files = [
'WaveFile.cpp', 'WaveFile.cpp',
'Mixer.cpp', 'Mixer.cpp',
'AudioCommon.cpp', 'AudioCommon.cpp',
'NullSoundStream.cpp',
] ]
if sys.platform == 'darwin': if sys.platform == 'darwin':