mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-06 06:15:32 +00:00
Pointer safety patch to avcoded, fixed a music volume bug
git-svn-id: https://openmw.svn.sourceforge.net/svnroot/openmw/trunk@29 ea6a568a-9f4f-0410-981a-c910a81bb256
This commit is contained in:
parent
3e30014b9b
commit
3c1e340aac
3 changed files with 27 additions and 23 deletions
|
@ -144,7 +144,7 @@ struct ResourceManager
|
|||
char[][] getDir(char[] dir)
|
||||
{
|
||||
dir = FileFinder.addSlash(dir);
|
||||
char[][] res = listdir(dir);
|
||||
char[][] res = ((exists(dir) && isdir(dir)) ? listdir(dir) : null);
|
||||
foreach(ref char[] fn; res)
|
||||
fn = dir ~ fn;
|
||||
return res;
|
||||
|
|
|
@ -43,7 +43,7 @@ struct MyFile {
|
|||
vector<uint8_t> Data;
|
||||
vector<char> DecodedData;
|
||||
};
|
||||
vector<MyStream> Streams;
|
||||
vector<MyStream*> Streams;
|
||||
};
|
||||
|
||||
// TODO:
|
||||
|
@ -75,9 +75,10 @@ extern "C" void cpp_closeAVFile(MyFile *file)
|
|||
|
||||
for(size_t i = 0;i < file->Streams.size();i++)
|
||||
{
|
||||
avcodec_close(file->Streams[i].CodecCtx);
|
||||
file->Streams[i].Data.clear();
|
||||
file->Streams[i].DecodedData.clear();
|
||||
avcodec_close(file->Streams[i]->CodecCtx);
|
||||
file->Streams[i]->Data.clear();
|
||||
file->Streams[i]->DecodedData.clear();
|
||||
delete file->Streams[i];
|
||||
}
|
||||
file->Streams.clear();
|
||||
|
||||
|
@ -95,18 +96,20 @@ extern "C" MyFile::MyStream *cpp_getAVAudioStream(MyFile *file, int streamnum)
|
|||
|
||||
if(streamnum == 0)
|
||||
{
|
||||
MyFile::MyStream stream;
|
||||
stream.parent = file;
|
||||
stream.CodecCtx = file->FmtCtx->streams[i]->codec;
|
||||
stream.StreamNum = i;
|
||||
MyFile::MyStream *stream = new MyFile::MyStream;
|
||||
stream->parent = file;
|
||||
stream->CodecCtx = file->FmtCtx->streams[i]->codec;
|
||||
stream->StreamNum = i;
|
||||
|
||||
AVCodec *codec = avcodec_find_decoder(stream.CodecCtx->codec_id);
|
||||
if(!codec) return NULL;
|
||||
if(avcodec_open(stream.CodecCtx, codec) < 0)
|
||||
AVCodec *codec = avcodec_find_decoder(stream->CodecCtx->codec_id);
|
||||
if(!codec || avcodec_open(stream->CodecCtx, codec) < 0)
|
||||
{
|
||||
delete stream;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
file->Streams.push_back(stream);
|
||||
return &file->Streams[file->Streams.size()-1];
|
||||
return stream;
|
||||
}
|
||||
streamnum--;
|
||||
}
|
||||
|
@ -130,14 +133,14 @@ static int getNextPacket(MyFile *file)
|
|||
AVPacket packet;
|
||||
while(av_read_frame(file->FmtCtx, &packet) >= 0)
|
||||
{
|
||||
for(vector<MyFile::MyStream>::iterator i = file->Streams.begin();
|
||||
for(vector<MyFile::MyStream*>::iterator i = file->Streams.begin();
|
||||
i != file->Streams.end();i++)
|
||||
{
|
||||
if(i->StreamNum == packet.stream_index)
|
||||
if((*i)->StreamNum == packet.stream_index)
|
||||
{
|
||||
size_t idx = i->Data.size();
|
||||
i->Data.resize(idx + packet.size);
|
||||
memcpy(&i->Data[idx], packet.data, packet.size);
|
||||
size_t idx = (*i)->Data.size();
|
||||
(*i)->Data.resize(idx + packet.size);
|
||||
memcpy(&(*i)->Data[idx], packet.data, packet.size);
|
||||
av_free_packet(&packet);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ struct MusicManager
|
|||
|
||||
// How much to add to the volume each second when fading
|
||||
const float fadeInRate = 0.10;
|
||||
const float fadeOutRate = 0.35;
|
||||
const float fadeOutRate = 0.20;
|
||||
|
||||
// Maximum buffer length, divided up among OpenAL buffers
|
||||
const uint bufLength = 128*1024;
|
||||
|
@ -85,7 +85,6 @@ struct MusicManager
|
|||
outData.length = bufLength / bIDs.length;
|
||||
fileHandle = null;
|
||||
musicOn = false;
|
||||
updateVolume();
|
||||
}
|
||||
|
||||
// Get the new volume setting.
|
||||
|
@ -99,7 +98,8 @@ struct MusicManager
|
|||
// a fade. Even if we are fading, though, the volume should never
|
||||
// be over the max.
|
||||
if(fading == Fade.None || volume > maxVolume) volume = maxVolume;
|
||||
alSourcef(sID, AL_GAIN, volume);
|
||||
if(sID)
|
||||
alSourcef(sID, AL_GAIN, volume);
|
||||
}
|
||||
|
||||
// Give a music play list
|
||||
|
@ -154,6 +154,8 @@ struct MusicManager
|
|||
if(checkALError())
|
||||
fail("Couldn't generate music sources");
|
||||
alSourcei(sID, AL_SOURCE_RELATIVE, AL_TRUE);
|
||||
|
||||
updateVolume();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -263,7 +265,6 @@ struct MusicManager
|
|||
if(!config.useMusic) return;
|
||||
|
||||
musicOn = true;
|
||||
volume = maxVolume;
|
||||
fading = Fade.None;
|
||||
playNext();
|
||||
}
|
||||
|
@ -371,7 +372,7 @@ struct MusicManager
|
|||
else
|
||||
{
|
||||
assert(fading == Fade.Out);
|
||||
volume -= fadeOutRate * time;
|
||||
volume -= fadeOutRate * time;
|
||||
if(volume <= 0.0)
|
||||
{
|
||||
fading = Fade.None;
|
||||
|
|
Loading…
Reference in a new issue