oggloader.bmx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. Strict
  2. Rem
  3. bbdoc: Audio/OGG loader
  4. about:
  5. The OGG loader module provides the ability to load OGG format #{audio samples}.
  6. End Rem
  7. Module BRL.OGGLoader
  8. ModuleInfo "Version: 1.04"
  9. ModuleInfo "Author: Simon Armstrong"
  10. ModuleInfo "License: zlib/libpng"
  11. ModuleInfo "Copyright: Blitz Research Ltd"
  12. ModuleInfo "Modserver: BRL"
  13. ModuleInfo "History: 1.04 Release"
  14. ModuleInfo "History: Moved SaveOgg to module axe.saveogg"
  15. ModuleInfo "History: 1.03 Release"
  16. ModuleInfo "History: Added Function SaveOgg"
  17. ModuleInfo "History: 1.02 Release"
  18. ModuleInfo "History: Fixed reading past end of stream with some short files"
  19. Import Pub.OggVorbis
  20. Import BRL.AudioSample
  21. Private
  22. Function readfunc( buf@Ptr,size,nmemb,src:Object )
  23. Local bytes:Long=TStream(src).Read(buf,size*nmemb)
  24. Return bytes/size
  25. End Function
  26. Function seekfunc( src_obj:Object,offset:Long,whence )
  27. Local src:TStream=TStream(src_obj)
  28. Return src.Seek(offset, whence)
  29. End Function
  30. Function closefunc( src:Object )
  31. End Function
  32. Function tellfunc:Long( src:Object )
  33. Return TStream(src).Pos()
  34. End Function
  35. Type TAudioSampleLoaderOGG Extends TAudioSampleLoader
  36. Method LoadAudioSample:TAudioSample( stream:TStream ) Override
  37. Local samples,channels,freq
  38. Local ogg:Byte Ptr=Decode_Ogg(stream,readfunc,seekfunc,closefunc,tellfunc,samples,channels,freq)
  39. If Not ogg Return
  40. Local format
  41. ?BigEndian
  42. If channels=1 format=SF_MONO16BE Else format=SF_STEREO16BE
  43. ?LittleEndian
  44. If channels=1 format=SF_MONO16LE Else format=SF_STEREO16LE
  45. ?
  46. Local size=samples*2*channels
  47. Local sample:TAudioSample=TAudioSample.Create( samples,freq,format )
  48. 'negative amounts indicate an error, 0 = EOF, >0 = amount of bytes
  49. Local bytesRead:Int = Read_Ogg( ogg,sample.samples,size )
  50. Read_Ogg( ogg,Null,0 )
  51. If bytesRead <= 0 Return
  52. Return sample
  53. End Method
  54. End Type
  55. AddAudioSampleLoader New TAudioSampleLoaderOGG