该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#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;
}