none
Visual Express2005 wav 如何讀取音量值? RRS feed

  • 問題

  • 我想要抓wav file 的音量, 我在網路上看到了這個sample code,  我用的是Visual Express 2005, 但是不能用 As Any;   kernel32和winmm.dll我不是很確定應該放在哪裡...一搬來說都是要放在哪? 有什麼可以代替 As any 或別種寫法, 還是我有哪裡做錯??

     

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function waveOutGetVolume _
    Lib "winmm.dll" (ByVal uDeviceID As Long, _
    lpdwVolume As Long) As Long
    Private Declare Function waveOutSetVolume _
    Lib "winmm.dll" (ByVal uDeviceID As Long, _
    ByVal dwVolume As Long) As Long
    Const WAVE_MAPPER = -1&

    Public Function SetWaveVolume(ByVal lVolume As Long, ByVal rVolume As Long) As Long
    Dim iVolume(1) As Integer, sVolume As Long
    If lVolume > 32767 Then
    lVolume = lVolume - 65536
    End If
    If rVolume > 32767 Then
    rVolume = rVolume - 65536
    End If
    iVolume(0) = lVolume
    iVolume(1) = rVolume
    CopyMemory sVolume, iVolume(0), 4
    waveOutSetVolume WAVE_MAPPER, sVolume
    End Function
    '宣告API
    Public Function GetWaveVolume(ByRef lVolume As Long, ByRef rVolume As Long) As Long
    '變數宣告
    Dim iVolume(1) As Integer, sVolume As Long

    waveOutGetVolume WAVE_MAPPER, sVolume
    CopyMemory iVolume(0), sVolume, 4
    lVolume = iVolume(0)
    rVolume = iVolume(1)

    If lVolume < 0 Then
    lVolume = lVolume + 65536
    End If

    If rVolume < 0 Then
    rVolume = rVolume + 65536
    End If

    End Function

    2007年4月16日 下午 03:32

解答

  • As Any 的欄位,請改用 As Object。
    2007年4月17日 上午 02:19
    版主
  • 我記得在 MSDN 上,說到 VB6 升級到 VBNET 時,針對 CopyMemory API 的使用是說,用強型別宣告,並配合 OverLoads 來作多型,我想應該也可以配合 Of T 來做多型吧...

     

    強型別宣告就是說直接 As Integer / As Double 等已知型別。

    2007年4月17日 上午 07:10
    版主
  • 假設 sv, lv, rv 都是 UInt32 :

    sv = (rv << 16) Or lv


    取代這幾行:

    程式碼
    If lVolume > 32767 Then
    lVolume = lVolume - 65536
    End If
    If rVolume > 32767 Then
    rVolume = rVolume - 65536
    End If
    iVolume(0) = lVolume
    iVolume(1) = rVolume
    CopyMemory sVolume, iVolume(0), 4

     


    2007年4月19日 下午 05:03
    版主

所有回覆

  • As Any 的欄位,請改用 As Object。
    2007年4月17日 上午 02:19
    版主
  • 我記得在 MSDN 上,說到 VB6 升級到 VBNET 時,針對 CopyMemory API 的使用是說,用強型別宣告,並配合 OverLoads 來作多型,我想應該也可以配合 Of T 來做多型吧...

     

    強型別宣告就是說直接 As Integer / As Double 等已知型別。

    2007年4月17日 上午 07:10
    版主
  • 另外你叫用這個 API 來說,用不到 CopyMemory

     

    你必須學習 VBNET 新的變數型態及所佔的位元組,比如說原先 VB6 的 Long 在 VBNET 是 Integer

     

    另外 VBNET 從 .Net framework 這邊繼承了無符號的整數,所以可以直接用 UInt32 來處理這個 API ,中間直接用 Bits 移位 (<<, >>) 及 Or 運算即可。不需使用 CopyMemory 。

    2007年4月17日 上午 07:16
    版主
  • 可不可以把你最後說的Uint32在解釋一下, 我還是有點不知道怎麼用UInt32代替CopyMemory
    2007年4月19日 下午 03:39
  • 假設 sv, lv, rv 都是 UInt32 :

    sv = (rv << 16) Or lv


    取代這幾行:

    程式碼
    If lVolume > 32767 Then
    lVolume = lVolume - 65536
    End If
    If rVolume > 32767 Then
    rVolume = rVolume - 65536
    End If
    iVolume(0) = lVolume
    iVolume(1) = rVolume
    CopyMemory sVolume, iVolume(0), 4

     


    2007年4月19日 下午 05:03
    版主