mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-26 22:11:43 +00:00
- removed the remains of the FModEx-style stream implementation
FMod had MP3/Ogg playback integrated right into itself, and the OpenAL backend tried to replicate this functionality. This functionality, however, has been removed over two years ago when FMod started breaking things more and more, it was only this backing implementation that was left in.
This commit is contained in:
parent
2bc72f38cc
commit
c61e8ada86
4 changed files with 2 additions and 160 deletions
|
@ -172,10 +172,6 @@ public:
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SoundStream *OpenStream (FileReader &reader, int flags)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Starts a sound.
|
// Starts a sound.
|
||||||
FISoundChannel *StartSound (SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan)
|
FISoundChannel *StartSound (SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan)
|
||||||
|
|
|
@ -76,7 +76,6 @@ public:
|
||||||
virtual void Stop() = 0;
|
virtual void Stop() = 0;
|
||||||
virtual void SetVolume(float volume) = 0;
|
virtual void SetVolume(float volume) = 0;
|
||||||
virtual bool SetPaused(bool paused) = 0;
|
virtual bool SetPaused(bool paused) = 0;
|
||||||
virtual unsigned int GetPosition() = 0;
|
|
||||||
virtual bool IsEnded() = 0;
|
virtual bool IsEnded() = 0;
|
||||||
virtual FString GetStats();
|
virtual FString GetStats();
|
||||||
};
|
};
|
||||||
|
@ -117,8 +116,7 @@ public:
|
||||||
|
|
||||||
// Streaming sounds.
|
// Streaming sounds.
|
||||||
virtual SoundStream *CreateStream (SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata) = 0;
|
virtual SoundStream *CreateStream (SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata) = 0;
|
||||||
virtual SoundStream *OpenStream (FileReader &reader, int flags) = 0;
|
|
||||||
|
|
||||||
// Starts a sound.
|
// Starts a sound.
|
||||||
virtual FISoundChannel *StartSound (SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan) = 0;
|
virtual FISoundChannel *StartSound (SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan) = 0;
|
||||||
virtual FISoundChannel *StartSound3D (SoundHandle sfx, SoundListener *listener, float vol, FRolloffInfo *rolloff, float distscale, int pitch, int priority, const FVector3 &pos, const FVector3 &vel, int channum, int chanflags, FISoundChannel *reuse_chan) = 0;
|
virtual FISoundChannel *StartSound3D (SoundHandle sfx, SoundListener *listener, float vol, FRolloffInfo *rolloff, float distscale, int pitch, int priority, const FVector3 &pos, const FVector3 &vel, int channum, int chanflags, FISoundChannel *reuse_chan) = 0;
|
||||||
|
|
|
@ -232,25 +232,6 @@ class OpenALSoundStream : public SoundStream
|
||||||
bool Looping;
|
bool Looping;
|
||||||
ALfloat Volume;
|
ALfloat Volume;
|
||||||
|
|
||||||
|
|
||||||
SoundDecoder *Decoder;
|
|
||||||
static bool DecoderCallback(SoundStream *_sstream, void *ptr, int length, void *user)
|
|
||||||
{
|
|
||||||
OpenALSoundStream *self = static_cast<OpenALSoundStream*>(_sstream);
|
|
||||||
if(length < 0) return false;
|
|
||||||
|
|
||||||
size_t got = self->Decoder->read((char*)ptr, length);
|
|
||||||
if(got < (unsigned int)length)
|
|
||||||
{
|
|
||||||
if(!self->Looping || !self->Decoder->seek(0, false, true))
|
|
||||||
return false;
|
|
||||||
got += self->Decoder->read((char*)ptr+got, length-got);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (got == (unsigned int)length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SetupSource()
|
bool SetupSource()
|
||||||
{
|
{
|
||||||
/* Get a source, killing the farthest, lowest-priority sound if needed */
|
/* Get a source, killing the farthest, lowest-priority sound if needed */
|
||||||
|
@ -294,7 +275,7 @@ class OpenALSoundStream : public SoundStream
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OpenALSoundStream(OpenALSoundRenderer *renderer)
|
OpenALSoundStream(OpenALSoundRenderer *renderer)
|
||||||
: Renderer(renderer), Source(0), Playing(false), Looping(false), Volume(1.0f), Decoder(NULL)
|
: Renderer(renderer), Source(0), Playing(false), Looping(false), Volume(1.0f)
|
||||||
{
|
{
|
||||||
memset(Buffers, 0, sizeof(Buffers));
|
memset(Buffers, 0, sizeof(Buffers));
|
||||||
Renderer->AddStream(this);
|
Renderer->AddStream(this);
|
||||||
|
@ -319,8 +300,6 @@ public:
|
||||||
memset(Buffers, 0, sizeof(Buffers));
|
memset(Buffers, 0, sizeof(Buffers));
|
||||||
}
|
}
|
||||||
getALError();
|
getALError();
|
||||||
|
|
||||||
delete Decoder;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -390,46 +369,6 @@ public:
|
||||||
return (getALError()==AL_NO_ERROR);
|
return (getALError()==AL_NO_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool SetPosition(unsigned int ms_pos)
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> lock(Renderer->StreamLock);
|
|
||||||
if(!Decoder->seek(ms_pos, true, false))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(!Playing.load())
|
|
||||||
return true;
|
|
||||||
// Stop the source so that all buffers become processed, which will
|
|
||||||
// allow the next update to restart the source queue with the new
|
|
||||||
// position.
|
|
||||||
alSourceStop(Source);
|
|
||||||
getALError();
|
|
||||||
lock.unlock();
|
|
||||||
Renderer->StreamWake.notify_all();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual unsigned int GetPosition()
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> lock(Renderer->StreamLock);
|
|
||||||
ALint offset, queued, state;
|
|
||||||
alGetSourcei(Source, AL_SAMPLE_OFFSET, &offset);
|
|
||||||
alGetSourcei(Source, AL_BUFFERS_QUEUED, &queued);
|
|
||||||
alGetSourcei(Source, AL_SOURCE_STATE, &state);
|
|
||||||
if(getALError() != AL_NO_ERROR)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
size_t pos = Decoder->getSampleOffset();
|
|
||||||
lock.unlock();
|
|
||||||
|
|
||||||
if(state != AL_STOPPED)
|
|
||||||
{
|
|
||||||
size_t rem = queued*(Data.Size()/FrameSize) - offset;
|
|
||||||
if(pos > rem) pos -= rem;
|
|
||||||
else pos = 0;
|
|
||||||
}
|
|
||||||
return (unsigned int)(pos * 1000.0 / SampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool IsEnded()
|
virtual bool IsEnded()
|
||||||
{
|
{
|
||||||
return !Playing.load();
|
return !Playing.load();
|
||||||
|
@ -460,34 +399,11 @@ public:
|
||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Decoder != nullptr)
|
|
||||||
{
|
|
||||||
pos = Decoder->getSampleOffset();
|
|
||||||
len = Decoder->getSampleLength();
|
|
||||||
}
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
stats = (state == AL_INITIAL) ? "Buffering" : (state == AL_STOPPED) ? "Underrun" :
|
stats = (state == AL_INITIAL) ? "Buffering" : (state == AL_STOPPED) ? "Underrun" :
|
||||||
(state == AL_PLAYING || state == AL_PAUSED) ? "Ready" : "Unknown state";
|
(state == AL_PLAYING || state == AL_PAUSED) ? "Ready" : "Unknown state";
|
||||||
|
|
||||||
if (Decoder != nullptr)
|
|
||||||
{
|
|
||||||
if (state == AL_STOPPED)
|
|
||||||
offset = BufferCount * (Data.Size() / FrameSize);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t rem = queued*(Data.Size() / FrameSize) - offset;
|
|
||||||
if (pos > rem) pos -= rem;
|
|
||||||
else if (len > 0) pos += len - rem;
|
|
||||||
else pos = 0;
|
|
||||||
}
|
|
||||||
pos = (size_t)(pos * 1000.0 / SampleRate);
|
|
||||||
len = (size_t)(len * 1000.0 / SampleRate);
|
|
||||||
stats.AppendFormat(",%3u%% buffered", 100 - 100 * offset / (BufferCount*(Data.Size() / FrameSize)));
|
|
||||||
stats.AppendFormat(", %zu.%03zu", pos / 1000, pos % 1000);
|
|
||||||
if (len > 0)
|
|
||||||
stats.AppendFormat(" / %zu.%03zu", len / 1000, len % 1000);
|
|
||||||
}
|
|
||||||
if(state == AL_PAUSED)
|
if(state == AL_PAUSED)
|
||||||
stats += ", paused";
|
stats += ", paused";
|
||||||
if(state == AL_PLAYING)
|
if(state == AL_PLAYING)
|
||||||
|
@ -607,60 +523,6 @@ public:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Init(FileReader &reader, bool loop)
|
|
||||||
{
|
|
||||||
if(!SetupSource())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Decoder) delete Decoder;
|
|
||||||
auto mreader = new FileReaderMusicInterface(reader);
|
|
||||||
Decoder = SoundDecoder::CreateDecoder(mreader);
|
|
||||||
if (!Decoder)
|
|
||||||
{
|
|
||||||
mreader->close();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Callback = DecoderCallback;
|
|
||||||
UserData = NULL;
|
|
||||||
Format = AL_NONE;
|
|
||||||
FrameSize = 1;
|
|
||||||
|
|
||||||
ChannelConfig chans;
|
|
||||||
SampleType type;
|
|
||||||
int srate;
|
|
||||||
|
|
||||||
Decoder->getInfo(&srate, &chans, &type);
|
|
||||||
if(chans == ChannelConfig_Mono)
|
|
||||||
{
|
|
||||||
if(type == SampleType_UInt8) Format = AL_FORMAT_MONO8;
|
|
||||||
if(type == SampleType_Int16) Format = AL_FORMAT_MONO16;
|
|
||||||
FrameSize *= 1;
|
|
||||||
}
|
|
||||||
if(chans == ChannelConfig_Stereo)
|
|
||||||
{
|
|
||||||
if(type == SampleType_UInt8) Format = AL_FORMAT_STEREO8;
|
|
||||||
if(type == SampleType_Int16) Format = AL_FORMAT_STEREO16;
|
|
||||||
FrameSize *= 2;
|
|
||||||
}
|
|
||||||
if(type == SampleType_UInt8) FrameSize *= 1;
|
|
||||||
if(type == SampleType_Int16) FrameSize *= 2;
|
|
||||||
|
|
||||||
if(Format == AL_NONE)
|
|
||||||
{
|
|
||||||
Printf("Unsupported audio format: %s, %s\n", GetChannelConfigName(chans),
|
|
||||||
GetSampleTypeName(type));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SampleRate = srate;
|
|
||||||
Looping = loop;
|
|
||||||
|
|
||||||
Data.Resize((SampleRate / 5) * FrameSize);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1547,19 +1409,6 @@ SoundStream *OpenALSoundRenderer::CreateStream(SoundStreamCallback callback, int
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundStream *OpenALSoundRenderer::OpenStream(FileReader &reader, int flags)
|
|
||||||
{
|
|
||||||
if(StreamThread.get_id() == std::thread::id())
|
|
||||||
StreamThread = std::thread(std::mem_fn(&OpenALSoundRenderer::BackgroundProc), this);
|
|
||||||
OpenALSoundStream *stream = new OpenALSoundStream(this);
|
|
||||||
if (!stream->Init(reader, !!(flags&SoundStream::Loop)))
|
|
||||||
{
|
|
||||||
delete stream;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
FISoundChannel *OpenALSoundRenderer::StartSound(SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan)
|
FISoundChannel *OpenALSoundRenderer::StartSound(SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan)
|
||||||
{
|
{
|
||||||
if(FreeSfx.Size() == 0)
|
if(FreeSfx.Size() == 0)
|
||||||
|
|
|
@ -135,7 +135,6 @@ public:
|
||||||
|
|
||||||
// Streaming sounds.
|
// Streaming sounds.
|
||||||
virtual SoundStream *CreateStream(SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata);
|
virtual SoundStream *CreateStream(SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata);
|
||||||
virtual SoundStream *OpenStream(FileReader &reader, int flags);
|
|
||||||
|
|
||||||
// Starts a sound.
|
// Starts a sound.
|
||||||
virtual FISoundChannel *StartSound(SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan);
|
virtual FISoundChannel *StartSound(SoundHandle sfx, float vol, int pitch, int chanflags, FISoundChannel *reuse_chan);
|
||||||
|
|
Loading…
Reference in a new issue