I want to share this Generic Class I've did to convert some files in my PC using CoreConverter executable.
I preffer to use the executable instead dmcScriptingLib because @Spoon saids me that the dll has no way to check for a conversion progress, but in a GUI application this is very important to manage.
My class has two basic events, one for capture the percent done and the other to return error/standard messages.
Also I've added support to use some DSP Effects (they are DSP Effects which do not need to parse special parametters to it, I can't manage for example the "move file" plugin because needs to input a location, but if you want predefine the location then you can manage it)
By the moment I've only integrated the necessary parametters to convert files using mP3 (Lame) (cbr/abr but not vbr), Wav uncompressed, and WindowsMediaAudio 9.2, you can easy extend/improve this Class by adding more specific codec parametters.
This Class is Free to use, free to share.
Sure this could help much .NET developer people,
and maybe authors or moderators would add this sample to the developer help section.
Thanks for read!
I preffer to use the executable instead dmcScriptingLib because @Spoon saids me that the dll has no way to check for a conversion progress, but in a GUI application this is very important to manage.
My class has two basic events, one for capture the percent done and the other to return error/standard messages.
Also I've added support to use some DSP Effects (they are DSP Effects which do not need to parse special parametters to it, I can't manage for example the "move file" plugin because needs to input a location, but if you want predefine the location then you can manage it)
By the moment I've only integrated the necessary parametters to convert files using mP3 (Lame) (cbr/abr but not vbr), Wav uncompressed, and WindowsMediaAudio 9.2, you can easy extend/improve this Class by adding more specific codec parametters.
This Class is Free to use, free to share.
Sure this could help much .NET developer people,
and maybe authors or moderators would add this sample to the developer help section.
Thanks for read!
Code:
*Region " CoreConverter Helper "
' [ CoreConverter Helper ]
'
' // By Elektro H@cker
'
'
' Instructions:
'
' 1. Add the "CoreConverter.exe" into the project,
' together with the dbPoweramp Effects and Codec folders.
'
' Examples :
'
' -------------------
' CONVERT FILE TO MP3
' -------------------
' CoreConverter.Convert_To_MP3("C:\Input.wav", "C:\Output.mp3", _
' CoreConverter.Lame_Bitrate.kbps_320, _
' CoreConverter.Lame_Bitrate_Mode.cbr, _
' CoreConverter.Lame_Profile.SLOW, _
' CoreConverter.Lame_Quality.Q0_Maximum, _
' CoreConverter.Lame_Khz.Same_As_Source, _
' CoreConverter.Lame_Channels.auto, _
' { _
' CoreConverter.DSP_Effects.Delete_Output_File_on_Error, _
' CoreConverter.DSP_Effects.Recycle_Source_File_After_Conversion _
' }, _
' False, _
' CoreConverter.Priority.normal)
'
' -------------------
' CONVERT FILE TO WAV
' -------------------
' CoreConverter.Convert_To_WAV_Uncompressed("C:\Input.mp3", "C:\Output.wav", _
' CoreConverter.WAV_Uncompressed_Bitrate.Same_As_Source, _
' CoreConverter.WAV_Uncompressed_Khz.Same_As_Source, _
' CoreConverter.WAV_Uncompressed_Channels.Same_As_Source, , False)
'
' -------------------
' CONVERT FILE TO WMA
' -------------------
' CoreConverter.Convert_To_WMA("C:\Input.mp3", "C:\Output.wma", _
' CoreConverter.WMA_9_2_BitRates.Kbps_128, _
' CoreConverter.WMA_9_2_Khz.Khz_44100, _
' CoreConverter.WMA_9_2_Channels.stereo, , False)
'
' ------
' EVENTS
' ------
' Public WithEvents Converter As New CoreConverter()
'
' Sub Converter_Progress(Progress As Integer, e As EventArgs) Handles Converter.PercentDone
' ProgressBar1.Maximum = 59
' ProgressBar1.Step = 1
' ProgressBar1.PerformStep()
' End Sub
'
' Sub Converter_Message(Message As String, e As EventArgs) Handles Converter.Exited
' ProgressBar1.Value = 0
' MessageBox.Show(Message)
' End Sub
Public Class CoreConverter : Implements IDisposable
*Region " Variables "
' <summary>
' Gets or sets CoreConverter.exe executable path.
' </summary>
Public Shared CoreConverter_Location As String = ".\CoreConverter.exe"
' Stores the CoreConverter process progress
Private Shared CurrentProgress As Integer = 0
' Stores the CoreConverter process StandarOutput
Private Shared StandardOutput As String = String.Empty
' Stores the CoreConverter process ErrorOutput
Private Shared ErrorOutput As String = String.Empty
' Stores the next output character
Private Shared OutputCharacter As Char = Nothing
' Stores the DSP Effects formatted string
Private Shared Effects As String = String.Empty
*End Region
*Region " Events "
' <summary>
' Event raised when conversion progress changes.
' </summary>
Public Shared Event PercentDone As EventHandler(Of PercentDoneEventArgs)
Public Class PercentDoneEventArgs : Inherits EventArgs
Public Property Progress As Integer
End Class
' <summary>
' Event raised when CoreConverter process has exited.
' </summary>
Public Shared Event Exited As EventHandler(Of ExitedEventArgs)
Public Class ExitedEventArgs : Inherits EventArgs
Public Property Message As String
End Class
*End Region
*Region " Process Info "
' CoreConverter Process Information.
Private Shared CoreConverter As New Process() With { _
.StartInfo = New ProcessStartInfo With { _
.CreateNoWindow = True, _
.UseShellExecute = False, _
.RedirectStandardError = True, _
.RedirectStandardOutput = True, _
.StandardErrorEncoding = System.Text.Encoding.Unicode, _
.StandardOutputEncoding = System.Text.Encoding.Unicode}}
*End Region
*Region " CoreConverter Enumerations "
' Priority level of CoreConverter.exe
Enum Priority
idle
low
normal
high
End Enum
' DSP Effects
Public Enum DSP_Effects
Delete_Output_File_on_Error ' Delete failed conversion (not deletes source file).
Delete_Source_File_After_Conversion ' Delete source file after conversion.
Recycle_Source_File_After_Conversion ' Send source file to recycle bin after conversion.
Karaoke_Remove_Voice ' Remove voice from file.
Karaoke_Remove_Instrument ' Remove instruments from file.
Reverse ' Reverse complete audio file.
Write_Silence ' Write silence at start of file.
End Enum
*End Region
*Region " Codec Enumerations "
*Region " MP3 Lame "
Enum Lame_Bitrate
kbps_8 = 8
kbps_16 = 16
kbps_24 = 24
kbps_32 = 32
kbps_40 = 40
kbps_48 = 48
kbps_56 = 56
kbps_64 = 64
kbps_80 = 80
kbps_96 = 96
kbps_112 = 112
kbps_128 = 128
kbps_144 = 144
kbps_160 = 160
kbps_192 = 192
kbps_224 = 224
kbps_256 = 256
kbps_320 = 320
End Enum
Enum Lame_Bitrate_Mode
cbr
abr
End Enum
Enum Lame_Profile
NORMAL
FAST
SLOW
End Enum
Enum Lame_Quality
Q0_Maximum = 0
Q1 = 1
Q2 = 2
Q3 = 3
Q4 = 4
Q5 = 5
Q6 = 6
Q7 = 7
Q8 = 8
Q9_Minimum = 9
End Enum
Enum Lame_Khz
Same_As_Source
khz_8000 = 8000
khz_11025 = 11025
khz_12000 = 12000
khz_16000 = 16000
khz_22050 = 22050
khz_24000 = 24000
khz_32000 = 32000
khz_44100 = 44100
khz_48000 = 48000
End Enum
Enum Lame_Channels
auto
mono
stereo
joint_stereo
forced_joint_stereo
forced_stereo
dual_channels
End Enum
*End Region
*Region " WAV Uncompressed "
Enum WAV_Uncompressed_Bitrate
Same_As_Source
bits_8 = 8
bits_16 = 16
bits_24 = 24
bits_32 = 32
End Enum
Enum WAV_Uncompressed_Khz
Same_As_Source
khz_8000 = 8000
khz_11025 = 11025
khz_12000 = 12000
khz_16000 = 16000
khz_22050 = 22050
khz_24000 = 24000
khz_32000 = 32000
khz_44100 = 44100
khz_48000 = 48000
khz_96000 = 96000
khz_192000 = 192000
End Enum
Enum WAV_Uncompressed_Channels
Same_As_Source
Channels_1_Mono = 1
Channels_2_Stereo = 2
Channels_3 = 3
Channels_4_Quadraphonic = 4
Channels_5_Surround = 5
Channels_6_Surround_DVD = 6
Channels_7 = 7
Channels_8_Theater = 8
End Enum
*End Region
*Region " WMA 9.2 "
Enum WMA_9_2_BitRates
Kbps_12 = 12
Kbps_16 = 16
Kbps_20 = 20
Kbps_22 = 22
Kbps_24 = 24
Kbps_32 = 32
Kbps_40 = 40
Kbps_48 = 48
Kbps_64 = 64
Kbps_80 = 80
Kbps_96 = 96
Kbps_128 = 128
Kbps_160 = 160
Kbps_192 = 192
Kbps_256 = 256
Kbps_320 = 320
End Enum
Enum WMA_9_2_Khz
Khz_8000 = 8
Khz_16000 = 16
Khz_22050 = 22
Khz_32000 = 32
Khz_44100 = 44
Khz_48000 = 48
End Enum
Enum WMA_9_2_Channels
mono
stereo
End Enum
*End Region
*End Region
*Region " Codec Procedures "
*Region " MP3 Lame "
' <summary>
' Converts a file to MP3 using Lame codec.
' </summary>
Public Shared Sub Convert_To_MP3(ByVal In_File As String, _
ByVal Out_File As String, _
ByVal Bitrate As Lame_Bitrate, _
ByVal Bitrate_Mode As Lame_Bitrate_Mode, _
ByVal Encoding_Profile As Lame_Profile, _
ByVal Quality As Lame_Quality, _
ByVal Khz As Lame_Khz, _
ByVal Channels As Lame_Channels, _
Optional ByVal DSP_Effects() As DSP_Effects = Nothing, _
Optional ByVal Update_Tag As Boolean = True, _
Optional ByVal Priority As Priority = Priority.normal, _
Optional ByVal Processor As Short = 1)
Get_Effects(DSP_Effects)
Set_Main_Parametters("mp3 (Lame)", In_File, Out_File, If(Not Update_Tag, "-noidtag", ""), Effects, Priority.ToString, Processor.ToString)
CoreConverter.StartInfo.Arguments &= _
String.Format("-b {0} --{1} -encoding=""{2}"" -freq=""{3}"" -channels=""{4}"" --noreplaygain --extracli=""-q {5}""", _
CInt(Bitrate), _
Bitrate_Mode.ToString, _
Encoding_Profile.ToString, _
If(Khz = Lame_Khz.Same_As_Source, "", CInt(Khz)), _
If(Channels = Lame_Channels.auto, "", Channels), _
CInt(Quality))
Run_CoreConverter()
End Sub
*End Region
*Region " WAV Uncompressed "
' <summary>
' Converts a file to WAV
' </summary>
Public Shared Sub Convert_To_WAV_Uncompressed(ByVal In_File As String, _
ByVal Out_File As String, _
ByVal Bitrate As WAV_Uncompressed_Bitrate, _
ByVal Khz As WAV_Uncompressed_Khz, _
ByVal Channels As WAV_Uncompressed_Channels, _
Optional ByVal DSP_Effects() As DSP_Effects = Nothing, _
Optional ByVal Update_Tag As Boolean = True, _
Optional ByVal Priority As Priority = Priority.normal, _
Optional ByVal Processor As Short = 1)
Get_Effects(DSP_Effects)
Set_Main_Parametters("Wave", In_File, Out_File, If(Not Update_Tag, "-noidtag", ""), Effects, Priority.ToString, Processor.ToString)
CoreConverter.StartInfo.Arguments &= _
String.Format("-compression=""PCM"" -bits=""{0}"" -freq=""{1}"" -channels=""{2}""", _
If(Bitrate = WAV_Uncompressed_Bitrate.Same_As_Source, "", CInt(Bitrate)), _
If(Khz = WAV_Uncompressed_Khz.Same_As_Source, "", CInt(Khz)), _
If(Channels = WAV_Uncompressed_Channels.Same_As_Source, "", CInt(Channels)))
Run_CoreConverter()
End Sub
*End Region
*Region " WMA 9.2 "
' <summary>
' Converts a file to WMA 9.2
' </summary>
Public Shared Sub Convert_To_WMA(ByVal In_File As String, _
ByVal Out_File As String, _
ByVal Bitrate As WMA_9_2_BitRates, _
ByVal Khz As WMA_9_2_Khz, _
ByVal Channels As WMA_9_2_Channels, _
Optional ByVal DSP_Effects() As DSP_Effects = Nothing, _
Optional ByVal Update_Tag As Boolean = True, _
Optional ByVal Priority As Priority = Priority.normal, _
Optional ByVal Processor As Short = 1)
Get_Effects(DSP_Effects)
Set_Main_Parametters("Windows Media Audio 10", In_File, Out_File, If(Not Update_Tag, "-noidtag", ""), Effects, Priority.ToString, Processor.ToString)
CoreConverter.StartInfo.Arguments &= _
String.Format("-codec=""Windows Media Audio 9.2"" -settings=""{0} kbps, {1} kHz, {2} CBR""",
CInt(Bitrate), _
CInt(Khz), _
Channels.ToString)
Run_CoreConverter()
End Sub
*End Region
*End Region
*Region " Run Converter Procedure "
Private Shared Sub Run_CoreConverter()
CoreConverter.StartInfo.FileName = CoreConverter_Location
CoreConverter.Start()
While Not CoreConverter.HasExited
OutputCharacter = ChrW(CoreConverter.StandardOutput.Read)
If OutputCharacter = "*" Then
CurrentProgress += 1 ' Maximum value is 59, so a ProgressBar Maximum property value would be 59.
RaiseEvent PercentDone(CurrentProgress, Nothing)
End If
If CurrentProgress = 59 Then
' I store the last line(s) 'cause it has interesting information:
' Example message: Conversion completed in 30 seconds x44 realtime encoding
StandardOutput = CoreConverter.StandardOutput.ReadToEnd.Trim
End If
End While
' Stores the Error Message (If any)
ErrorOutput = CoreConverter.StandardError.ReadToEnd
Select Case CoreConverter.ExitCode
Case 0 : RaiseEvent Exited(StandardOutput, Nothing) ' Return StandardOutput
Case Else : RaiseEvent Exited(ErrorOutput, Nothing) ' Return ErrordOutput
End Select
CurrentProgress = Nothing
OutputCharacter = Nothing
StandardOutput = Nothing
ErrorOutput = Nothing
Effects = Nothing
CoreConverter.Close()
End Sub
*End Region
*Region " Miscellaneous functions "
' <summary>
' Checks if CoreConverter process is avaliable.
' </summary>
Public Shared Function Is_Avaliable() As Boolean
Return IO.File.Exists(CoreConverter_Location)
End Function
' Set the constant parametters of CoreConverter process
Private Shared Sub Set_Main_Parametters(ByVal Codec_Name As String, _
ByVal In_File As String, _
ByVal Out_File As String, _
ByVal Update_Tag As String, _
ByVal Effects As String, _
ByVal Priority As String, _
ByVal Processor As String)
CoreConverter.StartInfo.Arguments = _
String.Format("-infile=""{0}"" -outfile=""{1}"" -convert_to=""{2}"" {3} {4} -priority=""{5}"" -processor=""{6}"" ", _
In_File, Out_File, Codec_Name, Update_Tag, Effects, Priority, Processor)
End Sub
' Returns all joined DSP Effects formatted string
Private Shared Function Get_Effects(ByVal DSP_Effects() As DSP_Effects) As String
If DSP_Effects Is Nothing Then Return Nothing
For Effect As Integer = 0 To DSP_Effects.Length - 1
Effects &= String.Format(" -dspeffect{0}={1}", _
Effect + 1, _
Format_DSP_Effect(DSP_Effects(Effect).ToString))
Next Effect
Return Effects
End Function
' Returns a DSP Effect formatted string
Private Shared Function Format_DSP_Effect(ByVal Effect As String)
Select Case Effect
Case "Reverse" : Return """Reverse"""
Case "Delete_Output_File_on_Error" : Return """Delete Destination File on Error="""
Case "Recycle_Source_File_After_Conversion" : Return """Delete Source File=-recycle"""
Case "Delete_Source_File_After_Conversion" : Return """Delete Source File="""
Case "Karaoke_Remove_Voice" : Return """Karaoke (Voice_ Instrument Removal)="""
Case "Karaoke_Remove_Instrument" : Return """Karaoke (Voice_ Instrument Removal)=-i"""
Case "Write_Silence" : Return """Write Silence=-lengthms={qt}2000{qt}""" ' 2 seconds
Case Else : Return String.Empty
End Select
End Function
*End Region
*Region " Dispose Objects "
Public Sub Dispose() Implements IDisposable.Dispose
' CoreConverter_Location = Nothing ' Do not change if want to preserve a custom location.
OutputCharacter = Nothing
StandardOutput = Nothing
ErrorOutput = Nothing
CurrentProgress = Nothing
Effects = Nothing
CoreConverter.Close()
GC.SuppressFinalize(Me)
End Sub
*End Region
End Class
*End Region
