From 42b0b3660c46d30a4ea58d04e0c169308e5692de Mon Sep 17 00:00:00 2001 From: jummy Date: Fri, 8 Nov 2024 00:12:28 -0600 Subject: [PATCH] directmusic was pissing me off so bad i replaced it with bassmidi (toggleable) --- Speedy Eggbert 2 Source.vcxproj | 12 +- bass/bass.dll | Bin 0 -> 139128 bytes bass/bass.txt | 2352 +++++++++++++++++++++++++++++++ bass/bassmidi.dll | Bin 0 -> 73600 bytes bass/bassmidi.txt | 734 ++++++++++ bass/inc/bass.h | 1149 +++++++++++++++ bass/inc/bassmidi.h | 442 ++++++ bass/lib/bass.lib | Bin 0 -> 25944 bytes bass/lib/bassmidi.lib | Bin 0 -> 11964 bytes bass/x64/bass.lib | Bin 0 -> 24234 bytes bass/x64/bassmidi.lib | Bin 0 -> 11226 bytes src/decblupi.cpp | 2 +- src/decio.cpp | 4 +- src/decor.cpp | 81 +- src/decor.h | 4 +- src/dectables.h | 17 + src/def.h | 26 +- src/event.cpp | 235 +-- src/event.h | 11 +- src/misc.cpp | 2 - src/pixmap.cpp | 30 +- src/sound.cpp | 154 +- src/sound.h | 11 +- src/soundold.cpp | 760 ++++++++++ 24 files changed, 5766 insertions(+), 260 deletions(-) create mode 100644 bass/bass.dll create mode 100644 bass/bass.txt create mode 100644 bass/bassmidi.dll create mode 100644 bass/bassmidi.txt create mode 100644 bass/inc/bass.h create mode 100644 bass/inc/bassmidi.h create mode 100644 bass/lib/bass.lib create mode 100644 bass/lib/bassmidi.lib create mode 100644 bass/x64/bass.lib create mode 100644 bass/x64/bassmidi.lib create mode 100644 src/soundold.cpp diff --git a/Speedy Eggbert 2 Source.vcxproj b/Speedy Eggbert 2 Source.vcxproj index 2bb3efe..8b4902d 100644 --- a/Speedy Eggbert 2 Source.vcxproj +++ b/Speedy Eggbert 2 Source.vcxproj @@ -77,7 +77,7 @@ false _WIN32;WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - dxsdk3\sdk\inc + dxsdk3\sdk\inc;bass\inc UNICODE;_UNICODE @@ -85,9 +85,9 @@ Windows true /DYNAMICBASE "legacy_stdio_definitions.lib" %(AdditionalOptions) /VERBOSE - dxsdk3\sdk\lib;%(AdditionalLibraryDirectories) + dxsdk3\sdk\lib;bass\lib;%(AdditionalLibraryDirectories) false - dxsdk3/sdk/lib/*.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;%(AdditionalDependencies) + dxsdk3/sdk/lib/*.lib;bass/lib/*.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;%(AdditionalDependencies) Default true MultiplyDefinedSymbolOnly @@ -103,7 +103,7 @@ true _WIN32;WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true - dxsdk3\sdk\inc + dxsdk3\sdk\inc;bass\inc UNICODE;_UNICODE @@ -111,11 +111,11 @@ true true true - dxsdk3\sdk\lib;%(AdditionalLibraryDirectories) + dxsdk3\sdk\lib;bass\lib;%(AdditionalLibraryDirectories) MultiplyDefinedSymbolOnly /DYNAMICBASE "legacy_stdio_definitions.lib" %(AdditionalOptions) /VERBOSE Default - dxsdk3/sdk/lib/*.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;%(AdditionalDependencies) + dxsdk3/sdk/lib/*.lib;bass/lib/*.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;%(AdditionalDependencies) false diff --git a/bass/bass.dll b/bass/bass.dll new file mode 100644 index 0000000000000000000000000000000000000000..10114b668cfdfd2275dbc4e9280879b67c7efdc0 GIT binary patch literal 139128 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 z zKn<2Y<5z0$cdX(vz3U=shOuc|#mCeU-0Ynna-|NsejH^NEHBh#>NH{aja|gz&Uc2K zA(|YRUUe|A%1#iQGB8D&Z(M-gK|mVhpVK4vU?n$DB#Ih!GBxmhQ$BbONKWl`BMo~j zK_<)-|KWr0KA;N*6GjD2Z5f=URoGVL=u-Xb05bahzx1)H6@gBv*l@D}y{ZK%;W64@ z`w{-@Pd6v4Mc@b-t@{fEWCVZSB;=?r>77J<4bqVcqrbNAMR<3Jhe^khY)QHD+Mb$i^Z?QAQqFsZe)j&!^%;@zk{y)1A%7&$9**h?Ct`7 z`)CgtW&%zcG^zHte7LQ<1LF!X?{iggP#A@Yf5xuL;`9pS`PlqLY<;m( z>Q2gPWfAF>7Az0&Z!O?H_fqd^S9wnBoG=+Rde*b5AgJG;X^KstUt(#lI`WG`W(2Z&LIq*<=SeX3x5FrA z--d}7d3~zwU0JCvz5V-wlzEsvoHt8V@0vYhx^TE_m-gI+;4LI>9D4c$#gDhUn(ZqR z4j~HARUvicb*DfK?S3Ijx8P%6`;I6F3(9&vy>3MueNq@hQI;(oFtk|Ied$_D>a`;$ zUXnkE$fm2A6(^f0yq0D}c-1J%5cC@mKq9PingZH_hyc_V{&9$sxPE&@klA&N3hXKZ zQF4HwyI{oaV=yIswQi8OTwgsZ`(Az6&&7?bFaK^>T^>{mka>hu_VR5nkonb$2qPJD z$_2>W8S3Ups$)8W0C83rz=E*x@?`6}Out-oc;#Cs-OrzYH&=!uK>SK{aa;7--L z#MD87*0f9vv_;`QwMG$47SDXY@AhEfs}fUhyZ*pfcZL;m`r1CHyI2t4&5CRW0}yYN zbx;9fe)cV4eworA75Ia`I|X64ca&l1*kyzD{fE!>-a`KQnuk-l!b*3azfaCtlCF7ak<{tL_zK5pa`U zaSy9rUsMHn>#hewbn$%#^HPY9o&1OOi3P4&;27u~nZ^8i^xYU+v@%e-}}t$ zYaiXny^2cv%2`?(Spg=ys?l4_r9-QZpe9d~AvSs_NYBleYG) zjU4oonT^zh6-kQB%Xxdmr(m-1v~{ECF-X=Fg{fn0VIB1z4D|W?5*tF!8$}zCUX9bW z(i<{SNwn3tRQ`>;DJxK*1xotzGe0fbAMh2DFzGL@A5$t{Jlkzm0M_6yE5PcUTsHPD z%1QSp3j^T-+vg4407F9H8-fefBjV&F9{%78)?TzI6vFv}$GkAoaN9S`kF%jumB--M zRiZ%&CH;_twG03>#k#G7J%3-;F^I9-q{p�fir*|4#DW5-7F#;+Cb{HK2noaJWYl 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 UA#rm0(Y@T-Qn~jZg4dt|0Ix4w-~a#s literal 0 HcmV?d00001 diff --git a/bass/bass.txt b/bass/bass.txt new file mode 100644 index 0000000..fe7bea8 --- /dev/null +++ b/bass/bass.txt @@ -0,0 +1,2352 @@ +BASS 2.4 +Copyright (c) 1999-2022 Un4seen Developments Ltd. All rights reserved. + +Files that you should have found in the BASS package +==================================================== +Win32 version +------------- +BASS.TXT This file +BASS.DLL BASS module +BASS.CHM BASS documentation +X64\ + BASS.DLL 64-bit BASS module +C\ C/C++ API and examples... + BASS.H BASS C/C++ header file + BASS.LIB BASS import library + BASS.SLN Visual Studio solution for examples + MAKEFILE Makefile for examples + MAKEFILE.IN Makefile helper macros + X64\ + BASS.LIB 64-bit BASS import library + 3DTEST\ 3D example + ... + BASSTEST\ Simple playback example + ... + CONTEST\ Console example + ... + CUSTLOOP\ Custom looping example + ... + DEVLIST\ Device list example + ... + DSPTEST\ DSP example + ... + FXTEST\ Effects example + ... + LIVEFX\ Full-duplex example + ... + LIVESPEC\ Live version of spectrum analyser example + ... + MODTEST\ MOD music example + ... + MULTI\ Multiple device example + ... + NETRADIO\ Internet streaming example + ... + PLUGINS\ Plugins example + ... + RECTEST\ Recording example + ... + SPEAKERS\ Multi-speaker example + ... + SPECTRUM\ Spectrum analyser example + ... + SYNTH\ Low latency custom streaming example + ... + WRITEWAV\ WAVE writer example + ... + BIN\ Precompiled examples + 3DTEST.EXE + BASSTEST.EXE + CONTEST.EXE + CUSTLOOP.EXE + DEVLIST.EXE + DSPTEST.EXE + FXTEST.EXE + LIVEFX.EXE + LIVESPEC.EXE + MODTEST.EXE + MULTI.EXE + NETRADIO.EXE + RECTEST.EXE + SPEAKERS.EXE + SPECTRUM.EXE + SYNTH.EXE + WRITEWAV.EXE +DELPHI\ Delphi API and examples... + BASS.PAS BASS Delphi unit + 3DTEST\ 3D example + ... + BASSTEST\ Simple playback example + ... + CONTEST\ Console example + ... + CUSTLOOP\ Custom looping example + ... + DSPTEST\ DSP example + ... + FXTEST\ Effects example + ... + LIVEFX\ Full-duplex example + ... + LIVESPEC\ Live version of spectrum analyser example + ... + MULTI\ Multiple device example + ... + NETRADIO\ Internet streaming example + ... + PLUGINS\ Plugins example + ... + RECTEST\ Recording example + ... + SAMPLEVIS\ Visualisation example + ... + SPEAKERS\ Multi-speaker example + ... + SPECTRUM\ Spectrum analyser example + ... + STREAMTEST\ User stream example + ... + WRITEWAV\ WAVE writer example + ... +VB\ Visual Basic API and examples... + BASS.BAS BASS Visual Basic module + 3DTEST\ 3D example + ... + BASSTEST\ Simple playback example + ... + CUSTLOOP\ Custom looping example + ... + DEVLIST\ Device list example + ... + DSPTEST\ DSP example + ... + FXTEST\ Effects example + ... + LIVEFX\ Full-duplex example + ... + LIVESPEC\ Live version of spectrum analyser example + ... + MODTEST\ MOD music example + ... + MULTI\ Multiple device example + ... + NETRADIO\ Internet streaming example + ... + PLUGINS\ Plugins example + ... + RECTEST\ Recording example + ... + SPEAKERS\ Multi-speaker example + ... + SPECTRUM\ Spectrum analyser example + ... + SYNTH\ Low latency custom streaming example + ... + WRITEWAV\ WAVE writer example + ... + MEMORY\ Playing from memory example by Jobnik + ... + +NOTE: You may need to "Unblock" the BASS.CHM file in its "Properties" to view + it on Windows 7. The documentation can also be viewed online at the BASS + website. + +NOTE: The Delphi and VB examples may not always be up to date with the C + examples, so the latter should be preferred as references if possible. + +NOTE: To run the example EXEs, first you will need to copy BASS.DLL into the + same directory as them. + +macOS version +------------- +BASS.TXT This file +LIBBASS.DYLIB BASS module +BASS.CHM BASS documentation +BASS.H BASS C/C++ header file +BASS.XCODEPROJ Xcode project for examples +MAKEFILE Makefile for specific architectures +CONTEST\ Console example + ... +DEVLIST\ Device list example + ... +DSPTEST\ DSP example + ... +FXTEST\ Effects example + ... +LIVESPEC\ Live version of spectrum analyser example + ... +MULTI\ Multiple device example + ... +NETRADIO\ Internet streaming example + ... +PLUGINS\ Plugins example + ... +RECTEST\ Recording example + ... +SPEAKERS\ Multi-speaker example + ... +SPECTRUM\ Spectrum analyser example + ... +SYNTH\ Low latency custom streaming example + ... +WRITEWAV\ WAVE writer example + ... + +NOTE: To view the documentation, you will need a CHM viewer. The documentation + can also be viewed online at the BASS website. + +Linux version +------------- +BASS.TXT This file +BASS.CHM BASS documentation +BASS.H BASS C/C++ header file +MAKEFILE Makefile for examples +MAKEFILE.IN Makefile helper macros +LIBS\ BASS modules + ... +PASCAL\ + BASS.PAS BASS Delphi/Pascal unit +3DTEST\ 3D example + ... +BASSTEST\ Simple playback example + ... +CONTEST\ Console example + ... +CUSTLOOP\ Custom looping example + ... +DEVLIST\ Device list example + ... +DSPTEST\ DSP example + ... +FXTEST\ Effects example + ... +LIVESPEC\ Live version of spectrum analyser example + ... +MODTEST\ MOD music example + ... +MULTI\ Multiple device example + ... +NETRADIO\ Internet streaming example + ... +PLUGINS\ Plugins example + ... +RECTEST\ Recording example + ... +SPEAKERS\ Multi-speaker example + ... +SPECTRUM\ Spectrum analyser example + ... +SYNTH\ Low latency custom streaming example + ... +WRITEWAV\ WAVE writer example + ... + +NOTE: To view the documentation, you will need a CHM viewer. The documentation + can also be viewed online at the BASS website. + +Android version +--------------- +BASS.TXT This file +BASS.CHM BASS documentation +LIBS\ BASS modules + ... +C\ C/C++ API... + BASS.H BASS C/C++ header file +JAVA\COM\UN4SEEN\BASS\ + BASS.JAVA BASS Java class +EXAMPLES\ Java examples + BUILD.GRADLE Android Studio build script for examples + SETTINGS.GRADLE + PROGUARD-BASS.PRO + DSPTEST\ DSP example + ... + FXTEST\ Effects example + ... + LIVESPEC\ Live version of spectrum analyser example + ... + NETRADIO\ Internet streaming example + ... + PLUGINS\ Plugins example + ... + RECTEST\ Recording example + ... + SPECTRUM\ Spectrum analyser example + ... + BASSLIB\ BASS library wrapper shared by examples + ... + +NOTE: To view the documentation, you will need a CHM viewer. The documentation + can also be viewed online at the BASS website. + +iOS version +----------- +BASS.TXT This file +BASS.XCFRAMEWORK BASS framework +BASS.CHM BASS documentation +BASS.H BASS C/C++ header file + +NOTE: To view the documentation, you will need a CHM viewer. The documentation + can also be viewed online at the BASS website. + + +What's the point? +================= +BASS is an audio library for use in software on several platforms. Its purpose +is to provide developers with powerful and efficient sample, stream, MOD music, +and recording functions. All in a compact DLL that won't bloat your software. + +See the documentation for descriptions of all the BASS functions. Also check +the included example source-codes for some examples of how to use BASS in your +own programs. + + +Requirements +============ +Win32 version +------------- +Windows 98 or newer is required with an SSE-supporting CPU. BASS can use WASAPI +or DirectSound for playback and recording. WASAPI is the default on Windows +Vista and newer, while DirectSound is on older Windows versions. 32-bit and +64-bit Windows are supported. + +macOS version +------------- +macOS 10.5 or above is required. The x86_64 / arm64 / i386 architectures are +supported in a single universal library. + +Linux version +------------- +BASS requires ALSA for playback and recording, but decoding and silent playback +on the "No sound" device is still possible without it. The x86 / x86_64 / +armhf / aarch64 architectures are supported. The x86 build requires SSE, while +the armhf build requires ARMv6+VFP2 or above. + +Android version +--------------- +Android 2.3 or above is required. BASS can use AAudio, OpenSL ES, or AudioTrack +for playback (OpenSL ES is used for recording). AAudio is the default on Android +8.1 and above, while OpenSL ES is on older Android versions. The armeabi-v7a / +arm64-v8a / x86 / x86_64 architectures are supported. + +iOS version +----------- +iOS 8 or above is required. armv7 / armv7s / arm64 "device" builds and +i386 / x86_64 / arm64 "simulator" builds are supported in a single universal +framework. + + +Main Features +============= +* Samples + supports WAV/AIFF/MP3/MP2/MP1/OGG and custom generated samples + +* Sample streams + stream any sample data in 8/16/32 bit, with both "push" and "pull" systems + +* File streams + MP3/MP2/MP1/OGG/WAV/AIFF file streaming + +* Internet file streaming + stream files from the internet, including Shout/Icecast + +* User file streaming + stream files from anywhere using any delivery method + +* OS codecs + ACM, Media Foundation and CoreAudio codec support for additional audio formats + +* Multi-channel streaming + support for more than plain stereo, including multi-channel OGG/WAV/AIFF files + +* MOD music + uses the same engine as XMPlay = best accuracy, speed, and quality + +* MO3 music + MP3/OGG compressed MOD music + +* Add-on system + support for more formats is available via add-ons (aka plugins) + +* Multiple outputs + simultaneously use multiple soundcards, and move channels between them + +* Recording + flexible recording system, with support for multiple devices + +* Decode without playback + streams and MOD musics can be outputted in any way you want + +* Speaker assignment + assign streams and MOD musics to specific speakers + +* High precision synchronization + synchronize events in your software to the streams and MOD musics + +* Effects + chorus/compressor/distortion/echo/flanger/gargle/parameq/reverb + +* User-defined DSP functions + custom effects may be applied to individual streams or the final output mix + +* 32 bit floating-point decoding and processing + floating-point stream/music decoding, DSP/FX, and recording + +* 3D sound + play samples/streams/musics in any 3D position + + +Using BASS +========== +There is no guarantee that all future BASS versions will be compatible +with all previous versions, so your program should use BASS_GetVersion +to check the version that is loaded. This also means that you should +put the BASS module in the same directory as your executable (not just +somewhere in the path), to avoid the possibility of a wrong version being +loaded. + +If you are updating your software from a previous BASS version, then +you should check the "History" section (below), to see if any of the +functions that you are using have been affected by a change. + +Win32 version +------------- +C/C++, Delphi, and Visual Basic APIs and example projects are provided. To +use BASS with another language you will first have to convert the header +file. Or, as a last resort, you could use LoadLibrary and GetProcAddress. + +The downside is that you have to manually import each function that you +use, with the GetProcAddress function. But it has been made a lot simpler +to import BASS this way by the use of the BASSDEF #define. Here's a small +example: + +#define BASSDEF(f) (WINAPI *f) // define the functions as pointers +#include "bass.h" +... +HINSTANCE bass=LoadLibrary("BASS.DLL"); // load BASS +BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init +BASS_Init(-1,44100,0,hWnd,NULL); // call BASS_Init + +To use BASS with Borland C++ Builder, you will first have to create a +Borland C++ Builder import library for it. This is done by using the +IMPLIB tool that comes with Borland C++ Builder. Simply execute this: + + IMPLIB BASSBCB.LIB BASS.DLL + +... and then use BASSBCB.LIB in your projects to import BASS. + +To use BASS with LCC-Win32, you will first have to create a compatible +import library for it. This is done by using the PEDUMP and BUILDLIB +tools that come with LCC-Win32. Run these 2 commands: + + PEDUMP /EXP BASS.LIB > BASSLCC.EXP + BUILDLIB BASSLCC.EXP BASSLCC.LIB + +... and then use BASSLCC.LIB in your projects to import BASS. + +For the BASS functions that return strings (char*), VB users should use +the VBStrFromAnsiPtr function to convert the returned pointer into a VB +string. + +macOS version +------------- +LIBBASS.DYLIB is a universal binary with support for the x86_64 / arm64 / i386 +architectures. If not all of those architectures are needed, the included +makefile can be used to extract the wanted one(s). Type "make x86_64" or +"make arm64" or "make i386" to extract a particular architecture. "make 64bit" +can be used to extract the x86_64 and arm64 architectures (exclude i386), and +"make intel" to extract the x86_64 and i386 architectures (exclude arm64). Any +BASS add-ons placed in the same directory will also be processed. + +NOTE: You will need to exclude the i386 architecture (run "make 64bit") for + submitting an app to Apple's App Store. + +Since BASS 2.4.17, the BASS/add-on libraries use the "@rpath" install path, +while "@loader_path was used by older versions. If upgrading from an old +version, you may need to change your copy/embed destination to "Frameworks" +rather than "Executables", unless your "Runtime Search Paths" setting includes +"@executable_path" or "@loader_path". The included makefile ("make rpath") can +be used to update older BASS/add-on versions to use "@rpath". + +See the example Xcode project. + +Linux version +------------- +The LIBBASS.SO file needs to be in the OS's library search path for it to +be found; simply placing it in the same directory as the executable won't +necessarily work as it does on other platforms. The BASS libraries should +also not be placed in the standard library directories to avoid version +conflicts. To meet those competing requirements, a wrapper script could be +used to set the "LD_LIBRARY_PATH" environment variable before loading the +executable. Another option is to set the "rpath" in the executable to tell +it where to look for libraries, which is what the example makefiles do. + +When building for multiple architectures, it is possible to simply try linking +with all LIBBASS.SO versions, and the linker will use the appropriate one and +ignore the others. + +Android version +--------------- +The BASS library includes support for use in Java and native code. The +BASS.JAVA file mirrors BASS.H as much as possible, but there are some +unavoidable differences, mainly in parameter/return types. + +When using ProGuard to obfuscate your Java code, the BASS classes should be +left alone (see PROGUARD-BASS.PRO). + +See the example Android Studio project. + +iOS version +----------- +The BASS XCFramework should be added to XCode's "Frameworks, Libraries, and +Embedded Content" section. If you're using an old Xcode version without +XCFramework support then you can instead directly use the "device" or "simulator" +framework from within the XCFramework. BASS does not include bitcode, so the +"Enable Bitcode" option should be set to "No". + + +Latest Version +============== +The latest version of BASS can always be found at the BASS website: + + www.un4seen.com + + +Licence +======= +BASS is free for non-commercial use. If you are a non-commercial entity +(eg. an individual) and you are not making any money from your product +(through sales/advertising/etc), then you can use BASS in it for free. +If you wish to use BASS in commercial products, then please also see the +next section. + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, BASS IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND/OR FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS SHALL NOT BE HELD +LIABLE FOR ANY DAMAGE THAT MAY RESULT FROM THE USE OF BASS. YOU USE +BASS ENTIRELY AT YOUR OWN RISK. + +Usage of BASS indicates that you agree to the above conditions. + +All trademarks and other registered names contained in the BASS +package are the property of their respective owners. + +Commercial licensing +-------------------- +BASS is available for use in your commercial products. The licence +types available are as follows: + +SHAREWARE: Allows the usage of BASS in an unlimited number of your +shareware ("try before you buy") products, which must sell for no more +than 40 Euros each. Non-shareware products are also permitted, but the +product price limit is 10 Euros in that case. The price limit can be +raised by purchasing duplicate licences, eg. 2 licences doubles it. If +you are an individual (not a corporation) making and selling your own +software, this is the licence for you. + +SINGLE COMMERCIAL: Allows the usage of BASS in one commercial product. + +UNLIMITED COMMERCIAL: Allows the usage of BASS in an unlimited number +of your commercial products. This licence is on a per-site basis, eg. +if you are creating products with BASS at 2 sites/locations, then 2 +licences are required. + +Please note the products must be end-user products, eg. not components +used by other products. + +These licences only cover your own software, not the publishing of +other's software. If you publish other's software, its developers (or +the software itself) will need to be licensed to use BASS. + +These licences are on a per-platform basis, with reductions available +when licensing for multiple platforms. In all cases there are no royalties +to pay, and you can use future BASS updates without further cost. + +These licences do not allow reselling/sublicensing of BASS. For example, +if a product is a development system, the users of said product are not +licensed to use BASS in their productions; they will need their own +licences. + +If the standard licences do not meet your requirements, or if you have +any questions, please get in touch (email: bass@un4seen.com). + +Visit the BASS website for the latest pricing: + + www.un4seen.com + + +Credits +======= +MP3 decoding is based on minimp3, https://github.com/lieff/minimp3 + +Ogg Vorbis decoding is based on libogg/vorbis, +Copyright (c) 2002-2020 Xiph.org Foundation + +API/Sample contributors +----------------------- +Delphi: Titus Miloi, Rogier Timmermans, Alessandro Cappellozza, + Jesse Naranjo, Chris Troesken, Evgeny Melnikov +Visual Basic: Adam Hoult, Hendrik Knaepen, Arthur Aminov, + Peter Hebels, Juan Pablo Franchi + + +History +======= +These are the major (and not so major) changes in each release, along with the +functions/options that are introduced/affected by them. There are other little +tweaks and fixes made along the way too. + +2.4.17 - 12/10/2022 +------------------- +* "Default" recording device on Windows/macOS + BASS_RecordInit + BASS_RecordGetDeviceInfo + BASS_CONFIG_REC_DEFAULT (BASS_SetConfig option) +* Recording continues after device format changes on Windows/macOS + BASS_RecordStart + BASS_SYNC_DEV_FORMAT (BASS_ChannelSetSync type) +* DSP volume control + BASS_ATTRIB_VOLDSP (BASS_ChannelSetAttribute option) + BASS_ATTRIB_VOLDSP_PRIORITY (BASS_ChannelSetAttribute option) + RECTEST example updated +* Auto-reconnecting when a download stops before the end + BASS_StreamCreateURL +* Internet streams use HTTP/1.1 instead of HTTP/1.0 + BASS_StreamCreateURL +* Download callback changing after stream creation + BASS_ATTRIB_DOWNLOADPROC (BASS_ChannelSetAttributeEx option) + NETRADIO example updated +* Thread-specific internet/buffered stream download buffer option + BASS_CONFIG_THREAD (BASS_SetConfig option) + BASS_CONFIG_NET_BUFFER (BASS_SetConfig option) + BASS_StreamCreateURL/FileUser +* Internet stream creation never waits for pre-buffering + BASS_CONFIG_NET_PREBUF_WAIT disabled + BASS_StreamCreateURL/FileUser +* Stalled stream resumption buffer level defaults to prebuffer level + BASS_ATTRIB_NET_RESUME (BASS_ChannelSetAttribute option) +* New simplified channel starting/playing function + BASS_ChannelStart +* Channel remapping fix for various multi-channel source/output combinations + BASS_ChannelStart/Play +* Support for using common add-on name instead of platform-specific filename in plugin loading + BASS_PluginLoad + NETRADIO example updated +* Library filename/path retrieval + BASS_CONFIG_FILENAME (BASS_GetConfigPtr option) + PLUGINS and WRITEWAV examples updated +* Device info is still available if reinitialization fails + BASS_GetInfo + BASS_DEVICE_REINIT (BASS_Init flag) +* Playback ramping-in/out can be disabled separately + BASS_ATTRIB_NORAMP (BASS_ChannelSetAttribute option) +* Default playback ramping setting + BASS_CONFIG_NORAMP (BASS_SetConfig option) +* Error code for when access is denied + BASS_ERROR_DENIED + BASS_StreamCreateURL + BASS_RecordStart +* REAR2 speaker flags renamed/duplicated to SIDE + BASS_SPEAKER_SIDE/SIDELEFT/SIDERIGHT (BASS_MusicLoad/BASS_StreamCreate/File/URL flags) +* Switch to dynamic library/framework (rather than static) on iOS + BASS_PluginLoad +* Recording routing audio session options on iOS + BASS_IOS_SESSION_AIRPLAY/BTHFP/BTA2DP (BASS_CONFIG_IOS_SESSION flags) +* Audio session deactivation when nothing is playing/recording on iOS + BASS_IOS_SESSION_DEACTIVATE (BASS_CONFIG_IOS_SESSION flag) +* Interrupted status retrieval on iOS + BASS_IsStarted +* Floating-point recording support below Android 5 (already supported above) + BASS_RecordStart +* Internet stream support for Linux systems without /etc/services file + BASS_StreamCreateURL +* Fix for IPv6 addresses in URLs on Windows/Linux/Android + BASS_StreamCreateURL +* Fix for getting volume changes made externally on Linux + BASS_GetVolume + BASS_RecordGetInput +* macOS version now uses "@rpath" instead of "@loader_path" install path +* ARM builds are now included (instead of separate) on Linux +* Non-FPU ARM architecture support dropped (Windows CE and "softfp" Linux) +* SSE is required on x86 platforms (Windows 95 dropped) + +2.4.16 - 24/6/2021 +------------------ +* DirectSound output mix is now generated by BASS (as with WASAPI output and + on other platforms), losing support for DirectSound-specific features but + gaining support for all other BASS features + BASS_DEVICE_DSOUND (BASS_Init flag) +* Length trimming + BASS_POS_END (BASS_ChannelSetPosition mode) + BASS_SYNC_END (BASS_ChannelSetSync type) + CUSTLOOP and WRITEWAV examples updated +* Custom loop start positions + BASS_POS_LOOP (BASS_ChannelSetPosition mode) + CUSTLOOP example updated +* Length extending + BASS_ATTRIB_TAIL (BASS_ChannelSetAttribute option) + BASS_SYNC_END (BASS_ChannelSetSync type) +* Device reinitialization while retaining BASS channels and 3D settings + BASS_DEVICE_REINIT (BASS_Init flag) +* Retrieval of a device's activity status + BASS_IsStarted +* BASS_DEVICE_3D flag is no longer needed to enable 3D support + BASS_Init +* The "Default" device is now enabled by default on Windows/macOS + BASS_CONFIG_DEV_DEFAULT (BASS_SetConfig option) +* Default communications device indicator on Windows + BASS_DEVICE_DEFAULTCOM (BASS_DEVICEINFO flag) +* Sample channel "newonly" option changed to a flag + BASS_SAMCHAN_NEW (BASS_SampleGetChannel flag) +* Sample playback streams + BASS_SAMCHAN_STREAM (BASS_SampleGetChannel flag) + BASS_CTYPE_STREAM_SAMPLE +* Speaker assignment support for samples + BASS_SampleGetChannel + BASS_ChannelFlags +* Overriding of default flags during sample channel creation + BASS_SampleGetChannel +* Same sample channel handle when max=1 is now optional + BASS_CONFIG_SAMPLE_ONEHANDLE (BASS_SetConfig option) +* 3D max distance muting can now be toggled + BASS_SAMPLE_MUTEMAX (BASS_ChannelFlags flag) +* Plugin disabling without affecting existing streams + BASS_PluginEnable +* WASAPI recording on Windows (DirectSound is fallback/optional) + BASS_CONFIG_REC_WASAPI (BASS_SetConfig option) + BASS_RecordInit +* Minimum recording buffer reduced to 10ms + BASS_CONFIG_REC_BUFFER (BASS_SetConfig option) +* Recording data/level retrieval without removing from buffer when not using a RECORDPROC + BASS_DATA_NOREMOVE (BASS_ChannelGetData flag) + BASS_LEVEL_NOREMOVE (BASS_ChannelGetLevelEx flag) +* Support for level measurements longer than 1s from decoding channels + BASS_ChannelGetLevelEx +* Configurable restricted download rate + BASS_CONFIG_NET_RESTRATE (BASS_SetConfig option) +* Thread-specific internet stream timeout options + BASS_CONFIG_THREAD (BASS_SetConfig option) + BASS_CONFIG_NET_TIMEOUT (BASS_SetConfig option) + BASS_CONFIG_NET_READTIMEOUT (BASS_SetConfig option) + BASS_StreamCreateURL +* Configured "User-Agent" header can be overridden in custom request headers + BASS_StreamCreateURL +* Multiple IPs will be tried when available on Linux/Android (already on other platforms) + BASS_StreamCreateURL +* BASS_STREAM_BLOCK applied automatically on files larger than 2GB + BASS_StreamCreateURL/FileUser +* Redirected URL retrieval + BASS_TAG_LOCATION (BASS_ChannelGetTags type) +* Shoutcast metadata is now optional + BASS_CONFIG_NET_META (BASS_SetConfig option) + BASS_TAG_META (BASS_ChannelGetTags type) +* Support for a 2nd ID3v2 tag block + BASS_TAG_ID3V2_2 (BASS_ChannelGetTags type) +* OpenMPT channel name retrieval + BASS_TAG_MUSIC_CHAN (BASS_ChannelGetTags type) +* Delayed OGG file scanning when prescanning is disabled/impossible + BASS_ChannelGetLength + BASS_ChannelSetPosition + BASS_CONFIG_OGG_PRESCAN (BASS_SetConfig option) +* Faster seeking in large OGG files + BASS_ChannelSetPosition +* Unified freeing function for all channel types + BASS_ChannelFree +* User-defined attribute + BASS_ATTRIB_USER (BASS_ChannelSetAttributeEx option) +* Push stream buffer size limiting + BASS_ATTRIB_PUSH_LIMIT (BASS_ChannelSetAttribute option) +* Retrieval of a stream's available file data amount + BASS_FILEPOS_AVAILABLE (BASS_StreamGetFilePosition mode) +* Error code for unsupported URL protocols + BASS_ERROR_PROTOCOL (BASS_StreamCreateURL error code) +* BASS_ERROR_ALREADY error changed to success in some functions + BASS_ChannelPause + BASS_ChannelSetDevice + BASS_ChannelSetLink +* Support for custom file streaming with Android Media codecs + BASS_StreamCreateFileUser +* Switch to using native APIs for Android Media codecs (Android 5 or above required now) + BASS_StreamCreateFile/User/URL +* BASS_TAG_AM_MIME value changed to fix conflict on Android + BASS_TAG_AM_MIME (BASS_ChannelGetTags type) +* Improved support for single active input recording devices on Linux + BASS_RecordGetInputName + BASS_RecordGetInput + BASS_RecordSetInput +* Automatic resumption of recordings after an interruption on iOS +* Fix for Media Foundation AAC streaming with Windows 10 20H1 + BASS_StreamCreateURL + BASS_StreamCreateFileUser +* Fix for freeze when freeing a stream after BASS_ChannelSetLink failed with BASS_ERROR_ALREADY on it + BASS_ChannelSetLink +* macOS examples rewritten in Objective-C/Cocoa +* "MP3-FREE" version removed (MP3 patents expired) +* armv5 (armeabi) architecture support dropped on Android + +2.4.15 - 17/12/2019 +------------------- +* Channel processing granularity option + BASS_ATTRIB_GRANULE (BASS_ChannelSetAttribute option) +* Asynchronous mixtime sync callbacks + BASS_SYNC_THREAD (BASS_ChannelSetSync flag) +* Output device update period can be set in samples + BASS_CONFIG_DEV_PERIOD (BASS_SetConfig option) +* Continuous output when nothing is playing is now optional on macOS/iOS too + BASS_CONFIG_DEV_NONSTOP (BASS_SetConfig option) +* AAudio output support on Android + BASS_Init + BASS_CONFIG_ANDROID_AAUDIO (BASS_SetConfig option) +* Support for audio session IDs on Android + BASS_CONFIG_ANDROID_SESSIONID (BASS_SetConfig option) +* ParcelFileDescriptor support on Android + BASS_StreamCreateFile + BASS_SampleLoad + BASS_MusicLoad +* FloatValue Java class added to receive floating-point values on Android 10 + BASS_Get3DFactors + BASS_RecordGetInput + BASS_ChannelGetAttribute + BASS_ChannelGet3DAttributes +* Audio session configuration option on iOS + BASS_CONFIG_IOS_SESSION (BASS_SetConfig option) +* OGG channel type constant renamed/duplicated to VORBIS + BASS_CTYPE_STREAM_VORBIS +* Error code for recognised file formats without audio + BASS_ERROR_NOTAUDIO (BASS_StreamCreateFile/User/URL error code) +* Error code for unstreamable MP4 files due to atom order + BASS_ERROR_UNSTREAMABLE (BASS_StreamCreateFileUser/URL error code) +* Fix for AAC streaming with BASS_STREAM_BLOCK on macOS 10.15 and iOS 13 + BASS_StreamCreateURL/FileUser +* Fix for playback rate changing bug when using DirectSound + BASS_ATTRIB_FREQ (BASS_ChannelSetAttribute option) +* armv6 architecture support dropped on iOS + +2.4.14 - 16/1/2019 +------------------ +* Support for playback on the "No sound" device + BASS_Init + BASS_StreamCreateFile/User/URL + BASS_SampleLoad/Create + BASS_ChannelPlay +* Improved sample rate conversion quality, including 64 point option + BASS_ATTRIB_SRC (BASS_ChannelSetAttribute option) + BASS_CONFIG_SRC/_SAMPLE (BASS_SetConfig options) +* Loopback (output device) recording on Windows Vista and newer + BASS_RecordInit + BASS_RecordGetDeviceInfo + BASS_DEVICE_LOOPBACK (BASS_DEVICEINFO flag) + DEVLIST and RECTEST examples updated +* Native format recording option + BASS_RecordStart +* Access to the 3D output mix for applying DSP/FX + STREAMPROC_DEVICE_3D (BASS_StreamCreate option) +* Retrieval of a device's started/stopped status + BASS_IsStarted +* Sync for when a device stops unexpectedly + BASS_SYNC_DEV_FAIL (BASS_ChannelSetSync type) +* New channel playback state for a paused device + BASS_ACTIVE_PAUSED_DEVICE (BASS_ChannelIsActive) +* Sync for when a device's sample format changes + BASS_SYNC_DEV_FORMAT (BASS_ChannelSetSync type) +* Adjustable output device update period + BASS_CONFIG_DEV_PERIOD (BASS_SetConfig option) +* Nyquist FFT option + BASS_DATA_FFT_NYQUIST (BASS_ChannelGetData flag) +* Plugin-specific flags are ignored in standard stream creation functions + BASS_StreamCreateFile/User/URL +* Pre-buffering during stream creation is now disabled by default + BASS_CONFIG_NET_PREBUF_WAIT (BASS_SetConfig option) + BASS_StreamCreateURL/FileUser +* Existing internet streams are unaffected by read timeout config changes + BASS_CONFIG_NET_READTIMEOUT (BASS_SetConfig option) +* Retrieval of the number of existing handles + BASS_CONFIG_HANDLES (BASS_GetConfig option) +* Windows mixer settings are retained by default and optionally not + BASS_CONFIG_WASAPI_PERSIST (BASS_SetConfig option) +* Configurable OpenSSL library filename on Linux/Android + BASS_CONFIG_LIBSSL (BASS_SetConfigPtr option) +* Files can be deleted/renamed while streaming on Windows (already true on other platforms) + BASS_StreamCreateFile +* Fix for bug in playback buffering disabling option + BASS_ATTRIB_NOBUFFER (BASS_ChannelSetAttribute option) +* Fix to support long logarithmic curves in volume effects + BASS_FX_VOLUME (BASS_ChannelSetFX type) + +2.4.13.8 - 6/2/2018 +------------------- +* Indication of a file's original sample format being floating-point + BASS_ORIGRES_FLOAT (BASS_CHANNELINFO/SAMPLE flag) +* Some extra sample data is retained to account for device latency in data retrieval + BASS_ChannelGetData +* FFT window is shortened to match amount of available data when less than FFT size + BASS_ChannelGetData +* FFT level adjusted to be approx the same regardless of amount of available data + BASS_ChannelGetData +* Fix for crash when decoding channels are dissociated from a device + BASS_NODEVICE (BASS_ChannelSetDevice option) + +2.4.13 - 19/12/2017 +------------------- +* WASAPI output on Windows (DirectSound is fallback/optional) + BASS_DEVICE_DSOUND (BASS_Init flag) + BASS_CONFIG_DEV_BUFFER/NONSTOP (BASS_SetConfig options) + BASS_CONFIG_SRC/_SAMPLE (BASS_SetConfig options) + BASS_ATTRIB_SRC/NORAMP (BASS_ChannelSetAttribute options) +* Default output device following support extended to Windows Vista and macOS + BASS_CONFIG_DEV_DEFAULT (BASS_SetConfig option) +* Seamless playback buffer length changing + BASS_ATTRIB_BUFFER (BASS_ChannelSetAttribute option) + BASS_ATTRIB_NOBUFFER deprecated + SYNTH example updated +* Access to the final output mix for applying DSP/FX + STREAMPROC_DEVICE (BASS_StreamCreate option) + BASS_CTYPE_STREAM_DEVICE + FXTEST example updated +* Dissociating of decoding channels from a device + BASS_NODEVICE (BASS_ChannelSetDevice option) +* Volume attribute levels above 1.0 for amplification + BASS_ATTRIB_VOL (BASS_ChannelSetAttribute option) +* Logarithmic attribute slides + BASS_SLIDE_LOG (BASS_ChannelSlideAttribute flag) +* Volume & panning attribute affected level retrieval + BASS_LEVEL_VOLPAN (BASS_ChannelGetLevelEx flag) +* Volume level adjustment effect + BASS_FX_VOLUME (BASS_ChannelSetFX type) + BASS_FX_VOLUME_PARAM structure +* Asynchronous pre-buffering + BASS_CONFIG_NET_PREBUF_WAIT (BASS_SetConfig option) + BASS_StreamCreateURL/FileUser + CONTEST and NETRADIO examples updated +* Decoding channels can be dissociated from a device + BASS_ChannelSetDevice +* Resetting of user file streams/decoders + BASS_POS_RESET (BASS_ChannelSetPosition flag) +* Relative seeking + BASS_POS_RELATIVE (BASS_ChannelSetPosition flag) +* RIFF cue points chunk retrieval + BASS_TAG_RIFF_CUE (BASS_ChannelGetTags type) + TAG_CUE structure +* RIFF sample chunk retrieval + BASS_TAG_RIFF_SMPL (BASS_ChannelGetTags type) + TAG_SMPL structure +* Support for Category/Description/Grouping/Keywords/Lyrics MP4 tags + BASS_TAG_MP4 (BASS_ChannelGetTags type) +* Separate channel type for dummy streams + BASS_CTYPE_STREAM_DUMMY +* Stalled internet stream buffering progress retrieval + BASS_FILEPOS_BUFFERING (BASS_StreamGetFilePosition mode) + CONTEST and NETRADIO examples updated +* Playlist recursion depth config option + BASS_CONFIG_NET_PLAYLIST_DEPTH (BASS_SetConfig options) +* Push file system read functions can now return 0 without ending the file + STREAMFILE_BUFFERPUSH (BASS_StreamCreateFileUser system) + FILEREADPROC +* 16 point SRC is used by default when SSE is available + BASS_CONFIG_SRC (BASS_SetConfig option) +* Mono downmixing for all file formats in sample loading + BASS_SAMPLE_MONO (BASS_SampleLoad flag) +* Mono OGG stream downmixing + BASS_SAMPLE_MONO (BASS_StreamCreateFile/User/URL flag) +* Media Foundation availability detection + BASS_CONFIG_MF_DISABLE (BASS_GetConfig option) + PLUGINS example updated +* AudioTrack output on Android + BASS_DEVICE_AUDIOTRACK (BASS_Init flag) +* Support for Android Media codecs + BASS_StreamCreateFile/User/URL + BASS_TAG_AM_MIME/NAME (BASS_ChannelGetTags type) + BASS_CONFIG_AM_DISABLE (BASS_SetConfig option) +* Panning fix for MOD files created with ScreamTracker 3 + BASS_MusicLoad +* Fix for compressor and distotion DX8 effects with floating-point data on Windows + BASS_FX_DX8_COMPRESSOR/DISTORTION (BASS_ChannelSetFX types) +* Fix for plugin freeing issue on 64-bit platforms (HPLUGIN is not library address any more) + BASS_PluginLoad + BASS_PluginFree + +2.4.12 - 10/3/2016 +------------------ +* DSP/FX chain order modification + BASS_FXSetPriority +* Average bitrate retrieval + BASS_ATTRIB_BITRATE (BASS_ChannelGetAttribute option) +* Ramping-out when stopping/pausing playback + BASS_ChannelStop + BASS_ChannelPause +* Disabling of playback ramping + BASS_ATTRIB_NORAMP (BASS_ChannelSetAttribute option) +* Pre-buffering when playback buffering is disabled + BASS_ChannelUpdate + BASS_ATTRIB_NOBUFFER (BASS_ChannelSetAttribute option) +* Net agent and proxy config options now make a copy of the provided string + BASS_CONFIG_NET_AGENT/PROXY (BASS_SetConfigPtr options) + NETRADIO example updated +* Unicode net agent and proxy config options on Windows + BASS_CONFIG_NET_AGENT/PROXY (BASS_SetConfigPtr options) +* 32768 sample FFT + BASS_DATA_FFT32768 (BASS_ChannelGetData flag) +* Support for iTunes gapless info in MP3 files + BASS_StreamCreateFile/User +* 529 sample delay removed from start of MP3 files without delay info + BASS_StreamCreateFile/User/URL +* Support for numerical MP4 genre (gnre) tags + BASS_TAG_MP4 (BASS_ChannelGetTags type) +* Support for BASSWMA's tag option when using Media Foundation WMA codec + BASS_TAG_WMA (BASS_ChannelGetTags type) +* OpenMPT author tag retrieval + BASS_TAG_MUSIC_AUTH (BASS_ChannelGetTags type) +* FastTracker2 panning for XM files + BASS_MUSIC_FT2PAN (BASS_MusicLoad flag) +* Support for longer device names on Windows + BASS_DEVICEINFO (name member) +* Checking for floating-point support on platforms that might not have it + BASS_CONFIG_FLOAT (BASS_GetConfig option) +* Attribute size retrieval fix + BASS_ChannelGetAttributeEx +* Fix for missing LC_VERSION_MIN issue with Xcode 7 on OSX, ppc architecture (PowerPC) support dropped +* LIST example renamed to DEVLIST + +2.4.11 - 22/12/2014 +------------------- +* Support for custom HTTP request headers + BASS_StreamCreateURL +* HTTPS support on Linux/Android + BASS_StreamCreateURL +* Redirection HTTP headers provided during connection + BASS_STREAM_STATUS (BASS_StreamCreateURL flag) + DOWNLOADPROC +* Adjustable stalled internet stream resumption buffer level + BASS_ATTRIB_NET_RESUME (BASS_ChannelSetAttribute option) +* Extended level retrieval inc. multi-channel and RMS options + BASS_ChannelGetLevelEx +* Inexact/faster seeking + BASS_POS_INEXACT (BASS_ChannelSetPosition flag) +* Post-stream creation scanning (seek table building) + BASS_POS_SCAN (BASS_ChannelSetPosition flag) +* Extended attribute support + BASS_ChannelGet/SetAttributeEx +* Scanned info retrieval and setting + BASS_ATTRIB_SCANINFO (BASS_ChannelGet/SetAttributeEx option) +* Built-in ADPCM WAVE file support on Linux/Android/WinCE + BASS_StreamCreateFile/User/URL + BASS_SampleLoad +* Active MOD channel count retrieval + BASS_ATTRIB_MUSIC_ACTIVE (BASS_ChannelGetAttribute option) +* Fractional sample rates + BASS_ATTRIB_FREQ (BASS_ChannelSetAttribute option) +* Device type information + BASS_DEVICE_TYPE_xxx (BASS_DEVICEINFO flags) +* Unicode support for recording input names + BASS_CONFIG_UNICODE (BASS_SetConfig option) + BASS_RecordGetInputName +* File size retrieval + BASS_FILEPOS_SIZE (BASS_StreamGetFilePosition mode) +* Asynchronous file reading buffer level retrieval + BASS_FILEPOS_ASYNCBUF (BASS_StreamGetFilePosition mode) +* MPEG data search limit raised to 1MB + BASS_CONFIG_VERIFY (BASS_SetConfig option) +* Separate MPEG data search limit for internet/buffered streams + BASS_CONFIG_VERIFY_NET (BASS_SetConfig option) +* Support for iTunes gapless info with Media Foundation and CoreAudio codecs + BASS_StreamCreateFile/User +* Airplay receiver enumeration and selection on OSX + BASS_DEVICES_AIRPLAY (BASS_GetDeviceInfo flag) + BASS_CONFIG_AIRPLAY (BASS_SetConfig option) +* Media Foundation playback of audio from videos is now optional + BASS_CONFIG_MF_VIDEO (BASS_SetConfig option) +* Optional floating-point or fixed-point data retrieval on Android/WinCE + BASS_DATA_FLOAT/FIXED (BASS_ChannelGetData flags) +* Continuous output when nothing is playing on Linux/Android/WinCE + BASS_CONFIG_DEV_NONSTOP (BASS_SetConfig option) +* Fix for decoding channels being ended when stopping the output device + BASS_Stop +* Fix for Media Foundation internet/buffered streaming on Windows 8 + BASS_StreamCreateURL + BASS_StreamCreateFileUser +* Improved compatibility with recent PulseAudio versions on Linux +* LIST and MODTEST examples added +* MASM API and examples removed (available as separate download) + +2.4.10 - 16/2/2013 +------------------ +* Asynchronous file reading/buffering + BASS_ASYNCFILE (BASS_StreamCreateFile/User flag) + BASS_CONFIG_ASYNCFILE_BUFFER (BASS_SetConfig option) +* Support for chained OGG files (multiple logical bitstreams) + BASS_StreamCreateFile/User + BASS_CONFIG_OGG_PRESCAN (BASS_SetConfig option) + BASS_POS_OGG (BASS_ChannelSetPosition/ChannelGetLength mode) +* OGG logical bitstream syncs are no longer automatically "mixtime" + BASS_SYNC_OGG_CHANGE (BASS_ChannelSetSync type) +* Support for Soundtracker MOD files + BASS_MusicLoad +* Complex FFT data + BASS_DATA_FFT_COMPLEX (BASS_ChannelGetData flag) +* Volume levels above 1.0 for decoding channels + BASS_ATTRIB_VOL (BASS_ChannelSetAttribute option) +* Recording device channel count retrieval on Windows/OSX/iOS + BASS_RECORDINFO (formats member) +* Minimum recording period reduced to 5ms + BASS_RecordStart +* Recording device period adjustment on OSX + BASS_RecordStart +* Device UID retrieval on OSX + BASS_DEVICEINFO (driver member) +* The desktop window handle is used when none is provided + BASS_Init + +2.4.9 - 3/5/2012 +---------------- +* Improved and adjustable sample rate conversion quality + BASS_ATTRIB_SRC (BASS_ChannelSetAttribute option) + BASS_CONFIG_SRC/_SAMPLE (BASS_SetConfig options) +* Support for buffered file & internet streams with CoreAudio codecs on OSX/iOS + BASS_StreamCreateURL + BASS_StreamCreateUser +* Data and level retrieval from sample channels + BASS_ChannelGetData + BASS_ChannelGetLevel +* Oldest sample channel will be overridden when there are multiple candidates + BASS_SampleGetChannel +* Use of the device's output rate with MODs + BASS_MusicLoad +* Optional device output rate setting on OSX/iOS + BASS_DEVICE_FREQ (BASS_Init flag) +* UTF-8 device information on Windows + BASS_CONFIG_UNICODE (BASS_SetConfig option) +* Speaker assignment with panning/balance control on Windows Vista/7 + BASS_CONFIG_VISTA_SPEAKERS (BASS_SetConfig option) + BASS_ATTRIB_PAN (BASS_ChannelGet/Set/SlideAttribute option) +* Push stream queue level can be checked after using BASS_STREAMPROC_END + BASS_StreamPutData +* Support for ALSA subdevices on Linux + BASS_Init + BASS_GetDeviceInfo + BASS_RecordInit + BASS_RecordGetDeviceInfo +* Device list fix on 64-bit OSX + BASS_GetDeviceInfo + BASS_RecordGetDeviceInfo +* BASS_UNICODE support fix on Linux + BASS_PluginLoad +* Internet streaming tweaks/fixes on Windows +* SYNTH example updated to use device output rate +* RECTEST example updated (C version) for better Windows Vista/7 support +* Documentation updated with platform-specific info for Android + +2.4.8 - 29/8/2011 +----------------- +* Support for Media Foundation codecs on Windows 7 and updated Vista + BASS_StreamCreateFile/User/URL + BASS_TAG_MF (BASS_ChannelGetTags type) + PLUGINS example updated +* Built-in support for MP4 tags on Win32/OSX/iOS (for Media Foundation & CoreAudio AAC/ALAC codecs) + BASS_TAG_MP4 (BASS_ChannelGetTags type) +* WAVE format chunk retrieval + BASS_TAG_WAVEFORMAT (BASS_ChannelGetTags type) +* Adjustable sample channel limit + BASS_SampleSetInfo +* Per-channel CPU usage monitoring + BASS_ATTRIB_CPU (BASS_ChannelGetAttribute option) +* Pre-allocation of push stream queue space + BASS_StreamPutData +* Support for AIFF files with the data chunk before the format info chunk + BASS_StreamCreateFile/User/URL +* Ramping-in disabled for all but the XM format (and MODs in FT2 mode) in "normal" ramping mode + BASS_MUSIC_RAMP (BASS_MusicLoad flag) +* RIFF "INFO" tag reading fix + BASS_TAG_RIFF_INFO (BASS_ChannelGetTags type) +* OSX 10.7 compatibility fix +* x86_64 architecture support on OSX +* Delphi dynamic loading unit removed (now available as separate download) + +2.4.7 - 30/11/2010 +------------------ +* Decode-to-position seeking + BASS_POS_DECODETO (BASS_ChannelSetPosition flag) +* Support for RIFF "DISP" text tags + BASS_TAG_RIFF_DISP (BASS_ChannelGetTags type) +* Support for APEv1 tags + BASS_TAG_APE (BASS_ChannelGetTags type) + BASS_TAG_APE_BINARY (BASS_ChannelGetTags type) +* 16384 sample FFT + BASS_DATA_FFT16384 (BASS_ChannelGetData flag) +* Support for AIFF files larger than 4GB + BASS_StreamCreateFile/User/URL +* Acceptance of self-signed and invalid certificates + BASS_StreamCreateURL +* Internet stream reading timeout + BASS_CONFIG_NET_READTIMEOUT (BASS_SetConfig option) +* Support for removing a DSP within its DSPPROC + BASS_ChannelRemoveDSP +* Buffer bypassing for lower latency output (not available on Windows) + BASS_ATTRIB_NOBUFFER (BASS_ChannelSetAttribute option) + SYNTH example added (OSX) +* A "Default" device that follows default device changes on Windows 7 + BASS_CONFIG_DEV_DEFAULT (BASS_SetConfig option) +* Xcode examples project added for OSX +* Documentation updated with platform-specific info for iOS/Linux/WinCE + +2.4.6 - 17/6/2010 +----------------- +* Support for APEv2 tags, including binary + BASS_TAG_APE (BASS_ChannelGetTags type) + BASS_TAG_APE_BINARY (BASS_ChannelGetTags type) +* Unicode/IDN URL support + BASS_StreamCreateURL +* Decoding position retrieval + BASS_POS_DECODE (BASS_ChannelGetPosition flag) +* Support for OGG 6/7.1 channel configs + BASS_StreamCreateFile/User/URL +* Support for setting syncs within mixtime SYNCPROCs + BASS_ChannelSetSync +* Support for setting additional DSP/FX within DSPPROCs + BASS_ChannelSetDSP/FX +* DC bias removal in FFT processing + BASS_DATA_FFT_REMOVEDC (BASS_ChannelGetData flag) +* Fix for incorrect (2x) return value when getting FFT data from a 16-bit channel + BASS_ChannelGetData +* Fix for incorrect (STOPPED instead of PAUSED) channel status following BASS_Pause + BASS_ChannelIsActive + +2.4.5 - 18/12/2009 +------------------ +* Support for little-endian AIFF files + BASS_StreamCreateFile/User/URL + BASS_SampleLoad +* Support for 64-bit floating-point WAVE/AIFF files + BASS_StreamCreateFile/User/URL + BASS_SampleLoad +* Input volume retrieval failure results in a reading of -1 instead of 1 + BASS_RecordGetInput + RECTEST example updated +* Input volume support on OSX + BASS_RecordSetInput + BASS_RecordGetInput + RECTEST example updated +* Fix for deferred input settings on Vista + BASS_RecordSetInput +* Windows MP3 codec given preference over other installed MP3 codecs (MP3-FREE version) + BASS_StreamCreateFile/User/URL + BASS_SampleLoad + +2.4.4 - 13/10/2009 +------------------ +* RIFF/BWF "radio traffic" tag retrieval + BASS_TAG_RIFF_CART (BASS_ChannelGetTags type) + TAG_CART structure +* Support for ID3v2 tags in RIFF/WAVE/AIFF files ("ID3 " chunk) + BASS_TAG_ID3V2 (BASS_ChannelGetTags type) +* Pushed fractional samples are refused rather than discarded + BASS_StreamPutData +* DX8 effect emulation on OSX + BASS_FX_DX8_CHORUS/DISTORTION/ECHO/FLANGER/PARAMEQ/REVERB (BASS_ChannelSetFX types) + FXTEST example added +* UTF-16 support on OSX + BASS_UNICODE (BASS_StreamCreateFile/SampleLoad/MusicLoad/PluginLoad flag) + +2.4.3 - 8/5/2009 +---------------- +* MOD order list retrieval + BASS_TAG_MUSIC_ORDERS (BASS_ChannelGetTags type) +* Support for ID3v2 tags in RIFF/WAVE files ("id3 " chunk) + BASS_TAG_ID3V2 (BASS_ChannelGetTags type) +* Improved position reporting precision on Vista + BASS_ChannelGetPosition +* Length retrieval when streaming in blocks (BASS_STREAM_BLOCK) + BASS_ChannelGetLength +* Support for CoreAudio codecs on OSX + BASS_StreamCreateFile/User + BASS_SampleLoad + BASS_TAG_CA_CODEC (BASS_ChannelGetTags type) + TAG_CA_CODEC structure +* 3D algorithm option support on OSX + BASS_CONFIG_3DALGORITHM (BASS_SetConfig option) + +2.4.2 - 18/9/2008 +----------------- +* RF64 support + BASS_StreamCreateFile/User +* RIFF/BWF "Broadcast Audio Extension" tag retrieval + BASS_TAG_RIFF_BEXT (BASS_ChannelGetTags type) + TAG_BEXT structure +* ID3v1 tag structure + TAG_ID3 structure +* Multiple simultaneous recordings per device on Vista & OSX (as on XP) + BASS_RecordStart +* DX8 effect parameter defaults updated/corrected in documentation + +2.4 - 2/4/2008 +-------------- +* "Push" streaming + STREAMPROC_PUSH (BASS_StreamCreate option) + BASS_StreamPutData + LIVEFX and MULTI examples updated +* "Push" buffered file streaming + STREAMFILE_BUFFERPUSH (BASS_StreamCreateFileUser system) + BASS_StreamPutFileData +* STREAMFILEPROC replaced by table of callbacks for each file operation + BASS_FILEPROCS (FILECLOSEPROC/FILELENPROC/FILEREADPROC/FILESEEKPROC) + STREAMFILEPROC *removed* +* 64-bit file positioning + BASS_SampleLoad + BASS_MusicLoad + BASS_StreamCreateFile + BASS_StreamGetFilePosition +* File buffer level retrieval + BASS_FILEPOS_BUFFER (BASS_StreamGetFilePosition mode) +* Sinc interpolated MOD music mixing + BASS_MUSIC_SINCINTER (BASS_MusicLoad flag) +* MO3 2.4 support + BASS_MusicLoad +* MOD orders positioning incorporated into channel functions + BASS_ChannelGetLength + BASS_ChannelSetPosition + BASS_ChannelGetPosition + BASS_MusicGetOrderPosition *removed* + BASS_MusicGetOrders *removed* +* Channel attribute functions consolidated + BASS_ChannelSetAttribute + BASS_ChannelGetAttribute + BASS_ChannelSlideAttribute + BASS_ChannelIsSliding + BASS_ChannelSetAttributes *removed* + BASS_ChannelGetAttributes *removed* + BASS_ChannelSlideAttributes *removed* + BASS_ChannelSetEAXMix *removed* + BASS_ChannelGetEAXMix *removed* + BASS_MusicSetAttribute *removed* + BASS_MusicGetAttribute *removed* +* Floating-point volume and panning + BASS_SetVolume + BASS_GetVolume + BASS_RecordSetInput + BASS_RecordGetInput + BASS_ATTRIB_PAN/VOL (BASS_ChannelGet/Set/SlideAttribute options) + BASS_ATTRIB_MUSIC_VOL_CHAN/INST (BASS_ChannelGet/Set/SlideAttribute options) + BASS_SAMPLE (volume/pan/outvol members) + BASS_CONFIG_MAXVOL *removed* + BASSTEST and RECTEST examples updated +* Output device volume control on Vista (as on other OS) + BASS_SetVolume + BASS_GetVolume +* Multiple update threads + BASS_CONFIG_UPDATETHREADS (BASS_SetConfig option) + BASSTEST example updated +* Global volume range increased to 10000 + BASS_CONFIG_GVOL_SAMPLE/STREAM/MUSIC (BASS_SetConfig options) + BASSTEST example updated +* Setting and retrieving of a sample's data + BASS_SampleSetData + BASS_SampleGetData + BASS_SampleCreate + BASS_SampleCreateDone *removed* +* Channel flag setting mask + BASS_ChannelFlags + BASS_ChannelSetFlags *removed* + SPEAKERS example updated +* 256 sample FFT + BASS_DATA_FFT256 (BASS_ChannelGetData flag) +* Channel locking to prevent access by other threads + BASS_ChannelLock +* Manual channel buffer updating + BASS_ChannelUpdate + BASS_ChannelPreBuf *removed* +* Configurable manual update length + BASS_Update +* Extended device information retrieval and detection of new/removed devices + BASS_GetDeviceInfo + BASS_RecordGetDeviceInfo + BASS_DEVICEINFO structure + BASS_GetDeviceDescription *removed* + BASS_RecordGetDeviceDescription *removed* + BASS_INFO (driver member) *removed* + BASS_RECORDINFO (driver member) *removed* + MULTI example updated +* Default device change tracking on Windows (as on OSX) + BASS_Init + BASS_RecordInit +* Speaker detection from Windows control panel + BASS_DEVICE_CPSPEAKERS (BASS_Init flag) +* Channel automatically stopped & resumed for DX8 effects + BASS_ChannelSetFX + BASS_ChannelRemoveFX +* "double" precision position conversion + BASS_ChannelBytes2Seconds + BASS_ChannelSeconds2Bytes +* Separate config functions for pointers + BASS_SetConfigPtr + BASS_GetConfigPtr + BASS_CONFIG_NET_AGENT/PROXY (BASS_SetConfigPtr options) +* Configurable file format verification length + BASS_CONFIG_VERIFY (BASS_SetConfig option) +* Stream filename retrieval + BASS_CHANNELINFO (file member) +* Channel sample retrieval + BASS_CHANNELINFO (sample member) +* META syncs no longer receive metadata in the "data" parameter + BASS_SYNC_META (BASS_ChannelSetSync type) +* Separate sync for OGG logical bitstream changes (instead of BASS_SYNC_META) + BASS_SYNC_OGG_CHANGE (BASS_ChannelSetSync type) + NETRADIO example updated (C version) +* Message syncing removed (use PostMessage instead) + BASS_SYNC_MESSAGE (BASS_ChannelSetSync flag) *removed* +* Data retrieval from stopped/paused channels + BASS_ChannelGetData +* Callback "user" parameters changed to pointers + BASS_StreamCreate / STREAMPROC + BASS_StreamCreateFileUser + BASS_StreamCreateURL / DOWNLOADPROC + BASS_RecordStart / RECORDPROC + BASS_ChannelSetDSP / DSPPROC + BASS_ChannelSetSync / SYNCPROC + +2.3.0.3 - 30/7/2007 +------------------- +* FX state resetting + BASS_FXReset +* PLS/M3U playlist URL processing + BASS_CONFIG_NET_PLAYLIST (BASS_SetConfig option) + NETRADIO example updated +* Internet stream connection status retrieval + BASS_FILEPOS_CONNECTED (BASS_StreamGetFilePosition mode) +* Lyrics3v2 tags + BASS_TAG_LYRICS3 (BASS_ChannelGetTags type) +* IT virtual channel configuration + BASS_CONFIG_MUSIC_VIRTUAL (BASS_SetConfig option) +* Accurate speaker detection on Vista + BASS_INFO (speakers member) +* Device output/input rate retrieval on Vista + BASS_INFO (freq member) + BASS_RECORDINFO (freq member) +* Syncing upon position changes + BASS_SYNC_SETPOS (BASS_ChannelSetSync type) +* Improved stall handling + BASS_SYNC_STALL +* Invalid decoding channel flags produce an error instead of being ignored + BASS_StreamCreate/File/User/URL + BASS_MusicLoad + +2.3.0.2 - 22/1/2007 +------------------- +* Retrieval of a sample's existing channel handles + BASS_SampleGetChannels +* 8192 sample FFT + BASS_DATA_FFT8192 (BASS_ChannelGetData flag) +* Adjustable recording buffer + BASS_CONFIG_REC_BUFFER (BASS_SetConfig option) +* Stopping decoding channels before the end + BASS_ChannelStop +* Sample channels created paused to prevent overriding before playback + BASS_SampleGetChannel +* Separate "MP3-FREE" version using the OS's MP3 decoder + BASS_CONFIG_MP3_CODEC *removed* + +2.3.0.1 - 12/6/2006 +------------------- +* Ability to move a channel to another device + BASS_ChannelSetDevice + MULTI example updated +* Support for ID3v2.4 tags at end of file + BASS_TAG_ID3V2 (BASS_ChannelGetTags type) + +2.3 - 21/5/2006 +--------------- +* MOD message/instrument/sample text retrieval, merged with stream tag retrieval function + BASS_ChannelGetTags + BASS_TAG_MUSIC_NAME/MESSAGE/INST/SAMPLE (BASS_ChannelGetTags types) + BASS_MusicGetName *removed* + BASS_StreamGetTags *removed* +* Plugin information retrieval + BASS_PluginGetInfo + BASS_PLUGININFO/FORM structures + BASS_CHANNELINFO (plugin member) + PLUGINS example updated +* RIFF/WAVE "INFO" tag retrieval + BASS_TAG_RIFF_INFO (BASS_StreamGetTags type) +* More specific WAVE format information + BASS_CTYPE_STREAM_WAV_PCM/FLOAT (channel types) + BASS_CTYPE_STREAM_WAV (channel type flag) +* Proxy server configuration + BASS_CONFIG_NET_PROXY (BASS_SetConfig option) + BASS_CONFIG_NET_NOPROXY *removed* + NETRADIO example updated +* Passive FTP mode + BASS_CONFIG_NET_PASSIVE (BASS_SetConfig option) +* Agent changes take immediate effect + BASS_CONFIG_NET_AGENT (BASS_SetConfig option) +* Minimum time gap between creating new sample channels + BASS_SAMPLE (mingap member) + BASS_SampleGetChannel +* Support for Unicode plugin filenames + BASS_PluginLoad +* Device output/input rate retrieval (MacOSX only) + BASS_INFO (freq member) + BASS_RECORDINFO (freq member) +* Extended version info (minor revision) + BASS_GetVersion +* Unsupported codec error code + BASS_ERROR_CODEC +* Optional use of the Windows MP3 codec + BASS_CONFIG_MP3_CODEC (BASS_SetConfig option) +* 3D support for MacOSX + BASS_Set3DFactors + BASS_Get3DFactors + BASS_Set3DPosition + BASS_Get3DPosition + BASS_Apply3D + BASS_ChannelSet3DAttributes + BASS_ChannelGet3DAttributes + BASS_ChannelSet3DPosition + BASS_ChannelGet3DPosition + 3DTEST example added (Win32 example also updated) +* VB version of SYNTH example added + +2.2 - 2/10/2005 +--------------- +* Add-on plugin system + BASS_PluginLoad + BASS_PluginFree + BASS_StreamCreateFile/User/URL + BASS_SampleLoad + PLUGINS example added +* MOD position & syncing in bytes + BASS_ChannelSetPosition + BASS_ChannelGetPosition + BASS_MusicGetOrderPosition added for orders position + BASS_SYNC_MUSICPOS added for orders syncing + MAKEMUSICPOS macro/define + CUSTLOOP example updated +* Stream/MOD "length" functions combined (also works with samples), new MOD orders length function + BASS_ChannelGetLength + BASS_MusicGetOrders + BASS_StreamGetLength *removed* + BASS_MusicGetLength *removed* +* Support for AIFF files + BASS_StreamCreateFile/User/URL + BASS_SampleLoad +* Support for 24 and 32-bit (integer) WAV files + BASS_StreamCreateFile/User/URL + BASS_SampleLoad +* WAV files are no longer converted to the "device" resolution + BASS_StreamCreateFile/User/URL +* Recording master control + BASS_RecordGetInput + BASS_RecordSetInput +* Adjustable pre-buffering + BASS_ChannelPreBuf +* Floating-point data retrieval + BASS_DATA_FLOAT (BASS_ChannelGetData flag) +* Support for floating-point samples + BASS_SampleLoad + BASS_SampleCreate +* Multi-channel samples + BASS_SampleLoad/Create + BASS_SAMPLE (chans member) +* Sample lengths given in bytes + BASS_SampleCreate + BASS_SAMPLE (length member) +* MOD music 8-bit resolution option + BASS_MusicLoad +* OGG vendor tag retrieval + BASS_TAG_VENDOR (BASS_StreamGetTags type) +* Configurable "User-Agent" header for internet streams + BASS_CONFIG_NET_AGENT (BASS_SetConfig option) +* Shoutcast metadata is now requested automatically + BASS_STREAM_META flag *removed* +* Download callbacks receive all data from start of file/stream (including any non-audio data) + DOWNLOADPROC +* Length when streaming in blocks is unavailable (BASS_ERROR_NOTAVAIL, not just 0) + BASS_ChannelGetLength +* Support for growing custom file streams + BASS_FILE_LEN (STREAMFILEPROC action) +* Query file action removed + BASS_FILE_QUERY *removed* +* Recording channel syncing + BASS_ChannelSetSync +* Info structure "size" members removed + BASS_INFO structure + BASS_RECORDINFO structure +* Little bit of flag reshuffling + BASS_MP3_SETPOS renamed to BASS_STREAM_PRESCAN + BASS_MUSIC_CALCLEN value changed and renamed to BASS_MUSIC_PRESCAN + BASS_MUSIC_POSRESET value changed +* Add-on API enhancements +* MacOSX port introduced + +2.1 - 28/11/2004 +---------------- +* Improved "mixtime" sync system, allowing custom looping + SYNCPROC + CUSTLOOP example added +* FX can now be in the DSP chain, so can be prioritized and applied in floating-point + BASS_ChannelSetFX + BASS_CONFIG_FLOATDSP (BASS_SetConfig option) +* Ability to set channel flags (eg. looping) independent of playback + BASS_ChannelSetFlags + SPEAKERS example updated +* Stream/MOD "play" and channel "resume" functions combined + BASS_ChannelPlay + BASS_StreamPlay *removed* + BASS_MusicPlay *removed* + BASS_MusicPlayEx *removed* + BASS_ChannelResume *removed* +* Stream/MOD pre-buffering functions combined + BASS_ChannelPreBuf + BASS_StreamPreBuf *removed* + BASS_MusicPreBuf *removed* +* MOD attribute functions combined, with added BPM/speed/globalvolume options + BASS_MusicSetAttribute + BASS_MusicGetAttribute + BASS_MUSIC_ATTRIB_AMPLIFY + BASS_MUSIC_ATTRIB_PANSEP + BASS_MUSIC_ATTRIB_PSCALER + BASS_MUSIC_ATTRIB_BPM + BASS_MUSIC_ATTRIB_SPEED + BASS_MUSIC_ATTRIB_VOL_GLOBAL + BASS_MUSIC_ATTRIB_VOL_CHAN + BASS_MUSIC_ATTRIB_VOL_INST + BASS_MusicSetAmplify *removed* + BASS_MusicSetPanSep *removed* + BASS_MusicSetPositionScaler *removed* + BASS_MusicSetVolume *removed* + BASS_MusicGetVolume *removed* +* Flag to reset bpm/etc as well as notes when seeking in MOD musics + BASS_MUSIC_POSRESETEX (BASS_MusicLoad & BASS_ChannelSetFlags flag) +* More flexible and concise sample channel creation system + BASS_SampleGetChannel + BASS_SamplePlay *removed* + BASS_SamplePlayEx *removed* + BASS_SamplePlay3D *removed* + BASS_SamplePlay3DEx *removed* +* Support for up to 30 speakers + BASS_SPEAKER_N macro/define +* More precise level measurement + BASS_ChannelGetLevel +* Level can now be retrieved from decoding channels + BASS_ChannelGetLevel +* Retrieval of a sample/channel's original sample resolution + BASS_SAMPLE (origres member) + BASS_CHANNELINFO (origres member) +* Support for streaming WAV files in "blocks" + BASS_StreamCreateURL + BASS_StreamCreateFileUser +* Status info (HTTP/ICY tags) available during connection to server + BASS_STREAM_STATUS (BASS_StreamCreateURL flag) + DOWNLOADPROC + NETRADIO example updated (Delphi version also added) +* Adjustable internet stream pre-buffering + BASS_CONFIG_NET_PREBUF (BASS_SetConfig option) +* Option to bypass proxy server + BASS_CONFIG_NET_NOPROXY (BASS_SetConfig option) +* Option whether to allow channels to be played after BASS_Pause + BASS_CONFIG_PAUSE_NOPLAY (BASS_SetConfig option) +* Recording channel count now a separate parameter + BASS_RecordStart (chans parameter) +* Synchronizer for when a channel is freed + BASS_SYNC_FREE (BASS_ChannelSetSync type) +* Data start file position retrieval + BASS_FILEPOS_START (BASS_StreamGetFilePosition mode) +* Performance improvements + MP2 decoding ~20% faster + MP3/MP1 decoding & FFT processing all up to 10% faster + OGG decoding ~3% faster +* C/C++ examples reorganised, with makefiles & VC++ projects +* Add-on API enhancements +* More DLL shrinkage :) + +2.0 - 31/10/2003 +---------------- +* Multiple output device support + BASS_Init (device number changes) + BASS_SetDevice + BASS_GetDevice + BASS_ChannelGetDevice + MULTI example updated (VB version also added) +* Multiple recording device support + BASS_RecordSetDevice + BASS_RecordGetDevice + BASS_RecordStart + BASS_ChannelGetDevice + HRECORD handle + RECORDPROC (handle parameter) +* Recording with DSP/FX + BASS_ChannelSetDSP + BASS_ChannelSetFX +* Recording position retrieval + BASS_ChannelGetPosition +* Start recording paused + BASS_RECORD_PAUSE (BASS_RecordStart flag) +* Multi-channel streams, inc. support for multichannel OGG & WAV files + BASS_StreamCreate + BASS_StreamCreateFile/User/URL +* FFT for individual channels, inc. multi-channel streams + BASS_DATA_FFT_INDIVIDUAL (BASS_ChannelGetData flag) + BASS_DATA_FFT512S/1024S/2048S/4096S *removed* +* DSP prioritizing + BASS_ChannelSetDSP + DSPTEST example updated +* Seeking in internet streamed files + BASS_ChannelSetPosition +* Enhanced custom file stream systems + BASS_StreamCreateFileUser + BASS_FILE_SEEK (STREAMFILEPROC action) + BASS_STREAM_FILEPROC flag *removed* +* Enhanced custom stream system with automatic stalling/resuming + STREAMPROC + BASS_STREAMPROC_END (STREAMPROC flag) +* Synchronizer for stalled/resumed playback + BASS_SYNC_STALL (BASS_ChannelSetSync type) +* Synchronizer for completed download + BASS_SYNC_DOWNLOAD (BASS_ChannelSetSync type) +* End sync support for custom streams + BASS_SYNC_END (BASS_ChannelSetSync type) +* Synchronizer support for decoding channels + BASS_ChannelSetSync +* Unified configuration function + BASS_SetConfig + BASS_GetConfig + BASS_SetBufferLength *removed* + BASS_SetNetConfig *removed* + BASS_SetGlobalVolumes *removed* + BASS_GetGlobalVolumes *removed* + BASS_SetLogCurves *removed* + BASS_Set3DAlgorithm *removed* + BASS_DEVICE_FLOATDSP flag *removed* +* Internet stream saving to disk replaced by more flexible callback + BASS_StreamCreateURL + DOWNLOADPROC + VB NETRADIO example updated +* Buffer length retrieval when "streaming in blocks" + BASS_FILEPOS_END (BASS_StreamGetFilePosition mode) +* Individual sample rate setting for MOD musics + BASS_MusicLoad +* Channel type and default sample rate retrieval + BASS_ChannelGetInfo (replaces BASS_ChannelGetFlags) + BASS_CHANNELINFO +* MOD music flag retrieval + BASS_CHANNELINFO (flags member) +* Adjustable instrument volumes in MOD musics + BASS_MusicSetVolume (replaces BASS_MusicSetChannelVol) + BASS_MusicGetVolume (replaces BASS_MusicGetChannelVol) +* Automatically free a MOD music when it stops or ends + BASS_MUSIC_AUTOFREE (BASS_MusicLoad flag) +* Class GUID added to initialization parameters + BASS_Init + BASS_SetCLSID *removed* +* Update period adjustable at any time + BASS_CONFIG_UPDATEPERIOD (BASS_SetConfig option) + BASS_DEVICE_NOTHREAD flag *removed* +* Customizable maximum volume setting + BASS_CONFIG_MAXVOL (BASS_SetConfig option) + BASS_DEVICE_VOL1000 flag *removed* +* Device volume is now always left as it is during init/freeing + BASS_DEVICE_LEAVEVOL flag *removed* +* Device driver name retrieval + BASS_INFO (driver member) + BASS_RECORDINFO (driver member) +* Error codes are local to the current thread + BASS_ErrorGetCode +* Performance improvements + MP2 decoding 15-20% faster + MP3 decoding ~5% faster +* Built-in CD functions removed (replaced in BASSCD) + BASS_CDDoor *removed* + BASS_CDFree *removed* + BASS_CDGetID *removed* + BASS_CDGetTrackLength *removed* + BASS_CDGetTracks *removed* + BASS_CDInDrive *removed* + BASS_CDInit *removed* + BASS_CDPlay *removed* +* Force channels to use software mixing + BASS_SAMPLE_SOFTWARE (BASS_StreamCreate/File/User/URL & BASS_MusicLoad flag) +* Support for high-pass filter and forward/reverse (S9E/F) IT/MPT effects +* BASS_MUSIC flags rearranged to mirror BASS_SAMPLE/STREAM counterparts +* Output automatically started during initialization +* BASS_ChannelGetData once again accepts any "length" param +* All function comments have been removed from the API headers to avoid + outdated/incorrect information - the documentation should be used. +* TMT Pascal API removed from main distribution - now available on the website +* A few more 'K' knocked off the DLL size :) + +1.8a - 18/6/2003 +---------------- +* Tweaks 'n' fixes, including... + Fixed seeking bug on 32-bit OGG streams + Fixed seeking on a decoding channel after it has reached the end + Low FPU precision (eg. when using Direct3D) issue addressed + Improved speakers (BASS_INFO) detection + BASS_ChannelSeconds2Bytes return value is rounded down to nearest sample + BASS_ChannelGetData "length" param must equal a whole number of samples + Slide syncs are triggered by "-2" volume slides on "autofree" streams +* Support for Unicode filenames + BASS_UNICODE (BASS_SampleLoad/BASS_StreamCreateFile/BASS_MusicLoad flag) +* 4096 sample FFT + BASS_DATA_FFT4096/S (BASS_ChannelGetData flags) +* Another 'K' knocked off the DLL size + +1.8 - 9/3/2003 +-------------- +* 32-bit floating-point channels + BASS_SAMPLE_FLOAT (BASS_StreamCreate/File/URL flag) + BASS_MUSIC_FLOAT (BASS_MusicLoad flag) + BASS_SAMPLE_FLOAT (BASS_RecordStart flag) + BASS_DEVICE_FLOATDSP (BASS_Init flag) + DSPTEST example updated +* Support for 32-bit floating-point (type 3) WAV files + BASS_StreamCreateFile/URL + BASS_SampleLoad +* Channel speaker assignment + BASS_SPEAKER_FRONT (BASS_MusicLoad/BASS_StreamCreate/File/URL flag) + BASS_SPEAKER_REAR " + BASS_SPEAKER_CENLFE " + BASS_SPEAKER_REAR2 " + BASS_SPEAKER_FRONTLEFT " + BASS_SPEAKER_FRONTRIGHT " + BASS_SPEAKER_REARLEFT " + BASS_SPEAKER_REARRIGHT " + BASS_SPEAKER_CENTER " + BASS_SPEAKER_LFE " + BASS_SPEAKER_REAR2LEFT " + BASS_SPEAKER_REAR2RIGHT " + BASS_INFO (speakers member) + BASS_DEVICE_SPEAKERS (BASS_Init flag) + 4SPEAKER example replaced by SPEAKERS example +* Recording input type retrieval + BASS_INPUT_TYPE_xxx (BASS_RecordGetInput) + RECTEST example updated +* Non-interpolated MOD mixing + BASS_MUSIC_NONINTER (BASS_MusicLoad/PlayEx flag) +* Performance improvements + FFT up to 100% faster! + MP3(MPEG2/2.5) decoding up to 60% faster + MMX mixers 5-10% faster + MP3(MPEG1)/MP2/MP1/OGG decoding all ~5% faster +* Optional disabling of FFT windowing + BASS_DATA_FFT_NOWINDOW (BASS_ChannelGetData flag) +* BASS_ERROR_FILEFORM - error code to distinguish between file and sample format + BASS_MusicLoad + BASS_SampleLoad + BASS_StreamCreate/File/URL +* BASS_StreamGetFilePosition mode flags added + BASS_FILEPOS_DECODE/DOWNLOAD/END +* DirectSound 9 detection + BASS_INFO (dsver member) +* Initialization flags retrieval + BASS_INFO (initflags member) +* Half-rate MP3 playback option removed + BASS_MP3_HALFRATE flag *removed* +* New internal "plugin" system - BASSWMA is further integrated as a result +* Improved documentation - integrated with BASSWMA, search option added +* VB version of DSPTEST example added +* Delphi RECORDTEST example added +* Guess what... reduced DLL size again :) + +1.7 - 27/10/2002 +---------------- +* New alternative DX8 (DMO) effects implementation + BASS_StreamCreate/File/URL + BASS_MusicLoad + BASS_ChannelSetFX + SYNTH example updated +* User file streaming + BASS_STREAM_FILEPROC (BASS_StreamCreate flag) + STREAMFILEPROC +* DSP & FX support for decoding channels + BASS_ChannelSetDSP + BASS_ChannelSetFX +* Support for DX8 (DMO) effects in IT/XM/MO3 files + BASS_MusicLoad +* Support for chained OGG streaming (and syncing) + BASS_StreamCreateURL + BASS_SYNC_META (BASS_ChannelSetSync type) +* Attribute (volume/frequency/pan) sliding + BASS_ChannelSlideAttributes + BASS_ChannelIsSliding + BASS_SYNC_SLIDE (BASS_ChannelSetSync type) +* Recording without a callback function + BASS_RecordStart + LIVEFX example added +* Query a channel's buffered data + BASS_DATA_AVAILABLE (BASS_ChannelGetData flag) +* Discard data from the recording buffer + BASS_ChannelGetData +* Adjustable internet stream config (timeout/buffer lengths) + BASS_SetNetConfig +* Recommended minimum buffer length + BASS_INFO (minbuf member) +* MOD music flags adjustment without changing playback position + BASS_MusicPlayEx + PLAYER (MASM) example updated +* More functions are now useable in MOD music "mixtime" syncs + SYNCPROC + BASS_ChannelSetPosition + BASS_MusicPlayEx + BASS_MusicSetAmplify + BASS_MusicSetPanSep +* Maximum buffer length increased to 5 seconds + BASS_SetBufferLength +* Support for extended filter range in IT files + BASS_MusicLoad +* Speedier MOD music file verification + BASS_MusicLoad +* Delphi 3DTEST example fixed +* Magically reduced DLL size again :) + +1.6a - 25/8/2002 +---------------- +* OGG support updated to 1.0 +* Stereo FFT + BASS_DATA_FFT512S/1024S/2048S (BASS_ChannelGetData flags) +* Support for "Invert Loop" (EFx) MOD effect +* Reduced DLL size +* New Delphi examples + WRITEWAV - WAVE writer example + SAMPLEVIS - Visualisation example + +1.6 - 13/6/2002 +--------------- +* 64-bit stream lengths and positions + BASS_StreamGetLength + BASS_ChannelBytes2Seconds + BASS_ChannelSeconds2Bytes + BASS_ChannelGetPosition + BASS_ChannelSetPosition + BASS_ChannelSetSync +* Recording input selection + BASS_RECORDINFO (inputs & singlein members) + BASS_RecordGetInputName + BASS_RecordGetInput + BASS_RecordSetInput +* Adjustable recording update period + BASS_RecordStart +* Load OGG files as samples + BASS_SampleLoad +* CD drive door opening & closing + BASS_CDDoor +* CDDB2 ID retrieval + BASS_CDID_CDDB2 (BASS_CDGetID flag) +* Streaming beyond initial file length + BASS_StreamCreateFile +* Recording position bytes<->seconds translation + BASS_ChannelBytes2Seconds + BASS_ChannelSeconds2Bytes +* Improved multi-threaded support (play from any thread) + BASS_MusicPlay/Ex + BASS_SamplePlay/3D/Ex + BASS_StreamPlay + BASS_DEVICE_NOSYNC flag *removed* +* Paused channel status + BASS_ACTIVE_PAUSED (BASS_ChannelIsActive) +* Integrated WMA stream freeing + BASS_StreamFree + BASS_Free +* Pin-point accurate OGG seeking without BASS_MP3_SETPOS flag +* Win2k DS buffer bug fix + +1.5a - 14/4/2002 +---------------- +* NT4 fix (also enables "nosound" device without DX installed) + BASS_ERROR_DX error code +* MOD music loading without the samples + BASS_MUSIC_NOSAMPLE (BASS_MusicLoad flag) +* Custom decoding channels + BASS_STREAM_DECODE (BASS_StreamCreate flag) +* 5 second HTTP connection timeout + BASS_ERROR_TIMEOUT (BASS_StreamCreateURL error code) + +1.5 - 31/3/2002 +--------------- +* Improved performance + MMX mixers lot faster (over 50% faster in some cases!) + OGG decoding 15-20% faster + MP3 decoding 5-10% faster +* Recording + BASS_RecordGetDeviceDescription + BASS_RecordInit + BASS_RecordFree + BASS_RecordGetInfo + BASS_RecordStart +* OGG support built-in (OGG/VORBIS DLLs not required) + BASS_DEVICE_OGG flag *removed* +* MOD music seeking in seconds + BASS_MusicPlayEx + BASS_ChannelSetPosition +* Shoutcast metadata retrieval + BASS_STREAM_META (BASS_StreamCreateURL flag) + BASS_TAG_META (BASS_StreamGetTags type) + BASS_SYNC_META (BASS_ChannelSetSync type) +* 1000 volume levels + BASS_DEVICE_VOL1000 (BASS_Init/CDInit flag) +* CDDB ID retrieval + BASS_CDID_CDDB (BASS_CDGetID flag) +* Leave the CD volume as it is during init/closing + BASS_DEVICE_LEAVEVOL (BASS_CDInit flag) +* FFT enabled on decoding channels + BASS_ChannelGetData +* Left level duplicated on right for mono channels + BASS_ChannelGetLevel +* Improved MPEG length estimation without BASS_MP3_SETPOS flag + BASS_StreamGetLength +* Support for Modplug/ADPCM compressed files + BASS_MusicLoad +* Device description function parameter change + BASS_GetDeviceDescription +* MASM API + +1.4 - 30/1/2002 +--------------- +* Channel decoding without playback + BASS_MUSIC_DECODE (BASS_MusicLoad flag) + BASS_STREAM_DECODE (BASS_StreamCreateFile/URL flag) + BASS_ChannelGetData +* Windows message sync callbacks + BASS_SYNC_MESSAGE (BASS_ChannelSetSync flag) +* Adjustable channel volumes in MOD musics + BASS_MusicSetChannelVol + BASS_MusicGetChannelVol +* Customizable DirectSound initialization object + BASS_SetCLSID +* Retrieve HMUSIC/HSTREAM/HCHANNEL IDirectSoundBuffer interfaces + BASS_GetDSoundObject +* A3D functions removed (use BASS_SetCLSID/BASS_GetDSoundObject to access A3D) + BASS_DEVICE_A3D (BASS_Init flag) + BASS_SetA3DResManager + BASS_GetA3DResManager + BASS_SetA3DHFAbsorbtion + BASS_GetA3DHFAbsorbtion +* Callback functions now work in VB6 + DSPPROC + STREAMPROC + SYNCPROC +* Improved PCM WAVE streaming performance + BASS_StreamCreateFile + BASS_StreamCreateURL +* OGG modules updated to RC3 +* Stereo sample support in MO3 format +* MO3 encoder now distributed separately from BASS + +1.3 - 17/11/2001 +---------------- +* Manual buffer updating + BASS_DEVICE_NOTHREAD (BASS_Init flag) + BASS_Update +* Adjustable buffer update period (allows small buffer sizes) + BASS_Init +* Output device latency retrieval + BASS_INFO (latency member) +* MPEG/OGG seeking without BASS_MP3_SETPOS flag + BASS_ChannelSetPosition +* Internet file streaming from offsets + BASS_StreamCreateURL +* File stream tag/comment retrieval (ID3/ID3v2/OGG/HTTP/ICY tags) + BASS_StreamGetTags +* Byte<->time position translation + BASS_ChannelBytes2Seconds + BASS_ChannelSeconds2Bytes +* UMX (Unreal/Tournament music package) format support + BASS_MusicLoad +* S3M/IT sync fx changed to S2x (S0x conflicted with S00) + BASS_SYNC_MUSICFX +* Stereo sample support in IT/XM/S3M formats +* MO3: OGG compression supported + +1.2 - 25/9/2001 +--------------- +* OGG (Ogg Vorbis) stream support + BASS_DEVICE_OGG (BASS_Init flag) + BASS_StreamCreateFile + BASS_StreamCreateURL +* Channel linking (start/stop/pause/resume channels together) + BASS_ChannelSetLink + BASS_ChannelRemoveLink +* MOD music playback length calculation + BASS_MUSIC_CALCLEN (BASS_MusicLoad flag) + BASS_MusicGetLength +* Pre-buffering + BASS_MusicPreBuf + BASS_StreamPreBuf +* Samples with single simultaneous playbacks have same HSAMPLE/HCHANNEL handle + BASS_SamplePlay/Ex +* Stopping a custom stream flushes its buffer contents + BASS_ChannelStop + +1.1a - 31/8/2001 +---------------- +* NT4 bug fixed +* XM Wxx effect syncing + BASS_SYNC_MUSICFX +* MP3/2/1 rewinding without BASS_MP3_SETPOS + BASS_ChannelSetPosition + +1.1 - 11/8/2001 +--------------- +* DX8 (DMO) effects + BASS_SAMPLE_FX (BASS_StreamCreate/File/URL flag) + BASS_MUSIC_FX (BASS_MusicLoad flag) + BASS_ChannelSetFX + BASS_ChannelRemoveFX + BASS_FXSetParameters + BASS_FXGetParameters + BASS_FXCHORUS structure + BASS_FXCOMPRESSOR structure + BASS_FXDISTORTION structure + BASS_FXECHO structure + BASS_FXFLANGER structure + BASS_FXGARGLE structure + BASS_FXI3DL2REVERB structure + BASS_FXPARAMEQ structure + BASS_FXREVERB structure +* Internet file streaming in blocks (inc. Shoutcast/Icecast stream support) + BASS_STREAM_BLOCK (BASS_StreamCreateURL flag) +* 512/1024/2048 sample FFT + BASS_DATA_FFT512/1024/2048 (BASS_ChannelGetData flags) +* CD identification + BASS_CDGetID +* Improved DX version detection + BASS_INFO (dsver member) + +1.0 - 20/6/2001 +--------------- +* Load MP3/MP2/MP1 files as samples + BASS_SampleLoad +* Internet file streaming from FTP servers + BASS_StreamCreateURL +* Save a local copy of internet file streams + BASS_StreamCreateURL +* Sample accurate file stream seeking + BASS_ChannelSetPosition + BASS_StreamGetBlockLength *removed* +* Stream position synchronizer + BASS_SYNC_POS +* Increased synchronizer precision +* Improved MPEG file detection and error detection +* Stop MOD musics on a backwards jump effect + BASS_MUSIC_STOPBACK (BASS_MusicLoad/PlayEx flag) +* Leave the volume as it is during closing (as well as initialization) + BASS_DEVICE_LEAVEVOL (BASS_Init flag) +* Optional automatic use of foreground window handle during initialization + BASS_Init +* Reduced DLL size +* VB API fixes + +0.9 - 18/4/2001 +--------------- +* Internet file streaming + BASS_StreamCreateURL +* MP1 & MP2 (MPEG layer 1 & 2) support + BASS_StreamCreateFile/URL +* MPEG 2.5 support (12000/11025/8000hz sample rates) + BASS_StreamCreateFile/URL +* Decoding/download/end file stream position retrieval + BASS_StreamGetFilePosition +* XMPlay surround sound for MOD musics + BASS_MUSIC_SURROUND (BASS_MusicLoad/PlayEx flag) + BASS_MUSIC_SURROUND2 (BASS_MusicLoad/PlayEx flag) +* Restrict the download rate of internet file streams + BASS_STREAM_RESTRATE (BASS_StreamCreateURL flag) +* Check if an internet file stream is stalled + BASS_ChannelIsActive +* Automatically free a stream when it stops or ends + BASS_STREAM_AUTOFREE (BASS_StreamCreate/File/URL flag) +* Leave the volume as it is during initialization + BASS_DEVICE_LEAVEVOL (BASS_Init flag) +* Number of CD tracks retrieval + BASS_CDGetTracks +* CD track length retrieval + BASS_CDGetTrackLength +* Exact stream length set after whole file is streamed + BASS_StreamGetLength +* TMT Pascal API and samples +* Dynamic-loading Delphi API + +0.8a - 28/2/2000 +---------------- +* Updated Delphi API and samples + +0.8 - 24/1/2000 +--------------- +* Improved MP3 performance on P2/K6 and above CPUs +* User DSP functions on streams and MOD musics + BASS_ChannelSetDSP + BASS_ChannelRemoveDSP +* DX7 voice allocation & management + BASS_SAMPLE_VAM (BASS_SampleLoad/Create flag) + BASS_VAM_xxx flags + BASS_SAMPLE (vam & priority members) +* DX7 software 3D algorithm selection + BASS_Set3DAlgorithm +* DirectSound interface retrieval + BASS_GetDSoundObject +* Log/linear volume & panning curves + BASS_SetLogCurves +* User data passed to callback functions + STREAMPROC - BASS_StreamCreate + SYNCPROC - BASS_ChannelSetSync +* New synchronizer + BASS_SYNC_MUSICFX +* New synchronizer flag + BASS_SYNC_MIXTIME +* Disable synchronizers option - saves a little CPU time + BASS_DEVICE_NOSYNC (BASS_Init flag) +* Hi-res floating-point CPU usage monitoring + BASS_GetCPU +* Wait for playback to start when playing a CD + BASS_CDPlay +* DirectSound (dsound.dll) version retrieval + BASS_INFO (dsver member) +* Removed volume sliding functions (they were fairly pointless) + BASS_SlideVolume + BASS_IsSliding +* MO3: read/write encoder settings +* MO3: remove inst/samp/message texts now optional +* MO3: LAME encoder settings + +0.7 - 3/10/1999 +--------------- +* MO3 (MP3 compressed MODs) +* A3D functions + BASS_DEVICE_A3D (BASS_Init flag) + BASS_INFO (a3d member) + BASS_SetA3DResManager + BASS_GetA3DResManager + BASS_SetA3DHFAbsorbtion + BASS_GetA3DHFAbsorbtion +* Music/stream immediate sample data retrieval + BASS_ChannelGetData +* File stream (WAV/MP3) length retrieval + BASS_StreamGetLength + BASS_StreamGetBlockLength +* File stream seeking + BASS_ChannelSetPosition +* Mono MP3 option (lower CPU usage) + BASS_StreamCreateFile +* Music length retrieval + BASS_MusicGetLength +* Music name retrieval + BASS_MusicGetName +* Stop notes when moving MOD music position + BASS_MUSIC_POSRESET (BASS_MusicLoad/BASS_MusicPlayEx flag) +* BASS_ERROR_FREQ - invalid sample rate error code + BASS_SampleCreate + BASS_SamplePlayEx + BASS_SamplePlay3DEx + BASS_StreamCreate + BASS_ChannelSetAttributes +* Delphi and VB APIs + +0.6a - 26/7/1999 +---------------- +* Half rate MP3 option (lower CPU usage) + BASS_MP3_HALFRATE +* Loading/streaming from file offsets + BASS_MusicLoad + BASS_SampleLoad + BASS_StreamCreateFile +* Global music/sample/stream volume levels + BASS_SetGlobalVolumes + BASS_GetGlobalVolumes +* Other new function + BASS_SampleStop +* New synchronizer + BASS_SYNC_END +* New sample overrider + BASS_SAMPLE_OVER_DIST +* LoadLibrary/GetProcAddress instructions and example + +0.5 - 4/7/1999 +-------------- +* Documentation! +* File streaming (MP3 and WAV) + BASS_StreamCreateFile +* Custom generated samples + BASS_SampleCreate + BASS_SampleCreateDone +* Other new function + BASS_MusicSetPositionScaler +* Renamed function + BASS_ChannelClearSync -> BASS_ChannelRemoveSync +* Alterations made to + BASS_ChannelGetPosition + BASS_SampleLoad + BASS_StreamPlay + +0.4 - 30/3/1999 +--------------- +* Compressed WAV samples support (using audio CODECs) +* Updated CD volume handling - now works with SB Live +* More linear channel volume/pan scales (were slightly off before) +* "No sound" device option +* 3D sound functions + BASS_Set3DFactors + BASS_Get3DFactors + BASS_Set3DPosition + BASS_Get3DPosition + BASS_Apply3D + BASS_SamplePlay3D + BASS_SamplePlay3DEx + BASS_ChannelSet3DAttributes + BASS_ChannelGet3DAttributes + BASS_ChannelSet3DPosition + BASS_ChannelGet3DPosition +* EAX functions + BASS_SetEAXParameters + BASS_GetEAXParameters + BASS_ChannelSetEAXMix + BASS_ChannelGetEAXMix +* Other new functions + BASS_GetDeviceDescription + BASS_SetBufferLen + BASS_ChannelGetFlags + BASS_ChannelPause + BASS_ChannelResume + BASS_ChannelSetPosition +* Replaced function + BASS_CDResume -> BASS_ChannelResume +* Alterations made to + BASS_Init + BASS_CDInit + BASS_SampleLoad + BASS_StreamPlay + BASS_INFO structure + BASS_SAMPLE structure + BASS_DEVICE_xxx flags + BASS_SAMPLE_xxx flags + +0.3 - 8/3/1999 +-------------- +* Synchronization functions + BASS_ChannelSetSync + BASS_ChannelClearSync +* Other new functions + BASS_GetVersion + BASS_ChannelGetPosition + BASS_ChannelGetLevel + BASS_ChannelGetAttributes + BASS_ChannelSetAttributes +* Replaced functions + BASS_MusicStop -> BASS_ChannelStop + BASS_MusicSetVolume -> BASS_ChannelSetAttributes + BASS_CDStop -> BASS_ChannelStop + BASS_CDSetVolume -> BASS_ChannelSetAttributes + BASS_CDGetVolume -> BASS_ChannelGetAttributes + BASS_ChannelUpdate -> BASS_ChannelSetAttributes +* Alterations made to + BASS_MusicPlayEx + BASS_StreamPlay + BASS_INFO structure + +0.2 - 28/2/1999 +--------------- +* First public release + + +Bug reports, Suggestions, Comments, Enquiries, etc +================================================== +If you have any of the aforementioned please visit the BASS forum at the +website. If you can't find an answer there, you can also email: + + bass@un4seen.com + diff --git a/bass/bassmidi.dll b/bass/bassmidi.dll new file mode 100644 index 0000000000000000000000000000000000000000..6890577ffe63886c5c1b755fb7cac057636ca403 GIT binary patch literal 73600 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 OUG7xPnPsw5Wd8y0;x#h> literal 0 HcmV?d00001 diff --git a/bass/bassmidi.txt b/bass/bassmidi.txt new file mode 100644 index 0000000..ae9909c --- /dev/null +++ b/bass/bassmidi.txt @@ -0,0 +1,734 @@ +BASSMIDI 2.4 +Copyright (c) 2006-2024 Un4seen Developments Ltd. All rights reserved. + +Files that you should have found in the BASSMIDI package +======================================================== +Win32 version +------------- +BASSMIDI.TXT This file +BASSMIDI.DLL BASSMIDI module +BASSMIDI.CHM BASSMIDI documentation +X64\ + BASSMIDI.DLL 64-bit BASSMIDI module +C\ C/C++ API and examples... + BASSMIDI.H BASSMIDI C/C++ header file + BASSMIDI.LIB BASSMIDI import library + BASSMIDI.SLN Visual Studio solution for examples + MAKEFILE Makefile for examples + MAKEFILE.IN Makefile helper macros + X64\ + BASSMIDI.LIB 64-bit BASSMIDI import library + MIDITEST\ MIDI playback example + ... + SF2PACK\ Soundfont packer + ... + SYNTH\ Real-time MIDI example + ... + BIN\ Precompiled examples + MIDITEST.EXE + SF2PACK.EXE + SYNTH.EXE +VB\ Visual Basic API and examples... + BASSMIDI.BAS BASSMIDI Visual Basic module + MIDITEST\ MIDI playback example + ... +DELPHI\ Delphi API and examples... + BASSMIDI.PAS BASSMIDI Delphi unit + MIDITEST\ MIDI playback example + ... + SYNTH\ Real-time MIDI example + ... + +NOTE: You may need to "Unblock" the BASSMIDI.CHM file in its "Properties" to + view it on Windows 7. The documentation can also be viewed online at + the BASS website. + +NOTE: To run the example EXEs, first you will have to copy BASSMIDI.DLL and + BASS.DLL into the same directory as them. + +NOTE: To build the examples, you will need to copy the BASS API into the same + directory as the BASSMIDI API. + +NOTE: The Delphi and VB examples may not always be up to date with the C + examples, so the latter should be preferred as references if possible. + +macOS version +------------- +BASSMIDI.TXT This file +LIBBASSMIDI.DYLIB BASSMIDI module +BASSMIDI.CHM BASSMIDI documentation +BASSMIDI.H BASSMIDI C/C++ header file +BASSMIDI.XCODEPROJ Xcode project for examples +MIDITEST\ MIDI playback example + ... +SF2PACK\ Soundfont packer + ... +SYNTH\ Real-time MIDI example + ... + +NOTE: To build the examples, you will need to copy the BASS API into the same + directory as the BASSMIDI API. + +Linux version +------------- +BASSMIDI.TXT This file +BASSMIDI.CHM BASSMIDI documentation +BASSMIDI.H BASSMIDI C/C++ header file +MAKEFILE Makefile for examples +MAKEFILE.IN Makefile helper macros +LIBS\ BASSMIDI modules + ... +MIDITEST\ MIDI playback example + ... +SF2PACK\ Soundfont packer + ... +SYNTH\ Real-time MIDI example + ... + +NOTE: To build the examples, you will need to copy the BASS API into the same + directory as the BASSMIDI API. + +Android version +--------------- +BASSMIDI.TXT This file +BASSMIDI.CHM BASSMIDI documentation +LIBS\ BASSMIDI modules + ... +C\ C/C++ API... + BASSMIDI.H BASSMIDI C/C++ header file +JAVA\COM\UN4SEEN\BASS\ + BASSMIDI.JAVA BASSMIDI Java class +EXAMPLES\ Java examples + BUILD.GRADLE Android Studio build script for examples + SETTINGS.GRADLE + PROGUARD-BASS.PRO + MIDITEST\ MIDI playback example + ... + +NOTE: To build the examples, you will need to copy the BASS API into the same + directory as the BASSMIDI API. + +iOS version +----------- +BASSMIDI.TXT This file +BASSMIDI.XCFRAMEWORK BASSMIDI framework +BASSMIDI.CHM BASSMIDI documentation +BASSMIDI.H BASSMIDI C/C++ header file + + +What's the point? +================= +BASSMIDI is an extension to the BASS audio library, enabling the playing of +MIDI files and custom event sequences, using SF2 (including SF2PACK and SF3) +and/or SFZ soundfonts to provide the sounds. MIDI input is also supported. + + +Requirements +============ +BASS 2.4 is required. + + +Using BASSMIDI +============== +The MIDI format is used in very much the same way as any of the built-in BASS +stream formats; simply call the MIDI stream creation function instead of the +BASS built-in functions. The BASS plugin system (see BASS_PluginLoad) is also +supported. + +SF2 and SFZ soundfonts are used to provide the sounds. There are several +soundfonts available on the internet, including a couple on the BASS webpage. +On Windows, the Creative 28MB (28MBGM.SF2), 8MB (CT8MGM.SF2), 4MB (CT4MGM.SF2), +or 2MB (CT2MGM.SF2) soundfont will be used by default when present in the +Windows system directory. + +The usage information in the BASS.TXT file (from the BASS package) is also +applicable to BASSMIDI and other add-ons. + +TIP: The BASSMIDI.CHM file should be put in the same directory as the BASS.CHM + file, so that the BASSMIDI documentation can be accessed from within the + BASS documentation. + +iOS version +----------- +The CoreMIDI framework is required for MIDI input, so that should be added to +the "Link Binary With Libraries" build phase in Xcode. + + +Latest Version +============== +The latest versions of BASSMIDI & BASS can be found at the BASS website: + + www.un4seen.com + + +Licence +======= +BASSMIDI is free to use with BASS. + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, BASSMIDI IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND/OR FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS SHALL NOT BE HELD +LIABLE FOR ANY DAMAGE THAT MAY RESULT FROM THE USE OF BASSMIDI. YOU USE +BASSMIDI ENTIRELY AT YOUR OWN RISK. + +Usage of BASSMIDI indicates that you agree to the above conditions. + +All trademarks and other registered names contained in the BASSMIDI +package are the property of their respective owners. + + +History +======= +These are the major (and not so major) changes in each release, along with the +functions/options that are introduced/affected by them. There are other little +tweaks and fixes made along the way too. + +2.4.15 - 9/10/2024 +------------------ +* Support for Key On Velocity to attackModEnv/decayModEnv/releaseModEnv and + Key Number to startAddrsOffset SF2 modulators + BASS_MIDI_FontInit/User +* Support for fileg_vel2attack/fileg_vel2decay/fileg_vel2release/pitcheg_vel2attack/ + pitcheg_vel2decay/pitcheg_vel2release SFZ opcodes + BASS_MIDI_FontInit/User +* Improved SFZ variable parsing compatibility (uses the shortest match) + BASS_MIDI_FontInit/User +* Support for high-pass filter in fil_type SFZ opcode + BASS_MIDI_FontInit/User +* SoundBlaster hardware limit emulation is disabled by default for modern SF2 soundfonts + BASS_MIDI_FONT_SBLIMITS/NOSBLIMITS (BASS_MIDI_FontInit/User flags) +* Extended filter cutoff range when SB limits are disabled + BASS_MIDI_FONT_NOSBLIMITS (BASS_MIDI_FontInit/User flag) +* Improved single note releasing when there are overlapping instances of the same note + BASS_MIDI_NOTEOFF1 (BASS_MIDI_StreamCreateFile/User/URL flag) +* Ports above 7 are mapped to lower ports (modulo 8) + BASS_MIDI_StreamCreateFile +* Higher ports are shifted to lower channels when lower ports are unused + BASS_MIDI_StreamCreateFile +* Default per-drum USERFX levels to 127 instead of 0 in all modes + BASS_MIDI_NODRUMPARAMUSER (BASS_MIDI_StreamCreate/Events/File/User/URL flag) +* Per-drum key settings may be applied to all keys at once + MIDI_EVENT_DRUM_xxx (BASS_MIDI_StreamEvent/s) +* System mode/reset events are ignored from additional ports + BASS_MIDI_StreamCreateFile/User/URL + BASS_MIDI_StreamEvents +* Sequencer specific meta-event retrieval + BASS_MIDI_MARK_SEQSPEC (BASS_MIDI_StreamGetMark type) +* Queued event buffer preallocation + BASS_ATTRIB_MIDI_QUEUE_TICK/BYTE/ASYNC (BASS_ChannelSetAttribute options) +* Faster SFZ info retrieval + BASS_MIDI_FontGetInfo +* Support for SF2 soundfonts embedded in RMID files + BASS_MIDI_StreamCreateFile/User/URL +* RIFF/RMID "INFO" tag support + BASS_TAG_RIFF_INFO (BASS_ChannelGetTags type) +* MIDI filename retrieval + BASS_CHANNELINFO (filename member) +* Approximate support for AWE32 filter NRPN (7f15/7f16) + MIDI_EVENT_CUTOFF/RESONANCE +* Maximum voices is practically unlimited (~14 million) + BASS_CONFIG_MIDI_VOICES (BASS_SetConfig option) + BASS_ATTRIB_MIDI_VOICES (BASS_ChannelSetAttribute option) + +2.4.14 - 3/5/2022 +----------------- +* Support for Key On Velocity to startAddrsOffset/modEnvToFilterFc and CC21-24 to initialFilterFc/ + initialAttenuation/attackVolEnv/decayVolEnv/releaseVolEnv/releaseModEnv/modEnvToFilterFc SF2 modulators + BASS_MIDI_FontInit/User +* Support for all Key On Velocity to initialAttenuation SF2 modulator curve types + BASS_MIDI_FontInit/User +* Support for SF3 (compressed SF2) soundfonts + BASS_MIDI_FontInit/User +* Soundfont flag setting/retrieval + BASS_MIDI_FontFlags +* Retrieval of currently loading samples + BASS_CONFIG_MIDI_SAMPLELOADING (BASS_GetConfig option) +* Channel-specific soundfont configuration + BASS_MIDI_FONT_EX2 (BASS_MIDI_StreamSetFonts/GetFonts flag) + BASS_MIDI_FONTEX2 structure +* MIDI port meta-event support (for more than 16 channels) + BASS_MIDI_StreamCreateFile/User/URL + BASS_MIDI_StreamEvents + BASS_MIDI_ConvertEvents +* Asynchronous processing of live events + BASS_MIDI_ASYNC (BASS_MIDI_StreamCreate/Events/File/User/URL flag) + BASS_MIDI_EVENTS_ASYNC (BASS_MIDI_StreamEvents flag) + BASS_MIDI_EVENTS_FLUSH (BASS_MIDI_StreamEvents flag) + SYNTH example updated +* Filtering of live events + BASS_MIDI_EVENTS_FILTER (BASS_MIDI_StreamEvents flag) +* Improved reverb effect +* Reverb/chorus levels raised (closer to Roland/Yamaha levels) +* Current reverb/chorus type retrieval + MIDI_EVENT_REVERB_MACRO (BASS_MIDI_StreamGetEvent) + MIDI_EVENT_CHORUS_MACRO (BASS_MIDI_StreamGetEvent) +* Treat soundfont reverb/chorus levels as minimums + BASS_MIDI_FONT_MINFX (BASS_MIDI_FontInit/User/Flags flag) +* Default per-drum reverb/chorus levels now apply in all modes and can be disabled + BASS_MIDI_NODRUMPARAM (BASS_MIDI_StreamCreate/Events/File/User/URL flag) +* Default drum channel configuration + BASS_EVENT_DEFDRUMS (BASS_MIDI_StreamEvent/s and BASS_MIDI_StreamCreateEvents) +* Support for master tuning + MIDI_EVENT_MASTER_FINETUNE/COARSETUNE (BASS_MIDI_StreamEvent/s) +* Omni-on/off (CC124/125) are treated as all-notes-off (CC123) + BASS_MIDI_StreamCreateFile/User/URL + BASS_MIDI_StreamEvents + BASS_MIDI_ConvertEvents +* 16 point sinc interpolation support on ARM platforms with NEON + BASS_ATTRIB_MIDI_SRC (BASS_ChannelSetAttribute option) +* Version number retrieval + BASS_MIDI_GetVersion +* BASS_CONFIG_MIDI_SFZHEAD value changed (was same as BASS_CONFIG_MIDI_SAMPLEREAD) + BASS_CONFIG_MIDI_SFZHEAD (BASS_SetConfigPtr option) +* MIDI implementation chart added to documentation + +2.4.13 - 16/9/2020 +------------------ +* Vibrato rate/depth/delay adjustment + MIDI_EVENT_VIBRATO_RATE/DEPTH/DELAY (BASS_MIDI_StreamEvent/s) +* Support for Key Number to initialAttenuation/initialFilterFc/pan and Key On Velocity + to decayVolEnv/releaseVolEnv SF2 modulators + BASS_MIDI_FontInit/User +* Support for amp_keycenter/amp_keytrack/ampeg_vel2release/delay_beats/fil_keycenter/ + fil_keytrack/locc67/hicc67/pan_keycenter/pan_keytrack/sw_default/sw_last/sw_lokey/ + sw_lolast/sw_hikey/sw_hilast SFZ opcodes + BASS_MIDI_FontInit/User +* Support for global and master headers and #define directive in SFZ files + BASS_MIDI_FontInit/User +* SFZ files share memory for common sample files + BASS_MIDI_FontInit/User +* Partial sample loading and unloading + BASS_MIDI_FontLoadEx + SYNTH example updated +* Non-interpolated resampling option + BASS_ATTRIB_MIDI_SRC (BASS_ChannelSetAttribute option) +* Tempo modification attribute + BASS_ATTRIB_MIDI_SPEED (BASS_ChannelSetAttribute option) + MIDITEST example updated +* Mix level control + BASS_ATTRIB_MIDI_VOL (BASS_ChannelSetAttribute option) +* Reverb level modification + BASS_ATTRIB_MIDI_REVERB (BASS_ChannelSetAttribute option) +* Global SFZ headers + BASS_CONFIG_MIDI_SFZHEAD (BASS_SetConfigPtr option) +* Linear volume envelopes option + BASS_MIDI_FONT_LINDECVOL (BASS_MIDI_FontInit/User flag) +* Disabling of sample ramping-in + BASS_MIDI_FONT_NORAMPIN (BASS_MIDI_FontInit/User flag) +* Disabling of Creative/SoundBlaster hardware limit emulation + BASS_MIDI_FONT_NOLIMITS (BASS_MIDI_FontInit flag) +* Duplicate soundfonts will be reloaded instead of shared if modified in the meantime + BASS_MIDI_FontInit +* Memory-mapped support for default soundfont option + BASS_CONFIG_MIDI_DEFFONT +* Retrieval of total memory usage for sample data + BASS_CONFIG_MIDI_SAMPLEMEM (BASS_GetConfig option) +* Total sample data size available for SFZ files + BASS_MIDI_FontGetInfo +* Adjustable asynchronous sample loading chunks + BASS_CONFIG_MIDI_SAMPLEREAD (BASS_SetConfig option) +* CPU usage limiting is enabled by default during playback + BASS_MIDI_StreamCreate/Events/File/User/URL + BASS_ATTRIB_MIDI_CPU (BASS_ChannelSetAttribute option) +* Option to limit sample loading waiting without killing voices + BASS_ATTRIB_MIDI_CPU (BASS_ChannelSetAttribute option) +* Tick-based timing for realtime event streams + BASS_MIDI_StreamCreate + BASS_MIDI_StreamEvents + BASS_ATTRIB_MIDI_PPQN (BASS_ChannelSetAttribute option) +* 48000 Hz soundfont data encoding option + BASS_MIDI_PACK_48KHZ (BASS_MIDI_FontPack flag) +* macOS examples rewritten in Objective-C/Cocoa + +2.4.12 - 9/11/2018 +------------------ +* Support for more than 16 MIDI channels in custom event sequences + BASS_MIDI_StreamCreateEvents +* Absolute timing option for custom events + BASS_MIDI_EVENTS_ABSTIME (BASS_MIDI_StreamEvents flag) +* Retrieval of note-on events + MIDI_EVENT_NOTES (BASS_MIDI_StreamGetEvents/Ex filter) +* Soundfont config can be modified without stopping currently playing notes + BASS_MIDI_StreamSetFonts +* Memory-mapped soundfonts can be preloaded/mapped + BASS_MIDI_FontLoad +* Support for Key On Velocity to initialAttenuation SF2 modulators + BASS_MIDI_FontInit/User +* Linear attack phase option for SF2 modulation envelopes + BASS_MIDI_FONT_LINATTMOD (BASS_MIDI_FontInit/User flag) +* The attack phase of SFZ pitch/filter envelopes is now linear instead of convex +* Support for trigger/rt_decay/delay/amplfo_fade/fillfo_fade/pitchlfo_fade/pitch_random/ + xfin_lokey/xfin_hikey/xfout_lokey/xfout_hikey/xf_keycurve/xfin_lovel/xfin_hivel/ + xfout_lovel/xfout_hivel/xf_velcurve SFZ opcodes + BASS_MIDI_FontInit/User +* Support for separate amplifier/filter/pitch LFOs in SFZ + BASS_MIDI_FontInit/User +* Support for UTF-8 sample SFZ opcodes on Windows (already on other platforms) + BASS_MIDI_FontInit/User +* Support for #include directive in SFZ files + BASS_MIDI_FontInit +* SFZ files are no longer kept open/locked after being loaded + BASS_MIDI_FontInit +* Samples given more time to load asynchronously when CPU usage is low + BASS_ATTRIB_MIDI_CPU (BASS_ChannelSetAttribute option) +* BASS_MIDI_SINCINTER flag deprecated in favour of BASS_ATTRIB_MIDI_SRC attribute + BASS_MIDI_StreamCreate/Events/File/User/URL +* Smoother low-pass filter activation and deactivation +* Fix for transpose/tune SFZ opcodes with encoded samples + +2.4.11 - 30/3/2017 +------------------ +* Event modification/filtering + BASS_MIDI_StreamSetFilter + MIDIFILTERPROC +* Simpler tempo modification + MIDI_EVENT_SPEED (BASS_MIDI_StreamEvent) + MIDITEST example updated +* Checking whether individual notes are playing + MIDI_EVENT_NOTE (BASS_MIDI_StreamGetEvent) +* Retrieval of total number of notes playing in a channel + MIDI_EVENT_NOTES (BASS_MIDI_StreamGetEvent) +* Retrieval of currently active voices in a channel + MIDI_EVENT_VOICES (BASS_MIDI_StreamGetEvent) +* Retrieval of currently in use presets + BASS_MIDI_StreamGetPreset +* SFZ filenames are used as preset names + BASS_MIDI_FontGetPreset +* Support for loop info in FLAC samples used with SFZ (requires BASSFLAC 2.4.3) +* Faster loading of very large MIDI files + BASS_MIDI_StreamCreateFile/User/URL +* Faster unfiltered event counting + BASS_MIDI_StreamGetEvents/Ex + BASS_MIDI_ConvertEvents +* 24-bit paramater passed to MIDI_EVENT_TEMPO event sync callbacks + BASS_SYNC_MIDI_EVENT (BASS_ChannelSetSync type) +* When getting the number of events, only those in the specified range are counted + BASS_MIDI_StreamGetEventsEx +* Invalid event types in custom sequences will give an error instead of being ignored + BASS_MIDI_StreamCreateEvents + +2.4.10 - 8/12/2016 +------------------ +* 16 point sinc interpolation option + BASS_ATTRIB_MIDI_SRC (BASS_ChannelSetAttribute option) +* Support for lorand/hirand/locc1/hicc1/locc64/hicc64/off_mode/default_path SFZ opcodes + BASS_MIDI_FontInit/User +* Support for Key On Velocity to initialFilterFc/attackVolEnv SF2 modulators + BASS_MIDI_FontInit/User +* Conversion of raw MIDI data to BASS_MIDI_EVENT + BASS_MIDI_ConvertEvents +* Modulation (CC1) destination control + MIDI_EVENT_MOD_VIBRATO/PITCH/FILTER/VOLUME (BASS_MIDI_StreamEvent/s) + MIDI_EVENT_MODRANGE superseded by MIDI_EVENT_MOD_VIBRATO +* Sostenuto + MIDI_EVENT_SOSTENUTO (BASS_MIDI_StreamEvent/s) +* Legato channel mode + MIDI_EVENT_MODE (BASS_MIDI_StreamEvent) +* Partial retrieval of events + BASS_MIDI_StreamGetEventsEx +* Bulk MIDI state retrieval/setting + BASS_ATTRIB_MIDI_STATE (BASS_ChannelGet/SetAttributeEx option) +* Support for delaying custom events, including delta-time info in raw MIDI data + BASS_MIDI_EVENTS_TIME (BASS_MIDI_StreamEvents flag) +* Cancellation of pending custom events + BASS_MIDI_EVENTS_CANCEL (BASS_MIDI_StreamEvents flag) +* Marker for the start of each track in SMF2 files + BASS_MIDI_MARK_TRACKSTART (BASS_MIDI_StreamGetMark type) +* Ignoring of soundfont effect levels + BASS_MIDI_FONT_NOFX (BASS_MIDI_FontInit/Ex flag) +* Maximum voice limit increased to 100000 + BASS_CONFIG_MIDI_VOICES (BASS_SetConfig option) + BASS_ATTRIB_MIDI_VOICES (BASS_ChannelSetAttribute option) +* Unicode support for default soundfont option on Windows + BASS_CONFIG_MIDI_DEFFONT +* BASS_CONFIG_UNICODE option support for input device names + BASS_MIDI_InGetDeviceInfo +* Improved seeking with MIDI files that have events for a channel in multiple tracks + BASS_ChannelSetPosition +* Fix for 2GB size limit when unpacking a soundfont on Windows + BASS_MIDI_FontUnpack + +2.4.9 - 4/12/2014 +----------------- +* SFZ soundfont support + BASS_MIDI_FontInit/User +* Support for XG drums in bank 127 of SF2 soundfonts + BASS_MIDI_FONT_XGDRUMS (BASS_MIDI_FontInit/Ex flag) +* Key pressure/aftertouch support + MIDI_EVENT_KEYPRES (BASS_MIDI_StreamEvent/s) + MIDI_EVENT_KEYPRES_VIBRATO/PITCH/FILTER/VOLUME (BASS_MIDI_StreamEvent/s) +* 3rd effect path for custom processing + BASS_MIDI_CHAN_USERFX (BASS_MIDI_StreamGetChannel option) + MIDI_EVENT_USERFX (BASS_MIDI_StreamEvent/s) + MIDI_EVENT_USERFX_LEVEL (BASS_MIDI_StreamEvent/s) + MIDI_EVENT_USERFX_REVERB (BASS_MIDI_StreamEvent/s) + MIDI_EVENT_USERFX_CHORUS (BASS_MIDI_StreamEvent/s) +* Custom reverb/chorus effect processing + BASS_MIDI_CHAN_CHORUS/REVERB (BASS_MIDI_StreamGetChannel options) +* Custom channel processing output routed to reverb/chorus/custom effects + BASS_MIDI_StreamGetChannel +* Default drum reverb/chorus levels set to XG spec in XG mode (GS/GM modes too) + MIDI_EVENT_DRUM_REVERB/CHORUS (BASS_MIDI_StreamEvent/s) +* Decay time event + MIDI_EVENT_DECAY (BASS_MIDI_StreamEvent/s) +* Support for up to 65536 presets per bank + BASS_MIDI_StreamSetFonts + MIDI_EVENT_PROGRAM (BASS_MIDI_StreamEvent/s) +* Input ports to receive MIDI data from other software on Linux + BASS_MIDI_InInit + BASS_CONFIG_MIDI_IN_PORTS (BASS_SetConfig option) + SYNTH example updated +* Single note releasing when there are overlapping instances of the same note + BASS_MIDI_NOTEOFF1 (BASS_MIDI_StreamCreateFile/User/URL flag) +* Ignoring of system resets with unchanged mode + BASS_MIDI_NOSYSRESET (BASS_MIDI_StreamCreateFile/User/URL flag) + MIDI_EVENT_SYSTEM (BASS_MIDI_StreamEvent/s) +* Disabling of running status + BASS_MIDI_EVENTS_NORSTATUS (BASS_MIDI_StreamEvents flag) +* Maximum voice limit increased to 1000 + BASS_CONFIG_MIDI_VOICES (BASS_SetConfig option) + BASS_ATTRIB_MIDI_VOICES (BASS_ChannelSetAttribute option) +* Reduction of 24-bit data to 16-bit when packing soundfont samples + BASS_MIDI_PACK_16BIT (BASS_MIDI_FontPack flag) +* Support for remaining SF2 generators: fixed key, fixed velocity, key to vol/mod envelope hold/decay +* Fix for multi-track custom event sequence stream creation + BASS_MIDI_StreamCreateEvents + +2.4.8 - 2/5/2013 +---------------- +* User file soundfont loading + BASS_MIDI_FontInitUser +* Retrieval of all of a soundfont's preset numbers + BASS_MIDI_FontGetPresets +* More flexible soundfont preset mapping + BASS_MIDI_FONT_EX (BASS_MIDI_StreamSetFonts/GetFonts flag) + BASS_MIDI_FONTEX structure +* Bank LSB controller support + MIDI_EVENT_BANK_LSB (BASS_MIDI_StreamEvent/s) + BASS_MIDI_FONTEX structure +* Modulation depth range control + MIDI_EVENT_MODRANGE (BASS_MIDI_StreamEvent/s) +* Channel pressure destination control + MIDI_EVENT_CHANPRES_VIBRATO/PITCH/FILTER/VOLUME (BASS_MIDI_StreamEvent/s) +* Unhandled controller event + MIDI_EVENT_CONTROL (BASS_MIDI_StreamEvent/s) +* Reverb send level default changed to 40 (was 0) + MIDI_EVENT_REVERB (BASS_MIDI_StreamEvent/s) +* Retrieval of events from all tracks at once + BASS_MIDI_StreamGetEvents +* Copyright/instrument/track name markers + BASS_MIDI_MARK_COPY (BASS_MIDI_StreamGetMark type) + BASS_MIDI_MARK_INST (BASS_MIDI_StreamGetMark type) + BASS_MIDI_MARK_TRACK (BASS_MIDI_StreamGetMark type) +* Retrieval of all markers at once + BASS_MIDI_StreamGetMarks +* New sync type that supports all marker types + BASS_SYNC_MIDI_MARK (BASS_ChannelSetSync type) +* Non-removal of empty space at the end of a MIDI file + BASS_MIDI_NOCROP (BASS_MIDI_StreamCreateFile/User/URL flag) +* Omission of a WAVE header when packing soundfont samples + BASS_MIDI_PACK_NOHEAD (BASS_MIDI_FontPack flag) +* Streams created via the plugin system use the output device's sample rate + BASS_StreamCreateFile/etc +* Automatic BASS_UNICODE flag use in C++ and Delphi + BASS_MIDI_StreamCreateFile/URL + BASS_MIDI_FontInit/Pack/Unpack + +2.4.7 - 29/6/2012 +----------------- +* Custom event sequence streams + BASS_MIDI_StreamCreateEvents +* Sinc interpolated sample mixing + BASS_MIDI_SINCINTER (BASS_MIDI_StreamCreate/Events/File/User/URL flag) +* Asynchronous sample loading + BASS_ATTRIB_MIDI_CPU (BASS_ChannelSetAttribute option) +* Preset unloading + BASS_MIDI_FontUnload +* Note stopping without sustain/decay + BASS_EVENT_NOTE (BASS_MIDI_StreamEvent/s) +* Syncing on all event types + BASS_SYNC_MIDI_EVENT (BASS_ChannelSetSync type) +* Marker tick position retrieval + BASS_MIDI_MARK_TICK (BASS_MIDI_StreamGetMark flag) +* Maximum voice limit increased to 500 + BASS_CONFIG_MIDI_VOICES (BASS_SetConfig option) + BASS_ATTRIB_MIDI_VOICES (BASS_ChannelSetAttribute option) +* Default voice limit raised to 40 on Android/iOS + BASS_CONFIG_MIDI_VOICES (BASS_SetConfig option) +* Active voice count retrieval + BASS_ATTRIB_MIDI_VOICES_ACTIVE (BASS_ChannelGetAttribute option) +* Use of the device's current output rate + BASS_MIDI_StreamCreate/Events/File/User/URL +* Memory-mapped soundfont loading + BASS_MIDI_FONT_MMAP (BASS_MIDI_FontInit flag) +* Fix for applying multiple events in BASS_MIDI_EVENTS_STRUCT mode + BASS_MIDI_StreamEvents +* Marker sync compatibility (with mixer/splitter/tempo/reverse streams) fix + BASS_SYNC_MIDI_MARKER/CUE/LYRIC (BASS_ChannelSetSync types) +* MIDI sysex input compatibility fix for some drivers on Windows + MIDIINPROC + +2.4.6 - 30/3/2011 +----------------- +* MIDI input device support + BASS_MIDI_InGetDeviceInfo + BASS_MIDI_InInit + BASS_MIDI_InFree + BASS_MIDI_InStart + BASS_MIDI_InStop + MIDIINPROC + SYNTH example updated +* Multiple event processing including support for raw MIDI data + BASS_MIDI_StreamEvents +* CPU usage limiting + BASS_ATTRIB_MIDI_CPU (BASS_ChannelSetAttribute option) +* Scale/octave tuning + MIDI_EVENT_SCALETUNING (BASS_MIDI_StreamEvent/s) +* Soft pedal event + MIDI_EVENT_SOFT (BASS_MIDI_StreamEvent/s) +* Random panning + MIDI_EVENT_PAN (BASS_MIDI_StreamEvent/s) +* System reset event + MIDI_EVENT_SYSTEM/EX (BASS_MIDI_StreamEvent/s) +* Resetting of overridden drum key pan/reverb/chorus back to normal + MIDI_EVENT_DRUM_PAN/REVERB/CHORUS (BASS_MIDI_StreamEvent) +* Retrieval of drum key event values + BASS_MIDI_StreamGetEvent +* All events initialized to a MIDI file's 1st tick values + BASS_MIDI_StreamGetEvent +* Adjustable MIDI channel count + BASS_ATTRIB_MIDI_CHANS (BASS_ChannelSetAttribute option) +* Adjustable voice limit + BASS_ATTRIB_MIDI_VOICES (BASS_ChannelSetAttribute option) +* Preloaded presets are not automatically compacted + BASS_MIDI_FontLoad + BASS_CONFIG_MIDI_COMPACT (BASS_SetConfig option) +* Multiple instances of a soundfont + BASS_MIDI_FontInit +* Xcode examples project added for OSX + +2.4.5 - 8/2/2010 +---------------- +* Key signature retrieval + BASS_MIDI_MARK_KEYSIG (BASS_MIDI_StreamGetMark type) + BASS_SYNC_MIDI_KEYSIG (BASS_ChannelSetSync type) +* Tempo event initialized to MIDI file's 1st tick value + MIDI_EVENT_TEMPO (BASS_MIDI_StreamGetEvent) +* UTF-16 support on OSX + BASS_UNICODE (BASS_MIDI_StreamCreateFile/BASS_MIDI_FontInit/Pack/Unpack flag) + +2.4.4 - 24/8/2009 +----------------- +* Attack & release time events + MIDI_EVENT_ATTACK/RELEASE (BASS_MIDI_StreamEvent) +* Drum key level NRPN event + MIDI_EVENT_DRUM_LEVEL (BASS_MIDI_StreamEvent) +* MIDI file event retrieval + BASS_MIDI_StreamGetEvents +* Time signature retrieval + BASS_MIDI_MARK_TIMESIG (BASS_MIDI_StreamGetMark type) + BASS_SYNC_MIDI_TIMESIG (BASS_ChannelSetSync type) +* Default soundfont configuration + BASS_CONFIG_MIDI_DEFFONT (BASS_SetConfig option) + +2.4.3 - 19/3/2009 +----------------- +* Possibility of applying DSP/FX to individual MIDI channels + BASS_MIDI_StreamGetChannel +* Per-track volume control + BASS_ATTRIB_MIDI_TRACK_VOL (BASS_ChannelSetAttribute option) +* Support for all tracks in format 2 MIDI files + BASS_MIDI_StreamCreateFile/User/URL + +2.4.2 - 28/10/2008 +------------------ +* Decaying of old sound when seeking + BASS_MIDI_DECAYSEEK (BASS_MIDI_StreamCreateFile/User/URL flag) + MIDITEST example updated (C version) +* End decaying now also applies when looping + BASS_MIDI_DECAYEND (BASS_MIDI_StreamCreateFile/User/URL flag) +* Support for 28MBGM.SF2 and CT8MGM.SF2 as default soundfonts + +2.4.1 - 9/7/2008 +---------------- +* Ticks-per-beat retrieval + BASS_ATTRIB_MIDI_PPQN (BASS_ChannelGetAttribute option) + +2.4 - 2/4/2008 +-------------- +* Tick-based positioning + BASS_POS_MIDI_TICK (BASS_ChannelGetLength/GetPosition/SetPosition mode) + BASS_SYNC_MIDI_TICK (BASS_ChannelSetSync type) +* Preset name retrieval + BASS_MIDI_FontGetPreset +* Text markers + BASS_MIDI_MARK_TEXT (BASS_MIDI_StreamGetMark type) + BASS_SYNC_MIDI_TEXT (BASS_ChannelSetSync type) +* Individual marker retrieval + BASS_MIDI_StreamGetMark + BASS_MIDI_StreamGetMarks *removed* +* Marker index passed to marker sync callbacks + BASS_SYNC_MIDI_MARKER/CUE/LYRIC +* Use of BASS_Init sample rate + BASS_MIDI_StreamCreate/File/User/URL +* Support for updated user file stream system + BASS_MIDI_StreamCreateFileUser +* 64-bit file positioning + BASS_MIDI_StreamCreateFile +* Callback "user" parameters changed to pointers + BASS_MIDI_StreamCreateURL + BASS_MIDI_StreamCreateFileUser + +2.3.0.3 - 10/7/2007 +------------------- +* Syncing on events + BASS_SYNC_MIDI_EVENT (BASS_ChannelSetSync type) + +2.3.0.2 - 26/2/2007 +------------------- +* Reverb and chorus + MIDI_EVENT_REVERB/CHORUS (BASS_MIDI_StreamEvent) + MIDI_EVENT_REVERB_TIME/DELAY/LOCUTOFF/HICUTOFF/LEVEL (BASS_MIDI_StreamEvent) + MIDI_EVENT_CHORUS_DELAY/DEPTH/RATE/FEEDBACK/LEVEL/REVERB (BASS_MIDI_StreamEvent) + BASS_MIDI_NOFX (BASS_MIDI_StreamCreate/File/User/URL flag) +* Resonant low-pass filters + MIDI_EVENT_CUTOFF/RESONANCE (BASS_MIDI_StreamEvent) +* Portamento + MIDI_EVENT_PORTAMENTO/TIME/NOTE (BASS_MIDI_StreamEvent) +* Fine-tuning + MIDI_EVENT_FINETUNE/COARSETUNE (BASS_MIDI_StreamEvent) +* Drum key specific parameters + MIDI_EVENT_DRUM_FINETUNE/COARSETUNE/PAN/REVERB/CHORUS/CUTOFF/RESONANCE (BASS_MIDI_StreamEvent) +* Support for mono channel mode + MIDI_EVENT_MODE (BASS_MIDI_StreamEvent) +* Support for master volume + MIDI_EVENT_MASTERVOL (BASS_MIDI_StreamEvent) +* Channel level control + MIDI_EVENT_MIXLEVEL (BASS_MIDI_StreamEvent) +* Channel transposing + MIDI_EVENT_TRANSPOSE (BASS_MIDI_StreamEvent) +* Retrieval of current event values + BASS_MIDI_StreamGetEvent +* Soundfont volume control + BASS_MIDI_FontSetVolume/GetVolume +* Track number added to markers and syncs + BASS_MIDI_MARK (track member) + BASS_SYNC_MIDI_MARKER/CUE/LYRIC + +2.3.0.1 - 1/12/2006 +------------------- +* Optionally apply matching soundfonts to all banks + BASS_CONFIG_MIDI_AUTOFONT (BASS_SetConfig option) +* Support for 0 length notes + +2.3 - 14/11/2006 +---------------- +* First release + + +Bug reports, Suggestions, Comments, Enquiries, etc +================================================== +If you have any of the aforementioned please visit the BASS forum at the +website. + diff --git a/bass/inc/bass.h b/bass/inc/bass.h new file mode 100644 index 0000000..1e3a86f --- /dev/null +++ b/bass/inc/bass.h @@ -0,0 +1,1149 @@ +/* + BASS 2.4 C/C++ header file + Copyright (c) 1999-2022 Un4seen Developments Ltd. + + See the BASS.CHM file for more detailed documentation +*/ + +#ifndef BASS_H +#define BASS_H + +#ifdef _WIN32 +#ifdef WINAPI_FAMILY +#include +#endif +#include +typedef unsigned __int64 QWORD; +#else +#include +#define WINAPI +#define CALLBACK +typedef uint8_t BYTE; +typedef uint16_t WORD; +typedef uint32_t DWORD; +typedef uint64_t QWORD; +#ifdef __OBJC__ +typedef int BOOL32; +#define BOOL BOOL32 // override objc's BOOL +#else +typedef int BOOL; +#endif +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif +#define LOBYTE(a) (BYTE)(a) +#define HIBYTE(a) (BYTE)((a)>>8) +#define LOWORD(a) (WORD)(a) +#define HIWORD(a) (WORD)((a)>>16) +#define MAKEWORD(a,b) (WORD)(((a)&0xff)|((b)<<8)) +#define MAKELONG(a,b) (DWORD)(((a)&0xffff)|((b)<<16)) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define BASSVERSION 0x204 // API version +#define BASSVERSIONTEXT "2.4" + +#ifndef BASSDEF +#define BASSDEF(f) WINAPI f +#else +#define NOBASSOVERLOADS +#endif + +typedef DWORD HMUSIC; // MOD music handle +typedef DWORD HSAMPLE; // sample handle +typedef DWORD HCHANNEL; // sample playback handle +typedef DWORD HSTREAM; // sample stream handle +typedef DWORD HRECORD; // recording handle +typedef DWORD HSYNC; // synchronizer handle +typedef DWORD HDSP; // DSP handle +typedef DWORD HFX; // effect handle +typedef DWORD HPLUGIN; // plugin handle + +// Error codes returned by BASS_ErrorGetCode +#define BASS_OK 0 // all is OK +#define BASS_ERROR_MEM 1 // memory error +#define BASS_ERROR_FILEOPEN 2 // can't open the file +#define BASS_ERROR_DRIVER 3 // can't find a free/valid driver +#define BASS_ERROR_BUFLOST 4 // the sample buffer was lost +#define BASS_ERROR_HANDLE 5 // invalid handle +#define BASS_ERROR_FORMAT 6 // unsupported sample format +#define BASS_ERROR_POSITION 7 // invalid position +#define BASS_ERROR_INIT 8 // BASS_Init has not been successfully called +#define BASS_ERROR_START 9 // BASS_Start has not been successfully called +#define BASS_ERROR_SSL 10 // SSL/HTTPS support isn't available +#define BASS_ERROR_REINIT 11 // device needs to be reinitialized +#define BASS_ERROR_ALREADY 14 // already initialized/paused/whatever +#define BASS_ERROR_NOTAUDIO 17 // file does not contain audio +#define BASS_ERROR_NOCHAN 18 // can't get a free channel +#define BASS_ERROR_ILLTYPE 19 // an illegal type was specified +#define BASS_ERROR_ILLPARAM 20 // an illegal parameter was specified +#define BASS_ERROR_NO3D 21 // no 3D support +#define BASS_ERROR_NOEAX 22 // no EAX support +#define BASS_ERROR_DEVICE 23 // illegal device number +#define BASS_ERROR_NOPLAY 24 // not playing +#define BASS_ERROR_FREQ 25 // illegal sample rate +#define BASS_ERROR_NOTFILE 27 // the stream is not a file stream +#define BASS_ERROR_NOHW 29 // no hardware voices available +#define BASS_ERROR_EMPTY 31 // the file has no sample data +#define BASS_ERROR_NONET 32 // no internet connection could be opened +#define BASS_ERROR_CREATE 33 // couldn't create the file +#define BASS_ERROR_NOFX 34 // effects are not available +#define BASS_ERROR_NOTAVAIL 37 // requested data/action is not available +#define BASS_ERROR_DECODE 38 // the channel is/isn't a "decoding channel" +#define BASS_ERROR_DX 39 // a sufficient DirectX version is not installed +#define BASS_ERROR_TIMEOUT 40 // connection timedout +#define BASS_ERROR_FILEFORM 41 // unsupported file format +#define BASS_ERROR_SPEAKER 42 // unavailable speaker +#define BASS_ERROR_VERSION 43 // invalid BASS version (used by add-ons) +#define BASS_ERROR_CODEC 44 // codec is not available/supported +#define BASS_ERROR_ENDED 45 // the channel/file has ended +#define BASS_ERROR_BUSY 46 // the device is busy +#define BASS_ERROR_UNSTREAMABLE 47 // unstreamable file +#define BASS_ERROR_PROTOCOL 48 // unsupported protocol +#define BASS_ERROR_DENIED 49 // access denied +#define BASS_ERROR_UNKNOWN -1 // some other mystery problem + +// BASS_SetConfig options +#define BASS_CONFIG_BUFFER 0 +#define BASS_CONFIG_UPDATEPERIOD 1 +#define BASS_CONFIG_GVOL_SAMPLE 4 +#define BASS_CONFIG_GVOL_STREAM 5 +#define BASS_CONFIG_GVOL_MUSIC 6 +#define BASS_CONFIG_CURVE_VOL 7 +#define BASS_CONFIG_CURVE_PAN 8 +#define BASS_CONFIG_FLOATDSP 9 +#define BASS_CONFIG_3DALGORITHM 10 +#define BASS_CONFIG_NET_TIMEOUT 11 +#define BASS_CONFIG_NET_BUFFER 12 +#define BASS_CONFIG_PAUSE_NOPLAY 13 +#define BASS_CONFIG_NET_PREBUF 15 +#define BASS_CONFIG_NET_PASSIVE 18 +#define BASS_CONFIG_REC_BUFFER 19 +#define BASS_CONFIG_NET_PLAYLIST 21 +#define BASS_CONFIG_MUSIC_VIRTUAL 22 +#define BASS_CONFIG_VERIFY 23 +#define BASS_CONFIG_UPDATETHREADS 24 +#define BASS_CONFIG_DEV_BUFFER 27 +#define BASS_CONFIG_REC_LOOPBACK 28 +#define BASS_CONFIG_VISTA_TRUEPOS 30 +#define BASS_CONFIG_IOS_SESSION 34 +#define BASS_CONFIG_IOS_MIXAUDIO 34 +#define BASS_CONFIG_DEV_DEFAULT 36 +#define BASS_CONFIG_NET_READTIMEOUT 37 +#define BASS_CONFIG_VISTA_SPEAKERS 38 +#define BASS_CONFIG_IOS_SPEAKER 39 +#define BASS_CONFIG_MF_DISABLE 40 +#define BASS_CONFIG_HANDLES 41 +#define BASS_CONFIG_UNICODE 42 +#define BASS_CONFIG_SRC 43 +#define BASS_CONFIG_SRC_SAMPLE 44 +#define BASS_CONFIG_ASYNCFILE_BUFFER 45 +#define BASS_CONFIG_OGG_PRESCAN 47 +#define BASS_CONFIG_MF_VIDEO 48 +#define BASS_CONFIG_AIRPLAY 49 +#define BASS_CONFIG_DEV_NONSTOP 50 +#define BASS_CONFIG_IOS_NOCATEGORY 51 +#define BASS_CONFIG_VERIFY_NET 52 +#define BASS_CONFIG_DEV_PERIOD 53 +#define BASS_CONFIG_FLOAT 54 +#define BASS_CONFIG_NET_SEEK 56 +#define BASS_CONFIG_AM_DISABLE 58 +#define BASS_CONFIG_NET_PLAYLIST_DEPTH 59 +#define BASS_CONFIG_NET_PREBUF_WAIT 60 +#define BASS_CONFIG_ANDROID_SESSIONID 62 +#define BASS_CONFIG_WASAPI_PERSIST 65 +#define BASS_CONFIG_REC_WASAPI 66 +#define BASS_CONFIG_ANDROID_AAUDIO 67 +#define BASS_CONFIG_SAMPLE_ONEHANDLE 69 +#define BASS_CONFIG_NET_META 71 +#define BASS_CONFIG_NET_RESTRATE 72 +#define BASS_CONFIG_REC_DEFAULT 73 +#define BASS_CONFIG_NORAMP 74 + +// BASS_SetConfigPtr options +#define BASS_CONFIG_NET_AGENT 16 +#define BASS_CONFIG_NET_PROXY 17 +#define BASS_CONFIG_IOS_NOTIFY 46 +#define BASS_CONFIG_ANDROID_JAVAVM 63 +#define BASS_CONFIG_LIBSSL 64 +#define BASS_CONFIG_FILENAME 75 + +#define BASS_CONFIG_THREAD 0x40000000 // flag: thread-specific setting + +// BASS_CONFIG_IOS_SESSION flags +#define BASS_IOS_SESSION_MIX 1 +#define BASS_IOS_SESSION_DUCK 2 +#define BASS_IOS_SESSION_AMBIENT 4 +#define BASS_IOS_SESSION_SPEAKER 8 +#define BASS_IOS_SESSION_DISABLE 16 +#define BASS_IOS_SESSION_DEACTIVATE 32 +#define BASS_IOS_SESSION_AIRPLAY 64 +#define BASS_IOS_SESSION_BTHFP 128 +#define BASS_IOS_SESSION_BTA2DP 0x100 + +// BASS_Init flags +#define BASS_DEVICE_8BITS 1 // unused +#define BASS_DEVICE_MONO 2 // mono +#define BASS_DEVICE_3D 4 // unused +#define BASS_DEVICE_16BITS 8 // limit output to 16-bit +#define BASS_DEVICE_REINIT 128 // reinitialize +#define BASS_DEVICE_LATENCY 0x100 // unused +#define BASS_DEVICE_CPSPEAKERS 0x400 // unused +#define BASS_DEVICE_SPEAKERS 0x800 // force enabling of speaker assignment +#define BASS_DEVICE_NOSPEAKER 0x1000 // ignore speaker arrangement +#define BASS_DEVICE_DMIX 0x2000 // use ALSA "dmix" plugin +#define BASS_DEVICE_FREQ 0x4000 // set device sample rate +#define BASS_DEVICE_STEREO 0x8000 // limit output to stereo +#define BASS_DEVICE_HOG 0x10000 // hog/exclusive mode +#define BASS_DEVICE_AUDIOTRACK 0x20000 // use AudioTrack output +#define BASS_DEVICE_DSOUND 0x40000 // use DirectSound output +#define BASS_DEVICE_SOFTWARE 0x80000 // disable hardware/fastpath output + +// DirectSound interfaces (for use with BASS_GetDSoundObject) +#define BASS_OBJECT_DS 1 // IDirectSound +#define BASS_OBJECT_DS3DL 2 // IDirectSound3DListener + +// Device info structure +typedef struct { +#if defined(_WIN32_WCE) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) + const wchar_t *name; // description + const wchar_t *driver; // driver +#else + const char *name; // description + const char *driver; // driver +#endif + DWORD flags; +} BASS_DEVICEINFO; + +// BASS_DEVICEINFO flags +#define BASS_DEVICE_ENABLED 1 +#define BASS_DEVICE_DEFAULT 2 +#define BASS_DEVICE_INIT 4 +#define BASS_DEVICE_LOOPBACK 8 +#define BASS_DEVICE_DEFAULTCOM 128 + +#define BASS_DEVICE_TYPE_MASK 0xff000000 +#define BASS_DEVICE_TYPE_NETWORK 0x01000000 +#define BASS_DEVICE_TYPE_SPEAKERS 0x02000000 +#define BASS_DEVICE_TYPE_LINE 0x03000000 +#define BASS_DEVICE_TYPE_HEADPHONES 0x04000000 +#define BASS_DEVICE_TYPE_MICROPHONE 0x05000000 +#define BASS_DEVICE_TYPE_HEADSET 0x06000000 +#define BASS_DEVICE_TYPE_HANDSET 0x07000000 +#define BASS_DEVICE_TYPE_DIGITAL 0x08000000 +#define BASS_DEVICE_TYPE_SPDIF 0x09000000 +#define BASS_DEVICE_TYPE_HDMI 0x0a000000 +#define BASS_DEVICE_TYPE_DISPLAYPORT 0x40000000 + +// BASS_GetDeviceInfo flags +#define BASS_DEVICES_AIRPLAY 0x1000000 + +typedef struct { + DWORD flags; // device capabilities (DSCAPS_xxx flags) + DWORD hwsize; // unused + DWORD hwfree; // unused + DWORD freesam; // unused + DWORD free3d; // unused + DWORD minrate; // unused + DWORD maxrate; // unused + BOOL eax; // unused + DWORD minbuf; // recommended minimum buffer length in ms + DWORD dsver; // DirectSound version + DWORD latency; // average delay (in ms) before start of playback + DWORD initflags; // BASS_Init "flags" parameter + DWORD speakers; // number of speakers available + DWORD freq; // current output rate +} BASS_INFO; + +// BASS_INFO flags (from DSOUND.H) +#define DSCAPS_EMULDRIVER 0x00000020 // device does not have hardware DirectSound support +#define DSCAPS_CERTIFIED 0x00000040 // device driver has been certified by Microsoft + +#define DSCAPS_HARDWARE 0x80000000 // hardware mixed + +// Recording device info structure +typedef struct { + DWORD flags; // device capabilities (DSCCAPS_xxx flags) + DWORD formats; // supported standard formats (WAVE_FORMAT_xxx flags) + DWORD inputs; // number of inputs + BOOL singlein; // TRUE = only 1 input can be set at a time + DWORD freq; // current input rate +} BASS_RECORDINFO; + +// BASS_RECORDINFO flags (from DSOUND.H) +#define DSCCAPS_EMULDRIVER DSCAPS_EMULDRIVER // device does not have hardware DirectSound recording support +#define DSCCAPS_CERTIFIED DSCAPS_CERTIFIED // device driver has been certified by Microsoft + +// defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H) +#ifndef WAVE_FORMAT_1M08 +#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */ +#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */ +#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */ +#endif + +// Sample info structure +typedef struct { + DWORD freq; // default playback rate + float volume; // default volume (0-1) + float pan; // default pan (-1=left, 0=middle, 1=right) + DWORD flags; // BASS_SAMPLE_xxx flags + DWORD length; // length (in bytes) + DWORD max; // maximum simultaneous playbacks + DWORD origres; // original resolution + DWORD chans; // number of channels + DWORD mingap; // minimum gap (ms) between creating channels + DWORD mode3d; // BASS_3DMODE_xxx mode + float mindist; // minimum distance + float maxdist; // maximum distance + DWORD iangle; // angle of inside projection cone + DWORD oangle; // angle of outside projection cone + float outvol; // delta-volume outside the projection cone + DWORD vam; // unused + DWORD priority; // unused +} BASS_SAMPLE; + +#define BASS_SAMPLE_8BITS 1 // 8 bit +#define BASS_SAMPLE_FLOAT 256 // 32 bit floating-point +#define BASS_SAMPLE_MONO 2 // mono +#define BASS_SAMPLE_LOOP 4 // looped +#define BASS_SAMPLE_3D 8 // 3D functionality +#define BASS_SAMPLE_SOFTWARE 16 // unused +#define BASS_SAMPLE_MUTEMAX 32 // mute at max distance (3D only) +#define BASS_SAMPLE_VAM 64 // unused +#define BASS_SAMPLE_FX 128 // unused +#define BASS_SAMPLE_OVER_VOL 0x10000 // override lowest volume +#define BASS_SAMPLE_OVER_POS 0x20000 // override longest playing +#define BASS_SAMPLE_OVER_DIST 0x30000 // override furthest from listener (3D only) + +#define BASS_STREAM_PRESCAN 0x20000 // scan file for accurate seeking and length +#define BASS_STREAM_AUTOFREE 0x40000 // automatically free the stream when it stops/ends +#define BASS_STREAM_RESTRATE 0x80000 // restrict the download rate of internet file stream +#define BASS_STREAM_BLOCK 0x100000 // download internet file stream in small blocks +#define BASS_STREAM_DECODE 0x200000 // don't play the stream, only decode +#define BASS_STREAM_STATUS 0x800000 // give server status info (HTTP/ICY tags) in DOWNLOADPROC + +#define BASS_MP3_IGNOREDELAY 0x200 // ignore LAME/Xing/VBRI/iTunes delay & padding info +#define BASS_MP3_SETPOS BASS_STREAM_PRESCAN + +#define BASS_MUSIC_FLOAT BASS_SAMPLE_FLOAT +#define BASS_MUSIC_MONO BASS_SAMPLE_MONO +#define BASS_MUSIC_LOOP BASS_SAMPLE_LOOP +#define BASS_MUSIC_3D BASS_SAMPLE_3D +#define BASS_MUSIC_FX BASS_SAMPLE_FX +#define BASS_MUSIC_AUTOFREE BASS_STREAM_AUTOFREE +#define BASS_MUSIC_DECODE BASS_STREAM_DECODE +#define BASS_MUSIC_PRESCAN BASS_STREAM_PRESCAN // calculate playback length +#define BASS_MUSIC_CALCLEN BASS_MUSIC_PRESCAN +#define BASS_MUSIC_RAMP 0x200 // normal ramping +#define BASS_MUSIC_RAMPS 0x400 // sensitive ramping +#define BASS_MUSIC_SURROUND 0x800 // surround sound +#define BASS_MUSIC_SURROUND2 0x1000 // surround sound (mode 2) +#define BASS_MUSIC_FT2PAN 0x2000 // apply FastTracker 2 panning to XM files +#define BASS_MUSIC_FT2MOD 0x2000 // play .MOD as FastTracker 2 does +#define BASS_MUSIC_PT1MOD 0x4000 // play .MOD as ProTracker 1 does +#define BASS_MUSIC_NONINTER 0x10000 // non-interpolated sample mixing +#define BASS_MUSIC_SINCINTER 0x800000 // sinc interpolated sample mixing +#define BASS_MUSIC_POSRESET 0x8000 // stop all notes when moving position +#define BASS_MUSIC_POSRESETEX 0x400000 // stop all notes and reset bmp/etc when moving position +#define BASS_MUSIC_STOPBACK 0x80000 // stop the music on a backwards jump effect +#define BASS_MUSIC_NOSAMPLE 0x100000 // don't load the samples + +// Speaker assignment flags +#define BASS_SPEAKER_FRONT 0x1000000 // front speakers +#define BASS_SPEAKER_REAR 0x2000000 // rear speakers +#define BASS_SPEAKER_CENLFE 0x3000000 // center & LFE speakers (5.1) +#define BASS_SPEAKER_SIDE 0x4000000 // side speakers (7.1) +#define BASS_SPEAKER_N(n) ((n)<<24) // n'th pair of speakers (max 15) +#define BASS_SPEAKER_LEFT 0x10000000 // modifier: left +#define BASS_SPEAKER_RIGHT 0x20000000 // modifier: right +#define BASS_SPEAKER_FRONTLEFT BASS_SPEAKER_FRONT | BASS_SPEAKER_LEFT +#define BASS_SPEAKER_FRONTRIGHT BASS_SPEAKER_FRONT | BASS_SPEAKER_RIGHT +#define BASS_SPEAKER_REARLEFT BASS_SPEAKER_REAR | BASS_SPEAKER_LEFT +#define BASS_SPEAKER_REARRIGHT BASS_SPEAKER_REAR | BASS_SPEAKER_RIGHT +#define BASS_SPEAKER_CENTER BASS_SPEAKER_CENLFE | BASS_SPEAKER_LEFT +#define BASS_SPEAKER_LFE BASS_SPEAKER_CENLFE | BASS_SPEAKER_RIGHT +#define BASS_SPEAKER_SIDELEFT BASS_SPEAKER_SIDE | BASS_SPEAKER_LEFT +#define BASS_SPEAKER_SIDERIGHT BASS_SPEAKER_SIDE | BASS_SPEAKER_RIGHT +#define BASS_SPEAKER_REAR2 BASS_SPEAKER_SIDE +#define BASS_SPEAKER_REAR2LEFT BASS_SPEAKER_SIDELEFT +#define BASS_SPEAKER_REAR2RIGHT BASS_SPEAKER_SIDERIGHT + +#define BASS_ASYNCFILE 0x40000000 // read file asynchronously +#define BASS_UNICODE 0x80000000 // UTF-16 + +#define BASS_RECORD_ECHOCANCEL 0x2000 +#define BASS_RECORD_AGC 0x4000 +#define BASS_RECORD_PAUSE 0x8000 // start recording paused + +// DX7 voice allocation & management flags +#define BASS_VAM_HARDWARE 1 +#define BASS_VAM_SOFTWARE 2 +#define BASS_VAM_TERM_TIME 4 +#define BASS_VAM_TERM_DIST 8 +#define BASS_VAM_TERM_PRIO 16 + +// Channel info structure +typedef struct { + DWORD freq; // default playback rate + DWORD chans; // channels + DWORD flags; + DWORD ctype; // type of channel + DWORD origres; // original resolution + HPLUGIN plugin; + HSAMPLE sample; + const char *filename; +} BASS_CHANNELINFO; + +#define BASS_ORIGRES_FLOAT 0x10000 + +// BASS_CHANNELINFO types +#define BASS_CTYPE_SAMPLE 1 +#define BASS_CTYPE_RECORD 2 +#define BASS_CTYPE_STREAM 0x10000 +#define BASS_CTYPE_STREAM_VORBIS 0x10002 +#define BASS_CTYPE_STREAM_OGG 0x10002 +#define BASS_CTYPE_STREAM_MP1 0x10003 +#define BASS_CTYPE_STREAM_MP2 0x10004 +#define BASS_CTYPE_STREAM_MP3 0x10005 +#define BASS_CTYPE_STREAM_AIFF 0x10006 +#define BASS_CTYPE_STREAM_CA 0x10007 +#define BASS_CTYPE_STREAM_MF 0x10008 +#define BASS_CTYPE_STREAM_AM 0x10009 +#define BASS_CTYPE_STREAM_SAMPLE 0x1000a +#define BASS_CTYPE_STREAM_DUMMY 0x18000 +#define BASS_CTYPE_STREAM_DEVICE 0x18001 +#define BASS_CTYPE_STREAM_WAV 0x40000 // WAVE flag (LOWORD=codec) +#define BASS_CTYPE_STREAM_WAV_PCM 0x50001 +#define BASS_CTYPE_STREAM_WAV_FLOAT 0x50003 +#define BASS_CTYPE_MUSIC_MOD 0x20000 +#define BASS_CTYPE_MUSIC_MTM 0x20001 +#define BASS_CTYPE_MUSIC_S3M 0x20002 +#define BASS_CTYPE_MUSIC_XM 0x20003 +#define BASS_CTYPE_MUSIC_IT 0x20004 +#define BASS_CTYPE_MUSIC_MO3 0x00100 // MO3 flag + +// BASS_PluginLoad flags +#define BASS_PLUGIN_PROC 1 + +typedef struct { + DWORD ctype; // channel type +#if defined(_WIN32_WCE) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) + const wchar_t *name; // format description + const wchar_t *exts; // file extension filter (*.ext1;*.ext2;etc...) +#else + const char *name; // format description + const char *exts; // file extension filter (*.ext1;*.ext2;etc...) +#endif +} BASS_PLUGINFORM; + +typedef struct { + DWORD version; // version (same form as BASS_GetVersion) + DWORD formatc; // number of formats + const BASS_PLUGINFORM *formats; // the array of formats +} BASS_PLUGININFO; + +// 3D vector (for 3D positions/velocities/orientations) +typedef struct BASS_3DVECTOR { +#ifdef __cplusplus + BASS_3DVECTOR() {} + BASS_3DVECTOR(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} +#endif + float x; // +=right, -=left + float y; // +=up, -=down + float z; // +=front, -=behind +} BASS_3DVECTOR; + +// 3D channel modes +#define BASS_3DMODE_NORMAL 0 // normal 3D processing +#define BASS_3DMODE_RELATIVE 1 // position is relative to the listener +#define BASS_3DMODE_OFF 2 // no 3D processing + +// software 3D mixing algorithms (used with BASS_CONFIG_3DALGORITHM) +#define BASS_3DALG_DEFAULT 0 +#define BASS_3DALG_OFF 1 +#define BASS_3DALG_FULL 2 +#define BASS_3DALG_LIGHT 3 + +// BASS_SampleGetChannel flags +#define BASS_SAMCHAN_NEW 1 // get a new playback channel +#define BASS_SAMCHAN_STREAM 2 // create a stream + +typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, void *user); +/* User stream callback function. +handle : The stream that needs writing +buffer : Buffer to write the samples in +length : Number of bytes to write +user : The 'user' parameter value given when calling BASS_StreamCreate +RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end the stream. */ + +#define BASS_STREAMPROC_END 0x80000000 // end of user stream flag + +// Special STREAMPROCs +#define STREAMPROC_DUMMY (STREAMPROC*)0 // "dummy" stream +#define STREAMPROC_PUSH (STREAMPROC*)-1 // push stream +#define STREAMPROC_DEVICE (STREAMPROC*)-2 // device mix stream +#define STREAMPROC_DEVICE_3D (STREAMPROC*)-3 // device 3D mix stream + +// BASS_StreamCreateFileUser file systems +#define STREAMFILE_NOBUFFER 0 +#define STREAMFILE_BUFFER 1 +#define STREAMFILE_BUFFERPUSH 2 + +// User file stream callback functions +typedef void (CALLBACK FILECLOSEPROC)(void *user); +typedef QWORD (CALLBACK FILELENPROC)(void *user); +typedef DWORD (CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user); +typedef BOOL (CALLBACK FILESEEKPROC)(QWORD offset, void *user); + +typedef struct { + FILECLOSEPROC *close; + FILELENPROC *length; + FILEREADPROC *read; + FILESEEKPROC *seek; +} BASS_FILEPROCS; + +// BASS_StreamPutFileData options +#define BASS_FILEDATA_END 0 // end & close the file + +// BASS_StreamGetFilePosition modes +#define BASS_FILEPOS_CURRENT 0 +#define BASS_FILEPOS_DECODE BASS_FILEPOS_CURRENT +#define BASS_FILEPOS_DOWNLOAD 1 +#define BASS_FILEPOS_END 2 +#define BASS_FILEPOS_START 3 +#define BASS_FILEPOS_CONNECTED 4 +#define BASS_FILEPOS_BUFFER 5 +#define BASS_FILEPOS_SOCKET 6 +#define BASS_FILEPOS_ASYNCBUF 7 +#define BASS_FILEPOS_SIZE 8 +#define BASS_FILEPOS_BUFFERING 9 +#define BASS_FILEPOS_AVAILABLE 10 + +typedef void (CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length, void *user); +/* Internet stream download callback function. +buffer : Buffer containing the downloaded data... NULL=end of download +length : Number of bytes in the buffer +user : The 'user' parameter value given when calling BASS_StreamCreateURL */ + +// BASS_ChannelSetSync types +#define BASS_SYNC_POS 0 +#define BASS_SYNC_END 2 +#define BASS_SYNC_META 4 +#define BASS_SYNC_SLIDE 5 +#define BASS_SYNC_STALL 6 +#define BASS_SYNC_DOWNLOAD 7 +#define BASS_SYNC_FREE 8 +#define BASS_SYNC_SETPOS 11 +#define BASS_SYNC_MUSICPOS 10 +#define BASS_SYNC_MUSICINST 1 +#define BASS_SYNC_MUSICFX 3 +#define BASS_SYNC_OGG_CHANGE 12 +#define BASS_SYNC_DEV_FAIL 14 +#define BASS_SYNC_DEV_FORMAT 15 +#define BASS_SYNC_THREAD 0x20000000 // flag: call sync in other thread +#define BASS_SYNC_MIXTIME 0x40000000 // flag: sync at mixtime, else at playtime +#define BASS_SYNC_ONETIME 0x80000000 // flag: sync only once, else continuously + +typedef void (CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data, void *user); +/* Sync callback function. +handle : The sync that has occured +channel: Channel that the sync occured in +data : Additional data associated with the sync's occurance +user : The 'user' parameter given when calling BASS_ChannelSetSync */ + +typedef void (CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user); +/* DSP callback function. +handle : The DSP handle +channel: Channel that the DSP is being applied to +buffer : Buffer to apply the DSP to +length : Number of bytes in the buffer +user : The 'user' parameter given when calling BASS_ChannelSetDSP */ + +typedef BOOL (CALLBACK RECORDPROC)(HRECORD handle, const void *buffer, DWORD length, void *user); +/* Recording callback function. +handle : The recording handle +buffer : Buffer containing the recorded sample data +length : Number of bytes +user : The 'user' parameter value given when calling BASS_RecordStart +RETURN : TRUE = continue recording, FALSE = stop */ + +// BASS_ChannelIsActive return values +#define BASS_ACTIVE_STOPPED 0 +#define BASS_ACTIVE_PLAYING 1 +#define BASS_ACTIVE_STALLED 2 +#define BASS_ACTIVE_PAUSED 3 +#define BASS_ACTIVE_PAUSED_DEVICE 4 + +// Channel attributes +#define BASS_ATTRIB_FREQ 1 +#define BASS_ATTRIB_VOL 2 +#define BASS_ATTRIB_PAN 3 +#define BASS_ATTRIB_EAXMIX 4 +#define BASS_ATTRIB_NOBUFFER 5 +#define BASS_ATTRIB_VBR 6 +#define BASS_ATTRIB_CPU 7 +#define BASS_ATTRIB_SRC 8 +#define BASS_ATTRIB_NET_RESUME 9 +#define BASS_ATTRIB_SCANINFO 10 +#define BASS_ATTRIB_NORAMP 11 +#define BASS_ATTRIB_BITRATE 12 +#define BASS_ATTRIB_BUFFER 13 +#define BASS_ATTRIB_GRANULE 14 +#define BASS_ATTRIB_USER 15 +#define BASS_ATTRIB_TAIL 16 +#define BASS_ATTRIB_PUSH_LIMIT 17 +#define BASS_ATTRIB_DOWNLOADPROC 18 +#define BASS_ATTRIB_VOLDSP 19 +#define BASS_ATTRIB_VOLDSP_PRIORITY 20 +#define BASS_ATTRIB_MUSIC_AMPLIFY 0x100 +#define BASS_ATTRIB_MUSIC_PANSEP 0x101 +#define BASS_ATTRIB_MUSIC_PSCALER 0x102 +#define BASS_ATTRIB_MUSIC_BPM 0x103 +#define BASS_ATTRIB_MUSIC_SPEED 0x104 +#define BASS_ATTRIB_MUSIC_VOL_GLOBAL 0x105 +#define BASS_ATTRIB_MUSIC_ACTIVE 0x106 +#define BASS_ATTRIB_MUSIC_VOL_CHAN 0x200 // + channel # +#define BASS_ATTRIB_MUSIC_VOL_INST 0x300 // + instrument # + +// BASS_ChannelSlideAttribute flags +#define BASS_SLIDE_LOG 0x1000000 + +// BASS_ChannelGetData flags +#define BASS_DATA_AVAILABLE 0 // query how much data is buffered +#define BASS_DATA_NOREMOVE 0x10000000 // flag: don't remove data from recording buffer +#define BASS_DATA_FIXED 0x20000000 // unused +#define BASS_DATA_FLOAT 0x40000000 // flag: return floating-point sample data +#define BASS_DATA_FFT256 0x80000000 // 256 sample FFT +#define BASS_DATA_FFT512 0x80000001 // 512 FFT +#define BASS_DATA_FFT1024 0x80000002 // 1024 FFT +#define BASS_DATA_FFT2048 0x80000003 // 2048 FFT +#define BASS_DATA_FFT4096 0x80000004 // 4096 FFT +#define BASS_DATA_FFT8192 0x80000005 // 8192 FFT +#define BASS_DATA_FFT16384 0x80000006 // 16384 FFT +#define BASS_DATA_FFT32768 0x80000007 // 32768 FFT +#define BASS_DATA_FFT_INDIVIDUAL 0x10 // FFT flag: FFT for each channel, else all combined +#define BASS_DATA_FFT_NOWINDOW 0x20 // FFT flag: no Hanning window +#define BASS_DATA_FFT_REMOVEDC 0x40 // FFT flag: pre-remove DC bias +#define BASS_DATA_FFT_COMPLEX 0x80 // FFT flag: return complex data +#define BASS_DATA_FFT_NYQUIST 0x100 // FFT flag: return extra Nyquist value + +// BASS_ChannelGetLevelEx flags +#define BASS_LEVEL_MONO 1 // get mono level +#define BASS_LEVEL_STEREO 2 // get stereo level +#define BASS_LEVEL_RMS 4 // get RMS levels +#define BASS_LEVEL_VOLPAN 8 // apply VOL/PAN attributes to the levels +#define BASS_LEVEL_NOREMOVE 16 // don't remove data from recording buffer + +// BASS_ChannelGetTags types : what's returned +#define BASS_TAG_ID3 0 // ID3v1 tags : TAG_ID3 structure +#define BASS_TAG_ID3V2 1 // ID3v2 tags : variable length block +#define BASS_TAG_OGG 2 // OGG comments : series of null-terminated UTF-8 strings +#define BASS_TAG_HTTP 3 // HTTP headers : series of null-terminated ASCII strings +#define BASS_TAG_ICY 4 // ICY headers : series of null-terminated ANSI strings +#define BASS_TAG_META 5 // ICY metadata : ANSI string +#define BASS_TAG_APE 6 // APE tags : series of null-terminated UTF-8 strings +#define BASS_TAG_MP4 7 // MP4/iTunes metadata : series of null-terminated UTF-8 strings +#define BASS_TAG_WMA 8 // WMA tags : series of null-terminated UTF-8 strings +#define BASS_TAG_VENDOR 9 // OGG encoder : UTF-8 string +#define BASS_TAG_LYRICS3 10 // Lyric3v2 tag : ASCII string +#define BASS_TAG_CA_CODEC 11 // CoreAudio codec info : TAG_CA_CODEC structure +#define BASS_TAG_MF 13 // Media Foundation tags : series of null-terminated UTF-8 strings +#define BASS_TAG_WAVEFORMAT 14 // WAVE format : WAVEFORMATEEX structure +#define BASS_TAG_AM_NAME 16 // Android Media codec name : ASCII string +#define BASS_TAG_ID3V2_2 17 // ID3v2 tags (2nd block) : variable length block +#define BASS_TAG_AM_MIME 18 // Android Media MIME type : ASCII string +#define BASS_TAG_LOCATION 19 // redirected URL : ASCII string +#define BASS_TAG_RIFF_INFO 0x100 // RIFF "INFO" tags : series of null-terminated ANSI strings +#define BASS_TAG_RIFF_BEXT 0x101 // RIFF/BWF "bext" tags : TAG_BEXT structure +#define BASS_TAG_RIFF_CART 0x102 // RIFF/BWF "cart" tags : TAG_CART structure +#define BASS_TAG_RIFF_DISP 0x103 // RIFF "DISP" text tag : ANSI string +#define BASS_TAG_RIFF_CUE 0x104 // RIFF "cue " chunk : TAG_CUE structure +#define BASS_TAG_RIFF_SMPL 0x105 // RIFF "smpl" chunk : TAG_SMPL structure +#define BASS_TAG_APE_BINARY 0x1000 // + index #, binary APE tag : TAG_APE_BINARY structure +#define BASS_TAG_MUSIC_NAME 0x10000 // MOD music name : ANSI string +#define BASS_TAG_MUSIC_MESSAGE 0x10001 // MOD message : ANSI string +#define BASS_TAG_MUSIC_ORDERS 0x10002 // MOD order list : BYTE array of pattern numbers +#define BASS_TAG_MUSIC_AUTH 0x10003 // MOD author : UTF-8 string +#define BASS_TAG_MUSIC_INST 0x10100 // + instrument #, MOD instrument name : ANSI string +#define BASS_TAG_MUSIC_CHAN 0x10200 // + channel #, MOD channel name : ANSI string +#define BASS_TAG_MUSIC_SAMPLE 0x10300 // + sample #, MOD sample name : ANSI string + +// ID3v1 tag structure +typedef struct { + char id[3]; + char title[30]; + char artist[30]; + char album[30]; + char year[4]; + char comment[30]; + BYTE genre; +} TAG_ID3; + +// Binary APE tag structure +typedef struct { + const char *key; + const void *data; + DWORD length; +} TAG_APE_BINARY; + +// BWF "bext" tag structure +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4200) +#endif +#pragma pack(push,1) +typedef struct { + char Description[256]; // description + char Originator[32]; // name of the originator + char OriginatorReference[32]; // reference of the originator + char OriginationDate[10]; // date of creation (yyyy-mm-dd) + char OriginationTime[8]; // time of creation (hh-mm-ss) + QWORD TimeReference; // first sample count since midnight (little-endian) + WORD Version; // BWF version (little-endian) + BYTE UMID[64]; // SMPTE UMID + BYTE Reserved[190]; +#if defined(__GNUC__) && __GNUC__<3 + char CodingHistory[0]; // history +#elif 1 // change to 0 if compiler fails the following line + char CodingHistory[]; // history +#else + char CodingHistory[1]; // history +#endif +} TAG_BEXT; +#pragma pack(pop) + +// BWF "cart" tag structures +typedef struct +{ + DWORD dwUsage; // FOURCC timer usage ID + DWORD dwValue; // timer value in samples from head +} TAG_CART_TIMER; + +typedef struct +{ + char Version[4]; // version of the data structure + char Title[64]; // title of cart audio sequence + char Artist[64]; // artist or creator name + char CutID[64]; // cut number identification + char ClientID[64]; // client identification + char Category[64]; // category ID, PSA, NEWS, etc + char Classification[64]; // classification or auxiliary key + char OutCue[64]; // out cue text + char StartDate[10]; // yyyy-mm-dd + char StartTime[8]; // hh:mm:ss + char EndDate[10]; // yyyy-mm-dd + char EndTime[8]; // hh:mm:ss + char ProducerAppID[64]; // name of vendor or application + char ProducerAppVersion[64]; // version of producer application + char UserDef[64]; // user defined text + DWORD dwLevelReference; // sample value for 0 dB reference + TAG_CART_TIMER PostTimer[8]; // 8 time markers after head + char Reserved[276]; + char URL[1024]; // uniform resource locator +#if defined(__GNUC__) && __GNUC__<3 + char TagText[0]; // free form text for scripts or tags +#elif 1 // change to 0 if compiler fails the following line + char TagText[]; // free form text for scripts or tags +#else + char TagText[1]; // free form text for scripts or tags +#endif +} TAG_CART; + +// RIFF "cue " tag structures +typedef struct +{ + DWORD dwName; + DWORD dwPosition; + DWORD fccChunk; + DWORD dwChunkStart; + DWORD dwBlockStart; + DWORD dwSampleOffset; +} TAG_CUE_POINT; + +typedef struct +{ + DWORD dwCuePoints; +#if defined(__GNUC__) && __GNUC__<3 + TAG_CUE_POINT CuePoints[0]; +#elif 1 // change to 0 if compiler fails the following line + TAG_CUE_POINT CuePoints[]; +#else + TAG_CUE_POINT CuePoints[1]; +#endif +} TAG_CUE; + +// RIFF "smpl" tag structures +typedef struct +{ + DWORD dwIdentifier; + DWORD dwType; + DWORD dwStart; + DWORD dwEnd; + DWORD dwFraction; + DWORD dwPlayCount; +} TAG_SMPL_LOOP; + +typedef struct +{ + DWORD dwManufacturer; + DWORD dwProduct; + DWORD dwSamplePeriod; + DWORD dwMIDIUnityNote; + DWORD dwMIDIPitchFraction; + DWORD dwSMPTEFormat; + DWORD dwSMPTEOffset; + DWORD cSampleLoops; + DWORD cbSamplerData; +#if defined(__GNUC__) && __GNUC__<3 + TAG_SMPL_LOOP SampleLoops[0]; +#elif 1 // change to 0 if compiler fails the following line + TAG_SMPL_LOOP SampleLoops[]; +#else + TAG_SMPL_LOOP SampleLoops[1]; +#endif +} TAG_SMPL; +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// CoreAudio codec info structure +typedef struct { + DWORD ftype; // file format + DWORD atype; // audio format + const char *name; // description +} TAG_CA_CODEC; + +#ifndef _WAVEFORMATEX_ +#define _WAVEFORMATEX_ +#pragma pack(push,1) +typedef struct tWAVEFORMATEX +{ + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX, *PWAVEFORMATEX, *LPWAVEFORMATEX; +typedef const WAVEFORMATEX *LPCWAVEFORMATEX; +#pragma pack(pop) +#endif + +// BASS_ChannelGetLength/GetPosition/SetPosition modes +#define BASS_POS_BYTE 0 // byte position +#define BASS_POS_MUSIC_ORDER 1 // order.row position, MAKELONG(order,row) +#define BASS_POS_OGG 3 // OGG bitstream number +#define BASS_POS_END 0x10 // trimmed end position +#define BASS_POS_LOOP 0x11 // loop start positiom +#define BASS_POS_FLUSH 0x1000000 // flag: flush decoder/FX buffers +#define BASS_POS_RESET 0x2000000 // flag: reset user file buffers +#define BASS_POS_RELATIVE 0x4000000 // flag: seek relative to the current position +#define BASS_POS_INEXACT 0x8000000 // flag: allow seeking to inexact position +#define BASS_POS_DECODE 0x10000000 // flag: get the decoding (not playing) position +#define BASS_POS_DECODETO 0x20000000 // flag: decode to the position instead of seeking +#define BASS_POS_SCAN 0x40000000 // flag: scan to the position + +// BASS_ChannelSetDevice/GetDevice option +#define BASS_NODEVICE 0x20000 + +// BASS_RecordSetInput flags +#define BASS_INPUT_OFF 0x10000 +#define BASS_INPUT_ON 0x20000 + +#define BASS_INPUT_TYPE_MASK 0xff000000 +#define BASS_INPUT_TYPE_UNDEF 0x00000000 +#define BASS_INPUT_TYPE_DIGITAL 0x01000000 +#define BASS_INPUT_TYPE_LINE 0x02000000 +#define BASS_INPUT_TYPE_MIC 0x03000000 +#define BASS_INPUT_TYPE_SYNTH 0x04000000 +#define BASS_INPUT_TYPE_CD 0x05000000 +#define BASS_INPUT_TYPE_PHONE 0x06000000 +#define BASS_INPUT_TYPE_SPEAKER 0x07000000 +#define BASS_INPUT_TYPE_WAVE 0x08000000 +#define BASS_INPUT_TYPE_AUX 0x09000000 +#define BASS_INPUT_TYPE_ANALOG 0x0a000000 + +// BASS_ChannelSetFX effect types +#define BASS_FX_DX8_CHORUS 0 +#define BASS_FX_DX8_COMPRESSOR 1 +#define BASS_FX_DX8_DISTORTION 2 +#define BASS_FX_DX8_ECHO 3 +#define BASS_FX_DX8_FLANGER 4 +#define BASS_FX_DX8_GARGLE 5 +#define BASS_FX_DX8_I3DL2REVERB 6 +#define BASS_FX_DX8_PARAMEQ 7 +#define BASS_FX_DX8_REVERB 8 +#define BASS_FX_VOLUME 9 + +typedef struct { + float fWetDryMix; + float fDepth; + float fFeedback; + float fFrequency; + DWORD lWaveform; // 0=triangle, 1=sine + float fDelay; + DWORD lPhase; // BASS_DX8_PHASE_xxx +} BASS_DX8_CHORUS; + +typedef struct { + float fGain; + float fAttack; + float fRelease; + float fThreshold; + float fRatio; + float fPredelay; +} BASS_DX8_COMPRESSOR; + +typedef struct { + float fGain; + float fEdge; + float fPostEQCenterFrequency; + float fPostEQBandwidth; + float fPreLowpassCutoff; +} BASS_DX8_DISTORTION; + +typedef struct { + float fWetDryMix; + float fFeedback; + float fLeftDelay; + float fRightDelay; + BOOL lPanDelay; +} BASS_DX8_ECHO; + +typedef struct { + float fWetDryMix; + float fDepth; + float fFeedback; + float fFrequency; + DWORD lWaveform; // 0=triangle, 1=sine + float fDelay; + DWORD lPhase; // BASS_DX8_PHASE_xxx +} BASS_DX8_FLANGER; + +typedef struct { + DWORD dwRateHz; // Rate of modulation in hz + DWORD dwWaveShape; // 0=triangle, 1=square +} BASS_DX8_GARGLE; + +typedef struct { + int lRoom; // [-10000, 0] default: -1000 mB + int lRoomHF; // [-10000, 0] default: 0 mB + float flRoomRolloffFactor; // [0.0, 10.0] default: 0.0 + float flDecayTime; // [0.1, 20.0] default: 1.49s + float flDecayHFRatio; // [0.1, 2.0] default: 0.83 + int lReflections; // [-10000, 1000] default: -2602 mB + float flReflectionsDelay; // [0.0, 0.3] default: 0.007 s + int lReverb; // [-10000, 2000] default: 200 mB + float flReverbDelay; // [0.0, 0.1] default: 0.011 s + float flDiffusion; // [0.0, 100.0] default: 100.0 % + float flDensity; // [0.0, 100.0] default: 100.0 % + float flHFReference; // [20.0, 20000.0] default: 5000.0 Hz +} BASS_DX8_I3DL2REVERB; + +typedef struct { + float fCenter; + float fBandwidth; + float fGain; +} BASS_DX8_PARAMEQ; + +typedef struct { + float fInGain; // [-96.0,0.0] default: 0.0 dB + float fReverbMix; // [-96.0,0.0] default: 0.0 db + float fReverbTime; // [0.001,3000.0] default: 1000.0 ms + float fHighFreqRTRatio; // [0.001,0.999] default: 0.001 +} BASS_DX8_REVERB; + +#define BASS_DX8_PHASE_NEG_180 0 +#define BASS_DX8_PHASE_NEG_90 1 +#define BASS_DX8_PHASE_ZERO 2 +#define BASS_DX8_PHASE_90 3 +#define BASS_DX8_PHASE_180 4 + +typedef struct { + float fTarget; + float fCurrent; + float fTime; + DWORD lCurve; +} BASS_FX_VOLUME_PARAM; + +typedef void (CALLBACK IOSNOTIFYPROC)(DWORD status); +/* iOS notification callback function. +status : The notification (BASS_IOSNOTIFY_xxx) */ + +#define BASS_IOSNOTIFY_INTERRUPT 1 // interruption started +#define BASS_IOSNOTIFY_INTERRUPT_END 2 // interruption ended + +BOOL BASSDEF(BASS_SetConfig)(DWORD option, DWORD value); +DWORD BASSDEF(BASS_GetConfig)(DWORD option); +BOOL BASSDEF(BASS_SetConfigPtr)(DWORD option, const void *value); +const void *BASSDEF(BASS_GetConfigPtr)(DWORD option); +DWORD BASSDEF(BASS_GetVersion)(void); +int BASSDEF(BASS_ErrorGetCode)(void); + +BOOL BASSDEF(BASS_GetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info); +#if defined(_WIN32) && !defined(_WIN32_WCE) && !(defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) +BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, HWND win, const void *dsguid); +#else +BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, void *win, const void *dsguid); +#endif +BOOL BASSDEF(BASS_Free)(void); +BOOL BASSDEF(BASS_SetDevice)(DWORD device); +DWORD BASSDEF(BASS_GetDevice)(void); +BOOL BASSDEF(BASS_GetInfo)(BASS_INFO *info); +BOOL BASSDEF(BASS_Start)(void); +BOOL BASSDEF(BASS_Stop)(void); +BOOL BASSDEF(BASS_Pause)(void); +DWORD BASSDEF(BASS_IsStarted)(void); +BOOL BASSDEF(BASS_Update)(DWORD length); +float BASSDEF(BASS_GetCPU)(void); +BOOL BASSDEF(BASS_SetVolume)(float volume); +float BASSDEF(BASS_GetVolume)(void); +#if defined(_WIN32) && !defined(_WIN32_WCE) && !(defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) +void *BASSDEF(BASS_GetDSoundObject)(DWORD object); +#endif + +BOOL BASSDEF(BASS_Set3DFactors)(float distf, float rollf, float doppf); +BOOL BASSDEF(BASS_Get3DFactors)(float *distf, float *rollf, float *doppf); +BOOL BASSDEF(BASS_Set3DPosition)(const BASS_3DVECTOR *pos, const BASS_3DVECTOR *vel, const BASS_3DVECTOR *front, const BASS_3DVECTOR *top); +BOOL BASSDEF(BASS_Get3DPosition)(BASS_3DVECTOR *pos, BASS_3DVECTOR *vel, BASS_3DVECTOR *front, BASS_3DVECTOR *top); +void BASSDEF(BASS_Apply3D)(void); + +HPLUGIN BASSDEF(BASS_PluginLoad)(const char *file, DWORD flags); +BOOL BASSDEF(BASS_PluginFree)(HPLUGIN handle); +BOOL BASSDEF(BASS_PluginEnable)(HPLUGIN handle, BOOL enable); +const BASS_PLUGININFO *BASSDEF(BASS_PluginGetInfo)(HPLUGIN handle); + +HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags); +HSAMPLE BASSDEF(BASS_SampleCreate)(DWORD length, DWORD freq, DWORD chans, DWORD max, DWORD flags); +BOOL BASSDEF(BASS_SampleFree)(HSAMPLE handle); +BOOL BASSDEF(BASS_SampleSetData)(HSAMPLE handle, const void *buffer); +BOOL BASSDEF(BASS_SampleGetData)(HSAMPLE handle, void *buffer); +BOOL BASSDEF(BASS_SampleGetInfo)(HSAMPLE handle, BASS_SAMPLE *info); +BOOL BASSDEF(BASS_SampleSetInfo)(HSAMPLE handle, const BASS_SAMPLE *info); +DWORD BASSDEF(BASS_SampleGetChannel)(HSAMPLE handle, DWORD flags); +DWORD BASSDEF(BASS_SampleGetChannels)(HSAMPLE handle, HCHANNEL *channels); +BOOL BASSDEF(BASS_SampleStop)(HSAMPLE handle); + +HSTREAM BASSDEF(BASS_StreamCreate)(DWORD freq, DWORD chans, DWORD flags, STREAMPROC *proc, void *user); +HSTREAM BASSDEF(BASS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); +HSTREAM BASSDEF(BASS_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user); +HSTREAM BASSDEF(BASS_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *proc, void *user); +BOOL BASSDEF(BASS_StreamFree)(HSTREAM handle); +QWORD BASSDEF(BASS_StreamGetFilePosition)(HSTREAM handle, DWORD mode); +DWORD BASSDEF(BASS_StreamPutData)(HSTREAM handle, const void *buffer, DWORD length); +DWORD BASSDEF(BASS_StreamPutFileData)(HSTREAM handle, const void *buffer, DWORD length); + +HMUSIC BASSDEF(BASS_MusicLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD flags, DWORD freq); +BOOL BASSDEF(BASS_MusicFree)(HMUSIC handle); + +BOOL BASSDEF(BASS_RecordGetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info); +BOOL BASSDEF(BASS_RecordInit)(int device); +BOOL BASSDEF(BASS_RecordFree)(void); +BOOL BASSDEF(BASS_RecordSetDevice)(DWORD device); +DWORD BASSDEF(BASS_RecordGetDevice)(void); +BOOL BASSDEF(BASS_RecordGetInfo)(BASS_RECORDINFO *info); +const char *BASSDEF(BASS_RecordGetInputName)(int input); +BOOL BASSDEF(BASS_RecordSetInput)(int input, DWORD flags, float volume); +DWORD BASSDEF(BASS_RecordGetInput)(int input, float *volume); +HRECORD BASSDEF(BASS_RecordStart)(DWORD freq, DWORD chans, DWORD flags, RECORDPROC *proc, void *user); + +double BASSDEF(BASS_ChannelBytes2Seconds)(DWORD handle, QWORD pos); +QWORD BASSDEF(BASS_ChannelSeconds2Bytes)(DWORD handle, double pos); +DWORD BASSDEF(BASS_ChannelGetDevice)(DWORD handle); +BOOL BASSDEF(BASS_ChannelSetDevice)(DWORD handle, DWORD device); +DWORD BASSDEF(BASS_ChannelIsActive)(DWORD handle); +BOOL BASSDEF(BASS_ChannelGetInfo)(DWORD handle, BASS_CHANNELINFO *info); +const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags); +DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask); +BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock); +BOOL BASSDEF(BASS_ChannelFree)(DWORD handle); +BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart); +BOOL BASSDEF(BASS_ChannelStart)(DWORD handle); +BOOL BASSDEF(BASS_ChannelStop)(DWORD handle); +BOOL BASSDEF(BASS_ChannelPause)(DWORD handle); +BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length); +BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); +BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib, float *value); +BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib, float value, DWORD time); +BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib); +BOOL BASSDEF(BASS_ChannelSetAttributeEx)(DWORD handle, DWORD attrib, void *value, DWORD size); +DWORD BASSDEF(BASS_ChannelGetAttributeEx)(DWORD handle, DWORD attrib, void *value, DWORD size); +BOOL BASSDEF(BASS_ChannelSet3DAttributes)(DWORD handle, int mode, float min, float max, int iangle, int oangle, float outvol); +BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min, float *max, DWORD *iangle, DWORD *oangle, float *outvol); +BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos, const BASS_3DVECTOR *orient, const BASS_3DVECTOR *vel); +BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos, BASS_3DVECTOR *orient, BASS_3DVECTOR *vel); +QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode); +BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); +QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode); +DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle); +BOOL BASSDEF(BASS_ChannelGetLevelEx)(DWORD handle, float *levels, float length, DWORD flags); +DWORD BASSDEF(BASS_ChannelGetData)(DWORD handle, void *buffer, DWORD length); +HSYNC BASSDEF(BASS_ChannelSetSync)(DWORD handle, DWORD type, QWORD param, SYNCPROC *proc, void *user); +BOOL BASSDEF(BASS_ChannelRemoveSync)(DWORD handle, HSYNC sync); +BOOL BASSDEF(BASS_ChannelSetLink)(DWORD handle, DWORD chan); +BOOL BASSDEF(BASS_ChannelRemoveLink)(DWORD handle, DWORD chan); +HDSP BASSDEF(BASS_ChannelSetDSP)(DWORD handle, DSPPROC *proc, void *user, int priority); +BOOL BASSDEF(BASS_ChannelRemoveDSP)(DWORD handle, HDSP dsp); +HFX BASSDEF(BASS_ChannelSetFX)(DWORD handle, DWORD type, int priority); +BOOL BASSDEF(BASS_ChannelRemoveFX)(DWORD handle, HFX fx); + +BOOL BASSDEF(BASS_FXSetParameters)(HFX handle, const void *params); +BOOL BASSDEF(BASS_FXGetParameters)(HFX handle, void *params); +BOOL BASSDEF(BASS_FXSetPriority)(HFX handle, int priority); +BOOL BASSDEF(BASS_FXReset)(DWORD handle); + +#ifdef __cplusplus +} + +#if defined(_WIN32) && !defined(NOBASSOVERLOADS) +static inline HPLUGIN BASS_PluginLoad(const WCHAR *file, DWORD flags) +{ + return BASS_PluginLoad((const char*)file, flags | BASS_UNICODE); +} + +static inline HMUSIC BASS_MusicLoad(BOOL mem, const WCHAR *file, QWORD offset, DWORD length, DWORD flags, DWORD freq) +{ + return BASS_MusicLoad(mem, (const void*)file, offset, length, flags | BASS_UNICODE, freq); +} + +static inline HSAMPLE BASS_SampleLoad(BOOL mem, const WCHAR *file, QWORD offset, DWORD length, DWORD max, DWORD flags) +{ + return BASS_SampleLoad(mem, (const void*)file, offset, length, max, flags | BASS_UNICODE); +} + +static inline HSTREAM BASS_StreamCreateFile(BOOL mem, const WCHAR *file, QWORD offset, QWORD length, DWORD flags) +{ + return BASS_StreamCreateFile(mem, (const void*)file, offset, length, flags | BASS_UNICODE); +} + +static inline HSTREAM BASS_StreamCreateURL(const WCHAR *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user) +{ + return BASS_StreamCreateURL((const char*)url, offset, flags | BASS_UNICODE, proc, user); +} + +static inline BOOL BASS_SetConfigPtr(DWORD option, const WCHAR *value) +{ + return BASS_SetConfigPtr(option | BASS_UNICODE, (const void*)value); +} +#endif +#endif + +#ifdef __OBJC__ +#undef BOOL +#endif + +#endif diff --git a/bass/inc/bassmidi.h b/bass/inc/bassmidi.h new file mode 100644 index 0000000..30e5447 --- /dev/null +++ b/bass/inc/bassmidi.h @@ -0,0 +1,442 @@ +/* + BASSMIDI 2.4 C/C++ header file + Copyright (c) 2006-2024 Un4seen Developments Ltd. + + See the BASSMIDI.CHM file for more detailed documentation +*/ + +#ifndef BASSMIDI_H +#define BASSMIDI_H + +#include "bass.h" + +#if BASSVERSION!=0x204 +#error conflicting BASS and BASSMIDI versions +#endif + +#ifdef __OBJC__ +typedef int BOOL32; +#define BOOL BOOL32 // override objc's BOOL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef BASSMIDIDEF +#define BASSMIDIDEF(f) WINAPI f +#else +#define NOBASSMIDIOVERLOADS +#endif + +typedef DWORD HSOUNDFONT; // soundfont handle + +// Additional error codes returned by BASS_ErrorGetCode +#define BASS_ERROR_MIDI_INCLUDE 7000 // SFZ include file could not be opened + +// Additional BASS_SetConfig options +#define BASS_CONFIG_MIDI_COMPACT 0x10400 +#define BASS_CONFIG_MIDI_VOICES 0x10401 +#define BASS_CONFIG_MIDI_AUTOFONT 0x10402 +#define BASS_CONFIG_MIDI_IN_PORTS 0x10404 +#define BASS_CONFIG_MIDI_SAMPLETHREADS 0x10406 +#define BASS_CONFIG_MIDI_SAMPLEMEM 0x10407 +#define BASS_CONFIG_MIDI_SAMPLEREAD 0x10408 +#define BASS_CONFIG_MIDI_SAMPLELOADING 0x1040a + +// Additional BASS_SetConfigPtr options +#define BASS_CONFIG_MIDI_DEFFONT 0x10403 +#define BASS_CONFIG_MIDI_SFZHEAD 0x10409 + +// Additional sync types +#define BASS_SYNC_MIDI_MARK 0x10000 +#define BASS_SYNC_MIDI_MARKER 0x10000 +#define BASS_SYNC_MIDI_CUE 0x10001 +#define BASS_SYNC_MIDI_LYRIC 0x10002 +#define BASS_SYNC_MIDI_TEXT 0x10003 +#define BASS_SYNC_MIDI_EVENT 0x10004 +#define BASS_SYNC_MIDI_TICK 0x10005 +#define BASS_SYNC_MIDI_TIMESIG 0x10006 +#define BASS_SYNC_MIDI_KEYSIG 0x10007 + +// Additional BASS_MIDI_StreamCreateFile/etc flags +#define BASS_MIDI_NODRUMPARAMUSER 0x200 +#define BASS_MIDI_NODRUMPARAM 0x400 +#define BASS_MIDI_NOSYSRESET 0x800 +#define BASS_MIDI_DECAYEND 0x1000 +#define BASS_MIDI_NOFX 0x2000 +#define BASS_MIDI_DECAYSEEK 0x4000 +#define BASS_MIDI_NOCROP 0x8000 +#define BASS_MIDI_NOTEOFF1 0x10000 +#define BASS_MIDI_ASYNC 0x400000 +#define BASS_MIDI_SINCINTER 0x800000 + +// BASS_MIDI_FontInit flags +#define BASS_MIDI_FONT_MEM 0x10000 +#define BASS_MIDI_FONT_MMAP 0x20000 +#define BASS_MIDI_FONT_XGDRUMS 0x40000 +#define BASS_MIDI_FONT_NOFX 0x80000 +#define BASS_MIDI_FONT_LINATTMOD 0x100000 +#define BASS_MIDI_FONT_LINDECVOL 0x200000 +#define BASS_MIDI_FONT_NORAMPIN 0x400000 +#define BASS_MIDI_FONT_NOSBLIMITS 0x800000 +#define BASS_MIDI_FONT_NOLIMITS BASS_MIDI_FONT_NOSBLIMITS +#define BASS_MIDI_FONT_MINFX 0x1000000 +#define BASS_MIDI_FONT_SBLIMITS 0x2000000 + +typedef struct { + HSOUNDFONT font; // soundfont + int preset; // preset number (-1=all) + int bank; +} BASS_MIDI_FONT; + +typedef struct { + HSOUNDFONT font; // soundfont + int spreset; // source preset number + int sbank; // source bank number + int dpreset; // destination preset/program number + int dbank; // destination bank number + int dbanklsb; // destination bank number LSB +} BASS_MIDI_FONTEX; + +typedef struct { + HSOUNDFONT font; // soundfont + int spreset; // source preset number + int sbank; // source bank number + int dpreset; // destination preset/program number + int dbank; // destination bank number + int dbanklsb; // destination bank number LSB + DWORD minchan; // minimum channel number + DWORD numchan; // number of channels from minchan +} BASS_MIDI_FONTEX2; + +// BASS_MIDI_StreamSet/GetFonts flag +#define BASS_MIDI_FONT_EX 0x1000000 // BASS_MIDI_FONTEX +#define BASS_MIDI_FONT_EX2 0x2000000 // BASS_MIDI_FONTEX2 + +typedef struct { + const char *name; + const char *copyright; + const char *comment; + DWORD presets; // number of presets/instruments + DWORD samsize; // total size (in bytes) of the sample data + DWORD samload; // amount of sample data currently loaded + DWORD samtype; // sample format (CTYPE) if packed +} BASS_MIDI_FONTINFO; + +typedef struct { + DWORD track; // track containing marker + DWORD pos; // marker position + const char *text; // marker text +} BASS_MIDI_MARK; + +// Marker types +#define BASS_MIDI_MARK_MARKER 0 // marker +#define BASS_MIDI_MARK_CUE 1 // cue point +#define BASS_MIDI_MARK_LYRIC 2 // lyric +#define BASS_MIDI_MARK_TEXT 3 // text +#define BASS_MIDI_MARK_TIMESIG 4 // time signature +#define BASS_MIDI_MARK_KEYSIG 5 // key signature +#define BASS_MIDI_MARK_COPY 6 // copyright notice +#define BASS_MIDI_MARK_TRACK 7 // track name +#define BASS_MIDI_MARK_INST 8 // instrument name +#define BASS_MIDI_MARK_TRACKSTART 9 // track start (SMF2) +#define BASS_MIDI_MARK_SEQSPEC 10 // sequencer-specific +#define BASS_MIDI_MARK_TICK 0x10000 // flag: get position in ticks (otherwise bytes) + +// MIDI events +#define MIDI_EVENT_NOTE 1 +#define MIDI_EVENT_PROGRAM 2 +#define MIDI_EVENT_CHANPRES 3 +#define MIDI_EVENT_PITCH 4 +#define MIDI_EVENT_PITCHRANGE 5 +#define MIDI_EVENT_DRUMS 6 +#define MIDI_EVENT_FINETUNE 7 +#define MIDI_EVENT_COARSETUNE 8 +#define MIDI_EVENT_MASTERVOL 9 +#define MIDI_EVENT_BANK 10 +#define MIDI_EVENT_MODULATION 11 +#define MIDI_EVENT_VOLUME 12 +#define MIDI_EVENT_PAN 13 +#define MIDI_EVENT_EXPRESSION 14 +#define MIDI_EVENT_SUSTAIN 15 +#define MIDI_EVENT_SOUNDOFF 16 +#define MIDI_EVENT_RESET 17 +#define MIDI_EVENT_NOTESOFF 18 +#define MIDI_EVENT_PORTAMENTO 19 +#define MIDI_EVENT_PORTATIME 20 +#define MIDI_EVENT_PORTANOTE 21 +#define MIDI_EVENT_MODE 22 +#define MIDI_EVENT_REVERB 23 +#define MIDI_EVENT_CHORUS 24 +#define MIDI_EVENT_CUTOFF 25 +#define MIDI_EVENT_RESONANCE 26 +#define MIDI_EVENT_RELEASE 27 +#define MIDI_EVENT_ATTACK 28 +#define MIDI_EVENT_DECAY 29 +#define MIDI_EVENT_REVERB_MACRO 30 +#define MIDI_EVENT_CHORUS_MACRO 31 +#define MIDI_EVENT_REVERB_TIME 32 +#define MIDI_EVENT_REVERB_DELAY 33 +#define MIDI_EVENT_REVERB_LOCUTOFF 34 +#define MIDI_EVENT_REVERB_HICUTOFF 35 +#define MIDI_EVENT_REVERB_LEVEL 36 +#define MIDI_EVENT_CHORUS_DELAY 37 +#define MIDI_EVENT_CHORUS_DEPTH 38 +#define MIDI_EVENT_CHORUS_RATE 39 +#define MIDI_EVENT_CHORUS_FEEDBACK 40 +#define MIDI_EVENT_CHORUS_LEVEL 41 +#define MIDI_EVENT_CHORUS_REVERB 42 +#define MIDI_EVENT_USERFX 43 +#define MIDI_EVENT_USERFX_LEVEL 44 +#define MIDI_EVENT_USERFX_REVERB 45 +#define MIDI_EVENT_USERFX_CHORUS 46 +#define MIDI_EVENT_DRUM_FINETUNE 50 +#define MIDI_EVENT_DRUM_COARSETUNE 51 +#define MIDI_EVENT_DRUM_PAN 52 +#define MIDI_EVENT_DRUM_REVERB 53 +#define MIDI_EVENT_DRUM_CHORUS 54 +#define MIDI_EVENT_DRUM_CUTOFF 55 +#define MIDI_EVENT_DRUM_RESONANCE 56 +#define MIDI_EVENT_DRUM_LEVEL 57 +#define MIDI_EVENT_DRUM_USERFX 58 +#define MIDI_EVENT_SOFT 60 +#define MIDI_EVENT_SYSTEM 61 +#define MIDI_EVENT_TEMPO 62 +#define MIDI_EVENT_SCALETUNING 63 +#define MIDI_EVENT_CONTROL 64 +#define MIDI_EVENT_CHANPRES_VIBRATO 65 +#define MIDI_EVENT_CHANPRES_PITCH 66 +#define MIDI_EVENT_CHANPRES_FILTER 67 +#define MIDI_EVENT_CHANPRES_VOLUME 68 +#define MIDI_EVENT_MOD_VIBRATO 69 +#define MIDI_EVENT_MODRANGE 69 +#define MIDI_EVENT_BANK_LSB 70 +#define MIDI_EVENT_KEYPRES 71 +#define MIDI_EVENT_KEYPRES_VIBRATO 72 +#define MIDI_EVENT_KEYPRES_PITCH 73 +#define MIDI_EVENT_KEYPRES_FILTER 74 +#define MIDI_EVENT_KEYPRES_VOLUME 75 +#define MIDI_EVENT_SOSTENUTO 76 +#define MIDI_EVENT_MOD_PITCH 77 +#define MIDI_EVENT_MOD_FILTER 78 +#define MIDI_EVENT_MOD_VOLUME 79 +#define MIDI_EVENT_VIBRATO_RATE 80 +#define MIDI_EVENT_VIBRATO_DEPTH 81 +#define MIDI_EVENT_VIBRATO_DELAY 82 +#define MIDI_EVENT_MASTER_FINETUNE 83 +#define MIDI_EVENT_MASTER_COARSETUNE 84 +#define MIDI_EVENT_MIXLEVEL 0x10000 +#define MIDI_EVENT_TRANSPOSE 0x10001 +#define MIDI_EVENT_SYSTEMEX 0x10002 +#define MIDI_EVENT_SPEED 0x10004 +#define MIDI_EVENT_DEFDRUMS 0x10006 + +#define MIDI_EVENT_END 0 +#define MIDI_EVENT_END_TRACK 0x10003 + +#define MIDI_EVENT_NOTES 0x20000 +#define MIDI_EVENT_VOICES 0x20001 + +#define MIDI_SYSTEM_DEFAULT 0 +#define MIDI_SYSTEM_GM1 1 +#define MIDI_SYSTEM_GM2 2 +#define MIDI_SYSTEM_XG 3 +#define MIDI_SYSTEM_GS 4 + +typedef struct { + DWORD event; // MIDI_EVENT_xxx + DWORD param; + DWORD chan; + DWORD tick; // event position (ticks) + DWORD pos; // event position (bytes) +} BASS_MIDI_EVENT; + +// BASS_MIDI_StreamEvents modes +#define BASS_MIDI_EVENTS_STRUCT 0 // BASS_MIDI_EVENT structures +#define BASS_MIDI_EVENTS_RAW 0x10000 // raw MIDI event data +#define BASS_MIDI_EVENTS_SYNC 0x1000000 // flag: trigger event syncs +#define BASS_MIDI_EVENTS_NORSTATUS 0x2000000 // flag: no running status +#define BASS_MIDI_EVENTS_CANCEL 0x4000000 // flag: cancel pending events +#define BASS_MIDI_EVENTS_TIME 0x8000000 // flag: delta-time info is present +#define BASS_MIDI_EVENTS_ABSTIME 0x10000000 // flag: absolute time info is present +#define BASS_MIDI_EVENTS_ASYNC 0x20000000 // flag: process asynchronously +#define BASS_MIDI_EVENTS_FILTER 0x40000000 // flag: apply filtering +#define BASS_MIDI_EVENTS_FLUSH 0x80000000 // flag: flush async events + +// BASS_MIDI_StreamGetChannel special channels +#define BASS_MIDI_CHAN_CHORUS (DWORD)-1 +#define BASS_MIDI_CHAN_REVERB (DWORD)-2 +#define BASS_MIDI_CHAN_USERFX (DWORD)-3 + +// BASS_CHANNELINFO type +#define BASS_CTYPE_STREAM_MIDI 0x10d00 + +// Additional attributes +#define BASS_ATTRIB_MIDI_PPQN 0x12000 +#define BASS_ATTRIB_MIDI_CPU 0x12001 +#define BASS_ATTRIB_MIDI_CHANS 0x12002 +#define BASS_ATTRIB_MIDI_VOICES 0x12003 +#define BASS_ATTRIB_MIDI_VOICES_ACTIVE 0x12004 +#define BASS_ATTRIB_MIDI_STATE 0x12005 +#define BASS_ATTRIB_MIDI_SRC 0x12006 +#define BASS_ATTRIB_MIDI_KILL 0x12007 +#define BASS_ATTRIB_MIDI_SPEED 0x12008 +#define BASS_ATTRIB_MIDI_REVERB 0x12009 +#define BASS_ATTRIB_MIDI_VOL 0x1200a +#define BASS_ATTRIB_MIDI_QUEUE_TICK 0x1200b +#define BASS_ATTRIB_MIDI_QUEUE_BYTE 0x1200c +#define BASS_ATTRIB_MIDI_QUEUE_ASYNC 0x1200d +#define BASS_ATTRIB_MIDI_TRACK_VOL 0x12100 // + track # + +// Additional tag type +#define BASS_TAG_MIDI_TRACK 0x11000 // + track #, track text : array of null-terminated ANSI strings + +// BASS_ChannelGetLength/GetPosition/SetPosition mode +#define BASS_POS_MIDI_TICK 2 // tick position + +typedef BOOL (CALLBACK MIDIFILTERPROC)(HSTREAM handle, int track, BASS_MIDI_EVENT *event, BOOL seeking, void *user); +/* Event filtering callback function. +handle : MIDI stream handle +track : Track containing the event +event : The event +seeking: TRUE = the event is being processed while seeking, FALSE = it is being played +user : The 'user' parameter value given when calling BASS_MIDI_StreamSetFilter +RETURN : TRUE = process the event, FALSE = drop the event */ + +// BASS_MIDI_FontLoadEx flags +#define BASS_MIDI_FONTLOAD_NOWAIT 1 // don't want for the samples to load +#define BASS_MIDI_FONTLOAD_COMPACT 2 // compact samples +#define BASS_MIDI_FONTLOAD_NOLOAD 4 // don't load (only compact) +#define BASS_MIDI_FONTLOAD_TIME 8 // length is in milliseconds +#define BASS_MIDI_FONTLOAD_KEEPDEC 16 // keep decoders + +// BASS_MIDI_FontPack flags +#define BASS_MIDI_PACK_NOHEAD 1 // don't send a WAV header to the encoder +#define BASS_MIDI_PACK_16BIT 2 // discard low 8 bits of 24-bit sample data +#define BASS_MIDI_PACK_48KHZ 4 // set encoding rate to 48000 Hz (else 44100 Hz) + +typedef struct { + const char *name; // description + DWORD id; + DWORD flags; +} BASS_MIDI_DEVICEINFO; + +typedef void (CALLBACK MIDIINPROC)(DWORD device, double time, const BYTE *buffer, DWORD length, void *user); +/* MIDI input callback function. +device : MIDI input device +time : Timestamp +buffer : Buffer containing MIDI data +length : Number of bytes of data +user : The 'user' parameter value given when calling BASS_MIDI_InInit */ + +DWORD BASSMIDIDEF(BASS_MIDI_GetVersion)(void); + +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamCreate)(DWORD channels, DWORD flags, DWORD freq); +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags, DWORD freq); +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user, DWORD freq); +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user, DWORD freq); +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamCreateEvents)(const BASS_MIDI_EVENT *events, DWORD ppqn, DWORD flags, DWORD freq); +BOOL BASSMIDIDEF(BASS_MIDI_StreamGetMark)(HSTREAM handle, DWORD type, DWORD index, BASS_MIDI_MARK *mark); +DWORD BASSMIDIDEF(BASS_MIDI_StreamGetMarks)(HSTREAM handle, int track, DWORD type, BASS_MIDI_MARK *marks); +BOOL BASSMIDIDEF(BASS_MIDI_StreamSetFonts)(HSTREAM handle, const void *fonts, DWORD count); +DWORD BASSMIDIDEF(BASS_MIDI_StreamGetFonts)(HSTREAM handle, void *fonts, DWORD count); +BOOL BASSMIDIDEF(BASS_MIDI_StreamLoadSamples)(HSTREAM handle); +BOOL BASSMIDIDEF(BASS_MIDI_StreamEvent)(HSTREAM handle, DWORD chan, DWORD event, DWORD param); +DWORD BASSMIDIDEF(BASS_MIDI_StreamEvents)(HSTREAM handle, DWORD mode, const void *events, DWORD length); +DWORD BASSMIDIDEF(BASS_MIDI_StreamGetEvent)(HSTREAM handle, DWORD chan, DWORD event); +DWORD BASSMIDIDEF(BASS_MIDI_StreamGetEvents)(HSTREAM handle, int track, DWORD filter, BASS_MIDI_EVENT *events); +DWORD BASSMIDIDEF(BASS_MIDI_StreamGetEventsEx)(HSTREAM handle, int track, DWORD filter, BASS_MIDI_EVENT *events, DWORD start, DWORD count); +BOOL BASSMIDIDEF(BASS_MIDI_StreamGetPreset)(HSTREAM handle, DWORD chan, BASS_MIDI_FONT *font); +HSTREAM BASSMIDIDEF(BASS_MIDI_StreamGetChannel)(HSTREAM handle, DWORD chan); +BOOL BASSMIDIDEF(BASS_MIDI_StreamSetFilter)(HSTREAM handle, BOOL seeking, MIDIFILTERPROC *proc, void *user); + +HSOUNDFONT BASSMIDIDEF(BASS_MIDI_FontInit)(const void *file, DWORD flags); +HSOUNDFONT BASSMIDIDEF(BASS_MIDI_FontInitUser)(const BASS_FILEPROCS *procs, void *user, DWORD flags); +BOOL BASSMIDIDEF(BASS_MIDI_FontFree)(HSOUNDFONT handle); +BOOL BASSMIDIDEF(BASS_MIDI_FontGetInfo)(HSOUNDFONT handle, BASS_MIDI_FONTINFO *info); +BOOL BASSMIDIDEF(BASS_MIDI_FontGetPresets)(HSOUNDFONT handle, DWORD *presets); +const char *BASSMIDIDEF(BASS_MIDI_FontGetPreset)(HSOUNDFONT handle, int preset, int bank); +BOOL BASSMIDIDEF(BASS_MIDI_FontLoad)(HSOUNDFONT handle, int preset, int bank); +BOOL BASSMIDIDEF(BASS_MIDI_FontLoadEx)(HSOUNDFONT handle, int preset, int bank, DWORD length, DWORD flags); +BOOL BASSMIDIDEF(BASS_MIDI_FontUnload)(HSOUNDFONT handle, int preset, int bank); +BOOL BASSMIDIDEF(BASS_MIDI_FontCompact)(HSOUNDFONT handle); +BOOL BASSMIDIDEF(BASS_MIDI_FontPack)(HSOUNDFONT handle, const void *outfile, const void *encoder, DWORD flags); +BOOL BASSMIDIDEF(BASS_MIDI_FontUnpack)(HSOUNDFONT handle, const void *outfile, DWORD flags); +DWORD BASSMIDIDEF(BASS_MIDI_FontFlags)(HSOUNDFONT handle, DWORD flags, DWORD mask); +BOOL BASSMIDIDEF(BASS_MIDI_FontSetVolume)(HSOUNDFONT handle, float volume); +float BASSMIDIDEF(BASS_MIDI_FontGetVolume)(HSOUNDFONT handle); + +DWORD BASSMIDIDEF(BASS_MIDI_ConvertEvents)(const BYTE *data, DWORD length, BASS_MIDI_EVENT *events, DWORD count, DWORD flags); + +BOOL BASSMIDIDEF(BASS_MIDI_InGetDeviceInfo)(DWORD device, BASS_MIDI_DEVICEINFO *info); +BOOL BASSMIDIDEF(BASS_MIDI_InInit)(DWORD device, MIDIINPROC *proc, void *user); +BOOL BASSMIDIDEF(BASS_MIDI_InFree)(DWORD device); +BOOL BASSMIDIDEF(BASS_MIDI_InStart)(DWORD device); +BOOL BASSMIDIDEF(BASS_MIDI_InStop)(DWORD device); + +#ifdef __cplusplus +} + +#ifndef NOBASSMIDIOVERLOADS +static inline BOOL BASS_MIDI_StreamSetFonts(HSTREAM handle, const BASS_MIDI_FONTEX *fonts, DWORD count) +{ + return BASS_MIDI_StreamSetFonts(handle, (const void*)fonts, count | BASS_MIDI_FONT_EX); +} + +static inline BOOL BASS_MIDI_StreamSetFonts(HSTREAM handle, const BASS_MIDI_FONTEX2 *fonts, DWORD count) +{ + return BASS_MIDI_StreamSetFonts(handle, (const void*)fonts, count | BASS_MIDI_FONT_EX2); +} + +static inline DWORD BASS_MIDI_StreamGetFonts(HSTREAM handle, BASS_MIDI_FONTEX *fonts, DWORD count) +{ + return BASS_MIDI_StreamGetFonts(handle, (void*)fonts, count | BASS_MIDI_FONT_EX); +} + +static inline DWORD BASS_MIDI_StreamGetFonts(HSTREAM handle, BASS_MIDI_FONTEX2 *fonts, DWORD count) +{ + return BASS_MIDI_StreamGetFonts(handle, (void*)fonts, count | BASS_MIDI_FONT_EX2); +} + +#if __cplusplus >= 200707 || _MSC_VER >= 1600 +static inline DWORD BASS_MIDI_StreamGetFonts(HSTREAM handle, decltype(nullptr) fonts, DWORD count) +{ + return BASS_MIDI_StreamGetFonts(handle, (void*)fonts, count); +} +#endif + +#ifdef _WIN32 +static inline HSTREAM BASS_MIDI_StreamCreateFile(BOOL mem, const WCHAR *file, QWORD offset, QWORD length, DWORD flags, DWORD freq) +{ + return BASS_MIDI_StreamCreateFile(mem, (const void*)file, offset, length, flags | BASS_UNICODE, freq); +} + +static inline HSTREAM BASS_MIDI_StreamCreateURL(const WCHAR *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user, DWORD freq) +{ + return BASS_MIDI_StreamCreateURL((const char*)url, offset, flags | BASS_UNICODE, proc, user, freq); +} + +static inline HSOUNDFONT BASS_MIDI_FontInit(const WCHAR *file, DWORD flags) +{ + return BASS_MIDI_FontInit((const void*)file, flags|BASS_UNICODE); +} + +static inline BOOL BASS_MIDI_FontPack(HSOUNDFONT handle, const WCHAR *outfile, const WCHAR *encoder, DWORD flags) +{ + return BASS_MIDI_FontPack(handle, (const void*)outfile, (const void*)encoder, flags | BASS_UNICODE); +} + +static inline BOOL BASS_MIDI_FontUnpack(HSOUNDFONT handle, const WCHAR *outfile, DWORD flags) +{ + return BASS_MIDI_FontUnpack(handle, (const void*)outfile, flags | BASS_UNICODE); +} +#endif +#endif +#endif + +#ifdef __OBJC__ +#undef BOOL +#endif + +#endif diff --git a/bass/lib/bass.lib b/bass/lib/bass.lib new file mode 100644 index 0000000000000000000000000000000000000000..c69024ab53aa77394984519beea8c6bd4f084700 GIT binary patch literal 25944 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 E7bt_h5&!@I literal 0 HcmV?d00001 diff --git a/bass/x64/bassmidi.lib b/bass/x64/bassmidi.lib new file mode 100644 index 0000000000000000000000000000000000000000..acc16a1a4e2741ff2f87a387a8ab6dc838deb5c4 GIT binary patch literal 11226 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 literal 0 HcmV?d00001 diff --git a/src/decblupi.cpp b/src/decblupi.cpp index b9cbcf6..e76d76d 100644 --- a/src/decblupi.cpp +++ b/src/decblupi.cpp @@ -824,7 +824,7 @@ void CDecor::BlupiStep() } if (m_keyPress & KEY_DOWN && - !(m_keyPress & KEY_JUMP) && + !(m_keyPress & (KEY_JUMP | KEY_LEFT | KEY_RIGHT)) && IsBlupiStanding() && m_blupiAction != ACTION_DOWN && m_blupiAction != ACTION_STOPPOP && diff --git a/src/decio.cpp b/src/decio.cpp index a2add16..d0bb59e 100644 --- a/src/decio.cpp +++ b/src/decio.cpp @@ -193,7 +193,7 @@ BOOL CDecor::SomethingMissionPath(int gamer, int mission, BOOL bUser) return FALSE; } -BOOL CDecor::MissionStart(int gamer, int mission, BOOL bUser) +BOOL CDecor::CurrentWrite(int gamer, int mission, BOOL bUser) { char filename[MAX_PATH]; FILE* file = NULL; @@ -363,7 +363,7 @@ error: return FALSE; } -BOOL CDecor::CurrentWrite(int gamer, int mission, char* param3) +BOOL CDecor::MissionStart(int gamer, int mission, char* param3) { char filename[MAX_PATH]; FILE* file = NULL; diff --git a/src/decor.cpp b/src/decor.cpp index 44c3645..ee20b2e 100644 --- a/src/decor.cpp +++ b/src/decor.cpp @@ -874,15 +874,15 @@ void CDecor::DrawInfo() m_pPixmap->QuickIcon(CHELEMENT, 252, POINT( 505, 414 )); } - if (m_blupiCle | CLE_RED) { + if (m_blupiCle & CLE_RED) { m_pPixmap->QuickIcon(CHELEMENT, 215, POINT( 520, 418 )); } - if (m_blupiCle | CLE_GREEN) { + if (m_blupiCle & CLE_GREEN) { m_pPixmap->QuickIcon(CHELEMENT, 222, POINT( 530, 418 )); } - if (m_blupiCle | CLE_BLUE) { + if (m_blupiCle & CLE_BLUE) { m_pPixmap->QuickIcon(CHELEMENT, 229, POINT( 540, 418 )); } @@ -908,9 +908,68 @@ void CDecor::DrawInfo() if (m_blupiPos.x > 788) m_blupiPos.x = 788; break; } - // tutorial text... + + POINT cel = { (m_blupiPos.x + DIMBLUPIX / 2) / DIMOBJX, (m_blupiPos.y + DIMBLUPIY / 2) / DIMOBJY }; + for (i = 0; table_tutorial[i * 6 + 0] != -1; i++) + { + if (cel.x >= table_tutorial[i * 6 + 0] && + cel.x <= table_tutorial[i * 6 + 1] && + cel.y >= table_tutorial[i * 6 + 2] && + cel.y <= table_tutorial[i * 6 + 3]) + { + if (table_tutorial[i * 6 + 4] == -1 || table_tutorial[i * 6 + 4] == m_nbTresor) + { + if (m_bJoystick) + { + LoadString(table_tutorial[i * 6 + 5] + 100, text, 100); + } + else + { + LoadString(table_tutorial[i * 6 + 5], text, 100); + } + DrawTextCenter(m_pPixmap, POINT(360, 460), text); + break; + } + } + } } - // more... + } + if (m_phase == WM_PHASE_BUILD) + { + if (m_posCelHili.x != -1) + { + int icon = 0; + if (m_2ndPositionCalculationSlot != -1) + { + icon = 31; + } + if (m_dimCelHili.x > 0) + { + pos.x = m_posCelHili.x * DIMOBJX - m_posDecor.x; + + int j = 0; + for (i = 0; i < m_dimCelHili.x; i++) + { + pos.y = m_posCelHili.y * DIMOBJY - m_posDecor.y; + for (j = 0; j < m_dimCelHili.y; j++) + { + m_pPixmap->QuickIcon(CHOBJECT, icon, pos); + pos.y += DIMOBJY; + } + pos.x += DIMOBJX; + } + } + } + if (m_phase == WM_PHASE_BUILD) // again??? + { + LoadString(0x66, text, 100); + DrawText(m_pPixmap, POINT(200, 460), text, FONTGOLD); + } + } + if (m_phase == WM_PHASE_PLAYTEST) + { + LoadString(0x67, text, 100); + DrawText(m_pPixmap, POINT(200, 460), text, FONTGOLD); } } @@ -1760,9 +1819,9 @@ BOOL CDecor::SearchWorld(int world, POINT *cel, POINT *newBlupiPos) BOOL CDecor::SearchDoor(int n, POINT *cel) { - for (int x = 0; x < MAXCELX; x++) + for (int y = MAXCELY - 1; y > 0; y--) { - for (int y = 0; y < MAXCELY; y++) + for (int x = MAXCELX - 1; x > 0; x--) { if (m_decor[x][y].icon == 183) { @@ -1816,9 +1875,9 @@ void CDecor::AdaptDoors(BOOL bPrivate, int mission) } } } - for (int x = 0; x < MAXCELX; x++) + for (int x = MAXCELX - 1; x > 0; x--) { - for (int y = 0; y < MAXCELY; y++) + for (int y = MAXCELY - 1; y > 0; y--) { int icon = m_decor[x][y].icon; if (icon >= Object::World_1 && icon <= Object::World_8 && (!m_doors[icon - Object::World_1 + 1] || m_bCheatDoors)) @@ -1897,12 +1956,12 @@ void CDecor::OpenDoor(POINT cel) void CDecor::OpenDoorsWin() { - m_doors[m_mission + 1] = 1; + m_doors[m_mission + 1] = 0; } void CDecor::OpenGoldsWin() { - m_doors[180 + m_mission / 10] = 1; + m_doors[180 + m_mission / 10] = 0; } void CDecor::DoorsLost() diff --git a/src/decor.h b/src/decor.h index 4f0794f..7c5bce8 100644 --- a/src/decor.h +++ b/src/decor.h @@ -399,9 +399,9 @@ public: BOOL Write(int gamer, int mission, BOOL bUser); BOOL Read(int gamer, int mission, BOOL bUser); BOOL SomethingMissionPath(int gamer, int mission, BOOL bUser); - BOOL MissionStart(int gamer, int mission, BOOL bUser); + BOOL CurrentWrite(int gamer, int mission, BOOL bUser=FALSE); BOOL CurrentRead(int gamer, int mission, BOOL *pbMission, BOOL *pbPrivate); - BOOL CurrentWrite(int gamer, int mission, char* param3); + BOOL MissionStart(int gamer, int mission, char* param3); BOOL SearchWorld(int world, POINT *cel, POINT *newBlupiPos); BOOL SearchDoor(int n, POINT *cel); diff --git a/src/dectables.h b/src/dectables.h index a07dcf7..e827f30 100644 --- a/src/dectables.h +++ b/src/dectables.h @@ -624,4 +624,21 @@ extern int table_blupi[] = { 290, 290, 1, 1, 0 }; +extern int table_tutorial[] = { + 0, 2, 0, 7, -1, 0x190, + 3, 3, 0, 7, 0, 0x191, + 3, 4, 0, 7, -1, 0x192, + 6, 8, 0, 7, -1, 0x193, + 12, 12, 0, 7, 1, 0x194, + 12, 13, 0, 7, -1, 0x195, + 14, 15, 0, 7, -1, 0x196, + 16, 17, 0, 1, -1, 0x197, + 22, 23, 0, 7, -1, 0x198, + 29, 30, 0, 7, -1, 0x199, + 41, 44, 0, 7, -1, 0x19a, + 54, 63, 0, 7, -1, 0x19b, + 69, 70, 0, 7, -1, 0x19c, + -1 +}; + #endif \ No newline at end of file diff --git a/src/def.h b/src/def.h index 1911cfc..f226412 100644 --- a/src/def.h +++ b/src/def.h @@ -21,6 +21,7 @@ #define _BYE !_EGAMES // if TRUE, show exit image (like _INTRO) #define _LEGACY FALSE // if TRUE, keep broken/quirky legacy code #define _DREAM TRUE // if TRUE, allow Dream blocks when loading levels +#define _BASS TRUE // if TRUE, use BASS audio library instead of DirectMusic (wip) #define MAXGAMER 8 #define MAXNETPLAYER 4 @@ -33,6 +34,8 @@ #define MAXCHAT 6 #define MAXSAVE 6 #define LIFT_RANGE_Y 30 +#define MAXDEMO 9999 +#define MAXINDEX 20 #define LXIMAGE 640 // dimensions de la fenêtre de jeu #define LYIMAGE 480 @@ -515,18 +518,17 @@ enum { #define SPRITE_ARROW 1 #define SPRITE_POINTER 2 -#define SPRITE_MAP 3 -#define SPRITE_ARROWU 4 -#define SPRITE_ARROWD 5 -#define SPRITE_ARROWL 6 -#define SPRITE_ARROWR 7 -#define SPRITE_ARROWUL 8 -#define SPRITE_ARROWUR 9 -#define SPRITE_ARROWDL 10 -#define SPRITE_ARROWDR 11 -#define SPRITE_WAIT 12 -#define SPRITE_EMPTY 13 -#define SPRITE_FILL 14 +#define SPRITE_ARROWU 3 +#define SPRITE_ARROWD 4 +#define SPRITE_ARROWL 5 +#define SPRITE_ARROWR 6 +#define SPRITE_ARROWUL 7 +#define SPRITE_ARROWUR 8 +#define SPRITE_ARROWDL 9 +#define SPRITE_ARROWDR 10 +#define SPRITE_WAIT 11 +#define SPRITE_EMPTY 12 +#define SPRITE_DISABLE 13 // User define message diff --git a/src/event.cpp b/src/event.cpp index 607ec8c..231a450 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -21,10 +21,7 @@ #include "misc.h" #include "network.h" -#define DEF_TIME_HELP 10000 #define DEF_TIME_DEMO 1000 -#define MAXDEMO 2000 -#define MAXINDEX 20 typedef struct { @@ -1769,61 +1766,40 @@ CEvent::CEvent() m_bFullScreen = TRUE; m_mouseType = MOUSETYPEGRA; m_index = -1; - m_exercice = 0; - m_mission = 0; - m_private = 0; - m_maxMission = 0; - m_fileIndex = 0; - m_fileTime[10] = 0; - m_fileWorld[10] = 0; + m_rankCheat = -1; + m_nbVies = 3; + m_mission = 1; + m_private = 1; + m_multi = 1; m_phase = 0; - m_bSchool = FALSE; m_bPrivate = FALSE; + m_bMulti = FALSE; m_bBuildOfficialMissions = FALSE; m_bRunMovie = FALSE; - m_bBuildModify = FALSE; - m_bMousePress = FALSE; m_bMouseDown = FALSE; + m_bHili = FALSE; m_oldMousePos.x = 0; m_oldMousePos.y = 0; m_mouseSprite = 0; - m_bFillMouse = FALSE; m_bWaitMouse = FALSE; m_bHideMouse = FALSE; m_bShowMouse = FALSE; + m_bDisableMouse = FALSE; m_bMouseRelease = FALSE; - m_tryPhase = 0; - m_rankCheat = -1; m_posCheat = 0; m_speed = 1; m_bMovie = TRUE; m_bAllMissions = FALSE; m_bHiliInfoButton = TRUE; - m_bSpeed = FALSE; - m_bHelp = FALSE; - m_bChangeCheat = FALSE; - m_scrollSpeed = 1; - m_bPause = FALSE; - m_bShift = FALSE; - m_shiftPhase = 0; - m_movieToStart[0] = 0; - m_bInfoHelp = FALSE; + m_movieToStart[0] = '\0'; m_bDemoRec = FALSE; m_bDemoPlay = FALSE; m_pDemoBuffer = NULL; - m_bDrawMap = NULL; - m_choiceIndex = NULL; - m_saveIndex = NULL; - m_bMulti = NULL; - m_phaseAfterMovie = NULL; - m_choicePageOffset = NULL; - m_nbChoices = NULL; - //m_bNamesExist = NULL; m_demoTime = 0; - m_bCtrlDown = FALSE; m_keyPress = 0; - m_menuIndex = 0; + ZeroMemory(m_menuDecor, sizeof(m_menuDecor)); + m_menuDecor[10] = 1; } // Destructor @@ -1985,14 +1961,14 @@ void CEvent::RestoreGame() { if (m_phase == WM_PHASE_PLAY || m_phase == WM_PHASE_PLAYTEST) { - HideMouse(FALSE); - WaitMouse(TRUE); - WaitMouse(FALSE); - return; + HideMouse(TRUE); + } + else + { + WaitMouse(FALSE); + DisableMouse(TRUE); + DisableMouse(FALSE); // force le changement de sprite ! } - FillMouse(TRUE); - return; - } void CEvent::FlushInput() @@ -2157,7 +2133,7 @@ void CEvent::ReadInput() // CNetwork function needs to be implemented -void CEvent::NetSetPause(BOOL bPause, int players) +void CEvent::NetSetPause(BOOL bPause, BOOL bMulti) { BOOL bPause_; @@ -2174,7 +2150,7 @@ void CEvent::NetSetPause(BOOL bPause, int players) m_pSound->SuspendMusic(); } } - if ((m_bMulti != FALSE) && (players != 0)) + if ((m_bMulti != FALSE) && (bMulti != 0)) { m_pNetwork->Send(&bPause, 3, DPSEND_GUARANTEED); } @@ -2569,30 +2545,31 @@ BOOL CEvent::DrawButtons() if (m_phase == WM_PHASE_PLAY || m_phase == WM_PHASE_PLAYTEST) { - if (m_pDecor->GetPause() == 0) + if (m_pDecor->GetPause()) { - if (m_bDemoRec != 0) + if (m_pDecor->GetTime() % 20 < 15) { - LoadString(TX_DEMOREC, res, 100); - DrawTextLeft(m_pPixmap, pos, res, FONTGOLD); - } - if (m_bDemoPlay != 0) - { - LoadString(TX_DEMOPLAY, res, 100); - DrawTextLeft(m_pPixmap, pos, res, FONTGOLD); + DrawTextCenter(TX_PAUSE, LXIMAGE / 2, LYIMAGE / 2, 0); } } else { - if (m_pDecor->GetTime() % 20 < 15) + if (m_bDemoRec) { - DrawTextCenter(TX_PAUSE, 320, 240, 0); + LoadString(TX_DEMOREC, res, 100); + DrawTextLeft(m_pPixmap, POINT(10, 10), res, FONTGOLD); + } + if (m_bDemoPlay) + { + LoadString(TX_DEMOPLAY, res, 100); + DrawTextLeft(m_pPixmap, POINT(10, 10), res, FONTGOLD); } } + if (m_speed > 1) { sprintf(res, "x%d", m_speed); - DrawTextLeft(m_pPixmap, pos, res, FONTWHITE); + DrawTextLeft(m_pPixmap, POINT(64, LYIMAGE - DIMTEXTY + 1), res, FONTWHITE); } } if (m_phase == WM_PHASE_STOP) @@ -3167,20 +3144,25 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) } if (m_rankCheat == 11) { - m_pDecor->SetDrawSecret(!m_pDecor->GetDrawSecret()); - bEnable = m_pDecor->GetDrawSecret(); + bEnable = !m_pDecor->GetDrawSecret(); + m_pDecor->SetDrawSecret(bEnable); + } if (m_rankCheat == 19) { - // Add NetPacked + bEnable = !m_pDecor->GetNetPacked(); + m_pDecor->SetNetPacked(bEnable); + } if (m_rankCheat == 20) { - // Add Net Debug + bEnable = !m_pDecor->GetNetDebug(); + m_pDecor->SetNetDebug(bEnable); } if (m_rankCheat == 21) { - // Add NetMovePredict + bEnable = !m_pDecor->GetNetMovePredict(); + m_pDecor->SetNetMovePredict(bEnable); } if (m_phase != WM_PHASE_PLAY && m_phase != WM_PHASE_PLAYTEST) { @@ -3334,29 +3316,31 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) return TRUE; case WM_PHASE_GREAD: case WM_PHASE_GREADp: - /* - if (m_choiceIndex >= 0 && FUN_21890(m_choiceIndex)) + if (m_choiceIndex >= 0 && CurrentRead(m_choiceIndex)) { ChangePhase(WM_PHASE_PLAY); } return TRUE; - */ case WM_PHASE_GWRITE: - /* - if (m_choiceIndex >= 0 && FUN_218f0(m_choiceIndex)) + if (m_choiceIndex >= 0 && CurrentWrite(m_choiceIndex)) { ChangePhase(WM_PHASE_PLAY); } return TRUE; - */ default: return TRUE; } case VK_SHIFT: m_keyPress |= KEY_FIRE; break; + case VK_CONTROL: + m_keyPress |= KEY_JUMP; + break; + case VK_PAUSE: + NetSetPause((m_pDecor->GetPause()), TRUE); + break; case VK_LEFT: m_keyPress |= KEY_LEFT; break; @@ -3370,7 +3354,7 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) m_keyPress |= KEY_DOWN; break; case VK_HOME: - return TRUE; + break; case VK_SPACE: if (m_bRunMovie) { @@ -3380,14 +3364,30 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) } m_keyPress |= KEY_FIRE; break; - case VK_PAUSE: - m_bPause = !m_bPause; - NetSetPause((m_pDecor->GetPause()), m_bPause); - return TRUE; - case VK_CONTROL: - m_keyPress |= KEY_JUMP; + case VK_F1: + if (this->m_phase == WM_PHASE_PLAY) + { + ChangePhase(WM_PHASE_HELP); + } + break; + case VK_F2: + if (this->m_phase == WM_PHASE_PLAY) + { + ChangePhase(WM_PHASE_SETUPp); + } + break; + case VK_F3: + if (this->m_phase == WM_PHASE_PLAY) + { + ChangePhase(WM_PHASE_GWRITE); + } + break; + case VK_F4: + if (this->m_phase != WM_PHASE_PLAY) + { + ChangePhase(WM_PHASE_GREADp); + } break; - } if (m_phase != WM_PHASE_PLAY && m_phase != WM_PHASE_PLAYTEST && m_phase != WM_PHASE_BUILD) @@ -3396,6 +3396,7 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) } m_pDecor->SetInput(m_keyPress); + DemoRecEvent(); return TRUE; // Unknown Function @@ -3477,7 +3478,6 @@ BOOL CEvent::TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam) { if (!m_bShowMouse) { - ShowCursor(TRUE); // montre la souris m_pPixmap->MouseShow(FALSE); // cache sprite m_bShowMouse = TRUE; } @@ -3921,13 +3921,13 @@ int CEvent::MousePosToSprite(POINT pos) sprite = SPRITE_POINTER; - if (m_phase == WM_PHASE_PLAY || - m_phase == WM_PHASE_PLAYTEST || - m_phase == WM_PHASE_BUILD || - m_phase == WM_PHASE_BYE || + if (m_phase != WM_PHASE_PLAY && + m_phase != WM_PHASE_PLAYTEST && + m_phase != WM_PHASE_BUILD && + m_phase != WM_PHASE_BYE && !MouseOnButton(pos)) { - sprite = SPRITE_POINTER; + sprite = SPRITE_ARROW; } if (m_bWaitMouse) { @@ -3937,9 +3937,9 @@ int CEvent::MousePosToSprite(POINT pos) { sprite = SPRITE_EMPTY; } - if (m_bFillMouse) + if (m_bDisableMouse) { - sprite = SPRITE_FILL; + sprite = SPRITE_DISABLE; } return sprite; @@ -3971,7 +3971,8 @@ void CEvent::WaitMouse(BOOL bWait) void CEvent::HideMouse(BOOL bHide) { - m_bWaitMouse = bHide; + m_bHideMouse = bHide; + m_bDisableMouse = FALSE; if ( bHide ) { @@ -3985,13 +3986,13 @@ void CEvent::HideMouse(BOOL bHide) ChangeSprite(m_mouseSprite); } -void CEvent::FillMouse(int bFill) +void CEvent::DisableMouse(int bDisable) { - m_bFillMouse = bFill; + m_bDisableMouse = bDisable; - if (bFill) + if (bDisable) { - m_mouseSprite = SPRITE_FILL; + m_mouseSprite = SPRITE_DISABLE; } else { @@ -4152,7 +4153,7 @@ void CEvent::ReadAll() if ((-1 < m_choiceIndex) && (*(int*)((int)(m_filenameBuffer + -1) + m_choiceIndex * 4 + 216) != 0)) { - mission = m_pDecor->MissionStart(m_gamer, 999, bUser); + mission = m_pDecor->CurrentWrite(m_gamer, 999, bUser); if (mission != FALSE) { @@ -4174,7 +4175,7 @@ BOOL CEvent::SaveState(int rank) BOOL bUser = FALSE; char str[100]; - bMission = m_pDecor->MissionStart(m_gamer, rank, bUser); + bMission = m_pDecor->CurrentWrite(m_gamer, rank, bUser); if (bMission == FALSE) { @@ -4349,7 +4350,7 @@ BOOL CEvent::ChangePhase(UINT phase) if (phase == WM_PHASE_GAMER || phase == WM_PHASE_PLAY) { - OutputNetDebug("CEvent::ChangePhase_[WriteInfo]\r\n"); + OutputNetDebug("CEvent::ChangePhase [WriteInfo]\r\n"); WriteInfo(m_gamer); } @@ -4895,7 +4896,7 @@ BOOL CEvent::ChangePhase(UINT phase) WaitMouse(FALSE); if (m_phase == WM_PHASE_PLAY || m_phase == WM_PHASE_PLAYTEST) { - FillMouse(TRUE); + DisableMouse(TRUE); } m_pDecor->VehicleSoundsPhase(phase); OutputNetDebug("CEvent::ChangePhase [End]"); @@ -5312,16 +5313,17 @@ void CEvent::DemoStep() m_demoTime++; } -void CEvent::DemoRecEvent(UINT message, UINT input, WPARAM wParam, LPARAM lParam) +void CEvent::DemoRecEvent() { - if (m_demoIndex > 0 && - m_pDemoBuffer[m_demoIndex - 1].time == m_demoTime && - m_pDemoBuffer[m_demoIndex - 1].input == m_keyPress) - - m_demoIndex++; - if (m_demoIndex >= MAXDEMO) + if (m_bDemoRec) { - DemoRecStop(); + m_pDemoBuffer[m_demoIndex].time = m_demoTime; + m_pDemoBuffer[m_demoIndex].input == m_keyPress; + m_demoIndex++; + if (m_demoIndex > MAXDEMO) + { + DemoRecStop(); + } } } @@ -5752,14 +5754,14 @@ int CEvent::GameSave(int save) { char buffer[100]; - if (m_pDecor->MissionStart(m_gamer, save, TRUE)) + if (m_pDecor->CurrentWrite(m_gamer, save, TRUE)) { //LoadString() m_pDecor->NotifPush(buffer); m_quicksaveIndex = save; return 1; } - return m_pDecor->MissionStart(m_gamer, save, TRUE); + return m_pDecor->CurrentWrite(m_gamer, save, TRUE); } BOOL CEvent::CopyMission(char *srcFileName, char *dstFileName) @@ -5824,4 +5826,33 @@ void CEvent::DrawMap() void CEvent::NetAdjustLobbyButtons() { // TODO +} + +BOOL CEvent::CurrentRead(int rank) +{ + char buf[100]; + int mission; + BOOL bPrivate; + + if (m_pDecor->CurrentRead(m_gamer, rank, &mission, &bPrivate)) + { + m_bPrivate = bPrivate; + SetMission(mission); + m_quicksaveIndex = rank; + return TRUE; + } + return FALSE; +} + +BOOL CEvent::CurrentWrite(int rank) +{ + char buf[100]; + if (m_pDecor->CurrentWrite(m_gamer, rank)) + { + LoadString(0x120u, buf, 100); + m_pDecor->NotifPush(buf); + m_quicksaveIndex = rank; + return TRUE; + } + return FALSE; } \ No newline at end of file diff --git a/src/event.h b/src/event.h index 2c684ea..683d567 100644 --- a/src/event.h +++ b/src/event.h @@ -98,7 +98,7 @@ public: void SomethingDecor(); BOOL IsMouseRelease(); - void NetSetPause(BOOL bPause, int players); + void NetSetPause(BOOL bPause, BOOL bMulti); void NetSendLobby(); BOOL DrawButtons(); @@ -107,7 +107,7 @@ public: void MouseSprite(POINT pos); void WaitMouse(BOOL bWait); void HideMouse(BOOL bHide); - void FillMouse(int bFill); + void DisableMouse(int bFill); POINT GetLastMousePos(); BOOL TreatEvent(UINT message, WPARAM wParam, LPARAM lParam); BOOL TreatEventBase(UINT message, WPARAM wParam, LPARAM lParam); @@ -172,7 +172,7 @@ protected: void DemoRecStop(); BOOL DemoPlayStart(); void DemoPlayStop(); - void DemoRecEvent(UINT message, UINT input, WPARAM wParam, LPARAM lParam); + void DemoRecEvent(); // Network Functions BOOL NetCreate(int session); @@ -194,6 +194,9 @@ protected: BOOL CheckWorld1(); void NetAdjustLobbyButtons(); + BOOL CurrentRead(BOOL bPrivate); + BOOL CurrentWrite(int rank); + protected: int m_speed; @@ -256,7 +259,7 @@ protected: char m_textToolTips[50]; char m_textToolTips2[50]; int m_mouseSprite; - BOOL m_bFillMouse; + BOOL m_bDisableMouse; BOOL m_bWaitMouse; BOOL m_bHideMouse; BOOL m_bShowMouse; diff --git a/src/misc.cpp b/src/misc.cpp index 2874728..9a4af20 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -43,7 +43,6 @@ void ChangeSprite(int sprite) if ( sprite == SPRITE_ARROW ) hCursor = LoadCursorA(g_hInstance, "IDC_ARROW"); if ( sprite == SPRITE_POINTER ) hCursor = LoadCursorA(g_hInstance, "IDC_POINTER"); - if ( sprite == SPRITE_MAP ) hCursor = LoadCursorA(g_hInstance, "IDC_MAP"); if ( sprite == SPRITE_ARROWU ) hCursor = LoadCursorA(g_hInstance, "IDC_ARROWU"); if ( sprite == SPRITE_ARROWD ) hCursor = LoadCursorA(g_hInstance, "IDC_ARROWD"); if ( sprite == SPRITE_ARROWL ) hCursor = LoadCursorA(g_hInstance, "IDC_ARROWL"); @@ -54,7 +53,6 @@ void ChangeSprite(int sprite) if ( sprite == SPRITE_ARROWDR ) hCursor = LoadCursorA(g_hInstance, "IDC_ARROWDR"); if ( sprite == SPRITE_WAIT ) hCursor = LoadCursorA(g_hInstance, "IDC_WAIT"); if ( sprite == SPRITE_EMPTY ) hCursor = LoadCursorA(g_hInstance, "IDC_EMPTY"); - if ( sprite == SPRITE_FILL ) hCursor = LoadCursorA(g_hInstance, "IDC_FILL"); SetCursor(hCursor); g_lastSprite = sprite; diff --git a/src/pixmap.cpp b/src/pixmap.cpp index 258dc75..a8c751c 100644 --- a/src/pixmap.cpp +++ b/src/pixmap.cpp @@ -1538,6 +1538,7 @@ void CPixmap::SetMousePosSprite(POINT pos, int sprite, BOOL bDemoPlay) } } +/* // Positionne la souris. void CPixmap::SetMousePos(POINT pos, BOOL bDemoPlay) @@ -1552,6 +1553,7 @@ void CPixmap::SetMousePos(POINT pos, BOOL bDemoPlay) MouseUpdate(); } } +*/ // Change le lutin de la souris. @@ -1584,6 +1586,7 @@ void CPixmap::MouseUpdate() if ( m_lpDDSurface[CHELEMENT] == NULL ) return; if ( m_mouseType != MOUSETYPEGRA ) return; if ( m_mouseSprite == SPRITE_EMPTY ) return; + if (m_mouseSprite == SPRITE_DISABLE) return; if ( !m_bMouseShow ) return; oldRect.left = m_mouseBackPos.x; @@ -1661,7 +1664,7 @@ void CPixmap::MouseInvalidate() void CPixmap::MouseBackClear() { - if ( m_mouseType != MOUSETYPEGRA ) return; + if ( m_mouseType != MOUSETYPEGRA || m_mouseSprite == SPRITE_DISABLE) return; MouseBackRestore(); // enl�ve la souris dans m_lpDDSBack } @@ -1674,7 +1677,7 @@ void CPixmap::MouseBackDraw() if ( m_lpDDSurface[CHELEMENT] == NULL ) return; if ( m_mouseType != MOUSETYPEGRA ) return; - if ( m_mouseSprite == SPRITE_EMPTY ) return; + if ( m_mouseSprite == SPRITE_EMPTY || m_mouseSprite == SPRITE_DISABLE) return; if ( !m_bMouseShow ) return; MouseBackSave(); // sauve ce qui sera sous la souris @@ -1717,7 +1720,7 @@ void CPixmap::MouseBackSave() if ( m_lpDDSurface[CHELEMENT] == NULL ) return; if ( m_mouseType != MOUSETYPEGRA ) return; - if ( m_mouseSprite == SPRITE_EMPTY ) return; + if ( m_mouseSprite == SPRITE_EMPTY || m_mouseSprite == SPRITE_DISABLE) return; if ( !m_bMouseShow ) return; m_mouseBackPos.x = m_mousePos.x - m_mouseHotSpot.x; @@ -1870,7 +1873,7 @@ void CPixmap::MouseRectSprite(RECT *rect, POINT *offset) rank = 37; if ( m_mouseSprite == SPRITE_POINTER ) rank = 38; - if ( m_mouseSprite == 11 ) rank = 39; + if ( m_mouseSprite == SPRITE_WAIT ) rank = 39; rect->left = table_icon_element[rank * 6 + 0 + 1]; rect->right = rect->left + table_icon_element[rank * 6 + 4 + 1]; @@ -1888,29 +1891,18 @@ void CPixmap::MouseHotSpot() { int rank; - static int table_mouse_hotspot[14*2] = + static int table_mouse_hotspot[4*2] = { + 25, 0, 30, 30, // SPRITE_ARROW 20, 15, // SPRITE_POINTER - 31, 26, // SPRITE_MAP - 25, 14, // SPRITE_ARROWU - 24, 35, // SPRITE_ARROWD - 15, 24, // SPRITE_ARROWL - 35, 24, // SPRITE_ARROWR - 18, 16, // SPRITE_ARROWUL - 32, 18, // SPRITE_ARROWUR - 17, 30, // SPRITE_ARROWDL - 32, 32, // SPRITE_ARROWDR - 30, 30, // SPRITE_WAIT 30, 30, // SPRITE_EMPTY - 21, 51, // SPRITE_FILL }; + rank = m_mouseSprite; if ( m_mouseSprite >= SPRITE_ARROW && - m_mouseSprite <= SPRITE_FILL ) + m_mouseSprite <= SPRITE_WAIT ) { - rank = m_mouseSprite - SPRITE_ARROW; // rank <- 0..n - m_mouseHotSpot.x = table_mouse_hotspot[rank*2+0]; m_mouseHotSpot.y = table_mouse_hotspot[rank*2+1]; } diff --git a/src/sound.cpp b/src/sound.cpp index 37fee3c..2af6137 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -1,18 +1,46 @@ // sound.cpp // +#include "def.h" +#if _BASS && !_LEGACY #include #include #include "sound.h" #include "misc.h" -#include "def.h" #include "resource.h" +#include "bass.h" +#include "bassmidi.h" ///////////////////////////////////////////////////////////////////////////// // The following macro are used for proper error handling for DirectSound. #define TRY_DS(exp) { { HRESULT rval = exp; if (rval != DS_OK) { TraceErrorDS(rval, __FILE__, __LINE__); return FALSE; } } } +static const float table[21] = +{ + (float)0x00000000 / 0xFFFFFFFF, + (float)0x11111111 / 0xFFFFFFFF, + (float)0x22222222 / 0xFFFFFFFF, + (float)0x33333333 / 0xFFFFFFFF, + (float)0x44444444 / 0xFFFFFFFF, + (float)0x55555555 / 0xFFFFFFFF, + (float)0x66666666 / 0xFFFFFFFF, + (float)0x77777777 / 0xFFFFFFFF, + (float)0x88888888 / 0xFFFFFFFF, + (float)0x99999999 / 0xFFFFFFFF, + (float)0xAAAAAAAA / 0xFFFFFFFF, + (float)0xBBBBBBBB / 0xFFFFFFFF, + (float)0xCCCCCCCC / 0xFFFFFFFF, + (float)0xDDDDDDDD / 0xFFFFFFFF, + (float)0xEEEEEEEE / 0xFFFFFFFF, + (float)0xF222F222 / 0xFFFFFFFF, + (float)0xF555F555 / 0xFFFFFFFF, + (float)0xF777F777 / 0xFFFFFFFF, + (float)0xFAAAFAAA / 0xFFFFFFFF, + (float)0xFDDDFDDD / 0xFFFFFFFF, + (float)0xFFFFFFFF / 0xFFFFFFFF, +}; + struct WaveHeader { @@ -233,55 +261,7 @@ BOOL CSound::PlaySoundDS(DWORD dwSound, DWORD dwFlags) void InitMidiVolume(int volume) { - int nb, i, n; - MMRESULT result; - HMIDIOUT hmo = 0; - - static int table[21] = - { - 0x00000000, - 0x11111111, - 0x22222222, - 0x33333333, - 0x44444444, - 0x55555555, - 0x66666666, - 0x77777777, - 0x88888888, - 0x99999999, - 0xAAAAAAAA, - 0xBBBBBBBB, - 0xCCCCCCCC, - 0xDDDDDDDD, - 0xEEEEEEEE, - 0xF222F222, - 0xF555F555, - 0xF777F777, - 0xFAAAFAAA, - 0xFDDDFDDD, - 0xFFFFFFFF, - }; - - if (volume < 0) volume = 0; - if (volume > MAXVOLUME) volume = MAXVOLUME; - - nb = midiOutGetNumDevs(); - for (i = 0; i +#if _BASS && !_LEGACY +#include "bass.h" +#include "bassmidi.h" +#endif + /////////////////////////////////////////////////////////////////////////// #define MAXSOUND 100 @@ -62,13 +67,17 @@ protected: LPDIRECTSOUND m_lpDS; LPDIRECTSOUNDBUFFER m_lpDSB[MAXSOUND]; short m_channelBlupi[MAXBLUPI]; +#if _BASS && !_LEGACY + HSTREAM m_hBassStream; +#else UINT m_MidiDeviceID; +#endif int m_music; - char m_MIDIFilename[50]; int m_audioVolume; int m_midiVolume; int m_lastMidiVolume; int m_nbSuspendSkip; + }; #endif \ No newline at end of file diff --git a/src/soundold.cpp b/src/soundold.cpp new file mode 100644 index 0000000..02c85af --- /dev/null +++ b/src/soundold.cpp @@ -0,0 +1,760 @@ +// sound.cpp +// + +#include "def.h" +#if !_BASS || _LEGACY +#include +#include +#include "sound.h" +#include "misc.h" +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// + +// The following macro are used for proper error handling for DirectSound. +#define TRY_DS(exp) { { HRESULT rval = exp; if (rval != DS_OK) { TraceErrorDS(rval, __FILE__, __LINE__); return FALSE; } } } + + +struct WaveHeader +{ + BYTE RIFF[4]; // "RIFF" + DWORD dwSize; // Size of data to follow + BYTE WAVE[4]; // "WAVE" + BYTE fmt_[4]; // "fmt " + DWORD dw16; // 16 + WORD wOne_0; // 1 + WORD wChnls; // Number of Channels + DWORD dwSRate; // Sample Rate + DWORD BytesPerSec; // Sample Rate + WORD wBlkAlign; // 1 + WORD BitsPerSample; // Sample size + BYTE DATA[4]; // "DATA" + DWORD dwDSize; // Number of Samples +}; + + + + +// Creates a DirectSound buffer. + +BOOL CSound::CreateSoundBuffer(int dwBuf, DWORD dwBufSize, DWORD dwFreq, DWORD dwBitsPerSample, DWORD dwBlkAlign, BOOL bStereo) +{ + PCMWAVEFORMAT pcmwf; + DSBUFFERDESC dsbdesc; + + // Set up wave format structure. + memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT)); + pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; + pcmwf.wf.nChannels = bStereo ? 2 : 1; + pcmwf.wf.nSamplesPerSec = dwFreq; + pcmwf.wf.nBlockAlign = (WORD)dwBlkAlign; + pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; + pcmwf.wBitsPerSample = (WORD)dwBitsPerSample; + + // Set up DSBUFFERDESC structure. + memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); // Zero it out. + dsbdesc.dwSize = sizeof(DSBUFFERDESC); + dsbdesc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME; + dsbdesc.dwBufferBytes = dwBufSize; + dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; + + TRY_DS(m_lpDS->CreateSoundBuffer(&dsbdesc, &m_lpDSB[dwBuf], NULL), 63) + return TRUE; +} + +// I dunno what the fuck this does. +/* +BOOL CSound::ErrorSomething() +{ +if (m_lpDS || +m_lpDSB != 0) +{ +m_lpDS, m_lpDSB->TraceErrorDS; +return FALSE; +} +return TRUE; +} +*/ + + +// Reads in data from a wave file. + +BOOL CSound::ReadData(LPDIRECTSOUNDBUFFER lpDSB, FILE* pFile, DWORD dwSize, DWORD dwPos) +{ + // Seek to correct position in file (if necessary) + if (dwPos != 0xffffffff) + { + if (fseek(pFile, dwPos, SEEK_SET) != 0) + { + return FALSE; + } + } + + // Lock data in buffer for writing + LPVOID pData1; + DWORD dwData1Size; + LPVOID pData2; + DWORD dwData2Size; + HRESULT rval; + + rval = lpDSB->Lock(0, dwSize, &pData1, &dwData1Size, &pData2, &dwData2Size, DSBLOCK_FROMWRITECURSOR); + if (rval != DS_OK) + { + return FALSE; + } + + // Read in first chunk of data + if (dwData1Size > 0) + { + if (fread(pData1, dwData1Size, 1, pFile) != 1) + { + char holder[256]; + wsprintfA(holder, "Data1 : %d, dwdata: %d, pFile: %d", pData1, dwData1Size, pFile); + OutputDebug(holder); + return FALSE; + } + } + + // read in second chunk if necessary + if (dwData2Size > 0) + { + if (fread(pData2, dwData2Size, 1, pFile) != 1) + { + return FALSE; + } + } + + // Unlock data in buffer + rval = lpDSB->Unlock(pData1, dwData1Size, pData2, dwData2Size); + if (rval != DS_OK) + { + return FALSE; + } + + return TRUE; +} + +// Creates a DirectSound buffer from a wave file. + +BOOL CSound::CreateBufferFromWaveFile(int dwBuf, char *pFileName) +{ + // Open the wave file + FILE* pFile = fopen(pFileName, "rb"); + if (pFile == NULL) return FALSE; + + // Read in the wave header + WaveHeader wavHdr; + if (fread(&wavHdr, sizeof(wavHdr), 1, pFile) != 1) + { + fclose(pFile); + return NULL; + } + + // Figure out the size of the data region + DWORD dwSize = wavHdr.dwDSize; + + // Is this a stereo or mono file? + BOOL bStereo = wavHdr.wChnls > 1 ? TRUE : FALSE; + + // Create the sound buffer for the wave file + if (!CreateSoundBuffer(dwBuf, dwSize, wavHdr.dwSRate, + wavHdr.BitsPerSample, wavHdr.wBlkAlign, bStereo)) + { + // Close the file + fclose(pFile); + + return FALSE; + } + + // Read the data for the wave file into the sound buffer + if (!ReadData(m_lpDSB[dwBuf], pFile, dwSize, sizeof(wavHdr))) + { + fclose(pFile); + return FALSE; + } + + // Close out the wave file + fclose(pFile); + + return TRUE; +} + +// Stops all sounds. + +BOOL CSound::StopAllSounds() +{ + // Make sure we have a valid sound buffer + for (int i = 0; i < MAXSOUND; i++) + { + if (m_lpDSB[i]) + { + DWORD dwStatus; + TRY_DS(m_lpDSB[i]->GetStatus(&dwStatus)); + + if ((dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING) + { + TRY_DS(m_lpDSB[i]->Stop()) + } + } + } + + return TRUE; +} + +// Plays a sound using direct sound. + +BOOL CSound::PlaySoundDS(DWORD dwSound, DWORD dwFlags) +{ + // Make sure the sound is valid + if (dwSound >= MAXSOUND) return FALSE; + + // Make sure we have a valid sound buffer + if (m_lpDSB[dwSound]) + { + DWORD dwStatus; + TRY_DS(m_lpDSB[dwSound]->GetStatus(&dwStatus)); + + if ((dwStatus & DSBSTATUS_PLAYING) != DSBSTATUS_PLAYING) + { + // Play the sound + TRY_DS(m_lpDSB[dwSound]->Play(0, 0, dwFlags)); + } + } + + return TRUE; +} + + + +///////////////////////////////////////////////////////////////////////////// + + +// Modifie le volume midi. +// Le volume est compris entre 0 et 20 ! + +void InitMidiVolume(int volume) +{ + int nb, i, n; + MMRESULT result; + HMIDIOUT hmo = 0; + + static int table[21] = + { + 0x00000000, + 0x11111111, + 0x22222222, + 0x33333333, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777, + 0x88888888, + 0x99999999, + 0xAAAAAAAA, + 0xBBBBBBBB, + 0xCCCCCCCC, + 0xDDDDDDDD, + 0xEEEEEEEE, + 0xF222F222, + 0xF555F555, + 0xF777F777, + 0xFAAAFAAA, + 0xFDDDFDDD, + 0xFFFFFFFF, + }; + + if (volume < 0) volume = 0; + if (volume > MAXVOLUME) volume = MAXVOLUME; + + nb = midiOutGetNumDevs(); + for (i = 0; iRelease(); + m_lpDSB[i] = NULL; + } + } + + if (m_lpDS != NULL) + { + m_lpDS->Release(); + m_lpDS = NULL; + } +} + + +// Initialisation de DirectSound. + +BOOL CSound::Create(HWND hWnd) +{ + if (!DirectSoundCreate(NULL, &m_lpDS, NULL) == DS_OK) + { + OutputDebug("Fatal error: DirectSoundCreate\n"); + m_bEnable = FALSE; + return FALSE; + } + + m_lpDS->SetCooperativeLevel(hWnd, DSSCL_NORMAL); + m_bEnable = TRUE; + m_hWnd = hWnd; + return TRUE; +} + + +// Retourne l'�tat de DirectSound. + +BOOL CSound::GetEnable() +{ + return m_bEnable; +} + + +// Enclenche ou d�clenche le son. + +void CSound::SetState(BOOL bState) +{ + m_bState = bState; +} + + +// Gestion des volumes audio (.wav) et midi (.mid). + +void CSound::SetAudioVolume(int volume) +{ + m_audioVolume = volume; +} + +int CSound::GetAudioVolume() +{ + if (!m_bEnable) return 0; + return m_audioVolume; +} + +void CSound::SetMidiVolume(int volume) +{ + m_midiVolume = volume; +} + +int CSound::GetMidiVolume() +{ + if (!m_bEnable) return 0; + return m_midiVolume; +} + + +// Cache tous les ficheirs son (.wav). + +void CSound::CacheAll() +{ + int i; + char name[50]; + + if (!m_bEnable) return; + + for (i = 0; i= MAXSOUND) return FALSE; + + if (m_lpDSB[channel] != NULL) + { + Flush(channel); + } + + return CreateBufferFromWaveFile(channel, pFilename); +} + +// D�charge un son. + +void CSound::Flush(int channel) +{ + if (!m_bEnable) return; + if (channel < 0 || channel >= MAXSOUND) return; + + if (m_lpDSB[channel] != NULL) + { + m_lpDSB[channel]->Release(); + m_lpDSB[channel] = NULL; + } +} + +// Fait entendre un son. +// Le volume est compris entre 0 (max) et -10000 (silence). +// Le panoramique est compris entre -10000 (gauche), 0 (centre) +// et +10000 (droite). + +BOOL CSound::Play(int channel, int volume, int pan) +{ + if (!m_bEnable) return TRUE; + if (!m_bState || m_audioVolume == 0) return TRUE; + + volume -= (MAXVOLUME - m_audioVolume)*((10000 / 4) / MAXVOLUME); + + //? if ( volume == -10000 ) return TRUE; + if (volume <= -10000 / 4) return TRUE; + + if (channel < 0 || channel >= MAXSOUND) return FALSE; + if (m_lpDSB[channel] == NULL) return FALSE; + + m_lpDSB[channel]->SetVolume(volume); + m_lpDSB[channel]->SetPan(pan); + m_lpDSB[channel]->Play(0, 0, 0); + + return TRUE; +} + +BOOL CSound::StopSound(int channel) +{ + if (m_bEnable) return FALSE; + if (m_bState || m_audioVolume == 0) return FALSE; + + if (0 < channel || channel < MAXSOUND) + { + if (m_lpDSB[channel] == NULL) + return (BOOL)m_lpDSB[channel]; + m_lpDSB[channel]->Stop(); + m_lpDSB[channel]->SetCurrentPosition(0); + return TRUE; + } + return FALSE; +} + +// Fait entendre un son dans une image. +// Si rank != -1, il indique le rang du blupi dont il faudra +// �ventuellement stopper le dernier son en cours ! + +BOOL CSound::PlayImage(int channel, POINT pos, int rank) +{ + int stopCh, volumex, volumey, volume, pan; + + if (rank >= 0 && rank < MAXBLUPI) + { + stopCh = m_channelBlupi[rank]; + if (stopCh >= 0 && m_lpDSB[stopCh] != NULL) + { + m_lpDSB[stopCh]->Stop(); // stoppe le son pr�c�dent + m_lpDSB[stopCh]->SetCurrentPosition(0); + } + + m_channelBlupi[rank] = channel; + } + + //? pan = (int)(((long)pos.x*20000L)/LXIMAGE)-10000L; + //? pan = (int)(((long)pos.x*10000L)/LXIMAGE)-5000L; + pan = (int)(((long)pos.x * 5000L) / LXIMAGE) - 2500L; + + volumex = 0; // volume maximum + if (pos.x < 0) + { + volumex = (pos.x * 2500) / LXIMAGE; + } + if (pos.x > LXIMAGE) + { + pos.x -= LXIMAGE; + volumex = (-pos.x * 2500) / LXIMAGE; + } + if (volumex < -10000) volumex = -10000; + + volumey = 0; // volume maximum + if (pos.y < 0) + { + volumey = (pos.y * 2500) / LYIMAGE; + } + if (pos.y > LYIMAGE) + { + pos.y -= LYIMAGE; + volumey = (-pos.y * 2500) / LYIMAGE; + } + if (volumey < -10000) volumey = -10000; + + if (volumex < volumey) volume = volumex; + else volume = volumey; + + return Play(channel, volume, pan); +} + + +// Uses MCI to play a MIDI file. The window procedure +// is notified when playback is complete. + +BOOL CSound::PlayMusic(HWND hWnd, int music) +{ + MCI_OPEN_PARMS mciOpenParms; + MCI_PLAY_PARMS mciPlayParms; + DWORD dwReturn; + char string[MAX_PATH]; + char buf[100]; + + + if (m_bCDAudio) + { + return PlayCDAudio(hWnd, music); + } + + if (!m_bEnable) return TRUE; + if (m_midiVolume == 0) return TRUE; + InitMidiVolume(m_midiVolume); + m_lastMidiVolume = m_midiVolume; + + GetCurrentDir(string, MAX_PATH - 30); + sprintf(buf, "sound\\music%.3d.blp", music - 1); + strcat(string, buf); + + // Open the device by specifying the device and filename. + // MCI will attempt to choose the MIDI mapper as the output port. + mciOpenParms.dwCallback = 0; + mciOpenParms.wDeviceID = 0; + mciOpenParms.lpstrDeviceType = "sequencer"; + mciOpenParms.lpstrElementName = string; + dwReturn = mciSendCommand(NULL, + MCI_OPEN, + MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, + (DWORD)(LPVOID)&mciOpenParms); + if (dwReturn != 0) + { + OutputDebug("PlayMusic-1\n"); + mciGetErrorStringA(dwReturn, string, 128); + OutputDebug(string); + // Failed to open device. Don't close it; just return error. + return FALSE; + } + + // The device opened successfully; get the device ID. + m_MidiDeviceID = mciOpenParms.wDeviceID; + + // Begin playback. + mciPlayParms.dwFrom = 0; + mciPlayParms.dwTo = 0; + mciPlayParms.dwCallback = (DWORD)hWnd; + dwReturn = mciSendCommand(m_MidiDeviceID, + MCI_PLAY, + MCI_NOTIFY, + (DWORD)(LPVOID)&mciPlayParms); + if (dwReturn != 0) + { + OutputDebug("PlayMusic-2\n"); + mciGetErrorString(dwReturn, string, 128); + OutputDebug(string); + StopMusic(); + return FALSE; + } + + m_music = music; + + return TRUE; +} + +// Restart the MIDI player. + +BOOL CSound::RestartMusic() +{ + OutputDebug("RestartMusic\n"); + if (!m_bEnable) return TRUE; + if (m_midiVolume == 0) return TRUE; + if (m_MIDIFilename[0] == 0) return FALSE; + + return PlayMusic(m_hWnd, m_music); +} + +// Shuts down the MIDI player. + +void CSound::SuspendMusic() +{ + if (!m_bEnable) return; + + if (m_nbSuspendSkip != 0) + { + m_nbSuspendSkip--; + return; + } + + if (m_MidiDeviceID && m_midiVolume != 0) + { + mciSendCommand(m_MidiDeviceID, MCI_CLOSE, 0, NULL); + } + m_MidiDeviceID = 0; +} + +// Shuts down the MIDI player. + +void CSound::StopMusic() +{ + SuspendMusic(); + m_MIDIFilename[0] = 0; +} + +// Retourne TRUE si une musique est en cours. + +BOOL CSound::IsPlayingMusic() +{ + return (m_MIDIFilename[0] != 0); +} + +// Adapte le volume de la musique en cours, si n�cessaire. + +void CSound::AdaptVolumeMusic() +{ + if (m_midiVolume != m_lastMidiVolume) + { + InitMidiVolume(m_midiVolume); + m_lastMidiVolume = m_midiVolume; + RestartMusic(); + } +} + +// Indique le nombre de suspend � sauter. + +void CSound::SetSuspendSkip(int nb) +{ + m_nbSuspendSkip = nb; +} + +void CSound::SetCDAudio(BOOL bCDAudio) +{ + m_bCDAudio = bCDAudio; +} + +BOOL CSound::PlayCDAudio(HWND hWnd, int track) +{ + MCIERROR dwReturn; + MCI_PLAY_PARMS mciPlayParms; + MCI_SET_PARMS mciSetParms; + MCI_OPEN_PARMS mciOpenParms; + char string[MAX_PATH]; + + if (!m_bEnable) return TRUE; + if (m_midiVolume == 0) return TRUE; + InitMidiVolume(m_midiVolume); + m_lastMidiVolume = m_midiVolume; + mciOpenParms.dwCallback = 0; + mciOpenParms.wDeviceID = 0; + mciOpenParms.lpstrAlias = NULL; + mciOpenParms.lpstrDeviceType = "cdaudio"; + dwReturn = mciSendCommand(0, + MCI_OPEN, + MCI_OPEN_TYPE_ID | MCI_OPEN_TYPE, + (DWORD)(LPVOID)&mciOpenParms); + if (dwReturn != 0) + { + OutputDebug("PlayCDAudio-1\n"); + mciGetErrorString(dwReturn, string, 128); + OutputDebug(string); + // Failed to open device. Don't close it; just return error. + return FALSE; + } + + // The device opened successfully; get the device ID. + m_MidiDeviceID = mciOpenParms.wDeviceID; + + mciSetParms.dwCallback = 0; + mciSetParms.dwAudio = 0; + mciSetParms.dwTimeFormat = MCI_FORMAT_TMSF; + + dwReturn = mciSendCommand(mciOpenParms.wDeviceID, + MCI_SET, + MCI_SET_TIME_FORMAT, + (DWORD)(LPVOID)&mciSetParms); + + if (dwReturn != 0) + { + OutputDebug("PlayCDAudio-2\n"); + mciGetErrorString(dwReturn, string, 128); + OutputDebug(string); + StopMusic(); + return FALSE; + } + + mciPlayParms.dwCallback = (DWORD)(LPVOID)hWnd; + mciPlayParms.dwFrom = track; + mciPlayParms.dwTo = track + 1; + dwReturn = mciSendCommand(m_MidiDeviceID, + MCI_PLAY, + MCI_TRACK | MCI_NOTIFY | MCI_WAIT, + (DWORD)(LPVOID)&mciPlayParms); + + if (dwReturn != 0) + { + OutputDebug("PlayCDAudio-3\n"); + mciGetErrorString(dwReturn, string, 128); + OutputDebug(string); + StopMusic(); + return FALSE; + } + + m_music = track; + + return TRUE; +} + +#endif \ No newline at end of file