⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysoundplayer.c

📁 在BREW平台下开发,用C语言写的适合作业,是实现声音接口的小程序,
💻 C
📖 第 1 页 / 共 2 页
字号:

// this function is called when your application is starting up
boolean mysoundplayer_InitAppData(mysoundplayer* pMe)
{
    // Get the device information for this handset.
    // Reference all the data by looking at the pMe->DeviceInfo structure
    // Check the API reference guide for all the handy device info you can get
    pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
    ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);

    // The display and shell interfaces are always created by
    // default, so we'll asign them so that you can access
    // them via the standard "pMe->" without the "a."
    pMe->pIDisplay = pMe->a.m_pIDisplay;
    pMe->pIShell   = pMe->a.m_pIShell;

	pMe->TotalTime = 0;
	pMe->PlayTime = 0;

	//为所画的进度条矩形赋初值
	pMe->total_rect.x= RECT_X;		//进度条背景矩形
	pMe->total_rect.y= RECT_Y;
	pMe->total_rect.dx =RECT_CX;
	pMe->total_rect.dy = RECT_CY;

	pMe->rect.x= RECT_X;			//进度条前景矩形
	pMe->rect.y= RECT_Y;
	pMe->rect.dx =RECT_CX;
	pMe->rect.dy = RECT_CY;

    // Insert your code here for initializing or allocating resources...



    // if there have been no failures up to this point then return success
    return TRUE;
}

// this function is called when your application is exiting
void mysoundplayer_FreeAppData(mysoundplayer* pMe)
{
    // insert your code here for freeing any resources you have allocated...

    // example to use for releasing each interface:
     if ( pMe->pIMenuCtl != NULL )         // check for NULL first
     {
        IMENUCTL_Release(pMe->pIMenuCtl);   // release the interface
        pMe->pIMenuCtl = NULL;             // set to NULL so no problems trying to free later
     }
    
     if ( pMe->pISoundPlayer != NULL )         // check for NULL first
     {
        ISOUNDPLAYER_Resume(pMe->pISoundPlayer);   // release the interface
        pMe->pISoundPlayer = NULL;             // set to NULL so no problems trying to free later
     }
    
}

/*==========================================================!
 *		@brief:		回调函数
 *		@param:		pUser指向用户的指针
 *		@param:		eCBType标记当前状态回调类型
 *		@param:		eStatus标记当前状态信息
 *		@param:		dwParam传递的数据
 */
