将wave文件加载到内存中来,用什么方法比较好?

lilostyle 2003-10-18 11:25:17
GlobalAlloc?
还是HeapCreate 什么的?
因为要动态加载,所以不能将wave文件加载到资源中来
还请各位大侠多多指点啊
最好能给出加载进来后,如何使用sndPlaySound函数播放的代码
谢过先
~~bow

...全文
138 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
akiko 2003-10-18
  • 打赏
  • 举报
回复
#include <mmsystem.h>
project--setting--link--Object/library modules加上winmm.lib
然后直接:
sndPlaySound("d:\\logoff.wav",SND_ASYNC);
lilostyle 2003-10-18
  • 打赏
  • 举报
回复
是这样吗??
MMSystem只支持从文件名或资源播放两种方式吗?
我看了msdn也云里雾里的,不好意思啊 shy

能帮我确定一下吗
我这里原先将wav放在资源里能工作的代码是
HINSTANCE h=AfxGetInstanceHandle();
HRSRC hr=FindResource(h,"KACHA","WAVE");
HGLOBAL hg=LoadResource(h,hr);
LPSTR lp=(LPSTR)LockResource(hg);
sndPlaySound(lp,SND_ASYNC|SND_MEMORY);
UnlockResource(hg);
FreeResource(hg);
我还以为在SND_MEMORY方式下,lp可以指向一段内存空间,不管是LockResource得到的,
还是GlobalLock得到的
大牛,帮我验证一下吧
lilostyle 2003-10-18
  • 打赏
  • 举报
回复
这个我也明白,(还是很谢谢你)
但是我不希望每次对wav文件做微小的改动都要重新link
我希望程序能自己加载相对目录下的×××.wav文件

比如我在对话框初始化时把他加载进内存,在对话框退出时将其释放掉
在对话框生存期内,可能频繁的需要播放该声音,所以想如同bmp一样
动态加载进内存,不直接添加到资源中去

