From 1106c82eab7099c4f8f950dbe9cb0fb5bc351fd9 Mon Sep 17 00:00:00 2001 From: michalcourson Date: Sat, 28 Mar 2026 07:11:31 -0400 Subject: [PATCH] fix device index floating --- audio-service/src/settings.py | 4 +- audio-service/src/windows_audio.py | 36 ++- audio-service/test.json | 206 ++++++++++++++++++ .../ClipTrimDotNet/Client/ClipTrimClient.cs | 3 +- .../ClipTrimDotNet/ClipTrim.streamDeckProfile | Bin 0 -> 6773 bytes .../ClipTrimDotNet/ClipTrimDotNet.csproj | 8 +- 6 files changed, 239 insertions(+), 18 deletions(-) create mode 100644 audio-service/test.json create mode 100644 stream_deck_plugin/ClipTrimDotNet/ClipTrim.streamDeckProfile diff --git a/audio-service/src/settings.py b/audio-service/src/settings.py index 2b11fed..a81bfa6 100644 --- a/audio-service/src/settings.py +++ b/audio-service/src/settings.py @@ -98,8 +98,8 @@ class SettingsManager: recorder.recordings_dir = self.get_settings('save_path') audio_manager = WindowsAudioManager() - audio_manager.set_default_input_device(self.get_settings('input_device')['index']) - audio_manager.set_default_output_device(self.get_settings('output_device')['index']) + audio_manager.set_default_input_device(self.get_settings('input_device')) + audio_manager.set_default_output_device(self.get_settings('output_device')) recorder.refresh_streams() diff --git a/audio-service/src/windows_audio.py b/audio-service/src/windows_audio.py index 38f2468..bbb4386 100644 --- a/audio-service/src/windows_audio.py +++ b/audio-service/src/windows_audio.py @@ -75,34 +75,46 @@ class WindowsAudioManager: } ] - def set_default_input_device(self, device_index): - if(device_index is None): + def set_default_input_device(self, device): + if(device is None): return 0 """ Set the default input audio device. - :param device_index: Index of the audio device + :param device: Audio device information :return: Sample rate of the selected device """ - sd.default.device[0] = device_index - self.default_input = device_index + corrected_device = None + # set corrected device index based on the name of the device matching the provided device name + for dev in self.devices: + if dev['name'] == device['name']: + corrected_device = dev['index'] + break + sd.default.device[0] = corrected_device + self.default_input = corrected_device # Get the sample rate of the selected device - device_info = sd.query_devices(device_index) + device_info = sd.query_devices(corrected_device) return device_info['default_samplerate'] - def set_default_output_device(self, device_index): - if(device_index is None): + def set_default_output_device(self, device): + if(device is None): return self.get_current_output_device_sample_rate() """ Set the default output audio device. - :param device_index: Index of the audio device + :param device: Audio device information :return: Sample rate of the selected device """ - sd.default.device[1] = device_index - self.default_output = device_index + corrected_device = None + # set corrected device index based on the name of the device matching the provided device name + for dev in self.devices: + if dev['name'] == device['name']: + corrected_device = dev['index'] + break + sd.default.device[1] = corrected_device + self.default_output = corrected_device # Get the sample rate of the selected device - device_info = sd.query_devices(device_index) + device_info = sd.query_devices(corrected_device) return device_info['default_samplerate'] \ No newline at end of file diff --git a/audio-service/test.json b/audio-service/test.json new file mode 100644 index 0000000..73ce3f2 --- /dev/null +++ b/audio-service/test.json @@ -0,0 +1,206 @@ +[ + { + "name": "Speakers (Realtek(R) Audio)", + "index": 38, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Headset Earphone (4- Arctis 7 Chat)", + "index": 39, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 1, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Line (Voicemod Virtual Audio Device (WDM))", + "index": 40, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Headphones (Oculus Virtual Audio Device)", + "index": 41, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "VM to Headset (VB-Audio Voicemeeter VAIO)", + "index": 42, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.002, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "VM to Discord (VB-Audio Voicemeeter VAIO)", + "index": 43, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.002, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "VM to OBS (VB-Audio Voicemeeter VAIO)", + "index": 44, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.002, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Headphones (4- Arctis 7 Game)", + "index": 45, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Speakers (2- Focusrite USB Audio)", + "index": 46, + "hostapi": 2, + "max_input_channels": 0, + "max_output_channels": 2, + "default_low_input_latency": 0.0, + "default_low_output_latency": 0.003, + "default_high_input_latency": 0.0, + "default_high_output_latency": 0.01, + "default_samplerate": 48000.0 + }, + { + "name": "Headset Microphone (4- Arctis 7 Chat)", + "index": 47, + "hostapi": 2, + "max_input_channels": 1, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "Analogue 1 + 2 (2- Focusrite USB Audio)", + "index": 48, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "Voicemeeter Out B3 (VB-Audio Voicemeeter VAIO)", + "index": 49, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "Microphone (Voicemod Virtual Audio Device (WDM))", + "index": 50, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "Voicemeeter Out A2 (VB-Audio Voicemeeter VAIO)", + "index": 51, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "VM Mic mix (VB-Audio Voicemeeter VAIO)", + "index": 52, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "VM Rec mix (VB-Audio Voicemeeter VAIO)", + "index": 53, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + }, + { + "name": "Voicemeeter Out A1 (VB-Audio Voicemeeter VAIO)", + "index": 54, + "hostapi": 2, + "max_input_channels": 2, + "max_output_channels": 0, + "default_low_input_latency": 0.003, + "default_low_output_latency": 0.0, + "default_high_input_latency": 0.01, + "default_high_output_latency": 0.0, + "default_samplerate": 48000.0 + } +] diff --git a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs index 1a3177c..8b9f93b 100644 --- a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs @@ -265,6 +265,7 @@ namespace ClipTrimDotNet.Client public async void SaveClip() { if (socket is null) return; + CheckPort(); await socket.EmitAsync("record_clip", new List() { }); } @@ -272,7 +273,7 @@ namespace ClipTrimDotNet.Client { if (socket is null) return; //Logger.Instance.LogMessage(TracingLevel.INFO, $"Checking port {socket}"); - if (currentHostname != HostName) + if (currentHostname != HostName || !socket.Connected) { //Logger.Instance.LogMessage(TracingLevel.INFO, $"port {socket}"); if (socket.Connected) diff --git a/stream_deck_plugin/ClipTrimDotNet/ClipTrim.streamDeckProfile b/stream_deck_plugin/ClipTrimDotNet/ClipTrim.streamDeckProfile new file mode 100644 index 0000000000000000000000000000000000000000..628d490b2e0f16fe67ef05b78e5e18e2ac2095ed GIT binary patch literal 6773 zcmcgx2{_bS8y{Pik|leJA-lntF=mLa8SBu+WQkN{PZ(rvRhOacN?9WNGD5=5(if3z z8Dh$oowAN4bmN+D=5{OH`?-(Gch5ZYoag_{%zJ+4eShzJ-t!wHeL8wB0231vAWOr| z3h?I`q0GAg2LMI zf^RehQ-;G7ASeh3t_cH!pqfYx5L_Efc~nr=)Uo!v4ST_e<7Y8AM&$msG1C!=K>mpgb)N%C8&K#!vt zFC65)x`$Ch>c$}X#IA{#kiHr0EbF85YKO=p42}+G#8cC!6sc5ERQG*o$*c{^9#gPpvWyk zIc@sPuRORhyTYUEZggoE>m3_DV9=zJo!=U?B;9vJ$mnT({o5swPO*woXRec!__4}@ zi5t#J>bF=(iYd4WCbq?#qBUA7O|7LX;+rT$q`Gl)ZfX30gSUy^4%-1iK^uyMLBN_I zC<1{5LBS{(B_ohf5E2DdRD#3c3J_)R4<^I5;6x!cU=S@70)#?9DL7GJC&_O@>i7OMP#ijN1~qEoH)YMQ+N>=5yo(_ia<;wgh+6$X$N3 zvn@9F?~$8{*Z1m$u|Io!jq#BucU1_ZduT_Ao2A5vj!H)!POK;jo~6sG*XRvdpWTQ4 zSv)SGWH!@OyNX@-rM)HFT z^RHdzkq=LbH#^kNUOLxPL4wpn?u+v1WQWOdkH(?f_>^v-cMLXF*d0!bdM1BusjOag zavhz~QDJ$)n>cK*n$$6OG((Gf{3y!F{P+MY*2ug$70(k{GPDOgME)t|G+rzDzS!=? zd)mzcq~OXiM#hv!7DvoSV(ibneu-~a0}rKi44L-sD#RKSeS3xWuHGUFjp#3=D))s4 zzE|*jtvNZF2Q)j7f3B%3k*Kg-IBxpTIfrBcg!mxb-Gzd%9sVcGA2?_{uVyLBIn_71 z=rCGxuQ!5wIx8I~u2`BNxUf(If~BVC2gWx^0Km7I0tBf{~Ry z7b87WcseG$4UZqXBbSFgVwipC-Un%e?DY6~;IeCacE=94Ub&y$JT4eS;pjQe&6R1K zlSlnx$9-j7fF@IH?trYaR9sKDyaZG0+fl(+MBQ|}%qG!#rDjt~!hH<-i{l`eAZbV~M%3#Hbt7@2*_ z8GV4FG1qw{(*UlvyZg0h-X zSA{XO#02H;a+mf(#4AhK4f>NuJ}%(ZDze`W08Qvf;G(i!kWT~&{X8-`gw&UR1Qu+I{TB8tPEoEH@27>^b zDJx^p2yj4+ZvQ< zj=>2~QYnf=ady!XF~Uk}9HIk`?0PLpd`C2pKw2`LA!m7KrC5x3RN2e%IlnM*_2@VziUr5VY!+S4!XC9o5AJIA;F?j*7S-@(yo5^b%m=xEyeajGVD3+Kj+Cxiu}?3+ZwArO0i zC96>Nf*cd#m0ZU@T_7;#;rJ6tceXw>Smq*&ORezJjM&-YH<^3_OFoB?#Nxi+-)bfE z>`kaw_vk7=YjP=n)OIrV`lYIC3wqW37@*J0z$z_AFd_BOBkjv3Mkk@M+LYMe2d#f1CF_9;k*}-X96L08rFC3zCK?woJ2H;NW2p|Ez}z-QM&JN zP`EhmC?Z-MWa`R`#m6}k@8V~wBqMDV7rl6&)uq2qNQx$O%2s(4I?La#lCvZmd28f# zF6f-n44S?!jYs_+ZkH0l@glKed2zYV!lFTRAz0vk<$wJ3-XFCeeMD;1d`xOEvZ#H3 z%Wl1jKDtYVz|D>6PhWx8qGdaVPu(_37(<~ZYT)oVay*82Z|)(p{=-HZz+ZnUvyMtG z<|;dCSz30}ySt&LU+jHDN?Z2Rxrh__IjWFM^?>p2u(gPkDT5JXx+KkkcL|3wIesQo z=hDds#dn~>kHs&M*v^(HOD0YJnj%Ej;?L1^6XW;q@giYs%Y9xhw$fbl6J2Vb)hyk2 zemv7YS`m%x6k5ENxkeKtYj&3_sP%lBVCc=8%zAPJX>ln=cYw$OX!DiCNrx<*?l59MYsaKLOM4H?6FUMdTE+|I&3>5kU0IZak3FU8< Jot)IC{{lRSKBoWx literal 0 HcmV?d00001 diff --git a/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj b/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj index e788b33..d40321e 100644 --- a/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj +++ b/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj @@ -6,8 +6,6 @@ 10 enable enable - npm run stop - npm run start ClipTrimDotNet ClipTrimDotNet Copyright © 2020 @@ -18,9 +16,10 @@ bin\Debug\com.michal-courson.cliptrim.sdPlugin\ - bin\Release\ClipTrimDotNet.sdPlugin\ + bin\Release\com.michal-courson.cliptrim.sdPlugin\ + @@ -71,6 +70,9 @@ + + Always + PreserveNewest