UI_PSF_play.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002                            C   M O D U L E   F I L E
00003 
00004     Copyright (c) 2003 Neuros Audio LLC, All rights reserved.
00005 
00006 ******************************************************************************/
00007 
00060 /*-- HEADER FILE INCLUDES ---------------------------------------------------*/
00061 #include "../SYSTEM/sys_main.h"
00062 #include "../SYSTEM/sys_clock.h"
00063 #include "../SYSTEM/sys_param.h"
00064 #include "../SYSTEM/sys_hardware.h"
00065 #include "../SYSTEM/sys_hiddenfeature.h"
00066 #include "../AUDIO/audio.h"
00067 #include "../DECODER/decoder.h"
00068 #include "../ear/ear.h"
00069 #include "../FMXMIT/xmit_inc.h"         
00070 #include "ui.h"
00071 #include "ui_assert.h"
00072 #include "xim.h"
00073 #include "playQ.h"
00074 #include "m3u.h"
00075 
00076 /*-- LOCAL DEFINITIONS ------------------------------------------------------*/
00077 static PARENT_STATE _startPlay(MSG_DATA, BOOL);
00078 static BOOL _setupPlay(ULONG, st_PLAYQ *);
00079 static void _stopPlay(void);
00080 static void _setupPlayMenu(st_PLAYQ *);
00081 static void _updatePlayTime(void);
00082 static PARENT_STATE _prevNextMusic(int);
00083 static void _displayMyfiChannel(void);
00084 static PARENT_STATE _ximAction(UINT);
00085 static PARENT_STATE _stateEnd(void);
00086 static void _add2mymix(void);
00087 static BOOL _playFromMymix(void);
00088 
00089 static void _linkitGUIon(BOOL);
00090 static void _updateLinkitDisplay(USHORT, HMENU);
00091 
00092 static void _abInit(void);
00093 static void _abReset(ULONG);
00094 static void _abCheck(void);
00095 
00096 #define F_PLAY_FROMDB       0x0001
00097 #define F_PLAY_PAUSED       0x0002
00098 
00099 #define PLAY_isFromDb()     (playFlag &   F_PLAY_FROMDB)
00100 #define PLAY_fromDb()       {playFlag |=  F_PLAY_FROMDB;}
00101 #define PLAY_notFromDb()    {playFlag &= ~F_PLAY_FROMDB;}
00102 
00103 #define PLAY_wasPaused()        (playFlag &   F_PLAY_PAUSED)
00104 #define PLAY_setPaused()        {playFlag |=  F_PLAY_PAUSED;}
00105 #define PLAY_unsetPaused()  {playFlag &= ~F_PLAY_PAUSED;}
00106 
00107 /*-- STATIC DATA ------------------------------------------------------------*/
00108 static HMENU            menu = INVALID_MENU_HDL;
00109 static int              playFlag;
00110 
00111 /*-- GLOBAL DATA ------------------------------------------------------------*/
00114 PLAY_SRC                playSource;
00115 
00116 /*-- FUNCTIONS --------------------------------------------------------------*/
00117 #pragma CODE_SECTION(UI_PSF_play, ".play_code")
00126 PARENT_STATE UI_PSF_play( st_MSG * msgIN )
00127 {   
00128     MSG_ID          id = msgIN->id;     
00129     MSG_DATA        d1 = msgIN->d1; 
00130     MSG_DATA        d2 = msgIN->d2;
00131     
00132     switch(id)
00133     {
00134     case SYS_MSG_ID:
00135         
00136         switch(d1)
00137         {
00138             case SSTATE_START:
00139             {
00140                 SYS_clockSetup(CLOCK_PLAY);
00141                 if(SYS_HF_linkit())
00142                 {
00143                     AUDIO_initInterface(AM_ILINK, AF_ILINK, 0, 0);
00144                     AUDIO_setInterface(AI_START);
00145                     SYS_audioNotPaused();
00146                     _linkitGUIon(TRUE);
00147                     return P_PLAY;
00148                 }
00149                 
00150                 #ifdef DJ_SUPPORT
00151                 _abInit();
00152                 #endif
00153                 return _startPlay(d2, TRUE);
00154             }
00155             case SSTATE_END:
00156             {
00157                 if(SYS_HF_linkit())
00158                 {
00159                     _stopPlay();
00160                     return P_NULL;
00161                 }
00162                 return(_stateEnd());
00163             }
00164             case SSTARTRADIO: 
00165                 _stopPlay();
00166                 return P_RADIO;
00167                 
00168             case SRESUMEPLAY:
00169             case SENDOFMENU:
00170             {
00171                 if(MENU_isValid(menu) == FALSE )
00172                 {
00173                     _setupPlayMenu(UI_playQcurrent());
00174                     menu = mMENU_create((void*)&MENU_buf[0]);
00175                     _displayMyfiChannel();
00176                     if(SYS_isAudioPaused()) 
00177                     {
00178                         mMENU_update(menu, 5, (ULONG)graf_icon_pause, FALSE);
00179                     }
00180                     else                    
00181                     {
00182                         mMENU_update(menu, 5, (ULONG)graf_icon_play, FALSE);
00183                     }
00184                     _updatePlayTime();
00185                 }
00186                 return P_PLAY;          
00187             }
00188             case SPRESET:
00189             {
00190                 if(SYS_isPresetable())
00191                 {
00192                     ULONG fptr;
00193 //DeepB
00194 // Bugzilla #213
00195 // Only get file pointer while paused
00196                     if (SYS_isAudioPaused())
00197                         fptr = AUDIO_getFilePtr();
00198                     else
00199                         fptr = 0;
00200                     UI_presetAudio(d2, UI_presetDbId(0),
00201                                     UI_playQcurrent()->actvTrack, 
00202                                     UI_presetFldEntry(0),
00203                                     UI_presetFldIdx(0), 
00204                                     fptr);
00205                     switch(UI_presetFldIdx(0))
00206                     {
00207                         case 1:  UI_msgbxCreate(MSGBX_PLAYLIST_PRESETDONE); break;
00208                         case 2:  UI_msgbxCreate(MSGBX_ARTIST_PRESETDONE);   break;
00209                         case 3:  UI_msgbxCreate(MSGBX_ALBUM_PRESETDONE);    break;
00210                         case 4:  UI_msgbxCreate(MSGBX_GENRE_PRESETDONE);    break;
00211                         case 5:  UI_msgbxCreate(MSGBX_RECORDING_PRESETDONE);break;
00212                         default: UI_msgbxCreate(MSGBX_SONGS_PRESETDONE);    break;
00213                     }
00214                 }
00215                 return P_PLAY;
00216             }
00217             case SAUDIOTIME_UPDT:
00218             {
00219                 #ifdef DJ_SUPPORT
00220                 _abCheck();
00221                 #endif
00222                 _updatePlayTime();
00223                 return P_PLAY;
00224             }
00225             case SENDOFMUSIC:
00226             {
00227                 #ifdef DJ_SUPPORT
00228                 if( (Ui.abMode)&&(2 == Ui.abStart) ) return _prevNextMusic(0);
00229                 #endif
00230                 DECODER_cacheDepthReset(1);
00231                 return _prevNextMusic(1);
00232             }
00233             case SPLAYQCHANGED: 
00234             {
00235                 #ifdef M3U_SUPPORT
00236                 if( UI_getPlaySource() != PLAY_FROM_PLAYQ )
00237                 {
00238                     st_PLAYQ * q = UI_playQcurrent();
00239                     
00240                     UI_presetAudio(0, 0x1234, 1, DONTCARE, DONTCARE, 0);
00241                             
00242                     DB_LOCK(SYS_FOREVER);
00243                     UI_m3uPut(0, q->fname, q->artist, q->title, q->album, q->genre, q->duration, q->size);
00244                     *UI_m3uActvItemPtr(0) = 2;
00245                     UI_m3uChgOrder(0, 0);
00246                     DB_UNLOCK();
00247                     UI_playQreset(0x1234);
00248                     return P_PLAY;
00249                 }
00250                 #endif
00251             }
00252             case SMYMIXCHANGED:
00253             {
00254                 if(FALSE == UI_playQreset(d2))
00255                 {
00256                     // No playable contents.
00257                     _stopPlay();
00258                     UI_msgbxCreate(MSGBX_CONTENTSNA);
00259                     return P_NULL;
00260                 }
00261                 return P_PLAY;
00262             }
00263             case SSHUFFLECHANGED:
00264             {
00265                 UI_playQreset(DONTCARE);
00266                 return P_PLAY;
00267             }
00268             case SMIFIQUALITYCHANGED:
00269             {
00270                 AUDIO_resetMyfiQuality();
00271                 return P_PLAY;
00272             }
00273             case SMIFIMODECHANGED:
00274             {
00275                 // Check new myfi mode.
00276                 if( ((sysParam.myfiMode == 1) // off.
00277                     &&(AUDIO_isMyfiActive())) ||
00278 //DeepB
00279                     ((sysParam.myfiMode == 2) // on
00280                     && (!AUDIO_isMyfiActive())) ||
00281 //Auto detectar
00282                     ((sysParam.myfiMode == 3) // auto-detect.
00283                     &&((AUDIO_isMyfiActive()) == (SYS_isHPpresent()))) )
00284                 {
00285                     // Restart.
00286                     UI_presetAudio(0, UI_presetDbId(0),
00287                             UI_playQcurrent()->actvTrack, 
00288                             UI_presetFldEntry(0),
00289                             UI_presetFldIdx(0), 
00290                             AUDIO_getFilePtr());
00291                     _stopPlay();
00292                     return _startPlay(0, FALSE);
00293                 }
00294                 break;
00295             }
00296             case SMYFICHANNELCHANGED:
00297             {
00298                 _displayMyfiChannel();
00299                 return P_PLAY;
00300             }
00301             case SXIM_EXIT: 
00302             {
00303                 return(_ximAction(d2));
00304             }
00305             case SMSGBOX_EXIT:
00306             {
00307                 if(MENU_curMsgbx() == MSGBX_CONTENTSNA)
00308                 {
00309                     return P_NULL;
00310                 }
00311                 else if(MENU_curMsgbx() == MSGBX_REMOVEQRECORD)
00312                 {
00313                     if(BTN_YES == d2)
00314                     {
00315                         _stateEnd();
00316                         UI_m3uRemove(0, UI_playQcurrent()->actvTrack);
00317                         // Start next track from the very beginning.
00318                         nandSysParam.preset[0].share.audio.fptr = 0L;
00319                         return _startPlay(0, TRUE);                                     
00320                     }
00321                     else return P_PLAY;
00322                 }
00323                 else if(MENU_curMsgbx() == MSGBX_DELETERECORD)
00324                 {
00325                     D2PEAR_ID   earID;
00326                     st_PLAYQ *  q = UI_playQcurrent();
00327                     
00328                     if( BTN_CANCEL == d2 ) return P_PLAY;
00329                     
00330                     if( (BTN_NEUROS == d2)||(BTN_PCDELETE == d2) )
00331                     {
00332                         _stateEnd();
00333                         FAT_delete(q->fname);
00334                         switch(UI_getPlaySource())
00335                         {
00336                             case PLAY_FROM_IDEDHISI:
00337                                 DB_deleteRecordByMdb(DBnav.idedhisi, q->mdb);
00338                                 break;
00339                             case PLAY_FROM_FAILEDHISI:
00340                                 DB_deleteRecordByMdb(DBnav.failedhisi, q->mdb);
00341                                 break;
00342                             case PLAY_FROM_AUDIODB:
00343                                 DB_deleteRecordByMdb(DBnav.audio, q->mdb);
00344                                 UI_audioPresetUpdate(-1);
00345                                 break;
00346                             default: SYS_die(UI_PSF_PLAY);
00347                         }     
00348                     }
00349                     
00350                     earID = (BTN_NEUROS == d2)? DELETE_NEUROS_AUDIO: DELETE_PC_AUDIO;
00351                     
00352                     if(SYS_isHDDpresent())
00353                     {
00354                         UI_earPut(strDISKC, earID,(PEAR_DATA)q->fname,strlen(q->fname)+1, 0);
00355                         SYS_NAND_DBMOD_2HDD_PENDING();
00356                     }
00357                     else
00358                     {
00359                         UI_earPut(strDISKD, earID,(PEAR_DATA)q->fname,strlen(q->fname)+1, 0);
00360                         SYS_NAND_CONTENTS_CHANGED();
00361                     }   
00362                     // Start next track from the very beginning.
00363                     nandSysParam.preset[0].share.audio.fptr = 0L;
00364                     return _startPlay(0, TRUE);                                     
00365                 }
00366                 else if(MENU_curMsgbx() == MSGBX_DELETERECORDFILE)
00367                 {
00368                     if(BTN_YES == d2)
00369                     {
00370                         st_PLAYQ *  q = UI_playQcurrent();
00371                         _stateEnd();
00372                         FAT_delete(q->fname);
00373                         UI_updateMembar();
00374                         return P_NULL;
00375                     }
00376                 }
00377                 else if(MENU_curMsgbx() == MSGBX_DELETEHISICLIP)
00378                 {
00379                     if(BTN_YES == d2)
00380                     {
00381                         st_PLAYQ *  q = UI_playQcurrent();
00382                         
00383                         _stateEnd();
00384                         FAT_delete(q->fname);
00385                         if(UI_getPlaySource() == PLAY_FROM_UNIDEDHISI)
00386                         {
00387                             DB_deleteRecordByMdb(DBnav.unidedhisi, q->mdb);
00388                             UI_earPut(SYS_isHDDpresent()? strDISKC:strDISKD,
00389                                         HISI_DELETE_UNIDED_CLIP,(PEAR_DATA)q->fname, strlen(q->fname)+1, 0);
00390                             
00391                             if(SYS_isHDDpresent())
00392                             {
00393                                 SYS_NAND_DBMOD_2HDD_PENDING();
00394                             }
00395                             else
00396                             {
00397                                 SYS_NAND_CONTENTS_CHANGED();
00398                             }
00399                         }
00400                         return P_NULL;
00401                     }
00402                 }
00403                 return P_PLAY;
00404             }
00405             case SCURRENTAUDIOFILE:
00406             {
00407                 AUDIO_setCurrentTrack();
00408                 return P_PLAY;
00409             }
00410             case SNEXTAUDIOFILE:
00411             {
00412                 AUDIO_getCacheTrackFile(d2);
00413                 return P_PLAY;
00414             }
00415         }   
00416         break;
00417     
00418     case TMR_MSG_ID:
00419         switch(d1)
00420         {
00421             case TTXTSCROLL: 
00422                 mMENU_action(menu, MENU_TXTSCROLL);
00423                 return P_PLAY;
00424         }
00425         break;
00426         
00427     case KBD_MSG_ID:
00428         switch(d1)
00429         {
00430             case KEY_BACK:
00431                 if(SYS_HF_linkit())
00432                 {
00433                     _stopPlay();
00434                     return P_NULL;
00435                 }
00436                 
00437                 if(!PLAY_isFromDb())
00438                 { 
00439                     _stopPlay();
00440                     return (SYS_wasFromHisi())? P_HISIDONE:P_RECORDDONE;
00441                 }
00442                 mMENU_action(menu, MENU_CLOSE);
00443                 // Auto resume play window.
00444                 SYS_autoResumePlayEnable();
00445                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, SBROWSE, DONTCARE, SYS_FOREVER);
00446                 return P_PLAY;
00447             
00448             case KEY_HREWIND:
00449                 if(SYS_HF_myfiTest())
00450                 {
00451                     //sysParam.myfiChannel = 911;
00452                     sysParam.myfiChannel = 875;
00453                     _updateLinkitDisplay(sysParam.myfiChannel, menu);
00454                     XMIT_SetFreq(XMIT_SET, (MAX_CHANNEL-sysParam.myfiChannel)/2);
00455                 }
00456             case KEY_RREWIND:
00457                 if(SYS_HF_linkit()) return P_PLAY;
00458                 DECODER_frwd();
00459                 return P_PLAY;
00460                 
00461             case KEY_REWIND:    
00462                 if(SYS_HF_linkit()) return P_PLAY;
00463                 DECODER_cacheDepthReset(0);
00464                 #ifdef DJ_SUPPORT
00465                 if(Ui.abStart == 2)
00466                 {
00467                     AUDIO_setFilePtr(Ui.aPtr);
00468                     return P_PLAY;
00469                 }
00470                 #endif
00471 //DeepB
00472 // To previous song
00473 // if on first 5 seconds
00474 // of non-paused song
00475                 if((Audio.playtime < 5) && !(SYS_isAudioPaused())) return _prevNextMusic(-1);
00476                 else return _prevNextMusic(0);          
00477                     
00478             case KEY_FORWARD:           
00479                 if(SYS_HF_linkit()) return P_PLAY;
00480                 DECODER_cacheDepthReset(0);
00481                 #ifdef DJ_SUPPORT
00482                 if(Ui.abStart == 2) 
00483                 {
00484                     AUDIO_setFilePtr(Ui.aPtr);
00485                     return P_PLAY;
00486                 }
00487                 #endif
00488                 return _prevNextMusic(1);
00489                 
00490             case KEY_HFORWARD:
00491                 if(SYS_HF_myfiTest())
00492                 {
00493                     //sysParam.myfiChannel = 1049;
00494                     sysParam.myfiChannel = 1041;
00495                     _updateLinkitDisplay(sysParam.myfiChannel, menu);
00496                     XMIT_SetFreq(XMIT_SET, (MAX_CHANNEL-sysParam.myfiChannel)/2);
00497                 }
00498             case KEY_RFORWARD:
00499                 if(SYS_HF_linkit()) return P_PLAY;
00500                 DECODER_ffwd();
00501                 return P_PLAY;  
00502                 
00503             case KEY_PLAY:
00504                 
00505                 SYS_toggleAudioPaused();
00506                 if(SYS_isAudioPaused()) 
00507                 {
00508                     PLAY_setPaused();
00509                     AUDIO_setInterface(AI_PAUSE);
00510                     if(SYS_HF_linkit()) 
00511                         mMENU_update(menu, 7, (ULONG)text_tunermuted, FALSE);
00512                     else
00513                         mMENU_update(menu, 5, (ULONG)graf_icon_pause, FALSE);
00514                 }
00515                 else
00516                 {
00517                     PLAY_unsetPaused();
00518                     AUDIO_setInterface(AI_START);
00519                     AUDIO_setInterface(AI_UNMUTE);
00520                     if(SYS_HF_linkit()) 
00521                         mMENU_update(menu, 7, (ULONG)text_null, FALSE); 
00522                     else
00523                         mMENU_update(menu, 5, (ULONG)graf_icon_play, FALSE);
00524                 }
00525                 mMENU_refresh(menu);
00526                 return P_PLAY;
00527                 
00528             case KEY_HUP:
00529             case KEY_UP:
00530             case KEY_RUP:
00531                 if(SYS_HF_linkit())
00532                 {
00533                     if(sysParam.myfiChannel < MAX_CHANNEL) 
00534                     {
00535                         sysParam.myfiChannel+=sysParam.x_granularity;
00536                         _updateLinkitDisplay(sysParam.myfiChannel, menu);
00537                         XMIT_SetFreq(XMIT_SET, (MAX_CHANNEL-sysParam.myfiChannel)/2);
00538                     }
00539                     return P_PLAY;
00540                 }
00541             case KEY_HDOWN:
00542             case KEY_DOWN:
00543             case KEY_RDOWN:
00544                 if(SYS_HF_linkit())
00545                 {
00546                     if(sysParam.myfiChannel > MIN_CHANNEL)
00547                     { 
00548                         sysParam.myfiChannel-=sysParam.x_granularity;
00549                         _updateLinkitDisplay(sysParam.myfiChannel, menu);
00550                         XMIT_SetFreq(XMIT_SET, (MAX_CHANNEL-sysParam.myfiChannel)/2);
00551                     }
00552                     return P_PLAY;
00553                 }           
00554                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, (AM_MYFI == Audio.mode)?
00555                             SMYFICHANNELWIN_CREATE:SVOLWIN_CREATE, DONTCARE, SYS_FOREVER);
00556                 return P_PLAY;
00557                 
00558             case KEY_SELECT:
00559             {
00560                 int ximPtr;
00561 
00562                 if(SYS_HF_linkit()) return P_PLAY;
00563                 SYS_autoResumePlayEnable();
00564                 
00565                 if(PLAY_FROM_PLAYQ == UI_getPlaySource())
00566                 {
00567                     ximPtr = (AM_MYFI == Audio.mode)? XIMWIN_PLAYER_MYFIQ:XIMWIN_PLAYERQ;
00568                 }
00569                 else
00570                 {
00571                     ximPtr = (AM_MYFI == Audio.mode)? XIMWIN_PLAYER_MYFI:XIMWIN_PLAYER;
00572                     
00573                     if(PLAY_FROM_AUDIODB == UI_getPlaySource())                     
00574                     {
00575                         if(FALSE == _playFromMymix())
00576                         {
00577                             ximPtr = (AM_MYFI == Audio.mode)? 
00578                                 XIMWIN_PLAYER_MYFI_ADD2MYMIX:XIMWIN_PLAYER_ADD2MYMIX;
00579                         }
00580                     }                   
00581                 }
00582                 
00583                 mMSG_send(uiChildMsgQ, SYS_MSG_ID, SXIM_CREATE, ximPtr, SYS_FOREVER);
00584                 return P_PLAY;
00585             }
00586         }
00587         break;
00588     }
00589     
00590     return P_PLAY;
00591 }
00592 
00593 
00594 #pragma CODE_SECTION (_add2mymix, ".play_code")
00595 static void _add2mymix(void)
00596 {
00597     char mymix[8];
00598     int  pri;
00599     st_PLAYQ *  q = UI_playQcurrent();
00600 
00601     DB_LOCK(SYS_FOREVER);
00602     pri = SYS_SETPRI(SYS_BGDPRI);
00603     SYS_kbdDisabled();
00604     SYS_setBusy();
00605     
00606     GEN_readXdata((ULONG)mymixRecord, (USHORT*)mymix, 8);
00607 
00608     // Currently it is hard coded that playlist has to be second 
00609     // child of Audio DB. Ideally a string compare shall be done
00610     // to locate position of playlist key.
00611     
00612     // Query audio mdb if from play queue.
00613     if(PLAY_FROM_PLAYQ == UI_getPlaySource())
00614     {
00615         q->mdb = DB_getMdbByRecord(DBnav.audio, (const unsigned short *)q->title);
00616     }
00617     
00618     if(FALSE == DB_add2child(q->mdb, DB_childID(DBnav.audio, 1), (DB_DATA *)mymix))
00619     {
00620         //SYS_die(UI_SF_DBMENU_ADD2MYMIX);
00621     }
00622     else
00623     {           
00624         if(FALSE == UI_earPut(SYS_isHDDpresent()? strDISKC:strDISKD,
00625                 ADD_NEUROS_AUDIO_2Q,(PEAR_DATA)q->fname, strlen((const char*)q->fname)+1, 0))
00626         {
00627             UI_msgbxCreate(MSGBX_DISKFULL);
00628         }
00629             
00630         UI_audioPresetUpdate(1);
00631     }
00632         
00633     DB_UNLOCK();
00634     SYS_clearBusy();
00635     SYS_SETPRI(pri);
00636         
00637 //DeepB
00638 // I hate those messages
00639 //  UI_msgbxCreate(MSGBX_ADD2MYMIXDONE);
00640     
00641         
00642     if(SYS_isHDDpresent())
00643     { 
00644         SYS_NAND_DBMOD_2HDD_PENDING();
00645     }
00646     else
00647     {
00648         SYS_NAND_CONTENTS_CHANGED();
00649     }
00650     SYS_kbdEnabled();
00651 }
00652 
00653 #pragma CODE_SECTION (_playFromMymix, ".play_code")
00654 static BOOL _playFromMymix( void )
00655 {
00656     const char * mymix;
00657 
00658     if(UI_getPlayQGbl()->flag&F_PLAYQGBL_FROMPLAYLIST)
00659     {
00660         mymix = (const char *)UI_getPlayQGbl()->playlist;
00661         
00662         if(mymix[0] == ( ('!'<<8)|'M') )
00663         {
00664             if(mymix[1] == ( ('y'<<8)|' ') )
00665             {
00666                 if(mymix[2] == ( ('M'<<8)|'i') )
00667                 {   
00668                     if(mymix[3] == ( ('x'<<8)| 0) )
00669                     {
00670                         if(mymix[4] == 0) return TRUE;
00671                     }
00672                 }
00673             }
00674         }
00675     }   
00676     return FALSE;
00677 }
00678 
00679 #pragma CODE_SECTION(_stateEnd, ".decoder_code")
00680 // Function completely shuts down the play state.
00681 static PARENT_STATE _stateEnd(void)
00682 {
00683     // Always sets preset controls, which are used by the
00684     // play interface, in case play is resumed from 
00685     // delete operation etc.
00686     UI_presetAudio(0, UI_presetDbId(0),
00687                     UI_playQcurrent()->actvTrack, 
00688                     UI_presetFldEntry(0),
00689                     UI_presetFldIdx(0), 
00690                     AUDIO_getFilePtr());
00691     
00692     // Break the checksum if preset is not desirable.
00693     if( (!SYS_isPresetable())&&(PRESET_PLAYQ != UI_presetType(0)) )
00694     {
00695         SYS_breakPreset(0);
00696     }
00697     _stopPlay();
00698     if(!PLAY_isFromDb())
00699     {   
00700         return (SYS_wasFromHisi())? P_HISIDONE:P_RECORDDONE;
00701     }
00702     return P_NULL;
00703 }
00704 
00705 #pragma CODE_SECTION(_setupPlay, ".decoder_code")
00706 // Function sets up the player to play.
00707 static BOOL _setupPlay(ULONG offset, st_PLAYQ * playQ)
00708 {
00709     AUDIO_MODE  mode;
00710 
00711     if(NULL == playQ) return FALSE;
00712     
00713 //DeepB
00714     if(SYS_isMyFiOff()||((sysParam.myfiMode == 3)&&(SYS_isHPpresent())))    mode = AM_PLAY;
00715     else                                    mode = AM_MYFI;
00716     
00717     if(FALSE == AUDIO_initInterface(mode,
00718                         playQ->format, 
00719                         offset,
00720                         playQ->duration))
00721     {
00722         return FALSE;
00723     }                               
00724     AUDIO_setInterface(AI_START);
00725     #ifdef DJ_SUPPORT
00726     _abReset(Audio.file.size);
00727     #endif
00728 
00729     SYS_audioNotPaused();
00730     SYS_playActive();
00731     return TRUE;
00732 }
00733 
00734 #pragma CODE_SECTION(_stopPlay, ".decoder_code")
00735 // Function stops the playback.
00736 static void _stopPlay(void)
00737 {
00738     SYS_autoResumePlayDisable();
00739     mMENU_action(menu, MENU_CLOSE); 
00740     AUDIO_setInterface(AI_SHUTDOWN);
00741     if(SYS_HF_linkit())
00742     {
00743         SYS_HF_linkitDisable();
00744         SYS_HF_myfiTestDisable();
00745     }
00746     else UI_playQshutdown();
00747     mMENU_statusBar(STBAR_SYSIDLE, NULL);
00748 }
00749 
00750 //#pragma CODE_SECTION(_startPlay, ".play_code")
00751 #pragma CODE_SECTION(_startPlay, ".decoder_code")
00752 // Function sets to start the playback.
00753 static PARENT_STATE _startPlay(MSG_DATA d2, BOOL createMenu)
00754 {
00755     ULONG           startFptr;
00756     st_PLAYQ *      playQ;
00757     
00758     SYS_notPresetable();
00759     PLAY_fromDb();
00760     
00761     DECODER_cacheDepthReset(0);
00762                 
00763     // if d2 == DONTCARE, play from record or hisi.
00764     // else play from audio/hisi DB. 
00765     if(DONTCARE == d2)
00766     {
00767         playQ = UI_setupPlayQ( DB_INVALID_ID,0,0,0);                    
00768         startFptr= 0;
00769         PLAY_notFromDb();
00770     }
00771     else
00772     {   
00773         playQ = UI_setupPlayQ(  UI_presetDbId(d2),      // DB ID
00774                                 UI_presetFldIdx(d2),    // DB fldIdx
00775                                 UI_presetFldEntry(d2),  // DB fldEntry
00776                                 UI_presetDbEntry(d2));  // DB entry.
00777         startFptr = UI_presetFptr(d2);
00778         if( PRESET_PLAYQ != UI_presetType(0) )
00779         {
00780             if(DB_rootID(UI_presetDbId(d2)) == DBnav.audio) 
00781             {
00782                 SYS_presetable();
00783                 if( NULL == playQ )
00784                 {
00785                     SYS_breakPreset(d2);
00786                     if(0 == d2)
00787                     {
00788                         // Try play all before reporting error.
00789                         playQ = UI_setupPlayQ(DBnav.audio,-1,0,1);
00790                         startFptr = 0L;
00791                     }
00792                 }
00793             }
00794         }
00795     }
00796                 
00797     do
00798     {
00799         if(TRUE == _setupPlay(startFptr,playQ)) break;
00800         else
00801         {
00802             playQ = UI_playQnext();
00803             startFptr = 0;
00804         }
00805     }while(playQ);
00806                 
00807     // Nothing playable?
00808     if(NULL == playQ) 
00809     {
00810         UI_msgbxCreate(MSGBX_CONTENTSNA);
00811         return P_PLAY;                  
00812     }
00813     
00814     if(TRUE == createMenu)
00815     {
00816         _setupPlayMenu(playQ);
00817         menu = mMENU_create((void*)&MENU_buf[0]);
00818         _displayMyfiChannel();
00819     }
00820                     
00821     if(SYS_isPresetable())
00822     {
00823         UI_presetAudio(0, UI_presetDbId(d2),
00824                         UI_presetDbEntry(d2), 
00825                         UI_presetFldEntry(d2),
00826                         UI_presetFldIdx(d2), 
00827                         Audio.fptr);
00828         SYS_breakPreset(0);
00829     }
00830                 
00831     return P_PLAY;
00832 }
00833 
00834 #pragma CODE_SECTION(_prevNextMusic, ".decoder_code")
00835 // Function checks to bring up previous/next track.
00836 static PARENT_STATE _prevNextMusic(int prev)
00837 {
00838     st_PLAYQ * playQ;
00839     ULONG      dptr = 0L;
00840     
00841     AUDIO_setInterface(AI_STOP);
00842     
00843     do
00844     {
00845         if(-1 == prev )     playQ = UI_playQprevious();
00846         else if( 1 == prev) playQ = UI_playQnext();
00847         else
00848         {
00849             #ifdef DJ_SUPPORT
00850             if( (2 == Ui.abStart)&&(Ui.abMode) ) dptr = Ui.aPtr;
00851             #endif
00852             playQ = UI_playQcurrent();
00853         }
00854         
00855         if(NULL == playQ) break;
00856         if(TRUE == _setupPlay(dptr, playQ)) break;
00857     } while(playQ);
00858     
00859     if(NULL == playQ)
00860     {
00861         PARENT_STATE ret = P_NULL;
00862         
00863         _stopPlay();
00864         if(!PLAY_isFromDb())
00865         {
00866             ret = SYS_wasFromHisi()? P_HISIDONE:P_RECORDDONE;   
00867         }       
00868         return ret;
00869     }
00870     
00871     if(MENU_isValid(menu) == TRUE )
00872     {
00873         mMENU_action(menu, MENU_CLOSE); 
00874         _setupPlayMenu(playQ);
00875         menu = mMENU_create((void*)&MENU_buf[0]);
00876         _displayMyfiChannel();
00877     }
00878 
00879     return P_PLAY;
00880 }
00881 
00882 #pragma CODE_SECTION(_setupPlayMenu, ".decoder_code")
00883 // Function sets up player display.
00884 static void _setupPlayMenu(st_PLAYQ * playQ)
00885 {
00886     int * pD = (int *)&MENU_buf[0];
00887 
00888     *pD++ = DP_PLAYER;
00889 
00890     // pData structure.
00891     // 0,1:     artist display data pointer.
00892     // 2,3:     title display data pointer.
00893     // 4,5:     album display data pointer.
00894     // 6,7:     bps display data pointer.
00895     // 8,9:     genre/playlist display data pointer.
00896     // 10,11:   total time in seconds.
00897     // 12:      repeat control.
00898     // 13:      shuffle mode control.
00899     // 14:      media format.
00900     if ( (sysParam.x_layout == XTRA_TITLE_BOLD) )
00901     {
00902         *pD++ = 0;
00903         *pD++ = (int)playQ->title;
00904         
00905         *pD++ = 0;
00906         *pD++ = (int)playQ->artist;
00907     }
00908     else
00909     {
00910         *pD++ = 0;
00911         *pD++ = (int)playQ->artist;
00912         
00913         *pD++ = 0;
00914         *pD++ = (int)playQ->title;
00915     }
00916     *pD++ = 0;
00917     *pD++ = (int)playQ->album;
00918 
00919     *pD++ = 0;
00920     *pD++ = 0;
00921 
00922     *pD++ = 0;
00923     *pD++ = (UI_getPlayQGbl()->flag&F_PLAYQGBL_FROMPLAYLIST)?
00924             (int)UI_getPlayQGbl()->playlist:(int)playQ->genre;
00925 
00926     if(playQ->duration > 0)
00927     {
00928         *pD++ = (int)(playQ->duration>>16);
00929         *pD++ = (int)(playQ->duration&0x0ffff);
00930     }
00931     else
00932     {
00933         // default to 3:40.
00934         *pD++ = 0;
00935         *pD++ = 220;
00936     }
00937     
00938     *pD++ = sysParam.repeat;
00939     *pD++ = sysParam.shuffle;
00940     
00941     *pD++ = (int)playQ->format;
00942     #ifdef DJ_SUPPORT
00943     *pD++ = (int)Ui.abStart;
00944     #endif
00945     // Update myfi icon display.
00946     mMENU_statusBar(STBAR_SYSIDLE, NULL);
00947 }
00948 
00949 #pragma CODE_SECTION(_updatePlayTime, ".decoder_code")
00950 // Function updates play time display.
00951 static void _updatePlayTime(void)
00952 {
00953     st_PLAYMENU *   pPlay;
00954     char            strTime[16];
00955     ULONG           curTime = SYS_getCurPlayTime();
00956 
00957     GEN_createTimeString(curTime, strTime);         
00958     mMENU_update(menu, 6, (ULONG)strTime, FALSE);
00959                 
00960     // Reposition value bar.
00961     pPlay = (st_PLAYMENU*)mMENU_getObj(menu);
00962     if(pPlay) mMENU_vbarReposition(pPlay->vbar, curTime);
00963                 
00964     mMENU_refresh(menu);
00965 }
00966 
00967 #pragma CODE_SECTION(_displayMyfiChannel, ".decoder_code")
00968 // Function displays the active FM out channel.
00969 static void _displayMyfiChannel(void)
00970 {
00971     ULONG           dptr = (ULONG)text_null;
00972     char            strStation[15];
00973     char *          pC = &strStation[0];
00974     
00975     if(AM_MYFI == Audio.mode)
00976     {
00977         /* Station to string. */
00978         pC += GEN_int2ASCII(sysParam.myfiChannel, strStation, FALSE, 0);
00979         
00980         /* Insert '.' */
00981         *pC     = *(pC-1);
00982         *(pC-1) = '.';
00983         pC++;
00984         *pC++ = 'M';
00985         *pC++ = 'H';
00986         *pC++ = 'z';
00987         *pC   = 0;
00988         dptr  = (ULONG)strStation;
00989     }
00990     mMENU_update(menu, 9, dptr, FALSE);
00991     mMENU_refresh(menu);
00992 }
00993 
00994 
00995 #pragma CODE_SECTION(_ximAction, ".decoder_code")
00996 // Function handles various DB XIMs.
00997 static PARENT_STATE _ximAction(UINT ximID)
00998 {
00999     XIM_ACTTYPE         actType;
01000     XIM_ACTID           actID;
01001     
01002     actType = (XIM_ACTTYPE)((ximID & 0xC000)>>14);          
01003     actID = (XIM_ACTID)(ximID & 0x3FFF);
01004     
01005     #ifdef DJ_SUPPORT
01006     SYS_autoResumePlayDisable();
01007     #endif
01008     
01009     switch( actType ) 
01010     {
01011     case XIM_ACT_DEV:   /* Device completed actions. */
01012         actID = (XIM_ACTID)(actID | XIM_DEV_IDMASK);
01013         switch( actID ) 
01014         {
01015         #ifdef DJ_SUPPORT
01016         case XIM_DEV_DJ:
01017             mMENU_action(menu, MENU_CLOSE); 
01018             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_DJ);
01019             break;
01020         #endif
01021         
01022         case XIM_DEV_SHUFFLE:
01023             mMENU_action(menu, MENU_CLOSE); 
01024             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_SHUFFLE);
01025             break;
01026             
01027         case XIM_DEV_FMOUT:
01028             mMENU_action(menu, MENU_CLOSE); 
01029             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_MYFI_MODE);
01030             break;
01031             
01032         case XIM_DEV_REPEAT:        
01033             mMENU_action(menu, MENU_CLOSE); 
01034             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_REPEAT);
01035             break;
01036 
01037         case XIM_DEV_EQ:
01038             mMENU_action(menu, MENU_CLOSE); 
01039             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_EQ);
01040             break;
01041             
01042         case XIM_DEV_MYFIGAIN:
01043             mMENU_action(menu, MENU_CLOSE); 
01044             UI_menuBrowse(SENDOFMENU, DONTCARE, MENU_MYFI_GAIN);
01045             break;
01046             
01047         case XIM_DEV_DELETE:
01048             switch(UI_getPlaySource())
01049             {
01050             case PLAY_FROM_RECORD_DONE:
01051                 UI_msgbxCreate(MSGBX_DELETERECORDFILE);         
01052                 break;
01053                 
01054             case PLAY_FROM_HISI_DONE:           
01055             case PLAY_FROM_UNIDEDHISI:
01056                 UI_msgbxCreate(MSGBX_DELETEHISICLIP);
01057                 break;
01058             
01059             case PLAY_FROM_IDEDHISI:            
01060             case PLAY_FROM_FAILEDHISI:          
01061             case PLAY_FROM_AUDIODB:         
01062                 UI_msgbxCreate(MSGBX_DELETERECORD);
01063                 break;
01064             }
01065             break;
01066         
01067         case XIM_DEV_ADD2QUEUE:
01068             _add2mymix();
01069             break;
01070                 
01071         case XIM_DEV_REMOVE:
01072             UI_msgbxCreate(MSGBX_REMOVEQRECORD);    
01073             break;
01074             
01075         case XIM_DEV_STOP_PLAY: 
01076             return(_stateEnd());
01077             
01078         default:
01079             #ifndef DJ_SUPPORT
01080             SYS_autoResumePlayDisable();
01081             #endif
01082             break;
01083         }
01084         break;
01085     }
01086     
01087     // All defaults to simply close XIM and do nothing.
01088     return P_PLAY;
01089 }
01090 
01091 
01092 #pragma CODE_SECTION (_linkitGUIon, ".decoder_code")
01093 // Function controls the linkIt MyFi GUI.
01094 static void _linkitGUIon(BOOL on)
01095 {
01096     if(FALSE == on)
01097     {
01098         mMENU_action(menu, MENU_CLOSE); 
01099         TMR_delete(TMR_FRWD_DOUBLECLICK);
01100         TMR_delete(TMR_TUNERSEEK);          
01101     }
01102     else
01103     {
01104         if(MENU_isValid(menu) == FALSE )
01105         {
01106             MENU_buf[0] = DP_LINKIT;
01107             menu = mMENU_create((void*)&MENU_buf[0]);
01108         }
01109         if(SYS_isAudioPaused())     
01110         {
01111             mMENU_update(menu, 7, (ULONG)text_tunermuted, FALSE);
01112         }
01113         else        
01114         {
01115             mMENU_update(menu, 7, (ULONG)text_null, FALSE);
01116         }   
01117 
01118         _updateLinkitDisplay(sysParam.myfiChannel, menu);
01119         mMENU_refresh(menu);
01120     }
01121 }
01122 
01123 #pragma CODE_SECTION (_updateLinkitDisplay, ".decoder_code")
01124 // Function updates linkIt MyFi display.
01125 // 
01126 // station: FM channel in 100KHz.
01127 // menu:    menu handle.
01128 static void _updateLinkitDisplay(USHORT station, HMENU menu)
01129 {
01130     char            strStation[6];
01131     int             ii;
01132 
01133     ii = GEN_int2ASCII(station, strStation, FALSE, 0);
01134     
01135     // Insert '.'
01136     strStation[ii+1] = 0;
01137     strStation[ii] = strStation[ii-1];
01138     strStation[ii-1] = '.';
01139     
01140     mMENU_update(menu, 3, (ULONG)strStation, FALSE);    
01141     mMENU_refresh(menu);
01142 }
01143 
01144 #ifdef DJ_SUPPORT
01145 #pragma CODE_SECTION (_abInit, ".decoder_code")
01146 // Function initializes AB repeat controls.
01147 static void _abInit(void)
01148 {
01149     Ui.abMode = 0; // Disabled.
01150     Ui.abStart= 0; // Not started.
01151 }
01152 
01153 #pragma CODE_SECTION (_abReset, ".decoder_code")
01154 // Function resets AB repeat controls upon track start.
01155 static void _abReset(ULONG len)
01156 {
01157     if(2 == Ui.abStart ) return;
01158     
01159     Ui.aPtr = 0;
01160     Ui.bPtr = 0;
01161     Ui.abPtr= 0;
01162     Ui.abStep = 0;
01163     Ui.abLen= len;
01164 }
01165 
01166 #pragma CODE_SECTION (_abCheck, ".decoder_code")
01167 // Function checks to support AB repeat.
01168 static void _abCheck(void)
01169 {
01170     if(Ui.abStart == 2)
01171     {
01172         if(AUDIO_getFilePtr() >= Ui.bPtr)
01173         {
01174             AUDIO_setFilePtr(Ui.aPtr);
01175         }   
01176     }
01177 }
01178 #endif
01179 
01180 /*****************************************************************************
01181                 Neuros Audio LLC. Confidential Proprietary
01182  *****************************************************************************/

Generated on Wed Jan 19 01:12:45 2005 for neuros-firmware by  doxygen 1.3.9.1