Cleanup
This commit is contained in:
parent
06fdfa90c2
commit
cd36be16a1
5 changed files with 373 additions and 376 deletions
|
@ -10,7 +10,7 @@
|
|||
//
|
||||
/**@name oss_audio.c - Oss hardware support */
|
||||
//
|
||||
// (c) Copyright 2002 by Lutz Sammer and Fabrice Rossi
|
||||
// (c) Copyright 2002-2003 by Lutz Sammer and Fabrice Rossi
|
||||
//
|
||||
// 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
|
||||
|
@ -68,44 +68,44 @@
|
|||
**
|
||||
** @return True if failure, false if everything ok.
|
||||
*/
|
||||
global int InitOssSound(const char* dev,int freq,int size,int wait)
|
||||
global int InitOssSound(const char* dev, int freq, int size, int wait)
|
||||
{
|
||||
int dummy;
|
||||
|
||||
//
|
||||
// Open dsp device, 8bit samples, stereo.
|
||||
//
|
||||
if( wait ) {
|
||||
SoundFildes=open(dev,O_WRONLY);
|
||||
if (wait) {
|
||||
SoundFildes = open(dev, O_WRONLY);
|
||||
} else {
|
||||
SoundFildes=open(dev,O_WRONLY|O_NDELAY);
|
||||
SoundFildes = open(dev, O_WRONLY | O_NDELAY);
|
||||
}
|
||||
if( SoundFildes==-1 ) {
|
||||
fprintf(stderr,"Can't open audio device `%s'\n",dev);
|
||||
if (SoundFildes == -1) {
|
||||
fprintf(stderr, "Can't open audio device `%s'\n", dev);
|
||||
return 1;
|
||||
}
|
||||
dummy=size;
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_SAMPLESIZE,&dummy)==-1 ) {
|
||||
dummy = size;
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_SAMPLESIZE, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_SAMPLESIZE)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_SAMPLESIZE)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
dummy=1;
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_STEREO,&dummy)==-1 ) {
|
||||
dummy = 1;
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_STEREO, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_STEREO)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_STEREO)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
dummy=freq;
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_SPEED,&dummy)==-1 ) {
|
||||
dummy = freq;
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_SPEED, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_SPEED)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_SPEED)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
//
|
||||
|
@ -113,52 +113,52 @@ global int InitOssSound(const char* dev,int freq,int size,int wait)
|
|||
//
|
||||
// FIXME: higher speed more buffers!!
|
||||
|
||||
switch( freq ) {
|
||||
switch (freq) {
|
||||
case 11025:
|
||||
dummy=((8<<16) | 8); // 8 Buffers of 256 Bytes
|
||||
dummy=((8 << 16) | 8); // 8 Buffers of 256 Bytes
|
||||
break;
|
||||
case 22050:
|
||||
dummy=((8<<16) | 9); // 8 Buffers of 512 Bytes
|
||||
dummy=((8 << 16) | 9); // 8 Buffers of 512 Bytes
|
||||
break;
|
||||
default:
|
||||
DebugLevel0Fn("Unexpected sample frequency %d\n" _C_ freq);
|
||||
// FALL THROUGH
|
||||
case 44100:
|
||||
dummy=((8<<16) | 10); // 8 Buffers of 1024 Bytes
|
||||
dummy=((8 << 16) | 10); // 8 Buffers of 1024 Bytes
|
||||
break;
|
||||
}
|
||||
if( size==16 ) { // 8 bit
|
||||
if (size == 16) { // 8 bit
|
||||
++dummy; // double buffer size
|
||||
}
|
||||
|
||||
DebugLevel0Fn("%d bytes %d ms buffer\n" _C_ freq*size/8 _C_
|
||||
((dummy>>16)*(1<<(dummy&0xFFFF))*1000)/(freq*size/8));
|
||||
((dummy >> 16) * (1 << (dummy & 0xFFFF)) * 1000) / (freq * size / 8));
|
||||
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_SETFRAGMENT,&dummy)==-1 ) {
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_SETFRAGMENT, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_SETFRAGMENT)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_SETFRAGMENT)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
dummy=4;
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_SUBDIVIDE,&dummy)==-1 ) {
|
||||
dummy = 4;
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_SUBDIVIDE, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_SUBDIVIDE)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_SUBDIVIDE)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
if( ioctl(SoundFildes,SNDCTL_DSP_GETBLKSIZE,&dummy)==-1 ) {
|
||||
if (ioctl(SoundFildes, SNDCTL_DSP_GETBLKSIZE, &dummy) == -1) {
|
||||
PrintFunction();
|
||||
fprintf(stdout,"%s - ioctl(SNDCTL_DSP_GETBLKSIZE)", strerror(errno));
|
||||
fprintf(stdout, "%s - ioctl(SNDCTL_DSP_GETBLKSIZE)", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
//
|
||||
/**@name sdl_audio.c - SDL hardware support */
|
||||
//
|
||||
// (c) Copyright 2002 by Lutz Sammer and Fabrice Rossi
|
||||
// (c) Copyright 2002-2003 by Lutz Sammer and Fabrice Rossi
|
||||
//
|
||||
// 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
|
||||
|
@ -48,8 +48,8 @@
|
|||
----------------------------------------------------------------------------*/
|
||||
|
||||
/// FIXME: move function to here.
|
||||
extern void FillAudio(void* udata __attribute__((unused)),Uint8* stream,
|
||||
int len);
|
||||
extern void FillAudio(void* udata __attribute__((unused)), Uint8* stream,
|
||||
int len);
|
||||
|
||||
/**
|
||||
** Initialize sound card hardware part with SDL.
|
||||
|
@ -62,7 +62,7 @@ extern void FillAudio(void* udata __attribute__((unused)),Uint8* stream,
|
|||
** @return True if failure, false if everything ok.
|
||||
*/
|
||||
global int InitSdlSound(const char* dev __attribute__((unused)), int freq,
|
||||
int size, int wait __attribute__((unused)))
|
||||
int size, int wait __attribute__((unused)))
|
||||
{
|
||||
SDL_AudioSpec wanted;
|
||||
|
||||
|
|
|
@ -108,43 +108,43 @@ global GameSound GameSounds
|
|||
** @param volume FIXME: docu
|
||||
** @param stereo FIXME: docu
|
||||
*/
|
||||
local void InsertSoundRequest(const Unit* unit,unsigned id,unsigned char power,
|
||||
SoundId sound,unsigned char fight,
|
||||
unsigned char selection,unsigned char volume,
|
||||
char stereo)
|
||||
local void InsertSoundRequest(const Unit* unit, unsigned id,
|
||||
unsigned char power, SoundId sound, unsigned char fight,
|
||||
unsigned char selection, unsigned char volume, char stereo)
|
||||
{
|
||||
#ifdef USE_SDLA
|
||||
SDL_LockAudio();
|
||||
#endif
|
||||
//FIXME: valid only in a shared memory context...
|
||||
if( !SoundOff && sound != NO_SOUND ) {
|
||||
if (!SoundOff && sound != NO_SOUND) {
|
||||
if (SoundRequests[NextSoundRequestIn].Used) {
|
||||
DebugLevel0("***** NO FREE SLOT IN SOUND FIFO *****\n");
|
||||
} else {
|
||||
SoundRequests[NextSoundRequestIn].Used=1;
|
||||
SoundRequests[NextSoundRequestIn].Source.Base=unit;
|
||||
SoundRequests[NextSoundRequestIn].Source.Id=id;
|
||||
SoundRequests[NextSoundRequestIn].Sound=sound;
|
||||
SoundRequests[NextSoundRequestIn].Power=power;
|
||||
SoundRequests[NextSoundRequestIn].Fight=(fight)?1:0;
|
||||
SoundRequests[NextSoundRequestIn].Selection=(selection)?1:0;
|
||||
SoundRequests[NextSoundRequestIn].IsVolume=(volume)?1:0;
|
||||
SoundRequests[NextSoundRequestIn].Stereo=stereo;
|
||||
SoundRequests[NextSoundRequestIn].Used = 1;
|
||||
SoundRequests[NextSoundRequestIn].Source.Base = unit;
|
||||
SoundRequests[NextSoundRequestIn].Source.Id = id;
|
||||
SoundRequests[NextSoundRequestIn].Sound = sound;
|
||||
SoundRequests[NextSoundRequestIn].Power = power;
|
||||
SoundRequests[NextSoundRequestIn].Fight = fight ? 1 : 0;
|
||||
SoundRequests[NextSoundRequestIn].Selection = selection ? 1 : 0;
|
||||
SoundRequests[NextSoundRequestIn].IsVolume = volume ? 1 : 0;
|
||||
SoundRequests[NextSoundRequestIn].Stereo = stereo;
|
||||
DebugLevel3("Source[%p,%s]: registering request %p at slot %d=%d\n" _C_
|
||||
unit _C_ unit ? unit->Type->Ident : ""
|
||||
_C_ sound _C_ NextSoundRequestIn _C_ power);
|
||||
unit _C_ unit ? unit->Type->Ident : "" _C_
|
||||
sound _C_ NextSoundRequestIn _C_ power);
|
||||
#ifdef USE_THREAD
|
||||
// increment semaphore
|
||||
if (SoundThreadRunning) {
|
||||
if(sem_post(&SoundThreadChannelSemaphore)) {
|
||||
if (sem_post(&SoundThreadChannelSemaphore)) {
|
||||
DebugLevel0("Cannot increment semaphore!\n");
|
||||
//FIXME: need to quit?
|
||||
}
|
||||
}
|
||||
#endif
|
||||
NextSoundRequestIn++;
|
||||
if (NextSoundRequestIn>=MAX_SOUND_REQUESTS)
|
||||
NextSoundRequestIn=0;
|
||||
++NextSoundRequestIn;
|
||||
if (NextSoundRequestIn >= MAX_SOUND_REQUESTS) {
|
||||
NextSoundRequestIn = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef USE_SDLA
|
||||
|
@ -162,31 +162,31 @@ local void InsertSoundRequest(const Unit* unit,unsigned id,unsigned char power,
|
|||
**
|
||||
** @todo FIXME: The work completed sounds only supports two races.
|
||||
*/
|
||||
local SoundId ChooseUnitVoiceSoundId(const Unit *unit,UnitVoiceGroup voice)
|
||||
local SoundId ChooseUnitVoiceSoundId(const Unit* unit, UnitVoiceGroup voice)
|
||||
{
|
||||
switch (voice) {
|
||||
case VoiceAcknowledging:
|
||||
return unit->Type->Sound.Acknowledgement.Sound;
|
||||
case VoiceReady:
|
||||
return unit->Type->Sound.Ready.Sound;
|
||||
case VoiceSelected:
|
||||
return unit->Type->Sound.Selected.Sound;
|
||||
case VoiceAttacking:
|
||||
return unit->Type->Weapon.Attack.Sound;
|
||||
case VoiceHelpMe:
|
||||
return unit->Type->Sound.Help.Sound;
|
||||
case VoiceDying:
|
||||
return unit->Type->Sound.Dead.Sound;
|
||||
case VoiceTreeChopping:
|
||||
return GameSounds.TreeChopping.Sound;
|
||||
case VoiceWorkCompleted:
|
||||
return GameSounds.WorkComplete[ThisPlayer->Race].Sound;
|
||||
case VoiceBuilding:
|
||||
return GameSounds.BuildingConstruction.Sound;
|
||||
case VoiceDocking:
|
||||
return GameSounds.Docking.Sound;
|
||||
case VoiceRepair:
|
||||
return GameSounds.Repair.Sound;
|
||||
case VoiceAcknowledging:
|
||||
return unit->Type->Sound.Acknowledgement.Sound;
|
||||
case VoiceReady:
|
||||
return unit->Type->Sound.Ready.Sound;
|
||||
case VoiceSelected:
|
||||
return unit->Type->Sound.Selected.Sound;
|
||||
case VoiceAttacking:
|
||||
return unit->Type->Weapon.Attack.Sound;
|
||||
case VoiceHelpMe:
|
||||
return unit->Type->Sound.Help.Sound;
|
||||
case VoiceDying:
|
||||
return unit->Type->Sound.Dead.Sound;
|
||||
case VoiceTreeChopping:
|
||||
return GameSounds.TreeChopping.Sound;
|
||||
case VoiceWorkCompleted:
|
||||
return GameSounds.WorkComplete[ThisPlayer->Race].Sound;
|
||||
case VoiceBuilding:
|
||||
return GameSounds.BuildingConstruction.Sound;
|
||||
case VoiceDocking:
|
||||
return GameSounds.Docking.Sound;
|
||||
case VoiceRepair:
|
||||
return GameSounds.Repair.Sound;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -203,9 +203,9 @@ global void PlayUnitSound(const Unit* unit, UnitVoiceGroup voice)
|
|||
{
|
||||
int stereo;
|
||||
|
||||
stereo = ((unit->X * TileSizeX + unit->Type->TileWidth * TileSizeX / 2
|
||||
+ unit->IX - TheUI.SelectedViewport->MapX * TileSizeX) * 256
|
||||
/ ((TheUI.SelectedViewport->MapWidth - 1) * TileSizeX)) - 128;
|
||||
stereo = ((unit->X * TileSizeX + unit->Type->TileWidth * TileSizeX / 2 +
|
||||
unit->IX - TheUI.SelectedViewport->MapX * TileSizeX) * 256 /
|
||||
((TheUI.SelectedViewport->MapWidth - 1) * TileSizeX)) - 128;
|
||||
if (stereo < -128) {
|
||||
stereo = -128;
|
||||
} else if (stereo > 127) {
|
||||
|
@ -227,9 +227,9 @@ global void PlayMissileSound(const Missile* missile, SoundId sound)
|
|||
{
|
||||
int stereo;
|
||||
|
||||
stereo = ((missile->X + missile->Type->Width / 2
|
||||
- TheUI.SelectedViewport->MapX * TileSizeX) * 256
|
||||
/ ((TheUI.SelectedViewport->MapWidth - 1) * TileSizeX)) - 128;
|
||||
stereo = ((missile->X + missile->Type->Width / 2 -
|
||||
TheUI.SelectedViewport->MapX * TileSizeX) * 256 /
|
||||
((TheUI.SelectedViewport->MapWidth - 1) * TileSizeX)) - 128;
|
||||
if (stereo < -128) {
|
||||
stereo = -128;
|
||||
} else if (stereo > 127) {
|
||||
|
@ -243,17 +243,10 @@ global void PlayMissileSound(const Missile* missile, SoundId sound)
|
|||
/**
|
||||
** FIXME: docu
|
||||
*/
|
||||
global void PlayGameSound(SoundId sound,unsigned char volume)
|
||||
global void PlayGameSound(SoundId sound, unsigned char volume)
|
||||
{
|
||||
DebugLevel3("Playing %p at volume %u\n" _C_ sound _C_ volume);
|
||||
InsertSoundRequest(NULL,
|
||||
0,
|
||||
volume,
|
||||
sound,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0);
|
||||
InsertSoundRequest(NULL, 0, volume, sound, 0, 0, 1, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -268,12 +261,12 @@ global void SetGlobalVolume(int volume)
|
|||
//FIXME: we use here the fact that we are in a shared memory context. This
|
||||
// should send a message to the sound server
|
||||
// silently discard out of range values
|
||||
if ( volume<0 ) {
|
||||
GlobalVolume=0;
|
||||
} else if ( volume>MaxVolume ) {
|
||||
GlobalVolume=MaxVolume;
|
||||
if (volume < 0) {
|
||||
GlobalVolume = 0;
|
||||
} else if (volume > MaxVolume) {
|
||||
GlobalVolume = MaxVolume;
|
||||
} else {
|
||||
GlobalVolume=volume;
|
||||
GlobalVolume = volume;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -290,12 +283,12 @@ global void SetMusicVolume(int volume)
|
|||
// should send a message to the sound server
|
||||
|
||||
// silently discard out of range values
|
||||
if ( volume<0 ) {
|
||||
MusicVolume=0;
|
||||
} else if ( volume>MaxVolume ) {
|
||||
MusicVolume=MaxVolume;
|
||||
if (volume < 0) {
|
||||
MusicVolume = 0;
|
||||
} else if (volume > MaxVolume) {
|
||||
MusicVolume = MaxVolume;
|
||||
} else {
|
||||
MusicVolume=volume;
|
||||
MusicVolume = volume;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -306,48 +299,49 @@ global void InitSoundClient(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
if( SoundFildes==-1 ) { // No sound enabled
|
||||
if (SoundFildes == -1) { // No sound enabled
|
||||
return;
|
||||
}
|
||||
// let's map game sounds, look if already setup in ccl.
|
||||
|
||||
if( !GameSounds.PlacementError.Sound ) {
|
||||
GameSounds.PlacementError.Sound=
|
||||
SoundIdForName(GameSounds.PlacementError.Name);
|
||||
if (!GameSounds.PlacementError.Sound) {
|
||||
GameSounds.PlacementError.Sound =
|
||||
SoundIdForName(GameSounds.PlacementError.Name);
|
||||
}
|
||||
if( !GameSounds.PlacementSuccess.Sound ) {
|
||||
GameSounds.PlacementSuccess.Sound=
|
||||
SoundIdForName(GameSounds.PlacementSuccess.Name);
|
||||
if (!GameSounds.PlacementSuccess.Sound) {
|
||||
GameSounds.PlacementSuccess.Sound =
|
||||
SoundIdForName(GameSounds.PlacementSuccess.Name);
|
||||
}
|
||||
if( !GameSounds.Click.Sound ) {
|
||||
GameSounds.Click.Sound=SoundIdForName(GameSounds.Click.Name);
|
||||
if (!GameSounds.Click.Sound) {
|
||||
GameSounds.Click.Sound = SoundIdForName(GameSounds.Click.Name);
|
||||
}
|
||||
if( !GameSounds.TreeChopping.Sound ) {
|
||||
GameSounds.TreeChopping.Sound=
|
||||
SoundIdForName(GameSounds.TreeChopping.Name);
|
||||
if (!GameSounds.TreeChopping.Sound) {
|
||||
GameSounds.TreeChopping.Sound =
|
||||
SoundIdForName(GameSounds.TreeChopping.Name);
|
||||
}
|
||||
if( !GameSounds.Docking.Sound ) {
|
||||
GameSounds.Docking.Sound=
|
||||
SoundIdForName(GameSounds.Docking.Name);
|
||||
if (!GameSounds.Docking.Sound) {
|
||||
GameSounds.Docking.Sound =
|
||||
SoundIdForName(GameSounds.Docking.Name);
|
||||
}
|
||||
if( !GameSounds.BuildingConstruction.Sound ) {
|
||||
GameSounds.BuildingConstruction.Sound=
|
||||
SoundIdForName(GameSounds.BuildingConstruction.Name);
|
||||
if (!GameSounds.BuildingConstruction.Sound) {
|
||||
GameSounds.BuildingConstruction.Sound =
|
||||
SoundIdForName(GameSounds.BuildingConstruction.Name);
|
||||
}
|
||||
for( i=0; i<PlayerRaces.Count; ++i ) {
|
||||
if( !GameSounds.WorkComplete[i].Sound && GameSounds.WorkComplete[i].Name ) {
|
||||
GameSounds.WorkComplete[i].Sound=
|
||||
SoundIdForName(GameSounds.WorkComplete[i].Name);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.WorkComplete[i].Sound &&
|
||||
GameSounds.WorkComplete[i].Name) {
|
||||
GameSounds.WorkComplete[i].Sound =
|
||||
SoundIdForName(GameSounds.WorkComplete[i].Name);
|
||||
}
|
||||
}
|
||||
if( !GameSounds.Repair.Sound ) {
|
||||
GameSounds.Repair.Sound=
|
||||
SoundIdForName(GameSounds.Repair.Name);
|
||||
if (!GameSounds.Repair.Sound) {
|
||||
GameSounds.Repair.Sound =
|
||||
SoundIdForName(GameSounds.Repair.Name);
|
||||
}
|
||||
for( i=0; i<PlayerRaces.Count; ++i ) {
|
||||
if( !GameSounds.Rescue[i].Sound && GameSounds.Rescue[i].Name ) {
|
||||
GameSounds.Rescue[i].Sound=
|
||||
SoundIdForName(GameSounds.Rescue[i].Name);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.Rescue[i].Sound && GameSounds.Rescue[i].Name) {
|
||||
GameSounds.Rescue[i].Sound =
|
||||
SoundIdForName(GameSounds.Rescue[i].Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,7 +62,7 @@ local int SoundIdHash[61];
|
|||
/**
|
||||
** hash table used to store the mapping between sound name and sound id
|
||||
*/
|
||||
local hashtable(int,61) SoundIdHash;
|
||||
local hashtable(int, 61) SoundIdHash;
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -97,9 +97,9 @@ global void DisplaySoundHashTable(void)
|
|||
** @param name Name of the sound (now freed by caller!).
|
||||
** @param id Sound identifier.
|
||||
*/
|
||||
global void MapSound(const char* name,const SoundId id)
|
||||
global void MapSound(const char* name, const SoundId id)
|
||||
{
|
||||
*((SoundId*)hash_add(SoundIdHash,(char*)name))=id;
|
||||
*((SoundId*)hash_add(SoundIdHash, (char*)name)) = id;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -113,9 +113,9 @@ global SoundId SoundIdForName(const char* name)
|
|||
{
|
||||
const SoundId* result;
|
||||
|
||||
DebugCheck( !name );
|
||||
DebugCheck(!name);
|
||||
|
||||
if( (result=(const SoundId*)hash_find(SoundIdHash,(char*)name)) ) {
|
||||
if ((result = (const SoundId*)hash_find(SoundIdHash, (char*)name))) {
|
||||
return *result;
|
||||
}
|
||||
DebugLevel0("Can't find sound `%s' in sound table\n" _C_ name);
|
||||
|
@ -134,22 +134,22 @@ global SoundId SoundIdForName(const char* name)
|
|||
**
|
||||
** @return the sound id of the created group
|
||||
*/
|
||||
global SoundId MakeSound(const char* name,char* file[],int nb)
|
||||
global SoundId MakeSound(const char* name, char* file[], int nb)
|
||||
{
|
||||
SoundId id;
|
||||
const SoundId* result;
|
||||
|
||||
DebugCheck( nb>255 );
|
||||
DebugCheck(nb > 255);
|
||||
|
||||
if ( (result=(const SoundId*)hash_find(SoundIdHash,(char*)name)) ) {
|
||||
if ((result = (const SoundId*)hash_find(SoundIdHash, (char*)name))) {
|
||||
DebugLevel0Fn("re-register sound `%s'\n" _C_ name);
|
||||
return *result;
|
||||
}
|
||||
|
||||
// ask the server to register the sound
|
||||
id=RegisterSound(file,nb);
|
||||
id = RegisterSound(file, nb);
|
||||
// save the mapping from name to id in the hash table.
|
||||
MapSound(name,id);
|
||||
MapSound(name, id);
|
||||
return id;
|
||||
}
|
||||
|
||||
|
@ -166,18 +166,18 @@ global SoundId MakeSound(const char* name,char* file[],int nb)
|
|||
**
|
||||
** @return Registered sound identifier.
|
||||
*/
|
||||
global SoundId MakeSoundGroup(const char* name,SoundId first,SoundId second)
|
||||
global SoundId MakeSoundGroup(const char* name, SoundId first, SoundId second)
|
||||
{
|
||||
SoundId sound;
|
||||
const SoundId* result;
|
||||
|
||||
if ( (result=(const SoundId*)hash_find(SoundIdHash,(char*)name)) ) {
|
||||
if ((result = (const SoundId*)hash_find(SoundIdHash, (char*)name))) {
|
||||
DebugLevel0Fn("re-register sound `%s'\n" _C_ name);
|
||||
return *result;
|
||||
}
|
||||
|
||||
sound=RegisterTwoGroups(first,second);
|
||||
MapSound(name,sound);
|
||||
sound=RegisterTwoGroups(first, second);
|
||||
MapSound(name, sound);
|
||||
|
||||
return sound;
|
||||
}
|
||||
|
|
|
@ -115,8 +115,8 @@ global unsigned AllocatedSoundMemory; /// memory used by sound
|
|||
global unsigned CompressedSoundMemory; /// compressed memory used by sound
|
||||
#endif
|
||||
|
||||
global int GlobalVolume=128; /// global sound volume
|
||||
global int MusicVolume=128; /// music volume
|
||||
global int GlobalVolume = 128; /// global sound volume
|
||||
global int MusicVolume = 128; /// music volume
|
||||
|
||||
global int DistanceSilent; /// silent distance
|
||||
|
||||
|
@ -216,7 +216,7 @@ global void StopMusic(void)
|
|||
}
|
||||
|
||||
/// Dummy functions if no music support is enabled
|
||||
#define MixMusicToStereo32(buffer,size)
|
||||
#define MixMusicToStereo32(buffer, size)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -243,7 +243,7 @@ global void StopMusic(void)
|
|||
** @todo Can combine stereo and volume for faster operation.
|
||||
*/
|
||||
local int MixSampleToStereo32(Sample* sample,int index,unsigned char volume,
|
||||
char stereo,int* buffer,int size)
|
||||
char stereo, int* buffer, int size)
|
||||
{
|
||||
int ri; // read index
|
||||
int wi; // write index
|
||||
|
@ -253,64 +253,64 @@ local int MixSampleToStereo32(Sample* sample,int index,unsigned char volume,
|
|||
unsigned char left;
|
||||
unsigned char right;
|
||||
|
||||
local_volume=((int)volume+1)*2*GlobalVolume/MaxVolume;
|
||||
length=sample->Length-index;
|
||||
if( stereo < 0 ) {
|
||||
left=128;
|
||||
right=128+stereo;
|
||||
local_volume = ((int)volume + 1) * 2 * GlobalVolume / MaxVolume;
|
||||
length = sample->Length - index;
|
||||
if (stereo < 0) {
|
||||
left = 128;
|
||||
right = 128 + stereo;
|
||||
}
|
||||
else {
|
||||
left=128-stereo;
|
||||
right=128;
|
||||
left = 128 - stereo;
|
||||
right = 128;
|
||||
}
|
||||
DebugLevel3("Length %d\n" _C_ length);
|
||||
|
||||
// FIXME: support other formats, stereo or 32 bit ...
|
||||
|
||||
if( sample->SampleSize==8 ) {
|
||||
if (sample->SampleSize == 8) {
|
||||
unsigned char* rp;
|
||||
|
||||
rp=sample->Data+index;
|
||||
if( (size*sample->Frequency)/SoundFrequency/2>length ) {
|
||||
size=(length*SoundFrequency/sample->Frequency)*2;
|
||||
rp = sample->Data + index;
|
||||
if ((size * sample->Frequency) / SoundFrequency / 2 > length) {
|
||||
size = (length * SoundFrequency / sample->Frequency) * 2;
|
||||
}
|
||||
|
||||
// mix mono, 8 bit sound to stereo, 32 bit
|
||||
for( ri=wi=0; wi<size; ) {
|
||||
ri=(wi*sample->Frequency)/SoundFrequency;
|
||||
ri/=2; // adjust for mono
|
||||
for (ri = wi = 0; wi < size;) {
|
||||
ri = (wi * sample->Frequency) / SoundFrequency;
|
||||
ri /= 2; // adjust for mono
|
||||
|
||||
// FIXME: must interpolate samples!
|
||||
v=(rp[ri]-127)*local_volume;
|
||||
v = (rp[ri] - 127) * local_volume;
|
||||
|
||||
buffer[wi++]+=v*left/128;
|
||||
buffer[wi++]+=v*right/128; // left+right channel
|
||||
buffer[wi++] += v * left / 128;
|
||||
buffer[wi++] += v * right / 128; // left+right channel
|
||||
}
|
||||
ri=(wi*sample->Frequency)/SoundFrequency;
|
||||
ri/=2; // adjust for mono
|
||||
ri = (wi * sample->Frequency) / SoundFrequency;
|
||||
ri /= 2; // adjust for mono
|
||||
DebugLevel3("Mixed %d bytes to %d\n" _C_ ri _C_ wi);
|
||||
} else {
|
||||
short* rp;
|
||||
|
||||
DebugCheck( index&1 );
|
||||
DebugCheck(index & 1);
|
||||
|
||||
rp=(short*)(sample->Data+index);
|
||||
if( (size*sample->Frequency)/SoundFrequency>length ) {
|
||||
size=(length*SoundFrequency/sample->Frequency);
|
||||
rp = (short*)(sample->Data + index);
|
||||
if ((size * sample->Frequency) / SoundFrequency > length) {
|
||||
size = (length * SoundFrequency / sample->Frequency);
|
||||
}
|
||||
|
||||
// mix mono, 16 bit sound to stereo, 32 bit
|
||||
for( ri=wi=0; wi<size; ) {
|
||||
ri=(wi*sample->Frequency)/SoundFrequency;
|
||||
ri/=2; // adjust for mono
|
||||
for (ri = wi = 0; wi < size;) {
|
||||
ri = (wi * sample->Frequency) / SoundFrequency;
|
||||
ri /= 2; // adjust for mono
|
||||
|
||||
// FIXME: must interpolate samples!
|
||||
v=rp[ri]*local_volume/256;
|
||||
v = rp[ri] * local_volume / 256;
|
||||
|
||||
buffer[wi++]+=v*left/128;
|
||||
buffer[wi++]+=v*right/128;
|
||||
buffer[wi++] += v * left / 128;
|
||||
buffer[wi++] += v * right / 128;
|
||||
}
|
||||
ri=(wi*sample->Frequency)/SoundFrequency;
|
||||
ri = (wi * sample->Frequency) / SoundFrequency;
|
||||
}
|
||||
|
||||
return ri;
|
||||
|
@ -329,7 +329,7 @@ local int MixSampleToStereo32(Sample* sample,int index,unsigned char volume,
|
|||
**
|
||||
** @return Number of bytes written in 'dest'
|
||||
*/
|
||||
global int ConvertToStereo32(const char *src, char *dest, int frequency,
|
||||
global int ConvertToStereo32(const char* src, char* dest, int frequency,
|
||||
int chansize, int channels, int bytes)
|
||||
{
|
||||
int s; // sample index
|
||||
|
@ -353,7 +353,7 @@ global int ConvertToStereo32(const char *src, char *dest, int frequency,
|
|||
for (c = 0; c < 2; ++c) {
|
||||
offset = (((s / 4) / freqratio) * samplesize + (c / chanratio) * chansize);
|
||||
if (chansize == 2) {
|
||||
*(short *)(dest + s + c*2) = *(short *)(src + offset);
|
||||
*(short*)(dest + s + c * 2) = *(short*)(src + offset);
|
||||
} else {
|
||||
*(dest + s + c * 2) = *(src + offset) + 128;
|
||||
*(dest + s + c * 2 + 1) = *(src + offset) + 128;
|
||||
|
@ -386,7 +386,7 @@ SelectionHandling SelectionHandler;
|
|||
#ifdef USE_GLIB
|
||||
local GHashTable* UnitToChannel;
|
||||
#else
|
||||
//local hashtable(int,61) UnitToChannel;
|
||||
//local hashtable(int, 61) UnitToChannel;
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -399,15 +399,16 @@ local int ViewPointOffset;
|
|||
*/
|
||||
local int HowManyFree(void)
|
||||
{
|
||||
int channel;
|
||||
int nb;
|
||||
nb=0;
|
||||
channel=NextFreeChannel;
|
||||
while(channel<MaxChannels) {
|
||||
nb++;
|
||||
channel=Channels[channel].Point;
|
||||
}
|
||||
return nb;
|
||||
int channel;
|
||||
int nb;
|
||||
|
||||
nb = 0;
|
||||
channel = NextFreeChannel;
|
||||
while(channel < MaxChannels) {
|
||||
++nb;
|
||||
channel = Channels[channel].Point;
|
||||
}
|
||||
return nb;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -417,14 +418,14 @@ local int KeepRequest(SoundRequest* sr) {
|
|||
//FIXME: take fight flag into account
|
||||
int channel;
|
||||
|
||||
if (sr->Sound==NO_SOUND) {
|
||||
if (sr->Sound == NO_SOUND) {
|
||||
return 0;
|
||||
}
|
||||
#ifdef USE_GLIB
|
||||
if ( (channel=(int)(long)g_hash_table_lookup(UnitToChannel,
|
||||
(gpointer)(sr->Source.Base))) ) {
|
||||
channel--;
|
||||
if (Channels[channel].Source.Id==sr->Source.Id) {
|
||||
if ((channel = (int)(long)g_hash_table_lookup(UnitToChannel,
|
||||
(gpointer)(sr->Source.Base)))) {
|
||||
--channel;
|
||||
if (Channels[channel].Source.Id == sr->Source.Id) {
|
||||
//FIXME: decision should take into account the sound
|
||||
return 0;
|
||||
}
|
||||
|
@ -432,19 +433,19 @@ local int KeepRequest(SoundRequest* sr) {
|
|||
}
|
||||
#else
|
||||
{
|
||||
const SoundChannel *theChannel;
|
||||
const SoundChannel* theChannel;
|
||||
|
||||
// slow but working solution: we look for the source in the channels
|
||||
theChannel=Channels;
|
||||
for(channel=0;channel<MaxChannels;channel++) {
|
||||
if ((*theChannel).Command == ChannelPlay
|
||||
&& (*theChannel).Source.Base==sr->Source.Base
|
||||
&& (*theChannel).Sound==sr->Sound
|
||||
&& (*theChannel).Source.Id==sr->Source.Id) {
|
||||
theChannel = Channels;
|
||||
for (channel = 0; channel < MaxChannels; ++channel) {
|
||||
if ((*theChannel).Command == ChannelPlay &&
|
||||
(*theChannel).Source.Base == sr->Source.Base &&
|
||||
(*theChannel).Sound == sr->Sound &&
|
||||
(*theChannel).Source.Id == sr->Source.Id) {
|
||||
//FIXME: decision should take into account the sound
|
||||
return 0;
|
||||
}
|
||||
theChannel++;
|
||||
++theChannel;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -454,21 +455,21 @@ local int KeepRequest(SoundRequest* sr) {
|
|||
/*
|
||||
** Register the source of a request in the selection handling hash table.
|
||||
*/
|
||||
local void RegisterSource(SoundRequest* sr,int channel)
|
||||
local void RegisterSource(SoundRequest* sr, int channel)
|
||||
{
|
||||
// always keep the last registered channel
|
||||
// use channel+1 to avoid inserting null values
|
||||
//FIXME: we should use here the unique identifier of the source, not only
|
||||
// the pointer
|
||||
#ifdef USE_GLIB
|
||||
g_hash_table_insert(UnitToChannel,(gpointer)(long)(sr->Source.Base),
|
||||
(gpointer)(channel+1));
|
||||
g_hash_table_insert(UnitToChannel, (gpointer)(long)(sr->Source.Base),
|
||||
(gpointer)(channel+1));
|
||||
#else
|
||||
int i;
|
||||
void* p;
|
||||
|
||||
i=channel;
|
||||
p=sr;
|
||||
i = channel;
|
||||
p = sr;
|
||||
DebugLevel3Fn("FIXME: must write %p -> %d\n" _C_ sr _C_ channel);
|
||||
#endif
|
||||
DebugLevel3("Registering %p (channel %d)\n" _C_ sr->Source.Base _C_ channel);
|
||||
|
@ -479,20 +480,19 @@ local void RegisterSource(SoundRequest* sr,int channel)
|
|||
*/
|
||||
local void UnRegisterSource(int channel) {
|
||||
#ifdef USE_GLIB
|
||||
if ( (int)(long)g_hash_table_lookup(UnitToChannel,
|
||||
(gpointer)(Channels[channel].Source.Base))
|
||||
==channel+1) {
|
||||
if ((int)(long)g_hash_table_lookup(UnitToChannel,
|
||||
(gpointer)(Channels[channel].Source.Base)) == channel + 1) {
|
||||
g_hash_table_remove(UnitToChannel,
|
||||
(gpointer)(long)(Channels[channel].Source.Base));
|
||||
(gpointer)(long)(Channels[channel].Source.Base));
|
||||
}
|
||||
#else
|
||||
int i;
|
||||
|
||||
i=channel;
|
||||
i = channel;
|
||||
DebugLevel3Fn("FIXME: must write %d\n" _C_ channel);
|
||||
#endif
|
||||
DebugLevel3("Removing %p (channel %d)\n" _C_ Channels[channel].Source.Base _C_
|
||||
channel);
|
||||
DebugLevel3("Removing %p (channel %d)\n" _C_
|
||||
Channels[channel].Source.Base _C_ channel);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -504,22 +504,24 @@ local void UnRegisterSource(int channel) {
|
|||
**
|
||||
** @return volume for given distance (0..??)
|
||||
*/
|
||||
local unsigned char VolumeForDistance(unsigned short d,unsigned char range) {
|
||||
local unsigned char VolumeForDistance(unsigned short d, unsigned char range) {
|
||||
int d_tmp;
|
||||
int range_tmp;
|
||||
|
||||
//FIXME: THIS IS SLOW!!!!!!!
|
||||
if (d <= ViewPointOffset || range==INFINITE_SOUND_RANGE)
|
||||
if (d <= ViewPointOffset || range==INFINITE_SOUND_RANGE) {
|
||||
return MaxVolume;
|
||||
else {
|
||||
} else {
|
||||
if (range) {
|
||||
d-=ViewPointOffset;
|
||||
d_tmp=d*MAX_SOUND_RANGE;
|
||||
range_tmp=DistanceSilent*range;
|
||||
d -= ViewPointOffset;
|
||||
d_tmp = d * MAX_SOUND_RANGE;
|
||||
range_tmp = DistanceSilent * range;
|
||||
DebugLevel3("Distance: %d, Range: %d\n" _C_ d_tmp _C_ range_tmp);
|
||||
if (d_tmp > range_tmp )
|
||||
if (d_tmp > range_tmp) {
|
||||
return 0;
|
||||
else
|
||||
return (unsigned char)((range_tmp-d_tmp)*MAX_SOUND_RANGE/range_tmp);
|
||||
} else {
|
||||
return (unsigned char)((range_tmp - d_tmp) * MAX_SOUND_RANGE / range_tmp);
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
@ -532,14 +534,14 @@ local unsigned char VolumeForDistance(unsigned short d,unsigned char range) {
|
|||
*/
|
||||
local unsigned char ComputeVolume(SoundRequest* sr) {
|
||||
if (sr->IsVolume) {
|
||||
if (sr->Power>MaxVolume) {
|
||||
if (sr->Power > MaxVolume) {
|
||||
return MaxVolume;
|
||||
} else {
|
||||
return (unsigned char)sr->Power;
|
||||
}
|
||||
} else {
|
||||
// map distance to volume
|
||||
return VolumeForDistance(sr->Power,((ServerSoundId)(sr->Sound))->Range);
|
||||
return VolumeForDistance(sr->Power, ((ServerSoundId)(sr->Sound))->Range);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -547,12 +549,12 @@ local unsigned char ComputeVolume(SoundRequest* sr) {
|
|||
** "Randomly" choose a sample from a sound group.
|
||||
*/
|
||||
local Sample* SimpleChooseSample(ServerSoundId sound) {
|
||||
if (sound->Number==ONE_SOUND) {
|
||||
if (sound->Number == ONE_SOUND) {
|
||||
return sound->Sound.OneSound;
|
||||
} else {
|
||||
//FIXME: check for errors
|
||||
//FIXME: valid only in shared memory context (FrameCounter)
|
||||
return sound->Sound.OneGroup[FrameCounter%sound->Number];
|
||||
return sound->Sound.OneGroup[FrameCounter % sound->Number];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -562,58 +564,60 @@ local Sample* SimpleChooseSample(ServerSoundId sound) {
|
|||
*/
|
||||
local Sample* ChooseSample(SoundRequest* sr)
|
||||
{
|
||||
ServerSoundId TheSound;
|
||||
Sample* Result=NO_SOUND;
|
||||
ServerSoundId theSound;
|
||||
Sample* result;
|
||||
|
||||
result = NO_SOUND;
|
||||
|
||||
if (sr->Sound!=NO_SOUND) {
|
||||
TheSound=(ServerSoundId)(sr->Sound);
|
||||
if (TheSound->Number==TWO_GROUPS) {
|
||||
if (sr->Sound != NO_SOUND) {
|
||||
theSound = (ServerSoundId)(sr->Sound);
|
||||
if (theSound->Number == TWO_GROUPS) {
|
||||
// handle a special sound (selection)
|
||||
if (SelectionHandler.Source.Base==sr->Source.Base
|
||||
&& SelectionHandler.Source.Id==sr->Source.Id) {
|
||||
if (SelectionHandler.Sound==TheSound->Sound.TwoGroups->First) {
|
||||
if (SelectionHandler.Source.Base == sr->Source.Base
|
||||
&& SelectionHandler.Source.Id == sr->Source.Id) {
|
||||
if (SelectionHandler.Sound == theSound->Sound.TwoGroups->First) {
|
||||
DebugLevel3("First group\n");
|
||||
Result=SimpleChooseSample(SelectionHandler.Sound);
|
||||
result = SimpleChooseSample(SelectionHandler.Sound);
|
||||
SelectionHandler.HowMany++;
|
||||
if (SelectionHandler.HowMany>=3) {
|
||||
SelectionHandler.HowMany=0;
|
||||
SelectionHandler.Sound=(ServerSoundId)TheSound->Sound.TwoGroups->Second;
|
||||
if (SelectionHandler.HowMany >= 3) {
|
||||
SelectionHandler.HowMany = 0;
|
||||
SelectionHandler.Sound = (ServerSoundId)theSound->Sound.TwoGroups->Second;
|
||||
DebugLevel3("Switching to second group\n");
|
||||
}
|
||||
} else {
|
||||
//FIXME: checks for error
|
||||
DebugLevel3("Second group\n");
|
||||
// check wether the second group is really a group
|
||||
if (SelectionHandler.Sound->Number>1) {
|
||||
Result=SelectionHandler.Sound->Sound.OneGroup[SelectionHandler.HowMany];
|
||||
if (SelectionHandler.Sound->Number > 1) {
|
||||
result = SelectionHandler.Sound->Sound.OneGroup[SelectionHandler.HowMany];
|
||||
SelectionHandler.HowMany++;
|
||||
if(SelectionHandler.HowMany>=SelectionHandler.Sound->Number) {
|
||||
SelectionHandler.HowMany=0;
|
||||
SelectionHandler.Sound=(ServerSoundId)TheSound->Sound.TwoGroups->First;
|
||||
if(SelectionHandler.HowMany >= SelectionHandler.Sound->Number) {
|
||||
SelectionHandler.HowMany = 0;
|
||||
SelectionHandler.Sound = (ServerSoundId)theSound->Sound.TwoGroups->First;
|
||||
DebugLevel3("Switching to first group\n");
|
||||
}
|
||||
} else {
|
||||
Result=SelectionHandler.Sound->Sound.OneSound;
|
||||
SelectionHandler.HowMany=0;
|
||||
SelectionHandler.Sound=(ServerSoundId)TheSound->Sound.TwoGroups->First;
|
||||
result = SelectionHandler.Sound->Sound.OneSound;
|
||||
SelectionHandler.HowMany = 0;
|
||||
SelectionHandler.Sound = (ServerSoundId)theSound->Sound.TwoGroups->First;
|
||||
DebugLevel3("Switching to first group\n");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SelectionHandler.Source=sr->Source;
|
||||
SelectionHandler.Sound=TheSound->Sound.TwoGroups->First;
|
||||
Result=SimpleChooseSample(SelectionHandler.Sound);
|
||||
SelectionHandler.HowMany=1;
|
||||
SelectionHandler.Source = sr->Source;
|
||||
SelectionHandler.Sound = theSound->Sound.TwoGroups->First;
|
||||
result = SimpleChooseSample(SelectionHandler.Sound);
|
||||
SelectionHandler.HowMany = 1;
|
||||
}
|
||||
} else {
|
||||
// normal sound/sound group handling
|
||||
Result=SimpleChooseSample(TheSound);
|
||||
result = SimpleChooseSample(theSound);
|
||||
if (sr->Selection) {
|
||||
SelectionHandler.Source=sr->Source;
|
||||
SelectionHandler.Source = sr->Source;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -621,9 +625,9 @@ local Sample* ChooseSample(SoundRequest* sr)
|
|||
*/
|
||||
global void FreeOneChannel(int channel)
|
||||
{
|
||||
Channels[channel].Command=ChannelFree;
|
||||
Channels[channel].Point=NextFreeChannel;
|
||||
NextFreeChannel=channel;
|
||||
Channels[channel].Command = ChannelFree;
|
||||
Channels[channel].Point = NextFreeChannel;
|
||||
NextFreeChannel = channel;
|
||||
if (Channels[channel].Source.Base) {
|
||||
// unregister only valid sources
|
||||
UnRegisterSource(channel);
|
||||
|
@ -639,17 +643,17 @@ local int FillOneChannel(SoundRequest* sr)
|
|||
int next_free;
|
||||
int old_free;
|
||||
|
||||
old_free=NextFreeChannel;
|
||||
if (NextFreeChannel<MaxChannels) {
|
||||
next_free=Channels[NextFreeChannel].Point;
|
||||
Channels[NextFreeChannel].Source=sr->Source;
|
||||
Channels[NextFreeChannel].Point=0;
|
||||
Channels[NextFreeChannel].Volume=ComputeVolume(sr);
|
||||
Channels[NextFreeChannel].Command=ChannelPlay;
|
||||
Channels[NextFreeChannel].Sound=sr->Sound;
|
||||
Channels[NextFreeChannel].Sample=ChooseSample(sr);
|
||||
Channels[NextFreeChannel].Stereo=sr->Stereo;
|
||||
NextFreeChannel=next_free;
|
||||
old_free = NextFreeChannel;
|
||||
if (NextFreeChannel < MaxChannels) {
|
||||
next_free = Channels[NextFreeChannel].Point;
|
||||
Channels[NextFreeChannel].Source = sr->Source;
|
||||
Channels[NextFreeChannel].Point = 0;
|
||||
Channels[NextFreeChannel].Volume = ComputeVolume(sr);
|
||||
Channels[NextFreeChannel].Command = ChannelPlay;
|
||||
Channels[NextFreeChannel].Sound = sr->Sound;
|
||||
Channels[NextFreeChannel].Sample = ChooseSample(sr);
|
||||
Channels[NextFreeChannel].Stereo = sr->Stereo;
|
||||
NextFreeChannel = next_free;
|
||||
} else {
|
||||
// should not happen
|
||||
DebugLevel0("***** NO FREE CHANNEL *****\n");
|
||||
|
@ -667,35 +671,35 @@ local void FillChannels(int free_channels,int* discarded,int* started)
|
|||
int channel;
|
||||
SoundRequest* sr;
|
||||
|
||||
sr=SoundRequests+NextSoundRequestOut;
|
||||
*discarded=0;
|
||||
*started=0;
|
||||
while(free_channels && sr->Used) {
|
||||
if(KeepRequest(sr)) {
|
||||
sr = SoundRequests+NextSoundRequestOut;
|
||||
*discarded = 0;
|
||||
*started = 0;
|
||||
while (free_channels && sr->Used) {
|
||||
if (KeepRequest(sr)) {
|
||||
DebugLevel3("Source [%p]: start playing request %p at slot %d\n" _C_
|
||||
sr->Source.Base _C_ sr->Sound _C_ NextSoundRequestOut);
|
||||
channel=FillOneChannel(sr);
|
||||
sr->Source.Base _C_ sr->Sound _C_ NextSoundRequestOut);
|
||||
channel = FillOneChannel(sr);
|
||||
if (sr->Source.Base) {
|
||||
//Register only sound with a valid origin
|
||||
RegisterSource(sr,channel);
|
||||
RegisterSource(sr, channel);
|
||||
}
|
||||
free_channels--;
|
||||
--free_channels;
|
||||
DebugLevel3("Free channels: %d\n" _C_ free_channels);
|
||||
sr->Used=0;
|
||||
NextSoundRequestOut++;
|
||||
sr->Used = 0;
|
||||
++NextSoundRequestOut;
|
||||
(*started)++;
|
||||
} else {
|
||||
// Discarding request (for whatever reason)
|
||||
DebugLevel3("Discarding resquest %p from %p at slot %d\n" _C_
|
||||
sr->Sound _C_ sr->Source.Base _C_ NextSoundRequestOut);
|
||||
sr->Used=0;
|
||||
NextSoundRequestOut++;
|
||||
sr->Sound _C_ sr->Source.Base _C_ NextSoundRequestOut);
|
||||
sr->Used = 0;
|
||||
++NextSoundRequestOut;
|
||||
(*discarded)++;
|
||||
}
|
||||
if(NextSoundRequestOut>=MAX_SOUND_REQUESTS) {
|
||||
NextSoundRequestOut=0;
|
||||
if(NextSoundRequestOut >= MAX_SOUND_REQUESTS) {
|
||||
NextSoundRequestOut = 0;
|
||||
}
|
||||
sr=SoundRequests+NextSoundRequestOut;
|
||||
sr = SoundRequests + NextSoundRequestOut;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -713,23 +717,22 @@ local int MixChannelsToStereo32(int* buffer,int size)
|
|||
int i;
|
||||
int new_free_channels;
|
||||
|
||||
new_free_channels=0;
|
||||
for( channel=0; channel<MaxChannels; ++channel ) {
|
||||
if( Channels[channel].Command==ChannelPlay
|
||||
&& Channels[channel].Sample) {
|
||||
i=MixSampleToStereo32(
|
||||
Channels[channel].Sample,Channels[channel].Point,
|
||||
Channels[channel].Volume,Channels[channel].Stereo,
|
||||
buffer,size);
|
||||
Channels[channel].Point+=i;
|
||||
new_free_channels = 0;
|
||||
for (channel = 0; channel < MaxChannels; ++channel) {
|
||||
if (Channels[channel].Command == ChannelPlay &&
|
||||
Channels[channel].Sample) {
|
||||
i = MixSampleToStereo32(Channels[channel].Sample,
|
||||
Channels[channel].Point, Channels[channel].Volume,
|
||||
Channels[channel].Stereo, buffer, size);
|
||||
Channels[channel].Point += i;
|
||||
|
||||
if( Channels[channel].Point>=Channels[channel].Sample->Length ) {
|
||||
if (Channels[channel].Point >= Channels[channel].Sample->Length) {
|
||||
// free channel as soon as possible (before playing)
|
||||
// useful in multithreading
|
||||
DebugLevel3("End playing request from %p\n" _C_
|
||||
Channels[channel].Source.Base);
|
||||
Channels[channel].Source.Base);
|
||||
FreeOneChannel(channel);
|
||||
new_free_channels++;
|
||||
++new_free_channels;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -737,7 +740,7 @@ local int MixChannelsToStereo32(int* buffer,int size)
|
|||
return new_free_channels;
|
||||
}
|
||||
|
||||
#if SoundSampleSize==8
|
||||
#if SoundSampleSize == 8
|
||||
/**
|
||||
** Clip mix to output stereo 8 unsigned bit.
|
||||
**
|
||||
|
@ -745,24 +748,24 @@ local int MixChannelsToStereo32(int* buffer,int size)
|
|||
** @param size number of samples in input.
|
||||
** @param output clipped 8 unsigned bit output buffer.
|
||||
*/
|
||||
local void ClipMixToStereo8(const int* mix,int size,unsigned char* output)
|
||||
local void ClipMixToStereo8(const int* mix, int size, unsigned char* output)
|
||||
{
|
||||
int s;
|
||||
|
||||
while( size-- ) {
|
||||
s=(*mix++)/256;
|
||||
if( s>127 ) {
|
||||
*output++=255;
|
||||
} else if( s<-127 ) {
|
||||
*output++=0;
|
||||
while (size--) {
|
||||
s = (*mix++) / 256;
|
||||
if (s > 127) {
|
||||
*output++ = 255;
|
||||
} else if (s < -127) {
|
||||
*output++ = 0;
|
||||
} else {
|
||||
*output++=s+127;
|
||||
*output++ = s + 127;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SoundSampleSize==16
|
||||
#if SoundSampleSize == 16
|
||||
/**
|
||||
** Clip mix to output stereo 16 signed bit.
|
||||
**
|
||||
|
@ -770,20 +773,20 @@ local void ClipMixToStereo8(const int* mix,int size,unsigned char* output)
|
|||
** @param size number of samples in input.
|
||||
** @param output clipped 16 signed bit output buffer.
|
||||
*/
|
||||
local void ClipMixToStereo16(const int* mix,int size,short* output)
|
||||
local void ClipMixToStereo16(const int* mix, int size, short* output)
|
||||
{
|
||||
int s;
|
||||
const int* end;
|
||||
|
||||
end=mix+size;
|
||||
while( mix<end ) {
|
||||
s=(*mix++);
|
||||
if( s>SHRT_MAX ) {
|
||||
*output++=SHRT_MAX;
|
||||
} else if( s<SHRT_MIN ) {
|
||||
*output++=SHRT_MIN;
|
||||
end = mix + size;
|
||||
while (mix < end) {
|
||||
s = (*mix++);
|
||||
if (s > SHRT_MAX) {
|
||||
*output++ = SHRT_MAX;
|
||||
} else if (s < SHRT_MIN) {
|
||||
*output++ = SHRT_MIN;
|
||||
} else {
|
||||
*output++=s;
|
||||
*output++ = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -857,15 +860,15 @@ local Sample* LoadSample(const char* name)
|
|||
** @todo FIXME: Must handle the errors better.
|
||||
** FIXME: Support for more sample files (ogg/flac/mp3).
|
||||
*/
|
||||
global SoundId RegisterSound(char *files[], unsigned number)
|
||||
global SoundId RegisterSound(char* files[], unsigned number)
|
||||
{
|
||||
unsigned i;
|
||||
ServerSoundId id;
|
||||
|
||||
id = malloc(sizeof(*id));
|
||||
if (number > 1) { // load a sound group
|
||||
id->Sound.OneGroup = malloc(sizeof(Sample *) * number);
|
||||
for (i = 0; i < number; i++) {
|
||||
id->Sound.OneGroup = malloc(sizeof(Sample*) * number);
|
||||
for (i = 0; i < number; ++i) {
|
||||
DebugLevel3("Registering `%s'\n" _C_ files[i]);
|
||||
id->Sound.OneGroup[i] = LoadSample(files[i]);
|
||||
if (!id->Sound.OneGroup[i]) {
|
||||
|
@ -885,7 +888,7 @@ global SoundId RegisterSound(char *files[], unsigned number)
|
|||
id->Number = ONE_SOUND;
|
||||
}
|
||||
id->Range = MAX_SOUND_RANGE;
|
||||
return (SoundId) id;
|
||||
return (SoundId)id;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -903,9 +906,9 @@ global SoundId RegisterTwoGroups(SoundId first, SoundId second)
|
|||
if (first == NO_SOUND || second == NO_SOUND) {
|
||||
return NO_SOUND;
|
||||
}
|
||||
id = (ServerSoundId) malloc(sizeof(*id));
|
||||
id = (ServerSoundId)malloc(sizeof(*id));
|
||||
id->Number = TWO_GROUPS;
|
||||
id->Sound.TwoGroups = (TwoGroups *) malloc(sizeof(TwoGroups));
|
||||
id->Sound.TwoGroups = (TwoGroups*)malloc(sizeof(TwoGroups));
|
||||
id->Sound.TwoGroups->First = first;
|
||||
id->Sound.TwoGroups->Second = second;
|
||||
id->Range = MAX_SOUND_RANGE;
|
||||
|
@ -934,31 +937,31 @@ global void SetSoundRange(SoundId sound, unsigned char range)
|
|||
** enough.
|
||||
** @param samples Number of samples.
|
||||
*/
|
||||
global void MixIntoBuffer(void* buffer,int samples)
|
||||
global void MixIntoBuffer(void* buffer, int samples)
|
||||
{
|
||||
int* mixer_buffer;
|
||||
int free_channels;
|
||||
int dummy1;
|
||||
int dummy2;
|
||||
|
||||
free_channels=HowManyFree();
|
||||
FillChannels(free_channels,&dummy1,&dummy2);
|
||||
free_channels = HowManyFree();
|
||||
FillChannels(free_channels, &dummy1, &dummy2);
|
||||
|
||||
// Create empty mixer buffer
|
||||
mixer_buffer=alloca(samples*sizeof(*mixer_buffer));
|
||||
mixer_buffer = alloca(samples * sizeof(*mixer_buffer));
|
||||
// FIXME: can save the memset here, if first channel sets the values
|
||||
memset(mixer_buffer,0,samples*sizeof(*mixer_buffer));
|
||||
memset(mixer_buffer, 0, samples * sizeof(*mixer_buffer));
|
||||
|
||||
// Add channels to mixer buffer
|
||||
MixChannelsToStereo32(mixer_buffer,samples);
|
||||
MixChannelsToStereo32(mixer_buffer, samples);
|
||||
// Add music to mixer buffer
|
||||
MixMusicToStereo32(mixer_buffer,samples);
|
||||
MixMusicToStereo32(mixer_buffer, samples);
|
||||
|
||||
#if SoundSampleSize==8
|
||||
ClipMixToStereo8(mixer_buffer,samples,buffer);
|
||||
#if SoundSampleSize == 8
|
||||
ClipMixToStereo8(mixer_buffer, samples, buffer);
|
||||
#endif
|
||||
#if SoundSampleSize==16
|
||||
ClipMixToStereo16(mixer_buffer,samples,buffer);
|
||||
ClipMixToStereo16(mixer_buffer, samples, buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -968,10 +971,10 @@ global void MixIntoBuffer(void* buffer,int samples)
|
|||
*/
|
||||
global void WriteSound(void)
|
||||
{
|
||||
#if SoundSampleSize==8
|
||||
#if SoundSampleSize == 8
|
||||
char buffer[1024];
|
||||
#endif
|
||||
#if SoundSampleSize==16
|
||||
#if SoundSampleSize == 16
|
||||
short buffer[1024];
|
||||
#endif
|
||||
|
||||
|
@ -983,17 +986,17 @@ global void WriteSound(void)
|
|||
|
||||
DebugLevel3Fn("\n");
|
||||
|
||||
if( 0 ) {
|
||||
if (0) {
|
||||
audio_buf_info info;
|
||||
|
||||
ioctl(SoundFildes,SNDCTL_DSP_GETOSPACE,&info);
|
||||
ioctl(SoundFildes, SNDCTL_DSP_GETOSPACE, &info);
|
||||
DebugLevel0("%lu Free bytes %d\n" _C_ GameCycle _C_ info.bytes);
|
||||
if( info.bytes<(int)sizeof(buffer) ) {
|
||||
if (info.bytes < (int)sizeof(buffer)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
MixIntoBuffer(buffer,sizeof(buffer)/sizeof(*buffer));
|
||||
MixIntoBuffer(buffer, sizeof(buffer) / sizeof(*buffer));
|
||||
|
||||
#ifdef WITH_ARTSC
|
||||
if (WriteArtsSound(buffer, sizeof(buffer)) < 0) {
|
||||
|
@ -1001,8 +1004,8 @@ global void WriteSound(void)
|
|||
|
||||
}
|
||||
#else
|
||||
while( write(SoundFildes,buffer,sizeof(buffer))==-1 ) {
|
||||
switch( errno ) {
|
||||
while (write(SoundFildes, buffer, sizeof(buffer)) == -1) {
|
||||
switch (errno) {
|
||||
case EAGAIN:
|
||||
case EINTR:
|
||||
continue;
|
||||
|
@ -1029,14 +1032,14 @@ global void WriteSound(void)
|
|||
** @param stream pointer to buffer you want to fill with information.
|
||||
** @param len is length of audio buffer in bytes.
|
||||
*/
|
||||
global void FillAudio(void* udata __attribute__((unused)),Uint8* stream,int len)
|
||||
global void FillAudio(void* udata __attribute__((unused)), Uint8* stream, int len)
|
||||
{
|
||||
#if SoundSampleSize==16
|
||||
len>>=1;
|
||||
#if SoundSampleSize == 16
|
||||
len >>= 1;
|
||||
#endif
|
||||
DebugLevel3Fn("%d\n" _C_ len);
|
||||
|
||||
MixIntoBuffer(stream,len);
|
||||
MixIntoBuffer(stream, len);
|
||||
}
|
||||
#endif // } USE_SDLA
|
||||
|
||||
|
@ -1048,10 +1051,10 @@ global void FillAudio(void* udata __attribute__((unused)),Uint8* stream,int len)
|
|||
global void WriteSoundThreaded(void)
|
||||
{
|
||||
int mixer_buffer[1024];
|
||||
#if SoundSampleSize==8
|
||||
#if SoundSampleSize == 8
|
||||
char buffer[1024];
|
||||
#endif
|
||||
#if SoundSampleSize==16
|
||||
#if SoundSampleSize == 16
|
||||
short buffer[1024];
|
||||
#endif
|
||||
int new_free_channels;
|
||||
|
@ -1082,16 +1085,16 @@ global void WriteSoundThreaded(void)
|
|||
|
||||
if (how_many_playing) {
|
||||
new_free_channels = MixChannelsToStereo32(mixer_buffer,
|
||||
sizeof(mixer_buffer) / sizeof(int));
|
||||
sizeof(mixer_buffer) / sizeof(int));
|
||||
}
|
||||
MixMusicToStereo32(mixer_buffer,
|
||||
sizeof(mixer_buffer) / sizeof(int));
|
||||
|
||||
#if SoundSampleSize==8
|
||||
#if SoundSampleSize == 8
|
||||
ClipMixToStereo8(mixer_buffer, sizeof(mixer_buffer) / sizeof(int),
|
||||
buffer);
|
||||
#endif
|
||||
#if SoundSampleSize==16
|
||||
#if SoundSampleSize == 16
|
||||
ClipMixToStereo16(mixer_buffer, sizeof(mixer_buffer) / sizeof(int),
|
||||
buffer);
|
||||
#endif
|
||||
|
@ -1119,7 +1122,7 @@ global void WriteSoundThreaded(void)
|
|||
new_free_channels);
|
||||
new_free_channels += discarded_request;
|
||||
// decrement semaphore by the number of stopped channels
|
||||
for (; new_free_channels > 0; new_free_channels--) {
|
||||
for (; new_free_channels > 0; --new_free_channels) {
|
||||
// sem_getvalue(&SoundThreadChannelSemaphore,&tmp);
|
||||
// DebugLevel3("SoundSemaphore: %d\n" _C_ tmp);
|
||||
sem_wait(&SoundThreadChannelSemaphore);
|
||||
|
@ -1142,8 +1145,8 @@ global int InitSound(void)
|
|||
//
|
||||
// Open sound device, 8bit samples, stereo.
|
||||
//
|
||||
if( InitSdlSound(SoundDeviceName,SoundFrequency,SoundSampleSize,
|
||||
WaitForSoundDevice) ) {
|
||||
if (InitSdlSound(SoundDeviceName, SoundFrequency, SoundSampleSize,
|
||||
WaitForSoundDevice)) {
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
|
@ -1151,15 +1154,15 @@ global int InitSound(void)
|
|||
//
|
||||
// Connect to artsd, 8bit samples, stereo.
|
||||
//
|
||||
if( InitArtsSound(SoundFrequency,SoundSampleSize) ) {
|
||||
if (InitArtsSound(SoundFrequency, SoundSampleSize)) {
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
//
|
||||
// Open dsp device, 8bit samples, stereo.
|
||||
//
|
||||
if( InitOssSound(SoundDeviceName,SoundFrequency,SoundSampleSize,
|
||||
WaitForSoundDevice) ) {
|
||||
if (InitOssSound(SoundDeviceName, SoundFrequency, SoundSampleSize,
|
||||
WaitForSoundDevice)) {
|
||||
return 1;
|
||||
}
|
||||
#endif // WITH_ARTSC
|
||||
|
@ -1168,14 +1171,14 @@ global int InitSound(void)
|
|||
// ARI: The following must be done here to allow sound to work in
|
||||
// pre-start menus!
|
||||
// initialize channels
|
||||
for(dummy=0;dummy<MaxChannels; ++dummy) {
|
||||
Channels[dummy].Point=dummy+1;
|
||||
for (dummy = 0; dummy < MaxChannels; ++dummy) {
|
||||
Channels[dummy].Point = dummy + 1;
|
||||
}
|
||||
|
||||
// initialize unit to channel hash table
|
||||
// WARNING: creation is only valid for a hash table using pointers as key
|
||||
#ifdef USE_GLIB
|
||||
UnitToChannel=g_hash_table_new(g_direct_hash,NULL);
|
||||
UnitToChannel = g_hash_table_new(g_direct_hash, NULL);
|
||||
#else
|
||||
DebugLevel0Fn("FIXME: must write non GLIB hash functions\n");
|
||||
#endif
|
||||
|
@ -1195,35 +1198,35 @@ global int InitSoundServer(void)
|
|||
int MapWidth;
|
||||
int MapHeight;
|
||||
|
||||
MapWidth = (TheUI.MapArea.EndX-TheUI.MapArea.X +TileSizeX) / TileSizeX;
|
||||
MapHeight = (TheUI.MapArea.EndY-TheUI.MapArea.Y +TileSizeY) / TileSizeY;
|
||||
MapWidth = (TheUI.MapArea.EndX - TheUI.MapArea.X + TileSizeX) / TileSizeX;
|
||||
MapHeight = (TheUI.MapArea.EndY - TheUI.MapArea.Y + TileSizeY) / TileSizeY;
|
||||
//FIXME: Valid only in shared memory context!
|
||||
DistanceSilent=3*max(MapWidth,MapHeight);
|
||||
DistanceSilent = 3 * max(MapWidth, MapHeight);
|
||||
DebugLevel2("Distance Silent: %d\n" _C_ DistanceSilent);
|
||||
ViewPointOffset=max(MapWidth/2,MapHeight/2);
|
||||
ViewPointOffset = max(MapWidth / 2, MapHeight / 2);
|
||||
DebugLevel2("ViewPointOffset: %d\n" _C_ ViewPointOffset);
|
||||
|
||||
#ifdef USE_THREAD
|
||||
if (WithSoundThread) {
|
||||
//prepare for the sound thread
|
||||
if( sem_init(&SoundThreadChannelSemaphore,0,0) ) {
|
||||
if (sem_init(&SoundThreadChannelSemaphore, 0, 0)) {
|
||||
//FIXME: better error handling
|
||||
PrintFunction();
|
||||
// FIXME: ARI: strerror_r() is better here, but not compatible
|
||||
fprintf(stdout, "%s\n", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
if( pthread_create(&SoundThread,NULL,(void *)&WriteSoundThreaded,NULL) ) {
|
||||
if (pthread_create(&SoundThread, NULL, (void*)&WriteSoundThreaded, NULL)) {
|
||||
//FIXME: better error handling
|
||||
PrintFunction();
|
||||
fprintf(stdout, "%s\n", strerror(errno));
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
return 1;
|
||||
}
|
||||
SoundThreadRunning=1;
|
||||
SoundThreadRunning = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1237,14 +1240,14 @@ global void QuitSound(void)
|
|||
{
|
||||
#ifdef USE_SDLA
|
||||
SDL_CloseAudio();
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
#else
|
||||
#ifdef WITH_ARTSC
|
||||
ExitArtsSound();
|
||||
#else // ! WITH_ARTSC
|
||||
if (SoundFildes != -1) {
|
||||
close(SoundFildes);
|
||||
SoundFildes=-1;
|
||||
SoundFildes = -1;
|
||||
}
|
||||
#endif // WITH_ARTSC
|
||||
#endif // USE_SDLA
|
||||
|
|
Loading…
Add table
Reference in a new issue