@@ -95,6 +95,7 @@ public GamelogicEngineLamp[] AvailableLamps {
95
95
private readonly Queue < Action > _dispatchQueue = new Queue < Action > ( ) ;
96
96
private readonly Queue < float [ ] > _audioQueue = new Queue < float [ ] > ( ) ;
97
97
98
+ private int _audioFilterChannels ;
98
99
private PinMameAudioInfo _audioInfo ;
99
100
private float [ ] _lastAudioFrame = { } ;
100
101
private int _lastAudioFrameOffset ;
@@ -262,12 +263,38 @@ private int OnAudioAvailable(PinMameAudioInfo audioInfo)
262
263
263
264
private int OnAudioUpdated ( IntPtr framePtr , int frameSize )
264
265
{
265
- var frame = new float [ frameSize * 2 ] ;
266
- unsafe {
267
- var src = ( short * ) framePtr ;
268
- for ( var i = 0 ; i < frameSize ; i ++ ) {
269
- frame [ i * 2 ] = src [ i ] / 32768f ;
270
- frame [ i * 2 + 1 ] = frame [ i * 2 ] ; // duplicate - assuming input channels = 1, and output channels = 2.
266
+ if ( _audioFilterChannels == 0 ) {
267
+ // don't know how many channels yet
268
+ return _audioInfo . SamplesPerFrame ;
269
+ }
270
+
271
+ float [ ] frame ;
272
+ if ( _audioFilterChannels == _audioInfo . Channels ) { // n channels -> n channels
273
+ frame = new float [ frameSize ] ;
274
+ unsafe {
275
+ var src = ( short * ) framePtr ;
276
+ for ( var i = 0 ; i < frameSize ; i ++ ) {
277
+ frame [ i ] = src [ i ] / 32768f ;
278
+ }
279
+ }
280
+
281
+ } else if ( _audioFilterChannels > _audioInfo . Channels ) { // 1 channel -> 2 channels
282
+ frame = new float [ frameSize * 2 ] ;
283
+ unsafe {
284
+ var src = ( short * ) framePtr ;
285
+ for ( var i = 0 ; i < frameSize ; i ++ ) {
286
+ frame [ i * 2 ] = src [ i ] / 32768f ;
287
+ frame [ i * 2 + 1 ] = frame [ i * 2 ] ;
288
+ }
289
+ }
290
+
291
+ } else { // 2 channels -> 1 channel
292
+ frame = new float [ frameSize / 2 ] ;
293
+ unsafe {
294
+ var src = ( short * ) framePtr ;
295
+ for ( var i = 0 ; i < frameSize ; i += 2 ) {
296
+ frame [ i ] = src [ i ] / 32768f ;
297
+ }
271
298
}
272
299
}
273
300
@@ -284,10 +311,12 @@ private int OnAudioUpdated(IntPtr framePtr, int frameSize)
284
311
285
312
private void OnAudioFilterRead ( float [ ] data , int channels )
286
313
{
287
- if ( channels != 2 ) {
288
- Logger . Error ( $ "Got { channels } channels, expecting 2.") ;
314
+ if ( _audioFilterChannels == 0 ) {
315
+ _audioFilterChannels = channels ;
316
+ Logger . Info ( $ "Creating audio on { channels } channels.") ;
289
317
return ;
290
318
}
319
+
291
320
const int size = sizeof ( float ) ;
292
321
var dataOffset = 0 ;
293
322
var lastFrameSize = _lastAudioFrame . Length - _lastAudioFrameOffset ;
0 commit comments