The latest released version of QTMPlayer is 0.25, as included with QTMPlay 2.26 and above.
0.02
- Finally completed all layer functions
0.03
- Preserved volume, tss, quality between layers
0.04
- Restructured header format and added QTMPlayer_Info SWI
- Changed errors in error messages
- Fixed small bug that crept in to do with RecogniseFile
- Added skip in so that layers weren't remounted when playing another song
0.05
- Changed SWI prefix and module name to QTMPlayer
- Added position find/set
- QTMPlayer automatically loads and kills modules as reqd - hurrah!
- Fixed small bug where QTMPlayer_Load used the wrong detection type to find out if a layer was engaged
- Tightened up layer validity checking on entry to SWIs
- Fixed problems with quality/volume/TSS preserve between layers
0.06
- Fixed rather major bug to do with dismounting layers and remounting others
0.07
- Added skeleton carousel support
- Fixed bugs to do with not checking fatality indicator on entry to finalisation code
- QTMPlayer_RecogniseFile automatically detects file type
- Fixed loads of clumsy bugs in RecogniseFile and Load
- Carousel support finished (more or less)
- Changed layers to directories
- Changed layer format accordingly
- Changed SWI chunk base (Acorn allocated!)
0.08
- Added fail and continue code for callback. If all songs have failed, carousel stops, too!
- Fixed QTMPlayer_Position bugs
- Fixed problems on finalisation when reloading QTMPlayer (-carousel)
- Added documentation on QTMPlayer_Choices SWI (it wasn't in documentation, and SWI numbers for SWIs higher than it were wrong!)
0.10
- Moved all writable values into workspace for the kernel (phew!) and fixed several bugs in the process
- Added QTMPlayer_Info(3) mainly for debugging
- Fixed those damn QTMPlayer_Position bugs once and for all!
0.11
- Enabled carousel support (no testing as yet, though)
- Made layer_dismount() a separate function
- Removed several silly bugs that never showed up before because of other bugs
- Wrote Xenakis8 layer
0.12
- Added bit on enter_layer() to stop it branching to null words in the jump table
- Major change -- made layers load songs into dynamic area/sprite area
- Lost "Library" source code -- reconstructed it from a (fairly) old backup
- Made FNlog/logf preserve state of V bit (caused several errors before)
- Fixed several bugs (most of them introduced during this version)
- Stopped song before trying to load a new one (otherwise layers like Xenakis give an error 'can't load a song whilst one is playing'
- Updated to 1.40 of DSymphonyPlayer but didn't fix 8 channels bug
- Changed absence of sample name returned from the Symphony layer into 'Not supported'
- Changed workspace pointer to R12 on entry to layer stubs
- Made QTMPlayer actually pass the value in R0 of the layer's pathname when calling start()
- Added skeleton matrixTRK support
- Added null-branch-word in recognise stub support. If the branch word is zero for the recognise stub, QTMPlayer scans through the list of filetypes instead
- Added extra layer of protection so none of the SWIs will budge unless a layer has been loaded in (apart from QTMPlayer_Layer, of course)
- Fixed small typo in Carousel
- Made QTMPlayer StrongARM compatible!
- Made sure that when a non-existant file was loaded QTMPlayer didn't try to reserve whatever value was returned in R4 for the song, and traps the non-file type return in R0 properly
0.20 Largely rewritten parts in v0.20 incompatible with earlier versions
- Memory wastages removed (in the workblock)
- Stack usage optimisation
- Sample SWIs consolidated into a single SWI : QTMPlayer_Sample
- SWIs reordered
- QTMPlayer_RecogniseFile renamed to QTMPlayer_Recognise
- QTMPlayer_TransparentSoundSystem renamed to QTMPlayer_SoundSystem and made into a generic sound-system interface (the only thing that can be set at present is the TSS state)
- SongName/Author/Duration consolidated into QTMPlayer_SongInfo SWI
- Strings that previously return NULL now return a pointer to a null string instead (stops silly crahses)
- QTMPlayer_Load extended to recognise file and load in one pass
- Rewrote layer loader routine to be faster and (hopefully) less bug-ridden!
- Finally supported filesize stub
- Changed to version 1.27 of QTMTracker
- Upgraded Xenakis layers not to attempt to reserve any file size (Xenakis uses RMA)
- Added facility to play a sample at a specified note value and volume
- Fixed Coconizer layer (complained of missing error block)
- I've finally spotted the cause of the address exception on loading dodgy files bug -- QTMPlay was trying to access an error pointer that was inside an *RMKill'd module. I fixed it by copying out any errors returned from layers
- I also found out that the bug specific to loading zero-length files of protracker type is actually a bug in QTMTracker (or the OS...). I made a work-a-round in the layer to return an error if anyone tries to load a zero-length file
0.21
- Added a few missing V_set_on_exit handlers
- Changed the non-fatal initialisation code so that it would work
- Fixed broken matrixTRK loading support
0.22
- Increased amount of extra module loading space to 16k
- Added Tracker support
0.23
- Removed auto-start from load stub
0.24
- Updated DSymphony to SA-compatible version
- Updated matrixTRK to v0.89, provisional SA-compatible version
- Updated Tracker to v4.09, SA-compatible version
0.25
- Added DSym_ResetParams and name-checking to DSym layer
- Replaced Dynamite song areas with RMA ones on pre-RISC OS 3.5 machines (locked Dynamite heaps were fragmenting badly)
- Added diagnostics to matrix_TRKValidity errors
- Finally fixed matrixTRK loading problem -- I'd accidentally replaced the "matrixTRK" file with the 8 channel version!
- Added C-veneers
- Traced finalise errors to a SYS "QTMPlayer_Unload" in QTMPlay, when
QTMTracker claimed "Bad vector release". In layer_dismount, one of
the registers was getting trashed when QTMTracker returned an error,
and QTMTracker subsequently did a
Ldr r1,[rx,#offset] and caused
an address exception
- Added QTMPlayer_Layer 2 (supported functions) SWI