diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..44b0beb49c8f4fc79c5116eeeb41756bd7dddd1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +#Ignore +*.exe +*_stripped.au3 +__Stripped +BAK +Thumbs.db + diff --git a/MXF-Track-Swap.au3 b/MXF-Track-Swap.au3 new file mode 100644 index 0000000000000000000000000000000000000000..98d2b628587c83a3705433b67f181969211e7701 --- /dev/null +++ b/MXF-Track-Swap.au3 @@ -0,0 +1,749 @@ +#Region ;**** Directives created by AutoIt3Wrapper_GUI **** +#AutoIt3Wrapper_Icon=icon\swap.ico +#AutoIt3Wrapper_UseX64=n +#AutoIt3Wrapper_Res_Comment=Swaps audio tracks in mxf files. +#AutoIt3Wrapper_Res_Description=Swaps audio tracks in mxf files. +#AutoIt3Wrapper_Res_Fileversion=1.0.0.4 +#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p +#AutoIt3Wrapper_Res_LegalCopyright=Conrad Zelck +#AutoIt3Wrapper_Res_SaveSource=y +#AutoIt3Wrapper_Res_Language=1031 +#AutoIt3Wrapper_Res_Field=Copyright|Conrad Zelck +#AutoIt3Wrapper_Res_Field=Compile Date|%date% %time% +#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 +#AutoIt3Wrapper_Run_Au3Stripper=y +#Au3Stripper_Parameters=/mo +#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** +#include <GUIConstantsEx.au3> +#include <StaticConstants.au3> +#include <MsgBoxConstants.au3> +#include <ColorConstants.au3> +#include <FileConstants.au3> +#include <AutoItConstants.au3> +#include <Date.au3> +#include <File.au3> +#include <TrayCox.au3> + +; Known issues: +; - if the external stereo wav file is routed to only one channel (e.g. "[R]") it breaks: "Filter channelsplit:FL has an unconnected outut" + +AutoItSetOption("GUICoordMode", 1) + +Global $g_bMxfAvailable = False +Global $g_bWavAvailable = False +Global $g_hGUI +Global $g_sMXFFile, $g_sWAVFile +Global $g_aDropFiles[0] + +; if parameter given via sendto or drag&drop onto AppIcon +ConsoleWrite("$CmdLineRaw: " & $CmdLineRaw & @CRLF) +If $CmdLine[0] > 0 Then + _CheckForInputFiles($CmdLine) +EndIf + +; if no parameters are given open a drag and drop gui +$g_hGUI = GUICreate("MXF-Track-Swap", 400, 340, -1, -1, -1, $WS_EX_ACCEPTFILES) +GUICtrlCreateLabel(@CRLF & "Drag&&drop your files here." & @CRLF & @CRLF & "You must provide an MXF file." & @CRLF & "Additionally you can provide a stereo WAV file too." , 20, 20, 360, 100, BitOR($SS_CENTER, $SS_SUNKEN)) +GUICtrlSetFont(-1, 10) +GUICtrlCreateLabel("MXF file:" , 20, 140, 360, 20) +GUICtrlSetFont(-1, 10) +Local $hLMXF = GUICtrlCreateLabel(_FileName($g_sMXFFile) , 20, 170, 360, 20) +GUICtrlSetFont(-1, 10) +GUICtrlCreateLabel("WAV file:" , 20, 210, 360, 20) +GUICtrlSetFont(-1, 10) +Local $hLWAV = GUICtrlCreateLabel(_FileName($g_sWAVFile) , 20, 240, 360, 20) +GUICtrlSetFont(-1, 10) +Local $hBNext = GUICtrlCreateButton("Next", 100, 290, 200, 30, $BS_DEFPUSHBUTTON) +GUICtrlSetFont(-1, 10) +If Not $g_bMxfAvailable Then GUICtrlSetState(-1, $GUI_DISABLE) +Local $FILES_DROPPED = GUICtrlCreateDummy() +GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC') +GUISetState() + +Local $sFile +While True + Switch GUIGetMsg() + Case $GUI_EVENT_CLOSE + Exit + Case $FILES_DROPPED + _CheckForInputFiles($g_aDropFiles) + If $g_bMxfAvailable Then + GUICtrlSetState($hBNext, $GUI_ENABLE) + GUICtrlSetData($hLMXF, _FileName($g_sMXFFile)) + EndIf + If $g_bWavAvailable Then GUICtrlSetData($hLWAV, _FileName($g_sWAVFile)) + Case $hBNext + ExitLoop + EndSwitch +WEnd +GUIDelete($g_hGUI) + +#Region - GUI Routing +AutoItSetOption("GUICoordMode", 0) +$g_hGUI = GUICreate("MXF-Track-Swap Routing", 320, 450) +GUICtrlCreateLabel("Source", 20, 20, 200, 20) +GUICtrlCreateLabel("Mute", 10, 20, 30, 20) +GUICtrlCreateLabel("A1", 10, 30, 20, 20) +GUICtrlCreateLabel("A2", -1, 20, 20, 20) +GUICtrlCreateLabel("A3", -1, 30, 20, 20) +GUICtrlCreateLabel("A4", -1, 20, 20, 20) +GUICtrlCreateLabel("A5", -1, 30, 20, 20) +GUICtrlCreateLabel("A6", -1, 20, 20, 20) +GUICtrlCreateLabel("A7", -1, 30, 20, 20) +GUICtrlCreateLabel("A8", -1, 20, 20, 20) +Local $hLL = GUICtrlCreateLabel("L", -1, 30, 20, 20) +Local $hLR = GUICtrlCreateLabel("R", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetColor($hLL, $COLOR_SILVER) + GUICtrlSetColor($hLR, $COLOR_SILVER) +EndIf + +GUIStartGroup() +Global $g_hRm1 = GUICtrlCreateRadio("", 30, -253, 20, 20) +Global $g_hR11 = GUICtrlCreateRadio("", -1, 30, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR21 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR31 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR41 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR51 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR61 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR71 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR81 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL1 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR1 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL1, $GUI_DISABLE) + GUICtrlSetState($g_hRR1, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A1", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm2 = GUICtrlCreateRadio("", 20, -280, 20, 20) +Global $g_hR12 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR22 = GUICtrlCreateRadio("", -1, 20, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR32 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR42 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR52 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR62 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR72 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR82 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL2 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR2 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL2, $GUI_DISABLE) + GUICtrlSetState($g_hRR2, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A2", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm3 = GUICtrlCreateRadio("", 30, -280, 20, 20) +Global $g_hR13 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR23 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR33 = GUICtrlCreateRadio("", -1, 30, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR43 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR53 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR63 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR73 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR83 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL3 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR3 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL3, $GUI_DISABLE) + GUICtrlSetState($g_hRR3, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A3", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm4 = GUICtrlCreateRadio("", 20, -280, 20, 20) +Global $g_hR14 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR24 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR34 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR44 = GUICtrlCreateRadio("", -1, 20, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR54 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR64 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR74 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR84 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL4 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR4 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL4, $GUI_DISABLE) + GUICtrlSetState($g_hRR4, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A4", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm5 = GUICtrlCreateRadio("", 30, -280, 20, 20) +Global $g_hR15 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR25 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR35 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR45 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR55 = GUICtrlCreateRadio("", -1, 30, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR65 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR75 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR85 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL5 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR5 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL5, $GUI_DISABLE) + GUICtrlSetState($g_hRR5, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A5", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm6 = GUICtrlCreateRadio("", 20, -280, 20, 20) +Global $g_hR16 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR26 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR36 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR46 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR56 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR66 = GUICtrlCreateRadio("", -1, 20, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR76 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR86 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL6 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR6 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL6, $GUI_DISABLE) + GUICtrlSetState($g_hRR6, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A6", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm7 = GUICtrlCreateRadio("", 30, -280, 20, 20) +Global $g_hR17 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR27 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR37 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR47 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR57 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR67 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR77 = GUICtrlCreateRadio("", -1, 30, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hR87 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hRL7 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR7 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL7, $GUI_DISABLE) + GUICtrlSetState($g_hRR7, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A7", 1, 30, -1, -1) + +GUIStartGroup() +Global $g_hRm8 = GUICtrlCreateRadio("", 20, -280, 20, 20) +Global $g_hR18 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR28 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR38 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR48 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR58 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR68 = GUICtrlCreateRadio("", -1, 20, 20, 20) +Global $g_hR78 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hR88 = GUICtrlCreateRadio("", -1, 20, 20, 20) +GUICtrlSetState(-1, $GUI_CHECKED) +Global $g_hRL8 = GUICtrlCreateRadio("", -1, 30, 20, 20) +Global $g_hRR8 = GUICtrlCreateRadio("", -1, 20, 20, 20) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hRL8, $GUI_DISABLE) + GUICtrlSetState($g_hRR8, $GUI_DISABLE) +EndIf +GUICtrlCreateLabel("A8", 1, 30, -1, -1) +GUICtrlCreateLabel("Target", 20, -1, 200, 20) + +Global $g_hButtonChangeAD = GUICtrlCreateButton("1+2 <--> 5+6", -250, 30, 80, 30) +Global $g_hButtonExtAD56 = GUICtrlCreateButton("ext. AD > 5+6", 100, -1, 80, 30) +Global $g_hButtonExtAD12 = GUICtrlCreateButton("ext. AD > 1+2", 100, -1, 80, 30) +If Not $g_bWavAvailable Then + GUICtrlSetState($g_hButtonExtAD56, $GUI_DISABLE) + GUICtrlSetState($g_hButtonExtAD12, $GUI_DISABLE) +EndIf + +Global $g_hButtonOK = GUICtrlCreateButton("Swap", -200, 50, 280, 30) + +GUISetState(@SW_SHOW) +AutoItSetOption("GUICoordMode", 1) +#EndRegion GUI Routing + +While True + Switch GUIGetMsg() + Case $GUI_EVENT_CLOSE + ExitLoop + Case $g_hButtonChangeAD + GUICtrlSetState($g_hR15, $GUI_CHECKED) + GUICtrlSetState($g_hR26, $GUI_CHECKED) + GUICtrlSetState($g_hR33, $GUI_CHECKED) + GUICtrlSetState($g_hR44, $GUI_CHECKED) + GUICtrlSetState($g_hR51, $GUI_CHECKED) + GUICtrlSetState($g_hR62, $GUI_CHECKED) + GUICtrlSetState($g_hR77, $GUI_CHECKED) + GUICtrlSetState($g_hR88, $GUI_CHECKED) + Case $g_hButtonExtAD56 + GUICtrlSetState($g_hR11, $GUI_CHECKED) + GUICtrlSetState($g_hR22, $GUI_CHECKED) + GUICtrlSetState($g_hR33, $GUI_CHECKED) + GUICtrlSetState($g_hR44, $GUI_CHECKED) + GUICtrlSetState($g_hRL5, $GUI_CHECKED) + GUICtrlSetState($g_hRR6, $GUI_CHECKED) + GUICtrlSetState($g_hR77, $GUI_CHECKED) + GUICtrlSetState($g_hR88, $GUI_CHECKED) + Case $g_hButtonExtAD12 + GUICtrlSetState($g_hRL1, $GUI_CHECKED) + GUICtrlSetState($g_hRR2, $GUI_CHECKED) + GUICtrlSetState($g_hR33, $GUI_CHECKED) + GUICtrlSetState($g_hR44, $GUI_CHECKED) + GUICtrlSetState($g_hR15, $GUI_CHECKED) + GUICtrlSetState($g_hR26, $GUI_CHECKED) + GUICtrlSetState($g_hR77, $GUI_CHECKED) + GUICtrlSetState($g_hR88, $GUI_CHECKED) + Case $g_hButtonOK + If GUICtrlRead($g_hR11) = $GUI_CHECKED And GUICtrlRead($g_hR22) = $GUI_CHECKED And GUICtrlRead($g_hR33) = $GUI_CHECKED And GUICtrlRead($g_hR44) = $GUI_CHECKED And GUICtrlRead($g_hR55) = $GUI_CHECKED And GUICtrlRead($g_hR66) = $GUI_CHECKED And GUICtrlRead($g_hR77) = $GUI_CHECKED And GUICtrlRead($g_hR88) = $GUI_CHECKED Then + MsgBox($MB_TOPMOST, "Warning", "Track routing is unchanged - no swapping necessary.") + Else + ExitLoop + EndIf + EndSwitch +WEnd + +#Region - track setting +; set audio tracks +Global $g_aRouting[9] +Global $g_bMuteRouted = False +Global $g_bExternalWavRouted = False +; track 1 +Select + Case GUICtrlRead($g_hRm1) = $GUI_CHECKED + $g_aRouting[1] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR11) = $GUI_CHECKED + $g_aRouting[1] = "0:1" + Case GUICtrlRead($g_hR21) = $GUI_CHECKED + $g_aRouting[1] = "0:2" + Case GUICtrlRead($g_hR31) = $GUI_CHECKED + $g_aRouting[1] = "0:3" + Case GUICtrlRead($g_hR41) = $GUI_CHECKED + $g_aRouting[1] = "0:4" + Case GUICtrlRead($g_hR51) = $GUI_CHECKED + $g_aRouting[1] = "0:5" + Case GUICtrlRead($g_hR61) = $GUI_CHECKED + $g_aRouting[1] = "0:6" + Case GUICtrlRead($g_hR71) = $GUI_CHECKED + $g_aRouting[1] = "0:7" + Case GUICtrlRead($g_hR81) = $GUI_CHECKED + $g_aRouting[1] = "0:8" + Case GUICtrlRead($g_hRL1) = $GUI_CHECKED + $g_aRouting[1] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR1) = $GUI_CHECKED + $g_aRouting[1] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 2 +Select + Case GUICtrlRead($g_hRm2) = $GUI_CHECKED + $g_aRouting[2] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR12) = $GUI_CHECKED + $g_aRouting[2] = "0:1" + Case GUICtrlRead($g_hR22) = $GUI_CHECKED + $g_aRouting[2] = "0:2" + Case GUICtrlRead($g_hR32) = $GUI_CHECKED + $g_aRouting[2] = "0:3" + Case GUICtrlRead($g_hR42) = $GUI_CHECKED + $g_aRouting[2] = "0:4" + Case GUICtrlRead($g_hR52) = $GUI_CHECKED + $g_aRouting[2] = "0:5" + Case GUICtrlRead($g_hR62) = $GUI_CHECKED + $g_aRouting[2] = "0:6" + Case GUICtrlRead($g_hR72) = $GUI_CHECKED + $g_aRouting[2] = "0:7" + Case GUICtrlRead($g_hR82) = $GUI_CHECKED + $g_aRouting[2] = "0:8" + Case GUICtrlRead($g_hRL2) = $GUI_CHECKED + $g_aRouting[2] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR2) = $GUI_CHECKED + $g_aRouting[2] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 3 +Select + Case GUICtrlRead($g_hRm3) = $GUI_CHECKED + $g_aRouting[3] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR13) = $GUI_CHECKED + $g_aRouting[3] = "0:1" + Case GUICtrlRead($g_hR23) = $GUI_CHECKED + $g_aRouting[3] = "0:2" + Case GUICtrlRead($g_hR33) = $GUI_CHECKED + $g_aRouting[3] = "0:3" + Case GUICtrlRead($g_hR43) = $GUI_CHECKED + $g_aRouting[3] = "0:4" + Case GUICtrlRead($g_hR53) = $GUI_CHECKED + $g_aRouting[3] = "0:5" + Case GUICtrlRead($g_hR63) = $GUI_CHECKED + $g_aRouting[3] = "0:6" + Case GUICtrlRead($g_hR73) = $GUI_CHECKED + $g_aRouting[3] = "0:7" + Case GUICtrlRead($g_hR83) = $GUI_CHECKED + $g_aRouting[3] = "0:8" + Case GUICtrlRead($g_hRL3) = $GUI_CHECKED + $g_aRouting[3] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR3) = $GUI_CHECKED + $g_aRouting[3] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 4 +Select + Case GUICtrlRead($g_hRm4) = $GUI_CHECKED + $g_aRouting[4] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR14) = $GUI_CHECKED + $g_aRouting[4] = "0:1" + Case GUICtrlRead($g_hR24) = $GUI_CHECKED + $g_aRouting[4] = "0:2" + Case GUICtrlRead($g_hR34) = $GUI_CHECKED + $g_aRouting[4] = "0:3" + Case GUICtrlRead($g_hR44) = $GUI_CHECKED + $g_aRouting[4] = "0:4" + Case GUICtrlRead($g_hR54) = $GUI_CHECKED + $g_aRouting[4] = "0:5" + Case GUICtrlRead($g_hR64) = $GUI_CHECKED + $g_aRouting[4] = "0:6" + Case GUICtrlRead($g_hR74) = $GUI_CHECKED + $g_aRouting[4] = "0:7" + Case GUICtrlRead($g_hR84) = $GUI_CHECKED + $g_aRouting[4] = "0:8" + Case GUICtrlRead($g_hRL4) = $GUI_CHECKED + $g_aRouting[4] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR4) = $GUI_CHECKED + $g_aRouting[4] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 5 +Select + Case GUICtrlRead($g_hRm5) = $GUI_CHECKED + $g_aRouting[5] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR15) = $GUI_CHECKED + $g_aRouting[5] = "0:1" + Case GUICtrlRead($g_hR25) = $GUI_CHECKED + $g_aRouting[5] = "0:2" + Case GUICtrlRead($g_hR35) = $GUI_CHECKED + $g_aRouting[5] = "0:3" + Case GUICtrlRead($g_hR45) = $GUI_CHECKED + $g_aRouting[5] = "0:4" + Case GUICtrlRead($g_hR55) = $GUI_CHECKED + $g_aRouting[5] = "0:5" + Case GUICtrlRead($g_hR65) = $GUI_CHECKED + $g_aRouting[5] = "0:6" + Case GUICtrlRead($g_hR75) = $GUI_CHECKED + $g_aRouting[5] = "0:7" + Case GUICtrlRead($g_hR85) = $GUI_CHECKED + $g_aRouting[5] = "0:8" + Case GUICtrlRead($g_hRL5) = $GUI_CHECKED + $g_aRouting[5] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR5) = $GUI_CHECKED + $g_aRouting[5] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 6 +Select + Case GUICtrlRead($g_hRm6) = $GUI_CHECKED + $g_aRouting[6] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR16) = $GUI_CHECKED + $g_aRouting[6] = "0:1" + Case GUICtrlRead($g_hR26) = $GUI_CHECKED + $g_aRouting[6] = "0:2" + Case GUICtrlRead($g_hR36) = $GUI_CHECKED + $g_aRouting[6] = "0:3" + Case GUICtrlRead($g_hR46) = $GUI_CHECKED + $g_aRouting[6] = "0:4" + Case GUICtrlRead($g_hR56) = $GUI_CHECKED + $g_aRouting[6] = "0:5" + Case GUICtrlRead($g_hR66) = $GUI_CHECKED + $g_aRouting[6] = "0:6" + Case GUICtrlRead($g_hR76) = $GUI_CHECKED + $g_aRouting[6] = "0:7" + Case GUICtrlRead($g_hR86) = $GUI_CHECKED + $g_aRouting[6] = "0:8" + Case GUICtrlRead($g_hRL6) = $GUI_CHECKED + $g_aRouting[6] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR6) = $GUI_CHECKED + $g_aRouting[6] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 7 +Select + Case GUICtrlRead($g_hRm7) = $GUI_CHECKED + $g_aRouting[7] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR17) = $GUI_CHECKED + $g_aRouting[7] = "0:1" + Case GUICtrlRead($g_hR27) = $GUI_CHECKED + $g_aRouting[7] = "0:2" + Case GUICtrlRead($g_hR37) = $GUI_CHECKED + $g_aRouting[7] = "0:3" + Case GUICtrlRead($g_hR47) = $GUI_CHECKED + $g_aRouting[7] = "0:4" + Case GUICtrlRead($g_hR57) = $GUI_CHECKED + $g_aRouting[7] = "0:5" + Case GUICtrlRead($g_hR67) = $GUI_CHECKED + $g_aRouting[7] = "0:6" + Case GUICtrlRead($g_hR77) = $GUI_CHECKED + $g_aRouting[7] = "0:7" + Case GUICtrlRead($g_hR87) = $GUI_CHECKED + $g_aRouting[7] = "0:8" + Case GUICtrlRead($g_hRL7) = $GUI_CHECKED + $g_aRouting[7] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR7) = $GUI_CHECKED + $g_aRouting[7] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +; track 8 +Select + Case GUICtrlRead($g_hRm8) = $GUI_CHECKED + $g_aRouting[8] = "1:0" + $g_bMuteRouted = True + Case GUICtrlRead($g_hR18) = $GUI_CHECKED + $g_aRouting[8] = "0:1" + Case GUICtrlRead($g_hR28) = $GUI_CHECKED + $g_aRouting[8] = "0:2" + Case GUICtrlRead($g_hR38) = $GUI_CHECKED + $g_aRouting[8] = "0:3" + Case GUICtrlRead($g_hR48) = $GUI_CHECKED + $g_aRouting[8] = "0:4" + Case GUICtrlRead($g_hR58) = $GUI_CHECKED + $g_aRouting[8] = "0:5" + Case GUICtrlRead($g_hR68) = $GUI_CHECKED + $g_aRouting[8] = "0:6" + Case GUICtrlRead($g_hR78) = $GUI_CHECKED + $g_aRouting[8] = "0:7" + Case GUICtrlRead($g_hR88) = $GUI_CHECKED + $g_aRouting[8] = "0:8" + Case GUICtrlRead($g_hRL8) = $GUI_CHECKED + $g_aRouting[8] = '"[L]"' + $g_bExternalWavRouted = True + Case GUICtrlRead($g_hRR8) = $GUI_CHECKED + $g_aRouting[8] = '"[R]"' + $g_bExternalWavRouted = True +EndSelect +#EndRegion - track setting +;~ _ArrayDisplay($g_aRouting) +For $i = 1 To UBound($g_aRouting) -1 + ConsoleWrite($g_aRouting[$i] & @CRLF) +Next +ConsoleWrite("$g_bMuteRouted: " & $g_bMuteRouted & @CRLF) +ConsoleWrite("$g_bExternalWavRouted: " & $g_bExternalWavRouted & @CRLF) + +SplashTextOn("Be patient", "MXF-Track-Swap will be prepared ...", 300, 50) +If Not FileExists(@TempDir & "\ffmpeg.exe") Then + FileInstall('K:\ffmpeg\bin\ffmpeg.exe', @TempDir & "\ffmpeg.exe", $FC_OVERWRITE) +EndIf +SplashOff() + +Local $sPathFFmpeg = @TempDir & "\" +Global $g_hTimerStart +Global $g_sStdErrAll + +_ReWrap() +ShellExecute(@TempDir) + +Exit + +;~ #cs +#Region Funcs +Func _CheckForInputFiles($aFiles) +;~ _ArrayDisplay($aFiles) + Local $bFoundMXF = False, $bFoundWAV = False + Local $sDrive, $sDir, $sFileName, $sExtension + For $i = 1 To $aFiles[0] + _PathSplit($aFiles[$i], $sDrive, $sDir, $sFileName, $sExtension) + ; ignore folder + If $sExtension = "" Then ContinueLoop + ; only look for mxf or wav + Switch StringLower($sExtension) + Case ".mxf" + If Not $bFoundMXF Then + If FileExists($aFiles[$i]) Then + $g_sMXFFile = $aFiles[$i] + $g_bMxfAvailable = True + $bFoundMXF = True + EndIf + EndIf + Case ".wav" + If Not $bFoundWAV Then + If FileExists($aFiles[$i]) Then + $g_sWAVFile = $aFiles[$i] + $g_bWavAvailable = True + $bFoundWAV = True + EndIf + EndIf + EndSwitch + If $bFoundMXF = True And $bFoundWAV = True Then ExitLoop + Next + +EndFunc + + +Func _ReWrap() + $g_hTimerStart = TimerInit() + GUIDelete($g_hGUI) + $g_hGUI = GUICreate("MXF-Track-Swap Muxing", 600, 160) + GUICtrlCreateLabel("MXF-File: " & _FileName($g_sMXFFile), 10, 10, 580, 30) + GUICtrlSetFont(-1, 14, 400, 0, "Courier New") + GUICtrlCreateLabel("Rewrapping:", 10, 50, 580, 30) + GUICtrlSetFont(-1, 12, 400, 0, "Courier New") + Global $Progress1 = GUICtrlCreateProgress(10, 80, 580, 20) + Global $Edit = GUICtrlCreateLabel("", 10, 120, 260, 30) + GUICtrlSetFont(-1, 14, 400, 0, "Courier New") + Global $g_hLabelRunningTime = GUICtrlCreateLabel("", 440, 120, 150, 30, $SS_RIGHT) + GUICtrlSetFont(-1, 14, 400, 0, "Courier New") + GUISetState(@SW_SHOW) + + ;~ Code zum Remuxen: Video erhalten, Audio: 1>5, 2>6, 3>3, 4>4, 5 mute, 6 mute, 7>L, 8>R + ;~ ffmpeg -i Video.mxf -f lavfi -i anullsrc=r=48000:cl=mono -i Stereo.wav -ar 48000 -filter_complex "[2:a]apad,channelsplit=channel_layout=stereo[L][R]" -map 0:0 -map 0:5 -map 0:6 -map 0:3 -map 0:4 -map 1:0 -map 1:0 -map "[L]" -map "[R]" -c:v copy -c:a pcm_s24le -shortest -y Video_swapped.mxf + Local $sCommand + ; video file + $sCommand = '-i "' & $g_sMXFFile & '"' + ; muted source + If $g_bMuteRouted Then + $sCommand &= ' -f lavfi -i anullsrc=r=48000:cl=mono' + EndIf + ; external wav file + If $g_bExternalWavRouted Then + $sCommand &= ' -i "' & $g_sWAVFile & '" -ar 48000 -filter_complex "[' + If Not $g_bMuteRouted Then + $sCommand &= '1' + Else + $sCommand &= '2' + EndIf + $sCommand &= ':a]apad,channelsplit=channel_layout=stereo[L][R]"' + EndIf + ; video mapping + $sCommand &= ' -map 0:0' + ; audio mapping + For $i = 1 To UBound($g_aRouting) -1 + $sCommand &= ' -map ' & $g_aRouting[$i] + Next + ; copy video, set audio to 24 bit, use shortest file (always the mxf file) as length, overwrite existing file + $sCommand &= ' -c:v copy -c:a pcm_s24le -shortest -y' + ; output file + Local $sSuffix + For $i = 1 To UBound($g_aRouting) -1 + $sSuffix &= '_' & $i & '-' & StringRegExpReplace(StringRegExpReplace($g_aRouting[$i], "\d:", ""), '[\[\]"]', "") + Next + $sSuffix &= '.mxf' + $sCommand &= ' "' & @TempDir & '\' & _StripFileExtension(_FileName($g_sMXFFile)) & $sSuffix + ConsoleWrite("$command: " & $sCommand & @CRLF) + _runFFmpeg('ffmpeg ' & $sCommand, $sPathFFmpeg, 1) + GUICtrlSetData($Edit, "Ready") + WinSetOnTop($g_hGUI, "", $WINDOWS_ONTOP) + +EndFunc + +Func _runFFmpeg($command, $wd, $iProgress) + Local $hPid = Run('"' & @ComSpec & '" /c ' & $command, $wd, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD) + Local $sStdErr, $sTimer + Local $iTicksDuration = 0, $iTicksTime = 0, $iTimer + While 1 + Sleep(500) + $sStdErr = StderrRead($hPid) + If @error Then ExitLoop + $g_sStdErrAll &= $sStdErr + If StringLen($sStdErr) > 0 Then + If Not $iTicksDuration Then $iTicksDuration = _GetDuration($sStdErr) + $iTicksTime = _GetTime($sStdErr) + If Not @error Then $sStdErr = "" + Switch $iProgress + Case 1 + GUICtrlSetData($Progress1, $iTicksTime * 100 / $iTicksDuration) + EndSwitch + EndIf + $iTimer = TimerDiff($g_hTimerStart) + $sTimer = _Zeit($iTimer) + If GUICtrlRead($g_hLabelRunningTime) <> $sTimer Then + GUICtrlSetData($g_hLabelRunningTime, $sTimer) + EndIf + WEnd +EndFunc + +Func _GetDuration($sStdErr) + If Not StringInStr($sStdErr, "Duration:") Then Return SetError(1, 0, 0) + Local $aRegExp = StringRegExp($sStdErr, "(?i)Duration.+?([0-9:]+)", 3) + If @error Or Not IsArray($aRegExp) Then Return SetError(2, 0, 0) + Local $sTime = $aRegExp[0] + Local $aTime = StringSplit($sTime, ":", 2) + If @error Or Not IsArray($aTime) Then Return SetError(3, 0, 0) + Return _TimeToTicks($aTime[0], $aTime[1], $aTime[2]) +EndFunc ;==>_GetDuration + +Func _GetTime($sStdErr) + If Not StringInStr($sStdErr, "time=") Then Return SetError(1, 0, 0) + Local $aRegExp = StringRegExp($sStdErr, "(?i)time.+?([0-9:]+)", 3) + If @error Or Not IsArray($aRegExp) Then Return SetError(2, 0, 0) + Local $sTime = $aRegExp[UBound($aRegExp) - 1] + Local $aTime = StringSplit($sTime, ":", 2) + If @error Or Not IsArray($aTime) Then Return SetError(3, 0, 0) + Return _TimeToTicks($aTime[0], $aTime[1], $aTime[2]) +EndFunc ;==>_GetTime + +Func _FileName($sFullPath) + Local $iDelimiter = StringInStr($sFullPath, "\", 0, -1) + Return StringTrimLeft($sFullPath, $iDelimiter) +EndFunc + +Func _StripFileExtension($sFile) + Local $iDelimiter = StringInStr($sFile, ".", 0, -1) + Return StringLeft($sFile, $iDelimiter - 1) +EndFunc + +Func _Zeit($iMs, $bComfortView = True) ; from ms to a format: "12h 36m 56s 13f" (with special space between - ChrW(8239)) + Local $sReturn + $iMs = Int($iMs) + Local $iFrames, $iMSec, $iSec, $iMin, $iHour, $sSign + If $iMs < 0 Then + $iMs = Abs($iMs) + $sSign = '-' + EndIf + $iMSec = StringRight($iMs, 3) + $iFrames = $iMSec / 40 + $iSec = $iMs / 1000 + $iMin = $iSec / 60 + $iHour = $iMin / 60 + $iMin -= Int($iHour) * 60 + $iSec -= Int($iMin) * 60 + If $bComfortView Then ; no hours if not present and no frames + If Not Int($iHour) = 0 Then $sReturn &= StringRight('0' & Int($iHour), 2) & 'h' & ChrW(8239) + $sReturn &= StringRight('0' & Int($iMin), 2) & 'm' & ChrW(8239) + If Int($iHour) = 0 Then $sReturn &= StringRight('0' & Int($iSec), 2) & 's' ; zum DEBUGGING auskommentieren + Else + $sReturn = $sSign & StringRight('0' & Int($iHour), 2) & 'h' & ChrW(8239) & StringRight('0' & Int($iMin), 2) & 'm' & ChrW(8239) & StringRight('0' & Int($iSec), 2) & 's' & ChrW(8239) & StringRight('0' & Int($iFrames), 2) & 'f' + EndIf + Return $sReturn +EndFunc ;==>_Zeit + +Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam) + If $bPaused Then Return + #forceref $hWnd, $msgID, $wParam, $lParam + Local $nSize, $pFileName + Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 0) + ReDim $g_aDropFiles[$nAmt[0]] + For $i = 0 To $nAmt[0] - 1 + $nSize = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', 0, 'int', 0) + $nSize = $nSize[0] + 1 + $pFileName = DllStructCreate('wchar[' & $nSize & ']') + DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', DllStructGetPtr($pFileName), 'int', $nSize) + $g_aDropFiles[$i] = DllStructGetData($pFileName, 1) + $pFileName = 0 + Next + _ArrayInsert($g_aDropFiles, 0, UBound($g_aDropFiles)) + GUICtrlSendToDummy($FILES_DROPPED, $nAmt[0]) +EndFunc ;==>WM_DROPFILES_FUNC +#EndRegion diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..28794e7d0ee73a0f210fbc5ab51553bea6520ab6 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# mxf-track-swap + +Provide a mxf (tested only with xdcam hd 422 op1a including 8 audio tracks) and create a new one where you can swap the audio tracks. You can provide a stereo audio file too, to embed it into the new mxf. + +## Prerequisites + +To build your swapper yourself you need a compiled ffmpeg that must be embedded into your swapper. Customize the following code line: + +`FileInstall('K:\ffmpeg\bin\ffmpeg.exe', @TempDir & "\ffmpeg.exe", $FC_OVERWRITE)` + +## Manual + +Start the app and drag and drop a mxf file onto the gui. You can drag and drop an audio stereo file too. + + + +After pushing the "Next" button you have to do your routing. + + + +The tracks of the source are provided on the left side, the tracks of the target on the bottom. Click the radios for setting the cross points. + +As we mostly use this tool for distributing audio descriptions for severeal use cases there are 3 preset buttons you can use too. + +- button `1+2 <-> 5+6`: swap tracks 1 and 2 with 5 and 6 +- button `ext. AD > 5+6`: embed an external audio description in tracks 5 and 6 +- button `ext. AD > 1+2`: embed an external audio description in tracks 1 and 2 + +When you are ready with the routing push the button "Swap". A gui will show the progress of the swapping. + + + +The new mxf file will be created in `%temp%` folder. This folder will be opened automatically. The file naming is made with this rules: + +- video file name_ +- 1-routed source track_ +- 2-routed source track_ +- 3-routed source track_ +- 4-routed source track_ +- 5-routed source track_ +- 6-routed source track_ +- 7-routed source track_ +- 8-routed source track +- .mxf + +The routing example in the image above would be named `Spurkennung_1-5_2-6_3-3_4-4_5-L_6-R_7-8_8-7.mxf`. + +## Known issues +If you use only one track ot the external stereo wav file (e.g. "[R]") it breaks: "Filter channelsplit:FL has an unconnected outut". diff --git a/icon/swap.ico b/icon/swap.ico new file mode 100644 index 0000000000000000000000000000000000000000..a64df47dbe68e129af1d65a247f828180097b6e7 Binary files /dev/null and b/icon/swap.ico differ diff --git a/images/MXF-Track-Swap_drop-files.png b/images/MXF-Track-Swap_drop-files.png new file mode 100644 index 0000000000000000000000000000000000000000..a526adf9eca5e634b2e05e6801f72472e15a9229 Binary files /dev/null and b/images/MXF-Track-Swap_drop-files.png differ diff --git a/images/MXF-Track-Swap_muxing.png b/images/MXF-Track-Swap_muxing.png new file mode 100644 index 0000000000000000000000000000000000000000..670d9bad2e63d0e912ce72cb2e2dfd6f85366bdf Binary files /dev/null and b/images/MXF-Track-Swap_muxing.png differ diff --git a/images/MXF-Track-Swap_routing.png b/images/MXF-Track-Swap_routing.png new file mode 100644 index 0000000000000000000000000000000000000000..6197b87634793db7c3df979e32a8c2053908780c Binary files /dev/null and b/images/MXF-Track-Swap_routing.png differ