那位老大,给点意见的说
谢过先
Bow~~~`
microran2000 2003-10-18
  • 打赏
  • 举报
回复
MMSystem中函数好像只提供文件名或者资源播放两种方式,如果你先播放速度不尽人意.那么你可以采用DirectSound.
microran2000 2003-10-18
  • 打赏
  • 举报
回复
如果你的Wav文件比较小,你可以把它直接嵌入到你的应用程序中,一旦你的程序加载后,这个资源就会自动载入到你的进程的内存地址空间.你可以采用sndPlaySound来播放程序中的该资源.
具体文档可以参考PlaySound或者sndPlaySound
lilostyle 2003-10-18
  • 打赏
  • 举报
回复
这样每次播放会不会都要读文件阿?
如果播放操作比较频繁
效率岂不是很低????
Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发经典丛书 出版社:清华大学出版社 ISBN:9787302343011 上架时间:2013-12-30 出版日期:2014 年1月 开本:16开 页码:344 版次:1-1 第1章 Android平台上的C++入门 1 1.1 Microsoft Windows 1 1.1.1 在Windows平台上下载并安装JDK开发包 2 1.1.2 在Windows平台上下载并安装Apache ANT 5 1.1.3 在Windows平台上下载并安装Android SDK 7 1.1.4 在Windows平台上下载并安装Cygwin 8 1.1.5 在Windows平台上下载并安装Android NDK 11 1.1.6 在Windows平台上下载并安装Eclipse 13 1.2 Apple Mac OS X 14 1.2.1 在Mac平台上安装Xcode 14 1.2.2 验证Mac平台的Java开发包 15 1.2.3 验证Mac平台上的Apache ANT 15 1.2.4 验证GNU Make 16 1.2.5 在Mac平台上下载并安装Android SDK 16 1.2.6 在Mac平台上下载并安装Android NDK 18 1.2.7 在Mac平台上下载并安装Eclipse 19 1.3 Ubuntu Linux 20 1.3.1 检查GNU C库版本 20 1.3.2 激活在64位系统上支持32位的功能 21 1.3.3 在Linux平台上下载并安装Java开发工具包(JDK) 21 1.3.4 在Linux平台上下载并安装Apache ANT 22 1.3.5 在Linux平台上下载并安装GNU Make 22 1.3.6 在Linux平台上下载并安装Android SDK 23 1.3.7 在Linux平台上下载并安装Android NDK 24 1.3.8 在Linux平台上下载并安装Eclipse 25 1.4 下载并安装ADT 26 1.4.1 安装Android平台包 29 1.4.2 配置模拟器 30 1.5 小结 33 第2章 深入了解Android NDK 35 2.1 Android NDK提供的组件 35 2.2 Android NDK的结构 36 2.3 以一个示例开始 36 2.3.1 指定Android NDK的位置 37 2.3.2 导入示例项目 37 2.3.3 向项目中添加原生支持 39 2.3.4 运行项目 40 2.3.5 用命令行对项目进行构建 41 2.3.6 检测Android NDK项目的结构 42 2.4 构建系统 42 2.4.1 Android.mk 43 2.4.2 Application.mk 53 2.5 使用NDK-Build脚本 54 2.6 排除构建系统故障 55 2.7 小结 56 第3章 用JNI实现与原生代码通信 57 3.1 什么是JNI 57 3.2 以一个示例开始 57 3.2.1 原生方法的声明 58 3.2.2 加载共享库 58 3.2.3 实现原生方法 59 3.3 数据类型 64 3.3.1 基本数据类型 64 3.3.2 引用类型 64 3.4 对引用数据类型的操作 65 3.4.1 字符串操作 65 3.4.2 数组操作 67 3.4.3 NIO 操作 68 3.4.4 访问域 69 3.4.5 调用方法 71 3.4.6 域和方法描述符 72 3.5 异常处理 75 3.5.1 捕获异常 75 3.5.2 抛出异常 75 3.6 局部和全局引用 76 3.6.1 局部引用 76 3.6.2 全局引用 76 3.6.3 弱全局引用 77 3.7 线程 78 3.7.1 同步 78 3.7.2 原生线程 79 3.8 小结 79 第4章 使用SWIG自动生成JNI代码 81 4.1 什么是SWIG 81 4.2 安装 82 4.2.1 Windows平台上SWIG的安装 82 4.2.2 在Mac OS X下安装 83 4.2.3 在Ubuntu Linux下安装 85 4.3 通过示例程序试用SWIG 86 4.3.1 接口文件 86 4.3.2 在命令行方式下调用SWIG 89 4.3.3 将SWIG集成到Android构建过程中 90 4.3.4 更新Activity 92 4.3.5 执行应用程序 93 4.3.6 剖析生成的代码 93 4.4 封装C语言代码 94 4.4.1 全局变量 94 4.4.2 常量 95 4.4.3 只读变量 96 4.4.4 枚举 97 4.4.5 结构体 100 4.4.6 指针 101 4.5 封装C++代码 101 4.5.1 指针、引用和值 102 4.5.2 默认参数 103 4.5.3 重载函数 104 4.5.4 类 104 4.6 异常处理 106 4.7 内存管理 107 4.8 从原生代码中调用Java 108 4.8.1 异步通信 108 4.8.2 启用Directors 109 4.8.3 启用RTTI 109 4.8.4 重写回调方法 109 4.8.5 更新HelloJni Activity 110 4.9 小结 110 第5章 日志、调试及故障处理 111 5.1 日志 111 5.1.1 框架 111 5.1.2 原生日志API 112 5.1.3 受控制的日志 114 5.1.4 控制台日志 118 5.2 调试 119 5.2.1 预备知识 119 5.2.2 调试会话建立 120 5.2.3 建立调试示例 121 5.2.4 启动调试器 121 5.3 故障处理 126 5.3.1 堆栈跟踪分析 127 5.3.2 对JNI的扩展检查 128 5.3.3 内存问题 130 5.3.4 strace 133 5.4 小结 134 第6章 Bionic API入门 135 6.1 回顾标准库 135 6.2 还有另一个C库 136 6.2.1 二进制兼容性 136 6.2.2 提供了什么 136 6.2.3 缺什么 137 6.3 内存管理 137 6.3.1 内存分配 137 6.3.2 C语言的动态内存管理 138 6.3.3 C++的动态内存管理 139 6.4 标准文件I/O 141 6.4.1 标准流 141 6.4.2 使用流I/O 141 6.4.3 打开流 142 6.4.4 写入流 143 6.4.5 流的读取 145 6.4.6 搜索位置 148 6.4.7 错误检查 149 6.4.8 关闭流 149 6.5 与进程交互 150 6.5.1 执行shell命令 150 6.5.2 与子进程通信 150 6.6 系统配置 151 6.6.1 通过名称获取系统属性值 152 6.6.2 通过名称获取系统属性 152 6.7 用户和组 153 6.7.1 获取应用程序用户和组ID 153 6.7.2 获取应用程序用户名 154 6.8 进程间通信 154 6.9 小结 154 第7章 原生线程 155 7.1 创建线程示例项目 155 7.1.1 创建Android项目 155 7.1.2 添加原生支持 157 7.1.3 声明字符串资源 157 7.1.4 创建简单的用户界面 157 7.1.5 实现Main Activity 159 7.1.6 生成C/C++头文件 162 7.1.7 实现原生函数 163 7.1.8 更新Android.mk构建脚本 165 7.2 Java 线程 165 7.2.1 修改示例应用程序使之能够使用Java线程 165 7.2.2 执行Java Threads示例 166 7.2.3 原生代码使用Java线程的优缺点 167 7.3 POSIX线程 168 7.3.1 在原生代码中使用POSIX线程 168 7.3.2 用pthread_create创建线程 168 7.3.3 更新示例应用程序以使用POSIX线程 169 7.3.4 执行POSIX线程示例 174 7.4 从POSIX线程返回结果 174 7.5 POSIX线程同步 176 7.5.1 用互斥锁同步POSIX线程 176 7.5.2 使用信号量同步POSIX线程 180 7.6 POSIX线程的优先级和调度策略 180 7.6.1 POSIX的线程调度策略 181 7.6.2 POSIX Thread优先级 181 7.7 小结 181 第8章 POSIX Socket API:面向连接的通信 183 8.1 Echo Socket示例应用 183 8.1.1 Echo Android应用项目 184 8.1.2 抽象echo activity 184 8.1.3 echo应用程序字符串资源 188 8.1.4 原生echo模块 188 8.2 用TCP sockets实现面向连接的通信 191 8.2.1 Echo Server Activity的布局 192 8.2.2 Echo Server Activity 193 8.2.3 实现原生TCP Server 194 8.2.4 Echo客户端Activity布局 206 8.2.5 Echo客户端Activity 208 8.2.6 实现原生TCP客户端 210 8.2.7 更新Android Manifest 213 8.2.8 运行TCP Sockets示例 214 8.3 小结 217 第9章 POSIX Socket API:无连接的通信 219 9.1 将UDP Server方法添加到Echo Server Activity中 219 9.2 实现原生UDP Server 220 9.2.1 创建UDP Socket:socket 220 9.2.2 从Socket接收数据报:recvfrom 221 9.2.3 向Socket发送数据报:sendto 223 9.2.4 原生UDP Server方法 224 9.3 将原生UDP Client方法加入Echo Client Activity中 225 9.4 实现原生UDP Client 226 9.5 运行UDP Sockets示例 228 9.5.1 连通UDP的模拟器 228 9.5.2 启动Echo UDP Client 229 9.6 小结 229 第10章 POSIX Socket API:本地通信 231 10.1 Echo Local Activity布局 231 10.2 Echo Local Activity 232 10.3 实现原生本地Socket Server 237 10.3.1 创建本地Socket:socket 237 10.3.2 将本地socket与Name绑定:bind 238 10.3.3 接受本地Socket:accept 240 10.3.4 原生本地Socket Server 240 10.4 将本地Echo Activity添加到Manifest中 242 10.5 运行本地 Sockets示例 243 10.6 异步I/O 243 10.7 小结 244 第11章 支持C++ 245 11.1 支持的C++运行库 245 11.1.1 GAbi++ C++运行库 246 11.1.2 STLport C++运行库 246 11.1.3 GNU STL C++运行库 246 11.2 指定C++运行库 246 11.3 静态运行库与动态运行库 247 11.4 C++异常支持 247 11.5 C++ RTTI支持 248 11.6 C++标准库入门 249 11.6.1 容器 249 11.6.2 迭代器 250 11.6.3 算法 251 11.7 C++运行库的线程安全 251 11.8 C++运行库调试模式 251 11.8.1 GNU STL调试模式 251 11.8.2 STLport调试模式 252 11.9 小结 253 第12章 原生图形API 255 12.1 原生图形API的可用性 255 12.2 创建一个AVI视频播放器 256 12.2.1 将AVILib作为NDK的一个导入模块 256 12.2.2 创建AVI播放器Android应用程序 258 12.2.3 创建AVI Player的Main Activity 258 12.2.4 创建Abstract Player Activity 262 12.3 使用JNI图形API进行渲染 269 12.3.1 启用JNI Graphics API 269 12.3.2 使用JNI Graphics API 270 12.3.3 用Bitmap渲染来更新AVI Player 271 12.3.4 运行使用Bitmap渲染的AVI Player 278 12.4 使用OpenGL ES渲染 279 12.4.1 使用OpenGL ES API 279 12.4.2 启用OpenGL ES 1.x API 279 12.4.3 启用OpenGL ES 2.0 API 280 12.4.4 用OpenGL ES渲染来更新AVI Player 280 12.5 使用原生Window API进行渲染 290 12.5.1 启用原生Window API 290 12.5.2 使用原生Window API 291 12.5.3 用原生window渲染器来更新AVI Player 293 12.5.4 EGL图形库 301 12.6 小结 301 第13章 原生音频API 303 13.1 使用OpenSL ES API 303 13.1.1 与OpenSL ES标准的兼容性 304 13.1.2 音频许可 304 13.2 创建WAVE音频播放器 304 13.2.1 将WAVELib作为NDK导入模块 304 13.2.2 创建WAVE播放器Android应用程序 306 13.2.3 创建WAVE播放器主Activity 306 13.2.4 实现WAVE Aduio播放 310 13.3 运行WAVE Audio Player 327 13.4 小结 328 第14章 程序概要分析和NEON优化 329 14.1 用GNU Profiler度量性能 329 14.1.1 安装Android NDK Profiler 329 14.1.2 启用Android NDK Profiler 330 14.1.3 使用GNU Profiler分析gmon.out文件 331 14.2 使用ARM NEON Intrinsics进行优化 332 14.2.1 ARM NEON技术概述 333 14.2.2 给AVI Player添加一个亮度过滤器 333 14.2.3 为AVI播放器启用Android NDK Profiler 336 14.2.4 AVI Player程序概要分析 337 14.2.5 使用NEON Intrinsics优化Brightness Filter 338 14.3 自动向量化 342 14.3.1 启用自动向量化 343 14.3.2 自动向量化问题的发现和排除 344 14.4 小结 344
引言   随着网络技术和现代通信技术的发展,家庭网络化已经成为家庭现代化的趋势。家庭网络可视为一种分布式网络,通过无线家庭网关实现对普通家电终端的远程控制是未来的发展趋势,冈此无线家庭网关是整个家庭网络的核心,它主要实现网络接入、远程控制以及无线连接家庭内部异构子网等功能。其中无线网关控制技术是一个需要解决的关键问题。   目前无线控制技术主要有IrDA、ZigBee、无线USB、蓝牙、Z-Wave。在以上技术中,IrDA技术最具有成本优势且协议简单,但传输方向单一,不能组网。WirelessUSB的成本较高,主要用于传输高速多媒体数据,不适合智能家庭的控制应用。蓝牙技术主要用于传输语音,如果将其应用在智能家庭网关控制,将带来传输距离受限和控制协议复杂等问题。Z-Wave是从ZigBee标准中精简而来,但该技术目前尚不支持全球通用的2.4 GHz频段。ZigBee技术在传输距离、可靠性以及组网能力方面都极具优势,本文利用ZigBee技术对智能无线家庭网关控制技术进行研究。   1 无线智能家庭网关控制技术的结构设计   1.1 家庭网关组网技术的选择   ZigBee技术是一种新兴的远距离、低复杂度、低功耗、低数据速率、低成本的双向无线通信技术。ZigBee技术的低数据速率特点,适合于承载数据流量较小和QoS的要求不高的业务,因此,ZigBee技术是最适合智能家居系统的组网技术。对于智能家居系统来说,该网络自身是一个动态系统,不断与外界环境相互影响,网络中传输的数据量不大,网络节点多,要求低功耗,因此家庭无线网关利用ZigBee技术,其拓扑结构采用星型结构组网。   1.2 家庭网关的无线组网设计   基于ZigBee技术的家庭网关系统结构框图如图1所示,家庭网关和若干个无线通信ZigBee节点模块组成星形结构的家庭传输网络。家庭网关是网络协调器,它主导网络的建立,监督网络的正常运行,配置存储空间,实现网络初始化、数据采集、设备控制等功能。另外,它配置16位本地地址给设备以节省带宽。其他的无线通信ZigBee模块只能与家庭网关之间进行通信,实现状态采集、查询响应、设备控制等。智能家庭网关是一个智能的嵌入式网络系统,包括硬件和软件两部分。 智能网关结构全文共5页,当前为第1页。  1.3 智能家庭网关硬件结构设计方案 智能网关结构全文共5页,当前为第1页。   硬件部分需要提供多种多样的网络接口类型与控制接口,主要由主控制器、GPRS模块和ZigBee射频通信模块3部分组成,其结构框图如图2所示。   主控制器CPU控制各种各样的接口,包括以太网接口、USB接口、ADSL接口、WLAN接口等。主控制器采用三星公司的ARM9微处理器S3C24-10X,它具有外围扩展功能模块,能够实现高速处理。GPRS模块采用Siemens公司的TC35终端,通过串口与CPU相连,实现与Internet。的连接。ZigBee射频收发模块采用Chipcon AS公司的CC2420芯片.控制家庭网内具备ZigBee标准接口的家用电器。在家电控制器上加载ZigBee无线通信模块成为家庭分布式网络的终端设备。   2 无线智能家庭网关控制技术的实现   在选定了家庭网关的硬件平台后,家庭网关便有了自己的物理载体,但仅仅是硬件部分,并不能实现家庭网关所应具有的功能,还需要有建立在硬件平台之上的软件控制系统。   2.1 智能家庭网关系统的选用   家庭网关采用嵌入式Linux操作系统进行开发,包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面等。操作系统主要实现以下功能:    建立交叉编译环境。    引导装载程序(Bootloader),能实现系统的快速引导,提供瞬间开机功能;负责将Linux内核加载内存,并将控制权交给内核初始化程序。    Linux内核(kernel)的移植与裁减。Linux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统的功能,正确合理地设置内核的功能模块,只编译系统所需功能的代码,以获得更高的运行速度。    装载文件系统(file system)。嵌入式系统一般不具备硬盘等大容量存储体,而用Flash为主存储器,其文件系统也具有特殊性。    开发图形用户界面(GUI)。    选择上层应用程序(applieation)。   2.2 智能家庭网关软件结构的设计 智能网关结构全文共5页,当前为第2页。  智能家庭网关采用分层软件设计结构,如图3所示。在整个软件框架中,位于底层的是各类硬件驱动程序,通过嵌人式Linux操作系统实现底层硬件设备的驱动与管理。嵌入式Linux操作系统之上是针对设计需要而移植的TCP/IP协议与ZigBee通信协议。协议层之上为应用程序层,其中包括Web、CGI程序
我也想舔着个13脸来参加一下开源大赛啊,怎么没开源标签了 UI采用: EXUI20210101 调用模块: 精易模块 9.0.0(论坛源码)、 zyJson3.1.5(网上有源码)、 VJaudio( BASS模块,论坛下载的)、彗星歌词显示模块(附件带源码) 界面设计: AdobeIllustrator 2020设计 采用了 EXUI组件皮肤定制,没有用 EXUI自绘,还不就是能力不足呗。 软件功能: 1、  bass频谱绘制 2、  支持格式:*.mp3,*.wma,*.ape,*.ogg,*.flac,*.wav,*.mp4,*.m4a,*.mid,*.mpc,*.wave,*.cd,*.rm,*.tta,*.aiff,*.au 3、  取酷狗封面、歌词、解析lrc歌词 4、  遍历本地音乐文件 5、  两款界面皮肤更改 6、  还有蹩脚线程不卡界面 7、支持拖放音乐文件和 lrc歌词 然后就各种缝合,缝合怪就完成了,唯一有点成就感的就是自己写了一个 lrc 歌词解析 ,见: https://bbs.125.la/forum.php?mod=viewthreadtid=14658136page=1ordertype=1#pid20393566 AI界面设计效果图 成品软件界面 最后更新历史 已知问题 1.配置 2.专辑保存问题 3.第一次启动时加载皮肤,组件皮肤会加载失败的问题 4.更换皮肤会出现覆盖当前专辑图片的情况,因为重新载入了歌词专辑图片 5.如果文件夹内没有任何音乐文件会出错 ———————更新 1.8.5.0 2021.01.12 1、添加列表搜索功能,支持首字母拼音 2、添加我的收藏 3、修复部分皮肤加载失败,出现透明效果的 BUG 4、添加歌曲列表菜单 ———————更新 1.7.2.0重大更新 2021.01.01 1、重写歌词解析函数,减少不规则歌词错误 2、加入白色皮肤 3、重写网络获取歌词 API函数,服务器指向更改 4、修改皮肤显示错误等问题 5、修改菜单皮肤。 6、重写歌词界面,支持载入更多歌词。 ———————更新 1.6..5.0 2020.12.23 1、更新毛玻璃频谱效果 2、更新音乐文件和歌词文件,拖放文件支持 3、修改成静态变量,减少内存占用 4、修复播放新音乐时重置音量的问题 5、修复播放新音乐时重置音效的问题 6、修复播放音乐需要等待加载歌词的问题 写得非常臃肿不够简洁,我的第一个软件,希望大家多多指教。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