从playfield开源代码复制的opensl es初始化代码

news/2025/10/16 9:37:32/文章来源:https://www.cnblogs.com/1288blog/p/19144833

从playfield开源代码复制的opensl es初始化代码

/* -*- coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*- *//** Copyright (c) 2025, Awe Morris. All rights reserved.*//** HAL for OpenSL ES on Android*//* Base */
#include "stratohal/platform.h"/* OpenSLES */
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>/* POSIX */
#include <pthread.h>
#include <sys/types.h>/* C */
#include <stdlib.h>
#include <string.h>
#include <math.h>/** sound Buffer Parameters*/
#define SAMPLING_RATE        (44100)
#define CHANNELS        (2)
#define FRAME_SIZE        (4)
#define BUF_FRAMES        (SAMPLING_RATE / 4)/** OpenSL ES Objects*/
static SLObjectItf engine_object;
static SLEngineItf engine_engine;
static SLObjectItf output_mix_object;
static SLObjectItf bq_player_object[SOUND_TRACKS];
static SLPlayItf bq_player_play[SOUND_TRACKS];
static SLAndroidSimpleBufferQueueItf bq_player_buffer_queue[SOUND_TRACKS];/* Buffers */
static uint32_t sample_buf[SOUND_TRACKS][BUF_FRAMES];/* Mutex objects to synchronize accesses to sample_buf */
static pthread_mutex_t sound_mutex[SOUND_TRACKS];/* Input Streams */
static struct wave *wave[SOUND_TRACKS];/* Volume Values */
static float volume[SOUND_TRACKS];/* Finish Flags */
static bool pre_finish[SOUND_TRACKS];     /* Shows if we reached an end-of-stream. */
static bool post_finish[SOUND_TRACKS];     /* Shows if we finished a playback of a final buffer. *//** Forward Declarations*/
static void play_callback(SLAndroidSimpleBufferQueueItf bq, void *context);
static void enqueue(int stream);
static void scale_samples(uint32_t *buf, int frames, float vol);/** Initialize OpenSL ES.*/
void init_opensl_es(void)
{for (int i = 0; i < SOUND_TRACKS; i++)pthread_mutex_init(&sound_mutex[i], NULL);slCreateEngine(&engine_object, 0, NULL, 0, NULL, NULL);(*engine_object)->Realize(engine_object, SL_BOOLEAN_FALSE);(*engine_object)->GetInterface(engine_object, SL_IID_ENGINE, &engine_engine);const SLInterfaceID outids[1] = {SL_IID_PLAYBACKRATE};const SLboolean outreq[1] = {SL_BOOLEAN_FALSE};(*engine_engine)->CreateOutputMix(engine_engine, &output_mix_object, 1, outids, outreq);(*output_mix_object)->Realize(output_mix_object, SL_BOOLEAN_FALSE);SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM,2,SL_SAMPLINGRATE_44_1,SL_PCMSAMPLEFORMAT_FIXED_16,SL_PCMSAMPLEFORMAT_FIXED_16,SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT,SL_BYTEORDER_LITTLEENDIAN};SLDataSource audio_src = {&loc_bufq, &format_pcm};SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, output_mix_object};SLDataSink audioSnk = {&loc_outmix, NULL};const SLInterfaceID bqids[1] = {SL_IID_BUFFERQUEUE};const SLboolean bqreq[1] = {SL_BOOLEAN_TRUE};for (int i = 0; i < SOUND_TRACKS; i++) {(*engine_engine)->CreateAudioPlayer(engine_engine, &bq_player_object[i], &audio_src, &audioSnk, 1, bqids, bqreq);(*bq_player_object[i])->Realize(bq_player_object[i], SL_BOOLEAN_FALSE);(*bq_player_object[i])->GetInterface(bq_player_object[i], SL_IID_PLAY, &bq_player_play[i]);(*bq_player_object[i])->GetInterface(bq_player_object[i], SL_IID_BUFFERQUEUE, &bq_player_buffer_queue[i]);(*bq_player_buffer_queue[i])->RegisterCallback(bq_player_buffer_queue[i], play_callback, (void *)(intptr_t)i);(*bq_player_play[i])->SetCallbackEventsMask(bq_player_play[i], SL_PLAYEVENT_HEADATEND);(*bq_player_play[i])->SetPlayState(bq_player_play[i], SL_PLAYSTATE_PLAYING);}
}void sl_pause_sound(void)
{for (int i = 0; i < SOUND_TRACKS; i++) {if (bq_player_play[i] != NULL)(*bq_player_play[i])->SetPlayState(bq_player_play[i], SL_PLAYSTATE_STOPPED);}
}void sl_resume_sound(void)
{for (int i = 0; i < SOUND_TRACKS; i++) {if (bq_player_play[i] != NULL)(*bq_player_play[i])->SetPlayState(bq_player_play[i], SL_PLAYSTATE_PLAYING);}
}static void play_callback(SLAndroidSimpleBufferQueueItf bq, void *context)
{int stream = (intptr_t)context;pthread_mutex_lock(&sound_mutex[stream]);enqueue(stream);pthread_mutex_unlock(&sound_mutex[stream]);
}static void enqueue(int stream)
{if (wave[stream] == NULL)return;/* Set a post-finish flag if an end-of-stream was detected in a previous filling. */if (pre_finish[stream]) {wave[stream] = NULL;post_finish[stream] = true;return;}/* Get PCM samples. */int read_samples = get_wave_samples(wave[stream], sample_buf[stream], BUF_FRAMES);/* Fill the remaining samples by zeros for a case where we have reached an end-of-stream. */if (read_samples < BUF_FRAMES)memset(sample_buf[stream] + read_samples, 0, (size_t)(BUF_FRAMES - read_samples) * FRAME_SIZE);/* Scale samples by a volume value. */scale_samples(sample_buf[stream], BUF_FRAMES, volume[stream]);/* Write the buffer. */(*bq_player_buffer_queue[stream])->Enqueue(bq_player_buffer_queue[stream], sample_buf[stream], read_samples * FRAME_SIZE);/* Set a pre-finish flag if we reached an end-of-stream. */if (is_wave_eos(wave[stream]))pre_finish[stream] = true;
}static void scale_samples(uint32_t *buf, int frames, float vol)
{float scale;uint32_t frame;int32_t il, ir;    /* intermediate L/R */int16_t sl, sr;    /* source L/R*/int16_t dl, dr;    /* destination L/R */int i;__sync_synchronize();/* Convert a scale factor to an exponential value. */scale = (powf(10.0f, vol) - 1.0f) / (10.0f - 1.0f);/* Scale samples. */for (i = 0; i < frames; i++) {frame = buf[i];sl = (int16_t)(uint16_t)frame;sr = (int16_t)(uint16_t)(frame >> 16);il = (int)(sl * scale);ir = (int)(sr * scale);il = il > 32767 ? 32767 : il;il = il < -32768 ? -32768 : il;ir = ir > 32767 ? 32767 : ir;ir = ir < -32768 ? -32768 : ir;dl = (int16_t)il;dr = (int16_t)ir;buf[i] = ((uint32_t)(uint16_t)dl) | (((uint32_t)(uint16_t)dr) << 16);}
}/** HAL*/bool play_sound(int stream, struct wave *w)
{if (bq_player_play[stream] == NULL)return true;pthread_mutex_lock(&sound_mutex[stream]);{wave[stream] = w;pre_finish[stream] = false;post_finish[stream] = false;enqueue(stream);}pthread_mutex_unlock(&sound_mutex[stream]);return true;
}bool stop_sound(int stream)
{if (bq_player_play[stream] == NULL)return true;pthread_mutex_lock(&sound_mutex[stream]);{wave[stream] = NULL;pre_finish[stream] = false;post_finish[stream] = false;}pthread_mutex_unlock(&sound_mutex[stream]);return true;
}bool set_sound_volume(int stream, float vol)
{volume[stream] = vol;__sync_synchronize();return true;
}bool is_sound_finished(int stream)
{__sync_synchronize();if (!post_finish[stream])return false;return true;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年螺带混合机优质厂家最新推荐排行榜:聚焦综合实力、产品性能与服务质量的权威筛选榜单

在化工、制药、食品、新能源等关键行业的生产流程中,螺带混合机作为保障物料混合均匀度、提升生产效率的核心设备,其品质与服务直接决定企业生产效益。当前市场上螺带混合机厂家数量众多,但产品质量参差不齐,部分厂…

P2151 HH 去散步

问题: 给定一个无向图,\(n\) 个点编号为 \([0,n-1]\),\(m\) 条边。从 \(s\) 出发,走 \(k\) 条边,其中相邻的两步不能走同一条边,求最后停在终点 \(t\) 的方案数。放在 noip 模拟赛 T2 还多测卡常 (?)。考场思路…

2025年钢结构建材厂家最新推荐排行榜,彩钢瓦,镀锌板,折弯件,C型钢,Z型钢,压型瓦,楼承板,钢结构安装,次檩条公司推荐

2025年钢结构建材厂家最新推荐排行榜:彩钢瓦、镀锌板、折弯件等专业选购指南行业背景与发展趋势钢结构建筑作为现代建筑体系的重要组成部分,近年来在工业厂房、商业综合体、仓储物流等领域的应用持续扩大。随着绿色建…

2025年发电机组厂家最新权威推荐榜:柴油/燃气/船用/静音箱式/移动拖车/集装箱发电机组,上柴/玉柴/潍柴/康明斯/沃尔沃/道依茨/帕金斯/MTU品牌全覆盖

2025年发电机组厂家最新权威推荐榜:柴油/燃气/船用/静音箱式/移动拖车/集装箱发电机组,上柴/玉柴/潍柴/康明斯/沃尔沃/道依茨/帕金斯/MTU品牌全覆盖行业背景与发展趋势发电机组作为现代能源供应体系的重要组成部分,…

2025年铣刀厂家最新权威推荐榜:雕刻机铣刀/金刚石铣刀/木工铣刀/绝缘材料铣刀/碳纤维铣刀/亚克力铣刀/金属加工铣刀/铝合金铣刀/石墨铣刀/不锈钢铣刀/金属切削铣刀/电木铣刀/塑胶铣刀/PC铣刀

2025年铣刀厂家最新权威推荐榜:专业选购指南与品牌深度解析随着制造业向高精度、高效率方向不断发展,铣刀作为数控加工的核心工具,其性能和质量直接影响着加工效率和产品质量。在现代工业体系中,不同类型的材料需要…

2025年下半年权威信息公布:西安学区房/书包房/五大名校/交大书包新楼盘口碑推荐榜前十强出炉,高得房率/推荐好房/地铁口/小高层/低总价/低单价/高性价比/高赠送/四代宅

摘要 随着西安城市化进程加速,2025年房产市场持续火热,购房者关注点转向口碑、配套和教育资源。本文基于市场调研和用户反馈,整理出西安新楼盘口碑排行榜前十,旨在为购房者提供参考。榜单综合了楼盘品质、口碑评分…

.NET 10中GC(垃圾收集器)更新

.NET GC的大总管Maoni发了一篇新文章《准备 .NET 10 GC》,准备 .NET 10 GC” 并非单一动作,而是 “代码优化(减少 GC 压力)+ 配置预留(适配新特性)+ 环境兼容(保障运行基础) ” 的组合:核心是基于 .NET GC 的演…

【转】扫盲:Windows桌面应用开发框架:原生、跨平台、云桌面

https://blog.csdn.net/m0_57344393/article/details/135970018官方文档例子:https://dotnet.microsoft.com/en-us/learn/maui/first-app-tutorial/next ---------------------一、原生框架 在 Windows 桌面应用开发中…

vxe-table v4版本使用注意事项

1.v4版本(项目已经升级为VxeUI)把之前的vxe-table项目分成了几类:比如按钮,分页等组件 放到了vxe-pc-ui项目里,而vxe-table则只剩与其他前端UI框架类似的专注表格的功能,所以要正常使用原来的 分页/工具栏等功能,必须按…

​​电容瞬态放电原理:大电流的产生机制深度解析​

本文系统解析电容瞬态放电的物理机制,涵盖储能本质、电流生成条件及能量释放限制,强调低阻抗、低ESR和低电感设计对大电流的关键作用。电容瞬态放电现象是电力电子和脉冲功率技术中的核心物理过程,其大电流产生机制…

Chrome浏览器离线版下载,谷歌(Google)浏览器离线安装包下载,手机版,Mac版,window版都有,不上网也可以安装

下载地址获取 https://pan.quark.cn/s/0065796ea9dc 所在目录使用教程 双击直接打开 特点 功能强大 ​

基于Java+Springboot+Vue开发的在线摄影预约管理系统源码+运行步骤

项目简介该项目是基于Java+Springboot+Vue开发的在线摄影预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。…

2025 年超微粉碎机厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

随着 2025 年化工、制药、食品、新能源等下游行业对超微粉体的需求持续攀升,市场对超微粉碎机的粉碎效率、粒度控制精度及物料适配性提出了更严苛的要求。然而当前行业内存在技术同质化严重、部分企业缺乏核心专利支撑…

若干树形dpの总结

洛谷P3574(POI 2014) 题目描述 在一个叫做比特村的小村庄中,有 \(n-1\) 条路连接着这个村庄中的全部 \(n\) 个房子。 每两个房子之间都有一条唯一的通路。这些房子的编号为 \(1\) 至 \(n\)。 \(1\) 号房子属于村庄的…

2025 年最新推荐!国内冷库厂商综合实力排行榜出炉,涵盖冷冻 / 装配式 / 超低温等多类型冷库解决方案

随着冷链物流行业在食品保鲜、医药存储、化工冷链等领域的深度渗透,冷库作为核心基础设施,市场需求持续攀升。但当前市场上冷库制造商数量众多,技术水平、产品质量与服务能力差异显著,企业在选型时常常面临 “技术…

2025 年景观石厂家最新推荐榜单:千层石 / 泰山石 / 鹅卵石等各类石材企业全面盘点,助力客户精准选择优质景观石品牌

当前园林景观行业飞速发展,景观石作为关键构成元素,市场需求日益增长,但行业问题也随之凸显。优质景观石资源因过度开采面临枯竭,开采对环境破坏大,可持续发展受阻;产品同质化严重,缺乏创新,部分企业技术水平有…

详细介绍:Java-Spring 入门指南(十六)SpringMVC--RestFul 风格

详细介绍:Java-Spring 入门指南(十六)SpringMVC--RestFul 风格pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

剑指offer-35、数组中的逆序对

题⽬描述 在数组中的两个数字,如果前⾯⼀个数字⼤于后⾯的数字,则这两个数字组成⼀个逆序对。输⼊⼀个数组,求出这个数组中的逆序对的总数。 输⼊⼀个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的…

2025 年最新推荐!西宁种植牙医院推荐榜单:助您精准选靠谱口腔机构

当前口腔种植需求持续增长,种植牙凭借出色的功能性与美观性,成为缺牙患者修复的首选方式。然而,西宁地区口腔种植机构数量繁杂,资质、技术与服务质量差距显著 —— 部分机构存在医疗设备陈旧、消毒流程不规范、专家…

2025 年太阳能厂家最新推荐:全场景系统企业综合实力榜,含热水 / 发电 / 光伏热等领域优质品牌测评

随着双碳战略深入推进,太阳能行业成为能源转型核心赛道,但市场乱象却制约着用户选择。一方面,大量企业涌入导致技术水平悬殊,部分厂商缺乏核心研发能力,仅靠简单组装设备投放市场,产品性能不稳定、能耗控制失效等…