Skip to content

Commit 77a85c4

Browse files
committed
audio: Handle all channel convertions.
1 parent bf71e99 commit 77a85c4

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

VisualPinball.Engine.PinMAME.Unity/Runtime/PinMameGamelogicEngine.cs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public GamelogicEngineLamp[] AvailableLamps {
9595
private readonly Queue<Action> _dispatchQueue = new Queue<Action>();
9696
private readonly Queue<float[]> _audioQueue = new Queue<float[]>();
9797

98+
private int _audioFilterChannels;
9899
private PinMameAudioInfo _audioInfo;
99100
private float[] _lastAudioFrame = {};
100101
private int _lastAudioFrameOffset;
@@ -262,12 +263,38 @@ private int OnAudioAvailable(PinMameAudioInfo audioInfo)
262263

263264
private int OnAudioUpdated(IntPtr framePtr, int frameSize)
264265
{
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+
}
271298
}
272299
}
273300

@@ -284,10 +311,12 @@ private int OnAudioUpdated(IntPtr framePtr, int frameSize)
284311

285312
private void OnAudioFilterRead(float[] data, int channels)
286313
{
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.");
289317
return;
290318
}
319+
291320
const int size = sizeof(float);
292321
var dataOffset = 0;
293322
var lastFrameSize = _lastAudioFrame.Length - _lastAudioFrameOffset;

0 commit comments

Comments
 (0)