加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
CL_Music.h 3.92 KB
一键复制 编辑 原始数据 按行查看 历史
SadLava 提交于 2022-05-08 17:08 . first update
#include <bass.h>
#include <basscd.h>
#include <bassmidi.h>
#include <bassflac.h>
#include <basswma.h>
#include <windows.h>
#include <string>
#include <stdio.h>
using namespace std;
#define CMUSIC_STOP BASS_ACTIVE_STOPPED/*停止状态*/
#define CMUSIC_PLAYING BASS_ACTIVE_PLAYING/*正在播放*/
#define CMUSIC_STALLED BASS_ACTIVE_STALLED/*失速状态, 正在等待数据*/
#define CMUSIC_PAUSED BASS_ACTIVE_PAUSED/*暂停状态*/
class CL_Music {
private:
DWORD id;
HSOUNDFONT sfont;
int plugin() {
BASS_PluginLoad("bass_ape.dll",0); // plugin loaded...
return 0;
}//读取插件;
public:
//基本功能
CL_Music() {
BASS_Init(-1, 44100, 0, 0, 0);//初始化(启用设备-1表示默认,采样率,效果参数,窗口句柄,0表示使用默认数据初始化DirectSound)
plugin();
}
~CL_Music() {
BASS_Free();
}
void init(){
BASS_Free();
BASS_Init(-1, 44100, 0, 0, 0);//初始化(启用设备-1表示默认,采样率,效果参数,窗口句柄,0表示使用默认数据初始化DirectSound)
plugin();
}
bool is_open() {
return id >= BASS_ERROR_ENDED;
}
void OpenFile(string fn,int begin=0,int end=0,bool loop=false) {
BASS_StreamFree(id);
if(loop) {
id=BASS_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);//是否从内存中加载,文件路径,起始位置,终止位置,是否循环播放
if(!this->is_open()) id=BASS_FLAC_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_CD_StreamCreateFile(fn.c_str(), BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_WMA_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
} else {
id=BASS_StreamCreateFile(FALSE, fn.c_str(), begin, end, 0|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_FLAC_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_CD_StreamCreateFile(fn.c_str(), BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_WMA_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_FX);
}
}
void OpenFile(wstring fn,int begin=0,int end=0,bool loop=false) {
BASS_StreamFree(id);
if(loop) {
id=BASS_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);//是否从内存中加载,文件路径,起始位置,终止位置,是否循环播放
if(!this->is_open()) id=BASS_FLAC_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_CD_StreamCreateFile(fn.c_str(), BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_WMA_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_LOOP|BASS_SAMPLE_FX);
} else {
id=BASS_StreamCreateFile(FALSE, fn.c_str(), begin, end, 0|BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_FLAC_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_CD_StreamCreateFile(fn.c_str(), BASS_SAMPLE_FX);
if(!this->is_open()) id=BASS_WMA_StreamCreateFile(FALSE, fn.c_str(), begin, end, BASS_SAMPLE_FX);
}
}
void Pause() {
BASS_ChannelPause(id);
}
void Stop() {
BASS_ChannelStop(id);
}
void setPos(float pos) {
auto Position=BASS_ChannelSeconds2Bytes(id, pos);
BASS_ChannelSetPosition(id, Position, BASS_POS_BYTE);
}
float getPos() {
return BASS_ChannelBytes2Seconds(id, BASS_ChannelGetPosition(id, BASS_POS_BYTE));
}
void setVolume(float vol) {
BASS_ChannelSetAttribute(id, BASS_ATTRIB_VOL, vol);
}
float getVolume() {
float vol;
BASS_ChannelGetAttribute(id, BASS_ATTRIB_VOL, &vol);
return vol;
}
float getLength() {
return BASS_ChannelBytes2Seconds(id, BASS_ChannelGetLength(id, BASS_POS_BYTE));
}
auto getActive() {
return BASS_ChannelIsActive(id);
}
void Play(float pos) {
this->setPos(pos);
BASS_ChannelPlay(id,false);
}
//复杂功能
int getLevel() {
return BASS_ChannelGetLevel(id);
}//获取左右声道峰值,低16位为左声道峰值; 高16位为右声道峰值
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化