static void SoundPlayerCBFn(void *pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eStatus, uint32 dwParam )
{
	int i;
	mysoundplayer* pMe = (mysoundplayer*)pUser;
	char szBuf [30] = {0};
	AEESoundPlayerCmdData * pData = (AEESoundPlayerCmdData *) dwParam;
	
	//--------以下的现实信息用于调试回调函数------------
//	pMe->ref++;
//	DBGPRINTF("=====================================");
//	DBGPRINTF("the times come into CB is: %d", pMe->ref);
//	DBGPRINTF("eStatus is: %d", eStatus);
//	DBGPRINTF("the eCBType is: %d ", eCBType);
//	DBGPRINTF("the wParam is: %d", dwParam);
	//---------------------------------------------------

	switch ( eStatus ) {
	case AEE_SOUNDPLAYER_DONE:
		//-----在回调函数中返回AEE_SOUNDPLAYER_DONE,有两种原因:-----------
		//       1。由于AEE_SOUNDPLAYER_TIME_CB(即用户发出了获取时间的命令)
		//          ==〉用户发出获取时间的命令,并返回了DONE,
		//              说明获取时间成功,总时间在pData中
		//------------------------------------------------------------------
		if (pData && eCBType == AEE_SOUNDPLAYER_TIME_CB) {
			pMe->TotalTime = pData->dwTotalTime / 1000;
//			DBGPRINTF("the total time is %d",pMe->TotalTime);
//			DBGPRINTF("the e time is %d",pData->dwElapsedTime/1000);
			ISOUNDPLAYER_Play(pMe->pISoundPlayer);
			break;
		}

		//-----------------------------------------------------------------
		//
		//       2。由于AEE_SOUNDPLAYER_PLAY_CB(即用户的播放命令)
		//          ==〉用户发出播放命令,现在返回了DONE,
		//              说明播放完成,此时需要激活菜单,重画进度条
		//------------------------------------------------------------------
		if(eCBType == AEE_SOUNDPLAYER_PLAY_CB)
		{
			pMe->PlayTime = pMe->TotalTime;
			DrawPlayStatus( pMe);
			IMENUCTL_SetActive(pMe->pIMenuCtl,TRUE);
			draw_back_rect( pMe);
			break;
		}
		break;

	case AEE_SOUNDPLAYER_TICK_UPDATE:
		// 在播放中,每一秒钟由此原因进入一次回调函数,可以用于计数
		pMe->PlayTime++;
		DrawPlayStatus( pMe);
//			DBGPRINTF("the current time is %d, currint dx is %d",pMe->PlayTime, pMe->rect.dx);
//			DBGPRINTF("------------------");
//			DBGPRINTF("the current time is %d", pMe->PlayTime);
//			DBGPRINTF("the current t/t is %d", pMe->PlayTime * (pMe->total_rect.dx-2));
//			DBGPRINTF("the current dx is %d", pMe->rect.dx);
		break;

	case AEE_SOUNDPLAYER_RESUME:
//		DBGPRINTF("resume ElapsedTime is %d", pData->dwElapsedTime );
//		DBGPRINTF("resume pme Time is %d", pMe->PlayTime);
//		pMe->PlayTime = pData->dwElapsedTime/1000;
		break;

	case AEE_SOUNDPLAYER_FFORWARD:
//		DBGPRINTF("the  9 total pdata is %d",pData);

//		DBGPRINTF("the  9 total time is %d",pData->dwTotalTime / 1000);
//		DBGPRINTF("ElapsedTime is %d", pData->dwElapsedTime/1000 );
		pMe->PlayTime = pData->dwElapsedTime/1000;
		break;

	case AEE_SOUNDPLAYER_AUDIO_SPEC:
//		pMe->TotalTime = pData->dwTotalTime / 1000;
		pMe->PlayTime = 0;
		break;

	default:
//		DisplayOutput (pMe, "Player: Unknown status");
		break;
   }
	
/*	switch ( eStatus ) {

	case AEE_SOUNDPLAYER_SUCCESS:
		if (pData && eCBType == AEE_SOUNDPLAYER_VOLUME_CB) {
			SPRINTF (szBuf, "Current Vol: %u", pData->wVolume); 
			DisplayOutput (pMe, szBuf);
		}
		else if (eCBType == AEE_SOUNDPLAYER_PLAY_CB)
			DisplayOutput (pMe, "Status: Playing");
		else if ((eCBType == AEE_SOUNDPLAYER_STATUS_CB||eCBType==AEE_SOUNDPLAYER_SOUND_CB))
			DisplayOutput (pMe, "Status: Success");
		break;
	case AEE_SOUNDPLAYER_DONE:
		if (pData && eCBType == AEE_SOUNDPLAYER_TIME_CB) {
            SPRINTF (szBuf, "Total (ms): %u", (uint16)pData->dwTotalTime); 
            DisplayOutput (pMe, szBuf);
		}
		else {
            DisplayOutput (pMe, "Status: Stopped");
            pMe->nPlayTime = 0;
		}
		break;
	case AEE_SOUNDPLAYER_AUDIO_SPEC:
		DisplayOutput (pMe, "Status: Playing");
		pMe->nPlayTime = 0;
		break;
	case AEE_SOUNDPLAYER_REWIND:
		pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
		SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime); 
		DisplayOutput (pMe, szBuf);
		DisplayOutput (pMe, "Status: Rewind done");
		break;
	case AEE_SOUNDPLAYER_FFORWARD:
		pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
		SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime); 
		DisplayOutput (pMe, szBuf);
		DisplayOutput (pMe, "Status: FFoward done");
		break;
	case AEE_SOUNDPLAYER_PAUSE:
		pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
		SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime); 
		DisplayOutput (pMe, szBuf);
		DisplayOutput (pMe, "Status: Paused");
		break;
	case AEE_SOUNDPLAYER_RESUME:
		pMe->nPlayTime = pData ? pData->dwElapsedTime/1000 : 0;
		SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime); 
		DisplayOutput (pMe, szBuf);
		DisplayOutput (pMe, "Status: Resumed");
		break;
	case AEE_SOUNDPLAYER_TEMPO:
		DisplayOutput (pMe, "SetTempo: Success");
		break;
	case AEE_SOUNDPLAYER_TUNE:
		DisplayOutput (pMe, "SetTune: Success");
		break;
	case AEE_SOUNDPLAYER_TICK_UPDATE:
		pMe->nPlayTime++;
		SPRINTF (szBuf, "Play Time: %i", pMe->nPlayTime); 
		DisplayOutput (pMe, szBuf);
		break;
	case AEE_SOUNDPLAYER_FAILURE:
		STRCPY(szBuf, "Player: failure");
        DisplayOutput (pMe, szBuf);
		break;
	case AEE_SOUNDPLAYER_ABORTED:
		pMe->nPlayTime = 0;
		break;
	default:
		DisplayOutput (pMe, "Player: Unknown status");
		break;
   }*/
}

