📄 mmisounds_v1.c
字号:
parameter - optional data.
*******************************************************************************/
void melody_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data;
T_MELODY_INFO * data = (T_MELODY_INFO *)win_data->user;
UBYTE i;
UBYTE numberOfMelodies;
ListWinInfo * mnu_data = (ListWinInfo *)parameter;
TRACE_FUNCTION (">>>>> melody_exec_cb()");
switch (event)
{
case E_INIT:
TRACE_EVENT(">>>> melody_exec_cb() Event:E_INIT");
/* initialization of administrative data */
data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData));
if(data->menu_list_data == 0)
{
TRACE_EVENT("Failed memory alloc 1 ");
return;
}
numberOfMelodies = resource_GetListCount(RES_MELODY);
data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( numberOfMelodies * sizeof(T_MFW_MNU_ITEM) );
if(data->menu_list_data->List == 0)
{
TRACE_EVENT("Failed memory alloc 2");
return;
}
for (i = 0; i < numberOfMelodies ; i++)
{
data->menu_list_data->List[i].icon = 0;
data->menu_list_data->List[i].exta = 0;
data->menu_list_data->List[i].edit = 0;
data->menu_list_data->List[i].menu = 0;
data->menu_list_data->List[i].func = NULL;
data->menu_list_data->List[i].str = (char *)MelodyTable[i];
data->menu_list_data->List[i].flagFunc = item_flag_none;
}
data->menu_list_data->ListLength =numberOfMelodies;
data->menu_list_data->ListPosition = 1;
data->menu_list_data->CursorPosition = 1;
data->menu_list_data->SnapshotSize = numberOfMelodies;
data->menu_list_data->Font = 0;
data->menu_list_data->LeftSoftKey = TxtSoftSelect;
data->menu_list_data->RightSoftKey = TxtSoftBack;
data->menu_list_data->KeyEvents = KEY_ALL;
data->menu_list_data->Reason = 0;
data->menu_list_data->Strings = TRUE;
data->menu_list_data->Attr = &melody_menuAttrib;
data->menu_list_data->autoDestroy = FALSE;
listDisplayListMenu(win, data->menu_list_data,(ListCbFunc)MelodyList_cb,0);
case E_START_MELODY:
// User has scrolled the Melody list, stop old melody and start playing new melody.
// stopPlayingMelody();
//delayThenPlayMelody();
// startPlayingMelody(mnu_data->MenuData.ListPosition);
startPlayingMelody(mnu_data->MenuData.ListPosition);
break;
case E_RETURN:
//stop playing the melody stopPlayingMelody();
break;
default:
break;
}
}
/*******************************************************************************
$Function: MelodyList_cb
$Description: Callback function for the melody list.
$Returns: none
$Arguments: Parent - parent window.
ListData - Menu item list
*******************************************************************************/
void MelodyList_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
T_MFW_WIN * win_data = ((T_MFW_HDR *)Parent)->data;
T_MELODY_INFO * data = (T_MELODY_INFO *)win_data->user;
T_MFW_HND * l_parent;
if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR)
|| (ListData->Reason EQ LISTS_REASON_HANGUP)) // sbh - added hangup key
{
l_parent = data->parent;
}
else if(ListData->Reason EQ LISTS_REASON_SELECT)
{
// current.ringer = menu_Select( &dynamenu );
switch(soundReason)
{
case MelodySelect:
stopPlayingMelody();
current.ringer = ListData->ListPosition;
break;
case SettingSMSTone:
stopPlayingMelody();
current.SMSTone = ListData->ListPosition;
break;
case SettingAlarm:
// need to check alarm status MZ.
current.AlarmOn = ListData->ListPosition;
default:
break;
}
// Store selected melody in PCM storage.
}
stopPlayingMelody();
listsDestroy(ListData->win);
melody_destroy(data->sounds_win);
}
/*******************************************************************************
$Function: melody_destroy
$Description: Destroy the melody window.
$Returns: none
$Arguments: own_window- current window
*******************************************************************************/
static void melody_destroy(MfwHnd own_window)
{
T_MFW_WIN * win_data;
T_MELODY_INFO * data;
UBYTE numberOfMelodies;
TRACE_FUNCTION ("melody_destroy()");
if (own_window)
{
win_data = ((T_MFW_HDR *)own_window)->data;
data = (T_MELODY_INFO *)win_data->user;
if (data)
{
/*
* Delete WIN handler
*/
win_delete (data->sounds_win);
/*
* Free Memory
*/
numberOfMelodies = resource_GetListCount(RES_MELODY);
if (data->menu_list_data != NULL)
{
FREE_MEMORY ((void *)data->menu_list_data->List, numberOfMelodies * sizeof (T_MFW_MNU_ITEM));
FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData));
}
FREE_MEMORY ((void *)data, sizeof (T_MELODY_INFO));
}
else
{
TRACE_EVENT ("melody_destroy() called twice");
}
}
}
/*******************************************************************************
$Function: melody_win_cb
$Description: Window callback function for the melody window.
$Returns: none
$Arguments: w - mfw window handler
e - mfw event
*******************************************************************************/
static int melody_win_cb (MfwEvt e, MfwWin *w) /* yyy window event handler */
{
TRACE_FUNCTION ("melody_win_cb()");
switch (e)
{
case MfwWinVisible: /* window is visible */
break;
case MfwWinFocussed: /* input focus / selected */
case MfwWinDelete: /* window will be deleted */
default:
return MFW_EVENT_REJECTED;
}
return MFW_EVENT_CONSUMED;
}
/*******************************************************************************
$Function: melody_menu_cb
$Description: Call back function for the melody menu.
$Returns:
$Arguments:
*******************************************************************************/
static int melody_menu_cb (MfwEvt e, MfwMnu *m){
T_MFW_HND win = mfwParent(mfw_header());
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
// T_call_menu * data = (T_call_menu *)win_data->user;
switch (e)
{
case E_MNU_ESCAPE:
//call_menu_destroy(win);
//call_data.win_menu = 0;
break;
default:
return 0;
}
return 1;
}
/*******************************************************************************
$Function: resource_GetListCount
$Description: Returns the number of entries in resource table.
$Returns: Number of entries in Melody table.
$Arguments: res - Resource Id.
*******************************************************************************/
int resource_GetListCount(res_ResourceID_type res)
// Returns the number of the resource type available in the phone.
{
int index=0;
switch (res)
{
case RES_MELODY:
// if (this_res.melody_table)
// result = this_res.melody_table->count;
while(MelodyTable[index] !=0)
index++;
return index;
break;
case RES_LANGUAGE:
break;
case RES_STRING:
break;
default:
break;
}
return index;
}
/*******************************************************************************
$Function: buildOnOffMenu
$Description: builds an on/off menu and associates it with a context
$Returns: None
$Arguments: count, number of elements in menu
id3, prompt string
active, context into which the menu should be associated
*******************************************************************************/
static void buildOnOffMenu( int count, int id3, int active )
{
}
/*******************************************************************************
$Function: buildVolumeMenu
$Description: builds the volume menu and associates it with the volume
context
$Returns: None
$Arguments: volume, the context to be associated with
*******************************************************************************/
static void buildVolumeMenu( VOL_ENUM volume )
{
}
/*******************************************************************************
$Function: displayDynaMenu
$Description: show one page of the ringer list, determined by item.
$Returns: None
$Arguments: None
*******************************************************************************/
static void displayDynamenu( void )
{
}
/*******************************************************************************
$Function: displayRingerVolume
$Description: shows the volume setting determined by cVolume
$Returns: None
$Arguments: None
*******************************************************************************/
static void displayRingerVolume( void )
{
}
/*******************************************************************************
$Function: displayOnOffList
$Description: show the On Off (3rd) list, determined by item.
$Returns: None
$Arguments: None
*******************************************************************************/
static void displayOnOffList( void )
{
}
/*******************************************************************************
$Function: buildLanguageMenu
$Description: builds the dynamenu for the RES_LANGUAGE resource type
$Returns: None
$Arguments: None
*******************************************************************************/
static void buildLanguageMenu(void)
{
}
/*******************************************************************************
$Function: delayThenPlayMelody
$Description: play selected ringer melody after short delay
$Returns: None
$Arguments: None
*******************************************************************************/
static void delayThenPlayMelody( void )
{
/* start timer for half a second and on timeout start everlasting play
*/
timStart( hRingerStartTimer );
}
/*******************************************************************************
$Function: playCurrentSound
$Description: play tune which is temporarily selected, this event handler
is invoked when the hRingerStartTimer event completes
$Returns: MFW_EVENT_CONSUMED always
$Arguments: e, event, tc timer context
*******************************************************************************/
static int playCurrentSound( MfwEvt e, MfwTim *tc )
{
soundsPlayRinger(current.ringer);
// stop running timer (One shot mode only)
if (hRingerStartTimer != NULL ) {
timStop(hRingerStartTimer);
}
return MFW_EVENT_CONSUMED;
}
/*******************************************************************************
$Function: setSelection
$Description: reactivates calling menu after confirming setting
$Returns: MFW_EVENT_PASSED always
$Arguments: e, event, m, window handle
*******************************************************************************/
static int setSelection( MfwEvt e, MfwWin *m )
{
int UpdatePCM = 0;
int SoundToPlay = -1;
TRACE_FUNCTION("setSelection");
/* This implements a state machine, the next setting depends
on the reason we have been invoked
Note the following is still pending implementation
USSD TONE, SVC TONE, MANPLMN TONE
*/
switch (soundReason)
{
case MelodySelect:
{
// stopPlayingMelody();
// current.ringer = menu_Select( &dynamenu );
// UpdatePCM = 1;
}
break;
case SettingVolume:
{
// stopPlayingMelody();
// current.volumeSetting = menu_Select( &volume_menu );
// UpdatePCM = 1;
}
break;
default:
{
/* No action required
*/
}
break;
}
/* Update the PCM if we need to
*/
//nm if ( UpdatePCM )
//nm writeSettingsToPCM( NO_FLUSH );
/* And play the requested sound if we need to
*/
//nm if ( SoundToPlay != -1 )
//nm audio_PlaySoundID ( AUDIO_BUZZER, SoundToPlay, 0, AUDIO_PLAY_ONCE );
/* redisplay sub menu showing changed position of active marker.
*/
winShow( win );
//JVJE soundExec( SoundsDone, 0 );
return MFW_EVENT_PASSED;
}
/*******************************************************************************
$Function: writeSettingsToPCM
$Description: writes contents of global vars of sounds to PCM or
sets default values
$Returns: None
$Arguments: flush, dictates whether or not flushing should be
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -