Codebase list wildmidi / 66c630d
New upstream version 0.4.1 Bret Curtis 6 years ago
59 changed file(s) with 2668 addition(s) and 833 deletion(s). Raw diff Collapse all Expand all
0 Edit files for version number (and possibly other changes) :
1 - djgpp/config.h
2 - os2/config.h
3 - amiga/config.h
4 - android/jni/config.h
5
6 Edit files for possibly other changes:
7 - djgpp/Makefile
8 - os2/makefile
9 - amiga/Makefile*
10 - amiga/*.cfg
11 - android/*
12 - android/jni/*.mk
2626
2727 # config files
2828 include/config.h
29 wildmidi.pc
0 os:
1 - linux
2 - osx
3 osx_image: xcode7.2
4 dist: trusty
5 sudo: required
06 language: c
1 compiler:
2 - gcc
3 - clang
47 env:
58 - BUILD_TYPE=Debug
69 - BUILD_TYPE=Release
710 matrix:
8 allow_failures:
9 - compiler: clang
11 include:
12 - os: linux
13 env:
14 ANALYZE="scan-build-3.6 --use-cc clang-3.6 --use-c++ clang++-3.6 "
15 compiler: clang
1016 branches:
1117 only:
1218 - master
19 - coverity_scan
1320 - /wildmidi-.*$/
21
1422 before_install:
15 - pwd
16 - git submodule update --init --recursive
17 - echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
18 - echo "yes" | sudo apt-add-repository ppa:psi29a/precise
19 - sudo apt-get update -qq
20 - sudo apt-get install -qq cmake
21 - sudo apt-get install -qq libgtest-dev google-mock
22 - sudo apt-get install -qq libasound2-dev libopenal-dev
23 - sudo mkdir /usr/src/gtest/build
24 - cd /usr/src/gtest/build
25 - sudo cmake .. -DBUILD_SHARED_LIBS=1
26 - sudo make -j4
27 - sudo ln -s /usr/src/gtest/build/libgtest.so /usr/lib/libgtest.so
28 - sudo ln -s /usr/src/gtest/build/libgtest_main.so /usr/lib/libgtest_main.so
23 - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./CI/before_install.linux.sh; fi
24 - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then ./CI/before_install.osx.sh; fi
2925 before_script:
30 - cd -
31 - mkdir build
32 - cd build
33 - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE ..
26 - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./CI/before_script.linux.sh; fi
27 - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then ./CI/before_script.osx.sh; fi
3428 script:
35 - make -j2
29 - cd ./build
30 - if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then ${ANALYZE}make -j3; fi
3631
37 #after_script:
38 # - ./runtests
3932 notifications:
4033 irc:
4134 channels:
0 #!/bin/sh
1
2 if [ "${ANALYZE}" ]; then
3 echo "yes" | sudo add-apt-repository "deb http://llvm.org/apt/`lsb_release -sc`/ llvm-toolchain-`lsb_release -sc`-3.6 main"
4 wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key|sudo apt-key add -
5 fi
6
7 echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
8 echo "yes" | sudo apt-add-repository ppa:psi29a/`lsb_release -sc`
9 sudo apt-get update -qq
10 sudo apt-get install -qq libgtest-dev google-mock
11 sudo apt-get install -qq libopenal-dev
12 if [ "${ANALYZE}" ]; then sudo apt-get install -qq clang-3.6; fi
13 sudo mkdir /usr/src/gtest/build
14 cd /usr/src/gtest/build
15 sudo cmake ..
16 sudo make -j4
17 sudo ln -s /usr/src/gtest/build/libgtest.so /usr/lib/libgtest.so
18 sudo ln -s /usr/src/gtest/build/libgtest_main.so /usr/lib/libgtest_main.so
0 #!/bin/sh
1
2 brew update
3 brew rm cmake || true
4 brew rm pkgconfig || true
5 brew install cmake pkgconfig
0 #!/bin/sh
1
2 free -m
3 mkdir build
4 cd build
5 export CODE_COVERAGE=1
6 if [ "${CC}" = "clang" ]; then export CODE_COVERAGE=0; fi
7 ${ANALYZE}cmake .. -DBUILD_WITH_CODE_COVERAGE=${CODE_COVERAGE} -DBUILD_UNITTESTS=1 -DCMAKE_INSTALL_PREFIX=/usr -DBINDIR=/usr/bin -DCMAKE_BUILD_TYPE="None"
0 #!/bin/bash
1
2 while [ $# -gt 0 ]; do
3 ARGSTR=$1
4 shift
5
6 if [ ${ARGSTR:0:1} != "-" ]; then
7 echo "Unknown argument $ARGSTR"
8 echo "Try '$0 -h'"
9 exit 1
10 fi
11
12 for (( i=1; i<${#ARGSTR}; i++ )); do
13 ARG=${ARGSTR:$i:1}
14 case $ARG in
15 V )
16 VERBOSE=true ;;
17
18 v )
19 VS_VERSION=$1
20 shift ;;
21
22 d )
23 SKIP_DOWNLOAD=true ;;
24
25 e )
26 SKIP_EXTRACT=true ;;
27
28 k )
29 KEEP=true ;;
30
31 u )
32 UNITY_BUILD=true ;;
33
34 p )
35 PLATFORM=$1
36 shift ;;
37
38 c )
39 CONFIGURATION=$1
40 shift ;;
41
42 h )
43 cat <<EOF
44 Usage: $0 [-cdehkpuvV]
45
46 Options:
47 -c <Release/Debug>
48 Set the configuration, can also be set with environment variable CONFIGURATION.
49 -d
50 Skip checking the downloads.
51 -e
52 Skip extracting dependencies.
53 -h
54 Show this message.
55 -k
56 Keep the old build directory, default is to delete it.
57 -p <Win32/Win64>
58 Set the build platform, can also be set with environment variable PLATFORM.
59 -u
60 Configure for unity builds.
61 -v <2013/2015>
62 Choose the Visual Studio version to use.
63 -V
64 Run verbosely
65 EOF
66 exit 0
67 ;;
68
69 * )
70 echo "Unknown argument $ARG."
71 echo "Try '$0 -h'"
72 exit 1 ;;
73 esac
74 done
75 done
76
77 if [ -z $VERBOSE ]; then
78 STRIP="> /dev/null 2>&1"
79 fi
80 if [ -z $VS_VERSION ]; then
81 VS_VERSION="2013"
82 fi
83
84 if [ -z $APPVEYOR ]; then
85 echo "Running prebuild outside of Appveyor."
86
87 DIR=$(echo "$0" | sed "s,\\\\,/,g" | sed "s,\(.\):,/\\1,")
88 cd $(dirname "$DIR")/..
89 else
90 echo "Running prebuild in Appveyor."
91
92 cd $APPVEYOR_BUILD_FOLDER
93 VERSION="$(cat README.md | grep Version: | awk '{ print $3; }')-$(git rev-parse --short HEAD)"
94 appveyor UpdateBuild -Version "$VERSION" > /dev/null &
95 fi
96
97 run_cmd() {
98 CMD="$1"
99 shift
100
101 if [ -z $VERBOSE ]; then
102 eval $CMD $@ > output.log 2>&1
103 RET=$?
104
105 if [ $RET -ne 0 ]; then
106 if [ -z $APPVEYOR ]; then
107 echo "Command $CMD failed, output can be found in `real_pwd`/output.log"
108 else
109 echo
110 echo "Command $CMD failed;"
111 cat output.log
112 fi
113 else
114 rm output.log
115 fi
116
117 return $RET
118 else
119 eval $CMD $@
120 return $?
121 fi
122 }
123
124 download() {
125 if [ $# -lt 3 ]; then
126 echo "Invalid parameters to download."
127 return 1
128 fi
129
130 NAME=$1
131 shift
132
133 echo "$NAME..."
134
135 while [ $# -gt 1 ]; do
136 URL=$1
137 FILE=$2
138 shift
139 shift
140
141 if ! [ -f $FILE ]; then
142 printf " Downloading $FILE... "
143
144 if [ -z $VERBOSE ]; then
145 curl --silent --retry 10 -kLy 5 -o $FILE $URL
146 RET=$?
147 else
148 curl --retry 10 -kLy 5 -o $FILE $URL
149 RET=$?
150 fi
151
152 if [ $RET -ne 0 ]; then
153 echo "Failed!"
154 else
155 echo "Done."
156 fi
157 else
158 echo " $FILE exists, skipping."
159 fi
160 done
161
162 if [ $# -ne 0 ]; then
163 echo "Missing parameter."
164 fi
165 }
166
167 real_pwd() {
168 pwd | sed "s,/\(.\),\1:,"
169 }
170
171 CMAKE_OPTS=""
172 add_cmake_opts() {
173 CMAKE_OPTS="$CMAKE_OPTS $@"
174 }
175
176 RUNTIME_DLLS=""
177 add_runtime_dlls() {
178 RUNTIME_DLLS="$RUNTIME_DLLS $@"
179 }
180
181 OSG_PLUGINS=""
182 add_osg_dlls() {
183 OSG_PLUGINS="$OSG_PLUGINS $@"
184 }
185
186 if [ -z $PLATFORM ]; then
187 PLATFORM=`uname -m`
188 fi
189
190 if [ -z $CONFIGURATION ]; then
191 CONFIGURATION="Debug"
192 fi
193
194 case $VS_VERSION in
195 14|2015 )
196 GENERATOR="Visual Studio 14 2015"
197 XP_TOOLSET="v140_xp"
198 ;;
199
200 # 12|2013|
201 * )
202 GENERATOR="Visual Studio 12 2013"
203 XP_TOOLSET="v120_xp"
204 ;;
205 esac
206
207 case $PLATFORM in
208 x64|x86_64|x86-64|win64|Win64 )
209 ARCHNAME=x86-64
210 ARCHSUFFIX=64
211 BITS=64
212
213 BASE_OPTS="-G\"$GENERATOR Win64\""
214 add_cmake_opts "-G\"$GENERATOR Win64\""
215 ;;
216
217 x32|x86|i686|i386|win32|Win32 )
218 ARCHNAME=x86
219 ARCHSUFFIX=86
220 BITS=32
221
222 BASE_OPTS="-G\"$GENERATOR\" -T$XP_TOOLSET"
223 add_cmake_opts "-G\"$GENERATOR\"" -T$XP_TOOLSET
224 ;;
225
226 * )
227 echo "Unknown platform $PLATFORM."
228 exit 1
229 ;;
230 esac
231
232 case $CONFIGURATION in
233 debug|Debug|DEBUG )
234 CONFIGURATION=Debug
235 ;;
236
237 release|Release|RELEASE )
238 CONFIGURATION=Release
239 ;;
240
241 relwithdebinfo|RelWithDebInfo|RELWITHDEBINFO )
242 CONFIGURATION=RelWithDebInfo
243 ;;
244 esac
245
246 echo
247 echo "=========================="
248 echo "Starting prebuild on win$BITS"
249 echo "=========================="
250 echo
251
252 mkdir -p deps
253 cd deps
254
255 DEPS="`pwd`"
256
257 if [ -z $SKIP_DOWNLOAD ]; then
258 echo "Downloading dependency packages."
259 echo
260
261 # OpenAL
262 download "OpenAL-Soft 1.16.0" \
263 http://kcat.strangesoft.net/openal-binaries/openal-soft-1.16.0-bin.zip \
264 OpenAL-Soft-1.16.0.zip
265
266 fi
267
268 cd .. #/..
269
270 # Set up dependencies
271 if [ -z $KEEP ]; then
272 echo
273 printf "Preparing build directory... "
274
275 rm -rf Build_$BITS
276 mkdir -p Build_$BITS/deps
277
278 echo Done.
279 fi
280 mkdir -p Build_$BITS/deps
281 cd Build_$BITS/deps
282
283 DEPS_INSTALL=`pwd`
284 cd $DEPS
285
286 echo
287 echo "Extracting dependencies..."
288
289 # OpenAL
290 printf "OpenAL-Soft 1.16.0... "
291 {
292 if [ -d openal-soft-1.16.0-bin ]; then
293 printf "Exists. "
294 elif [ -z $SKIP_EXTRACT ]; then
295 rm -rf openal-soft-1.16.0-bin
296 eval 7z x -y OpenAL-Soft-1.16.0.zip $STRIP
297 fi
298
299 OPENAL_SDK="`real_pwd`/openal-soft-1.16.0-bin"
300
301 add_cmake_opts -DOPENAL_INCLUDE_DIR="$OPENAL_SDK/include/AL" \
302 -DOPENAL_LIBRARY="$OPENAL_SDK/libs/Win$BITS/OpenAL32.lib"
303
304 echo Done.
305 }
306
307 cd $DEPS_INSTALL/..
308
309 echo
310 echo "Setting up WildMIDI build..."
311
312 if [ -z $VERBOSE ]; then
313 printf " Configuring... "
314 else
315 echo " cmake .. $CMAKE_OPTS"
316 fi
317
318 run_cmd cmake .. $CMAKE_OPTS
319 RET=$?
320
321 if [ -z $VERBOSE ]; then
322 if [ $RET -eq 0 ]; then echo Done.
323 else echo Failed.; fi
324 fi
325
326 echo
327
328 # NOTE: Disable this when/if we want to run test cases
329 if [ -z $CI ]; then
330 echo "Copying Runtime DLLs..."
331 mkdir -p $CONFIGURATION
332 for DLL in $RUNTIME_DLLS; do
333 echo " `basename $DLL`."
334 cp "$DLL" $CONFIGURATION/
335 done
336
337 echo "Copying Runtime Resources/Config Files"
338
339 echo " wildmidi.cfg"
340 cp $CONFIGURATION/../cfg/wildmidi.cfg $CONFIGURATION/wildmidi.cfg
341 fi
342
343 exit $RET
0 #!/bin/sh
1
2 export CXX=clang++
3 export CC=clang
4
5 DEPENDENCIES_ROOT="/private/tmp/wildmidi-deps/wildmidi-deps"
6
7 mkdir build
8 cd build
9
10 cmake \
11 -D CMAKE_EXE_LINKER_FLAGS="-lz" \
12 -D CMAKE_PREFIX_PATH="$DEPENDENCIES_ROOT" \
13 -D CMAKE_OSX_DEPLOYMENT_TARGET="10.8" \
14 -D CMAKE_OSX_SYSROOT="macosx10.11" \
15 -D CMAKE_BUILD_TYPE=Debug \
16 -D WANT_OSX_DEPLOYMENT=TRUE \
17 -G"Unix Makefiles" \
18 ..
0 #!/bin/bash
1
2 if [ -z $PLATFORM ]; then
3 PLATFORM=`uname -m`
4 fi
5
6 if [ -z $CONFIGURATION ]; then
7 CONFIGURATION="Debug"
8 fi
9
10 case $PLATFORM in
11 x32|x86|i686|i386|win32|Win32 )
12 BITS=32
13 PLATFORM=Win32
14 ;;
15
16 x64|x86_64|x86-64|win64|Win64 )
17 BITS=64
18 PLATFORM=x64
19 ;;
20
21 * )
22 echo "Unknown platform $PLATFORM."
23 exit 1 ;;
24 esac
25
26 if [ -z $APPVEYOR ]; then
27 echo "Running $BITS-bit $CONFIGURATION build outside of Appveyor."
28
29 DIR=$(echo "$0" | sed "s,\\\\,/,g" | sed "s,\(.\):,/\\1,")
30 cd $(dirname "$DIR")/..
31 else
32 echo "Running $BITS-bit $CONFIGURATION build in Appveyor."
33
34 cd $APPVEYOR_BUILD_FOLDER
35 fi
36
37 cd build_$BITS
38
39 which msbuild > /dev/null
40 if [ $? -ne 0 ]; then
41 msbuild() {
42 /c/Program\ Files\ \(x86\)/MSBuild/12.0/Bin/MSBuild.exe "$@"
43 }
44 fi
45
46 if [ -z $APPVEYOR ]; then
47 msbuild WildMIDI.sln //t:Build //m:8
48 else
49 msbuild WildMIDI.sln //t:Build //m:8 //logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
50 fi
51
52 RET=$?
53 if [ $RET -eq 0 ] && [ ! -z $PACKAGE ]; then
54 msbuild PACKAGE.vcxproj //t:Build //m:8
55 RET=$?
56 fi
57
58 exit $RET
44 # WildMIDI Version
55 SET(VERSION_MAJOR 0)
66 SET(VERSION_MINOR 4)
7 SET(VERSION_RELEASE 0)
7 SET(VERSION_RELEASE 1)
88 SET(WILDMIDI_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_RELEASE}")
99
1010 # Lib Versions
1111 SET(SOVERSION 2)
12 SET(VERSION 2.0.0)
12 SET(VERSION 2.0.1)
1313
1414 # Find Macros
1515 SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
2121 INCLUDE(TestBigEndian)
2222
2323 # Set a default build type if none was specified
24 IF(NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
25 MESSAGE(STATUS "Setting build type to 'Debug' as none was specified.")
26 SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
27 # Set the possible values of build type for cmake-gui
28 SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
29 ENDIF()
24 IF (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
25 MESSAGE(STATUS "Setting build type to 'Debug' as none was specified.")
26 SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
27 # Set the possible values of build type for cmake-gui
28 SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
29 ENDIF ()
3030 SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}")
3131 MESSAGE(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
3232
3333 # Set our optoins
34 OPTION(WANT_PLAYER "Build WildMIDI player in addition to the libraries" ON)
35 OPTION(WANT_STATIC "Build static library in addition to dynamic library" OFF)
36 CMAKE_DEPENDENT_OPTION(WANT_PLAYERSTATIC "Build a statically linked WildMIDI player" ON "WANT_STATIC" OFF)
37 OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF)
38 OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF)
39 #OPTION(WANT_COREAUDIO "Include CoreAudio support (Driver support for Mac OS X" OFF)
40 OPTION(WANT_OPENAL "Include OpenAL suport (Cross Platform) support" OFF)
41 OPTION(WANT_DEVTEST "Build WildMIDI DevTest file to check files" OFF)
42 IF(UNIX AND NOT APPLE)
43 SET(WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" CACHE STRING "default config location")
44 ELSE()
45 SET(WILDMIDI_CFG "wildmidi.cfg" CACHE STRING "default config location")
46 ENDIF()
34 OPTION(BUILD_SHARED_LIBS "Build a dynamic wildmidi library" ON)
35 OPTION(WANT_PLAYER "Build WildMIDI player in addition to the libraries" ON)
36 OPTION(WANT_STATIC "Build static library in addition to dynamic library" OFF)
37 CMAKE_DEPENDENT_OPTION(WANT_PLAYERSTATIC "Build a statically linked WildMIDI player" ON "WANT_STATIC;WANT_PLAYER" OFF)
38 OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF)
39 OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF)
40 OPTION(WANT_OPENAL "Include OpenAL suport (Cross Platform) support" OFF)
41 OPTION(WANT_DEVTEST "Build WildMIDI DevTest file to check files" OFF)
42 OPTION(WANT_OSX_DEPLOYMENT "OSX Deployment" OFF)
43 IF (WIN32 AND MSVC)
44 OPTION(WANT_MP_BUILD "Build with Multiple Processes (/MP)" OFF)
45 ENDIF ()
46 IF (UNIX AND NOT APPLE)
47 SET(WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" CACHE STRING "default config location")
48 ELSE ()
49 SET(WILDMIDI_CFG "wildmidi.cfg" CACHE STRING "default config location")
50 ENDIF ()
51
52 IF ((NOT BUILD_SHARED_LIBS) AND (NOT WANT_STATIC))
53 MESSAGE(FATAL_ERROR "Neither dynamic nor static library build is selected.")
54 ENDIF ()
55
4756
4857 # Platform specific defines
49 IF(UNIX)
58 IF (UNIX)
5059 # allow 'large' files in 32 bit builds
5160 ADD_DEFINITIONS(
52 -D_LARGEFILE_SOURCE
53 -D_FILE_OFFSET_BITS=64
54 -D_LARGE_FILES
55 )
56 ENDIF()
57
58 IF(WIN32)
61 -D_LARGEFILE_SOURCE
62 -D_FILE_OFFSET_BITS=64
63 -D_LARGE_FILES
64 )
65 ENDIF (UNIX)
66
67 IF (OPENBSD) # Set RPATH for OpenBSD so WildMIDI can find libWildMidi.so
68 # use, i.e. don't skip the full RPATH for the build tree
69 SET(CMAKE_SKIP_BUILD_RPATH FALSE)
70
71 # when building, don't use the install RPATH already
72 # (but later on when installing)
73 SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
74
75 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
76
77 # add the automatically determined parts of the RPATH
78 # which point to directories outside the build tree to the install RPATH
79 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
80
81 # the RPATH to be used when installing, but only if it's not a system directory
82 LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
83 IF ("${isSystemDir}" STREQUAL "-1")
84 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
85 ENDIF ()
86 ENDIF (OPENBSD)
87
88 IF (WIN32)
5989 ADD_DEFINITIONS(
60 -DWIN32_LEAN_AND_MEAN
61 -D_CRT_SECURE_NO_WARNINGS
62 )
63 ENDIF()
90 -DNOMINMAX
91 -DWIN32_LEAN_AND_MEAN
92 -D_CRT_SECURE_NO_WARNINGS
93 )
94 ENDIF (WIN32)
6495
6596 # Compiler specific settings
66 IF(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
97 IF (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
6798 ADD_DEFINITIONS(
68 -Wall -W
69 -fno-common
70 )
71
72 IF(NOT WIN32 AND NOT CYGWIN)
99 -Wall -W
100 -fno-common
101 )
102
103 IF (NOT WIN32 AND NOT CYGWIN)
73104 SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
74105 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
75106 CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\")));
76107 int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT)
77 IF(HAVE_VISIBILITY_DEFAULT)
108 IF (HAVE_VISIBILITY_DEFAULT)
78109 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN)
79 ENDIF()
110 ENDIF ()
80111 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
81 ENDIF()
112 ENDIF ()
82113
83114 IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
84 ADD_DEFINITIONS( -ggdb3 -O0 )
85 ELSEIF(CMAKE_BUILD_TYPE STREQUAL "Release")
86 ADD_DEFINITIONS( -O3 )
87 ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug")
88 ENDIF()
89
90 IF("${CMAKE_C_COMPILER_ID}" MATCHES "SunPro")
115 ADD_DEFINITIONS(-ggdb3 -O0)
116 ELSEIF (CMAKE_BUILD_TYPE STREQUAL "Release")
117 ADD_DEFINITIONS(-O3)
118 ENDIF (CMAKE_BUILD_TYPE STREQUAL "Debug")
119 ENDIF ()
120
121 IF (CMAKE_C_COMPILER_ID MATCHES "SunPro")
91122 SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
92123 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -xldscope=hidden")
93 # __SUNPRO_C >= 0x590
94 # CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\")));
95 # int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT)
96 # __SUNPRO_C >= 0x550
124 # __SUNPRO_C >= 0x590
125 # CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\")));
126 # int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT)
127 # __SUNPRO_C >= 0x550
97128 CHECK_C_SOURCE_COMPILES("__global int foo(void);
98129 int main(void) {return 0;}" HAVE_LDSCOPE_GLOBAL)
99 IF(HAVE_LDSCOPE_GLOBAL)# OR HAVE_VISIBILITY_DEFAULT
130 IF (HAVE_LDSCOPE_GLOBAL)# OR HAVE_VISIBILITY_DEFAULT
100131 SET(HAVE_LDSCOPE_HIDDEN 1)
101 ENDIF()
132 ENDIF ()
102133 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
103 ENDIF()
134 ENDIF ()
104135
105136 CHECK_C_SOURCE_COMPILES("int main(void) {__builtin_expect(0,0); return 0;}" HAVE___BUILTIN_EXPECT)
106137
121152 SET(AUDIODRV_OPENAL)
122153
123154 # UNIX-like environments
124 IF(UNIX AND NOT APPLE)
155 IF (UNIX AND NOT APPLE)
125156
126157 # Go looking for available sound packages for WildMIDI player
127 IF(WANT_PLAYER OR WANT_PLAYERSTATIC)
158 IF (WANT_PLAYER)
128159 FIND_PACKAGE(ALSA)
129160 FIND_PACKAGE(OpenAL)
130161 FIND_PACKAGE(OSS)
131162
132163 # Set preferred output
133 IF(WANT_ALSA)
134 IF(NOT ALSA_FOUND)
164 IF (WANT_ALSA)
165 IF (NOT ALSA_FOUND)
135166 MESSAGE(FATAL_ERROR "ALSA required but not found.")
136 ENDIF()
167 ENDIF ()
137168 SET(AUDIODRV_ALSA 1)
138169 SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
139170
140 ELSEIF(WANT_OSS)
141 IF(NOT OSS_FOUND)
171 ELSEIF (WANT_OSS)
172 IF (NOT OSS_FOUND)
142173 MESSAGE(FATAL_ERROR "OSS required but not found.")
143 ENDIF()
174 ENDIF ()
144175 # no special header paths
145176 SET(AUDIODRV_OSS 1)
146177 SET(AUDIO_LIBRARY ${OSS_LIBRARY})
147178
148 ELSEIF(WANT_OPENAL)
149 IF(NOT OPENAL_FOUND)
179 ELSEIF (WANT_OPENAL)
180 IF (NOT OPENAL_FOUND)
150181 MESSAGE(FATAL_ERROR "OpenAL required but not found.")
151 ENDIF()
182 ENDIF ()
152183 SET(AUDIODRV_OPENAL 1)
153184 SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
154185
155 ELSE() # Try to auto-detect
156
157 IF(ALSA_FOUND)
186 ELSE () # Try to auto-detect
187
188 IF (ALSA_FOUND)
158189 SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
159190 SET(AUDIODRV_ALSA 1)
160191
161 ELSEIF(OSS_FOUND)
192 ELSEIF (OSS_FOUND)
162193 # no special header paths
163194 SET(AUDIO_LIBRARY ${OSS_LIBRARY})
164195 SET(AUDIODRV_OSS 1)
165196
166 ELSEIF(OPENAL_FOUND)
197 ELSEIF (OPENAL_FOUND)
167198 SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
168199 SET(AUDIODRV_OPENAL 1)
169200
170 ELSE()
201 ELSE ()
171202 MESSAGE(WARNING "Could not find an audio sub-system!")
172203 SET(AUDIO_LIBRARY "")
173 ENDIF()
174
175 ENDIF()
176 ENDIF()
204 ENDIF ()
205
206 ENDIF ()
207 ENDIF ()
177208
178209 # find our math lib
179210 FIND_LIBRARY(M_LIBRARY m REQUIRED)
183214 ## Debian specific
184215 ELSE ()
185216 ## Non debian specific
186 ENDIF (DPKG_PROGRAM)
187 ENDIF(UNIX AND NOT APPLE)
188
189 IF (APPLE AND (WANT_PLAYER OR WANT_PLAYERSTATIC))
217 ENDIF ()
218 ENDIF (UNIX AND NOT APPLE)
219
220 IF (APPLE AND WANT_PLAYER)
190221 FIND_PACKAGE(OpenAL)
191222
192 IF(WANT_OPENAL)
193 IF(NOT OPENAL_FOUND)
223 IF (WANT_OPENAL)
224 IF (NOT OPENAL_FOUND)
194225 MESSAGE(FATAL_ERROR "OpenAL required but not found.")
195 ENDIF()
226 ENDIF ()
196227 SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
197228
198 ELSE()
199 IF(OPENAL_FOUND)
229 ELSE ()
230 IF (OPENAL_FOUND)
200231 SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
201232 SET(AUDIODRV_OPENAL 1)
202233
203 ELSE()
234 ELSE ()
204235 MESSAGE(WARNING "Could not find an audio sub-system!")
205236 SET(AUDIO_LIBRARY "")
206 ENDIF()
207
208 ENDIF()
209 ENDIF()
210
211 IF(WIN32)
212 IF (WANT_PLAYER OR WANT_PLAYERSTATIC)
237 ENDIF ()
238
239 ENDIF ()
240 ENDIF ()
241
242 IF (WIN32)
243 IF (WANT_PLAYER)
213244 LINK_LIBRARIES(winmm)
214 ENDIF()
215 ENDIF(WIN32)
245 ENDIF ()
246 ENDIF (WIN32)
216247
217248 # ######### General setup ##########
218249 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include")
219 FILE (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
250 FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
220251 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_BINARY_DIR}/include")
221 IF(NOT HAVE_STDINT_H) # AND NOT HAVE_INTTYPES_H
222 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include/stdint")
223 ENDIF()
224
225 IF(APPLE)
252 IF (NOT HAVE_STDINT_H) # AND NOT HAVE_INTTYPES_H
253 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include/stdint")
254 ENDIF ()
255
256 IF (AMIGA OR AROS)
257 SET(WILDMIDI_AMIGA 1)
258 ENDIF ()
259
260 IF (APPLE)
226261 SET(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app")
227262 SET(APP_BUNDLE_DIR "${wildmidi_BINARY_DIR}/${APP_BUNDLE_NAME}")
228 ENDIF(APPLE)
229
230 IF(APPLE)
263 IF (WANT_OSX_DEPLOYMENT)
264 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
265 ENDIF ()
266 ENDIF (APPLE)
267
268 IF (APPLE)
231269 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${APP_BUNDLE_DIR}/Contents/MacOS")
232 ELSE(APPLE)
270 ELSE (APPLE)
233271 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${wildmidi_BINARY_DIR}")
234 ENDIF(APPLE)
272 ENDIF (APPLE)
235273
236274 # Setup up our config file
237275 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.cmake" "${CMAKE_BINARY_DIR}/include/config.h")
55 The library API is designed so that it is easy to include WildMIDI into
66 applications that wish to include MIDI file playback.
77
8 Version: 0.4.0
8 Version: 0.4.1
99 Licenses: GPLv3+ and LGPLv3
1010 Website: http://www.mindwerks.net/projects/wildmidi
1111
1818 * kFreeBSD: Debian (player: OSS output)
1919 * Hurd: Debian
2020 * DOS (player: sound blaster or compatibles output.)
21 * OS/2 (player: Dart output.)
22 * AmigaOS & variants like MorphOS, AROS. (player: AHI output)
2123
2224 BUILD FROM SOURCE:
2325
2628 * cmake
2729 * GCC or clang / Xcode / VisualStudio / MinGW or MinGW-w64
2830 * DOS port: DJGPP / GNU make
31 * OS/2 port: OpenWatcom (tested with version 1.9)
32 * Nintendo 3DS port: devkitARM
33 * Nintendo Wii port: devkitPPC
2934
3035 CHANGELOG
36
37 0.4.1
38 * Fixed bug in handling of the "source" directive in config files.
39 * Fixed a nasty bug in dBm_pan_volume. Other fixes and clean-ups.
40 * Build system updates. Install a pkg-config file on supported platforms
41 such as Linux. New android ndk makefile.
42 * File i/o updates.
43 * Support for OS/2.
44 * Support for Nintendo 3DS
45 * Support for Nintendo Wii
46 * Support for AmigaOS and its variants like MorphOS and AROS.
3147
3248 0.4.0
3349 * API change: The library now returns audio data in host-endian format,
4965 * API change: WildMidi_GetError() and WildMidi_ClearError() added to
5066 cleanly check for, retrieve and clear error messages. They no longer
5167 go to stderr.
52 * Support for loading XMI (XMIDI format) files, thanks Ryan Nunn for
53 releasing his code under the LGPL.
68 * Support for loading XMI (XMIDI format) and XFM files, such as from Arena.
69 Thanks Ryan Nunn for releasing his code under the LGPL.
5470 * Support for loading MUS (MUS Id format) files, such as from Doom.
55 * Support for loading HMP/HMI files, such as from Arena and Daggerfall.
71 * Support for loading HMP/HMI files, such as from Daggerfall.
5672 * Support for loading KAR (MIDI with Lyrics) and Type 2 MIDI files.
5773 * Build requires cmake-2.8.11 or newer now.
5874
0 # GNU Makefile to build for AmigaOS variants using gcc
1 #
2 # make aros : build for i386-aros
3 # make morphos : build for ppc-morphos
4 # make amigaos : build for m68k-amigaos
5 # make amigaos4 : build for ppc-amigaos4
6
7 # Set to 1 for debug build
8 DEBUG = 0
9
10 # The tools
11 ifeq ($(CROSS),)
12 CC=gcc
13 AS=as
14 AR=ar
15 RANLIB=ranlib
16 else
17 CC=$(CROSS)-gcc
18 AS=$(CROSS)-as
19 AR=$(CROSS)-ar
20 RANLIB=$(CROSS)-ranlib
21 endif
22
23 INCLUDE = -I. -I../include
24 CFLAGS = $(INCLUDE) -Wall -W -fno-common
25 ARFLAGS = cr
26 LD = $(CC)
27 LDFLAGS = -L. -lWildMidi
28
29 ifeq ($(DEBUG),1)
30 CFLAGS += -g
31 else
32 CFLAGS += -O2
33 endif
34
35 ifeq ($(AROS),1)
36 include gcc_aros.cfg
37 endif
38 ifeq ($(MORPHOS),1)
39 include gcc_morphos.cfg
40 endif
41 ifeq ($(AOS3),1)
42 include gcc_aos3.cfg
43 endif
44 ifeq ($(AOS4),1)
45 include gcc_aos4.cfg
46 endif
47
48 # Build rules
49 %.o: %.c
50 $(CC) -c $(CFLAGS) -o $@ $<
51 %.o: ../src/%.c
52 $(CC) -c $(CFLAGS) -o $@ $<
53
54 # Objects
55 LIB_OBJ= wm_error.o file_io.o lock.o wildmidi_lib.o reverb.o gus_pat.o f_xmidi.o f_mus.o f_hmp.o f_midi.o f_hmi.o mus2mid.o xmi2mid.o internal_midi.o patches.o sample.o
56 PLAYER_OBJ= getopt_long.o wm_tty.o amiga.o wildmidi.o
57
58 # Build targets
59 .PHONY: clean distclean
60 all: libWildMidi.a wildmidi
61
62 libWildMidi.a: $(LIB_OBJ)
63 $(AR) $(ARFLAGS) $@ $^
64 $(RANLIB) $@
65
66 wildmidi: libWildMidi.a $(PLAYER_OBJ)
67 $(LD) -o $@ $(PLAYER_OBJ) $(LDFLAGS)
68
69 aros:
70 @echo Building for i386-aros
71 $(MAKE) AROS=1
72 morphos:
73 @echo Building for ppc-morphos
74 $(MAKE) MORPHOS=1
75 amigaos:
76 @echo Building for m68k-amigaos
77 $(MAKE) AOS3=1
78 amigaos4:
79 @echo Building for ppc-amigaos4
80 $(MAKE) AOS4=1
81
82 clean:
83 rm -rf $(LIB_OBJ) $(PLAYER_OBJ)
84 distclean: clean
85 rm -rf libWildMidi.a WildMidi.lib wildmidi
0 # GNU Makefile to build for AmigaOS variants using VBCC
1 #
2 # make amigaos : build for m68k-amigaos
3
4 # for now, only tested for m68k-amigaos:
5 AOS3 := 1
6
7 # The tools
8 CC=vc
9 #MKLIB=join $(LIB_OBJ) as WildMidi.lib
10 MKLIB=cat $(LIB_OBJ) > WildMidi.lib
11
12 INCLUDE = -I. -I../include
13 CFLAGS = -O1 -speed -c99
14 CFLAGS += $(INCLUDE)
15 LDFLAGS = -L. -lWildMidi
16
17 ifeq ($(MORPHOS),1)
18 include vbcc_morphos.cfg
19 endif
20 ifeq ($(AOS3),1)
21 include vbcc_aos3.cfg
22 endif
23 ifeq ($(AOS4),1)
24 include vbcc_aos4.cfg
25 endif
26
27 # Build rules
28 %.o: %.c
29 $(CC) -c $(CFLAGS) -o $@ $<
30 %.o: ../src/%.c
31 $(CC) -c $(CFLAGS) -o $@ $<
32
33 # Objects
34 LIB_OBJ= wm_error.o file_io.o lock.o wildmidi_lib.o reverb.o gus_pat.o f_xmidi.o f_mus.o f_hmp.o f_midi.o f_hmi.o mus2mid.o xmi2mid.o internal_midi.o patches.o sample.o
35 PLAYER_OBJ= getopt_long.o wm_tty.o amiga.o wildmidi.o
36
37 # Build targets
38 .PHONY: clean distclean
39 all: WildMidi.lib wildmidi
40
41 WildMidi.lib: $(LIB_OBJ)
42 $(MKLIB)
43
44 wildmidi: WildMidi.lib $(PLAYER_OBJ)
45 $(CC) -o $@ $(PLAYER_OBJ) $(LDFLAGS)
46
47 amigaos:
48 @echo Building for m68k-amigaos
49 $(MAKE) -f Makefile.vbcc AOS3=1
50 amigaos4:
51 @echo Building for ppc-amigaos4
52 $(MAKE) -f Makefile.vbcc AOS4=1
53 morphos:
54 @echo Building for ppc-morphos
55 $(MAKE) -f Makefile.vbcc MORPHOS=1
56
57 clean:
58 rm -rf $(LIB_OBJ) $(PLAYER_OBJ)
59 distclean: clean
60 rm -rf libWildMidi.a WildMidi.lib wildmidi
0 /* wildmidi config for amigaos variants */
1 #define WILDMIDI_AMIGA 1
2
3 #define WILDMIDI_CFG "wildmidi.cfg"
4
5 #define PACKAGE_URL "http://www.mindwerks.net/projects/wildmidi/"
6 #define PACKAGE_BUGREPORT "https://github.com/Mindwerks/wildmidi/issues"
7
8 #define PACKAGE_VERSION "0.4.1"
9
10 #define HAVE_C_INLINE
11
12 #if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR >= 96))
13 #define HAVE___BUILTIN_EXPECT
14 #endif
15 #ifndef HAVE___BUILTIN_EXPECT
16 #define __builtin_expect(x,c) x
17 #endif
18
19 #define AUDIODRV_AHI 1 /* AHI output for player app */
0 # makefile fragment for m68k-amigaos / gcc
1
2 INCLUDE+= -I../include/stdint
3 LDFLAGS+= -noixemul
4 LDFLAGS+= -lm
5 CFLAGS += -noixemul
6 CFLAGS += -DWORDS_BIGENDIAN=1
7 # avoid conflicts between our stdint.h and ixemul sys/types.h
8 CFLAGS += -D_ANSI_SOURCE
0 # makefile fragment for ppc-amigaos4 / gcc
1
2 LDFLAGS+= -noixemul
3 LDFLAGS+= -lm
4 CFLAGS += -noixemul
5 CFLAGS += -DWORDS_BIGENDIAN=1
6
7 CFLAGS += -D__USE_INLINE__
8 CFLAGS += -D__USE_OLD_TIMEVAL__
0 # makefile fragment for i386-aros / gcc
1
0 # makefile fragment for ppc-morphos / gcc
1
2 LDFLAGS+= -noixemul
3 CFLAGS += -noixemul
4 CFLAGS += -DWORDS_BIGENDIAN=1
0 # makefile fragment for m68k-amigaos / vbcc
1
2 LDFLAGS+= -lm881
3 CFLAGS += -cpu=68020 -fpu=68881
4 CFLAGS += -D__AMIGA__
5 CFLAGS += -DWORDS_BIGENDIAN=1
6 # bullshit -- until the code is adjusted
7 CFLAGS += -D__FUNCTION__=__func__
0 LOCAL_PATH := $(call my-dir)
1
2 include $(CLEAR_VARS)
3 LOCAL_MODULE := WildMidi_shared
4 LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libWildMidi.so
5 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/jni $(LOCAL_PATH)/../include
6 TARGET_PLATFORM = android-10
7
8 include $(PREBUILT_SHARED_LIBRARY)
0 LOCAL_PATH := $(call my-dir)/../..
1 include $(CLEAR_VARS)
2
3 LOCAL_MODULE := WildMidi
4 LOCAL_C_INCLUDES := $(LOCAL_PATH)/android/jni $(LOCAL_PATH)/include
5 LOCAL_ARM_MODE := arm
6 LOCAL_CFLAGS += -DWILDMIDI_BUILD
7 LOCAL_CFLAGS += -fvisibility=hidden -DSYM_VISIBILITY
8
9 LOCAL_SRC_FILES := \
10 src/f_hmi.c \
11 src/f_hmp.c \
12 src/f_midi.c \
13 src/f_mus.c \
14 src/f_xmidi.c \
15 src/file_io.c \
16 src/gus_pat.c \
17 src/internal_midi.c \
18 src/lock.c \
19 src/mus2mid.c \
20 src/patches.c \
21 src/reverb.c \
22 src/sample.c \
23 src/wildmidi_lib.c \
24 src/wm_error.c \
25 src/xmi2mid.c
26
27 include $(BUILD_SHARED_LIBRARY)
0 APP_ABI := armeabi-v7a x86
1 APP_MODULES := WildMidi
2 APP_PLATFORM := android-10
3 APP_OPTIM := release
4 NDK_TOOLCHAIN_VERSION := 4.9
0 /* config.h -- generated from config.h.cmake */
1
2 /* Name of package */
3 #define PACKAGE "wildmidi"
4
5 /* Define to the home page for this package. */
6 #define PACKAGE_URL "http://www.mindwerks.net/projects/wildmidi/"
7
8 /* Define to the address where bug reports for this package should be sent. */
9 #define PACKAGE_BUGREPORT "https://github.com/Mindwerks/wildmidi/issues"
10
11 /* Define to the full name of this package. */
12 #define PACKAGE_NAME "WildMidi"
13
14 /* Define to the full name and version of this package. */
15 #define PACKAGE_STRING "WildMidi 0.4.1"
16
17 /* Define to the one symbol short name of this package. */
18 #define PACKAGE_TARNAME "wildmidi"
19
20 /* Define to the version of this package. */
21 #define PACKAGE_VERSION "0.4.1"
22
23 /* Version number of package */
24 #define VERSION "0.4.1"
25
26 /* Define this to the location of the wildmidi config file */
27 /* #undef WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" */
28
29 /* Define if the C compiler supports the `inline' keyword. */
30 #define HAVE_C_INLINE
31 /* Define if the C compiler supports the `__inline__' keyword. */
32 #define HAVE_C___INLINE__
33 /* Define if the C compiler supports the `__inline' keyword. */
34 #define HAVE_C___INLINE
35 #if !defined(HAVE_C_INLINE) && !defined(__cplusplus)
36 # ifdef HAVE_C___INLINE__
37 # define inline __inline__
38 # elif defined(HAVE_C___INLINE)
39 # define inline __inline
40 # else
41 # define inline
42 # endif
43 #endif
44
45 /* Define if the compiler has the `__builtin_expect' built-in function */
46 #define HAVE___BUILTIN_EXPECT
47 #ifndef HAVE___BUILTIN_EXPECT
48 #define __builtin_expect(x,c) x
49 #endif
50
51 /* define this if you are running a bigendian system (motorola, sparc, etc) */
52 /* #undef WORDS_BIGENDIAN */
53
54 /* define this if building for AmigaOS variants */
55 /* #undef WILDMIDI_AMIGA */
56
57 /* Define if you have the <stdint.h> header file. */
58 #define HAVE_STDINT_H
59
60 /* Define if you have the <inttypes.h> header file. */
61 #define HAVE_INTTYPES_H
62
63 /* Define our audio drivers */
64 /* #undef HAVE_LINUX_SOUNDCARD_H */
65 /* #undef HAVE_SYS_SOUNDCARD_H */
66 /* #undef HAVE_MACHINE_SOUNDCARD_H */
67 /* #undef HAVE_SOUNDCARD_H */
68
69 /* #undef AUDIODRV_ALSA */
70 /* #undef AUDIODRV_OSS */
71 /* #undef AUDIODRV_OPENAL */
72 /* #undef AUDIODRV_AHI */
0 # This file is automatically generated by Android Tools.
1 # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
2 #
3 # This file must be checked in Version Control Systems.
4 #
5 # To customize properties used by the Ant build system use,
6 # "ant.properties", and override values to adapt the script to your
7 # project structure.
8
9 # Project target.
10 target=android-10
0 version: "{build}"
1
2 branches:
3 only:
4 - master
5 - /wildmidi-.*$/
6 - appveyor
7
8 platform:
9 - Win32
10 - x64
11
12 configuration: Debug
13
14 matrix:
15 fast_finish: true
16
17 # For the Qt, Boost, CMake, etc installs
18 os: unstable
19
20 # We want the git revision for versioning,
21 # so shallow clones don't work.
22 clone_depth: 1
23
24 #cache:
25 # - C:\projects\wildmidi\deps\ffmpeg32-2.5.2.7z
26 # - C:\projects\wildmidi\deps\ffmpeg32-2.5.2-dev.7z
27 # - C:\projects\wildmidi\deps\ffmpeg64-2.5.2.7z
28 # - C:\projects\wildmidi\deps\ffmpeg64-2.5.2-dev.7z
29
30 clone_folder: C:\projects\wildmidi
31
32 before_build:
33 - cmd: sh %APPVEYOR_BUILD_FOLDER%\CI\before_script.msvc.sh -u -p %PLATFORM%
34
35 build_script:
36 - cmd: if %PLATFORM%==Win32 set build=Build_32
37 - cmd: if %PLATFORM%==x64 set build=Build_64
38 - cmd: msbuild %build%\WildMIDI.sln /t:Build /p:Configuration=%configuration% /m:2 /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
39
40 after_build:
41 - cmd: if %PLATFORM%==Win32 7z a WildMIDI_x32.zip %APPVEYOR_BUILD_FOLDER%\Build_32\Debug\wildmidi*
42 - cmd: if %PLATFORM%==x64 7z a WildMIDI_x64.zip %APPVEYOR_BUILD_FOLDER%\Build_64\Debug\wildmidi*
43
44 test: off
45
46 #notifications:
47 # - provider: Email
48 # to:
49 # -
50 # on_build_failure: true
51 # on_build_status_changed: true
52
53 artifacts:
54 - path: WildMIDI_x32.zip
55 name: WildMIDI_x32
56 - path: WildMIDI_x64.zip
57 name: WildMIDI_x64
22 # You will need a DJGPP build environment and GNU make to do it painlessly.
33 # To build natively on DOS, you need long file names support (e.g. doslfn.)
44 #------------------------------------------------------------------------------#
5 # Targets:
6 # - all (default): make libWildMidi.a library and wildmidi.exe
7 # - clean: clean up (remove all generated files)
8 #------------------------------------------------------------------------------#
95
106 # Set to 1 for debug build
117 DEBUG = 0
128
13 # Set to 1 if want to build / use a DXE3 version of the library (DJGPP-2.05 or newer)
14 USE_DXE = 0
9 # DXE3 version of the library requires DJGPP-2.05 or newer.
10 # Set to 0 if dont want to build / use a DXE3 version of the library.
11 USE_DXE = 1
1512
1613 # The tools
1714 ifeq ($(CROSS),)
22 #define PACKAGE_URL "http://www.mindwerks.net/projects/wildmidi/"
33 #define PACKAGE_BUGREPORT "https://github.com/Mindwerks/wildmidi/issues"
44
5 #define PACKAGE_VERSION "0.4.0"
5 #define PACKAGE_VERSION "0.4.1"
66
77 #define HAVE_C_INLINE
88
1313 #define __builtin_expect(x,c) x
1414 #endif
1515
16 #define WM_NO_LOCK 1 /* don't need locking in MSDOS */
2323 #ifndef __COMMON_H
2424 #define __COMMON_H
2525
26 #ifndef __VBCC__
2627 #define UNUSED(x) (void)(x)
28 #else
29 #define UNUSED(x) /* vbcc emits an annoying warning for (void)(x) */
30 #endif
2731 #define MEM_CHUNK 8192
2832
2933 extern int16_t _WM_MasterVolume;
5151 /* define this if you are running a bigendian system (motorola, sparc, etc) */
5252 #cmakedefine WORDS_BIGENDIAN 1
5353
54 /* define this if building for AmigaOS variants */
55 #cmakedefine WILDMIDI_AMIGA 1
56
5457 /* Define if you have the <stdint.h> header file. */
5558 #cmakedefine HAVE_STDINT_H
5659
6669 #cmakedefine AUDIODRV_ALSA
6770 #cmakedefine AUDIODRV_OSS
6871 #cmakedefine AUDIODRV_OPENAL
72 #cmakedefine AUDIODRV_AHI
44 * use forward- and back-slash in path names interchangeably, and
55 * some of them have case-insensitive file names.
66 *
7 * Copyright 2000, 2001, 2007 Free Software Foundation, Inc.
7 * This was based on filenames.h from BFD, the Binary File Descriptor
8 * library, Copyright (C) 2000-2016 Free Software Foundation, Inc.,
9 * and changed by O. Sezer <sezero@users.sourceforge.net> for our needs.
10 * The original version of this header in binutils/gcc is GPL licensed,
11 * this modified version was authorized to be LGPL in our LGPL projects:
12 * http://gcc.gnu.org/ml/gcc-patches/2016-09/msg02007.html
13 * http://gcc.gnu.org/ml/gcc-patches/2016-09/msg02179.html
814 *
9 * This is based on filenames.h from BFD, the Binary File Descriptor
10 * library, changed further for our needs.
15 * This program is free software; you can redistribute it and/or modify it
16 * under the terms of the GNU Lesser General Public License as published by
17 * the Free Software Foundation; either version 2.1 of the License, or (at
18 * your option) any later version.
1119 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
23 * General Public License for more details.
1624 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 * You should have received a copy of the GNU Lesser General Public License
26 * along with this program; if not, write to the Free Software Foundation,
27 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2528 */
2629
2730 #ifndef FILENAMES_H
109112 #endif /* C++ */
110113
111114 /* ----------------- AmigaOS, MorphOS, AROS, etc: ----------------- */
112 #elif defined(__MORPHOS__) || defined(__AROS__) || \
113 defined(__amigaos__) || defined(__amigaos4__) || \
114 defined(__amigados__) || defined(__AMIGA) || defined(__AMIGA__)
115 #elif defined(__MORPHOS__) || defined(__AROS__) || defined(AMIGAOS) || \
116 defined(__amigaos__) || defined(__amigaos4__) || defined(__amigados__) || \
117 defined(AMIGA) || defined(_AMIGA) || defined(__AMIGA__)
115118
116119 #define HAS_DRIVE_SPEC(f) (0) /* */
117120 #define STRIP_DRIVE_SPEC(f) (f) /* */
190193 #endif
191194
192195 #endif /* FILENAMES_H */
196
2727 extern void _WM_Lock (int * wmlock);
2828 extern void _WM_Unlock (int *wmlock);
2929
30 #ifdef __DJGPP__
30 #if defined WM_NO_LOCK
3131 #define _WM_Lock(p) do {} while (0)
3232 #define _WM_Unlock(p) do {} while (0)
3333 #endif
2323
2424 #include <stdint.h>
2525
26 int _WM_mus2midi (uint8_t *in, uint32_t insize,
26 int _WM_mus2midi (const uint8_t *in, uint32_t insize,
2727 uint8_t **out, uint32_t *outsize,
2828 uint16_t frequency);
2929
2626 /* library version number */
2727 #define LIBWILDMIDI_VER_MAJOR 0L
2828 #define LIBWILDMIDI_VER_MINOR 4L
29 #define LIBWILDMIDI_VER_MICRO 0L
29 #define LIBWILDMIDI_VER_MICRO 1L
3030 #define LIBWILDMIDI_VERSION \
3131 ((LIBWILDMIDI_VER_MAJOR << 16) | \
3232 (LIBWILDMIDI_VER_MINOR << 8) | \
7272 */
7373 # elif defined(SYM_LDSCOPE) /* __SUNPRO_C >= 0x550 */
7474 # define WM_SYMBOL __global
75 # elif defined(__OS2__) && defined(__WATCOMC__) && defined(__SW_BD)
76 # define WM_SYMBOL __declspec(dllexport)
7577 # else
7678 # define WM_SYMBOL
7779 # endif
4949 extern char * _WM_Global_ErrorS;
5050 extern int _WM_Global_ErrorI;
5151
52 extern void _WM_GLOBAL_ERROR(const char * func, const char * file, unsigned int lne, int wmerno, const char * wmfor, int error);
52 extern void _WM_GLOBAL_ERROR(const char *func, int lne, int wmerno, const char * wmfor, int error);
5353
54 /* sets the global error string to a custom msg */
5455 extern void _WM_ERROR_NEW(const char * wmfmt, ...)
5556 #ifdef __GNUC__
5657 __attribute__((format(printf, 1, 2)))
5758 #endif
5859 ;
59 extern void _WM_ERROR(const char * func, unsigned int lne, int wmerno,
60 const char * wmfor, int error);
60
61 /* prints a debug message to stderr */
62 extern void _WM_DEBUG_MSG(const char * wmfmt, ...)
63 #ifdef __GNUC__
64 __attribute__((format(printf, 1, 2)))
65 #endif
66 ;
6167
6268 #endif /* __WM_ERROR_H */
0 /*
1 * wm_tty.h - unix termios code for player
0 /* wm_tty.h - unix termios code for player
21 *
32 * Copyright (C) Chris Ison 2001-2011
43 * Copyright (C) Bret Curtis 2013-2016
2726 void wm_inittty(void);
2827 void wm_resetty(void);
2928
30 #if defined(_WIN32)||defined(__DJGPP__)
29 #if defined(_WIN32)||defined(__DJGPP__)||defined(WILDMIDI_AMIGA)||defined(__OS2__)||defined(__EMX__)
3130 #define wm_inittty() do {} while (0)
3231 #define wm_resetty() do {} while (0)
33 #endif /* !_WIN32, !__DJGPP__ */
32 #endif /* _WIN32, __DJGPP__, __OS2__ */
3433
3534 #endif /* wm_tty_h */
3434 #define XMIDI_CONVERT_MT32_TO_GS127DRUM 0x04 /* This one is broken, don't use */
3535 #define XMIDI_CONVERT_GS127_TO_GS 0x05
3636
37 int _WM_xmi2midi(uint8_t *in, uint32_t insize,
37 int _WM_xmi2midi(const uint8_t *in, uint32_t insize,
3838 uint8_t **out, uint32_t *outsize,
3939 uint32_t convert_type);
4040
0 #define WILDMIDI_CFG "wildmidi.cfg"
1
2 #define PACKAGE_URL "http://www.mindwerks.net/projects/wildmidi/"
3 #define PACKAGE_BUGREPORT "https://github.com/Mindwerks/wildmidi/issues"
4
5 #define PACKAGE_VERSION "0.4.1"
6
7 #define HAVE_C_INLINE
8
9 #if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR >= 96)
10 #define HAVE___BUILTIN_EXPECT
11 #endif
12 #ifndef HAVE___BUILTIN_EXPECT
13 #define __builtin_expect(x,c) x
14 #endif
15
16 #define AUDIODRV_OS2DART 1 /* OS/2 DART output */
0 # Makefile for OS/2 using Watcom compiler.
1 #
2 # wmake
3 # - builds wildmidi.dll and its import lib (wildmidi.lib)
4 #
5 # wmake target=static
6 # - builds the static library wildmidi_static.lib
7
8 !ifndef target
9 target = dll
10 !endif
11
12 CFLAGS = -bt=os2 -bm -fp5 -fpi87 -mf -oeatxh -w4 -ei -j -zp8 -zq
13 # -5s : Pentium stack calling conventions.
14 # -5r : Pentium register calling conventions.
15 CFLAGS+= -5s
16 DLLFLAGS=-bd
17
18 .SUFFIXES:
19 .SUFFIXES: .obj .c
20
21 DLLNAME=wildmidi.dll
22 EXPNAME=wildmidi.exp
23 LIBNAME=wildmidi.lib
24 LIBSTATIC=wildmidi_static.lib
25 PLAYER=wildmidi.exe
26 PLAYER_STATIC=wildmidi_static.exe
27 PLAYER_LIBS=mmpm2.lib
28
29 CFLAGS_LIB= $(CFLAGS) -DWILDMIDI_BUILD
30 CFLAGS_EXE= $(CFLAGS)
31 !ifeq target static
32 BLD_TARGET=$(LIBSTATIC) $(PLAYER_STATIC)
33 !else
34 CFLAGS_LIB+= $(DLLFLAGS)
35 BLD_TARGET=$(DLLNAME) $(PLAYER)
36 !endif
37
38 OBJ=wm_error.obj file_io.obj lock.obj wildmidi_lib.obj reverb.obj gus_pat.obj f_xmidi.obj f_mus.obj f_hmp.obj f_midi.obj f_hmi.obj mus2mid.obj xmi2mid.obj internal_midi.obj patches.obj sample.obj
39 PLAYER_OBJ=getopt_long.obj wm_tty.obj wildmidi.obj
40
41 all: $(BLD_TARGET)
42
43 # rely on symbol name, not ordinal: -irn switch of wlib is default, but -inn is not.
44 $(DLLNAME): $(OBJ)
45 wlink NAM $@ SYSTEM os2v2_dll INITINSTANCE TERMINSTANCE OPTION MANYAUTODATA FIL {$(OBJ)} OPTION IMPF=$(EXPNAME)
46 wlib -q -b -n -inn -pa -s -t -zld -ii -io $(LIBNAME) +$(DLLNAME)
47
48 $(LIBSTATIC): $(OBJ)
49 wlib -q -b -n $@ $(OBJ)
50
51 $(PLAYER): $(DLLNAME) $(PLAYER_OBJ)
52 wlink N $@ SYS OS2V2 LIBR {$(LIBNAME) $(PLAYER_LIBS)} F {$(PLAYER_OBJ)}
53
54 $(PLAYER_STATIC): $(LIBSTATIC) $(PLAYER_OBJ)
55 wlink N $@ SYS OS2V2 LIBR {$(LIBSTATIC) $(PLAYER_LIBS)} F {$(PLAYER_OBJ)}
56
57 # rules for library objs:
58 .c.obj:
59 wcc386 $(CFLAGS_LIB) $(INCLUDES) -fo=$^@ $<
60 # rules for player objs:
61 getopt_long.obj: getopt_long.c
62 wcc386 $(CFLAGS_EXE) $(INCLUDES) -fo=$^@ $<
63 wm_tty.obj: wm_tty.c
64 wcc386 $(CFLAGS_EXE) $(INCLUDES) -fo=$^@ $<
65 wildmidi.obj: wildmidi.c
66 wcc386 $(CFLAGS_EXE) $(INCLUDES) -fo=$^@ $<
67
68 !ifndef __UNIX__
69 INCLUDES=-I. -I..\include
70 .c: ..\src
71 distclean: clean .symbolic
72 @if exist $(LIBSTATIC) del $(LIBSTATIC)
73 @if exist $(DLLNAME) del $(DLLNAME)
74 @if exist $(EXPNAME) del $(EXPNAME)
75 @if exist $(LIBNAME) del $(LIBNAME)
76 @if exist $(PLAYER) del $(PLAYER)
77 @if exist $(PLAYER_STATIC) del $(PLAYER_STATIC)
78 clean: .symbolic
79 @if exist *.obj del *.obj
80 !else
81 INCLUDES=-I. -I../include
82 .c: ../src
83 distclean: clean .symbolic
84 rm -f $(DLLNAME) $(EXPNAME) $(LIBNAME) $(LIBSTATIC) $(PLAYER) $(PLAYER_STATIC)
85 clean: .symbolic
86 rm -f *.obj
87 !endif
0 # Makefile for OS/2 using EMX environment.
1 # builds static wildmidi.a library and wildmidi.exe player
2
3 CC=gcc
4 AS=as
5 AR=ar
6 RANLIB=ranlib
7 LD=$(CC)
8
9 INCLUDES=-I. -I../include/stdint -I../include
10 CFLAGS = $(INCLUDES) -Wall -W -Zmt
11 LDFLAGS = -Zmt
12 ARFLAGS = cr
13
14 ifeq ($(DEBUG),1)
15 CFLAGS += -g
16 else
17 CFLAGS += -O2 -ffast-math
18 LDFLAGS+= -s
19 endif
20
21 LIBSTATIC=wildmidi.a
22 PLAYER_STATIC=wildmidi.exe
23 PLAYER_LIBS=-L. -lwildmidi
24 #PLAYER_LIBS+=-lmmpm2
25 PLAYER_LIBS+=-los2me
26
27 CFLAGS_LIB= $(CFLAGS) -DWILDMIDI_BUILD
28 CFLAGS_EXE= $(CFLAGS)
29
30 OBJ=wm_error.o file_io.o lock.o wildmidi_lib.o reverb.o gus_pat.o f_xmidi.o f_mus.o f_hmp.o f_midi.o f_hmi.o mus2mid.o xmi2mid.o internal_midi.o patches.o sample.o
31 PLAYER_OBJ=wildmidi.o getopt_long.o wm_tty.o
32
33 all: $(LIBSTATIC) $(PLAYER_STATIC)
34
35 $(LIBSTATIC): $(OBJ)
36 $(AR) $(ARFLAGS) $@ $^
37 -$(RANLIB) $@
38
39 $(PLAYER_STATIC): $(LIBSTATIC) $(PLAYER_OBJ)
40 $(LD) -o $@ $(PLAYER_OBJ) $(PLAYER_LIBS) $(LDFLAGS)
41
42 # rules for library objs:
43 %.o: ../src/%.c
44 $(CC) -c $(CFLAGS_LIB) -o $@ $<
45 # rules for player objs:
46 getopt_long.o: ../src/getopt_long.c
47 $(CC) -c $(CFLAGS_EXE) -o $@ $<
48 wm_tty.o: ../src/wm_tty.c
49 $(CC) -c $(CFLAGS_EXE) -o $@ $<
50 wildmidi.o: ../src/wildmidi.c
51 $(CC) -c $(CFLAGS_EXE) -o $@ $<
52
53 clean:
54 $(RM) *.o
55 distclean: clean
56 $(RM) $(LIBSTATIC) $(PLAYER_STATIC)
57
00 # Setup our wildmidi library that we link to
11 SET(wildmidi_library_SRCS
2 wm_error.c
3 file_io.c
4 lock.c
5 wildmidi_lib.c
6 reverb.c
7 gus_pat.c
8 internal_midi.c
9 patches.c
10 f_xmidi.c
11 f_mus.c
12 f_hmp.c
13 f_midi.c
14 f_hmi.c
15 sample.c
16 mus2mid.c
17 xmi2mid.c
18 )
2 wm_error.c
3 file_io.c
4 lock.c
5 wildmidi_lib.c
6 reverb.c
7 gus_pat.c
8 internal_midi.c
9 patches.c
10 f_xmidi.c
11 f_mus.c
12 f_hmp.c
13 f_midi.c
14 f_hmi.c
15 sample.c
16 mus2mid.c
17 xmi2mid.c
18 )
1919
2020 SET(wildmidi_library_HDRS
21 ../include/wm_error.h
22 ../include/file_io.h
23 ../include/lock.h
24 ../include/wildmidi_lib.h
25 ../include/reverb.h
26 ../include/gus_pat.h
27 ../include/f_xmidi.h
28 ../include/f_mus.h
29 ../include/f_hmp.h
30 ../include/f_midi.h
31 ../include/f_hmi.h
32 ../include/internal_midi.h
33 ../include/patches.h
34 ../include/sample.h
35 ../include/common.h
36 ../include/filenames.h
37 ../include/mus2mid.h
38 ../include/xmi2mid.h
39 )
40
41 IF(MSVC)
42 SET(GETOPT getopt_long.c)
43 ELSE()
44 SET(GETOPT)
45 ENDIF()
21 ../include/wm_error.h
22 ../include/file_io.h
23 ../include/lock.h
24 ../include/wildmidi_lib.h
25 ../include/reverb.h
26 ../include/gus_pat.h
27 ../include/f_xmidi.h
28 ../include/f_mus.h
29 ../include/f_hmp.h
30 ../include/f_midi.h
31 ../include/f_hmi.h
32 ../include/internal_midi.h
33 ../include/patches.h
34 ../include/sample.h
35 ../include/common.h
36 ../include/filenames.h
37 ../include/mus2mid.h
38 ../include/xmi2mid.h
39 )
40
41 IF (MSVC)
42 SET(GETOPT getopt_long.c)
43 ELSE ()
44 SET(GETOPT)
45 ENDIF ()
46
47 IF (AMIGA OR AROS)
48 SET(SYS_OTHER amiga.c)
49 ELSE ()
50 SET(SYS_OTHER)
51 ENDIF ()
52
4653 SET(wildmidi_executable_SRCS
47 ${GETOPT}
48 wm_tty.c
49 wildmidi.c
50 )
54 ${GETOPT}
55 ${SYS_OTHER}
56 wm_tty.c
57 wildmidi.c
58 )
5159
5260 SET(wildmidi_executable_HDRS
53 ../include/wm_tty.h
54 ../include/getopt_long.h
55 )
61 ../include/wm_tty.h
62 ../include/getopt_long.h
63 )
5664
5765 # set our target paths
5866 SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}")
5967 SET(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}")
6068
6169 # set our library names
62 IF(WIN32 AND NOT CMAKE_COMPILER_IS_MINGW) # windows uses *.lib for both static and dynamic, workaround
70 IF (WIN32 AND NOT CMAKE_COMPILER_IS_MINGW) # windows uses *.lib for both static and dynamic, workaround
6371 SET(LIBRARY_DYN_NAME "wildmidi_dynamic")
6472 SET(LIBRARY_STATIC_NAME "wildmidi_static")
65 ELSE() # everyone else uses .a and .so
73 ELSE () # everyone else uses .a and .so
6674 SET(LIBRARY_DYN_NAME "WildMidi")
6775 SET(LIBRARY_STATIC_NAME "WildMidi")
68 ENDIF()
76 ENDIF ()
6977
7078 # do we want a static library?
71 IF(WANT_STATIC)
79 IF (WANT_STATIC)
7280 ADD_LIBRARY(libwildmidi_static STATIC
73 ${wildmidi_library_SRCS}
74 ${wildmidi_library_HDRS}
75 )
81 ${wildmidi_library_SRCS}
82 ${wildmidi_library_HDRS}
83 )
7684
7785 TARGET_LINK_LIBRARIES(libwildmidi_static
78 ${M_LIBRARY}
79 )
86 ${M_LIBRARY}
87 )
8088
8189 SET_TARGET_PROPERTIES(libwildmidi_static PROPERTIES
82 OUTPUT_NAME ${LIBRARY_STATIC_NAME} CLEAN_DIRECT_OUTPUT 1
83 COMPILE_DEFINITIONS WILDMIDI_BUILD
84 )
85 ENDIF(WANT_STATIC)
86
87 # always build our dynamic library
88 ADD_LIBRARY(libwildmidi_dynamic SHARED
89 ${wildmidi_library_SRCS}
90 ${wildmidi_library_HDRS}
91 )
92
93 TARGET_LINK_LIBRARIES(libwildmidi_dynamic
94 ${M_LIBRARY}
95 )
96
97 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
98 SOVERSION ${SOVERSION}
99 VERSION ${VERSION}
100 OUTPUT_NAME ${LIBRARY_DYN_NAME} CLEAN_DIRECT_OUTPUT 1
101 )
102
103 IF(WIN32)
90 OUTPUT_NAME ${LIBRARY_STATIC_NAME} CLEAN_DIRECT_OUTPUT 1
91 COMPILE_DEFINITIONS WILDMIDI_BUILD
92 )
93 ENDIF (WANT_STATIC)
94
95 IF (BUILD_SHARED_LIBS)
96 # dynamic library
97 ADD_LIBRARY(libwildmidi_dynamic SHARED
98 ${wildmidi_library_SRCS}
99 ${wildmidi_library_HDRS}
100 )
101
102 TARGET_LINK_LIBRARIES(libwildmidi_dynamic
103 ${M_LIBRARY}
104 )
105
104106 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
105 DEFINE_SYMBOL DLL_EXPORT
106 COMPILE_DEFINITIONS WILDMIDI_BUILD
107 )
108 ELSEIF(HAVE_VISIBILITY_HIDDEN AND HAVE_VISIBILITY_DEFAULT) # GCC, Clang
109 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
110 COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_VISIBILITY"
111 COMPILE_FLAGS "-fvisibility=hidden"
112 )
113 #ELSEIF(HAVE_LDSCOPE_HIDDEN AND HAVE_VISIBILITY_DEFAULT) # SunPro (__SUNPRO_C >= 0x590)
114 # SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
115 # COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_VISIBILITY"
116 # COMPILE_FLAGS "-xldscope=hidden"
117 # )
118 ELSEIF(HAVE_LDSCOPE_HIDDEN AND HAVE_LDSCOPE_GLOBAL) # SunPro (__SUNPRO_C >= 0x550)
119 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
120 COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_LDSCOPE"
121 COMPILE_FLAGS "-xldscope=hidden"
122 )
123 ELSE()
124 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
125 COMPILE_DEFINITIONS WILDMIDI_BUILD
126 )
127 ENDIF()
107 SOVERSION ${SOVERSION}
108 VERSION ${VERSION}
109 OUTPUT_NAME ${LIBRARY_DYN_NAME} CLEAN_DIRECT_OUTPUT 1
110 )
111
112 IF (WIN32)
113 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
114 DEFINE_SYMBOL DLL_EXPORT
115 COMPILE_DEFINITIONS WILDMIDI_BUILD
116 )
117 ELSEIF (HAVE_VISIBILITY_HIDDEN AND HAVE_VISIBILITY_DEFAULT) # GCC, Clang
118 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
119 COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_VISIBILITY"
120 COMPILE_FLAGS "-fvisibility=hidden"
121 )
122 #ELSEIF (HAVE_LDSCOPE_HIDDEN AND HAVE_VISIBILITY_DEFAULT) # SunPro (__SUNPRO_C >= 0x590)
123 # SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
124 # COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_VISIBILITY"
125 # COMPILE_FLAGS "-xldscope=hidden"
126 # )
127 ELSEIF (HAVE_LDSCOPE_HIDDEN AND HAVE_LDSCOPE_GLOBAL) # SunPro (__SUNPRO_C >= 0x550)
128 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
129 COMPILE_DEFINITIONS "WILDMIDI_BUILD;SYM_LDSCOPE"
130 COMPILE_FLAGS "-xldscope=hidden"
131 )
132 ELSE ()
133 SET_TARGET_PROPERTIES(libwildmidi_dynamic PROPERTIES
134 COMPILE_DEFINITIONS WILDMIDI_BUILD
135 )
136 ENDIF ()
137 ENDIF (BUILD_SHARED_LIBS)
128138
129139 # Set our default and then look at the possible locations
130140 SET(WILDMIDILIB "${CMAKE_BINARY_DIR}/lib${LIBRARY_DYN_NAME}.so")
131141 SET(WILDMIDILIBSTATIC "${CMAKE_BINARY_DIR}/lib${LIBRARY_STATIC_NAME}.a")
132142
133143 # MS Visual Studio
134 IF(MSVC)
144 IF (MSVC)
135145 SET(WILDMIDILIB "${CMAKE_BINARY_DIR}\\${CMAKE_BUILD_TYPE}\\${LIBRARY_DYN_NAME}.lib")
136146 SET(WILDMIDILIBSTATIC "${CMAKE_BINARY_DIR}\\${CMAKE_BUILD_TYPE}\\${LIBRARY_STATIC_NAME}.lib")
137 ENDIF(MSVC)
147 ENDIF (MSVC)
138148
139149 # MinGW or MinGW-w64
140 IF(CMAKE_COMPILER_IS_MINGW)
150 IF (CMAKE_COMPILER_IS_MINGW)
141151 SET(WILDMIDILIB "${CMAKE_BINARY_DIR}/lib${LIBRARY_DYN_NAME}.dll.a")
142152 SET(WILDMIDIDLL "${CMAKE_BINARY_DIR}/lib${LIBRARY_DYN_NAME}.dll")
143153 SET(WILDMIDILIBSTATIC "${CMAKE_BINARY_DIR}/lib${LIBRARY_STATIC_NAME}.a")
144 ENDIF(CMAKE_COMPILER_IS_MINGW)
154 ENDIF (CMAKE_COMPILER_IS_MINGW)
145155
146156 # Apple's Xcode
147 IF(CMAKE_GENERATOR STREQUAL "Xcode")
157 IF (CMAKE_GENERATOR STREQUAL "Xcode")
148158 SET(WILDMIDILIB "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib${LIBRARY_DYN_NAME}.dylib")
149159 SET(WILDMIDILIBSTATIC "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib${LIBRARY_STATIC_NAME}.a")
150 ELSEIF(APPLE) # Apple's CLI default
160 ELSEIF (APPLE) # Apple's CLI default
151161 SET(WILDMIDILIB "${CMAKE_BINARY_DIR}/lib${LIBRARY_DYN_NAME}.dylib")
152162 SET(WILDMIDILIBSTATIC "${CMAKE_BINARY_DIR}/lib${LIBRARY_STATIC_NAME}.a")
153 ENDIF(CMAKE_GENERATOR STREQUAL "Xcode")
163 ENDIF (CMAKE_GENERATOR STREQUAL "Xcode")
154164
155165 # do we want the wildmidi player?
156 IF(WANT_PLAYER)
166 IF (WANT_PLAYER AND BUILD_SHARED_LIBS)
157167 ADD_EXECUTABLE(wildmidi
158 ${wildmidi_executable_SRCS}
159 ${wildmidi_executable_HDRS}
160 )
168 ${wildmidi_executable_SRCS}
169 ${wildmidi_executable_HDRS}
170 )
161171
162172 ADD_DEPENDENCIES(wildmidi libwildmidi_dynamic)
163173
164 IF(AUDIODRV_OPENAL)
165 TARGET_INCLUDE_DIRECTORIES(wildmidi PRIVATE
166 ${OPENAL_INCLUDE_DIR}
167 )
168 ELSEIF(AUDIODRV_ALSA)
169 TARGET_INCLUDE_DIRECTORIES(wildmidi PRIVATE
170 ${ALSA_INCLUDE_DIR}
171 )
172 ELSEIF(AUDIODRV_OSS)
173 # no special header paths
174 ENDIF()
174 IF (AUDIODRV_OPENAL)
175 TARGET_INCLUDE_DIRECTORIES(wildmidi PRIVATE
176 ${OPENAL_INCLUDE_DIR}
177 )
178 ELSEIF (AUDIODRV_ALSA)
179 TARGET_INCLUDE_DIRECTORIES(wildmidi PRIVATE
180 ${ALSA_INCLUDE_DIR}
181 )
182 ELSEIF (AUDIODRV_OSS)
183 # no special header paths
184 ENDIF ()
175185
176186 TARGET_LINK_LIBRARIES(wildmidi
177 ${WILDMIDILIB}
178 ${M_LIBRARY}
179 ${AUDIO_LIBRARY}
180 )
181 ENDIF(WANT_PLAYER)
182
183 IF(WANT_PLAYERSTATIC)
187 ${WILDMIDILIB}
188 ${M_LIBRARY}
189 ${AUDIO_LIBRARY}
190 )
191 ENDIF ()
192
193 IF (WANT_PLAYERSTATIC)
184194 ADD_EXECUTABLE(wildmidi-static
185 ${wildmidi_executable_SRCS}
186 ${wildmidi_executable_HDRS}
187 )
195 ${wildmidi_executable_SRCS}
196 ${wildmidi_executable_HDRS}
197 )
188198
189199 ADD_DEPENDENCIES(wildmidi-static libwildmidi_static)
190200
191201 SET_TARGET_PROPERTIES(wildmidi-static PROPERTIES
192 COMPILE_DEFINITIONS WILDMIDI_STATIC
193 )
194
195 IF(AUDIODRV_OPENAL)
196 TARGET_INCLUDE_DIRECTORIES(wildmidi-static PRIVATE
197 ${OPENAL_INCLUDE_DIR}
198 )
199 ELSEIF(AUDIODRV_ALSA)
200 TARGET_INCLUDE_DIRECTORIES(wildmidi-static PRIVATE
201 ${ALSA_INCLUDE_DIR}
202 )
203 ELSEIF(AUDIODRV_OSS)
204 # no special header paths
205 ENDIF()
202 COMPILE_DEFINITIONS WILDMIDI_STATIC
203 )
204
205 IF (AUDIODRV_OPENAL)
206 TARGET_INCLUDE_DIRECTORIES(wildmidi-static PRIVATE
207 ${OPENAL_INCLUDE_DIR}
208 )
209 ELSEIF (AUDIODRV_ALSA)
210 TARGET_INCLUDE_DIRECTORIES(wildmidi-static PRIVATE
211 ${ALSA_INCLUDE_DIR}
212 )
213 ELSEIF (AUDIODRV_OSS)
214 # no special header paths
215 ENDIF ()
206216
207217 TARGET_LINK_LIBRARIES(wildmidi-static
208 ${WILDMIDILIBSTATIC}
209 ${M_LIBRARY}
210 ${AUDIO_LIBRARY}
211 )
212 ENDIF(WANT_PLAYERSTATIC)
213
214 IF(WANT_DEVTEST)
218 ${WILDMIDILIBSTATIC}
219 ${M_LIBRARY}
220 ${AUDIO_LIBRARY}
221 )
222 ENDIF (WANT_PLAYERSTATIC)
223
224 IF (WANT_DEVTEST)
215225 SET(wildmidi-devtest_executable_SRCS
216 ${GETOPT}
217 DevTest.c
218 )
226 ${GETOPT}
227 DevTest.c
228 )
219229 ADD_EXECUTABLE(wildmidi-devtest
220 ${wildmidi-devtest_executable_SRCS}
221 )
222 ENDIF(WANT_DEVTEST)
230 ${wildmidi-devtest_executable_SRCS}
231 )
232 ENDIF (WANT_DEVTEST)
233
234 # convenience variables
235 SET(WILDMIDILIB_INSTALLDIR "lib${LIB_SUFFIX}")
236 SET(WILDMIDIDLL_INSTALLDIR "bin${LIB_SUFFIX}")
237
238 # add multiarch folder, if needed
239 IF (CMAKE_LIBRARY_ARCHITECTURE)
240 SET(WILDMIDILIB_INSTALLDIR "${WILDMIDILIB_INSTALLDIR}/${CMAKE_LIBRARY_ARCHITECTURE}")
241 SET(WILDMIDIDLL_INSTALLDIR "${WILDMIDIDLL_INSTALLDIR}/${CMAKE_LIBRARY_ARCHITECTURE}")
242 ENDIF ()
243
244 # prepare pkg-config file
245 SET(WILDMIDILIB_PREFIX "${CMAKE_INSTALL_PREFIX}")
246 SET(WILDMIDILIB_LIBDIR "${WILDMIDILIB_INSTALLDIR}")
247 CONFIGURE_FILE("wildmidi.pc.in" "${CMAKE_BINARY_DIR}/wildmidi.pc" @ONLY)
223248
224249 # install target (*nix OSes)
225 IF(UNIX AND NOT APPLE)
250 IF (UNIX AND NOT APPLE)
226251 # install our libraries
227 IF(WANT_STATIC)
228 INSTALL(TARGETS libwildmidi_static DESTINATION "lib${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}")
229 ENDIF(WANT_STATIC)
230 INSTALL(TARGETS libwildmidi_dynamic DESTINATION "lib${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}")
231
232 # install our player if asked for
233 IF(WANT_PLAYER)
234 INSTALL(TARGETS wildmidi DESTINATION bin)
235 ENDIF(WANT_PLAYER)
236 IF(WANT_PLAYERSTATIC)
237 INSTALL(TARGETS wildmidi-static DESTINATION bin)
238 ENDIF(WANT_PLAYERSTATIC)
252 IF (WANT_STATIC)
253 INSTALL(TARGETS libwildmidi_static DESTINATION ${WILDMIDILIB_INSTALLDIR})
254 IF (WANT_PLAYERSTATIC)
255 INSTALL(TARGETS wildmidi-static DESTINATION bin)
256 ENDIF ()
257 ENDIF (WANT_STATIC)
258
259 IF (BUILD_SHARED_LIBS)
260 INSTALL(TARGETS libwildmidi_dynamic DESTINATION ${WILDMIDILIB_INSTALLDIR})
261 IF (WANT_PLAYER)
262 INSTALL(TARGETS wildmidi DESTINATION bin)
263 ENDIF ()
264 ENDIF ()
239265
240266 # install our devtest if asked for
241 IF(WANT_DEVTEST)
267 IF (WANT_DEVTEST)
242268 INSTALL(TARGETS wildmidi-devtest DESTINATION bin)
243 ENDIF(WANT_DEVTEST)
269 ENDIF (WANT_DEVTEST)
270
271 # install pkg-config file
272 INSTALL(FILES ${CMAKE_BINARY_DIR}/wildmidi.pc DESTINATION "${WILDMIDILIB_INSTALLDIR}/pkgconfig")
244273
245274 # install supporting man pages and headers
246275 INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/wildmidi_lib.h DESTINATION include)
247276 INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/docs/man/ DESTINATION share/man)
248 ENDIF(UNIX AND NOT APPLE)
277 ENDIF (UNIX AND NOT APPLE)
249278
250279 # install target (Windows: MinGW or MinGW-w64)
251 IF(WIN32 AND CMAKE_COMPILER_IS_MINGW)
252 IF("${CMAKE_INSTALL_PREFIX}" STREQUAL "")
280 IF (WIN32 AND CMAKE_COMPILER_IS_MINGW)
281 IF ("${CMAKE_INSTALL_PREFIX}" STREQUAL "")
253282 MESSAGE("INSTALL PREFIX IS EMPTY")
254283 SET(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/wildmidi_lib" CACHE STRING "Install Prefix" FORCE)
255284 MESSAGE("INSTALL PREFIX NOW: ${CMAKE_INSTALL_PREFIX}")
256 ENDIF("${CMAKE_INSTALL_PREFIX}" STREQUAL "" )
285 ENDIF ("${CMAKE_INSTALL_PREFIX}" STREQUAL "")
257286 # install our libraries
258 IF(WANT_STATIC)
259 INSTALL(TARGETS libwildmidi_static DESTINATION "lib${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}")
260 ENDIF(WANT_STATIC)
261 INSTALL(FILES ${WILDMIDILIB} DESTINATION "lib${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}")
262 INSTALL(FILES ${WILDMIDIDLL} DESTINATION "bin${LIB_SUFFIX}/${CMAKE_LIBRARY_ARCHITECTURE}")
263
264 # install our player if asked for
265 IF(WANT_PLAYER)
266 INSTALL(TARGETS wildmidi DESTINATION bin)
267 ENDIF(WANT_PLAYER)
268 IF(WANT_PLAYERSTATIC)
269 INSTALL(TARGETS wildmidi-static DESTINATION bin)
270 ENDIF(WANT_PLAYERSTATIC)
287 IF (WANT_STATIC)
288 INSTALL(TARGETS libwildmidi_static DESTINATION ${WILDMIDILIB_INSTALLDIR})
289 IF (WANT_PLAYERSTATIC)
290 INSTALL(TARGETS wildmidi-static DESTINATION bin)
291 ENDIF ()
292 ENDIF (WANT_STATIC)
293 IF (BUILD_SHARED_LIBS)
294 INSTALL(FILES ${WILDMIDILIB} DESTINATION ${WILDMIDILIB_INSTALLDIR})
295 INSTALL(FILES ${WILDMIDIDLL} DESTINATION ${WILDMIDIDLL_INSTALLDIR})
296 IF (WANT_PLAYER)
297 INSTALL(TARGETS wildmidi DESTINATION bin)
298 ENDIF ()
299 ENDIF ()
271300
272301 # install our devtest if asked for
273 IF(WANT_DEVTEST)
302 IF (WANT_DEVTEST)
274303 INSTALL(TARGETS wildmidi-devtest DESTINATION bin)
275 ENDIF(WANT_DEVTEST)
304 ENDIF (WANT_DEVTEST)
305
306 # install pkg-config file
307 INSTALL(FILES ${CMAKE_BINARY_DIR}/wildmidi.pc DESTINATION "${WILDMIDILIB_INSTALLDIR}/pkgconfig")
276308
277309 # install supporting man pages and headers
278310 INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/wildmidi_lib.h DESTINATION include)
279311 INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/docs/man/ DESTINATION share/man)
280 ENDIF(WIN32 AND CMAKE_COMPILER_IS_MINGW)
312 ENDIF (WIN32 AND CMAKE_COMPILER_IS_MINGW)
313
314 IF (WIN32 AND MSVC)
315 IF (WANT_MP_BUILD)
316 SET(MT_BUILD "/MP")
317 ENDIF ()
318
319 foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
320 STRING(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
321 SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "$(SolutionDir)$(Configuration)")
322 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "$(ProjectDir)$(Configuration)")
323 endforeach (OUTPUTCONFIG)
324
325 IF (WANT_PLAYER)
326 # Release builds use the debug console
327 SET_TARGET_PROPERTIES(wildmidi PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:CONSOLE")
328 SET_TARGET_PROPERTIES(wildmidi PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:CONSOLE")
329 TARGET_COMPILE_DEFINITIONS(wildmidi PRIVATE $<$<CONFIG:Release>:_CONSOLE>)
330 TARGET_COMPILE_DEFINITIONS(wildmidi PRIVATE $<$<CONFIG:MinSizeRel>:_CONSOLE>)
331 ENDIF ()
332
333 IF (WANT_PLAYERSTATIC)
334 # Release builds use the debug console
335 SET_TARGET_PROPERTIES(wildmidi-static PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:CONSOLE")
336 SET_TARGET_PROPERTIES(wildmidi-static PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:CONSOLE")
337 TARGET_COMPILE_DEFINITIONS(wildmidi-static PRIVATE $<$<CONFIG:Release>:_CONSOLE>)
338 TARGET_COMPILE_DEFINITIONS(wildmidi-static PRIVATE $<$<CONFIG:MinSizeRel>:_CONSOLE>)
339 ENDIF ()
340
341 # Play a bit with the warning levels
342
343 SET(WARNINGS "/Wall") # Since windows can only disable specific warnings, not enable them
344
345 SET(WARNINGS_DISABLE
346 # Warnings that aren't enabled normally and don't need to be enabled
347 # They're unneeded and sometimes completely retarded warnings that /Wall enables
348 # Not going to bother commenting them as they tend to warn on every standard library file
349 4061 4263 4264 4266 4350 4371 4435 4514 4548 4571 4610 4619 4623 4625 4626 4628 4640 4668 4710 4711 4820 4826 4917 4946
350
351 # Warnings that are thrown on standard libraries
352 4347 # Non-template function with same name and parameter count as template function
353 4365 # Variable signed/unsigned mismatch
354 4510 4512 # Unable to generate copy constructor/assignment operator as it's not public in the base
355 4706 # Assignment in conditional expression
356 4738 # Storing 32-bit float result in memory, possible loss of performance
357 4986 # Undocumented warning that occurs in the crtdbg.h file
358 4987 # nonstandard extension used (triggered by setjmp.h)
359 4996 # Function was declared deprecated
360
361 # caused by boost
362 4191 # 'type cast' : unsafe conversion (1.56, thread_primitives.hpp, normally off)
363
364 # project specific warnings
365 4099 # Type mismatch, declared class or struct is defined with other type
366 4100 # Unreferenced formal parameter (-Wunused-parameter)
367 4101 # Unreferenced local variable (-Wunused-variable)
368 4127 # Conditional expression is constant
369 4242 # Storing value in a variable of a smaller type, possible loss of data
370 4244 # Storing value of one type in variable of another (size_t in int, for example)
371 4245 # Signed/unsigned mismatch
372 4267 # Conversion from 'size_t' to 'int', possible loss of data
373 4305 # Truncating value (double to float, for example)
374 4309 # Variable overflow, trying to store 128 in a signed char for example
375 4351 # New behavior: elements of array 'array' will be default initialized (desired behavior)
376 4355 # Using 'this' in member initialization list
377 4505 # Unreferenced local function has been removed
378 4701 # Potentially uninitialized local variable used
379 4702 # Unreachable code
380 4800 # Boolean optimization warning, e.g. myBool = (myInt != 0) instead of myBool = myInt
381 )
382
383 foreach (d ${WARNINGS_DISABLE})
384 SET(WARNINGS "${WARNINGS} /wd${d}")
385 endforeach (d)
386
387 IF (WANT_PLAYER)
388 SET_TARGET_PROPERTIES(wildmidi PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
389 ENDIF ()
390
391 IF (WANT_PLAYERSTATIC)
392 SET_TARGET_PROPERTIES(wildmidi-static PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
393 ENDIF ()
394
395 ENDIF ()
15641564 }
15651565
15661566 if (strncmp((char *) midi_data, "MThd", 4) != 0) {
1567 printf("Not a compatable file\n");
1567 printf("Not a compatible file\n");
15681568 return -1;
15691569 }
15701570
0 /* amiga-specific stuff for WildMIDI player
1 * Copyright (C) WildMIDI Developers 2016
2 *
3 * WildMIDI is free software: you can redistribute and/or modify the player
4 * under the terms of the GNU General Public License and you can redistribute
5 * and/or modify the library under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation, either version 3 of
7 * the licenses, or(at your option) any later version.
8 *
9 * WildMIDI is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License and
12 * the GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License and the
15 * GNU Lesser General Public License along with WildMIDI. If not, see
16 * <http://www.gnu.org/licenses/>.
17 */
18
19 #include <proto/exec.h>
20 #include <proto/dos.h>
21 #include <proto/timer.h>
22
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 struct timerequest *timerio;
27 struct MsgPort *timerport;
28 #if defined(__MORPHOS__) || defined(__VBCC__)
29 struct Library *TimerBase;
30 #else
31 struct Device *TimerBase;
32 #endif
33
34 static BPTR amiga_stdin, amiga_stdout;
35 #define MODE_RAW 1
36 #define MODE_NORMAL 0
37
38 static void amiga_atexit (void) {
39 if (amiga_stdin)
40 SetMode(amiga_stdin, MODE_NORMAL);
41 if (TimerBase) {
42 WaitIO((struct IORequest *) timerio);
43 CloseDevice((struct IORequest *) timerio);
44 DeleteIORequest((struct IORequest *) timerio);
45 DeleteMsgPort(timerport);
46 TimerBase = NULL;
47 }
48 }
49
50 void amiga_sysinit (void) {
51 if ((timerport = CreateMsgPort())) {
52 if ((timerio = (struct timerequest *)CreateIORequest(timerport, sizeof(struct timerequest)))) {
53 if (OpenDevice((STRPTR) TIMERNAME, UNIT_MICROHZ, (struct IORequest *) timerio, 0) == 0) {
54 #if defined(__MORPHOS__) || defined(__VBCC__)
55 TimerBase = (struct Library *)timerio->tr_node.io_Device;
56 #else
57 TimerBase = timerio->tr_node.io_Device;
58 #endif
59 }
60 else {
61 DeleteIORequest((struct IORequest *)timerio);
62 DeleteMsgPort(timerport);
63 }
64 }
65 else {
66 DeleteMsgPort(timerport);
67 }
68 }
69 if (!TimerBase) {
70 fprintf(stderr, "Can't open timer.device\n");
71 exit (-1);
72 }
73
74 /* 1us wait, for timer cleanup success */
75 timerio->tr_node.io_Command = TR_ADDREQUEST;
76 timerio->tr_time.tv_secs = 0;
77 timerio->tr_time.tv_micro = 1;
78 SendIO((struct IORequest *) timerio);
79 WaitIO((struct IORequest *) timerio);
80
81 amiga_stdout = Output();
82 amiga_stdin = Input();
83 SetMode(amiga_stdin, MODE_RAW);
84
85 atexit (amiga_atexit);
86 }
87
88 int amiga_getch (unsigned char *c) {
89 if (WaitForChar(amiga_stdin,10)) {
90 return Read (amiga_stdin, c, 1);
91 }
92 return 0;
93 }
94
95 void amiga_usleep(unsigned long timeout) {
96 timerio->tr_node.io_Command = TR_ADDREQUEST;
97 timerio->tr_time.tv_secs = timeout / 1000000;
98 timerio->tr_time.tv_micro = timeout % 1000000;
99 SendIO((struct IORequest *) timerio);
100 WaitIO((struct IORequest *) timerio);
101 }
7777 UNUSED(hmi_size);
7878
7979 if (memcmp(hmi_data, "HMI-MIDISONG061595", 18)) {
80 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMI, NULL, 0);
80 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMI, NULL, 0);
8181 return NULL;
8282 }
8383
113113 smallest_delta = 0xffffffff;
114114
115115 if (hmi_size < (370 + (hmi_track_cnt * 17))) {
116 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMI, "file too short", 0);
116 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMI, "file too short", 0);
117117 goto _hmi_end;
118118 }
119119
126126 hmi_track_offset[i] += (*hmi_data++ << 24);
127127
128128 if (hmi_size < (hmi_track_offset[i] + 0x5a + 4)) {
129 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMI, "file too short", 0);
129 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMI, "file too short", 0);
130130 goto _hmi_end;
131131 }
132132
133133 hmi_addr = hmi_base + hmi_track_offset[i];
134134
135135 if (memcmp(hmi_addr, "HMI-MIDITRACK", 13)) {
136 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMI, NULL, 0);
136 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMI, NULL, 0);
137137 goto _hmi_end;
138138 }
139139
230230 hmi_track_offset[i] += 4;
231231 } else {
232232 if ((setup_ret = _WM_SetupMidiEvent(hmi_mdi,hmi_data,hmi_running_event[i])) == 0) {
233 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
234233 goto _hmi_end;
235234 }
236235 if ((hmi_data[0] == 0xff) && (hmi_data[1] == 0x2f) && (hmi_data[2] == 0x00)) {
330329 }
331330
332331 if ((hmi_mdi->reverb = _WM_init_reverb(_WM_SampleRate, _WM_reverb_room_width, _WM_reverb_room_length, _WM_reverb_listen_posx, _WM_reverb_listen_posy)) == NULL) {
333 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
332 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
334333 goto _hmi_end;
335334 }
336335
353352 _WM_freeMDI(hmi_mdi);
354353 return 0;
355354 }
356
7474 float sample_remainder = 0;
7575
7676 if (memcmp(hmp_data, "HMIMIDIP", 8)) {
77 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMP, NULL, 0);
77 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMP, NULL, 0);
7878 return NULL;
7979 }
8080 hmp_data += 8;
9494 }
9595 for (i = 0; i < zero_cnt; i++) {
9696 if (hmp_data[i] != 0) {
97 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMP, NULL, 0);
97 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMP, NULL, 0);
9898 return NULL;
9999 }
100100 }
202202 chunk_ofs[i] += 4;
203203
204204 if (chunk_length[i] > hmp_size) {
205 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_HMP, "file too short", 0);
205 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_HMP, "file too short", 0);
206206 goto _hmp_end;
207207 }
208208 hmp_size -= chunk_length[i];
276276 uint32_t setup_ret = 0;
277277
278278 if ((setup_ret = _WM_SetupMidiEvent(hmp_mdi, hmp_chunk[i], 0)) == 0) {
279 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
280279 goto _hmp_end;
281280 }
282281
330329 }
331330
332331 if ((hmp_mdi->reverb = _WM_init_reverb(_WM_SampleRate, _WM_reverb_room_width, _WM_reverb_room_length, _WM_reverb_listen_posx, _WM_reverb_listen_posy)) == NULL) {
333 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
332 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
334333 goto _hmp_end;
335334 }
336335
6868 uint32_t setup_ret = 0;
6969
7070 if (midi_size < 14) {
71 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
71 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
7272 return (NULL);
7373 }
7474
7575 if (!memcmp(midi_data, "RIFF", 4)) {
7676 if (midi_size < 34) {
77 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
77 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
7878 return (NULL);
7979 }
8080 midi_data += 20;
8282 }
8383
8484 if (memcmp(midi_data, "MThd", 4)) {
85 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MIDI, NULL, 0);
85 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MIDI, NULL, 0);
8686 return (NULL);
8787 }
8888 midi_data += 4;
9797 tmp_val |= *midi_data++;
9898 midi_size -= 4;
9999 if (tmp_val != 6) {
100 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, NULL, 0);
100 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, NULL, 0);
101101 return (NULL);
102102 }
103103
108108 tmp_val |= *midi_data++;
109109 midi_size -= 2;
110110 if (tmp_val > 2) {
111 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, NULL, 0);
111 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, NULL, 0);
112112 return (NULL);
113113 }
114114 midi_type = tmp_val;
120120 tmp_val |= *midi_data++;
121121 midi_size -= 2;
122122 if (tmp_val < 1) {
123 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(no tracks)", 0);
123 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(no tracks)", 0);
124124 return (NULL);
125125 }
126126 no_tracks = tmp_val;
129129 * Check that type 0 midi file has only 1 track
130130 */
131131 if ((midi_type == 0) && (no_tracks > 1)) {
132 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, "(expected 1 track for type 0 midi file, found more)", 0);
132 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, "(expected 1 track for type 0 midi file, found more)", 0);
133133 return (NULL);
134134 }
135135
140140 divisions |= *midi_data++;
141141 midi_size -= 2;
142142 if (divisions & 0x00008000) {
143 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, NULL, 0);
143 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, NULL, 0);
144144 return (NULL);
145145 }
146146
157157 smallest_delta = 0xffffffff;
158158 for (i = 0; i < no_tracks; i++) {
159159 if (midi_size < 8) {
160 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
160 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
161161 goto _end;
162162 }
163163 if (memcmp(midi_data, "MTrk", 4) != 0) {
164 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing track header)", 0);
164 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(missing track header)", 0);
165165 goto _end;
166166 }
167167 midi_data += 4;
173173 track_size |= *midi_data++;
174174 midi_size -= 4;
175175 if (midi_size < track_size) {
176 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
176 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
177177 goto _end;
178178 }
179179 if (track_size < 3) {
180 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(bad track size)", 0);
180 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(bad track size)", 0);
181181 goto _end;
182182 }
183183 if ((midi_data[track_size - 3] != 0xFF)
184184 || (midi_data[track_size - 2] != 0x2F)
185185 || (midi_data[track_size - 1] != 0x00)) {
186 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing EOT)", 0);
186 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(missing EOT)", 0);
187187 goto _end;
188188 }
189189 tracks[i] = midi_data;
244244 do {
245245 setup_ret = _WM_SetupMidiEvent(mdi, tracks[i], running_event[i]);
246246 if (setup_ret == 0) {
247 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
248247 goto _end;
249248 }
250249 if (tracks[i][0] > 0x7f) {
306305 do {
307306 setup_ret = _WM_SetupMidiEvent(mdi, tracks[i], running_event[i]);
308307 if (setup_ret == 0) {
309 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
310308 goto _end;
311309 }
312310 if (tracks[i][0] > 0x7f) {
357355 if ((mdi->reverb = _WM_init_reverb(_WM_SampleRate, _WM_reverb_room_width,
358356 _WM_reverb_room_length, _WM_reverb_listen_posx, _WM_reverb_listen_posy))
359357 == NULL) {
360 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
358 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
361359 goto _end;
362360 }
363361
410408 uint32_t track_count = 0;
411409
412410 if (!mdi->event_count) {
413 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CONVERT, "(No events to convert)", 0);
411 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CONVERT, "(No events to convert)", 0);
414412 return -1;
415413 }
416414
678676 } else if (event->do_event == _WM_do_sysex_roland_drum_track) {
679677 // DEBUG
680678 // fprintf(stderr,"Sysex Roland Drum Track: %u %.4x\r\n",event->event_data.channel, event->event_data.data);
681 int8_t foo[] = {0xf0, 0x09, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x15, 0x00, 0xf7};
679 uint8_t foo[] = {0xf0, 0x09, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x15, 0x00, 0xf7};
682680 uint8_t foo_ch = event->event_data.channel;
683681 if (foo_ch == 9) {
684682 foo_ch = 0;
693691 } else if (event->do_event == _WM_do_sysex_gm_reset) {
694692 // DEBUG
695693 // fprintf(stderr,"Sysex GM Reset\r\n");
696 int8_t foo[] = {0xf0, 0x05, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
694 uint8_t foo[] = {0xf0, 0x05, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
697695 memcpy(&((*out)[out_ofs]),foo,7);
698696 out_ofs += 7;
699697 running_event = 0;
700698 } else if (event->do_event == _WM_do_sysex_roland_reset) {
701699 // DEBUG
702700 // fprintf(stderr,"Sysex Roland Reset\r\n");
703 int8_t foo[] = {0xf0, 0x0a, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7};
701 uint8_t foo[] = {0xf0, 0x0a, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7};
704702 memcpy(&((*out)[out_ofs]),foo,12);
705703 out_ofs += 12;
706704 running_event = 0;
707705 } else if (event->do_event == _WM_do_sysex_yamaha_reset) {
708706 // DEBUG
709707 // fprintf(stderr,"Sysex Yamaha Reset\r\n");
710 int8_t foo[] = {0xf0, 0x08, 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00, 0xf7};
708 uint8_t foo[] = {0xf0, 0x08, 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00, 0xf7};
711709 memcpy(&((*out)[out_ofs]),foo,10);
712710 out_ofs += 10;
713711 running_event = 0;
7171 uint16_t pitchbend_tmp = 0;
7272
7373 if (mus_size < 17) {
74 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MUS, "File too short", 0);
74 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MUS, "File too short", 0);
7575 return NULL;
7676 }
7777
7878 if (memcmp(mus_data, mus_hdr, 4)) {
79 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MUS, NULL, 0);
79 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MUS, NULL, 0);
8080 return NULL;
8181 }
8282
100100
101101 // Check that we have enough data to check the rest
102102 if (mus_size < (mus_data_ofs + (mus_no_instr << 1) + mus_song_len)) {
103 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MUS, "File too short", 0);
103 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MUS, "File too short", 0);
104104 return NULL;
105105 }
106106
315315
316316 setup_ret = _WM_SetupMidiEvent(mus_mdi, (uint8_t *)mus_event, 0);
317317 if (setup_ret == 0) {
318 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
319318 goto _mus_end;
320319 }
321320
344343 _mus_end_of_song:
345344 // Finalise mdi structure
346345 if ((mus_mdi->reverb = _WM_init_reverb(_WM_SampleRate, _WM_reverb_room_width, _WM_reverb_room_length, _WM_reverb_listen_posx, _WM_reverb_listen_posy)) == NULL) {
347 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
346 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
348347 goto _mus_end;
349348 }
350349 _WM_midi_setup_endoftrack(mus_mdi);
6363
6464
6565 if (memcmp(xmi_data,"FORM",4)) {
66 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
66 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
6767 return NULL;
6868 }
6969
7878 xmi_size -= 4;
7979
8080 if (memcmp(xmi_data,"XDIRINFO",8)) {
81 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
81 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
8282 return NULL;
8383 }
8484 xmi_data += 8;
9494 // number of forms contained after this point
9595 xmi_formcnt = *xmi_data++;
9696 if (xmi_formcnt == 0) {
97 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
97 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
9898 return NULL;
9999 }
100100 xmi_size--;
109109
110110 /* FIXME: Check: may not even need to process CAT information */
111111 if (memcmp(xmi_data,"CAT ",4)) {
112 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
112 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
113113 return NULL;
114114 }
115115 xmi_data += 4;
124124 UNUSED(xmi_catlen);
125125
126126 if (memcmp(xmi_data,"XMID",4)) {
127 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
127 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
128128 return NULL;
129129 }
130130 xmi_data += 4;
141141
142142 for (i = 0; i < xmi_formcnt; i++) {
143143 if (memcmp(xmi_data,"FORM",4)) {
144 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
144 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
145145 goto _xmi_end;
146146 }
147147 xmi_data += 4;
154154 xmi_size -= 4;
155155
156156 if (memcmp(xmi_data,"XMID",4)) {
157 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
157 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
158158 goto _xmi_end;
159159 }
160160 xmi_data += 4;
267267 goto _XMI_Next_Event;
268268 }
269269 if ((setup_ret = _WM_SetupMidiEvent(xmi_mdi,xmi_data,0)) == 0) {
270 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
271270 goto _xmi_end;
272271 }
273272
313312 } while (xmi_evntlen);
314313
315314 } else {
316 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
315 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
317316 goto _xmi_end;
318317 }
319318
322321
323322 // Finalise mdi structure
324323 if ((xmi_mdi->reverb = _WM_init_reverb(_WM_SampleRate, _WM_reverb_room_width, _WM_reverb_room_length, _WM_reverb_listen_posx, _WM_reverb_listen_posy)) == NULL) {
325 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
324 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to init reverb", 0);
326325 goto _xmi_end;
327326 }
328327 xmi_mdi->extra_info.current_sample = 0;
2424
2525 #include <stdint.h>
2626 #include <errno.h>
27 #include <fcntl.h>
2827 #include <stdlib.h>
2928 #include <string.h>
29
30 #ifndef WILDMIDI_AMIGA
31 #include <fcntl.h>
3032 #include <sys/types.h>
3133 #include <sys/stat.h>
32
34 #endif
3335 #ifdef _WIN32
36 #include <windows.h>
3437 #include <io.h>
3538 #undef close
3639 #define close _close
4245 #include <io.h>
4346 #include <dir.h>
4447 #include <unistd.h>
48 #elif defined(__OS2__) || defined(__EMX__)
49 #define INCL_DOS
50 #define INCL_DOSERRORS
51 #include <os2.h>
52 #include <fcntl.h>
53 #include <io.h>
54 #elif defined(WILDMIDI_AMIGA)
55 #include <proto/exec.h>
56 #include <proto/dos.h>
4557 #else
4658 #include <pwd.h>
4759 #include <strings.h>
5971 #include "wm_error.h"
6072 #include "file_io.h"
6173
74 #ifdef WILDMIDI_AMIGA
75 static long AMIGA_filesize (const char *path) {
76 long size = -1;
77 BPTR fh = Open((const STRPTR) path, MODE_OLDFILE);
78 if (fh) {
79 struct FileInfoBlock *fib = (struct FileInfoBlock*)
80 AllocDosObject(DOS_FIB, NULL);
81 if (fib != NULL) {
82 if (ExamineFH(fh, fib))
83 size = fib->fib_Size;
84 FreeDosObject(DOS_FIB, fib);
85 }
86 Close(fh);
87 }
88 return size;
89 }
90
91 static long AMIGA_read (BPTR fd, unsigned char *buf, long size) {
92 long bytes_read = 0, result;
93 while (bytes_read < size) {
94 result = Read(fd, buf + bytes_read, size - bytes_read);
95 if (result < 0) return result;
96 if (result == 0) break;
97 bytes_read += result;
98 }
99 return bytes_read;
100 }
101
102 static BPTR AMIGA_open (const char *path) {
103 return Open((const STRPTR) path, MODE_OLDFILE);
104 }
105
106 static void AMIGA_close (BPTR fd) {
107 Close(fd);
108 }
109 #endif
110
62111 void *_WM_BufferFile(const char *filename, uint32_t *size) {
63 int buffer_fd;
112 char *buffer_file = NULL;
64113 uint8_t *data;
65114 #ifdef __DJGPP__
115 int buffer_fd;
66116 struct ffblk f;
67 #else
117 #elif defined(_WIN32)
118 int buffer_fd;
119 HANDLE h;
120 WIN32_FIND_DATA wfd;
121 #elif defined(__OS2__) || defined(__EMX__)
122 int buffer_fd;
123 HDIR h = HDIR_CREATE;
124 FILEFINDBUF3 fb = {0};
125 ULONG cnt = 1;
126 #elif defined(WILDMIDI_AMIGA)
127 BPTR buffer_fd;
128 long filsize;
129 #elif defined(_3DS) || defined(GEKKO)
130 int buffer_fd;
68131 struct stat buffer_stat;
69 #endif
70 #if !defined(_WIN32) && !defined(__DJGPP__)
132 #else /* unix builds */
133 int buffer_fd;
134 struct stat buffer_stat;
135
136 /* for basedir of filename: */
71137 const char *home = NULL;
72138 struct passwd *pwd_ent;
73139 char buffer_dir[1024];
74 #endif /* unix builds */
75 char *buffer_file = NULL;
76
77 #if !defined(_WIN32) && !defined(__DJGPP__)
140
78141 if (strncmp(filename, "~/", 2) == 0) {
79142 if ((pwd_ent = getpwuid(getuid()))) {
80143 home = pwd_ent->pw_dir;
84147 if (home) {
85148 buffer_file = malloc(strlen(filename) + strlen(home) + 1);
86149 if (buffer_file == NULL) {
87 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
88 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, errno);
150 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, filename, errno);
89151 return NULL;
90152 }
91153 strcpy(buffer_file, home);
96158 if (cwdresult != NULL)
97159 buffer_file = malloc(strlen(filename) + strlen(buffer_dir) + 2);
98160 if (buffer_file == NULL || cwdresult == NULL) {
99 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
100 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, errno);
161 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, filename, errno);
101162 return NULL;
102163 }
103164 strcpy(buffer_file, buffer_dir);
105166 strcat(buffer_file, "/");
106167 strcat(buffer_file, filename);
107168 }
108 #endif
169 #endif /* unix builds */
109170
110171 if (buffer_file == NULL) {
111172 buffer_file = malloc(strlen(filename) + 1);
112173 if (buffer_file == NULL) {
113 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
114 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, errno);
174 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, filename, errno);
115175 return NULL;
116176 }
117177 strcpy(buffer_file, filename);
119179
120180 #ifdef __DJGPP__
121181 if (findfirst(buffer_file, &f, FA_ARCH | FA_RDONLY) != 0) {
122 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_STAT, filename, errno);
182 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_STAT, filename, errno);
123183 free(buffer_file);
124184 return NULL;
125185 }
126186 *size = f.ff_fsize;
187 #elif defined(_WIN32)
188 if ((h = FindFirstFile(buffer_file, &wfd)) == INVALID_HANDLE_VALUE) {
189 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_STAT, filename, ENOENT);
190 free(buffer_file);
191 return NULL;
192 }
193 FindClose(h);
194 if (wfd.nFileSizeHigh != 0) /* too big */
195 *size = 0xffffffff;
196 else *size = wfd.nFileSizeLow;
197 #elif defined(__OS2__) || defined(__EMX__)
198 if (DosFindFirst(buffer_file, &h, FILE_NORMAL, &fb, sizeof(fb), &cnt, FIL_STANDARD) != NO_ERROR) {
199 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_STAT, filename, ENOENT);
200 free(buffer_file);
201 return NULL;
202 }
203 DosFindClose(h);
204 *size = fb.cbFile;
205 #elif defined(WILDMIDI_AMIGA)
206 if ((filsize = AMIGA_filesize(buffer_file)) < 0) {
207 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_STAT, filename, ENOENT /* do better!! */);
208 free(buffer_file);
209 return NULL;
210 }
211 *size = filsize;
127212 #else
128213 if (stat(buffer_file, &buffer_stat)) {
129 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_STAT, filename, errno);
130 free(buffer_file);
131 return NULL;
132 }
133 *size = buffer_stat.st_size;
214 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_STAT, filename, errno);
215 free(buffer_file);
216 return NULL;
217 }
218 /* st_size can be sint32 or int64. */
219 if (buffer_stat.st_size > WM_MAXFILESIZE) /* too big */
220 *size = 0xffffffff;
221 else *size = buffer_stat.st_size;
134222 #endif
135223
136224 if (__builtin_expect((*size > WM_MAXFILESIZE), 0)) {
137225 /* don't bother loading suspiciously long files */
138 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LONGFIL, filename, 0);
226 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_LONGFIL, filename, 0);
139227 free(buffer_file);
140228 return NULL;
141229 }
143231 /* +1 needed for parsing text files without a newline at the end */
144232 data = (uint8_t *) malloc(*size + 1);
145233 if (data == NULL) {
146 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
147 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, errno);
148 free(buffer_file);
149 return NULL;
150 }
151
234 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, filename, errno);
235 free(buffer_file);
236 return NULL;
237 }
238
239 #if defined(WILDMIDI_AMIGA)
240 if (!(buffer_fd = AMIGA_open(buffer_file))) {
241 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_OPEN, filename, ENOENT /* do better!! */);
242 free(buffer_file);
243 free(data);
244 return NULL;
245 }
246 if (AMIGA_read(buffer_fd, data, filsize) != filsize) {
247 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_READ, filename, EIO /* do better!! */);
248 free(buffer_file);
249 free(data);
250 AMIGA_close(buffer_fd);
251 return NULL;
252 }
253 AMIGA_close(buffer_fd);
254 free(buffer_file);
255 #else
152256 if ((buffer_fd = open(buffer_file,(O_RDONLY | O_BINARY))) == -1) {
153 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_OPEN, filename, errno);
257 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_OPEN, filename, errno);
154258 free(buffer_file);
155259 free(data);
156260 return NULL;
157261 }
158262 if (read(buffer_fd, data, *size) != (long) *size) {
159 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_READ, filename, errno);
263 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_READ, filename, errno);
160264 free(buffer_file);
161265 free(data);
162266 close(buffer_fd);
163267 return NULL;
164268 }
165 data[*size] = '\0';
166
167269 close(buffer_fd);
168270 free(buffer_file);
271 #endif
272
273 data[*size] = '\0';
169274 return data;
170275 }
5252 #define GUSPAT_END_DEBUG()
5353 #endif
5454
55 /*
56 * sample data conversion functions
55 /* sample data conversion functions
5756 * convert data to signed shorts
5857 */
5958
7372 return 0;
7473 }
7574
76 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, 0, "calloc failed", errno);
75 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, 0, "calloc failed", errno);
7776
7877 return -1;
7978 }
126125 return 0;
127126 }
128127
129 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
128 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
130129 return -1;
131130 }
132131
152151 gus_sample->modes ^= SAMPLE_REVERSE;
153152 return 0;
154153 }
155 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
154 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
156155 return -1;
157156 }
158157
203202 return 0;
204203 }
205204
206 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
205 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
207206 return -1;
208207 }
209208
223222 gus_sample->modes ^= SAMPLE_UNSIGNED;
224223 return 0;
225224 }
226 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
225 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
227226 return -1;
228227 }
229228
275274 return 0;
276275 }
277276
278 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
277 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
279278 return -1;
280279 }
281280
301300 gus_sample->modes ^= SAMPLE_REVERSE | SAMPLE_UNSIGNED;
302301 return 0;
303302 }
304 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
303 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
305304 return -1;
306305 }
307306
351350 return 0;
352351 }
353352
354 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
353 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
355354 return -1;
356355 }
357356
375374 gus_sample->data_length >>= 1;
376375 return 0;
377376 }
378 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
377 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
379378 return -1;
380379 }
381380
435434 return 0;
436435 }
437436
438 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
437 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
439438 return -1;
440439 }
441440
465464 gus_sample->modes ^= SAMPLE_REVERSE;
466465 return 0;
467466 }
468 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
467 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
469468 return -1;
470469 }
471470
520519 return 0;
521520 }
522521
523 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
522 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
524523 return -1;
525524 }
526525
544543 gus_sample->modes ^= SAMPLE_UNSIGNED;
545544 return 0;
546545 }
547 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
546 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
548547 return -1;
549548 }
550549
604603 return 0;
605604 }
606605
607 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
606 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
608607 return -1;
609608 }
610609
634633 gus_sample->modes ^= SAMPLE_REVERSE | SAMPLE_UNSIGNED;
635634 return 0;
636635 }
637 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
636 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
638637 return -1;
639638 }
640639
689688 return 0;
690689 }
691690
692 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
691 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to parse sample", errno);
693692 return -1;
694693 }
695694
732731 return NULL;
733732 }
734733 if (gus_size < 239) {
735 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
736 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, 0);
734 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, filename, 0);
737735 free(gus_patch);
738736 return NULL;
739737 }
740738 if (memcmp(gus_patch, "GF1PATCH110\0ID#000002", 22)
741739 && memcmp(gus_patch, "GF1PATCH100\0ID#000002", 22)) {
742 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, "(unsupported format)",
743 0);
744 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, 0);
740 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, filename, 0);
745741 free(gus_patch);
746742 return NULL;
747743 }
748744 if (gus_patch[82] > 1) {
749 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, "(unsupported format)",
750 0);
751 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, 0);
745 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, filename, 0);
752746 free(gus_patch);
753747 return NULL;
754748 }
755749 if (gus_patch[151] > 1) {
756 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, "(unsupported format)",
757 0);
758 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, 0);
750 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, filename, 0);
759751 free(gus_patch);
760752 return NULL;
761753 }
775767 gus_sample = gus_sample->next;
776768 }
777769 if (gus_sample == NULL) {
778 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, 0);
779 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, filename, 0);
770 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, filename, 0);
780771 free(gus_patch);
781772 return NULL;
782773 }
918909 / ((float) _WM_SampleRate * env_time_table[env_rate]));
919910 GUSPAT_INT_DEBUG("Envelope Rate",gus_sample->env_rate[i]); GUSPAT_INT_DEBUG("GUSPAT Rate",env_rate);
920911 if (gus_sample->env_rate[i] == 0) {
921 _WM_ERROR_NEW("%s: Warning: found invalid envelope(%u) rate setting in %s. Using %f instead.",
912 _WM_DEBUG_MSG("%s: Warning: found invalid envelope(%u) rate setting in %s. Using %f instead.",
922913 __FUNCTION__, i, filename, env_time_table[63]);
923914 gus_sample->env_rate[i] = (int32_t) (4194303.0
924915 / ((float) _WM_SampleRate * env_time_table[63]));
3838 #include "internal_midi.h"
3939 #ifdef __DJGPP__
4040 #define powf pow /* prefer C89 pow() from libc.a instead of powf() from libm. */
41 #endif
42 #ifdef WILDMIDI_AMIGA
43 #define powf pow
44 #endif
45 #if defined(__WATCOMC__) || defined(__EMX__)
46 #define powf pow
4147 #endif
4248
4349 #define HOLD_OFF 0x02
9298 -0.5559443807, -0.4152814317, -0.2757483179, -0.1373270335, 0.0 };
9399
94100 /* f: As per midi 2 standard */
95 static float dBm_pan_volume[] = { -999999.999999, -38.15389834 -32.13396282,
101 static float dBm_pan_volume[] = { -999999.999999, -38.15389834, -32.13396282,
96102 -28.61324502, -26.1160207, -24.179814, -22.5986259, -21.26257033,
97103 -20.10605521, -19.08677237, -18.17583419, -17.35263639, -16.60196565,
98104 -15.91226889, -15.2745658, -14.6817375, -14.12804519, -13.60879499,
23442350 }
23452351 } else {
23462352 /* For non-Roland Sysex Messages */
2347 int8_t gm_reset[] = {0x7e, 0x7f, 0x09, 0x01, 0xf7};
2348 int8_t yamaha_reset[] = {0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00, 0xf7};
2353 uint8_t gm_reset[] = {0x7e, 0x7f, 0x09, 0x01, 0xf7};
2354 uint8_t yamaha_reset[] = {0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00, 0xf7};
23492355
23502356 if (memcmp(gm_reset, sysex_store, 5) == 0) {
23512357 /* GM Reset */
23642370 */
23652371 ret_cnt += sysex_len;
23662372 } else {
2367 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(unrecognized meta type event)", 0);
2373 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(unrecognized meta type event)", 0);
23682374 return 0;
23692375 }
23702376 break;
23712377
23722378 default: /* Should NEVER get here */
2373 return 0;
2374 }
2379 ret_cnt = 0;
2380 break;
2381 }
2382 if (ret_cnt == 0)
2383 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(missing event)", 0);
23752384 return ret_cnt;
23762385 }
23772386
2323
2424 #include "config.h"
2525
26 #ifndef __DJGPP__
26 #if !defined(WM_NO_LOCK)
2727
28 #include <stdint.h>
2928 #ifdef _WIN32
3029 #include <windows.h>
31 #else
30 #elif defined(__OS2__) || defined(__EMX__)
31 #define INCL_DOS
32 #include <os2.h>
33 #elif defined(WILDMIDI_AMIGA)
34 #include <proto/dos.h>
35 #else /* unixish ... */
3236 #define _GNU_SOURCE
33 #include <unistd.h>
37 #include <unistd.h> /* usleep() */
3438 #endif
3539
3640 #include "lock.h"
37 #include "common.h"
3841
3942 /*
4043 _WM_Lock(wmlock)
6265 }
6366 #ifdef _WIN32
6467 Sleep(10);
68 #elif defined(__OS2__) || defined(__EMX__)
69 DosSleep(10);
70 #elif defined(WILDMIDI_AMIGA)
71 Delay(1);
6572 #else
6673 usleep(500);
6774 #endif
8491 }
8592 }
8693
87 #endif /* __DJGPP__ */
94 #endif /* !WM_NO_LOCK */
7575
7676 #define MIDI_MAXCHANNELS 16
7777
78 static char MUS_ID[] = { 'M', 'U', 'S', 0x1A };
79
80 static uint8_t midimap[] =
78 static const char MUS_ID[] = { 'M', 'U', 'S', 0x1A };
79
80 static const uint8_t midimap[] =
8181 {/* MIDI Number Description */
8282 0, /* 0 program change */
8383 0, /* 1 bank selection */
122122 #define TRK_CHUNKSIZE 8
123123
124124 struct mus_ctx {
125 uint8_t *src, *src_ptr;
125 const uint8_t *src, *src_ptr;
126126 uint32_t srcsize;
127127 uint32_t datastart;
128128 uint8_t *dst, *dst_ptr;
213213 #define READ_INT16(b) ((b)[0] | ((b)[1] << 8))
214214 #define READ_INT32(b) ((b)[0] | ((b)[1] << 8) | ((b)[2] << 16) | ((b)[3] << 24))
215215
216 int _WM_mus2midi(uint8_t *in, uint32_t insize,
216 int _WM_mus2midi(const uint8_t *in, uint32_t insize,
217217 uint8_t **out, uint32_t *outsize,
218218 uint16_t frequency) {
219219 struct mus_ctx ctx;
220220 MUSHeader header;
221 uint8_t *cur, *end;
221 const uint8_t *cur, *end;
222222 uint32_t track_size_pos, begin_track_pos, current_pos;
223223 int32_t delta_time;/* Delta time for midi event */
224224 int temp, ret = -1;
226226 int channelMap[MIDI_MAXCHANNELS], currentChannel;
227227
228228 if (insize < MUS_HEADERSIZE) {
229 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
229 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
230230 return (-1);
231231 }
232232
242242 header.instrCnt = READ_INT16(&in[12]);
243243
244244 if (memcmp(header.ID, MUS_ID, 4)) {
245 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MUS, NULL, 0);
245 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MUS, NULL, 0);
246246 return (-1);
247247 }
248248 if (insize < (uint32_t)header.scoreLen + (uint32_t)header.scoreStart) {
249 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
249 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
250250 return (-1);
251251 }
252252 /* channel #15 should be excluded in the numchannels field: */
253253 if (header.channels > MIDI_MAXCHANNELS - 1) {
254 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, NULL, 0);
254 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, NULL, 0);
255255 return (-1);
256256 }
257257
391391 bit1 = 0x2f;
392392 bit2 = 0x00;
393393 if (cur != end) { /* should we error here or report-only? */
394 _WM_ERROR_NEW("%s:%i: MUS buffer off by %ld bytes",
394 _WM_DEBUG_MSG("%s:%i: MUS buffer off by %ld bytes",
395395 __FUNCTION__, __LINE__, (long)(cur - end));
396396 }
397397 break;
2222
2323 #include "config.h"
2424
25 #include <sys/types.h>
2625 #include <stdint.h>
2726 #include <errno.h>
28 #include <fcntl.h>
2927 #include <stdio.h>
3028 #include <stdlib.h>
3129 #include <string.h>
30
31 #if defined(__DJGPP__)
32 #include <sys/types.h>
33 #include <fcntl.h>
3234 #include <sys/stat.h>
33
34 #if defined(__DJGPP__)
3535 #include "getopt_long.h"
3636 #include <conio.h>
3737 #define getopt dj_getopt /* hack */
4343 #ifdef AUDIODRV_DOSSB
4444 #include "dossb.h"
4545 #endif
46 #endif
47
48 #if (defined _WIN32) || (defined __CYGWIN__)
46
47 #elif (defined _WIN32) || (defined __CYGWIN__)
48 #include <sys/types.h>
49 #include <fcntl.h>
50 #include <sys/stat.h>
4951 #include <conio.h>
5052 #include <windows.h>
5153 #include <mmsystem.h>
5254 #define msleep(s) Sleep((s))
5355 #include <io.h>
54 #undef close
55 #define close _close
56 #undef open
57 #define open _open
58 #undef read
59 #define read _read
60 #undef write
61 #define write _write
62 #undef lseek
63 #define lseek _lseek
6456 #include "getopt_long.h"
57 #ifdef __WATCOMC__
58 #define _putch putch
6559 #endif
6660
67 #if !defined(_WIN32) && !defined(__DJGPP__) /* unix build */
61 #elif defined(__OS2__) || defined(__EMX__)
62 #define INCL_DOS
63 #define INCL_DOSERRORS
64 #define INCL_OS2MM
65 #ifdef __EMX__
66 #define INCL_KBD
67 #define INCL_VIO
68 #endif
69 #include <os2.h>
70 #include <os2me.h>
71 #include <conio.h>
72 #define msleep(s) DosSleep((s))
73 #include <fcntl.h>
74 #include <io.h>
75 #include "getopt_long.h"
76 #ifdef __EMX__
77 #include <sys/types.h> /* for off_t typedef */
78 int putch (int c) {
79 char ch = c;
80 VioWrtTTY(&ch, 1, 0);
81 return c;
82 }
83 int kbhit (void) {
84 KBDKEYINFO k;
85 if (KbdPeek(&k, 0))
86 return 0;
87 return (k.fbStatus & KBDTRF_FINAL_CHAR_IN);
88 }
89 #endif
90
91 #elif defined(WILDMIDI_AMIGA)
92 extern void amiga_sysinit (void);
93 extern int amiga_usleep(unsigned long millisec);
94 #define msleep(s) amiga_usleep((s)*1000)
95 extern int amiga_getch (unsigned char *ch);
96 #include <proto/exec.h>
97 #include <proto/dos.h>
98 #include "getopt_long.h"
99 #ifdef AUDIODRV_AHI
100 #include <devices/ahi.h>
101 #endif
102
103 #else /* unix build */
68104 static int msleep(unsigned long millisec);
105 #include <sys/types.h>
106 #include <fcntl.h>
107 #include <sys/stat.h>
69108 #include <sys/ioctl.h>
70109 #include <unistd.h>
71110 #include <getopt.h>
208247 static void (*close_output)(void);
209248 static void (*pause_output)(void);
210249 static void (*resume_output)(void);
250
251 #define wmidi_geterrno() errno /* generic case */
252 #if defined(_WIN32)
211253 static int audio_fd = -1;
254 #define WM_IS_BADF(_fd) ((_fd)<0)
255 #define WM_BADF -1
256 static inline int wmidi_fileexists (const char *path) {
257 return (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES);
258 }
259 static inline int wmidi_open_write (const char *path) {
260 return _open(path, (O_RDWR | O_CREAT | O_TRUNC | O_BINARY), 0664);
261 }
262 static inline void wmidi_close (int fd) {
263 _close(fd);
264 }
265 static inline long wmidi_seekset (int fd, long ofs) {
266 return _lseek(fd, ofs, SEEK_SET);
267 }
268 static inline int wmidi_write (int fd, const void *buf, size_t size) {
269 return _write(fd, buf, size);
270 }
271
272 #elif defined(__DJGPP__)
273 static int audio_fd = -1;
274 #define WM_IS_BADF(_fd) ((_fd)<0)
275 #define WM_BADF -1
276 static inline int wmidi_fileexists (const char *path) {
277 struct ffblk f;
278 return (findfirst(path, &f, FA_ARCH | FA_RDONLY) == 0);
279 }
280 static inline int wmidi_open_write (const char *path) {
281 return open(path, (O_RDWR | O_CREAT | O_TRUNC | O_BINARY), 0664);
282 }
283 static inline void wmidi_close (int fd) {
284 close(fd);
285 }
286 static inline off_t wmidi_seekset (int fd, off_t ofs) {
287 return lseek(fd, ofs, SEEK_SET);
288 }
289 static inline int wmidi_write (int fd, const void *buf, size_t size) {
290 return write(fd, buf, size);
291 }
292
293 #elif defined(__OS2__) || defined(__EMX__)
294 static int audio_fd = -1;
295 #define WM_IS_BADF(_fd) ((_fd)<0)
296 #define WM_BADF -1
297 static inline int wmidi_fileexists (const char *path) {
298 int f = open(path, (O_RDONLY | O_BINARY));
299 if (f != -1) { close(f); return 1; } else return 0;
300 }
301 static inline int wmidi_open_write (const char *path) {
302 return open(path, (O_RDWR | O_CREAT | O_TRUNC | O_BINARY), 0664);
303 }
304 static inline void wmidi_close (int fd) {
305 close(fd);
306 }
307 static inline off_t wmidi_seekset (int fd, off_t ofs) {
308 return lseek(fd, ofs, SEEK_SET);
309 }
310 static inline int wmidi_write (int fd, const void *buf, size_t size) {
311 return write(fd, buf, size);
312 }
313
314 #elif defined(WILDMIDI_AMIGA)
315 static BPTR audio_fd = 0;
316 #define WM_IS_BADF(_fd) ((_fd)==0)
317 #define WM_BADF 0
318 #undef wmidi_geterrno
319 static int wmidi_geterrno (void) {
320 switch (IoErr()) {
321 case ERROR_OBJECT_NOT_FOUND: return ENOENT;
322 case ERROR_DISK_FULL: return ENOSPC;
323 }
324 return EIO; /* better ?? */
325 }
326 static inline int wmidi_fileexists (const char *path) {
327 BPTR fd = Open((const STRPTR)path, MODE_OLDFILE);
328 if (!fd) return 0;
329 Close(fd); return 1;
330 }
331 static inline BPTR wmidi_open_write (const char *path) {
332 return Open((const STRPTR) path, MODE_NEWFILE);
333 }
334 static inline LONG wmidi_close (BPTR fd) {
335 return Close(fd);
336 }
337 static inline LONG wmidi_seekset (BPTR fd, LONG ofs) {
338 return Seek(fd, ofs, OFFSET_BEGINNING);
339 }
340 static LONG wmidi_write (BPTR fd, /*const*/ void *buf, LONG size) {
341 LONG written = 0, result;
342 unsigned char *p = (unsigned char *)buf;
343 while (written < size) {
344 result = Write(fd, p + written, size - written);
345 if (result < 0) return result;
346 written += result;
347 }
348 return written;
349 }
350
351 #else /* common posix case */
352 static int audio_fd = -1;
353 #define WM_IS_BADF(_fd) ((_fd)<0)
354 #define WM_BADF -1
355 static inline int wmidi_fileexists (const char *path) {
356 struct stat st;
357 return (stat(path, &st) == 0);
358 }
359 static inline int wmidi_open_write (const char *path) {
360 return open(path, (O_RDWR | O_CREAT | O_TRUNC), (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH));
361 }
362 static inline int wmidi_close (int fd) {
363 return close(fd);
364 }
365 static inline off_t wmidi_seekset (int fd, off_t ofs) {
366 return lseek(fd, ofs, SEEK_SET);
367 }
368 static inline ssize_t wmidi_write (int fd, const void *buf, size_t size) {
369 return write(fd, buf, size);
370 }
371 #endif
212372
213373 static void pause_output_nop(void) {
214374 }
221381 static char midi_file[1024];
222382
223383 static int write_midi_output(void *output_data, int output_size) {
224 #ifdef __DJGPP__
225 struct ffblk f;
226 #else
227 struct stat st;
228 #endif
229
230384 if (midi_file[0] == '\0')
231385 return (-1);
232386
233387 /*
234388 * Test if file already exists
235389 */
236 #ifdef __DJGPP__
237 if (findfirst(midi_file, &f, FA_ARCH | FA_RDONLY) == 0) {
238 #else
239 if (stat(midi_file, &st) == 0) {
240 #endif
390 if (wmidi_fileexists(midi_file)) {
241391 fprintf(stderr, "\rError: %s already exists\r\n", midi_file);
242392 return (-1);
243393 }
244394
245 #if defined(_WIN32) || defined(__DJGPP__)
246 audio_fd = open(midi_file, (O_RDWR | O_CREAT | O_TRUNC | O_BINARY), 0664);
247 #else
248 audio_fd = open(midi_file, (O_RDWR | O_CREAT | O_TRUNC),
249 (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH));
250 #endif
251 if (audio_fd < 0) {
252 fprintf(stderr, "Error: unable to open file for writing (%s)\r\n", strerror(errno));
395 audio_fd = wmidi_open_write(midi_file);
396 if (WM_IS_BADF(audio_fd)) {
397 fprintf(stderr, "Error: unable to open file for writing (%s)\r\n", strerror(wmidi_geterrno()));
253398 return (-1);
254399 }
255400
256 if (write(audio_fd, output_data, output_size) < 0) {
257 fprintf(stderr, "\nERROR: failed writing midi (%s)\r\n", strerror(errno));
258 close(audio_fd);
259 audio_fd = -1;
401 if (wmidi_write(audio_fd, output_data, output_size) < 0) {
402 fprintf(stderr, "\nERROR: failed writing midi (%s)\r\n", strerror(wmidi_geterrno()));
403 wmidi_close(audio_fd);
404 audio_fd = WM_BADF;
260405 return (-1);
261406 }
262407
263 close(audio_fd);
264 audio_fd = -1;
408 wmidi_close(audio_fd);
409 audio_fd = WM_BADF;
265410 return (0);
266411 }
267412
295440 if (wav_file[0] == '\0')
296441 return (-1);
297442
298 #if defined(_WIN32) || defined(__DJGPP__)
299 audio_fd = open(wav_file, (O_RDWR | O_CREAT | O_TRUNC | O_BINARY), 0664);
300 #else
301 audio_fd = open(wav_file, (O_RDWR | O_CREAT | O_TRUNC),
302 (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH));
303 #endif
304 if (audio_fd < 0) {
305 fprintf(stderr, "Error: unable to open file for writing (%s)\r\n", strerror(errno));
443 audio_fd = wmidi_open_write(wav_file);
444 if (WM_IS_BADF(audio_fd)) {
445 fprintf(stderr, "Error: unable to open file for writing (%s)\r\n", strerror(wmidi_geterrno()));
306446 return (-1);
307447 } else {
308448 uint32_t bytes_per_sec;
317457 wav_hdr[31] = (bytes_per_sec >> 24) & 0xFF;
318458 }
319459
320 if (write(audio_fd, &wav_hdr, 44) < 0) {
321 fprintf(stderr, "ERROR: failed writing wav header (%s)\r\n", strerror(errno));
322 close(audio_fd);
323 audio_fd = -1;
460 if (wmidi_write(audio_fd, &wav_hdr, 44) < 0) {
461 fprintf(stderr, "ERROR: failed writing wav header (%s)\r\n", strerror(wmidi_geterrno()));
462 wmidi_close(audio_fd);
463 audio_fd = WM_BADF;
324464 return (-1);
325465 }
326466
341481 swp[i] = (swp[i] << 8) | (swp[i] >> 8);
342482 }
343483 #endif
344 if (write(audio_fd, output_data, output_size) < 0) {
345 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(errno));
346 close(audio_fd);
347 audio_fd = -1;
484 if (wmidi_write(audio_fd, output_data, output_size) < 0) {
485 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(wmidi_geterrno()));
486 wmidi_close(audio_fd);
487 audio_fd = WM_BADF;
348488 return (-1);
349489 }
350490
354494
355495 static void close_wav_output(void) {
356496 uint8_t wav_count[4];
357 if (audio_fd < 0)
497 if (WM_IS_BADF(audio_fd))
358498 return;
359499
360500 printf("Finishing and closing wav output\r");
362502 wav_count[1] = (wav_size >> 8) & 0xFF;
363503 wav_count[2] = (wav_size >> 16) & 0xFF;
364504 wav_count[3] = (wav_size >> 24) & 0xFF;
365 lseek(audio_fd, 40, SEEK_SET);
366 if (write(audio_fd, &wav_count, 4) < 0) {
367 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(errno));
505 wmidi_seekset(audio_fd, 40);
506 if (wmidi_write(audio_fd, &wav_count, 4) < 0) {
507 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(wmidi_geterrno()));
368508 goto end;
369509 }
370510
373513 wav_count[1] = (wav_size >> 8) & 0xFF;
374514 wav_count[2] = (wav_size >> 16) & 0xFF;
375515 wav_count[3] = (wav_size >> 24) & 0xFF;
376 lseek(audio_fd, 4, SEEK_SET);
377 if (write(audio_fd, &wav_count, 4) < 0) {
378 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(errno));
516 wmidi_seekset(audio_fd, 4);
517 if (wmidi_write(audio_fd, &wav_count, 4) < 0) {
518 fprintf(stderr, "\nERROR: failed writing wav (%s)\r\n", strerror(wmidi_geterrno()));
379519 goto end;
380520 }
381521
382522 end: printf("\n");
383 if (audio_fd >= 0)
384 close(audio_fd);
385 audio_fd = -1;
523 if (!WM_IS_BADF(audio_fd))
524 wmidi_close(audio_fd);
525 audio_fd = WM_BADF;
386526 }
387527
388528 #if (defined _WIN32) || (defined __CYGWIN__)
521661 HeapFree(GetProcessHeap(), 0, mm_blocks);
522662 hWaveOut = NULL;
523663 mm_blocks = NULL;
664 }
665
666 #elif (defined(__OS2__) || defined(__EMX__)) && defined(AUDIODRV_OS2DART)
667 /* based on Dart code originally written by Kevin Langman for XMP */
668
669 #define open_audio_output open_dart_output
670 static int write_dart_output (int8_t *output_data, int output_size);
671 static void close_dart_output (void);
672
673 #define BUFFERCOUNT 4
674
675 static MCI_MIX_BUFFER MixBuffers[BUFFERCOUNT];
676 static MCI_MIXSETUP_PARMS MixSetupParms;
677 static MCI_BUFFER_PARMS BufferParms;
678 static MCI_GENERIC_PARMS GenericParms;
679
680 static ULONG DeviceID = 0;
681 static ULONG bsize = 16;
682 static short next = 2;
683 static short ready = 1;
684
685 static HMTX dart_mutex;
686
687 /* Buffer update thread (created and called by DART) */
688 static LONG APIENTRY OS2_Dart_UpdateBuffers
689 (ULONG ulStatus, PMCI_MIX_BUFFER pBuffer, ULONG ulFlags) {
690
691 if ((ulFlags == MIX_WRITE_COMPLETE) ||
692 ((ulFlags == (MIX_WRITE_COMPLETE | MIX_STREAM_ERROR)) &&
693 (ulStatus == ERROR_DEVICE_UNDERRUN))) {
694 DosRequestMutexSem(dart_mutex, SEM_INDEFINITE_WAIT);
695 ready++;
696 DosReleaseMutexSem(dart_mutex);
697 }
698 return (TRUE);
699 }
700
701 static int
702 open_dart_output(void) {
703 int i;
704 MCI_AMP_OPEN_PARMS AmpOpenParms;
705
706 if (DosCreateMutexSem(NULL, &dart_mutex, 0, 0) != NO_ERROR) {
707 fprintf(stderr, "Failed creating a MutexSem.\r\n");
708 return (-1);
709 }
710
711 /* compute a size for circa 1/4" of playback. */
712 bsize = rate >> 2;
713 bsize <<= 1; /* stereo */
714 bsize <<= 1; /* 16 bit */
715 for (i = 15; i >= 12; i--) {
716 if (bsize & (1 << i))
717 break;
718 }
719 bsize = (1 << i);
720 /* make sure buffer is not greater than 64 Kb: DART can't handle it. */
721 if (bsize > 65536)
722 bsize = 65536;
723
724 MixBuffers[0].pBuffer = NULL; /* marker */
725 memset(&GenericParms, 0, sizeof(MCI_GENERIC_PARMS));
726
727 /* open AMP device */
728 memset(&AmpOpenParms, 0, sizeof(MCI_AMP_OPEN_PARMS));
729 AmpOpenParms.usDeviceID = 0;
730
731 AmpOpenParms.pszDeviceType =
732 (PSZ) MAKEULONG(MCI_DEVTYPE_AUDIO_AMPMIX, 0); /* 0: default waveaudio device */
733
734 if(mciSendCommand(0, MCI_OPEN, MCI_WAIT|MCI_OPEN_TYPE_ID|MCI_OPEN_SHAREABLE,
735 (PVOID) &AmpOpenParms, 0) != MCIERR_SUCCESS) {
736 fprintf(stderr, "Failed opening DART audio device\r\n");
737 return (-1);
738 }
739
740 DeviceID = AmpOpenParms.usDeviceID;
741
742 /* setup playback parameters */
743 memset(&MixSetupParms, 0, sizeof(MCI_MIXSETUP_PARMS));
744
745 MixSetupParms.ulBitsPerSample = 16;
746 MixSetupParms.ulFormatTag = MCI_WAVE_FORMAT_PCM;
747 MixSetupParms.ulSamplesPerSec = rate;
748 MixSetupParms.ulChannels = 2;
749 MixSetupParms.ulFormatMode = MCI_PLAY;
750 MixSetupParms.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
751 MixSetupParms.pmixEvent = OS2_Dart_UpdateBuffers;
752
753 if (mciSendCommand(DeviceID, MCI_MIXSETUP,
754 MCI_WAIT | MCI_MIXSETUP_INIT,
755 (PVOID) & MixSetupParms, 0) != MCIERR_SUCCESS) {
756
757 mciSendCommand(DeviceID, MCI_CLOSE, MCI_WAIT,
758 (PVOID) & GenericParms, 0);
759 fprintf(stderr, "Failed DART mixer setup\r\n");
760 return (-1);
761 }
762
763 /*bsize = MixSetupParms.ulBufferSize;*/
764 /*printf("Dart Buffer Size = %lu\n", bsize);*/
765
766 BufferParms.ulNumBuffers = BUFFERCOUNT;
767 BufferParms.ulBufferSize = bsize;
768 BufferParms.pBufList = MixBuffers;
769
770 if (mciSendCommand(DeviceID, MCI_BUFFER,
771 MCI_WAIT | MCI_ALLOCATE_MEMORY,
772 (PVOID) & BufferParms, 0) != MCIERR_SUCCESS) {
773 fprintf(stderr, "DART Memory allocation error\r\n");
774 mciSendCommand(DeviceID, MCI_CLOSE, MCI_WAIT,
775 (PVOID) & GenericParms, 0);
776 return (-1);
777 }
778
779 for (i = 0; i < BUFFERCOUNT; i++) {
780 MixBuffers[i].ulBufferLength = bsize;
781 }
782
783 /* Start Playback */
784 memset(MixBuffers[0].pBuffer, /*32767 */ 0, bsize);
785 memset(MixBuffers[1].pBuffer, /*32767 */ 0, bsize);
786 MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, MixBuffers, 2);
787
788 send_output = write_dart_output;
789 close_output = close_dart_output;
790 pause_output = pause_output_nop;
791 resume_output = resume_output_nop;
792
793 return (0);
794 }
795
796 static int
797 write_dart_output (int8_t *output_data, int output_size) {
798 static int idx = 0;
799
800 if (idx + output_size > bsize) {
801 do {
802 DosRequestMutexSem(dart_mutex, SEM_INDEFINITE_WAIT);
803 if (ready != 0) {
804 DosReleaseMutexSem(dart_mutex);
805 break;
806 }
807 DosReleaseMutexSem(dart_mutex);
808 DosSleep(20);
809 } while (TRUE);
810
811 MixBuffers[next].ulBufferLength = idx;
812 MixSetupParms.pmixWrite(MixSetupParms.ulMixHandle, &(MixBuffers[next]), 1);
813 ready--;
814 next++;
815 idx = 0;
816 if (next == BUFFERCOUNT) {
817 next = 0;
818 }
819 }
820 memcpy(&((char *)MixBuffers[next].pBuffer)[idx], output_data, output_size);
821 idx += output_size;
822 return (0);
823 }
824
825 static void
826 close_dart_output (void) {
827 printf("Shutting down sound output\r\n");
828 if (MixBuffers[0].pBuffer) {
829 mciSendCommand(DeviceID, MCI_BUFFER,
830 MCI_WAIT | MCI_DEALLOCATE_MEMORY, &BufferParms, 0);
831 MixBuffers[0].pBuffer = NULL;
832 }
833 if (DeviceID) {
834 mciSendCommand(DeviceID, MCI_CLOSE, MCI_WAIT,
835 (PVOID) &GenericParms, 0);
836 DeviceID = 0;
837 }
524838 }
525839
526840 #elif defined(__DJGPP__) && defined(AUDIODRV_DOSSB)
6921006 return 0;
6931007 }
6941008
1009 #elif defined(WILDMIDI_AMIGA) && defined(AUDIODRV_AHI)
1010
1011 /* Driver for output to native Amiga AHI device:
1012 * Written by Szilárd Biró <col.lawrence@gmail.com>, loosely based
1013 * on an old AOS4 version by Fredrik Wikstrom <fredrik@a500.org>
1014 */
1015
1016 #define BUFFERSIZE (4 << 10)
1017
1018 static struct MsgPort *AHImp = NULL;
1019 static struct AHIRequest *AHIReq[2] = { NULL, NULL };
1020 static int active = 0;
1021 static int8_t *AHIBuf[2] = { NULL, NULL };
1022
1023 #define open_audio_output open_ahi_output
1024 static int write_ahi_output(int8_t *output_data, int output_size);
1025 static void close_ahi_output(void);
1026
1027 static int open_ahi_output(void) {
1028 AHImp = CreateMsgPort();
1029 if (AHImp) {
1030 AHIReq[0] = (struct AHIRequest *)CreateIORequest(AHImp, sizeof(struct AHIRequest));
1031 if (AHIReq[0]) {
1032 AHIReq[0]->ahir_Version = 4;
1033 AHIReq[1] = AllocVec(sizeof(struct AHIRequest), MEMF_PUBLIC);
1034 if (AHIReq[1]) {
1035 if (!OpenDevice(AHINAME, AHI_DEFAULT_UNIT, (struct IORequest *)AHIReq[0], 0)) {
1036 /*AHIReq[0]->ahir_Std.io_Message.mn_Node.ln_Pri = 0;*/
1037 AHIReq[0]->ahir_Std.io_Command = CMD_WRITE;
1038 AHIReq[0]->ahir_Std.io_Data = NULL;
1039 AHIReq[0]->ahir_Std.io_Offset = 0;
1040 AHIReq[0]->ahir_Frequency = rate;
1041 AHIReq[0]->ahir_Type = AHIST_S16S;/* 16 bit stereo */
1042 AHIReq[0]->ahir_Volume = 0x10000;
1043 AHIReq[0]->ahir_Position = 0x8000;
1044 CopyMem(AHIReq[0], AHIReq[1], sizeof(struct AHIRequest));
1045
1046 AHIBuf[0] = AllocVec(BUFFERSIZE, MEMF_PUBLIC | MEMF_CLEAR);
1047 if (AHIBuf[0]) {
1048 AHIBuf[1] = AllocVec(BUFFERSIZE, MEMF_PUBLIC | MEMF_CLEAR);
1049 if (AHIBuf[1]) {
1050 send_output = write_ahi_output;
1051 close_output = close_ahi_output;
1052 pause_output = pause_output_nop;
1053 resume_output = resume_output_nop;
1054 return (0);
1055 }
1056 }
1057 }
1058 }
1059 }
1060 }
1061
1062 close_ahi_output();
1063 fprintf(stderr, "ERROR: Unable to open AHI output\r\n");
1064 return (-1);
1065 }
1066
1067 static int write_ahi_output(int8_t *output_data, int output_size) {
1068 int chunk;
1069 while (output_size > 0) {
1070 if (AHIReq[active]->ahir_Std.io_Data) {
1071 WaitIO((struct IORequest *) AHIReq[active]);
1072 }
1073 chunk = (output_size < BUFFERSIZE)? output_size : BUFFERSIZE;
1074 memcpy(AHIBuf[active], output_data, chunk);
1075 output_size -= chunk;
1076 output_data += chunk;
1077
1078 AHIReq[active]->ahir_Std.io_Data = AHIBuf[active];
1079 AHIReq[active]->ahir_Std.io_Length = chunk;
1080 AHIReq[active]->ahir_Link = !CheckIO((struct IORequest *) AHIReq[active ^ 1]) ? AHIReq[active ^ 1] : NULL;
1081 SendIO((struct IORequest *)AHIReq[active]);
1082 active ^= 1;
1083 }
1084 return (0);
1085 }
1086
1087 static void close_ahi_output(void) {
1088 if (AHIReq[1]) {
1089 AHIReq[0]->ahir_Link = NULL; /* in case we are linked to req[0] */
1090 if (!CheckIO((struct IORequest *) AHIReq[1])) {
1091 AbortIO((struct IORequest *) AHIReq[1]);
1092 WaitIO((struct IORequest *) AHIReq[1]);
1093 }
1094 FreeVec(AHIReq[1]);
1095 AHIReq[1] = NULL;
1096 }
1097 if (AHIReq[0]) {
1098 if (!CheckIO((struct IORequest *) AHIReq[0])) {
1099 AbortIO((struct IORequest *) AHIReq[0]);
1100 WaitIO((struct IORequest *) AHIReq[0]);
1101 }
1102 if (AHIReq[0]->ahir_Std.io_Device) {
1103 CloseDevice((struct IORequest *) AHIReq[0]);
1104 AHIReq[0]->ahir_Std.io_Device = NULL;
1105 }
1106 DeleteIORequest((struct IORequest *) AHIReq[0]);
1107 AHIReq[0] = NULL;
1108 }
1109 if (AHImp) {
1110 DeleteMsgPort(AHImp);
1111 AHImp = NULL;
1112 }
1113 if (AHIBuf[0]) {
1114 FreeVec(AHIBuf[0]);
1115 AHIBuf[0] = NULL;
1116 }
1117 if (AHIBuf[1]) {
1118 FreeVec(AHIBuf[1]);
1119 AHIBuf[1] = NULL;
1120 }
1121 }
1122
6951123 #else
6961124 #ifdef AUDIODRV_ALSA
6971125
10481476
10491477 #define open_audio_output open_noaudio_output
10501478 static int open_noaudio_output(void) {
1479 fprintf(stderr, "No audio output driver was selected at compile time.\r\n");
10511480 return -1;
10521481 }
10531482
11381567 uint32_t apr_mins;
11391568 uint32_t apr_secs;
11401569 char modes[5];
1141 // uint32_t count_diff = 0;
11421570 uint8_t ch;
1143 uint8_t test_midi = 0;
1144 uint8_t test_count = 0;
1571 int test_midi = 0;
1572 int test_count = 0;
11451573 uint8_t *test_data;
11461574 uint8_t test_bank = 0;
11471575 uint8_t test_patch = 0;
11481576 static char spinner[] = "|/-\\";
11491577 static int spinpoint = 0;
11501578 unsigned long int seek_to_sample;
1151 unsigned long int samples = 0;
1579 uint32_t samples = 0;
11521580 int inpause = 0;
11531581 char * ret_err = NULL;
11541582 long libraryver;
11551583 char * lyric = NULL;
11561584 char *last_lyric = NULL;
1157 uint32_t last_lyric_length = 0;
1585 size_t last_lyric_length = 0;
11581586 int8_t kareoke = 0;
11591587 #define MAX_LYRIC_CHAR 128
11601588 char lyrics[MAX_LYRIC_CHAR + 1];
11611589 #define MAX_DISPLAY_LYRICS 29
11621590 char display_lyrics[MAX_DISPLAY_LYRICS + 1];
1163
1164 unsigned long int play_from = 0.0;
1165 unsigned long int play_to = 0.0;
1591
1592 unsigned long int play_from = 0;
1593 unsigned long int play_to = 0;
11661594
11671595 memset(lyrics,' ',MAX_LYRIC_CHAR);
11681596 memset(display_lyrics,' ',MAX_DISPLAY_LYRICS);
11931621 fprintf(stderr, "Error: bad rate %i.\n", res);
11941622 return (1);
11951623 }
1196 rate = res;
1624 rate = (uint32_t) res;
11971625 break;
11981626 case 'b': /* Reverb */
11991627 mixer_options |= WM_MO_REVERB;
12101638 wav_file[sizeof(wav_file) - 1] = 0;
12111639 break;
12121640 case 'g': /* XMIDI Conversion */
1213 WildMidi_SetCvtOption(WM_CO_XMI_TYPE, atoi(optarg));
1641 WildMidi_SetCvtOption(WM_CO_XMI_TYPE, (uint16_t) atoi(optarg));
12141642 break;
12151643 case 'f': /* MIDI-like Conversion */
1216 WildMidi_SetCvtOption(WM_CO_FREQUENCY, atoi(optarg));
1644 WildMidi_SetCvtOption(WM_CO_FREQUENCY, (uint16_t) atoi(optarg));
12171645 break;
12181646 case 'x': /* MIDI Output */
12191647 if (!*optarg) {
13061734
13071735 printf("Converting %s\r\n", real_file);
13081736 if (WildMidi_ConvertToMidi(argv[optind], &data, &size) < 0) {
1309 fprintf(stderr, "Conversion failed.\r\n");
1737 fprintf(stderr, "Conversion failed: %s.\r\n", WildMidi_GetError());
1738 WildMidi_ClearError();
13101739 return (1);
13111740 }
13121741
13381767 (libraryver>> 8) & 255,
13391768 (libraryver ) & 255);
13401769 if (WildMidi_Init(config_file, rate, mixer_options) == -1) {
1770 fprintf(stderr, "%s\r\n", WildMidi_GetError());
1771 WildMidi_ClearError();
13411772 return (1);
13421773 }
13431774
13541785 }
13551786
13561787 wm_inittty();
1788 #ifdef WILDMIDI_AMIGA
1789 amiga_sysinit();
1790 #endif
13571791
13581792 WildMidi_MasterVolume(master_volume);
13591793
14071841
14081842 memset(lyrics,' ',MAX_LYRIC_CHAR);
14091843 memset(display_lyrics,' ',MAX_DISPLAY_LYRICS);
1410
1844
14111845 if (play_from != 0) {
14121846 WildMidi_FastSeek(midi_ptr, &play_from);
14131847 if (play_to < play_from) {
14141848 // Ignore --playto if set less than --playfrom
1415 } play_to = 0;
1849 play_to = 0;
1850 }
14161851 }
14171852
14181853 while (1) {
1419 #if 0
1420 count_diff = wm_info->approx_total_samples
1421 - wm_info->current_sample;
1422
1423 if (count_diff == 0)
1424 break;
1425 #endif
14261854 ch = 0;
14271855 #ifdef _WIN32
14281856 if (_kbhit()) {
14291857 ch = _getch();
14301858 _putch(ch);
14311859 }
1432 #elif defined(__DJGPP__)
1860 #elif defined(__DJGPP__) || defined(__OS2__) || defined(__EMX__)
14331861 if (kbhit()) {
14341862 ch = getch();
14351863 putch(ch);
14361864 }
1865 #elif defined(WILDMIDI_AMIGA)
1866 amiga_getch (&ch);
14371867 #else
14381868 if (read(STDIN_FILENO, &ch, 1) != 1)
14391869 ch = 0;
15631993 pro_secs = (wm_info->current_sample % (rate * 60)) / rate;
15641994 fprintf(stderr,
15651995 "%s [%s] [%3i] [%2um %2us Processed] [%2u%%] P \r",
1566 display_lyrics, modes, master_volume, pro_mins,
1996 display_lyrics, modes, (int)master_volume, pro_mins,
15671997 pro_secs, perc_play);
15681998 msleep(5);
15691999 continue;
15702000 }
15712001
1572
15732002 if (play_to != 0) {
15742003 if ((wm_info->current_sample + 4096) <= play_to) {
15752004 samples = 16384;
15762005 } else {
15772006 samples = (play_to - wm_info->current_sample) << 2;
1578 if (samples <= 0) {
2007 if (!samples) {
15792008 // We are at or past where we wanted to play to
15802009 break;
15812010 }
1582
15832011 }
1584 } else {
2012 }
2013 else {
15852014 samples = 16384;
15862015 }
15872016 res = WildMidi_GetOutput(midi_ptr, output_buffer, samples);
1588 // (count_diff >= 4096)? 16384 : (count_diff * 4));
2017
15892018 if (res <= 0)
15902019 break;
15912020
16152044 pro_secs = (wm_info->current_sample % (rate * 60)) / rate;
16162045 fprintf(stderr,
16172046 "%s [%s] [%3i] [%2um %2us Processed] [%2u%%] %c \r",
1618 display_lyrics, modes, master_volume, pro_mins,
2047 display_lyrics, modes, (int)master_volume, pro_mins,
16192048 pro_secs, perc_play, spinner[spinpoint++ % 4]);
16202049
16212050 if (send_output(output_buffer, res) < 0) {
16352064 end1: memset(output_buffer, 0, 16384);
16362065 send_output(output_buffer, 16384);
16372066 msleep(5);
1638 #if 0/*#ifdef AUDIODRV_OPENAL*/
1639 /* FIXME: Delay needed in OPENAL before exiting to complete the song. */
1640 msleep(1000);
1641 #endif
16422067 end2: close_output();
16432068 free(output_buffer);
16442069 if (WildMidi_Shutdown() == -1) {
16542079
16552080 /* helper / replacement functions: */
16562081
1657 #if !defined(_WIN32) && !defined(__DJGPP__)
2082 #if !(defined(_WIN32) || defined(__DJGPP__) || defined(WILDMIDI_AMIGA) || defined(__OS2__) || defined(__EMX__))
16582083 static int msleep(unsigned long milisec) {
16592084 struct timespec req = { 0, 0 };
16602085 time_t sec = (int) (milisec / 1000);
0 # WildMIDI pkg-config file
1
2 prefix=@WILDMIDILIB_PREFIX@
3 exec_prefix=${prefix}
4 libdir=${exec_prefix}/@WILDMIDILIB_LIBDIR@
5 includedir=${exec_prefix}/include
6
7 Name: WildMIDI
8 Description: software synthesizer library
9 Version: @WILDMIDI_VERSION@
10 URL: https://www.mindwerks.net/projects/wildmidi/
11
12 Libs: -L${libdir} -lWildMidi
13 Libs.private: -lm
14 Cflags: -I${includedir}
2626
2727 #include <stdint.h>
2828 #include <errno.h>
29 #include <fcntl.h>
3029 #include <math.h>
31 #ifndef _WIN32
32 #include <pwd.h>
33 #include <strings.h>
34 #include <unistd.h>
35 #endif
3630 #include <stdarg.h>
3731 #include <stdio.h>
3832 #include <stdlib.h>
3933 #include <string.h>
40 #include <sys/stat.h>
41 #include <sys/types.h>
42
43 #ifdef _WIN32
44 #include <windows.h>
45 #include <tchar.h>
46 #undef strcasecmp
47 #define strcasecmp _stricmp
48 #undef strncasecmp
49 #define strncasecmp _tcsnicmp
50 #endif
5134
5235 #include "wm_error.h"
5336 #include "file_io.h"
272255 static inline int wm_isdigit(int c) {
273256 return (c >= '0' && c <= '9');
274257 }
258 static inline int wm_isupper(int c) {
259 return (c >= 'A' && c <= 'Z');
260 }
261 static inline int wm_tolower(int c) {
262 return ((wm_isupper(c)) ? (c | ('a' - 'A')) : c);
263 }
264 #if 0 /* clang whines that these aren't used. */
265 static inline int wm_islower(int c) {
266 return (c >= 'a' && c <= 'z');
267 }
268 static inline int wm_toupper(int c) {
269 return ((wm_islower(c)) ? (c & ~('a' - 'A')) : c);
270 }
271 #endif
272
273 static int wm_strcasecmp(const char *s1, const char * s2) {
274 const char * p1 = s1;
275 const char * p2 = s2;
276 char c1, c2;
277
278 if (p1 == p2) return 0;
279 do {
280 c1 = wm_tolower (*p1++);
281 c2 = wm_tolower (*p2++);
282 if (c1 == '\0') break;
283 } while (c1 == c2);
284 return (int)(c1 - c2);
285 }
286
287 static int wm_strncasecmp(const char *s1, const char *s2, size_t n) {
288 const char * p1 = s1;
289 const char * p2 = s2;
290 char c1, c2;
291
292 if (p1 == p2 || n == 0) return 0;
293 do {
294 c1 = wm_tolower (*p1++);
295 c2 = wm_tolower (*p2++);
296 if (c1 == '\0' || c1 != c2) break;
297 } while (--n > 0);
298 return (int)(c1 - c2);
299 }
275300
276301 #define TOKEN_CNT_INC 8
277302 static char** WM_LC_Tokenize_Line(char *line_data) {
304329 token_data_length += TOKEN_CNT_INC;
305330 token_data = realloc(token_data, token_data_length * sizeof(char *));
306331 if (token_data == NULL) {
307 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM,"to parse config", errno);
332 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM,"to parse config", errno);
308333 return (NULL);
309334 }
310335 }
328353 return (token_data);
329354 }
330355
331 static int WM_LoadConfig(const char *config_file) {
356 static int load_config(const char *config_file, const char *conf_dir) {
332357 uint32_t config_size = 0;
333358 char *config_buffer = NULL;
334359 const char *dir_end = NULL;
346371 return (-1);
347372 }
348373
349 dir_end = FIND_LAST_DIRSEP(config_file);
350 if (dir_end) {
351 config_dir = malloc((dir_end - config_file + 2));
352 if (config_dir == NULL) {
353 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse config",
354 errno);
355 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
374 if (conf_dir) {
375 if (!(config_dir = wm_strdup(conf_dir))) {
376 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
356377 WM_FreePatches();
357378 free(config_buffer);
358379 return (-1);
359380 }
360 strncpy(config_dir, config_file, (dir_end - config_file + 1));
361 config_dir[dir_end - config_file + 1] = '\0';
381 } else {
382 dir_end = FIND_LAST_DIRSEP(config_file);
383 if (dir_end) {
384 config_dir = malloc((dir_end - config_file + 2));
385 if (config_dir == NULL) {
386 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
387 WM_FreePatches();
388 free(config_buffer);
389 return (-1);
390 }
391 strncpy(config_dir, config_file, (dir_end - config_file + 1));
392 config_dir[dir_end - config_file + 1] = '\0';
393 }
362394 }
363395
364396 config_ptr = 0;
375407 config_buffer[config_ptr] = '\0';
376408
377409 if (config_ptr != line_start_ptr) {
410 _WM_Global_ErrorI = 0; /* because WM_LC_Tokenize_Line() can legitimately return NULL */
378411 line_tokens = WM_LC_Tokenize_Line(&config_buffer[line_start_ptr]);
379412 if (line_tokens) {
380 if (strcasecmp(line_tokens[0], "dir") == 0) {
413 if (wm_strcasecmp(line_tokens[0], "dir") == 0) {
381414 free(config_dir);
382415 if (!line_tokens[1]) {
383 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in dir line)", 0);
384 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
416 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in dir line)", 0);
385417 WM_FreePatches();
386418 free(line_tokens);
387419 free(config_buffer);
388420 return (-1);
389421 } else if (!(config_dir = wm_strdup(line_tokens[1]))) {
390 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse config", errno);
391 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
422 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
392423 WM_FreePatches();
393424 free(line_tokens);
394425 free(config_buffer);
398429 config_dir[strlen(config_dir) + 1] = '\0';
399430 config_dir[strlen(config_dir)] = DIR_SEPARATOR_CHAR;
400431 }
401 } else if (strcasecmp(line_tokens[0], "source") == 0) {
432 } else if (wm_strcasecmp(line_tokens[0], "source") == 0) {
402433 char *new_config = NULL;
403434 if (!line_tokens[1]) {
404 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in source line)", 0);
405 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
435 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in source line)", 0);
406436 WM_FreePatches();
407437 free(line_tokens);
408438 free(config_buffer);
410440 } else if (!IS_ABSOLUTE_PATH(line_tokens[1]) && config_dir) {
411441 new_config = malloc(strlen(config_dir) + strlen(line_tokens[1]) + 1);
412442 if (new_config == NULL) {
413 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse config", errno);
414 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
443 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
415444 WM_FreePatches();
416445 free(config_dir);
417446 free(line_tokens);
422451 strcpy(&new_config[strlen(config_dir)], line_tokens[1]);
423452 } else {
424453 if (!(new_config = wm_strdup(line_tokens[1]))) {
425 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to parse config", errno);
426 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
454 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
427455 WM_FreePatches();
428456 free(line_tokens);
429457 free(config_buffer);
430458 return (-1);
431459 }
432460 }
433 if (WM_LoadConfig(new_config) == -1) {
461 if (load_config(new_config, config_dir) == -1) {
434462 free(new_config);
435463 free(line_tokens);
436464 free(config_buffer);
438466 return (-1);
439467 }
440468 free(new_config);
441 } else if (strcasecmp(line_tokens[0], "bank") == 0) {
469 } else if (wm_strcasecmp(line_tokens[0], "bank") == 0) {
442470 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
443 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in bank line)", 0);
444 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
471 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in bank line)", 0);
445472 WM_FreePatches();
446473 free(config_dir);
447474 free(line_tokens);
449476 return (-1);
450477 }
451478 patchid = (atoi(line_tokens[1]) & 0xFF) << 8;
452 } else if (strcasecmp(line_tokens[0], "drumset") == 0) {
479 } else if (wm_strcasecmp(line_tokens[0], "drumset") == 0) {
453480 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
454 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in drumset line)", 0);
455 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
481 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in drumset line)", 0);
456482 WM_FreePatches();
457483 free(config_dir);
458484 free(line_tokens);
460486 return (-1);
461487 }
462488 patchid = ((atoi(line_tokens[1]) & 0xFF) << 8) | 0x80;
463 } else if (strcasecmp(line_tokens[0], "reverb_room_width") == 0) {
489 } else if (wm_strcasecmp(line_tokens[0], "reverb_room_width") == 0) {
464490 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
465 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_room_width line)", 0);
466 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
491 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_room_width line)", 0);
467492 WM_FreePatches();
468493 free(config_dir);
469494 free(line_tokens);
472497 }
473498 _WM_reverb_room_width = (float) atof(line_tokens[1]);
474499 if (_WM_reverb_room_width < 1.0f) {
475 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_room_width < 1 meter, setting to minimum of 1 meter)", 0);
500 _WM_DEBUG_MSG("%s: reverb_room_width < 1 meter, setting to minimum of 1 meter", config_file);
476501 _WM_reverb_room_width = 1.0f;
477502 } else if (_WM_reverb_room_width > 100.0f) {
478 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_room_width > 100 meters, setting to maximum of 100 meters)", 0);
503 _WM_DEBUG_MSG("%s: reverb_room_width > 100 meters, setting to maximum of 100 meters", config_file);
479504 _WM_reverb_room_width = 100.0f;
480505 }
481 } else if (strcasecmp(line_tokens[0], "reverb_room_length") == 0) {
506 } else if (wm_strcasecmp(line_tokens[0], "reverb_room_length") == 0) {
482507 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
483 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_room_length line)", 0);
484 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD,
485 config_file, 0);
508 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_room_length line)", 0);
486509 WM_FreePatches();
487510 free(config_dir);
488511 free(line_tokens);
491514 }
492515 _WM_reverb_room_length = (float) atof(line_tokens[1]);
493516 if (_WM_reverb_room_length < 1.0f) {
494 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_room_length < 1 meter, setting to minimum of 1 meter)", 0);
517 _WM_DEBUG_MSG("%s: reverb_room_length < 1 meter, setting to minimum of 1 meter", config_file);
495518 _WM_reverb_room_length = 1.0f;
496519 } else if (_WM_reverb_room_length > 100.0f) {
497 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_room_length > 100 meters, setting to maximum of 100 meters)", 0);
520 _WM_DEBUG_MSG("%s: reverb_room_length > 100 meters, setting to maximum of 100 meters", config_file);
498521 _WM_reverb_room_length = 100.0f;
499522 }
500 } else if (strcasecmp(line_tokens[0], "reverb_listener_posx") == 0) {
523 } else if (wm_strcasecmp(line_tokens[0], "reverb_listener_posx") == 0) {
501524 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
502 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_listen_posx line)", 0);
503 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
525 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_listen_posx line)", 0);
504526 WM_FreePatches();
505527 free(config_dir);
506528 free(line_tokens);
510532 _WM_reverb_listen_posx = (float) atof(line_tokens[1]);
511533 if ((_WM_reverb_listen_posx > _WM_reverb_room_width)
512534 || (_WM_reverb_listen_posx < 0.0f)) {
513 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_listen_posx set outside of room)", 0);
535 _WM_DEBUG_MSG("%s: reverb_listen_posx set outside of room", config_file);
514536 _WM_reverb_listen_posx = _WM_reverb_room_width / 2.0f;
515537 }
516 } else if (strcasecmp(line_tokens[0],
538 } else if (wm_strcasecmp(line_tokens[0],
517539 "reverb_listener_posy") == 0) {
518540 if (!line_tokens[1] || !wm_isdigit(line_tokens[1][0])) {
519 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_listen_posy line)", 0);
520 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
541 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in reverb_listen_posy line)", 0);
521542 WM_FreePatches();
522543 free(config_dir);
523544 free(line_tokens);
527548 _WM_reverb_listen_posy = (float) atof(line_tokens[1]);
528549 if ((_WM_reverb_listen_posy > _WM_reverb_room_width)
529550 || (_WM_reverb_listen_posy < 0.0f)) {
530 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(reverb_listen_posy set outside of room)", 0);
551 _WM_DEBUG_MSG("%s: reverb_listen_posy set outside of room", config_file);
531552 _WM_reverb_listen_posy = _WM_reverb_room_length * 0.75f;
532553 }
533 } else if (strcasecmp(line_tokens[0], "guspat_editor_author_cant_read_so_fix_release_time_for_me") == 0) {
554 } else if (wm_strcasecmp(line_tokens[0], "guspat_editor_author_cant_read_so_fix_release_time_for_me") == 0) {
534555 _WM_fix_release = 1;
535 } else if (strcasecmp(line_tokens[0], "auto_amp") == 0) {
556 } else if (wm_strcasecmp(line_tokens[0], "auto_amp") == 0) {
536557 _WM_auto_amp = 1;
537 } else if (strcasecmp(line_tokens[0], "auto_amp_with_amp") == 0) {
558 } else if (wm_strcasecmp(line_tokens[0], "auto_amp_with_amp") == 0) {
538559 _WM_auto_amp = 1;
539560 _WM_auto_amp_with_amp = 1;
540561 } else if (wm_isdigit(line_tokens[0][0])) {
543564 if (_WM_patch[(patchid & 0x7F)] == NULL) {
544565 _WM_patch[(patchid & 0x7F)] = malloc(sizeof(struct _patch));
545566 if (_WM_patch[(patchid & 0x7F)] == NULL) {
546 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
547 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
567 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
548568 WM_FreePatches();
549569 free(config_dir);
550570 free(line_tokens);
576596 }
577597 if (tmp_patch->next == NULL) {
578598 if ((tmp_patch->next = malloc(sizeof(struct _patch))) == NULL) {
579 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, 0);
580 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
599 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, 0);
581600 WM_FreePatches();
582601 free(config_dir);
583602 free(line_tokens);
604623 tmp_patch->next = malloc(
605624 sizeof(struct _patch));
606625 if (tmp_patch->next == NULL) {
607 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, errno);
608 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
626 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, errno);
609627 WM_FreePatches();
610628 free(config_dir);
611629 free(line_tokens);
625643 }
626644 }
627645 if (!line_tokens[1]) {
628 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in patch line)", 0);
629 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
646 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(missing name in patch line)", 0);
630647 WM_FreePatches();
631648 free(config_dir);
632649 free(line_tokens);
635652 } else if (!IS_ABSOLUTE_PATH(line_tokens[1]) && config_dir) {
636653 tmp_patch->filename = malloc(strlen(config_dir) + strlen(line_tokens[1]) + 5);
637654 if (tmp_patch->filename == NULL) {
638 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, 0);
639 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
655 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, 0);
640656 WM_FreePatches();
641657 free(config_dir);
642658 free(line_tokens);
647663 strcat(tmp_patch->filename, line_tokens[1]);
648664 } else {
649665 if (!(tmp_patch->filename = wm_strdup(line_tokens[1]))) {
650 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, NULL, 0);
651 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LOAD, config_file, 0);
666 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, config_file, 0);
652667 WM_FreePatches();
653668 free(config_dir);
654669 free(line_tokens);
656671 return (-1);
657672 }
658673 }
659 if (strncasecmp(&tmp_patch->filename[strlen(tmp_patch->filename) - 4], ".pat", 4) != 0) {
674 if (wm_strncasecmp(&tmp_patch->filename[strlen(tmp_patch->filename) - 4], ".pat", 4) != 0) {
660675 strcat(tmp_patch->filename, ".pat");
661676 }
662677 tmp_patch->env[0].set = 0x00;
670685
671686 token_count = 0;
672687 while (line_tokens[token_count]) {
673 if (strncasecmp(line_tokens[token_count], "amp=", 4) == 0) {
688 if (wm_strncasecmp(line_tokens[token_count], "amp=", 4) == 0) {
674689 if (!wm_isdigit(line_tokens[token_count][4])) {
675 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
690 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "amp=");
676691 } else {
677692 tmp_patch->amp = (atoi(&line_tokens[token_count][4]) << 10) / 100;
678693 }
679 } else if (strncasecmp(line_tokens[token_count], "note=", 5) == 0) {
694 } else if (wm_strncasecmp(line_tokens[token_count], "note=", 5) == 0) {
680695 if (!wm_isdigit(line_tokens[token_count][5])) {
681 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
696 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "note=");
682697 } else {
683698 tmp_patch->note = atoi(&line_tokens[token_count][5]);
684699 }
685 } else if (strncasecmp(line_tokens[token_count], "env_time", 8) == 0) {
700 } else if (wm_strncasecmp(line_tokens[token_count], "env_time", 8) == 0) {
686701 if ((!wm_isdigit(line_tokens[token_count][8])) ||
687702 (!wm_isdigit(line_tokens[token_count][10])) ||
688703 (line_tokens[token_count][9] != '=')) {
689 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
704 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "env_time");
690705 } else {
691706 uint32_t env_no = atoi(&line_tokens[token_count][8]);
692707 if (env_no > 5) {
693 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
708 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "env_time");
694709 } else {
695710 tmp_patch->env[env_no].time = (float) atof(&line_tokens[token_count][10]);
696711 if ((tmp_patch->env[env_no].time > 45000.0f) ||
697712 (tmp_patch->env[env_no].time < 1.47f)) {
698 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(range error in patch line)", 0);
713 _WM_DEBUG_MSG("%s: range error in patch line %s", config_file, "env_time");
699714 tmp_patch->env[env_no].set &= 0xFE;
700715 } else {
701716 tmp_patch->env[env_no].set |= 0x01;
702717 }
703718 }
704719 }
705 } else if (strncasecmp(line_tokens[token_count], "env_level", 9) == 0) {
720 } else if (wm_strncasecmp(line_tokens[token_count], "env_level", 9) == 0) {
706721 if ((!wm_isdigit(line_tokens[token_count][9])) ||
707722 (!wm_isdigit(line_tokens[token_count][11])) ||
708723 (line_tokens[token_count][10] != '=')) {
709 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
724 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "env_level");
710725 } else {
711726 uint32_t env_no = atoi(&line_tokens[token_count][9]);
712727 if (env_no > 5) {
713 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(syntax error in patch line)", 0);
728 _WM_DEBUG_MSG("%s: syntax error in patch line for %s", config_file, "env_level");
714729 } else {
715730 tmp_patch->env[env_no].level = (float) atof(&line_tokens[token_count][11]);
716731 if ((tmp_patch->env[env_no].level > 1.0f) ||
717732 (tmp_patch->env[env_no].level < 0.0f)) {
718 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(range error in patch line)", 0);
733 _WM_DEBUG_MSG("%s: range error in patch line for %s", config_file, "env_level");
719734 tmp_patch->env[env_no].set &= 0xFD;
720735 } else {
721736 tmp_patch->env[env_no].set |= 0x02;
722737 }
723738 }
724739 }
725 } else if (strcasecmp(line_tokens[token_count], "keep=loop") == 0) {
740 } else if (wm_strcasecmp(line_tokens[token_count], "keep=loop") == 0) {
726741 tmp_patch->keep |= SAMPLE_LOOP;
727 } else if (strcasecmp(line_tokens[token_count], "keep=env") == 0) {
742 } else if (wm_strcasecmp(line_tokens[token_count], "keep=env") == 0) {
728743 tmp_patch->keep |= SAMPLE_ENVELOPE;
729 } else if (strcasecmp(line_tokens[token_count], "remove=sustain") == 0) {
744 } else if (wm_strcasecmp(line_tokens[token_count], "remove=sustain") == 0) {
730745 tmp_patch->remove |= SAMPLE_SUSTAIN;
731 } else if (strcasecmp(line_tokens[token_count], "remove=clamped") == 0) {
746 } else if (wm_strcasecmp(line_tokens[token_count], "remove=clamped") == 0) {
732747 tmp_patch->remove |= SAMPLE_CLAMPED;
733748 }
734749 token_count++;
735750 }
736751 }
752 }
753 else if (_WM_Global_ErrorI) { /* malloc() failure in WM_LC_Tokenize_Line() */
754 WM_FreePatches();
755 free(line_tokens);
756 free(config_buffer);
757 return (-1);
737758 }
738759 /* free up tokens */
739760 free(line_tokens);
749770 return (0);
750771 }
751772
773 static int WM_LoadConfig(const char *config_file) {
774 return load_config(config_file, NULL);
775 }
776
752777 static int add_handle(void * handle) {
753778 struct _hndl *tmp_handle = NULL;
754779
755780 if (first_handle == NULL) {
756781 first_handle = malloc(sizeof(struct _hndl));
757782 if (first_handle == NULL) {
758 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, " to get ram", errno);
783 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, " to get ram", errno);
759784 return (-1);
760785 }
761786 first_handle->handle = handle;
769794 }
770795 tmp_handle->next = malloc(sizeof(struct _hndl));
771796 if (tmp_handle->next == NULL) {
772 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, " to get ram", errno);
797 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, " to get ram", errno);
773798 return (-1);
774799 }
775800 tmp_handle->next->prev = tmp_handle;
14531478 int ret;
14541479
14551480 if (!file) {
1456 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL filename)", 0);
1481 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL filename)", 0);
14571482 return (-1);
14581483 }
14591484 if ((buf = (uint8_t *) _WM_BufferFile(file, size)) == NULL) {
14681493 WM_SYMBOL int WildMidi_ConvertBufferToMidi (uint8_t *in, uint32_t insize,
14691494 uint8_t **out, uint32_t *outsize) {
14701495 if (!in || !out || !outsize) {
1471 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL params)", 0);
1496 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL params)", 0);
14721497 return (-1);
14731498 }
14741499
14851510 }
14861511 }
14871512 else if (!memcmp(in, "MThd", 4)) {
1488 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, 0, "Already a midi file", 0);
1513 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, 0, "Already a midi file", 0);
14891514 return (-1);
14901515 }
14911516 else {
1492 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID, NULL, 0);
1517 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID, NULL, 0);
14931518 return (-1);
14941519 }
14951520
15111536
15121537 WM_SYMBOL int WildMidi_Init(const char *config_file, uint16_t rate, uint16_t mixer_options) {
15131538 if (WM_Initialized) {
1514 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_ALR_INIT, NULL, 0);
1539 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_ALR_INIT, NULL, 0);
15151540 return (-1);
15161541 }
15171542
15181543 if (config_file == NULL) {
1519 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG,
1544 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG,
15201545 "(NULL config file pointer)", 0);
15211546 return (-1);
15221547 }
15261551 }
15271552
15281553 if (mixer_options & 0x0FF0) {
1529 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)",
1554 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)",
15301555 0);
15311556 WM_FreePatches();
15321557 return (-1);
15341559 _WM_MixerOptions = mixer_options;
15351560
15361561 if (rate < 11025) {
1537 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG,
1562 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG,
15381563 "(rate out of bounds, range is 11025 - 65535)", 0);
15391564 WM_FreePatches();
15401565 return (-1);
15511576
15521577 WM_SYMBOL int WildMidi_MasterVolume(uint8_t master_volume) {
15531578 if (!WM_Initialized) {
1554 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1579 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
15551580 return (-1);
15561581 }
15571582 if (master_volume > 127) {
1558 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG,
1583 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG,
15591584 "(master volume out of range, range is 0-127)", 0);
15601585 return (-1);
15611586 }
15701595 struct _hndl * tmp_handle;
15711596
15721597 if (!WM_Initialized) {
1573 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1598 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
15741599 return (-1);
15751600 }
15761601 if (handle == NULL) {
1577 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1602 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
15781603 return (-1);
15791604 }
15801605 if (first_handle == NULL) {
1581 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(no midi's open)", 0);
1606 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(no midi's open)", 0);
15821607 return (-1);
15831608 }
15841609 _WM_Lock(&mdi->lock);
16181643 midi * ret = NULL;
16191644
16201645 if (!WM_Initialized) {
1621 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1646 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
16221647 return (NULL);
16231648 }
16241649 if (midifile == NULL) {
1625 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL filename)", 0);
1650 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL filename)", 0);
16261651 return (NULL);
16271652 }
16281653
16581683 midi * ret = NULL;
16591684
16601685 if (!WM_Initialized) {
1661 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1686 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
16621687 return (NULL);
16631688 }
16641689 if (midibuffer == NULL) {
1665 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL midi data buffer)", 0);
1690 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL midi data buffer)", 0);
16661691 return (NULL);
16671692 }
16681693 if (size > WM_MAXFILESIZE) {
16691694 /* don't bother loading suspiciously long files */
1670 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_LONGFIL, NULL, 0);
1695 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_LONGFIL, NULL, 0);
16711696 return (NULL);
16721697 }
16731698 if (memcmp(midibuffer,"HMIMIDIP", 8) == 0) {
16981723 struct _note *note_data;
16991724
17001725 if (!WM_Initialized) {
1701 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1726 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
17021727 return (-1);
17031728 }
17041729 if (handle == NULL) {
1705 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1730 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
17061731 return (-1);
17071732 }
17081733 if (sample_pos == NULL) {
1709 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL seek position pointer)", 0);
1734 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL seek position pointer)", 0);
17101735 return (-1);
17111736 }
17121737
17911816 struct _note *note_data;
17921817
17931818 if (!WM_Initialized) {
1794 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1819 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
17951820 return (-1);
17961821 }
17971822 if (handle == NULL) {
1798 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1823 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
17991824 return (-1);
18001825 }
18011826 mdi = (struct _mdi *) handle;
18021827 _WM_Lock(&mdi->lock);
18031828
18041829 if ((!mdi->is_type2) && (nextsong != 0)) {
1805 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(Illegal use. Only usable with files detected to be type 2 compatable.", 0);
1830 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(Illegal use. Only usable with files detected to be type 2 compatible.", 0);
18061831 _WM_Unlock(&mdi->lock);
18071832 return (-1);
18081833 }
18091834 if ((nextsong > 1) || (nextsong < -1)) {
1810 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(Invalid nextsong setting. -1 is previous song, 0 start of current song, 1 is next song)", 0);
1835 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(Invalid nextsong setting. -1 is previous song, 0 start of current song, 1 is next song)", 0);
18111836 _WM_Unlock(&mdi->lock);
18121837 return (-1);
18131838 }
18951920
18961921 WM_SYMBOL int WildMidi_GetOutput(midi * handle, int8_t *buffer, uint32_t size) {
18971922 if (__builtin_expect((!WM_Initialized), 0)) {
1898 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1923 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
18991924 return (-1);
19001925 }
19011926 if (__builtin_expect((handle == NULL), 0)) {
1902 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1927 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
19031928 return (-1);
19041929 }
19051930 if (__builtin_expect((buffer == NULL), 0)) {
1906 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL buffer pointer)", 0);
1931 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL buffer pointer)", 0);
19071932 return (-1);
19081933 }
19091934 if (__builtin_expect((size == 0), 0)) {
19101935 return (0);
19111936 }
19121937 if (__builtin_expect((!!(size % 4)), 0)) {
1913 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(size not a multiple of 4)", 0);
1938 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(size not a multiple of 4)", 0);
19141939 return (-1);
19151940 }
19161941
19231948
19241949 WM_SYMBOL int WildMidi_GetMidiOutput(midi * handle, int8_t **buffer, uint32_t *size) {
19251950 if (__builtin_expect((!WM_Initialized), 0)) {
1926 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1951 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
19271952 return (-1);
19281953 }
19291954 if (__builtin_expect((handle == NULL), 0)) {
1930 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1955 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
19311956 return (-1);
19321957 }
19331958 if (__builtin_expect((buffer == NULL), 0)) {
1934 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL buffer pointer)", 0);
1935 return (-1);
1936 }
1937 _WM_Event2Midi(handle, (uint8_t **)buffer, size);
1938 return 0;
1959 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL buffer pointer)", 0);
1960 return (-1);
1961 }
1962 return _WM_Event2Midi(handle, (uint8_t **)buffer, size);
19391963 }
19401964
19411965
19431967 struct _mdi *mdi;
19441968
19451969 if (!WM_Initialized) {
1946 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
1970 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
19471971 return (-1);
19481972 }
19491973 if (handle == NULL) {
1950 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
1974 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
19511975 return (-1);
19521976 }
19531977
19541978 mdi = (struct _mdi *) handle;
19551979 _WM_Lock(&mdi->lock);
19561980 if ((!(options & 0x800F)) || (options & 0x7FF0)) {
1957 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)", 0);
1981 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)", 0);
19581982 _WM_Unlock(&mdi->lock);
19591983 return (-1);
19601984 }
19611985 if (setting & 0x7FF0) {
1962 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0);
1986 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0);
19631987 _WM_Unlock(&mdi->lock);
19641988 return (-1);
19651989 }
19882012 WM_ConvertOptions.frequency = setting;
19892013 break;
19902014 default:
1991 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0);
2015 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0);
19922016 _WM_Unlock(&WM_ConvertOptions.lock);
19932017 return (-1);
19942018 }
20002024 WildMidi_GetInfo(midi * handle) {
20012025 struct _mdi *mdi = (struct _mdi *) handle;
20022026 if (!WM_Initialized) {
2003 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
2027 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
20042028 return (NULL);
20052029 }
20062030 if (handle == NULL) {
2007 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
2031 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
20082032 return (NULL);
20092033 }
20102034 _WM_Lock(&mdi->lock);
20112035 if (mdi->tmp_info == NULL) {
20122036 mdi->tmp_info = malloc(sizeof(struct _WM_Info));
20132037 if (mdi->tmp_info == NULL) {
2014 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to set info", 0);
2038 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to set info", 0);
20152039 _WM_Unlock(&mdi->lock);
20162040 return (NULL);
20172041 }
20252049 free(mdi->tmp_info->copyright);
20262050 mdi->tmp_info->copyright = malloc(strlen(mdi->extra_info.copyright) + 1);
20272051 if (mdi->tmp_info->copyright == NULL) {
2028 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_MEM, "to set copyright", 0);
2052 free(mdi->tmp_info);
2053 mdi->tmp_info = NULL;
2054 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to set copyright", 0);
2055 _WM_Unlock(&mdi->lock);
2056 return (NULL);
20292057 } else {
20302058 strcpy(mdi->tmp_info->copyright, mdi->extra_info.copyright);
20312059 }
20382066
20392067 WM_SYMBOL int WildMidi_Shutdown(void) {
20402068 if (!WM_Initialized) {
2041 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
2069 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
20422070 return (-1);
20432071 }
20442072 while (first_handle) {
20892117 char * lyric = NULL;
20902118
20912119 if (!WM_Initialized) {
2092 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
2120 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_INIT, NULL, 0);
20932121 return (NULL);
20942122 }
20952123 if (handle == NULL) {
2096 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
2124 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(NULL handle)", 0);
20972125 return (NULL);
20982126 }
20992127 _WM_Lock(&mdi->lock);
21142142 * Clear any error message
21152143 */
21162144 WM_SYMBOL void WildMidi_ClearError (void) {
2145 _WM_Global_ErrorI = 0;
21172146 if (_WM_Global_ErrorS != NULL) {
21182147 free(_WM_Global_ErrorS);
21192148 _WM_Global_ErrorS = NULL;
2828 #include <stdlib.h>
2929 #include "wm_error.h"
3030
31 void _WM_ERROR_NEW(const char * wmfmt, ...) {
31 void _WM_DEBUG_MSG(const char * wmfmt, ...) {
3232 va_list args;
3333 fprintf(stderr, "\r");
3434 va_start(args, wmfmt);
3838 }
3939
4040 static const char *errors[WM_ERR_MAX+1] = {
41 "System Error",
41 "No Error",
4242
4343 "Unable to obtain memory",
4444 "Unable to stat",
4545 "Unable to load",
4646 "Unable to open",
4747 "Unable to read",
48 "Invalid or Unsuported file format",
48 "Invalid or Unsupported file format",
4949 "File corrupt",
5050 "Library not Initialized",
5151 "Invalid argument",
6666 char * _WM_Global_ErrorS = NULL;
6767 int _WM_Global_ErrorI = 0;
6868
69 void _WM_GLOBAL_ERROR(const char * func, const char * file, unsigned int lne, int wmerno, const char * wmfor, int error) {
69 void _WM_GLOBAL_ERROR(const char *func, int lne, int wmerno, const char *wmfor, int error) {
7070
71 char * errorstring = NULL;
71 char *errorstring;
7272
73 if ((wmerno < 0) || (wmerno >= WM_ERR_MAX)) return;
73 if (wmerno < 0 || wmerno >= WM_ERR_MAX)
74 wmerno = WM_ERR_MAX; /* set to invalid error code. */
7475
7576 _WM_Global_ErrorI = wmerno;
7677
7778 if (_WM_Global_ErrorS != NULL) free(_WM_Global_ErrorS);
7879
79 errorstring = calloc(1, MAX_ERROR_LEN+1);
80 errorstring = malloc(MAX_ERROR_LEN+1);
8081
8182 if (error == 0) {
8283 if (wmfor == NULL) {
83 sprintf(errorstring,"Error (%s:%s:%i) %s",
84 func, file, lne, errors[wmerno]);
84 sprintf(errorstring,"Error (%s:%i) %s",
85 func, lne, errors[wmerno]);
8586 } else {
86 sprintf(errorstring,"Error (%s:%s:%i) %s (%s)",
87 func, file, lne, wmfor, errors[wmerno]);
87 sprintf(errorstring,"Error (%s:%i) %s (%s)",
88 func, lne, wmfor, errors[wmerno]);
8889 }
8990 } else {
9091 if (wmfor == NULL) {
91 sprintf(errorstring,"System Error (%s:%s:%i) %s : %s",
92 func, file, lne, errors[wmerno], strerror(error));
92 sprintf(errorstring,"System Error (%s:%i) %s : %s",
93 func, lne, errors[wmerno], strerror(error));
9394 } else {
94 sprintf(errorstring,"System Error (%s:%s:%i) %s (%s) : %s",
95 func, file, lne, wmfor, errors[wmerno], strerror(error));
95 sprintf(errorstring,"System Error (%s:%i) %s (%s) : %s",
96 func, lne, wmfor, errors[wmerno], strerror(error));
9697 }
9798 }
9899
100 errorstring[MAX_ERROR_LEN] = 0;
99101 _WM_Global_ErrorS = errorstring;
100
101 return;
102102 }
103103
104 void _WM_ERROR(const char * func, unsigned int lne, int wmerno,
105 const char * wmfor, int error) {
106
107 static const char *errors[WM_ERR_MAX+1] = {
108 "No error",
109
110 "Unable to obtain memory",
111 "Unable to stat",
112 "Unable to load",
113 "Unable to open",
114 "Unable to read",
115 "Invalid or Unsuported file format",
116 "File corrupt",
117 "Library not Initialized",
118 "Invalid argument",
119 "Library Already Initialized",
120 "Not a midi file",
121 "Refusing to load unusually long file",
122 "Not an hmp file",
123 "Not an hmi file",
124 "Unable to convert",
125 "Not a mus file",
126 "Not an xmi file",
127
128 "Invalid error code"
129 };
130
131 if (wmerno < 0 || wmerno > WM_ERR_MAX)
132 wmerno = WM_ERR_MAX;
133
134 if (wmfor != NULL) {
135 if (error != 0) {
136 fprintf(stderr, "\rlibWildMidi(%s:%u): ERROR %s %s (%s)\n", func,
137 lne, errors[wmerno], wmfor, strerror(error));
138 } else {
139 fprintf(stderr, "\rlibWildMidi(%s:%u): ERROR %s %s\n", func, lne,
140 errors[wmerno], wmfor);
141 }
142 } else {
143 if (error != 0) {
144 fprintf(stderr, "\rlibWildMidi(%s:%u): ERROR %s (%s)\n", func, lne,
145 errors[wmerno], strerror(error));
146 } else {
147 fprintf(stderr, "\rlibWildMidi(%s:%u): ERROR %s\n", func, lne,
148 errors[wmerno]);
149 }
150 }
104 void _WM_ERROR_NEW(const char * wmfmt, ...) {
105 char *errorstring;
106 va_list args;
107 va_start(args, wmfmt);
108 errorstring = malloc(MAX_ERROR_LEN+1);
109 vsprintf(errorstring, wmfmt, args);
110 va_end(args);
111 errorstring[MAX_ERROR_LEN] = 0;
112 _WM_Global_ErrorS = errorstring;
113 _WM_Global_ErrorI = WM_ERR_MAX;/* well, it's a custom error message */
151114 }
2323
2424 #include "config.h"
2525
26 #if !defined(_WIN32) && !defined(__DJGPP__)
26 #if !(defined(_WIN32) || defined(__DJGPP__) || defined(WILDMIDI_AMIGA) || defined(__OS2__) || defined(__EMX__))
2727
2828 #define _XOPEN_SOURCE 600 /* for ONLCR */
2929
6565 _tty.c_lflag = _res_lflg;
6666 tcsetattr(STDIN_FILENO, TCSADRAIN, &_tty);
6767 }
68 #endif /* !_WIN32, !__DJGPP__ */
68 #endif /* !(_WIN32,__DJGPP__,__OS2__) */
5757 } midi_descriptor;
5858
5959 struct xmi_ctx {
60 uint8_t *src, *src_ptr;
60 const uint8_t *src, *src_ptr;
6161 uint32_t srcsize;
6262 uint32_t datastart;
6363 uint8_t *dst, *dst_ptr;
460460 121, 0 /* 127 Jungle Tune set to Breath Noise */
461461 };
462462
463 int _WM_xmi2midi(uint8_t *in, uint32_t insize,
463 int _WM_xmi2midi(const uint8_t *in, uint32_t insize,
464464 uint8_t **out, uint32_t *outsize,
465465 uint32_t convert_type) {
466466 struct xmi_ctx ctx;
478478 ctx.convert_type = convert_type;
479479
480480 if (ParseXMI(&ctx) < 0) {
481 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
481 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);
482482 goto _end;
483483 }
484484
485485 if (ExtractTracks(&ctx) < 0) {
486 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_NOT_MIDI, NULL, 0);
486 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_MIDI, NULL, 0);
487487 goto _end;
488488 }
489489
909909
910910 /* Never occur */
911911 default:
912 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(unrecognized event)", 0);
912 _WM_DEBUG_MSG("%s: unrecognized event", __FUNCTION__);
913913 break;
914914 }
915915 }
952952
953953 /* Convert it */
954954 if (!(ppqn = ConvertFiletoList(ctx))) {
955 _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, NULL, 0);
955 _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, NULL, 0);
956956 break;
957957 }
958958 ctx->timing[num] = ppqn;
979979
980980 file_size = getsrcsize(ctx);
981981 if (getsrcpos(ctx) + 8 > file_size) {
982 badfile: _WM_GLOBAL_ERROR(__FUNCTION__, __FILE__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
982 badfile: _WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_CORUPT, "(too short)", 0);
983983 return (-1);
984984 }
985985
10001000
10011001 /* XDIRless XMIDI, we can handle them here. */
10021002 if (!memcmp(buf, "XMID", 4)) {
1003 _WM_ERROR_NEW("Warning: XMIDI without XDIR");
1003 _WM_DEBUG_MSG("Warning: XMIDI without XDIR");
10041004 ctx->info.tracks = 1;
10051005 }
10061006 /* Not an XMIDI that we recognise */