//==========================================
// 此函数用于画进度条的背景色
//
//  每次播放歌曲之前 和 播放完成后 调
//==========================================
void draw_back_rect(mysoundplayer* pMe)
{
RGBVAL clrFrame;
RGBVAL clrFill;

	clrFrame = MAKE_RGB(0,255,0);
	clrFill = MAKE_RGB(0,255,0);

	IDISPLAY_DrawRect(pMe->pIDisplay,&pMe->total_rect,clrFrame,clrFill,IDF_RECT_FRAME|IDF_RECT_FILL);
	IDISPLAY_Update(pMe->pIDisplay); 
}

//==========================================
// 此函数用于画进度条的变化情况
//
//  播放过程中,每一秒钟调一次
//==========================================

void DrawPlayStatus(mysoundplayer* pMe)
{
RGBVAL clrFrame;
RGBVAL clrFill;
//AECHAR buffer[5]={0};   
//int   cur,nRem;

	pMe->rect.dx = pMe->PlayTime * (pMe->total_rect.dx-2) / pMe->TotalTime  ;   
 
//	cur = pMe->rect.dx *100 / pMe->total_rect.dx  ;
	
//	nRem = sizeof(buffer) / sizeof(AECHAR);
//	WWRITELONGEX(buffer,cur,-1,&nRem);
//	DBGPRINTF("the current cur is %d", cur);

	clrFill = MAKE_RGB(255,0,0);
	IDISPLAY_DrawRect(pMe->pIDisplay,&pMe->rect,clrFrame,clrFill,IDF_RECT_FILL);
 
//	显示进度条的百分比
//	IDISPLAY_SetColor(pMe->pIDisplay,CLR_USER_TEXT,MAKE_RGB(255,255,255));
//	IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,
//		buffer,-1,0,pMe->rect.y,NULL,
//				IDF_ALIGN_CENTER |IDF_TEXT_TRANSPARENT );

	IDISPLAY_Update(pMe->pIDisplay);
}

//===============================================
boolean my_init_menu(mysoundplayer* pMe)
{
	int i;
      AECHAR      *szBuf;
        char *   szName;

	AEERect rect;			//定义菜单显示的区域
	rect.x = MENU_RECT_X;
	rect.y = MENU_RECT_Y;
	rect.dx = MENU_RECT_CX;	//全屏显示菜单
	rect.dy = MENU_RECT_CY;

	ISHELL_CreateInstance(pMe->pIShell,AEECLSID_MENUCTL,&pMe->pIMenuCtl);	//创建菜单实例
      szBuf = MALLOC(MAX_FILE_NAME * sizeof(AECHAR));
i=0;
	while(i< pMe->NumFiles)
	{

		szName = get_file_name(pMe->m_szFileArray[i]);

        STRTOWSTR(szName, szBuf, MAX_FILE_NAME);
		//-------使用IMENUCTL_AddItem()函数添加1个不带图标的菜单----------------
		IMENUCTL_AddItem(pMe->pIMenuCtl,0,0,MY_MENU_ID_M1+i,szBuf,0);
		i++;
	}

	IMENUCTL_EnableCommand(pMe->pIMenuCtl,TRUE);
	IMENUCTL_SetRect(pMe->pIMenuCtl,&rect);
	IMENUCTL_SetActive(pMe->pIMenuCtl,TRUE);
    return TRUE;
 
}

void get_file_list(mysoundplayer* pMe)
{
 IFileMgr *  pIFileMgr;
 uint16      file_no = 0;
 FileInfo    fi;
     
 if (ISHELL_CreateInstance(pMe->pIShell, AEECLSID_FILEMGR, (void **)&pIFileMgr))
  {
     return;
  }

      IFILEMGR_EnumInit(pIFileMgr, MP_MEDIA_DIR, FALSE);
      while (file_no < MP_MAX_FILES  && IFILEMGR_EnumNext(pIFileMgr, &fi))
      {
         char *   szName;

//         szName = get_file_name(fi.szName);
         STRCPY(pMe->m_szFileArray[file_no] , fi.szName);

         file_no++;
      }

      pMe->NumFiles = file_no;
   
      IFILEMGR_Release(pIFileMgr);
	  pIFileMgr = NULL;

 
}


/*===========================================================================
   This function returns the file name portion of the path.
===========================================================================*/
static char * get_file_name(const char * psz)
{
   char *   pszName = STRRCHR(psz, (int)DIRECTORY_CHAR);

   if (pszName)
      pszName++;
   else
      pszName = (char *)psz;

   return pszName;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -