forked from mirror/openmw-tes3mp
More music changes, Makefile updates, minor changes
git-svn-id: https://openmw.svn.sourceforge.net/svnroot/openmw/trunk@31 ea6a568a-9f4f-0410-981a-c910a81bb256
This commit is contained in:
parent
eb642d3400
commit
33d11a733c
11 changed files with 129 additions and 110 deletions
67
Makefile
67
Makefile
|
@ -6,13 +6,15 @@ CXXFLAGS?= -Wall -g
|
|||
DMD=gdmd -version=Posix
|
||||
|
||||
# Some extra flags for niftool and bsatool
|
||||
NIFFLAGS=
|
||||
NIFFLAGS=-debug=warnstd -debug=check -debug=statecheck -debug=strict -debug=verbose
|
||||
|
||||
# Compiler settings for Ogre + OIS. Change as needed.
|
||||
OGCC=$(CXX) $(CXXFLAGS) `pkg-config --cflags OGRE OIS`
|
||||
CF_OIS=$(shell pkg-config --cflags OGRE OIS)
|
||||
OGCC=$(CXX) $(CXXFLAGS) $(CF_OIS)
|
||||
|
||||
# Compiler settings for ffmpeg. Change as needed.
|
||||
AVGCC=$(CXX) $(CXXFLAGS) `pkg-config --cflags libavcodec libavformat`
|
||||
CF_FFMPEG=$(shell pkg-config --cflags libavcodec libavformat)
|
||||
AVGCC=$(CXX) $(CXXFLAGS) $(CF_FFMPEG)
|
||||
|
||||
# Ogre C++ files, on the form ogre/cpp_X.cpp. Only the first file is
|
||||
# passed to the compiler, the rest are dependencies.
|
||||
|
@ -22,67 +24,56 @@ ogre_cpp=ogre framelistener interface overlay bsaarchive
|
|||
# passed to the compiler, the rest are dependencies.
|
||||
avcodec_cpp=avcodec
|
||||
|
||||
## The rest of this file is automatic ##
|
||||
## No modifications should be required below this line. ##
|
||||
|
||||
ogre_cpp_files=$(ogre_cpp:%=ogre/cpp_%.cpp)
|
||||
avcodec_cpp_files=$(avcodec_cpp:%=sound/cpp_%.cpp)
|
||||
|
||||
d_files=$(wildcard */*.d) $(wildcard monster/util/*.d)
|
||||
d_files_nif=$(wildcard nif/*.d) $(wildcard util/*.d) $(wildcard core/memory.d) $(wildcard monster/util/*.d)
|
||||
# All object files needed by openmw and esmtool
|
||||
src := $(wildcard */*.d)
|
||||
src := $(src) $(wildcard monster/util/*.d)
|
||||
obj := $(src:%.d=objs/%.o)
|
||||
|
||||
# The NIF object files for niftool and bsatool are put in a separate
|
||||
# directory, since they are built with different flags.
|
||||
d_objs=$(d_files:%.d=objs/%.o)
|
||||
d_objs_nif=$(d_files_nif:%.d=nifobjs/%.o)
|
||||
src_nif := $(wildcard nif/*.d)
|
||||
src_nif := $(src_nif) $(wildcard util/*.d)
|
||||
src_nif := $(src_nif) core/memory.d
|
||||
src_nif := $(src_nif) $(wildcard monster/util/*.d)
|
||||
obj_nif := $(src_nif:%.d=nifobjs/%.o)
|
||||
|
||||
.PHONY: cpp all clean makedirs
|
||||
.PHONY: cpp all clean
|
||||
|
||||
# By default, make will only build the Ogre C++ sources.
|
||||
# Build everything. Default when running 'make' directly.
|
||||
all: openmw esmtool niftool bsatool bored
|
||||
|
||||
# Only build C++ sources. Used when building from DSSS.
|
||||
cpp: cpp_ogre.o cpp_avcodec.o
|
||||
|
||||
all: makedirs openmw esmtool niftool bsatool bored
|
||||
|
||||
cpp_ogre.o: $(ogre_cpp_files)
|
||||
$(OGCC) -c $<
|
||||
|
||||
cpp_avcodec.o: $(avcodec_cpp_files)
|
||||
$(AVGCC) -c $<
|
||||
|
||||
objs/%.o: %.d makedirs
|
||||
objs/%.o: %.d
|
||||
dirname $@ | xargs mkdir -p
|
||||
$(DMD) -c $< -of$@
|
||||
|
||||
nifobjs/%.o: %.d makedirs
|
||||
$(DMD) -debug=warnstd -debug=check -debug=statecheck -debug=strict -debug=verbose -c $< -of$@
|
||||
nifobjs/%.o: %.d
|
||||
dirname $@ | xargs mkdir -p
|
||||
$(DMD) $(NIFFLAGS) -c $< -of$@
|
||||
|
||||
# This is a hack for gdmd (dmd-like frontend to gdc), since it does
|
||||
# not automatically create directories as it should.
|
||||
makedirs:
|
||||
mkdir -p objs/bsa
|
||||
mkdir -p objs/core
|
||||
mkdir -p objs/esm
|
||||
mkdir -p objs/input
|
||||
mkdir -p objs/monster/util
|
||||
mkdir -p objs/nif
|
||||
mkdir -p objs/ogre
|
||||
mkdir -p objs/scene
|
||||
mkdir -p objs/sound
|
||||
mkdir -p objs/util
|
||||
mkdir -p nifobjs/nif
|
||||
mkdir -p nifobjs/util
|
||||
mkdir -p nifobjs/core
|
||||
mkdir -p nifobjs/monster/util
|
||||
mkdir -p nifobjs/bsa
|
||||
|
||||
openmw: openmw.d cpp_ogre.o cpp_avcodec.o $(d_objs)
|
||||
openmw: openmw.d cpp_ogre.o cpp_avcodec.o $(obj)
|
||||
$(DMD) $^ -of$@ -L-lopenal -L-lOgreMain -L-lOIS -L-lavcodec -L-lavformat
|
||||
|
||||
esmtool: esmtool.d cpp_ogre.o cpp_avcodec.o $(d_objs)
|
||||
esmtool: esmtool.d cpp_ogre.o cpp_avcodec.o $(obj)
|
||||
$(DMD) $^ -of$@ -L-lopenal -L-lOgreMain -L-lOIS -L-lavcodec -L-lavformat
|
||||
|
||||
niftool: niftool.d $(d_objs_nif)
|
||||
niftool: niftool.d $(obj_nif)
|
||||
$(DMD) $^ -of$@
|
||||
|
||||
bsatool: bsatool.d $(d_objs_nif) bsa/bsafile.d
|
||||
bsatool: bsatool.d $(obj_nif) objs/bsa/bsafile.o
|
||||
$(DMD) $^ -of$@
|
||||
|
||||
bored: bored.d
|
||||
|
|
17
README.txt
17
README.txt
|
@ -6,7 +6,7 @@ Email: korslund@gmail.com
|
|||
WWW: http://openmw.snaptoad.com
|
||||
License: See GPL3.txt
|
||||
Current version: 0.4 (still very pre-alpha)
|
||||
Date: 2008 jul. 12
|
||||
Date: 2008 jul. 20
|
||||
|
||||
|
||||
|
||||
|
@ -115,17 +115,26 @@ Thanks goes out to:
|
|||
|
||||
- Chris Robinson for OpenAL and MP3 support
|
||||
|
||||
- Various others for testing, ideas and patches
|
||||
|
||||
|
||||
|
||||
|
||||
Changelog:
|
||||
==========
|
||||
|
||||
0.4 (Work in progress)
|
||||
0.4 (2008 jul. 20) - work in progress
|
||||
|
||||
- switched from Audiere to OpenAL (BIG thanks to Chris Robinson)
|
||||
- added complete Makefile (again) as a alternative build tool
|
||||
- much more realistic lighting (thanks again to Chris Robinson)
|
||||
- should work with Russian version
|
||||
- various bug-fixes
|
||||
- cosmetic changes to placate gdc -Wall
|
||||
|
||||
|
||||
0.3 (2008 jul. 10) - latest release
|
||||
|
||||
- built and tested on Windows XP
|
||||
- partial support for FreeBSD (exceptions do not work)
|
||||
- temporarily dropped DSSS and Monster as necessary dependencies
|
||||
|
@ -138,10 +147,14 @@ Changelog:
|
|||
Dmitry Marakasov.)
|
||||
- tested against OIS 1.0.0 (Ubuntu repository package)
|
||||
|
||||
|
||||
0.2 (2008 jun. 17)
|
||||
|
||||
- compiles with gdc
|
||||
- switched to DSSS for building D code
|
||||
- includes the program esmtool
|
||||
|
||||
|
||||
0.1 (2008 jun. 03)
|
||||
|
||||
- first release
|
||||
|
|
6
bored.d
6
bored.d
|
@ -110,6 +110,12 @@ those plugins.");
|
|||
play=false;
|
||||
break;
|
||||
}
|
||||
if(rnd() < 0.02)
|
||||
{
|
||||
writefln("You were eaten by a grue.");
|
||||
play=false;
|
||||
break;
|
||||
}
|
||||
switch(rand(0,15))
|
||||
{
|
||||
case 0: str = "Fjol the Outlaw"; goldinc = rand(0,70); lootinc = rand(10,120); break;
|
||||
|
|
|
@ -192,6 +192,7 @@ struct ResourceManager
|
|||
// Copy name and insert. We MUST copy here, since indices during
|
||||
// load are put in a temporary buffer, and thus overwritten.
|
||||
si.name = esmRegion.copyz(id);
|
||||
assert(si.name == id);
|
||||
soundLookup[si.name] = si;
|
||||
|
||||
return si;
|
||||
|
|
|
@ -11,7 +11,7 @@ version(Windows) {
|
|||
prebuild = warn Not designed for Windows yet.
|
||||
}
|
||||
version(Posix) {
|
||||
prebuild = make ;
|
||||
prebuild = make cpp;
|
||||
}
|
||||
# Make sure we recompile the nif files without the debug output
|
||||
prebuild += dsss clean niftool
|
||||
|
|
|
@ -180,8 +180,6 @@ struct Dialogue
|
|||
}}
|
||||
}
|
||||
|
||||
// TODO/FIXME: HACK suddenly needed with version 0.167 :(
|
||||
// Haven't re-tested it with non-ancient compiler
|
||||
typedef Dialogue.Type DialogueType;
|
||||
|
||||
/+
|
||||
|
|
|
@ -187,17 +187,26 @@ struct DialInfo
|
|||
deleted = false;
|
||||
questStatus = Quest.None;
|
||||
|
||||
// Figure out how we check the owner's type
|
||||
if(tp == Dialogue.Type.Journal)
|
||||
{
|
||||
if(subName == "QSTN") questStatus = Quest.Name;
|
||||
else if(subName == "QSTF") questStatus = Quest.Finished;
|
||||
else if(subName == "QSTR") questStatus = Quest.Restart;
|
||||
|
||||
if(questStatus != Quest.None) getHByte();
|
||||
}
|
||||
else if(subName == "DELE") {getHInt(); deleted = true;}
|
||||
else fail("Don't know what to do with " ~ subName ~ " here.");
|
||||
else
|
||||
fail("Don't know what to do with " ~ subName ~ " in INFO " ~ id);
|
||||
|
||||
if(questStatus != Quest.None)
|
||||
{
|
||||
getHByte();
|
||||
// The Quest markers should only appear in journal INFOs, but
|
||||
// sometime the appear outside it. We could issue a warning,
|
||||
// but lets just ignore it instead.
|
||||
|
||||
/*
|
||||
if(tp != Dialogue.Type.Journal)
|
||||
writefln("WARNING: Found INFO quest marker in INFO %s type %s",
|
||||
id, cast(int)tp);
|
||||
*/
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
|
|
20
openmw.d
20
openmw.d
|
@ -201,26 +201,6 @@ void main(char[][] args)
|
|||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
Sound *l = cast(Sound*) sounds.lookup("Fire 40");
|
||||
if(l)
|
||||
{
|
||||
writefln("id: %s", l.id);
|
||||
writefln("volume: ", l.data.volume);
|
||||
writefln("range: %s-%s", l.data.minRange, l.data.maxRange);
|
||||
writefln("sound file name: ", l.sound.getName);
|
||||
writefln("playing... press enter to quit");
|
||||
|
||||
SoundInstance inst = SoundList.getInstance(l, true);
|
||||
inst.setPos(0,0,0);
|
||||
inst.setPlayerPos(0, 0, 0);
|
||||
inst.play();
|
||||
din.readLine();
|
||||
inst.kill;
|
||||
render = false;
|
||||
}
|
||||
*/
|
||||
|
||||
if(render)
|
||||
{
|
||||
// Warm up OGRE
|
||||
|
|
|
@ -44,6 +44,8 @@ struct SoundList
|
|||
{
|
||||
const distFactor = 40.0; // Just guessing, really.
|
||||
|
||||
assert(!s.sound.isEmpty());
|
||||
|
||||
SoundInstance inst = s.sound.getInstance();
|
||||
inst.setParams(s.data.volume/255.0,
|
||||
s.data.minRange*distFactor,
|
||||
|
@ -54,6 +56,11 @@ struct SoundList
|
|||
|
||||
SoundInstance *insert(Sound *snd, bool loop=false)
|
||||
{
|
||||
// For some reason, we get called with empty sound instances here
|
||||
// if some files are missing, but not for others. Check into it
|
||||
// later.
|
||||
if(snd.sound.isEmpty) return null;
|
||||
|
||||
// Reuse a dead instance if one exists
|
||||
foreach(ref s; list)
|
||||
{
|
||||
|
|
|
@ -128,7 +128,7 @@ extern "C" int cpp_getAVAudioInfo(MyFile::MyStream *stream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int getNextPacket(MyFile *file)
|
||||
static void getNextPacket(MyFile *file, int streamidx)
|
||||
{
|
||||
AVPacket packet;
|
||||
while(av_read_frame(file->FmtCtx, &packet) >= 0)
|
||||
|
@ -141,14 +141,16 @@ static int getNextPacket(MyFile *file)
|
|||
size_t idx = (*i)->Data.size();
|
||||
(*i)->Data.resize(idx + packet.size);
|
||||
memcpy(&(*i)->Data[idx], packet.data, packet.size);
|
||||
if(streamidx == packet.stream_index)
|
||||
{
|
||||
av_free_packet(&packet);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
av_free_packet(&packet);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" int cpp_getAVAudioData(MyFile::MyStream *stream, char *data, int length)
|
||||
|
@ -158,44 +160,8 @@ extern "C" int cpp_getAVAudioData(MyFile::MyStream *stream, char *data, int leng
|
|||
int dec = 0;
|
||||
while(dec < length)
|
||||
{
|
||||
if(stream->DecodedData.size() == 0)
|
||||
if(stream->DecodedData.size() > 0)
|
||||
{
|
||||
while(stream->Data.size() == 0)
|
||||
{
|
||||
if(getNextPacket(stream->parent) != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
int insize = stream->Data.size();
|
||||
if(insize == 0)
|
||||
break;
|
||||
|
||||
// Temporarilly add padding to the input data since some
|
||||
// codecs read in larger chunks and may accidently read
|
||||
// past the end of the allocated buffer
|
||||
stream->Data.resize(insize + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
stream->DecodedData.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE);
|
||||
|
||||
int16_t *ptr = (int16_t*)&stream->DecodedData[0];
|
||||
int size = stream->DecodedData.size();
|
||||
int len = avcodec_decode_audio2(stream->CodecCtx, ptr, &size,
|
||||
&stream->Data[0], insize);
|
||||
if(len < 0)
|
||||
{
|
||||
stream->Data.resize(insize);
|
||||
break;
|
||||
}
|
||||
|
||||
int datarem = insize-len;
|
||||
if(datarem)
|
||||
memmove(&stream->Data[0], &stream->Data[len], datarem);
|
||||
stream->Data.resize(datarem);
|
||||
|
||||
stream->DecodedData.resize(size);
|
||||
if(stream->DecodedData.size() == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
size_t rem = length-dec;
|
||||
if(rem > stream->DecodedData.size())
|
||||
rem = stream->DecodedData.size();
|
||||
|
@ -208,5 +174,41 @@ extern "C" int cpp_getAVAudioData(MyFile::MyStream *stream, char *data, int leng
|
|||
stream->DecodedData.size() - rem);
|
||||
stream->DecodedData.resize(stream->DecodedData.size()-rem);
|
||||
}
|
||||
if(stream->DecodedData.size() == 0)
|
||||
{
|
||||
// Must always get at least one more packet if possible, in case
|
||||
// the previous one wasn't enough
|
||||
getNextPacket(stream->parent, stream->StreamNum);
|
||||
int insize = stream->Data.size();
|
||||
if(insize == 0)
|
||||
break;
|
||||
|
||||
// Temporarilly add padding to the input data since some
|
||||
// codecs read in larger chunks and may accidently read
|
||||
// past the end of the allocated buffer
|
||||
stream->Data.resize(insize + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
memset(&stream->Data[insize], 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
stream->DecodedData.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE);
|
||||
|
||||
int16_t *ptr = (int16_t*)&stream->DecodedData[0];
|
||||
int size = stream->DecodedData.size();
|
||||
int len = avcodec_decode_audio2(stream->CodecCtx, ptr, &size,
|
||||
&stream->Data[0], insize);
|
||||
if(len < 0)
|
||||
{
|
||||
stream->Data.resize(insize);
|
||||
break;
|
||||
}
|
||||
if(len > 0)
|
||||
{
|
||||
int datarem = insize-len;
|
||||
if(datarem)
|
||||
memmove(&stream->Data[0], &stream->Data[len], datarem);
|
||||
stream->Data.resize(datarem);
|
||||
}
|
||||
|
||||
stream->DecodedData.resize(size);
|
||||
}
|
||||
}
|
||||
return dec;
|
||||
}
|
||||
|
|
|
@ -183,6 +183,8 @@ struct MusicManager
|
|||
// If something fails, clean everything up.
|
||||
scope(failure)
|
||||
{
|
||||
// This block is only executed if an exception is thrown.
|
||||
|
||||
if(fileHandle) cpp_closeAVFile(fileHandle);
|
||||
|
||||
fileHandle = null;
|
||||
|
@ -199,6 +201,8 @@ struct MusicManager
|
|||
|
||||
// Try the next track if playNext is called again
|
||||
index++;
|
||||
|
||||
// The function exits here.
|
||||
}
|
||||
|
||||
if(checkALError())
|
||||
|
@ -222,13 +226,21 @@ struct MusicManager
|
|||
{
|
||||
if(ch == 1) bufFormat = AL_FORMAT_MONO8;
|
||||
if(ch == 2) bufFormat = AL_FORMAT_STEREO8;
|
||||
if(alIsExtensionPresent("AL_EXT_MCFORMATS"))
|
||||
{
|
||||
if(ch == 4) bufFormat = alGetEnumValue("AL_FORMAT_QUAD8");
|
||||
if(ch == 6) bufFormat = alGetEnumValue("AL_FORMAT_51CHN8");
|
||||
}
|
||||
}
|
||||
if(bits == 16)
|
||||
{
|
||||
if(ch == 1) bufFormat = AL_FORMAT_MONO16;
|
||||
if(ch == 2) bufFormat = AL_FORMAT_STEREO16;
|
||||
if(alIsExtensionPresent("AL_EXT_MCFORMATS"))
|
||||
{
|
||||
if(ch == 4) bufFormat = alGetEnumValue("AL_FORMAT_QUAD16");
|
||||
if(ch == 6) bufFormat = alGetEnumValue("AL_FORMAT_51CHN16");
|
||||
}
|
||||
}
|
||||
|
||||
if(bufFormat == 0)
|
||||
|
|
Loading…
Reference in a new issue