music相关基础流程

多信号分类算法(MUSIC)的理解与应用 简述MUSIC算法原理,说明网上关于MUSIC算法的资源代码存在的问题。 阅读详情

music任务运行相关介绍。

main函数中进行必要初始化,创建任务。

int main()
{
#if(CONFIG_CPU_BR25)
#if (TCFG_DEC2TWS_ENABLE ||RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
    clock_set_sfc_max_freq(100 * 1000000, 100 * 1000000);
#else
#if ((TCFG_AEC_ENABLE) && (TCFG_USER_TWS_ENABLE))
    clock_set_sfc_max_freq(80 * 1000000, 80 * 1000000);
#else
    clock_set_sfc_max_freq(64 * 1000000, 64 * 1000000);
#endif
#endif
#endif

    wdt_close();//关闭看门狗
    os_init();//操作系统初始化
    setup_arch();//硬件初始化
    board_early_init();//板级初始化
    task_create(app_task_handler, NULL, "app_core");//创建任务
    os_start();//启动操作系统
    local_irq_enable();//本地中断使能
    while (1) {
        asm("idle");
    }

    return 0;
}

static void app_task_handler(void *p)//app任务
{
    app_init();//app初始化
    app_main();//运行app main
}

app_main中调用:app_task_loop();//运行app任务

app_task_loop中,根据app_curr_task变量,决定执行哪个任务。

    case APP_MUSIC_TASK://music任务
            log_info("APP_MUSIC_TASK \n");
            app_music_task();
            break;

music任务:进行任务初始化、播放提示音、监控消息

void app_music_task()//music 主任务
{
    int res;
    int msg[32];//用于存储消息
    music_task_start();//music任务初始化

#if (MUSIC_DEVICE_TONE_EN)//设备提示音使能
    music_player_play_start();//music播放器播放提示音
#else
#if TCFG_DEC2TWS_ENABLE
    extern void set_tws_background_connected_flag(u8 flag);
    extern u8 get_tws_background_connected_flag();
    if (get_tws_background_connected_flag()) { //不播放提示音
        music_player_play_start();
        set_tws_background_connected_flag(0);
    } else
#endif
    {
        //第一个参数路径
        //第二个参数打断标志
        //第三个参数回调函数
        //第四个参数事件回调私有句柄
        tone_play_with_callback_by_name(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC);
    }
#endif
    while (1) {
        //msg用于存储消息
        //ARRAY_SIZE(msg)表示存储消息的容量
        //1表示获取后直接返回,不挂起等待
        app_task_get_msg(msg, ARRAY_SIZE(msg), 1);//获取消息
        switch (msg[0]) {
        case APP_MSG_SYS_EVENT://系统事件
            if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false) {//如果music系统事件处理返回false
                app_default_event_deal((struct sys_event *)(&msg[1]));//则进行系统默认事件处理
            }
            break;
        default:
            break;
        }
        if (app_task_exitting()) {//如果要退出
            music_task_close();//播放器退出
            return;
        }
    }
}

msg用于存储消息。
msg[0]字节:

enum {
    APP_MSG_SYS_EVENT = Q_EVENT,//系统事件
    /* 用户自定义消息 */
    APP_MSG_SWITCH_TASK = Q_USER + 1,
    APP_MSG_USER        = Q_USER + 2,
};

msg[1]:事件类型,用于各个子任务模块自行处理的消息类型。

music的初始化。
UI界面的更新,是否显示歌词,显示则初始化歌词。
时钟初始化、按键事件使能。
创建播放器、创建断点。

