home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / Simple_Amp171695362004.psc / clsFmod.cls < prev   
Text File  |  2003-10-10  |  23KB  |  734 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsFMOD"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'ClsFMOD - An easy to use class interface for FMOD
  15. 'Version 1.2 - 16:29 2003-10-02
  16. 'By Paul Berlin for Simple Amp
  17.  
  18. Option Explicit
  19.  
  20. Private Const SHOW_ERROR_MSGBOX As Boolean = True
  21.  
  22. Dim lStreamPtr  As Long   'Pointer to loaded stream
  23. Dim lChannel    As Long   'Pointer to used channel
  24. Dim lModulePtr  As Long   'Pointer to loaded module
  25.  
  26. Private Sub Class_Terminate()
  27.   On Error Resume Next
  28.   
  29.   ManStopped = True
  30.   
  31.   FSOUND_StopSound FSOUND_ALL
  32.   If lStreamPtr <> 0 Then FSOUND_Stream_Close lStreamPtr
  33.   If lModulePtr <> 0 Then
  34.     FMUSIC_StopSong lModulePtr
  35.     FMUSIC_FreeSong lModulePtr
  36.   End If
  37.   FSOUND_Close
  38.   
  39. End Sub
  40.  
  41. '------------------------
  42. 'INITIALIZATION FUNCTIONS
  43. '------------------------
  44.  
  45. Public Function Init(ByVal lMixrate As Long, ByVal lMaxChannels As Long) As Boolean
  46.   'This inits FMOD with selected settings
  47.   On Error GoTo errh
  48.   Init = True
  49.   
  50.   If FSOUND_Init(lMixrate, lMaxChannels, FSOUND_INIT_GLOBALFOCUS Or FSOUND_INIT_ACCURATEVULEVELS Or FSOUND_INIT_ENABLEOUTPUTFX) = False Then GoTo errh
  51.   
  52.   Exit Function
  53. errh:
  54.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  55.   Init = False
  56. End Function
  57.  
  58. Public Function ReturnDrivers(ByRef sDrvArray() As String) As Boolean
  59.   'This returns the names of availabe drives in the array
  60.   'Output must be set before using this or there will be 0 drivers
  61.   On Error GoTo errh
  62.   
  63.   Dim X As Integer
  64.   
  65.   If FSOUND_GetNumDrivers > 0 Then
  66.   
  67.     ReDim sDrvArray(FSOUND_GetNumDrivers - 1)
  68.     For X = 0 To FSOUND_GetNumDrivers - 1
  69.       sDrvArray(X) = GetStringFromPointer(FSOUND_GetDriverName(X))
  70.     Next X
  71.     
  72.     ReturnDrivers = True
  73.   Else
  74.     ReturnDrivers = False
  75.   End If
  76.   
  77.   Exit Function
  78. errh:
  79.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  80.   ReturnDrivers = False
  81. End Function
  82.  
  83. Public Function InitOutput(ByVal eOutType As FSOUND_OUTPUTTYPES) As Boolean
  84.   'Sets output type
  85.   'MUST BE CALLED BEFORE Init, If you do not call this before Init,
  86.   'the best output type will be autodetected.
  87.   'use ReturnDrivers to see which drives support the selected output type
  88.   On Error GoTo errh
  89.   InitOutput = True
  90.   
  91.   If FSOUND_SetOutput(eOutType) = False Then GoTo errh
  92.   
  93.   Exit Function
  94. errh:
  95.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  96.   InitOutput = False
  97. End Function
  98.  
  99. Public Function InitMixer(ByVal eMixerType As FSOUND_MIXERTYPES) As Boolean
  100.   'Sets mixer to use
  101.   'MUST BE CALLED BEFORE Init, If you do not call this before Init,
  102.   'the best mixer type will be autodetected.
  103.   On Error GoTo errh
  104.   InitMixer = True
  105.   
  106.   If FSOUND_SetMixer(eMixerType) = False Then GoTo errh
  107.   
  108.   Exit Function
  109. errh:
  110.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  111.   InitMixer = False
  112. End Function
  113.  
  114. Public Function InitBuffer(ByVal lBufferLenMs As Long) As Boolean
  115.   'Sets buffer size in milliseconds.
  116.   'Buffer size < 100 might cause problem on certain settings.
  117.   'MUST BE CALLED BEFORE Init, If you do not call this before init,
  118.   'an optimal value will be autodetected.
  119.   InitBuffer = True
  120.   
  121.   If FSOUND_SetBufferSize(lBufferLenMs) = False Then GoTo errh
  122.  
  123.   Exit Function
  124. errh:
  125.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  126.   InitBuffer = False
  127. End Function
  128.  
  129. Public Function InitDriver(ByVal iDriveNum As Integer) As Boolean
  130.   'Must be called before init, If you do not call this before init,
  131.   'an the default driver will be selected.
  132.   'Drive num 0 will set to default driver.
  133.   'You can get available drivers and their numbers with ReturnDrivers.
  134.   On Error GoTo errh
  135.   InitDriver = True
  136.   
  137.   If FSOUND_SetDriver(iDriveNum) = False Then GoTo errh
  138.   
  139.   Exit Function
  140. errh:
  141.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  142.   InitDriver = False
  143. End Function
  144.  
  145. '----------------
  146. 'STREAM FUNCTIONS
  147. '----------------
  148. 'Plays mp3, mp2, wma, ogg, wav, asf, midi
  149.  
  150. Public Function StreamPlay(ByVal sFilename As String, Optional ByVal bVBR As Boolean = False, Optional bVolume As Byte = 255) As Boolean
  151.   'Will play the sFilename stream.
  152.   'bVBR is for variable bitrate mp3s.
  153.   On Error GoTo errh
  154.   StreamPlay = True
  155.  
  156.   FSOUND_StopSound FSOUND_ALL
  157.   If lStreamPtr <> 0 Then FSOUND_Stream_Close lStreamPtr
  158.   
  159.   If bVBR Then
  160.     lStreamPtr = FSOUND_Stream_Open(sFilename, FSOUND_NORMAL Or FSOUND_MPEGACCURATE, 0, 0)
  161.   Else
  162.     lStreamPtr = FSOUND_Stream_Open(sFilename, FSOUND_NORMAL, 0, 0)
  163.   End If
  164.   
  165.   If lStreamPtr = 0 Then
  166.     MsgBox "Could not recognize & play """ & sFilename & """.", vbExclamation, "FMOD Error"
  167.     StreamPlay = False
  168.     Exit Function
  169.   End If
  170.   
  171.   lChannel = FSOUND_Stream_Play(FSOUND_FREE, lStreamPtr)
  172.   FSOUND_SetVolume lChannel, bVolume
  173.   
  174.   'lChannel = FSOUND_PlaySoundEx(FSOUND_FREE, lStreamPtr, 0, True)
  175.   'FSOUND_SetPaused lChannel, False
  176.   'Call FSOUND_Stream_SetEndCallback(lStreamPtr, AddressOf StreamEndCallback, 0)
  177.   
  178.   Exit Function
  179. errh:
  180.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  181.   StreamPlay = False
  182. End Function
  183.  
  184. Public Function StreamPausePlay() As Boolean
  185.   'this will pause or play the current stream
  186.   On Error GoTo errh
  187.   
  188.   If lStreamPtr <> 0 Then
  189.     StreamPausePlay = True
  190.     
  191.     ManStopped = Not CBool(FSOUND_GetPaused(lChannel))
  192.     FSOUND_SetPaused lChannel, ManStopped
  193.     
  194.   End If
  195.   
  196.   Exit Function
  197. errh:
  198.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  199.   StreamPausePlay = False
  200. End Function
  201.  
  202. Public Function StreamStop() As Boolean
  203.   'this will stop and restart stream
  204.   On Error GoTo errh
  205.   StreamStop = True
  206.  
  207.   If lStreamPtr <> 0 Then
  208.     StreamStop = True
  209.     
  210.     If lChannel <> 0 Then
  211.       ManStopped = True
  212.       FSOUND_StopSound lChannel
  213.       FSOUND_Stream_SetTime lStreamPtr, 0
  214.       lChannel = 0
  215.     Else
  216.       lChannel = FSOUND_Stream_Play(FSOUND_FREE, lStreamPtr)
  217.     End If
  218.     
  219.   End If
  220.  
  221.   Exit Function
  222. errh:
  223.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  224.   StreamStop = False
  225. End Function
  226.  
  227. Public Function StreamUnload() As Boolean
  228.   'this will stop and unload stream
  229.   On Error GoTo errh
  230.   StreamUnload = True
  231.  
  232.   ManStopped = True
  233.   FSOUND_StopSound FSOUND_ALL
  234.   If lStreamPtr <> 0 Then FSOUND_Stream_Close lStreamPtr
  235.   lStreamPtr = 0
  236.   lChannel = 0
  237.  
  238.   Exit Function
  239. errh:
  240.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  241.   StreamUnload = False
  242. End Function
  243.  
  244. Public Property Get StreamFrequency() As Long
  245.   'NOTE: FSOUND_GetFrequency(Channel) does not seem to work with wma, asf
  246.   StreamFrequency = FSOUND_GetFrequency(lChannel)
  247. End Property
  248.  
  249. Public Property Let StreamFrequency(ByVal lFreq As Long)
  250.   FSOUND_SetFrequency lChannel, lFreq
  251. End Property
  252.  
  253. Public Property Get StreamVolume() As Byte
  254.   StreamVolume = FSOUND_GetVolume(lChannel)
  255. End Property
  256.  
  257. Public Property Let StreamVolume(ByVal bVolume As Byte)
  258.   FSOUND_SetVolume lChannel, bVolume
  259. End Property
  260.  
  261. Public Property Get StreamIsLoaded() As Boolean
  262.   StreamIsLoaded = (lStreamPtr <> 0)
  263. End Property
  264.  
  265. Public Property Get StreamIsPlaying() As Boolean
  266.   If lChannel <> 0 Then
  267.     StreamIsPlaying = (FSOUND_GetPaused(lChannel) = 0)
  268.   End If
  269. End Property
  270.  
  271. Public Property Get StreamSongLen() As Long
  272.   If lStreamPtr <> 0 Then
  273.     StreamSongLen = FSOUND_Stream_GetLengthMs(lStreamPtr)
  274.   End If
  275. End Property
  276.  
  277. Public Property Get StreamSongPos() As Long
  278.   If lStreamPtr <> 0 And lChannel <> 0 Then
  279.     StreamSongPos = FSOUND_Stream_GetTime(lStreamPtr)
  280.   End If
  281. End Property
  282.  
  283. Public Property Let StreamSongPos(ByVal lPos As Long)
  284.   If lStreamPtr <> 0 And lChannel <> 0 Then
  285.     FSOUND_Stream_SetTime lStreamPtr, lPos
  286.   End If
  287. End Property
  288.  
  289. Public Property Get StreamKbps() As Long
  290.   'This calculates Kbps by dividing length of stream in bits with length of stream in seconds.
  291.   On Error Resume Next
  292.   StreamKbps = (FSOUND_Stream_GetLength(lStreamPtr) \ (FSOUND_Stream_GetLengthMs(lStreamPtr) \ 1000)) * 8 \ 1000
  293. End Property
  294.  
  295. Public Property Get StreamPanning() As Byte
  296.   StreamPanning = FSOUND_GetPan(lChannel)
  297. End Property
  298.  
  299. Public Property Let StreamPanning(ByVal bPanning As Byte)
  300.   If bPanning = 128 Then
  301.     FSOUND_SetPan FSOUND_ALL, FSOUND_STEREOPAN
  302.   Else
  303.     FSOUND_SetPan FSOUND_ALL, bPanning
  304.   End If
  305. End Property
  306.  
  307. Public Property Get StreamSurround() As Boolean
  308.   StreamSurround = FSOUND_GetSurround(lChannel)
  309. End Property
  310.  
  311. Public Property Let StreamSurround(ByVal bSurround As Boolean)
  312.   Call FSOUND_SetSurround(FSOUND_ALL, bSurround)
  313. End Property
  314.  
  315. 'the below stream functions are used to get info from the stream
  316. 'when you do not want to play it
  317. 'use GetStreamOpenFile to open a file
  318. 'use GetStreamCloseFile to close it after you are done
  319. 'not closing after you are done will produce errors or hangs
  320.  
  321. Public Function GetStreamOpenFile(ByVal sFilename As String, Optional ByVal bVBR As Boolean = False) As Long
  322.   'opens file and returns handle
  323.   'make sure you close handle with GetStreamCloseFile later
  324.   
  325.   If bVBR Then
  326.     GetStreamOpenFile = FSOUND_Stream_Open(sFilename, FSOUND_NORMAL Or FSOUND_MPEGACCURATE, 0, 0)
  327.   Else
  328.     GetStreamOpenFile = FSOUND_Stream_Open(sFilename, FSOUND_NORMAL, 0, 0)
  329.   End If
  330.   
  331. End Function
  332.  
  333. Public Sub GetStreamCloseFile(ByVal lHandle As Long)
  334.   'closes file opened with GetStreamOpenFile
  335.   
  336.   Call FSOUND_Stream_Close(lHandle)
  337.   
  338. End Sub
  339.  
  340. Public Function GetStreamLength(ByVal lHandle As Long) As Long
  341.   'gets length of opened stream
  342.   
  343.   GetStreamLength = FSOUND_Stream_GetLengthMs(lHandle) / 1000
  344.   
  345. End Function
  346.  
  347. Public Function GetStreamTag(ByVal lHandle As Long, ByVal eTag As FSOUND_TAGFIELD_TYPE, ByRef sTagName As String) As String
  348.   'gets a tag from opened stream handle
  349.   Dim lFieldvalue As Long
  350.   Dim lFieldlength As Long
  351.   
  352.   If FSOUND_Stream_FindTagField(lHandle, eTag, sTagName, lFieldvalue, lFieldlength) Then
  353.     If eTag = FSOUND_TAGFIELD_ID3V2 Then
  354.       If sTagName = "COMM" Or Left(sTagName, 1) = "W" Then
  355.         'comment tag may contain other information than just the comment,
  356.         'seperated by chr(0), but the comment is always last.
  357.         'We extract the comment from the other information below
  358.         GetStreamTag = GetStringFromPointerEx(lFieldvalue, lFieldlength)
  359.         GetStreamTag = Left(GetStreamTag, Len(GetStreamTag) - 1)
  360.         GetStreamTag = Mid(GetStreamTag, InStrRev(GetStreamTag, Chr(0)) + 1)
  361.       Else
  362.         GetStreamTag = Trim(Replace(GetStringFromPointerEx(lFieldvalue, lFieldlength), Chr(0), " "))
  363.       End If
  364.     Else
  365.       GetStreamTag = Trim(GetStringFromPointer(lFieldvalue))
  366.     End If
  367.   End If
  368.   
  369. End Function
  370.  
  371. Public Function GetStreamTagNumTags(ByVal lHandle As Long) As Long
  372.   Call FSOUND_Stream_GetNumTagFields(lHandle, GetStreamTagNumTags)
  373. End Function
  374.  
  375. Public Sub GetStreamTagByNum(ByVal lHandle As Long, ByVal lNum As Long, ByRef eTagType As FSOUND_TAGFIELD_TYPE, ByRef sTagName As String, ByRef sTagValue As String)
  376.   Dim lVal As Long, lLen As Long, lName As Long
  377.   Call FSOUND_Stream_GetTagField2(lHandle, lNum, eTagType, lName, lVal, lLen)
  378.   
  379.   sTagName = sNT(GetStringFromPointer(lName))
  380.   
  381.   If eTagType = FSOUND_TAGFIELD_ID3V2 Then
  382.     If sTagName = "COMM" Or Left(sTagName, 1) = "W" Then
  383.       'comment tag may contain other information than just the comment,
  384.       'seperated by chr(0), but the comment is always last.
  385.       'We extract the comment from the other information below
  386.       sTagValue = GetStringFromPointerEx(lVal, lLen)
  387.       sTagValue = Left(sTagValue, Len(sTagValue) - 1)
  388.       sTagValue = Mid(sTagValue, InStrRev(sTagValue, Chr(0)) + 1)
  389.     Else
  390.       sTagValue = Trim(Replace(GetStringFromPointerEx(lVal, lLen), Chr(0), " "))
  391.     End If
  392.   Else
  393.     sTagValue = Trim(Replace(GetStringFromPointerEx(lVal, lLen), Chr(0), " "))
  394.   End If
  395.   
  396. End Sub
  397.  
  398. '---------------
  399. 'MUSIC FUNCTIONS
  400. '---------------
  401. 'Plays Mod, S3m, Xm, It, Midi, Rmi, Sgt
  402.  
  403. Public Function MusicPlay(ByVal sFilename As String, Optional ByVal bLoopit As Boolean = False, Optional bVolume As Byte = 255) As Boolean
  404.   'Will play the filename music
  405.   On Error GoTo errh
  406.   MusicPlay = True
  407.  
  408.   If lModulePtr <> 0 Then
  409.     FMUSIC_StopSong lModulePtr
  410.     FMUSIC_FreeSong lModulePtr
  411.   End If
  412.   lModulePtr = FMUSIC_LoadSong(sFilename)
  413.   
  414.   If lModulePtr = 0 Then
  415.     MsgBox "Could not recognize & play """ & sFilename & """.", vbExclamation, "FMOD Error"
  416.     MusicPlay = False
  417.     Exit Function
  418.   End If
  419.   
  420.   Call FMUSIC_SetLooping(lModulePtr, bLoopit)
  421.   Call FMUSIC_PlaySong(lModulePtr)
  422.   FMUSIC_SetMasterVolume lModulePtr, bVolume
  423.  
  424.   Exit Function
  425. errh:
  426.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  427.   MusicPlay = False
  428. End Function
  429.  
  430. Public Function MusicStop() As Boolean
  431.   'this will stop and resume music
  432.   On Error GoTo errh
  433.  
  434.   If lModulePtr <> 0 Then
  435.     MusicStop = True
  436.     If FMUSIC_IsPlaying(lModulePtr) Then
  437.       FMUSIC_StopSong lModulePtr
  438.     Else
  439.       FMUSIC_PlaySong lModulePtr
  440.     End If
  441.   End If
  442.     
  443.   Exit Function
  444. errh:
  445.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  446.   MusicStop = False
  447. End Function
  448.  
  449. Public Function MusicUnload() As Boolean
  450.   'this will stop and unload music
  451.   On Error GoTo errh
  452.  
  453.   If lModulePtr <> 0 Then
  454.     MusicUnload = True
  455.     FMUSIC_StopSong lModulePtr
  456.     FMUSIC_FreeSong lModulePtr
  457.     lModulePtr = 0
  458.   End If
  459.     
  460.  
  461.   Exit Function
  462. errh:
  463.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  464.   MusicUnload = False
  465. End Function
  466.  
  467. Public Function MusicPausePlay() As Boolean
  468.   'this will stop and unload music
  469.   On Error GoTo errh
  470.  
  471.   If lModulePtr <> 0 Then
  472.     MusicPausePlay = True
  473.  
  474.     FMUSIC_SetPaused lModulePtr, Not FMUSIC_GetPaused(lModulePtr)
  475.   End If
  476.     
  477.  
  478.   Exit Function
  479. errh:
  480.   If SHOW_ERROR_MSGBOX Then MsgBox FSOUND_GetErrorString(FSOUND_GetError), vbCritical, "FMOD Error"
  481.   MusicPausePlay = False
  482. End Function
  483.  
  484. Public Property Get MusicVolume() As Byte
  485.   MusicVolume = FMUSIC_GetMasterVolume(lModulePtr)
  486. End Property
  487.  
  488. Public Property Let MusicVolume(ByVal bVolume As Byte)
  489.   FMUSIC_SetMasterVolume lModulePtr, bVolume
  490. End Property
  491.  
  492. Public Property Get MusicName() As String
  493.   MusicName = GetStringFromPointer(FMUSIC_GetName(lModulePtr))
  494. End Property
  495.  
  496. Public Property Get MusicNumChannels() As Long
  497.   MusicNumChannels = FMUSIC_GetNumChannels(lModulePtr)
  498. End Property
  499.  
  500. Public Property Get MusicNumIntruments() As Long
  501.   MusicNumIntruments = FMUSIC_GetNumInstruments(lModulePtr)
  502. End Property
  503.  
  504. Public Property Get MusicNumOrders() As Long
  505.   MusicNumOrders = FMUSIC_GetNumOrders(lModulePtr)
  506. End Property
  507.  
  508. Public Property Get MusicNumPatterns() As Long
  509.   MusicNumPatterns = FMUSIC_GetNumPatterns(lModulePtr)
  510. End Property
  511.  
  512. Public Property Get MusicNumSamples() As Long
  513.   MusicNumSamples = FMUSIC_GetNumSamples(lModulePtr)
  514. End Property
  515.  
  516. Public Property Get MusicBPM() As Long
  517.   MusicBPM = FMUSIC_GetBPM(lModulePtr)
  518. End Property
  519.  
  520. Public Property Get MusicIsLoaded() As Boolean
  521.   If lModulePtr <> 0 Then MusicIsLoaded = True
  522. End Property
  523.  
  524. Public Property Get MusicOrder() As Long
  525.   MusicOrder = FMUSIC_GetOrder(lModulePtr)
  526. End Property
  527.  
  528. Public Property Let MusicOrder(ByVal lNewOrder As Long)
  529.   FMUSIC_SetOrder lModulePtr, lNewOrder
  530. End Property
  531.  
  532. Public Property Get MusicPattern() As Long
  533.   MusicPattern = FMUSIC_GetPattern(lModulePtr)
  534. End Property
  535.  
  536. Public Property Get MusicRow() As Long
  537.   MusicRow = FMUSIC_GetRow(lModulePtr)
  538. End Property
  539.  
  540. Public Property Get MusicSpeed() As Long
  541.   MusicSpeed = FMUSIC_GetSpeed(lModulePtr)
  542. End Property
  543.  
  544. Public Property Get MusicTime() As Long
  545.   MusicTime = FMUSIC_GetTime(lModulePtr)
  546. End Property
  547.  
  548. Public Property Get MusicIsPlaying() As Boolean
  549.   If FMUSIC_GetPaused(lModulePtr) = False Then
  550.     MusicIsPlaying = FMUSIC_IsPlaying(lModulePtr)
  551.   End If
  552. End Property
  553.  
  554. Public Property Get MusicIsFinished() As Boolean
  555.   MusicIsFinished = FMUSIC_IsFinished(lModulePtr)
  556. End Property
  557.  
  558. Public Property Get MusicNumRows() As Long
  559.   MusicNumRows = FMUSIC_GetPatternLength(lModulePtr, FMUSIC_GetOrder(lModulePtr))
  560. End Property
  561.  
  562. Public Property Let MusicPanSep(ByVal sPan As Single)
  563.   FMUSIC_SetPanSeperation lModulePtr, sPan
  564. End Property
  565.  
  566. Public Property Get MusicSongLen() As Long
  567.   'This will calculate the songs length in ms
  568.   'This is mostly accurate, but can be highly inaccurate
  569.   On Error Resume Next
  570.   Dim Kbps As Double, st As Double, i As Long, t As Long
  571.   
  572.   Kbps = (FMUSIC_GetBPM(lModulePtr) * 2) / 5
  573.   st = ((1 / Kbps) * 1000) * FMUSIC_GetSpeed(lModulePtr)
  574.  
  575.   For i = 0 To (FMUSIC_GetNumOrders(lModulePtr) - 1)
  576.     t = t + FMUSIC_GetPatternLength(lModulePtr, i)
  577.   Next i
  578.  
  579.   MusicSongLen = t * st
  580. End Property
  581.  
  582. Public Property Get MusicSongPos() As Long
  583.   'This will calculate the current song time in ms
  584.   'This is mostly accurate, but can be highly inaccurate
  585.   On Error Resume Next
  586.   Dim Kbps As Double, st As Double, i As Long, t As Long
  587.   
  588.   Kbps = (FMUSIC_GetBPM(lModulePtr) * 2) / 5
  589.   st = ((1 / Kbps) * 1000) * FMUSIC_GetSpeed(lModulePtr)
  590.  
  591.   For i = 0 To (FMUSIC_GetOrder(lModulePtr))
  592.     t = t + FMUSIC_GetPatternLength(lModulePtr, i)
  593.   Next i
  594.   t = t - (FMUSIC_GetPatternLength(lModulePtr, FMUSIC_GetOrder(lModulePtr)) - FMUSIC_GetRow(lModulePtr))
  595.   
  596.   MusicSongPos = t * st
  597. End Property
  598.  
  599. Public Function MusicGetRows(ByVal lOrder As Long) As Long
  600.   MusicGetRows = FMUSIC_GetPatternLength(lModulePtr, lOrder)
  601. End Function
  602.  
  603. Public Function GetMusicOK(ByVal sFilename As String) As Boolean
  604.   'This opens an music file and checks if fmod recognises it
  605.   On Error GoTo errh
  606.   Dim tmpMusic As Long
  607.   
  608.   tmpMusic = FMUSIC_LoadSong(sFilename)
  609.   GetMusicOK = (FMUSIC_GetType(tmpMusic) <> 0)
  610.   FMUSIC_FreeSong tmpMusic
  611.   
  612. errh:
  613. End Function
  614.  
  615. Public Sub GetMusicData(ByVal sFilename As String, ByRef lLength As Long, ByRef sName As String)
  616.   'This opens an music file, gets the length and name, and closes it
  617.   'This will calculate the songs length in ms
  618.   'This is mostly accurate, but can be highly inaccurate
  619.   On Error Resume Next
  620.   Dim Kbps As Double, st As Double, i As Long, t As Long
  621.   Dim tmpMusic As Long
  622.   
  623.   tmpMusic = FMUSIC_LoadSong(sFilename)  'load song
  624.   If FMUSIC_GetType(tmpMusic) <> FMUSIC_TYPE_NONE Then
  625.   
  626.     Call FMUSIC_SetMasterVolume(tmpMusic, 0)  'set volume to 0
  627.     Call FMUSIC_PlaySong(tmpMusic)  'play song, must be played to get BPM
  628.     'set order to in the middle, because this should increase the accuracy of the time
  629.     Call FMUSIC_SetOrder(tmpMusic, FMUSIC_GetNumOrders(tmpMusic) / 2)
  630.     sName = Trim(GetStringFromPointer(FMUSIC_GetName(tmpMusic))) 'get name
  631.     
  632.     'calc time
  633.     Kbps = (FMUSIC_GetBPM(tmpMusic) * 2) / 5
  634.     st = ((1 / Kbps) * 1000) * FMUSIC_GetSpeed(tmpMusic)
  635.     For i = 0 To (FMUSIC_GetNumOrders(tmpMusic) - 1)
  636.       t = t + FMUSIC_GetPatternLength(tmpMusic, i)
  637.     Next i
  638.     lLength = (t * st) \ 1000
  639.     If lLength > 3600 Then lLength = 0
  640.     If lLength < 0 Then lLength = 0
  641.     
  642.     'stop song
  643.     FMUSIC_StopSong tmpMusic
  644.     
  645.   End If
  646.   
  647.   'unload song
  648.   FMUSIC_FreeSong tmpMusic
  649.   
  650. End Sub
  651.  
  652. '------------------
  653. 'CD AUDIO FUNCTIONS
  654. '------------------
  655.  
  656. Public Sub CDEject(Optional ByVal bDrive As Byte = 0)
  657.   FSOUND_CD_Eject bDrive
  658. End Sub
  659.  
  660. Public Function CDGetNumTracks(Optional ByVal bDrive As Byte = 0) As Long
  661.   CDGetNumTracks = FSOUND_CD_GetNumTracks(bDrive)
  662. End Function
  663.  
  664. Public Function CDPlay(ByVal lTrack As Long, Optional ByVal bDrive As Byte = 0) As Boolean
  665.   CDPlay = True
  666.   If FSOUND_CD_SetPlayMode(bDrive, FSOUND_CD_PLAYONCE) = 0 Then CDPlay = False
  667.   If FSOUND_CD_Play(bDrive, lTrack) = 0 Then CDPlay = False
  668. End Function
  669.  
  670. Public Sub CDPausePlay(Optional ByVal bDrive As Byte = 0)
  671.   FSOUND_CD_SetPaused bDrive, Not CBool(FSOUND_CD_GetPaused(bDrive))
  672. End Sub
  673.  
  674. Public Sub CDStop(Optional ByVal bDrive As Byte = 0)
  675.   FSOUND_CD_Stop bDrive
  676. End Sub
  677.  
  678. Public Function CDGetTrackLength(ByVal lTrack As Long, Optional ByVal bDrive As Byte = 0) As Long
  679.   CDGetTrackLength = FSOUND_CD_GetTrackLength(bDrive, lTrack)
  680. End Function
  681.  
  682. Public Function CDGetTrackTime(Optional ByVal bDrive As Byte = 0) As Long
  683.   CDGetTrackTime = FSOUND_CD_GetTrackTime(bDrive)
  684. End Function
  685.  
  686. Public Sub CDSetTrackTime(ByVal lMs As Long, Optional ByVal bDrive As Byte = 0)
  687.   FSOUND_CD_SetTrackTime bDrive, lMs
  688. End Sub
  689.  
  690. Public Sub CDSetVolume(ByVal bVol As Byte, Optional ByVal bDrive As Byte = 0)
  691.   FSOUND_CD_SetVolume bDrive, bVol
  692. End Sub
  693.  
  694. '---------------------
  695. 'OTHER MISC. FUNCTIONS
  696. '---------------------
  697.  
  698. Public Property Get CPUUsage() As Single
  699.   CPUUsage = FSOUND_GetCPUUsage
  700. End Property
  701.  
  702. Public Property Get FMOD
  703.     R Get CPUUs, OptOTUssGetopertbDrive As Bytlc
  704.  
  705. Pt CPUUND_GtopertbDrive As Bytlc
  706.  
  707. Pt CPUUND_GtopertbDrive As BytlletCPUUsagiPUUNDhlUs, OptOTUssGetopertbDrive 1RuND_GtopertbDrive As Bytlc
  708. uletCPUUtOTUssGetouletCPUUpertbDrive As BytlTagPUUthlUs, OptOTUssGetopertbDrive 1etCPUUpe ssGetou 'Thp
  709. LengtCp FMUSIC_nrm 1etCPUmKbp
  710. nal ByValeyVal lTfea ,opeetCPUUpe ssGetou 'Thp
  711. LenT)sGetou 'Tere ssGetou 'Thp
  712. lTfeehIC_TSbThp
  713. VpsAb
  714.  
  715. '------aYPive sGelUSIC_yMetou 'Thp
  716. LenT)s Byte = 0)
  717.   FSOUNDly aceBGelUic Property Get CPUUsage() As Single
  718.   CPUUsage = FSOUND_GetCPUUsage
  719. End Property
  720.  
  721. Public Property Get FMOD
  722.     R Get CPUUs, OptOTUu  GettODet CPUGetou 'ThpfrDrivtou 'Thp IPunction
  723.  
  724. P  CPUUsage = 
  725.     Uu  GetCPUUsagi=
  726.  
  727. OUNDage = 
  728.     Uu  GetCPUUsagi=
  729. etTrUND'Thp IPunvtoiFDage = hlMs A Long= 
  730.     Uu  hGrc Pro  Uu  GeCipe ssUGetou 'ThpfrDrivtou 'Thp IPunction
  731.  
  732. P  CPUUsaFunction c(s opens mp2, wma, ogg,AckLength(tb'ThpfrDrivtou 'Thp IPunction
  733. Rublic Function MusicPlay(ByVal sFilename As String, Optional ByVal bLoopit As BoIIr'ThpfyVal ng
  734.   )yVal sFilename As String, Optional ByVal'---CPUUsagial ByVal al'---CPUUa