From 501f72cbc8a9c04b8e28875eda035748ecd2b03a Mon Sep 17 00:00:00 2001 From: Conrad Zelck <c.zelck@ndr.de> Date: Fri, 17 Mar 2023 16:02:09 +0100 Subject: [PATCH] first commit of sources Signed-off-by: Conrad Zelck <git@simpel.cc> --- .gitignore | 7 + MXF-Track-Swap.au3 | 749 +++++++++++++++++++++++++++ README.md | 49 ++ icon/swap.ico | Bin 0 -> 4211 bytes images/MXF-Track-Swap_drop-files.png | Bin 0 -> 6671 bytes images/MXF-Track-Swap_muxing.png | Bin 0 -> 8427 bytes images/MXF-Track-Swap_routing.png | Bin 0 -> 7914 bytes 7 files changed, 805 insertions(+) create mode 100644 .gitignore create mode 100644 MXF-Track-Swap.au3 create mode 100644 README.md create mode 100644 icon/swap.ico create mode 100644 images/MXF-Track-Swap_drop-files.png create mode 100644 images/MXF-Track-Swap_muxing.png create mode 100644 images/MXF-Track-Swap_routing.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44b0beb --- /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 0000000..98d2b62 --- /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 0000000..28794e7 --- /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 GIT binary patch literal 4211 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 Q*B=IxE0zXLdLBvt1z<(j6951J literal 0 HcmV?d00001 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 GIT binary patch literal 6671 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 literal 0 HcmV?d00001 diff --git a/images/MXF-Track-Swap_muxing.png b/images/MXF-Track-Swap_muxing.png new file mode 100644 index 0000000000000000000000000000000000000000..670d9bad2e63d0e912ce72cb2e2dfd6f85366bdf GIT binary patch literal 8427 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 CY>KV` literal 0 HcmV?d00001 diff --git a/images/MXF-Track-Swap_routing.png b/images/MXF-Track-Swap_routing.png new file mode 100644 index 0000000000000000000000000000000000000000..6197b87634793db7c3df979e32a8c2053908780c GIT binary patch literal 7914 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 Pi|Ai8zEFJr#_j(A&|w>H literal 0 HcmV?d00001 -- GitLab