static void music_task_start()
{
    printf("music task start!!!!!\n");
    music_idle_flag = 0;
    ui_update_status(STATUS_MUSIC_MODE);//ui更新

#if (TCFG_LRC_LYRICS_ENABLE)//歌词显示
    extern int lrc_init(void);
    lrc_init();//歌词初始化
#endif

    ///显示初始化
    UI_SHOW_WINDOW(ID_WINDOW_MUSIC);
    UI_SHOW_MENU(MENU_WAIT, 0, 0, NULL);
    ///时钟初始化
    clock_idle(MUSIC_IDLE_CLOCK);
    ///按键使能
    sys_key_event_enable();


    ///播放器初始化
    struct __player_parm parm = {0};
    parm.cb = &music_player_callback;//回调函数控制块
    parm.scan_cb = &scan_cb;//扫描控制块
    music_player_creat(NULL, &parm);//创建播放器
    ///获取断点句柄, 后面所有断点读/写都需要用到
    breakpoint = breakpoint_handle_creat();//创建断点
    ///初始化一些参数
    __this->file_err_counter = 0;//文件错误计数器清零
    __this->file_play_direct = 0;//0:下一曲, 1:上一曲
    __this->scandisk_break = 0;//扫描文件打断标志
    memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));//提示音
}

播放器的创建。

bool music_player_creat(void *priv, struct __player_parm *parm)//music_player创建接口
{
    __this = zalloc(sizeof(struct __music_player));//申请内存空间
    if (__this == NULL) {
        return false;
    }
    __this->priv = priv;
    memcpy(&__this->parm, parm, sizeof(struct __player_parm));
    ASSERT(__this->parm.cb, "music_player parm error!!\n");
    ASSERT(__this->parm.scan_cb, "music_player parm error 1 !!\n");
    return true;
}

struct __music_player结构体:

struct __music_player {
    struct __dev  *dev;//当前播放设备节点
    struct vfscan  *fsn;//设备扫盘句柄
    FILE	*file;//当前播放文件句柄
    FILE	*lrc_file;//当前播放歌词文件句柄
    void 	*priv;//music回调函数,私有参数
    struct __player_parm 	parm;//回调及参数配置等
};

static struct __music_player *music_player = NULL;//播放器句柄
#define __this music_player
播放器的创建主要是给__this申请内容空间、参数赋值。

断点的创建。
//创建一个bp
//申请空间,赋值长度

struct __breakpoint *breakpoint_handle_creat(void)//bp创建
{
    struct __breakpoint *bp = (struct __breakpoint *)zalloc(sizeof(struct __breakpoint) + BREAKPOINT_DATA_LEN);
    bp->dbp.data_len = BREAKPOINT_DATA_LEN;//不同音乐格式,长度不同
    return bp;
}

断点信息结构体

struct __breakpoint {   
    u32 fsize; ///文件信息
    u32 sclust;    
    struct audio_dec_breakpoint dbp;///解码信息
};

解码断点结构体

struct audio_dec_breakpoint {
    int len;
    u32 fptr;
    int data_len;
    u8 data[0];
    // u8 data[128];
};

static struct __breakpoint *breakpoint = NULL;
断点指播放音乐文件时,暂停打断退出,需要记录当前播放位置的信息,下次进入播放时在该处继续播放。这里涉及到文件播放到哪了,需要录该文件当前的播放位置。文件在播放时进行了音频解码,这里也需要记录起来。

music 设备事件响应接口。
进行消息处理,如果是music可以处理的消息,则处理完后返回1。
如果不是music可以处理的消息,则返回0,系统将使用通用消息处理器进行该消息的处理。
//返回1表示事件已经处理
//返回0表示事件未处理,须有common公共事件处理函数来处理
处理了设备拔出事件
拔出的设备和当前播放设备必须是同一个设备
保存文件断点信息

