当前位置: 首页 > 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.dtcms.com/a/303553.html

相关文章:

  • springCloudAlibaba集成Dubbo
  • 【版本更新】火语言 0.9.94.0 更新
  • 虚拟面孔,真实革命
  • Product Hunt 每日热榜 | 2025-07-28
  • JAVA_EIGHTEEN_特殊文件
  • STM32——寄存器映射
  • LLaMA-Factory微调教程2:命令行sft微调
  • 【拓扑排序 缩点】P2272 [ZJOI2007] 最大半连通子图|省选-
  • 【跳跃游戏】
  • BUUCTF-MISC-[HBNIS2018]caesar1
  • Linux驱动22 --- RV1126 环境搭建设备树修改
  • 从零到一:我是如何用深度学习打造高性能书籍推荐系统的
  • mp核心功能
  • 零基础学习性能测试第九章:全链路追踪-项目实操
  • 猎板 PCB 控深槽工艺:5G 基站散热模块的关键支撑
  • 解决c++运行时提示:first defined here (重复定义问题)
  • **线程与进程的区别与联系**
  • Qt下使用图形视图框架实现图像上各图形绘制
  • 一个Pycharm窗口添加多个项目来满足运行多个项目的需求
  • linux常用的指令
  • HTML响应式SEO公司网站源码
  • MVSNet系列网络概述
  • 7寸工业模组 XA070Y2-L01芯显科技详细参数资料
  • MCU中的外设总线是什么?
  • 带 USB 接口的多功能 AI 降噪消回音模组 A-59P:革新语音处理体验​
  • 基于Flask的智能停车场管理系统开发实践
  • Java基础-IO流
  • Python day27
  • GoLand 项目从 0 到 1:第三天 —— 图数据库版本管理方案调研与中间件部署
  • 064_不可变集合与同步集合