oggloader.bmx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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=TStream(src).Read(buf,size*nmemb)
  24. Return bytes/size
  25. End Function
  26. Function seekfunc( src_obj:Object,off0,off1,whence )
  27. Local off
  28. Local src:TStream=TStream(src_obj)
  29. ?X86
  30. off=off0
  31. ?PPC
  32. off=off1
  33. ?
  34. Local res=-1
  35. Select whence
  36. Case 0
  37. res=src.Seek(off) 'SEEK_SET
  38. Case 1
  39. res=src.Seek(src.Pos()+off) 'SEEK_CUR
  40. Case 2
  41. res=src.Seek(src.Size()+off) 'SEEK_END
  42. End Select
  43. If res>=0 Return 0
  44. Return -1
  45. End Function
  46. Function closefunc( src:Object )
  47. End Function
  48. Function tellfunc( src:Object )
  49. Return TStream(src).Pos()
  50. End Function
  51. Type TAudioSampleLoaderOGG Extends TAudioSampleLoader
  52. Method LoadAudioSample:TAudioSample( stream:TStream )
  53. Local samples,channels,freq
  54. Local ogg:Byte Ptr=Decode_Ogg(stream,readfunc,seekfunc,closefunc,tellfunc,samples,channels,freq)
  55. If Not ogg Return
  56. Local format
  57. ?PPC
  58. If channels=1 format=SF_MONO16BE Else format=SF_STEREO16BE
  59. ?X86
  60. If channels=1 format=SF_MONO16LE Else format=SF_STEREO16LE
  61. ?
  62. Local size=samples*2*channels
  63. Local sample:TAudioSample=TAudioSample.Create( samples,freq,format )
  64. Local err=Read_Ogg( ogg,sample.samples,size )
  65. Read_Ogg( ogg,Null,0 )
  66. If err Return
  67. Return sample
  68. End Method
  69. End Type
  70. AddAudioSampleLoader New TAudioSampleLoaderOGG