static int music_sys_event_handler(struct sys_event *event)//music系统事件处理
{
    int err = 0;
    char *logo = NULL;
    char *evt_logo = NULL;
    switch (event->type) {//事件类型
    case SYS_KEY_EVENT://按键事件
        return music_key_event_opr(event);//调用music按键事件处理函数
    case SYS_DEVICE_EVENT://设备事件
        switch ((u32)event->arg) {
        case DRIVER_EVENT_FROM_SD0:
        case DRIVER_EVENT_FROM_SD1:
        case DRIVER_EVENT_FROM_SD2:
            evt_logo = (char *)event->u.dev.value;
        case DEVICE_EVENT_FROM_OTG:
            if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
                evt_logo = (char *)"udisk0";
            }
            int str_len   = 0;
            logo = music_player_get_phy_dev(&str_len);//获取phy设备的logo
            log_i("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
            if (event->u.dev.event == DEVICE_EVENT_OUT) {//拔出
                if (logo == NULL) {
                    break;
                }
                //当前播放设备logo和事件设备logo比较
                if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
                    ///相同的设备才响应
                    if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {//获取播放文件断点信息
                        breakpoint_vm_write(breakpoint, logo);//将断点信息和logo保存
                    }
                    memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
                    ///停止解码,防止设备掉线后还继续使用
                    music_player_stop(1);//停止解码,释放扫盘句柄
                    ///重新选择活动设备播放
                    app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);//卸载了设备再执行
                    log_i("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
                }
            } else {
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN == 0)//设备挂载后自动播放
                music_task_dev_online_start();
#endif
            }
            break;
        default://switch((u32)event->arg)
            break;
        }
        break;//SYS_DEVICE_EVENT
    default://switch (event->type)
        break;
    }

    return false;//事件未处理
}

struct sys_event *event结构体如下:

struct sys_event {
    u16 type;//类型
    u8 consumed;//1表示接管按键消息,app应用不会收到消息
    void *arg;//参数
    union {
        struct key_event key;//按键
        struct axis_event axis;
        struct codesw_event codesw;
#if EVENT_TOUCH_ENABLE_CONFIG
        struct touch_event touch;//触摸屏
#endif
        struct device_event dev;//设备
        struct net_event 	net;//网路
        struct bt_event 	bt;//蓝牙
        struct msg_event 	msg;
        struct chargestore_event chargestore;
        struct soundbox_tool_event soundbox_tool;
        struct ir_event     ir;//红外
        struct pbg_event    pbg;
        struct uart_event	uart;
        struct uart_cmd_event	uart_cmd;
        struct ai_event     ai;
        struct ear_event    ear;
        struct rcsp_event	rcsp;
        struct chargebox_event chargebox;
        struct ancbox_event ancbox;
        struct matrix_key_event  matrix_key;
        struct touchpad_event touchpad;
        struct adt_event    adt;
    } u;
};

这里使用了联合体,将不同模块的消息都定义在联合体中。
type:

#define SYS_ALL_EVENT           0xffff
#define SYS_KEY_EVENT 			0x0001//按键事件
#define SYS_TOUCH_EVENT 		0x0002//触摸事件
#define SYS_DEVICE_EVENT 		0x0004//设备事件
#define SYS_NET_EVENT 		    0x0008//网络事件
#define SYS_BT_EVENT 		    0x0010//蓝牙事件
#define SYS_IR_EVENT 		    0x0020//红外事件
#define SYS_PBG_EVENT           0x0040
#define SYS_BT_AI_EVENT 		0x0080//蓝牙AI事件
#define SYS_AI_EVENT 		    0x0100//AI事件
#define SYS_MATRIX_KEY_EVENT    0x0200
#define SYS_TOUCHPAD_EVENT      0x0400//触摸板事件
#define SYS_ADT_EVENT           0x0800
关于Windows下的MIDI基础编程 简单的MIDI API 调用 阅读详情

相关推荐

阵列信号基础之1:MUSIC 算法

无线信道参数估计算法 对通信系统分析之前,首先需要建立一个能够完整反映该系统的传输信道的模型,其模型中的参数包括接收端接收信号的时延,发射端和接收端的联合方向分布等,获取这些参数的过程就是无线信道参数估计的过程。 方法可以大致分为三类: - 谱估计算法:多重信号分类法 - 参数子空间估计算法:旋转不变技术估计信号参数算法 - 确定性参数估计算法:期望最大算法以及演进的空间交替...

你通透就好 别问我是谁 3万+

杰里之music 模式下文件解码成功后保存断点时没有清除 “ 时间 ” 信息【篇】

修改方法: 在 music_player.c 中的 music_player_get_playing_breakpoint 中添加红色部分代码 bool music_player_get_playing_breakpoint(struct __breakpoint *bp, u8 flag) { if (__this == NULL || bp == NULL) { return false; } int data_len = bp->dbp.data_len; memset(bp, 0, sizeo

u013820168的博客 140

信号频率估计—MUSIC & ROOT-MUSIC算法(附Matlab代码)

本文详细介绍了两种信号估计方法——MUSIC算法和ROOT-MUSIC算法,并给出了两种算法的Matlab代码。

I_am_mengxinxin的博客 1万+

【杰理蓝牙开发】AC695x 按键ADC接口分析

【杰理蓝牙开发】AC695x 按键ADC接口分析

欢迎私信、留言交流 2125

MUSIC算法相关原理知识(物理解读+数学推导+Matlab代码实现)

介绍了经典定位算法MUSIC算法的原理知识,适合基础学习,不仅是从数学角度,也会从物理方面进行解读。同时有matlab代码实现。

APPLECHARLOTTE的博客 3万+

经典传统music算法

数学上,如果一个矩阵 ( A ) 满足 ( A = A^H ),其中 ( A^H ) 表示 ( A ) 的共轭转置(即矩阵的转置并取每个元素的共轭),那么 ( A ) 就是一个厄米特矩阵。此外,厄米特矩阵的任意两个不同特征值对应的特征向量是正交的。正规阵,无论是实数矩阵还是复数矩阵,指的是与自己的共轭转置矩阵(对于实数矩阵则是转置矩阵)相乘的结果与其共轭转置矩阵相乘的结果相同的矩阵。R的M个大的特征值对应的特征向量张成的子空间为信号子空间,其余的N+1-M个小特征值对应的特征向量张成的子空间为噪声子空间。

huangdaxian0的博客 5391

杰理之语音播放函数tone_play_index_with_callback传进的回调函数不执行【篇】

flag)//播放结束。else //播放被打断等。

u013820168的博客 453

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

AC695x学习笔记(1): 简介

杰理的AC695x系列的芯片在SDK中几乎都做好相关的功能实现,通常只需在配置文件中对所需功能进行简单的配置使能即可完成一个简易的蓝牙软件项目

Ricarduo的博客 5506

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

杰理之嵌入控制设备提示音播放变量【篇】

【代码】杰理之嵌入控制设备提示音播放变量【篇】

u013820168的博客 138

告别反复刷写:用英飞凌XCP Overlay功能实现ECU标定与诊断的‘热更新’

本文详细介绍了英飞凌XCP Overlay功能在ECU标定与诊断中的应用,实现参数的'热更新',避免反复刷写Flash。通过地址重映射技术,将标定变量从Flash重定向到RAM,显著提升工作效率并保护Flash寿命。文章涵盖技术原理、工程实践、功能安全考量及高级应用场景,为汽车电子工程师提供完整解决方案。

weixin_30689307的博客 529

Root-Music方法进行频率估计

Root-Music算法是在Music算法的基础上提出的。Music算法:利用信号子空间和噪声子空间的正交性,构造空间谱函数,通过谱峰搜索,估计信号频率。具体就是先对信号用矩阵形式表示出来,接着求解相关矩阵,并对其进行特征分解,得出有K个非零特征值,利用剩下的M-K个零特征值得出信号子空间与噪声子空间的正交性。而实际中,自相关矩阵R是估计出来的,因此特征向量本身也带有一定误差,因此最终的公式中有求...

ai136172022的博客 1万+

Linux基础——“C语言高级编程” C语言中的细节你真的知道吗?

文章目录GCC简介 GCC简介 gcc 所支持后缀名解释 .c c原始程序 .C / .cc /.cxx C++原始程

weixin_44278698的博客 2511

Figure 03人形机器人与Helix端到端控制系统:具身智能突破深度解析

2026年5月,Figure AI的Figure 03人形机器人在一场震撼业界的直播中完成了长达200小时的连续全自动作业,分拣近25万个包裹,零故障。这一里程碑式的成就标志着人形机器人正式从「实验室展示」迈入「规模化商用」阶段。本文深入剖析Figure 03的核心技术——Helix端到端神经网络控制系统,包括System 0/1/2三层架构、视觉运动策略、全身协同控制等关键技术,并提供完整的Python/Go代码示例,帮助开发者理解具身智能的核心原理与实现路径。关键词。

shao.bing的专栏 998

android系统使用的编程语言,切换android系统语言的流程

最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知。为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料。(主要参考了http://blog.youkuaiyun.com/wqhjfree/article/details/8244520)在这里我将自己的探索记录下来,作为自己的学习记录,也希望能对有同样需要的人有个帮助。刚学android不久,如果中间...

weixin_31533357的博客 846

仿真学习系列(四十二):Sigrity仿真之走线阻抗和耦合检查

在高速电路设计中,走线的阻抗和信号线之间的耦合是影响信号完整性的重要因素。设计中可能会出现多种情况,导致阻抗变化或不匹配,例如线宽的变化、跨层分割等。传统的人工检查方法常常不够高效且易忽视细节。借助仿真软件,可以快速定位问题区域,并进行精确分析,从而有效避免或减少信号反射和串扰带来的影响。

案例文章,高速信号 425

MUSIC算法

** MUSIC算法仿真分析 一、DOA估计方法 波达方向(Direction of arrival, DOA)是指空间信号的到达方向(各个信号到达阵列参考阵元的方向角,简称波达方向)。它是空间谱估计理论的重要基础,而空间谱估计又是阵列信号处理的研究领域。空间谱估计主要研究空间多传感器阵列所构成的处理系统对感兴趣的空间信号的多种参数进行准确估计的能力 ,主要目的是估计信号的空域参数或信源位置,而波...

Minions2018的博客 2万+

【QNX+Android虚拟化方案】12 - 设备虚拟化 之 Passthrough透传、Vdev Trap、HAB Socket 原理解析

【QNX+Android虚拟化方案】12 - 设备虚拟化 之 Passthrough透传、Vdev Trap、HAB Socket 原理解析

|~~~热爱生活、努力学习的小伙汁~~~| 1371

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MUSIC算法详解

IoT中的MUSIC算法及其变体详解。

全栈O-Jay的博客 8714

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一种针对相干源信号DOA估计的改进MUSIC算法

本期内容是给大家带来的I-MUSIC算法,主要用于解决相干源信号的DOA估计,同时具有很强的鲁棒性能。

Poulen的博客 4483

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MUSIC算法及MATLAB实现

MUSIC (Multiple Signal Classification)算法,即多信号分类算法,由Schmidt等人于1979年提出。MUSIC算法是一种基于矩阵特征空间分解的方法。从几何角度讲,信号处理的观测空间可以分解为信号子空间和噪声子空间,显然这两个空间是正交的。信号子空间由阵列接收到的数据协方差矩阵中与信号对应的特征向量组成,噪声子空间则由协方差矩阵中所有最小特征值(噪声方差)对应的特征向量组成. MUSIC算法利用信号子空间和噪声子空间的正交性,构建空间谱函数,...

知识搬运工的博客 2万+

c语言music算法,PROJECT:以music算法为基础的几种DOA算法的研究及性能分析

E-mail:chengwenchi1986@gmail.com摘要:本文主要是对 DOA(波达方向)估计中传统 MUSIC算法及其改进算法作了简要的介绍,主要包括了MUSIC算法,求根MUSIC算法,循环MUSIC算法,波束空间MUSIC算法,SMARTMUSIC算法。并且在对每个算法做了原理性的分析的基础上给出了简要的性能分析。关键词:DOA估计;MUSIC算法;求根MUSIC算法;循环MUS...

weixin_35259908的博客 2459

较为详细的MUSIC算法原理及MATLAB实现

DOA估计算法 DOA(Direction Of Arrival)波达方向定位技术主要有ARMA谱分析、最大似然法、熵谱分析法和特征分解法,特征分解法主要有MUSIC算法、ESPRIT算法WSF算法等。 MUSIC (Multiple Signal Classification)算法,即多信号分类算法,由Schmidt等人于1979年提出。MUSIC算法是一种基于子空间分解的算法,它利用信号子空间...

章子雎的博客 16万+

DOA算法1:MUSIC算法(二)

着重介绍Root-MUSIC算法,简述Smooth_MUSIC算法

WZX_Hello的博客 3901
上一篇: 设备管理器中基本函数
下一篇: 音频设备事件处理2
freedomAfish
博客等级 码龄15年 19粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值