Maix Dock之I2S Audio

应煌
2023-12-01

测试代码

先找一个sd卡,格式化命名直接叫sd,在卡上拷贝一个wav格式的歌曲,命名7.wav 然后通过以下程序去播放。硬件上连上一个声道上即可。

from fpioa_manager import *
from Maix import I2S, GPIO
import audio

########### settings ############
WIFI_EN_PIN = 8
# AUDIO_PA_EN_PIN = None  # Bit Dock and old MaixGo
AUDIO_PA_EN_PIN = 32      # Maix Go(version 2.20)
# AUDIO_PA_EN_PIN = 2     # Maixduino


# disable wifi
fm.register(WIFI_EN_PIN, fm.fpioa.GPIO0, force=True)
wifi_en = GPIO(GPIO.GPIO0, GPIO.OUT)
wifi_en.value(0)

# open audio PA
if AUDIO_PA_EN_PIN:
    fm.register(AUDIO_PA_EN_PIN, fm.fpioa.GPIO1, force=True)
    wifi_en = GPIO(GPIO.GPIO1, GPIO.OUT)
    wifi_en.value(1)

# register i2s(i2s0) pin
fm.register(34, fm.fpioa.I2S0_OUT_D1, force=True)
fm.register(35, fm.fpioa.I2S0_SCLK, force=True)
fm.register(33, fm.fpioa.I2S0_WS, force=True)

# init i2s(i2s0)
wav_dev = I2S(I2S.DEVICE_0)

# init audio
player = audio.Audio(path="/sd/7.wav")
player.volume(100)

# read audio info
wav_info = player.play_process(wav_dev)
print("wav file head information: ", wav_info)

# config i2s according to audio info
wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT,
                       cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.RIGHT_JUSTIFYING_MODE)
wav_dev.set_sample_rate(wav_info[1])

# loop to play audio
while True:
    ret = player.play()
    if ret == None:
        print("format error")
        break
    elif ret == 0:
        print("end")
        break
player.finish()

I2S

I2S模块主要用于驱动I2S设备,k210一共有3个I2S设备,每个设备一共有4个通道,在使用前需要对引脚进行映射管理

构造函数

新建一个 I2S 对象

from Maix import I2S
wav_dev = I2S(I2S.DEVICE_0)

参数

device_num UART号,使用指定的 I2S,可以通过 I2S. 按tab键来补全

返回值

返回一个I2S 对象

1.2. 通道配置函数

用于配置 I2S 通道,在此之前需要对引脚进行映射

wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT,
                       cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.RIGHT_JUSTIFYING_MODE)
i2s_dev.channel_config(channel, mode, resolution, cycles, align_mode)

参数

  • channel: I2S通道编号

    mode: 通道传输模式,一共有接收和发送模式,录音为接受,播放为发送
    
    resolution: 通道分辨率,即接收数据位数
    
    cycles: 单个数据时钟数
    
    align_mode: 通道对齐模式
    

设置采样率

用于配置 I2S 采样率

i2s_dev.set_sample_rate(sample_rate)

参数
sample_rate:

接收音频

使用I2S接收音频数据

audio = i2s_dev.record(points)

返回值

audio: 一个audio音频对象

发送音频

使用I2S发送音频数据

i2s_dev.play(audio)

参数

audio: 发送的音频对象

关于Audio

抽象的音频对象,该对象可以被当做参数传入也可以直接使用其方法来播放音频

模块函数

构造函数

audio.Audio(array=None, path=None, points=1024)
player = audio.Audio(path="/sd/7.wav")

参数

该接口能传入一个参数,每个参数会决定不同的音频类型

array: bytearray类型的数据,可以将该数据转换为音频对象, 默认 None

path: 打开的音频文件路径,目前仅支持 wav 格式, 默认 None, 注意需要标明关键字path,audio.Audio("/sd/1.wav")这样是错的!! audio.Audio(path = "/sd/1.wav") 才是正确的

points: 开辟有 points 个采样点数的音频缓冲,一个采样点大小为 32bit。为0的情况下将不开辟缓冲, 默认 1024

返回值

返回一个 Audio 对象

 类似资料: