I2S audio playback is garbled for tone and mp3 playback on Metro ESP32-P4

Open
#11,873 6 comments 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@mikeysklar is already working on this.

Since Nov 13, 2026.

  • #11875 by @mikeysklar — open

Assessment

This issue has not been assessed yet.

Description

bug
CircuitPython version and board name
Adafruit CircuitPython 11.0.0-alpha.3 on 2026-11-12; Adafruit Metro ESP32-P4 with ESP32P4
Code/REPL
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
# SPDX-License-Identifier: MIT
"""
CircuitPython I2S Tone playback example.
Plays a tone for one second on, one
second off, in a loop.
"""
import time
import array
import math
import audiocore
import board
import audiobusio

audio = audiobusio.I2SOut(board.D9, board.D10, board.D11)

tone_volume = 0.1  # Increase this to increase the volume of the tone.
frequency = 440  # Set this to the Hz of the tone you want to generate.
length = 8000 // frequency
sine_wave = array.array("h", [0] * length)
for i in range(length):
    sine_wave[i] = int((math.sin(math.pi * 2 * i / length)) * tone_volume * (2 ** 15 - 1))
sine_wave_sample = audiocore.RawSample(sine_wave)

while True:
    audio.play(sine_wave_sample, loop=True)
    time.sleep(1)
    audio.stop()
    time.sleep(1)
Behavior

When playing back this tone, the audio crackles and can sound garbled. This behavior is also present with mp3 playback, which is how i first came across the issue.

here is test mp3 code:

import board
from audiomp3 import MP3Decoder
import audiobusio

mp3files = ["slow.mp3", "happy.mp3"]

mp3 = open(mp3files[0], "rb")
decoder = MP3Decoder(mp3)
audio = audiobusio.I2SOut(board.D9, board.D10, board.D11)

while True:
    for filename in mp3files:
        decoder.file = open(filename, "rb")
        audio.play(decoder)
        print("playing", filename)
        while audio.playing:
            pass

mp3 files are available here on learn repo: https://github.com/adafruit/Adafruit_Learning_System_Guides/tree/main/CircuitPython_Essentials/CircuitPython_Audio_Out_MP3

Description

i tested with the max98357a stereo dac and pcm5122 line out dac to rule out a speaker issue.

Additional information

the issue is not present with wav file playback. i ran the street chicken example with both DACs:

import audiocore
import board
import audiobusio

audio = audiobusio.I2SOut(board.D9, board.D10, board.D11)

with open("StreetChicken.wav", "rb") as wave_file:
    wav = audiocore.WaveFile(wave_file)

    print("Playing wav file!")
    audio.play(wav)
    while audio.playing:
        pass

print("Done!")

(wav file here: https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/PCM510x_Examples/CircuitPython_WAV/StreetChicken.wav)

and that plays clearly

Dominant language
C
Stars
4.6k
Forks
1.4k
Avg merge
1d
Merged PRs (30d)
212

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from adafruit/circuitpython

All issues in adafruit/circuitpython

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.