⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmwritewave.frm

📁 bass player system api c++
💻 FRM
字号:
VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
Begin VB.Form frmWriteWave 
   BorderStyle     =   3  'Fixed Dialog
   Caption         =   "BASS WAVE writer example"
   ClientHeight    =   2295
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   4470
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   2295
   ScaleWidth      =   4470
   StartUpPosition =   2  'CenterScreen
   Begin VB.CommandButton btnConvert 
      Caption         =   "Convert to ""BASS.WAV"""
      Enabled         =   0   'False
      Height          =   495
      Left            =   120
      TabIndex        =   3
      Top             =   1680
      Width           =   4215
   End
   Begin VB.CommandButton btnLoadFile 
      Caption         =   "Select File to Convert"
      Height          =   495
      Left            =   120
      TabIndex        =   2
      Top             =   1080
      Width           =   4215
   End
   Begin MSComDlg.CommonDialog cmd 
      Left            =   3840
      Top             =   480
      _ExtentX        =   847
      _ExtentY        =   847
      _Version        =   393216
   End
   Begin VB.Label lblTime 
      AutoSize        =   -1  'True
      Caption         =   "Time:"
      Height          =   195
      Left            =   120
      TabIndex        =   4
      Top             =   360
      Width           =   390
   End
   Begin VB.Label lblStrFile 
      AutoSize        =   -1  'True
      Caption         =   "Streaming File:"
      Height          =   195
      Left            =   120
      TabIndex        =   1
      Top             =   120
      Width           =   1035
   End
   Begin VB.Label lblPos 
      AutoSize        =   -1  'True
      Caption         =   "Pos:"
      Height          =   195
      Left            =   120
      TabIndex        =   0
      Top             =   600
      Width           =   315
   End
End
Attribute VB_Name = "frmWriteWave"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'//////////////////////////////////////////////////////////////////////////////////
' frmWriteWave.frm - Copyright (c) 2002-2007 (: JOBnik! :) [Arthur Aminov, ISRAEL]
'                                                          [http://www.jobnik.org]
'                                                          [  jobnik@jobnik.org  ]
'
' BASS WAVE writer example: MOD/MPx/OGG -> "BASS.WAV"
' Originally translated from - writewav.c - Example of Ian Luck
'//////////////////////////////////////////////////////////////////////////////////

Option Explicit

Dim info As BASS_CHANNELINFO
Dim chan As Long, p As Long
Dim pos As Long
Dim buf() As Byte

Private Type WAVEHEADER_RIFF        ' == 12 bytes ==
    RIFF As Long                    ' "RIFF" = &H46464952
    riffBlockSize As Long           ' pos + 44 - 8
    riffBlockType As Long           ' "WAVE" = &H45564157
End Type

Private Type WAVEHEADER_data        ' == 8 bytes ==
   dataBlockType As Long            ' "data" = &H61746164
   dataBlockSize As Long            ' pos
End Type

Private Type WAVEFORMAT             ' == 24 bytes ==
    wfBlockType As Long             ' "fmt " = &H20746D66
    wfBlockSize As Long
    ' == block size begins from here = 16 bytes
    wFormatTag As Integer
    nChannels As Integer
    nSamplesPerSec As Long
    nAvgBytesPerSec As Long
    nBlockAlign As Integer
    wBitsPerSample As Integer
End Type

Dim wr As WAVEHEADER_RIFF
Dim wf As WAVEFORMAT
Dim wd As WAVEHEADER_data

' display error message
Sub Error_(ByVal Message As String)
    Call MsgBox(Message & vbCrLf & vbCrLf & "Error Code : " & BASS_ErrorGetCode, vbExclamation, "Error")
End Sub

Private Sub Form_Load()
    ' change and set the current path, to prevent from VB not finding BASS.DLL
    ChDrive App.Path
    ChDir App.Path

    ' check the correct BASS was loaded
    If (HiWord(BASS_GetVersion) <> BASSVERSION) Then
        Call MsgBox("An incorrect version of BASS.DLL was loaded", vbCritical)
        End
    End If

    ' not playing anything, so don't need an update thread
    Call BASS_SetConfig(BASS_CONFIG_UPDATEPERIOD, 0)

    ' setup output - "no sound" device, 44100hz, stereo, 16 bits
    If (BASS_Init(0, 44100, 0, Me.hWnd, 0) = 0) Then
        Call Error_("Can't initialize device")
        End
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Local Error Resume Next
    
    BASS_Free
    End
End Sub

