c语言 fmod,我也发个程序 混脸熟。。FMOD做的音乐播放器。。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

#include

#include "inc/fmod.h"

typedef struct PLAY

{

FMOD_SYSTEM *system;

FMOD_SOUND *sound;

FMOD_CHANNEL *channel;

float volume;

void (*PLAY_CALLBACK)(struct PLAY *play);

int flag;

}PLAY;

/*FMOD_RESULT F_CALLBACK mycallback(FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, void *commanddata1, void *commanddata2)

{

if(type==FMOD_CHANNEL_CALLBACKTYPE_END)printf("ddd");

return FMOD_OK;

}*/

static void play_upsystem(void *p)

{

int playing=1;

while(playing)

{

Sleep(100);

FMOD_Channel_IsPlaying ( ((PLAY*)p)->channel , & playing );

FMOD_System_Update(((PLAY*)p)->system ) ;

}

if(((PLAY*)p)->PLAY_CALLBACK!=NULL)((PLAY*)p)->PLAY_CALLBACK(p);

}

int play_init(PLAY **play)//初始化

{

int err=0;

*play=(PLAY*)malloc(sizeof(PLAY));

if(*play==NULL)return -1;

memset(*play,0,sizeof(PLAY));

(*play)->volume=0.8f;

err=FMOD_System_Create(&(*play)->system);

if(err!=0)

{

free(*play);

return -1;

}

err=FMOD_System_Init((*play)->system,10, FMOD_INIT_NORMAL,NULL);

if(err!=0)

{

free(*play);

return -1;

}

return 0;

}

void play_close(PLAY *play)//关闭 释放资源

{

if(play->channel!=NULL)FMOD_Channel_Stop(play->channel);

if(play->sound!=NULL)FMOD_Sound_Release(play->sound);

if(play->system!=NULL)FMOD_System_Close(play->system),FMOD_System_Release(play->system);

if(play->flag!=0)play->flag=0;

if(play!=0)free(play);

}

int play_star(PLAY *play,char *name,void (*PLAY_CALLBACK)(struct PLAY *play))//播放文件

{

int err=0;

play->PLAY_CALLBACK=PLAY_CALLBACK;

err=FMOD_System_CreateStream(play->system,name, FMOD_3D, 0, &play->sound);

if(err!=0)return -1;

err=FMOD_Sound_SetMode(play->sound,FMOD_LOOP_OFF);

if(err!=0)return -1;

err=FMOD_System_PlaySound(play->system,FMOD_CHANNEL_FREE,play->sound,0,&play->channel);

if(err!=0)return -1;

//err=FMOD_Channel_SetCallback(play->channel,mycallback);

//if(err!=0)return -1;

play->flag=1;

_beginthread (play_upsystem,0, play);

}

int play_Continue_Pause(PLAY *play,int type)//暂停或恢复 type =1 暂停 0恢复

{

int err=0;

float i=0.0f;

if (play->channel!= NULL)

{

if(type==0)

{

err=FMOD_Channel_SetPaused(play->channel,type);

for(i=0.0f;ivolume;i+=0.05)

{

FMOD_Channel_SetVolume(play->channel,i);

Sleep(40);

}

}

else

{

for(i=play->volume;i>0.0f;i-=0.05)

{

FMOD_Channel_SetVolume(play->channel,i);

Sleep(40);

}

err=FMOD_Channel_SetPaused(play->channel,type);

}

}

return err;

}

int play_stop(PLAY *play) //停止播放

{

int err=0;

if(play->channel!= NULL)err=FMOD_Channel_Stop(play->channel);

play->flag=0;

return err;

}

unsigned int play_GetCurPos(PLAY *play)//获取当前位置

{

unsigned int position=0;

if(play->channel!=NULL)FMOD_Channel_GetPosition(play->channel,&position,FMOD_TIMEUNIT_MS);

return position;

}

unsigned int play_GetMilliSeconds(PLAY *play)//获取音乐时长

{

unsigned int length=0;

if(play->sound!=NULL)FMOD_Sound_GetLength(play->sound,&length,FMOD_TIMEUNIT_MS);

return length;

}

int play_SetCurPos(PLAY *play,unsigned int position)//设置播放位置

{

int err=0;

float i;

if(play->channel!=NULL)

{

play_Continue_Pause(play,1);

FMOD_Channel_SetPosition(play->channel,position,FMOD_TIMEUNIT_MS);

play_Continue_Pause(play,0);

}

return err;

}

int play_SetVolume(PLAY *play,float n)//设置音量

{

int err=0;

err=FMOD_Channel_SetVolume(play->channel,n);

if(err!=0)play->volume=n;

return err;

}

void hdhs(PLAY *pl)//回调函数。。当文件播放完毕是会调用这个函数。用户自己定义。

{

play_stop(pl);//停止播放

play_star(pl,"路绮欧 - 习惯.mp3",hdhs);//再次播放文件

}

int main(int argc, char *argv[])

{

PLAY *pl;//定义变量

play_init(&pl);//初始化变量

play_star(pl,"路绮欧 - 习惯.mp3",hdhs);//播放文件

play_SetVolume(pl,0.9f);//设置音量

getch();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值