当前位置: 首页 > news >正文

STM32 usb HOST audio USB 音频设备 放音乐

闲来无事,折腾通过USBHOST 把本地的MP3 音频文件 发送给USB 音频设备 播放音乐。

1. 先把USB HOST 做成个USB U盘 通过MSC FATFS 往本地SD_NAND先存放音频文件,

2.再把USB HOST 驱动成 audio ,移植 软解码MP3HEX库。

3.移植USB HOST audio 相关驱动库,通过usbh_audio.c 分析整份代码过于繁琐,只需要保留枚举那部分代码即可,驱动操作可以自己封装相关的函数,4

typedef struct {uint8_t buff[AUDIT_SZIE+4];int32_t out_ptr;uint32_t in_ptr;
}Audio_BufferTypeDef;/* Private variables ---------------------------------------------------------*/
//static WAV_InfoTypedef WavInfo;
//static FIL WavFile;static Audio_BufferTypeDef  BufferCtl;
static u32 pRdBufSize,halfSize;void AUDIO_Process(void)
{int32_t diff;USBH_StatusTypeDef Status = USBH_FAIL;switch(audio_state){case 0://if(Status ==USBH_OK)TRACE("sent cur:%d\n",10);//	_HSetAur(&hUsbHostFS,10);//	_HSetAur(&hUsbHostFS,5);_HSetAur(&hUsbHostFS,5);_HSetMirSpeak(&hUsbHostFS,0,1);//	Mp3Reset();audio_state =1;break;case 1:Status = 	USBH_AUDIO_Play(&hUsbHostFS, &BufferCtl.buff[0],halfSize * GetMp3TotalFram(),48000,16,1);if(Status ==USBH_OK){audio_state ++;}break;case 2 :if((BufferCtl.out_ptr = USBH_AUDIO_GetOutOffset(&hUsbHostFS)) < 0) /* End of file */{    //audio_state ++;TRACE("sent all:%d\n",total);}else if(BufferCtl.out_ptr  >= pRdBufSize ) /* End of buffer  4608 */{//	TRACE("S:%d\n",BufferCtl.out_ptr);USBH_AUDIO_ChangeOutBuffer(&hUsbHostFS, &BufferCtl.buff[0]);}else    {diff = BufferCtl.out_ptr - BufferCtl.in_ptr;if(diff < 0){diff = pRdBufSize + diff;}if(diff >=  pRdBufSize /2 )//9216{BufferCtl.in_ptr += halfSize;if(BufferCtl.in_ptr >= pRdBufSize)//(AUDIO_BLOCK_SIZE * AUDIO_BLOCK_NBR)){BufferCtl.in_ptr = 0;}if(!CheckMP3Over()){//	TRACE("in:%d\n",BufferCtl.in_ptr);halfSize =  GetMP3Fram(&BufferCtl.buff[BufferCtl.in_ptr],1);}elseaudio_state = 3;}MP3ShowTimes();}break;case 3:Status =  USBH_AUDIO_Stop(&hUsbHostFS);if(Status ==USBH_OK)audio_state ++;TRACE("err exit:%d\n",BufferCtl.in_ptr);break;default:break;}}void MX_USB_HOST_Process(void)
{int tx = 0;/* USB Host Background task */USBH_Process(&hUsbHostFS);if(  Appli_state == APPLICATION_READY){AUDIO_Process();//AUDIO_Micr_Process();}if(!connected){TIM2->CNT = 0;TIM2->CR1|=0x01;    //使能定时器2pRdBufSize =  GetMP3Fram(&BufferCtl.buff[0],4);//AUDIO_BLOCK_SIZE * AUDIO_BLOCK_NBR);TIM2->CR1&=~0x01;    //使能定时器2TRACE("mp3_run_us:%d\n",TIM2->CNT);BufferCtl.out_ptr = BufferCtl.in_ptr = 0;halfSize = pRdBufSize /4;TRACE("get byte:%d,%d\n",pRdBufSize,halfSize);connected = 1;}}

4.整个处理流程只需保留几个相关操作API,开始播放和停止播放,设置音量大小,因为usb 音频设备是单声道,对MP3解码的双通道 做 /2 处理

http://www.lryc.cn/news/602074.html

相关文章:

  • Pandas 里的分箱操作
  • 负载均衡集群HAproxy
  • MCP工作原理
  • Java-泛型类的定义与使用
  • 浅谈面试中的递归算法
  • 【Linux】编辑器vim和编译器gcc/g++
  • 解析分区、挂载与块设备:Linux 存储管理核心命令详解
  • 近屿智能正式发布AI得贤招聘官的AI面试官智能体6.3版本:交付替代人类面试官的打分结果
  • 零基础学习性能测试第九章:全链路追踪-项目实操
  • Jenkins + SonarQube 从原理到实战一:基于 K8s 部署与使用(含中文插件与 Python 扫描)
  • 力扣1457. 二叉树中的伪回文路径
  • 力扣面试150(42/150)
  • 旧物回收小程序:科技赋能,让旧物回收焕发生机
  • 软件测试之功能测试
  • 6种将iPhone照片传输到Windows 10电脑的方法
  • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
  • 快速了解MySQL
  • Ubuntu lamp
  • 分布式IO选型指南:2025年分布式无线远程IO品牌及采集控制方案详解
  • 四、计算机组成原理——第3章:存储系统
  • 低速信号设计之 SMBUS 篇
  • Power Query概述及导入多源数据方法
  • 从fork到exit:剖析Linux进程的诞生、消亡机制
  • C盘清理大赛技术指南
  • 凸优化:凸函数的一些常用性质
  • 动/静态库的原理及制作
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • Qwen 系列模型实现文本改写工具
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式能源接入与电网稳定性保障中的应用(368)
  • Java从入门到精通!第十八天(JDK17安装以及网络编程) 完结篇!!!