Private Sub btnLoadFile_Click()
    On Local Error Resume Next    ' if Cancel pressed...

    cmd.CancelError = True
    cmd.flags = cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNHideReadOnly
    cmd.DialogTitle = "Select a file to Convert"
    cmd.Filter = "Convertable files (*.mo3;*.xm;*.mod;*.s3m;*.it;*.mtm;*.umx;*.mp3;*.mp2;*.mp1;*.ogg)|*.mo3;*.xm;*.mod;*.s3m;*.it;*.mtm;*.umx;*.mp3;*.mp2;*.mp1;*.ogg"
    cmd.ShowOpen

    ' if cancel was pressed, exit the procedure
    If Err.Number = 32755 Then Exit Sub

    ' try streaming the file
    chan = BASS_StreamCreateFile(BASSFALSE, StrPtr(cmd.filename), 0, 0, BASS_STREAM_DECODE)
    If chan Then
        pos = BASS_ChannelGetLength(chan, BASS_POS_BYTE)
        lblStrFile.Caption = "Streaming file: " & GetFileName(cmd.filename) & " [" & pos & " bytes]"
    End If

    ' try loading the MOD (with sensitive ramping, and calculate the duration)
    If chan = 0 Then
        chan = BASS_MusicLoad(BASSFALSE, StrPtr(cmd.filename), 0, 0, BASS_MUSIC_DECODE Or BASS_MUSIC_RAMP Or BASS_MUSIC_PRESCAN, 0)
        If chan = 0 Then
            ' not a MOD either
            Call Error_("Can't play the file")
            Exit Sub
        Else
            Dim dummy As Single
            p = 0
            While (BASS_ChannelGetAttribute(chan, BASS_ATTRIB_MUSIC_VOL_CHAN + p, dummy)) ' count channels
                p = p + 1
            Wend
            lblStrFile.Caption = "MOD music """ & VBStrFromAnsiPtr(BASS_ChannelGetTags(chan, BASS_TAG_MUSIC_NAME)) & _
                                    """ [" & p & " chans, " & BASS_ChannelGetLength(chan, , BASS_POS_MUSIC_ORDER) & " orders]"
            pos = BASS_ChannelGetLength(chan, BASS_POS_BYTE)
        End If
    End If

    ' display the time length
    If (pos) Then
        p = CLng(BASS_ChannelBytes2Seconds(chan, pos))
        lblTime.Caption = "Time: " & CInt(p \ 60) & ":" & Format(CInt(p Mod 60), "00")
    Else ' no time length available
        lblPos.Caption = ""
    End If

    lblPos.Caption = "Pos:"
    btnConvert.Enabled = True
End Sub

Private Sub btnConvert_Click()
    Static convert As Boolean

    convert = Not convert

    If (convert) Then
        btnLoadFile.Enabled = False
        btnConvert.Caption = "Stop conversion..."
    
        Call BASS_ChannelGetInfo(chan, info)

        ' Set WAV Format
        wf.wFormatTag = 1
        wf.nChannels = info.chans
        wf.wBitsPerSample = IIf(info.flags And BASS_SAMPLE_8BITS, 8, 16)
        wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8
        wf.nSamplesPerSec = info.freq
        wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign
    
        ' Set WAV "fmt " header
        wf.wfBlockType = &H20746D66      ' "fmt "
        wf.wfBlockSize = 16
    
        ' Set WAV "RIFF" header
        wr.RIFF = &H46464952             ' "RIFF"
        wr.riffBlockSize = 0             ' after conversion
        wr.riffBlockType = &H45564157    ' "WAVE"
    
        ' set WAV "data" header
        wd.dataBlockType = &H61746164    ' "data"
        wd.dataBlockSize = 0             ' after conversion
    
        ' create a file BASS.WAV
        If (FileExists(RPP(App.Path) & "BASS.WAV")) Then _
            Call Kill(RPP(App.Path) & "BASS.WAV") ' delete if already created and create a new one
        Open RPP(App.Path) & "BASS.WAV" For Binary Lock Read Write As #1
    
        ' Write WAV Header to file
        Put #1, , wr    ' RIFF
        Put #1, , wf    ' Format
        Put #1, , wd    ' data
    
        ReDim buf(19999) As Byte
    
        Do While BASS_ChannelIsActive(chan)
            If Not convert Then Exit Do
            Dim c As Long
            c = BASS_ChannelGetData(chan, buf(0), 20000)
            ' write data to WAV file
            Put #1, , buf
            pos = BASS_ChannelGetPosition(chan, BASS_POS_BYTE)
            lblPos.Caption = "Pos: " & pos
            DoEvents        ' in case you want to stop/exit...
        Loop
    End If

    convert = False

    btnLoadFile.Enabled = True
    btnConvert.Caption = "Convert to ""BASS.WAV"""
    Call CompleteWAVHeader
    
    ' start next conversion from the beginning
    pos = 0
    Call BASS_ChannelSetPosition(chan, 0, BASS_POS_BYTE)
End Sub

Private Sub CompleteWAVHeader()
    ' complete WAV header
    wr.riffBlockSize = pos + 44 - 8
    wd.dataBlockSize = pos

    On Local Error Resume Next

    Put #1, 5, wr.riffBlockSize
    Put #1, 41, wd.dataBlockSize

    Close #1
End Sub

'--------------------------
' some useful functions :)
'--------------------------

' check if any file exists
Public Function FileExists(ByVal fp As String) As Boolean
    FileExists = (Dir(fp) <> "")
End Function

' RPP = Return Proper Path
Function RPP(ByVal fp As String) As String
    RPP = IIf(Mid(fp, Len(fp), 1) <> "\", fp & "\", fp)
End Function

' get file name from file path
Public Function GetFileName(ByVal fp As String) As String
    GetFileName = Mid(fp, InStrRev(fp, "\") + 1)
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -