@@ -199,17 +199,19 @@ def get_audio_properties(input_path: str) -> Tuple[int, int]:
199199 container .close ()
200200 return channels , rate
201201
202+
202203class AudioIoProcess (Process ):
203- def __init__ (self ,
204- input_device ,
205- output_device ,
206- input_audio_block_size : int ,
207- sample_rate : int ,
208- channel_num : int = 2 ,
209- is_device_combined : bool = True ,
210- is_input_wasapi_exclusive : bool = False ,
211- is_output_wasapi_exclusive : bool = False
212- ):
204+ def __init__ (
205+ self ,
206+ input_device ,
207+ output_device ,
208+ input_audio_block_size : int ,
209+ sample_rate : int ,
210+ channel_num : int = 2 ,
211+ is_device_combined : bool = True ,
212+ is_input_wasapi_exclusive : bool = False ,
213+ is_output_wasapi_exclusive : bool = False ,
214+ ):
213215 super ().__init__ ()
214216 self .in_dev = input_device
215217 self .out_dev = output_device
@@ -222,18 +224,19 @@ def __init__(self,
222224 self .is_output_wasapi_exclusive : bool = is_output_wasapi_exclusive
223225
224226 self .__rec_ptr = 0
225- self .in_ptr = Value ('i' , 0 ) # 当收满一个block时由本进程设置
226- self .out_ptr = Value ('i' , 0 ) # 由主进程设置,指示下一次预期写入位置
227- self .play_ptr = Value ('i' , 0 ) # 由本进程设置,指示当前音频已经播放到哪里
227+ self .in_ptr = Value ("i" , 0 ) # 当收满一个block时由本进程设置
228+ self .out_ptr = Value ("i" , 0 ) # 由主进程设置,指示下一次预期写入位置
229+ self .play_ptr = Value ("i" , 0 ) # 由本进程设置,指示当前音频已经播放到哪里
228230 self .in_evt = Event () # 当收满一个block时由本进程设置
229231 self .stop_evt = Event () # 当主进程停止音频活动时由主进程设置
230232
231- self .latency = Value ('d' , 114514.1919810 )
233+ self .latency = Value ("d" , 114514.1919810 )
232234
233235 self .buf_shape : tuple = (self .buf_size , self .channels )
234236 self .buf_dtype : np .dtype = np .float32
235237 self .buf_nbytes : int = int (
236- np .prod (self .buf_shape ) * np .dtype (self .buf_dtype ).itemsize )
238+ np .prod (self .buf_shape ) * np .dtype (self .buf_dtype ).itemsize
239+ )
237240
238241 self .in_mem = SharedMemory (create = True , size = self .buf_nbytes )
239242 self .out_mem = SharedMemory (create = True , size = self .buf_nbytes )
@@ -256,11 +259,7 @@ def get_np_dtype(self) -> np.dtype:
256259 return self .buf_dtype
257260
258261 def get_ptrs_and_events (self ):
259- return self .in_ptr , \
260- self .out_ptr ,\
261- self .play_ptr ,\
262- self .in_evt , \
263- self .stop_evt \
262+ return self .in_ptr , self .out_ptr , self .play_ptr , self .in_evt , self .stop_evt
264263
265264 def get_latency (self ) -> float :
266265 return self .latency .value
@@ -272,12 +271,14 @@ def run(self):
272271
273272 in_mem = SharedMemory (name = self .in_mem_name )
274273 self .in_buf = np .ndarray (
275- self .buf_shape , dtype = self .buf_dtype , buffer = in_mem .buf , order = 'C' )
274+ self .buf_shape , dtype = self .buf_dtype , buffer = in_mem .buf , order = "C"
275+ )
276276 self .in_buf .fill (0.0 )
277277
278278 out_mem = SharedMemory (name = self .out_mem_name )
279279 self .out_buf = np .ndarray (
280- self .buf_shape , dtype = self .buf_dtype , buffer = out_mem .buf , order = 'C' )
280+ self .buf_shape , dtype = self .buf_dtype , buffer = out_mem .buf , order = "C"
281+ )
281282 self .out_buf .fill (0.0 )
282283
283284 exclusive_settings = sd .WasapiSettings (exclusive = True )
@@ -302,11 +303,11 @@ def input_callback(indata, frames, time_info, status):
302303 # 收录输入数据
303304 end_ptr = self .__rec_ptr + frames
304305 if end_ptr <= self .buf_size : # 整块拷贝
305- self .in_buf [self .__rec_ptr : end_ptr ] = indata
306+ self .in_buf [self .__rec_ptr : end_ptr ] = indata
306307 else : # 处理回绕
307308 first = self .buf_size - self .__rec_ptr
308309 second = end_ptr - self .buf_size
309- self .in_buf [self .__rec_ptr :] = indata [:first ]
310+ self .in_buf [self .__rec_ptr :] = indata [:first ]
310311 self .in_buf [:second ] = indata [first :]
311312 write_pos = self .__rec_ptr
312313 self .__rec_ptr = end_ptr % self .buf_size
@@ -328,11 +329,14 @@ def combined_callback(indata, outdata, frames, time_info, status):
328329 samplerate = self .sample_rate ,
329330 channels = self .channels ,
330331 dtype = self .buf_dtype ,
331- latency = 'low' ,
332- extra_settings = exclusive_settings if
333- self .is_input_wasapi_exclusive and
334- self .is_output_wasapi_exclusive else None ,
335- callback = combined_callback
332+ latency = "low" ,
333+ extra_settings = (
334+ exclusive_settings
335+ if self .is_input_wasapi_exclusive
336+ and self .is_output_wasapi_exclusive
337+ else None
338+ ),
339+ callback = combined_callback ,
336340 ) as s :
337341 self .latency .value = s .latency [- 1 ]
338342 self .stop_evt .wait ()
@@ -342,16 +346,20 @@ def combined_callback(indata, outdata, frames, time_info, status):
342346 samplerate = self .sample_rate ,
343347 channels = self .channels ,
344348 dtype = self .buf_dtype ,
345- latency = 'low' ,
346- extra_settings = exclusive_settings if self .is_input_wasapi_exclusive else None ,
347- callback = input_callback
349+ latency = "low" ,
350+ extra_settings = (
351+ exclusive_settings if self .is_input_wasapi_exclusive else None
352+ ),
353+ callback = input_callback ,
348354 ) as si , sd .OutputStream (
349355 samplerate = self .sample_rate ,
350356 channels = self .channels ,
351357 dtype = self .buf_dtype ,
352- latency = 'low' ,
353- extra_settings = exclusive_settings if self .is_output_wasapi_exclusive else None ,
354- callback = output_callback
358+ latency = "low" ,
359+ extra_settings = (
360+ exclusive_settings if self .is_output_wasapi_exclusive else None
361+ ),
362+ callback = output_callback ,
355363 ) as so :
356364 self .latency .value = si .latency [- 1 ] + so .latency [- 1 ]
357365 self .stop_evt .wait ()
0 commit comments