@@ -57,7 +57,7 @@ impl FfiAudioStream {
57
57
return Err ( FfiError :: InvalidRequest ( "not an audio track" . into ( ) ) ) ;
58
58
} ;
59
59
60
- let ( audio_filter, stream_info ) = match & new_stream. audio_filter_module_id {
60
+ let ( audio_filter, info ) = match & new_stream. audio_filter_module_id {
61
61
Some ( module_id) => {
62
62
let Some ( room_handle) = ffi_track. room_handle else {
63
63
return Err ( FfiError :: InvalidRequest (
@@ -83,9 +83,9 @@ impl FfiAudioStream {
83
83
track_id : rtc_track. id ( ) ,
84
84
} ;
85
85
86
- ( Some ( filter) , stream_info)
86
+ ( Some ( filter) , Some ( AudioFilterInfo { stream_info, room_handle } ) )
87
87
}
88
- None => ( None , AudioFilterStreamInfo :: default ( ) ) ,
88
+ None => ( None , None ) ,
89
89
} ;
90
90
91
91
let stream_type = new_stream. r#type ( ) ;
@@ -104,7 +104,7 @@ impl FfiAudioStream {
104
104
let session = audio_filter. clone ( ) . new_session (
105
105
sample_rate,
106
106
new_stream. audio_filter_options . unwrap_or ( "" . into ( ) ) ,
107
- stream_info,
107
+ info . as_ref ( ) . map ( |i| i . stream_info . clone ( ) ) . unwrap ( ) ,
108
108
) ;
109
109
110
110
match session {
@@ -134,6 +134,7 @@ impl FfiAudioStream {
134
134
self_dropped_rx,
135
135
server. watch_handle_dropped ( new_stream. track_handle ) ,
136
136
true ,
137
+ info,
137
138
) ) ;
138
139
server. watch_panic ( handle) ;
139
140
Ok :: < FfiAudioStream , FfiError > ( audio_stream)
@@ -208,7 +209,8 @@ impl FfiAudioStream {
208
209
// track_tx is no longer held, so the track_rx will be closed when track_changed_trigger is done
209
210
210
211
let url = ffi_participant. room . url ( ) ;
211
- let room_sid = ffi_participant. room . room . sid ( ) . await ;
212
+ let room_sid =
213
+ ffi_participant. room . room . maybe_sid ( ) . map ( |id| id. to_string ( ) ) . unwrap_or ( "" . into ( ) ) ;
212
214
let room_name = ffi_participant. room . room . name ( ) ;
213
215
let participant_identity = ffi_participant. participant . identity ( ) ;
214
216
let participant_id = ffi_participant. participant . sid ( ) ;
@@ -247,7 +249,7 @@ impl FfiAudioStream {
247
249
}
248
250
} ) ;
249
251
250
- let mut audio_filter_session = match & filter {
252
+ let ( mut audio_filter_session, info ) = match & filter {
251
253
Some ( filter) => match & request. audio_filter_options {
252
254
Some ( options) => {
253
255
let stream_info = AudioFilterStreamInfo {
@@ -259,19 +261,24 @@ impl FfiAudioStream {
259
261
track_id : track. sid ( ) . into ( ) ,
260
262
} ;
261
263
264
+ let info = AudioFilterInfo {
265
+ stream_info,
266
+ room_handle : ffi_participant. room . handle_id ,
267
+ } ;
268
+
262
269
let session = filter. clone ( ) . new_session (
263
270
sample_rate as u32 ,
264
271
& options,
265
- stream_info,
272
+ info . stream_info . clone ( ) ,
266
273
) ;
267
274
if session. is_none ( ) {
268
275
log:: error!( "failed to initialize the audio filter. it will not be enabled for this session." ) ;
269
276
}
270
- session
277
+ ( session, Some ( info ) )
271
278
}
272
- None => None ,
279
+ None => ( None , None ) ,
273
280
} ,
274
- None => None ,
281
+ None => ( None , None ) ,
275
282
} ;
276
283
277
284
let native_stream = NativeAudioStream :: new ( rtc_track, sample_rate, num_channels) ;
@@ -297,6 +304,7 @@ impl FfiAudioStream {
297
304
c_rx,
298
305
handle_dropped_rx,
299
306
false ,
307
+ info,
300
308
)
301
309
. await ;
302
310
let _ = done_tx. send ( ( ) ) ;
@@ -332,6 +340,7 @@ impl FfiAudioStream {
332
340
mut self_dropped_rx : oneshot:: Receiver < ( ) > ,
333
341
mut handle_dropped_rx : oneshot:: Receiver < ( ) > ,
334
342
send_eos : bool ,
343
+ mut filter_info : Option < AudioFilterInfo > ,
335
344
) {
336
345
loop {
337
346
tokio:: select! {
@@ -346,6 +355,21 @@ impl FfiAudioStream {
346
355
break ;
347
356
} ;
348
357
358
+ if let Some ( ref mut info) = filter_info {
359
+ if info. stream_info. room_id == "" {
360
+ // check if room_id is updated
361
+ if info. update_room_id( server) {
362
+ if info. stream_info. room_id != "" {
363
+ if let AudioStreamKind :: Filtered ( ref mut filter) = native_stream {
364
+ filter. update_stream_info( info. stream_info. clone( ) ) ;
365
+ }
366
+ // room_id is updated, this check is no longer needed.
367
+ filter_info = None ;
368
+ }
369
+ }
370
+ }
371
+ }
372
+
349
373
let handle_id = server. next_id( ) ;
350
374
let buffer_info = proto:: AudioFrameBufferInfo :: from( & frame) ;
351
375
server. store_handle( handle_id, frame) ;
@@ -383,3 +407,24 @@ impl FfiAudioStream {
383
407
}
384
408
}
385
409
}
410
+
411
+ // Used to update audio filter session when the stream info is changed. (Mainly room_id
412
+ #[ derive( Default ) ]
413
+ struct AudioFilterInfo {
414
+ stream_info : AudioFilterStreamInfo ,
415
+ room_handle : FfiHandleId ,
416
+ }
417
+
418
+ impl AudioFilterInfo {
419
+ fn update_room_id ( & mut self , server : & ' static server:: FfiServer ) -> bool {
420
+ let Ok ( room) = server. retrieve_handle :: < FfiRoom > ( self . room_handle ) else {
421
+ return false ;
422
+ } ;
423
+ let room_id = room. inner . room . maybe_sid ( ) . map ( |id| id. to_string ( ) ) . unwrap_or ( "" . into ( ) ) ;
424
+ if room_id != "" {
425
+ self . stream_info . room_id = room_id. into ( ) ;
426
+ return true ;
427
+ }
428
+ false
429
+ }
430
+ }
0 commit comments