i2s: Add playback output to a file We needed a way to double check the outputs of our recording in a loopback. This allows us to record our playback audio from the TX FIFO and store to disk in a raw file. Additionally, this adjusts the output file to /tmp/speaker.raw. Change-Id: I20058fdd3afa1e34561cae13e0d9ebd03a72f3ba
diff --git a/shodan.resc b/shodan.resc index 6919f04..d83a718 100644 --- a/shodan.resc +++ b/shodan.resc
@@ -78,11 +78,11 @@ # for sampling data. Note that the format for these files is raw # sample data, left channel followed by right. $i2s_mic_audio_file ?= @sim/config/shodan_infrastructure/test.raw -$i2s_speaker_audio_file ?= @out/speaker.raw +$i2s_speaker_audio_file ?= @/tmp/speaker.raw # Uncomment these lines to enable audio -# i2s0 InputFile $i2s_mic_audio_file -# i2s0 OutputFile $i2s_speaker_audio_file +#i2s0 InputFile $i2s_mic_audio_file +#i2s0 OutputFile $i2s_speaker_audio_file # Start cpu0 at the bootrom reset vector, which is stored immediately after the # bootrom interrupt vector table at 0x8080. @@ -109,3 +109,4 @@ cpu0 IsHalted true cpu1 IsHalted true cpu2 IsHalted true +
diff --git a/shodan_infrastructure/MatchaI2S.cs b/shodan_infrastructure/MatchaI2S.cs index 5ef67e2..0591490 100644 --- a/shodan_infrastructure/MatchaI2S.cs +++ b/shodan_infrastructure/MatchaI2S.cs
@@ -202,7 +202,17 @@ private void StartTx() { + if (OutputFile == "") { + this.Log(LogLevel.Error, "Starting playback without an output file!"); + return; + } + this.Log(LogLevel.Info, "Starting playback."); + + encoder = new PCMEncoder(SampleSizeBits, SampleFrequencyHz, NumChannels, false); + encoder.Output = OutputFile; + encoder.SetBufferingBySamplesCount(1); + txThread = machine.ObtainManagedThread(TransmitFrame, SampleFrequencyHz); txThread.Start(); } @@ -225,7 +235,9 @@ return; } - txBuffer.Read(); + ulong sample = txBuffer.Read(); + encoder.AcceptSample((uint)((sample & 0xFFFF0000) >> 16)); // left + encoder.AcceptSample((uint)(sample & 0x0000FFFF)); // right this.Log(LogLevel.Noisy, "Removed sample. Level: {0}", txBuffer.Count); if (txBuffer.Count < mappedTxTriggerLevel)