summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoregladil <egladil@openttd.org>2007-11-07 21:35:33 +0000
committeregladil <egladil@openttd.org>2007-11-07 21:35:33 +0000
commitcd5597dddf6ec33d9c2bd1db1a892267e9acbc9e (patch)
treebe0a6d5de09021779c127a919cfe99eac6421412
parent015454198226049694037f1b85af0b6d44318351 (diff)
downloadopenttd-cd5597dddf6ec33d9c2bd1db1a892267e9acbc9e.tar.xz
(svn r11389) -Fix [FS#1386]: Replace calls to deprecated API with newer ones and handle broken iconv declaration in OSX 10.5.
-rw-r--r--config.lib30
-rw-r--r--src/music/qtmidi.cpp38
-rw-r--r--src/os/macosx/macos.mm2
-rw-r--r--src/sound/cocoa_s.cpp22
-rw-r--r--src/unix.cpp2
5 files changed, 51 insertions, 43 deletions
diff --git a/config.lib b/config.lib
index db9d009e6..bfe933839 100644
--- a/config.lib
+++ b/config.lib
@@ -1008,6 +1008,10 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS -I$with_iconv/include"
LIBS="$LIBS -L$with_iconv/lib"
fi
+
+ if [ "$have_broken_iconv" != "no" ]; then
+ CFLAGS="$CFLAGS -DHAVE_BROKEN_ICONV"
+ fi
fi
if [ -n "$with_midi" ]; then
@@ -1854,6 +1858,32 @@ detect_iconv() {
log 2 "found iconv in $iconv"
log 1 "checking iconv... found"
+
+ # Check if we need to work around buggy iconv implementation where inbuf
+ # is wrongly typed as non-const. Correct implementation is at
+ # http://www.opengroup.org/onlinepubs/007908799/xsh/iconv.html
+
+ cat > tmp.iconv.cpp << EOF
+#include "src/stdafx.h"
+#include <iconv.h>
+int main() {
+ static char buf[1024];
+ iconv_t convd = 0;
+ const char *inbuf = "";
+ char *outbuf = buf;
+ size_t outlen = 1023;
+ size_t inlen = 0;
+ return iconv(convd, &inbuf, &inlen, &outbuf, &outlen);
+}
+EOF
+ execute="$cxx_host $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
+ eval $execute >&/dev/null
+ ret=$?
+ log 2 "executing $execute"
+ log 2 " exit code $ret"
+ if [ "$ret" = "0" ]; then have_broken_iconv="no"; else have_broken_iconv="yes"; fi
+ log 1 "checking if iconv has non-const inbuf... $have_broken_iconv"
+ rm -f tmp.iconv tmp.iconv.cpp
}
_detect_sort() {
diff --git a/src/music/qtmidi.cpp b/src/music/qtmidi.cpp
index 12ec0aa03..88a1b49dd 100644
--- a/src/music/qtmidi.cpp
+++ b/src/music/qtmidi.cpp
@@ -55,48 +55,24 @@ enum {
/**
- * Converts a Unix-like pathname to a @c FSSpec structure which may be
- * used with functions from several MacOS X frameworks (Carbon, QuickTime,
- * etc). The pointed file or directory must exist.
- *
- * @param *path A string containing a Unix-like path.
- * @param *spec Pointer to a @c FSSpec structure where the result will be
- * stored.
- * @return Wether the conversion was successful.
- */
-static bool PathToFSSpec(const char *path, FSSpec *spec)
-{
- FSRef ref;
- assert(spec != NULL);
- assert(path != NULL);
-
- return
- FSPathMakeRef((UInt8*)path, &ref, NULL) == noErr &&
- FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL) == noErr;
-}
-
-
-/**
* Sets the @c OSType of a given file to @c 'Midi', but only if it's not
* already set.
*
* @param *spec A @c FSSpec structure referencing a file.
*/
-static void SetMIDITypeIfNeeded(const FSSpec *spec)
+static void SetMIDITypeIfNeeded(const FSRef *ref)
{
- FSRef ref;
FSCatalogInfo catalogInfo;
- assert(spec);
+ assert(ref);
- if (noErr != FSpMakeFSRef(spec, &ref)) return;
- if (noErr != FSGetCatalogInfo(&ref, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL)) return;
+ if (noErr != FSGetCatalogInfo(ref, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL)) return;
if (!(catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)) {
FileInfo * const info = (FileInfo *) catalogInfo.finderInfo;
if (info->fileType != midiType && !(info->finderFlags & kIsAlias)) {
OSErr e;
info->fileType = midiType;
- e = FSSetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catalogInfo);
+ e = FSSetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo);
if (e == noErr) {
DEBUG(driver, 3, "qtmidi: changed filetype to 'Midi'");
} else {
@@ -119,6 +95,7 @@ static bool LoadMovieForMIDIFile(const char *path, Movie *moov)
int fd;
int ret;
char magic[4];
+ FSRef fsref;
FSSpec fsspec;
short refnum = 0;
short resid = 0;
@@ -144,9 +121,10 @@ static bool LoadMovieForMIDIFile(const char *path, Movie *moov)
if (magic[0] != 'M' || magic[1] != 'T' || magic[2] != 'h' || magic[3] != 'd')
return false;
- if (!PathToFSSpec(path, &fsspec)) return false;
- SetMIDITypeIfNeeded(&fsspec);
+ if (noErr != FSPathMakeRef((const UInt8 *) path, &fsref, NULL)) return false;
+ SetMIDITypeIfNeeded(&fsref);
+ if (noErr != FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL)) return false;
if (OpenMovieFile(&fsspec, &refnum, fsRdPerm) != noErr) return false;
DEBUG(driver, 3, "qtmidi: '%s' successfully opened", path);
diff --git a/src/os/macosx/macos.mm b/src/os/macosx/macos.mm
index 5defc392d..22bf8a987 100644
--- a/src/os/macosx/macos.mm
+++ b/src/os/macosx/macos.mm
@@ -168,6 +168,6 @@ const char *GetCurrentLocale(const char *)
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
/* preferredLang is either 2 or 5 characters long ("xx" or "xx_YY"). */
- strncpy(retbuf, [preferredLang cString], 31);
+ [ preferredLang getCString:retbuf maxLength:32 encoding:NSASCIIStringEncoding ];
return retbuf;
}
diff --git a/src/sound/cocoa_s.cpp b/src/sound/cocoa_s.cpp
index 7e2c7d034..890761ebc 100644
--- a/src/sound/cocoa_s.cpp
+++ b/src/sound/cocoa_s.cpp
@@ -31,9 +31,9 @@ static FSoundDriver_Cocoa iFSoundDriver_Cocoa;
static AudioUnit _outputAudioUnit;
/* The CoreAudio callback */
-static OSStatus audioCallback(void *inRefCon, AudioUnitRenderActionFlags inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, AudioBuffer *ioData)
+static OSStatus audioCallback(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData)
{
- MxMixSamples(ioData->mData, ioData->mDataByteSize / 4);
+ MxMixSamples(ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / 4);
return noErr;
}
@@ -43,7 +43,7 @@ const char *SoundDriver_Cocoa::Start(const char * const *parm)
{
Component comp;
ComponentDescription desc;
- struct AudioUnitInputCallback callback;
+ struct AURenderCallbackStruct callback;
AudioStreamBasicDescription requestedDesc;
/* Setup a AudioStreamBasicDescription with the requested format */
@@ -65,9 +65,9 @@ const char *SoundDriver_Cocoa::Start(const char * const *parm)
/* Locate the default output audio unit */
- desc.componentType = kAudioUnitComponentType;
- desc.componentSubType = kAudioUnitSubType_Output;
- desc.componentManufacturer = kAudioUnitID_DefaultOutput;
+ desc.componentType = kAudioUnitType_Output;
+ desc.componentSubType = kAudioUnitSubType_HALOutput;
+ desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
@@ -93,8 +93,8 @@ const char *SoundDriver_Cocoa::Start(const char * const *parm)
/* Set the audio callback */
callback.inputProc = audioCallback;
callback.inputProcRefCon = NULL;
- if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetInputCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
- return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetInputCallback)";
+ if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
+ return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback)";
}
/* Finally, start processing of the audio unit */
@@ -109,7 +109,7 @@ const char *SoundDriver_Cocoa::Start(const char * const *parm)
void SoundDriver_Cocoa::Stop()
{
- struct AudioUnitInputCallback callback;
+ struct AURenderCallbackStruct callback;
/* stop processing the audio unit */
if (AudioOutputUnitStop(_outputAudioUnit) != noErr) {
@@ -120,8 +120,8 @@ void SoundDriver_Cocoa::Stop()
/* Remove the input callback */
callback.inputProc = 0;
callback.inputProcRefCon = 0;
- if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetInputCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
- DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetInputCallback) failed");
+ if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)) != noErr) {
+ DEBUG(driver, 0, "cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback) failed");
return;
}
diff --git a/src/unix.cpp b/src/unix.cpp
index 9808503dd..3933352e6 100644
--- a/src/unix.cpp
+++ b/src/unix.cpp
@@ -230,7 +230,7 @@ static const char *convert_tofrom_fs(iconv_t convd, const char *name)
/* Work around buggy iconv implementation where inbuf is wrongly typed as
* non-const. Correct implementation is at
* http://www.opengroup.org/onlinepubs/007908799/xsh/iconv.html */
-#if defined (__GLIBC__) || defined (__GNU_LIBRARY__)
+#ifdef HAVE_BROKEN_ICONV
char *inbuf = (char*)name;
#else
const char *inbuf = name;