FreeCalypso > hg > freecalypso-citrine
diff g23m-glue/gdi/audio.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m-glue/gdi/audio.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,2219 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS +| Modul : DRV_AUDIO ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This Module defines the audio driver interface. +| for the G23 protocol stack. +| +| This driver is used to control all audio and audio-related +| devices of the mobile such as speaker, microphone, etc. +| A device, e.g. a speaker, may have the capability to play +| sounds and/or melodies indirectly. This means a sound +| generator may be attached to a speaker or its amplifier. +| The format of the sound/melody images is implementation +| dependent and therefore not in the scope of the generic +| driver interface. Therefore a application may play pre- +| defined, driver specific sounds identifying them via a +| sound ID. In addition the API of this driver has foreseen +| that an application may copy a sound image into its local +| buffer, modify it and let it play by the driver. In this +| case the application has to have the knowledge about the +| sound image format. ++----------------------------------------------------------------------------- +| History : +| Apr 04, 2005 REF: ENH 30063 xdeepadh +| Description: Buzzer removal activity for Locosto MMI +| Fix:All the Buzzer related calls are under the compilation flag FF_BUZZER. +| The GSM tones which were playing in the buzzer are now routed to the speaker(Audio). ++----------------------------------------------------------------------------- + $History: + + + xpradipg - GSM-ENH-32494 : 23 June 2005 + Description: Support for various audio profiles + Solution: The support for audio device's carkit/headset/loudspeaker/handheld. + The audio device is enabled as per the user actions. + + June 13, 2005 REF : GSM_ENH_32062 - xpradipg + Description:The audio uplink not working in the connected call + Solution: The audio uplink was configured to mute state at initialization + The configuration is changed to be in unmute state + + Apr 26, 2005 REF : CRR 30627 xpradipg + Bug : Replace the ABB APIs with Audio Service APIs + Fix : The ABB APIs are used in muting/unmuting and setting the volume of + the speaker and microphone. These ABB APIs are replaced with the + audio serivce APIs +******************************************************************************/ + +#ifndef DRV_AUDIO_C +#define DRV_AUDIO_C +#endif +#define ENTITY_CST + +#include "config.h" +#include "fixedconf.h" +#include "condat-features.h" + +/* +in order to stay backwardcompatible this riv_audio define is entered as only +ti15++ version do have the riveria frame it needs to be disabled for the rest +*/ + +#if 0 //defined (ALR) +#define RIV_AUDIO 1 +#else +#undef RIV_AUDIO +#endif + +#if defined (_SIMULATION_) +#define _TTY_SIMU +#endif + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "vsi.h" +#include "custom.h" +#ifdef ALR + #include "p_mphc.h" +#elif defined(FF_GTI) + /* GTI*/ + /* do nothing */ +#else + #include "p_mph5.h" +#endif /* ALR, FF_GTI */ +#include "prim.h" +#include "gsm.h" +#include "tok.h" +#include "../cst/cst.h" +#include "../cst/cus_cst.h" +#include "gdi.h" +#include "audio.h" + +#if defined (RIV_AUDIO) + +/* #include "bt_general.h" */ +#include "rv/rv_general.h" +#if /*!defined (_TTY_SIMU) &&*/ defined (FF_TTY) +#include "tty/tty_api.h" +#endif +#include "audio/audio_api.h" + +#elif AUDIO_TASK + +#define BOOL_FLAG +#define CHAR_FLAG +#include "../../L1/include/l1_confg.h" +#include "../../L1/include/l1_types.h" +#include "../../L1/audio_cust0/l1audio_cust.h" +#include "../../L1/audio_include/l1audio_msgty.h" +#include "../../L1/audio_include/l1audio_signa.h" + +#endif + +/*==== DEFINE =====================================================*/ + +#define AUDIO_TRC_EVENT(_f_)\ + vsi_o_ttrace(VSI_CALLER TC_EVENT, _f_) +#define AUDIO_TRC_EVENT_P1(_f_, _p_)\ + vsi_o_ttrace(VSI_CALLER TC_EVENT, _f_, _p_) +#define AUDIO_TRC_EVENT_P2(_f_, _p1_, _p2_)\ + vsi_o_ttrace(VSI_CALLER TC_EVENT, _f_, _p1_, _p2_) +#define AUDIO_TRC_FUNC(_f_)\ + vsi_o_ttrace(VSI_CALLER TC_FUNC, _f_) +#define AUDIO_TRC_FUNC_P1(_f_, _p_)\ + vsi_o_ttrace(VSI_CALLER TC_FUNC, _f_, _p_) + +/*==== EXPORT =====================================================*/ + +#if defined (NEW_FRAME) +#define CST_AUDIOTIMER 2 +#endif + +/*==== VARIABLES ==================================================*/ + +#if defined (RIV_AUDIO) +static T_AUDIO_KEYBEEP_PARAMETER beep; +static T_AUDIO_TONES_PARAMETER t; +#endif + +drv_SignalCB_Type audio_signal_callback = NULL; +#if !defined (NEW_FRAME) +T_VSI_THANDLE audio_handle = VSI_ERROR; +#endif +T_ACT_TONE act_tone; +UBYTE act_speakerVolume; +UBYTE act_micVolume; +UBYTE act_buzVolume; +UBYTE act_speakerMute; +UBYTE act_micMute; + +#if defined (NEW_FRAME) +EXTERN T_HANDLE hCommL1; +#else +EXTERN T_VSI_CHANDLE hCommL1; +#endif + +#if defined (RIV_AUDIO) +void audio_riv_audio_cb (void*); + +static T_RV_RETURN_PATH const riv_audio_rp = +{ + 0, audio_riv_audio_cb +}; + +#ifdef FF_TTY +T_AUDIO_TTY_CONFIG_PARAMETER static tty_cfg; +UBYTE static tty_state = FALSE; +UBYTE static tty_cmd = (UBYTE)TTY_OFF; + + +char const * const audio_mode_names_tty[] = { + "default", + "tty_vco", + "tty_hco", + "tty_all" +}; +#endif +#endif + +UBYTE audio_is_free = TRUE; /* variable for disable no muting */ + +/*==== FUNCTIONS ==================================================*/ + +#if 1 //defined (_TMS470) + +#if CONFIG_BUZZER +EXTERN void BZ_Init (void); +EXTERN void BZ_Enable (void); +EXTERN void BZ_Disable (void); +EXTERN void BZ_Tone (int f); +EXTERN void BZ_Volume (int v); +#endif + +#ifdef ALR +EXTERN void ABB_DlVolume (UBYTE v); +EXTERN void ABB_DlMute (UBYTE mute); +EXTERN void ABB_UlMute (UBYTE value); +EXTERN void ABB_SideTone (UBYTE v); +/*#include "l1audio_abb.h" does not work: there's no definition of types UWORDx */ +#else +EXTERN void VG_UlVolume (UBYTE v); +EXTERN void VG_DlVolume (UBYTE v); +EXTERN void VG_DlMute (UBYTE mute); +EXTERN void VG_SideTone (UBYTE v); +#endif + +#else + +LOCAL void BZ_Init (void); +LOCAL void BZ_Enable (void); +LOCAL void BZ_Disable (void); +LOCAL void BZ_Tone (int f); +LOCAL void BZ_Volume (int v); + +#ifdef ALR +LOCAL void ABB_DlVolume (UBYTE v); +LOCAL void ABB_DlMute (UBYTE mute); +LOCAL void ABB_UlMute (UBYTE value); +LOCAL void ABB_SideTone (UBYTE v); +#else +LOCAL void VG_UlVolume (UBYTE v); +LOCAL void VG_DlVolume (UBYTE v); +LOCAL void VG_DlMute (UBYTE mute); +LOCAL void VG_SideTone (UBYTE v); +#endif + +#endif +LOCAL void audio_buzzer (void); +LOCAL void audio_audio (void); +LOCAL void audio_UlMute (UBYTE mute); + +#if defined (RIV_AUDIO) AND !defined (_TTY_SIMU) AND defined (FF_TTY) +LOCAL void audio_tty_return (void *tty_result); +LOCAL void audio_save_def_return (void *result); +LOCAL void audio_load_return (void *result); +LOCAL void audio_dyn_load_return (void *result); +#endif + +// xpradipg - GSM-ENH-32494 : 23 June 2005 +#ifdef FF_MMI_AUDIO_PROFILE +typedef struct +{ + int status; +}T_AUDIO_MODE_LOAD_DONE; +EXTERN T_AUDIO_RET audio_mode_load (T_AUDIO_MODE_LOAD *p_parameter, T_RV_RETURN_PATH return_path); +#endif +/*==== CONSTANTS ==================================================*/ + +#define BUZZER 0 +#define AUDIO 1 +// Apr 26, 2005 REF : CRR 30627 xpradipg +#ifdef FF_MMI_SERVICES_MIGRATION +#define AUDIO_SIDE_TONE 175 +#endif + +#if defined (RIV_AUDIO) + +#define TDMA_12 12 +#define TDMA_23 23 +#define TDMA_43 43 +#define TDMA_71 71 +#define TDMA_108 108 +#define TDMA_130 130 +#define TDMA_216 216 +#define TDMA_650 650 +#define TDMA_866 866 + +/* +* with the original table spec (USHORT for Freq. and Ampl.), +* we can go down to -31 dB only. Obviously this is sufficient +* for all currently defined sounds. +*/ +#define F_425 (( 425 << 5) + 7) /* (( 242 << 8 ) + 35) */ +#define F_697 (( 697 << 5) + 7) /* (( 219 << 8 ) + 56) */ +#define F_770 (( 770 << 5) + 7) /* (( 211 << 8 ) + 61) */ +#define F_852 (( 852 << 5) + 7) /* (( 201 << 8 ) + 67) */ +#define F_941 (( 941 << 5) + 7) /* (( 189 << 8 ) + 73) */ +#define F_1209 ((1209 << 5) + 5) /* (( 149 << 8 ) + 111) */ +#define F_1336 ((1336 << 5) + 5) /* (( 128 << 8 ) + 118) */ +#define F_1477 ((1477 << 5) + 5) /* (( 102 << 8 ) + 125) */ +#define F_1633 ((1633 << 5) + 5) /* (( 73 << 8 ) + 130) */ + +#else /* (RIV_AUDIO) */ + +#if 1 //defined (_TMS470) + +/* + * unit is TDMA frames + */ +#define TDMA_12 12 +#define TDMA_23 23 +#define TDMA_43 43 +#define TDMA_71 71 +#define TDMA_108 108 +#define TDMA_130 130 +#define TDMA_216 216 +#define TDMA_650 650 +#define TDMA_866 866 + + +#define F_425 (( 242 << 8) + 35) +#define F_697 (( 219 << 8) + 56) +#define F_770 (( 211 << 8) + 61) +#define F_852 (( 201 << 8) + 67) +#define F_941 (( 189 << 8) + 73) +#define F_1209 (( 149 << 8) + 111) +#define F_1336 (( 128 << 8) + 118) +#define F_1477 (( 102 << 8) + 125) +#define F_1633 (( 73 << 8) + 130) + +#else + +/* + * unit is milliseconds + */ +#define TDMA_12 55 +#define TDMA_23 100 +#define TDMA_43 200 +#define TDMA_71 330 +#define TDMA_108 500 +#define TDMA_130 650 +#define TDMA_216 1000 +#define TDMA_650 3000 +#define TDMA_866 4000 + +#define F_425 (( 35 << 8) + 242) +#define F_697 (( 56 << 8) + 219) +#define F_770 (( 61 << 8) + 211) +#define F_852 (( 67 << 8) + 201) +#define F_941 (( 73 << 8) + 189) +#define F_1209 ((111 << 8) + 149) +#define F_1336 ((118 << 8) + 128) +#define F_1477 ((125 << 8) + 102) +#define F_1633 ((130 << 8) + 73) + +#endif + +#endif /* (RIV_AUDIO) */ + +#if 0 +extern const T_DESCR The_Ale_is_dear[111]; +extern const T_DESCR Danza_de_Astureses[21]; +extern const T_DESCR rising_chromatic[47]; +extern const T_DESCR rising_cscale[27]; +extern const T_DESCR MELODY_ONE[11]; +extern const T_DESCR MELODY_HELLO[23]; +extern const T_DESCR bugle[39]; +#endif + +/* + * Tone generation tables + */ +#if CONFIG_BUZZER +static const T_DESCR ct_ring [] = /* command 1 command 2 length */ + { 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 800, 0, TDMA_12, + 900, 0, TDMA_12, + 0, 0, TDMA_866, + 0xFFFF, 0xFFFF, 0 + }; +#else +static const T_DESCR ct_ring [] = /* command 1 command 2 length */ + { F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + F_770, 0, TDMA_12, + F_941, 0, TDMA_12, + 0, 0, TDMA_866, + 0xFFFF, 0xFFFF, 0 + }; +#endif + +#if CONFIG_BUZZER +static const T_DESCR ct_auth_num [] = /* command 1 command 2 length */ + { 950, 0, TDMA_71, + 1400, 0, TDMA_71, + 1800, 0, TDMA_71, + 0, 0, TDMA_216, + 0xFFFF, 0xFFFF, 0 + }; +#else +static const T_DESCR ct_auth_num [] = /* command 1 command 2 length */ + { F_941, 0, TDMA_71, + F_1477, 0, TDMA_71, + F_1633, 0, TDMA_71, + 0, 0, TDMA_216, + 0xFFFF, 0xFFFF, 0 + }; +#endif + +static const T_DESCR ct_busy [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_108, + 0, 0, TDMA_108, + F_425, 0, TDMA_108, + 0, 0, TDMA_108, + F_425, 0, TDMA_108, + 0, 0, TDMA_108, + F_425, 0, TDMA_108, + 0, 0, TDMA_108, + 0xFFFF, 0xFFFF, 0 + }; + +#if CONFIG_BUZZER +static const T_DESCR ct_congest [] = /* command 1 command 2 length */ + { 425, 0, TDMA_43, + 0, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dropped [] = /* command 1 command 2 length */ + { 425, 0, TDMA_43, + 0, 0, TDMA_43, + 425, 0, TDMA_43, + 0, 0, TDMA_43, + 425, 0, TDMA_43, + 0, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_ack [] = /* command 1 command 2 length */ + { 425, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; +#else +static const T_DESCR ct_congest [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_43, + 0, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dropped [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_43, + 0, 0, TDMA_43, + F_425, 0, TDMA_43, + 0, 0, TDMA_43, + F_425, 0, TDMA_43, + 0, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_ack [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; +#endif + +static const T_DESCR ct_cw [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_43, + 0, 0, TDMA_130, + F_425, 0, TDMA_43, + 0, 0, TDMA_650, + F_425, 0, TDMA_43, + 0, 0, TDMA_130, + F_425, 0, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_0 [] = /* command 1 command 2 length */ + { F_941, F_1336, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_1 [] = /* command 1 command 2 length */ + { F_697, F_1209, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_2 [] = /* command 1 command 2 length */ + { F_697, F_1336, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_3 [] = /* command 1 command 2 length */ + { F_697, F_1477, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_4 [] = /* command 1 command 2 length */ + { F_770, F_1209, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_5 [] = /* command 1 command 2 length */ + { F_770, F_1336, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_6 [] = /* command 1 command 2 length */ + { F_770, F_1477, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_7 [] = /* command 1 command 2 length */ + { F_852, F_1209, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_8 [] = /* command 1 command 2 length */ + { F_852, F_1336, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_9 [] = /* command 1 command 2 length */ + { F_852, F_1477, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_a [] = /* command 1 command 2 length */ + { F_697, F_1633, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_b [] = /* command 1 command 2 length */ + { F_770, F_1633, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; +static const T_DESCR ct_dtmf_c [] = /* command 1 command 2 length */ + { F_852, F_1633, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_d [] = /* command 1 command 2 length */ + { F_941, F_1633, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_s [] = /* command 1 command 2 length */ + { F_941, F_1209, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_dtmf_h [] = /* command 1 command 2 length */ + { F_941, F_1477, TDMA_23, + 0xFFFF, 0xFFFF, 0 + }; + +/* keybeep not used at the moment */ +static const T_DESCR ct_keybeep [] = /* command 1 command 2 length */ + { F_697, F_697, TDMA_43, + 0xFFFF, 0xFFFF, 0 + }; + +static const T_DESCR ct_ringing [] = /* command 1 command 2 length */ + { F_425, 0, TDMA_216, + 0, 0, TDMA_866, + 0xFFFF, 0xFFFF, 0 + }; + +/* + * Tone Type Table + */ +#if CONFIG_BUZZER +static const UBYTE TONE_TYPE [] = { BUZZER, /* ringing tone 0 */ + BUZZER, /* ringing tone 1 */ + BUZZER, /* ringing tone 2 */ + BUZZER, /* ringing tone 3 */ + BUZZER, /* ringing tone 4 */ + BUZZER, /* ringing tone 5 */ + BUZZER, /* ringing tone 6 */ + BUZZER, /* ringing tone 7 */ + BUZZER, /* ringing tone 8 */ + BUZZER, /* ringing tone 9 */ + BUZZER, /* ringing tone 10 */ + BUZZER, /* ringing tone 11 */ + BUZZER, /* ringing tone 12 */ + BUZZER, /* ringing tone 13 */ + BUZZER, /* ringing tone 14 */ + BUZZER, /* ringing tone 15 */ + BUZZER, /* error/special information */ + AUDIO, /* subscriber busy */ + BUZZER, /* congestion */ + BUZZER, /* call dropped */ + BUZZER, /* radio acknowledge */ + AUDIO, /* call waiting */ + AUDIO, /* DTMF digit 0 */ + AUDIO, /* DTMF digit 1 */ + AUDIO, /* DTMF digit 2 */ + AUDIO, /* DTMF digit 3 */ + AUDIO, /* DTMF digit 4 */ + AUDIO, /* DTMF digit 5 */ + AUDIO, /* DTMF digit 6 */ + AUDIO, /* DTMF digit 7 */ + AUDIO, /* DTMF digit 8 */ + AUDIO, /* DTMF digit 9 */ + AUDIO, /* DTMF digit A */ + AUDIO, /* DTMF digit B */ + AUDIO, /* DTMF digit C */ + AUDIO, /* DTMF digit D */ + AUDIO, /* DTMF digit * */ + AUDIO, /* DTMF digit # */ + AUDIO, /* keybeep */ + AUDIO /* ringing tone if NOIBT */ + }; +#endif + +//Apr 04, 2005 REF: ENH 30063 xdeepadh +/* + * Tone Description Table + This table will have the ringing tones and the gsm tones. + When the buzzer is not available, the ringing tones will be played with midi ringer + */ +static const T_DESCR * const TONE_DESCR [] = + { + ct_ring, /* ringing tone 0 */ + ct_ring, /* ringing tone 1 */ + ct_ring, /* ringing tone 2 */ + ct_ring, /* ringing tone 3 */ + ct_ring, /* ringing tone 4 */ + ct_ring, /* ringing tone 5 */ + ct_ring, /* ringing tone 6 */ + ct_ring, /* ringing tone 7 */ + ct_ring, /* ringing tone 8 */ + ct_ring, /* ringing tone 9 */ + ct_ring, /* ringing tone 10 */ + ct_ring, /* ringing tone 11 */ + ct_ring, /* ringing tone 12 */ + ct_ring, /* ringing tone 13 */ + ct_ring, /* ringing tone 14 */ + ct_ring, /* ringing tone 15 */ + ct_auth_num,/* error/special information */ + ct_busy, /* subscriber busy */ + ct_congest, /* congestion */ + ct_dropped, /* call dropped */ + ct_ack, /* radio acknowledge */ + ct_cw, /* call waiting */ + ct_dtmf_0, /* DTMF digit 0 */ + ct_dtmf_1, /* DTMF digit 1 */ + ct_dtmf_2, /* DTMF digit 2 */ + ct_dtmf_3, /* DTMF digit 3 */ + ct_dtmf_4, /* DTMF digit 4 */ + ct_dtmf_5, /* DTMF digit 5 */ + ct_dtmf_6, /* DTMF digit 6 */ + ct_dtmf_7, /* DTMF digit 7 */ + ct_dtmf_8, /* DTMF digit 8 */ + ct_dtmf_9, /* DTMF digit 9 */ + ct_dtmf_a, /* DTMF digit A */ + ct_dtmf_b, /* DTMF digit B */ + ct_dtmf_c, /* DTMF digit C */ + ct_dtmf_d, /* DTMF digit D */ + ct_dtmf_s, /* DTMF digit * */ + ct_dtmf_h, /* DTMF digit # */ + ct_keybeep, /* dummy for keybeep */ + ct_ringing /* ringing tone if NIBT */ + }; + + +/*==== CONSTANTS ==================================================*/ + + + +// xpradipg - GSM-ENH-32494 : 23 June 2005 +#ifdef FF_MMI_AUDIO_PROFILE +/******************************************************************************* + $Function: audio_mode_load_cb + + $Description: callback function for the auido_mode_load() + + $Returns: none + + $Arguments: status of the load operation + +*******************************************************************************/ +void audio_mode_load_cb(void *ret_param) +{ + + //if((T_AUDIO_MODE_LOAD_DONE *)ret_param->status != AUDIO_OK) + AUDIO_TRC_FUNC("ERROR Loading the audio profile"); +} + +/******************************************************************************* + $Function: audio_full_access_write_cb() + + $Description: callback function for the audio_full_access_write() + + $Returns: none + + $Arguments: status of the write operation + +*******************************************************************************/ +void audio_full_access_write_cb(void *ret_param) +{ +// if( (T_AUDIO_FULL_ACCESS_WRITE_DONE *)ret_param->status != AUDIO_OK) + AUDIO_TRC_FUNC ("ERROR setting the value"); +} +#if 0 +/******************************************************************************* + $Function: audio_speaker_volume_cb() + + $Description: callback function for the audio_speaker_volume() + + $Returns: none + + $Arguments: status of the speaker volume setting operation + +*******************************************************************************/ +void audio_speaker_volume_cb(ret_param) +{ + if((T_AUDIO_SPEAKER_VOLUME_DONE)ret_param->status != AUDIO_OK) + AUDIO_TRC_FUNC ("ERROR setting the volume"); +} +#endif +/******************************************************************************* + $Function: audio_set_device() + + $Description: initiates the audio_mode_load() for various devices + + $Returns: none + + $Arguments: successfull execution of the audio_mode_load operation + +*******************************************************************************/ +int audio_set_device(char* mode) +{ + T_RV_RETURN_PATH return_path = {0,audio_mode_load_cb}; + T_AUDIO_RET status; + T_AUDIO_MODE_LOAD p_parameter; + + strcpy((char*)p_parameter.audio_mode_filename,mode); + status = audio_mode_load(& p_parameter,return_path); + return status; + +} + +/******************************************************************************* + $Function: audio_set_path() + + $Description: sets the audio speaker path to the current audio device and also either to voice or + stereo + + $Returns: none + + $Arguments: + audioDevice - Indicates the device to which the path has to be set + stereo - If false the path is for voice + If true the path is for stereo +*******************************************************************************/ + +void audio_set_path(int audioDevice,int stereo) +{ + T_RV_RETURN_PATH return_path = {0,audio_full_access_write_cb}; + T_AUDIO_FULL_ACCESS_WRITE p_parameter; + int status; + if( stereo) + p_parameter.variable_indentifier = AUDIO_STEREO_SPEAKER_MODE; + else + p_parameter.variable_indentifier = AUDIO_SPEAKER_MODE; + p_parameter.data = (void*)&audioDevice; + status = audio_full_access_write(&p_parameter,return_path); + +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_Init | ++--------------------------------------------------------------------+ + + PURPOSE : The function initializes the driver's internal data. + The function returns DRV_OK in case of a successful + completition. The function returns DRV_INITIALIZED if + the driver has already been initialized and is ready to + be used or is already in use. In case of an initialization + failure, which means the that the driver cannot be used, + the function returns DRV_INITFAILURE. + +*/ +// xpradipg - GSM-ENH-32494 : 23 June 2005 +// the interface for the audio profiles has changed, it accepts an array of +// type T_ACCESSORY_CALLBACK +#ifdef FF_MMI_AUDIO_PROFILE +GLOBAL UBYTE audio_Init(T_ACCESSORY_CALLBACK *audioConfig) +#else +GLOBAL UBYTE audio_Init (drv_SignalCB_Type in_SignalCBPtr) +#endif +{ +// Apr 26, 2005 REF : CRR 30627 xpradipg +// local variable declarations +#ifdef FF_MMI_SERVICES_MIGRATION + T_AUDIO_FULL_ACCESS_WRITE side_tone_cfg; + T_RV_RETURN_PATH return_path = {0, NULL}; + T_AUDIO_RET result; + INT8 side_tone = AUDIO_SIDE_TONE; +#endif +// xpradipg - GSM-ENH-32494 : 23 June 2005 +#ifdef FF_MMI_AUDIO_PROFILE +T_AUDIO_RET status; +T_AUDIO_MODE_LOAD handheld= {"handheld"}; +#endif + +// xpradipg - GSM-ENH-32494 : 23 June 2005 +// the callback functions for the headset and carkit indication are registered +// and the defualt mode handheld is loaded +#ifdef FF_MMI_AUDIO_PROFILE +#if 0 + status = audio_accessory_register_notification(audioConfig[CALLBACK_HEADSET],AUDIO_ACCESSORY_HEADSET); + if( status != AUDIO_OK) + { + AUDIO_TRC_FUNC("Error - registering the callback for headset"); + } + + status = audio_accessory_register_notification(audioConfig[CALLBACK_CARKIT],AUDIO_ACCESSORY_CARKIT); + if(status != AUDIO_OK) + { + AUDIO_TRC_FUNC("Error - registering the callback for carkit"); + } +#endif + return_path.callback_func = audio_mode_load_cb; + status = audio_mode_load(&handheld, return_path); + if (status != AUDIO_OK) + { + AUDIO_TRC_FUNC("Error - loading the handheld profile"); + } +#else + audio_signal_callback = in_SignalCBPtr; /* store call-back function */ +#endif + +#if !defined (NEW_FRAME) + audio_handle = vsi_t_open (VSI_CALLER "AUDIO"); + + if (audio_handle < VSI_OK) + return DRV_INITFAILURE; +#endif +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//For Buzzer init +#if CONFIG_BUZZER + BZ_Init (); /* initialize buzzer */ +#endif + audio_SetMute ( AUDIO_SPEAKER, AUDIO_MUTING_OFF ); + audio_SetMute ( AUDIO_MICROPHONE, AUDIO_MUTING_OFF ); + + audio_SetAmplf ( AUDIO_SPEAKER, 175 ); + audio_SetAmplf ( AUDIO_MICROPHONE, 75 ); +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//Set volume for Buzzer +#if CONFIG_BUZZER + audio_SetAmplf ( AUDIO_BUZZER, 175 ); +#endif + +/* Setting the Side Tone has been moved from audio_SetAmplf CQ21055*/ +#ifdef ALR + #ifdef FF_TTY + if (!tty_state) + #endif + { +// Apr 26, 2005 REF : CRR 30627 xpradipg +// set the sidetone value to 175 this is the optimum value +#ifdef FF_MMI_SERVICES_MIGRATION + side_tone_cfg.variable_indentifier = AUDIO_MICROPHONE_SPEAKER_LOOP_SIDETONE; + side_tone_cfg.data = (void*)&side_tone; + result = audio_full_access_write(&side_tone_cfg, return_path); +#else + ABB_SideTone (175); +#endif + } +#else + VG_SideTone (175); +#endif + + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_Exit | ++--------------------------------------------------------------------+ + + PURPOSE : The function is called when the driver functionality is + not longer required. +*/ + +GLOBAL void audio_Exit (void) +{ + audio_signal_callback = NULL; +#if !defined (NEW_FRAME) + vsi_t_close (VSI_CALLER audio_handle); + audio_handle = VSI_ERROR; +#endif +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//Disable Buzzer +#if CONFIG_BUZZER + BZ_Disable (); +#endif + act_tone.status = NO_TONE_STATE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_SetMute | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to enable or disable muting for + the device identified by the parameter in_Device. If the + mode for the specified device could be changed, the + function returns DRV_OK. If the specified device is + unknown or the device does not support muting, the function + returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_SetMute (UBYTE in_DeviceID, UBYTE in_Mode) +{ +// Apr 26, 2005 REF : CRR 30627 xpradipg +// local variable declarations +#ifdef FF_MMI_SERVICES_MIGRATION + T_AUDIO_FULL_ACCESS_WRITE p_parameter; + T_AUDIO_FULL_ACCESS_READ p_parameter1; + T_RV_RETURN_PATH return_path = {0, NULL}; + T_AUDIO_RET result; + static INT8 speaker_volume = 0; + INT8 setvolume = AUDIO_SPEAKER_VOLUME_MUTE; +#endif + + if (in_DeviceID EQ AUDIO_SPEAKER) + { + if (in_Mode AND audio_is_free) + { + TRACE_EVENT ("No speaker muting"); +#ifdef ALR +// Apr 26, 2005 REF : CRR 30627 xpradipg +// the previous volume is restored when we comeout of mute state (unmuting) +// At initialization we do not write the value since the new value is written +#ifdef FF_MMI_SERVICES_MIGRATION + p_parameter.variable_indentifier = AUDIO_SPEAKER_VOLUME_LEVEL; + p_parameter.data = (void*)&speaker_volume; + result = audio_full_access_write(&p_parameter,return_path); + if(result != 0) + TRACE_FUNCTION("error - setting speaker volume"); +#else + ABB_DlMute (0); +#endif +#else + VG_DlMute (0); +#endif + act_speakerMute = AUDIO_MUTING_OFF; + } + else + { + TRACE_EVENT ("Speaker muting"); +#ifdef ALR +// Apr 26, 2005 REF : CRR 30627 xpradipg +// read the current value and store it to before setting it to mute +#ifdef FF_MMI_SERVICES_MIGRATION + p_parameter1.variable_indentifier = AUDIO_SPEAKER_VOLUME_LEVEL; + p_parameter1.data = (void*)&speaker_volume; + result = audio_full_access_read(&p_parameter1); + p_parameter.variable_indentifier = AUDIO_SPEAKER_VOLUME_MUTE; + p_parameter.data = (void*)&setvolume; + result = audio_full_access_write(&p_parameter,return_path); +#else + ABB_DlMute (1); +#endif +#else + VG_DlMute (1); +#endif + act_speakerMute = AUDIO_MUTING_ON; + } + } + else if (in_DeviceID EQ AUDIO_MICROPHONE) + { + if (in_Mode AND audio_is_free) + { + TRACE_EVENT ("No microphone muting"); + audio_UlMute (0); + act_micMute = AUDIO_MUTING_OFF; + } + else + { + TRACE_EVENT ("Microphone muting"); + audio_UlMute (1); + act_micMute = AUDIO_MUTING_ON; + } + } + else + { + return DRV_INVALID_PARAMS; + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_GetMute | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to get the status whether muting + is enabled or disabled for the device identified by the + parameter in_Device. If the specified device is unknown + or the device does not support muting, the function + returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_GetMute (UBYTE in_DeviceID, UBYTE* out_Mode) +{ + if (in_DeviceID EQ AUDIO_SPEAKER) + { + *out_Mode = act_speakerMute; + } + else if (in_DeviceID EQ AUDIO_MICROPHONE) + { + *out_Mode = act_micMute; + } + else + { + return DRV_INVALID_PARAMS; + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_GetStatus | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to retrieve the status of the driver. + In case of a successful completion the driver returns + DRV_OK and the current status of the driver in the buffer + out_StatusPtr points to. + In case the driver is not configured yet, it returns + DRV_NOTCONFIGURED. In this case the contents of the + buffer out_StatusPtr is invalid. + In case out_StatusPtr equals NULL or device is unknown + the driver returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_GetStatus (UBYTE in_DeviceID, + audio_Status_Type * out_StatusPtr) +{ + if ( out_StatusPtr EQ NULL ) + { + return DRV_INVALID_PARAMS; + } + else + { + if (in_DeviceID EQ AUDIO_SPEAKER) + { + out_StatusPtr -> min_volume = AUDIO_MIN_VOLUME; + out_StatusPtr -> max_volume = AUDIO_MAX_VOLUME; + } +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available, set the minimum and maximum volume +#if CONFIG_BUZZER + else if (in_DeviceID EQ AUDIO_BUZZER) + { + out_StatusPtr -> min_volume = AUDIO_MIN_BUZ_VOLUME; + out_StatusPtr -> max_volume = AUDIO_MAX_BUZ_VOLUME; + } +#endif + else if (in_DeviceID EQ AUDIO_MICROPHONE) + { + out_StatusPtr -> min_volume = AUDIO_MIN_MIC_VOLUME; + out_StatusPtr -> max_volume = AUDIO_MAX_MIC_VOLUME; + } + else + { + return DRV_INVALID_PARAMS; + } + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_GetSoundImage | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to copy the image of a driver + internal sound image into an application specific sound + image buffer. The application may modify the sound. + In case of a successful completion the function returns + DRV_OK. In case the size of the buffer where the sound image + shall be copied to is too small the driver returns + DRV_INVALID_PARAMS. In case a specific driver implementation + does not support this functionality the driver returns + DRV_FCT_NOTSUPPORTED. + +*/ + +GLOBAL UBYTE audio_GetSoundImage (UBYTE in_SoundID, + void * out_SoundImagePtr) +{ + return AUDIO_FCT_NOTSUPPORTED; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_SetAmplf | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to set the amplification for the + device identified by the parameter in_DeviceID. + In the case of a speaker this is the volume, for a + microphone - the pre-amplifier that regulates the + sensitivity of the microphone. The valid range depends on + the hardware used. If the amplification could be changed + for the specified device, the function returns DRV_OK. If + the amplification value (in_Amplf) is out of range or the + specified device is unknown or the specified device does + not support the amplification setting, the function + returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_SetAmplf (UBYTE in_DeviceID, UBYTE in_Amplf) +{ +// Apr 26, 2005 REF : CRR 30627 xpradipg +// local variable +#ifdef FF_MMI_SERVICES_MIGRATION + T_AUDIO_FULL_ACCESS_WRITE p_parameter; + T_RV_RETURN_PATH return_path = {0, NULL}; + T_AUDIO_RET result; + INT8 volume; +#endif + if (in_DeviceID EQ AUDIO_MICROPHONE) + { + act_micVolume = 75; /* voice quality is best at this microphone volume */ +#ifdef ALR +#else + VG_UlVolume (act_micVolume); +#endif + } + else if (in_DeviceID EQ AUDIO_SPEAKER) + { + TRACE_EVENT_P1("VOLUME=%d", in_Amplf); + +#ifdef ALR +// Apr 26, 2005 REF : CRR 30627 xpradipg +// The ABB values are converted to the corresponding audio service values +#ifdef FF_MMI_SERVICES_MIGRATION + switch (in_Amplf) + { + case 255: + volume = AUDIO_SPEAKER_VOLUME_0dB; + break; + case 190: + volume = AUDIO_SPEAKER_VOLUME_6dB; + break; + case 125: + volume = AUDIO_SPEAKER_VOLUME_12dB; + break; + case 60: + volume = AUDIO_SPEAKER_VOLUME_18dB; + break; + case 1: + volume = AUDIO_SPEAKER_VOLUME_24dB; + break; + default: + volume = AUDIO_SPEAKER_VOLUME_12dB; + break; + } + p_parameter.variable_indentifier = AUDIO_SPEAKER_VOLUME_LEVEL; + p_parameter.data = (void*)&volume; + result = audio_full_access_write(&p_parameter, return_path); + if( result != 0) + TRACE_FUNCTION("set volume failed"); +#else + ABB_DlVolume (in_Amplf); /* output volume */ +#endif +#ifdef FF_TTY + if (!tty_state) +#endif + { + /* ABB_SideTone (175); */ /* To avoid the side tone reseting */ + } +#else + VG_DlVolume (in_Amplf); /* output volume */ + /* VG_SideTone (175); */ /* To avoid the side tone reseting */ +#endif + act_speakerVolume = in_Amplf; + } +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available , set the volume +#if CONFIG_BUZZER + else if (in_DeviceID EQ AUDIO_BUZZER) + { + act_buzVolume = in_Amplf; + } +#endif + else + { + return DRV_INVALID_PARAMS; + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_GetAmplf | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to get the amplification for the + device identified by the parameter in_DeviceID. + In the case of a speaker this is the volume, for a + microphone - the pre-amplifier that regulates the + sensitivity of the microphone. The valid range depends on + the hardware used.If the specified device is unknown the + function returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_GetAmplf (UBYTE in_DeviceID, UBYTE* out_Amplf) +{ + if (in_DeviceID EQ AUDIO_MICROPHONE) + { + *out_Amplf = act_micVolume; + } + else if (in_DeviceID EQ AUDIO_SPEAKER) + { + *out_Amplf = act_speakerVolume; + } +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available, set the out volume +#if CONFIG_BUZZER + else if (in_DeviceID EQ AUDIO_BUZZER) + { + *out_Amplf = act_buzVolume; + } +#endif + else + { + return DRV_INVALID_PARAMS; + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_PlaySoundID | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to play a sound or melody. The + function returns immediately after the "play process" has + been activated. It is implementation dependent if the + device/driver supports playing multiple sounds simultan- + eously, i.e. accepting multiple calls of audio_PlaySoundID(). + If the calling process should be notified when the sound has + stopped playing automatically, the signal AUDIO_SIGTYPE_ + SOUNDEND must be set using the audio_SetSignal() function. + If the special driver implementation or the device does + not support volume control, the driver ignores the value. + If the sound can be played, the function returns DRV_OK. + If the device is currently playing the sound identified by + the parameter in_SoundID, the function returns DRV_INPROCESS. + If the device/driver is currently playing a sound, but does + not support playing multiple sounds simultaneously, the + driver returns DRV_INPROCESS. + +*/ + +GLOBAL UBYTE audio_PlaySoundID (UBYTE in_DeviceID, + UBYTE in_SoundID, + BYTE in_RelVolume, + UBYTE in_Repeats) +{ + +TRACE_EVENT_P1("audio_PlaySoundID in_SoundID is %d",in_SoundID); + /* + * switch off current tone + */ + switch (act_tone.status) + { + +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available, disable the buzzer +#if CONFIG_BUZZER + case BUZZER_ON: + BZ_Disable (); + case BUZZER_SILENT: +#endif + /* + * No Break + */ + case TONE_ON: + case TONE_SILENT: +#if defined (NEW_FRAME) + vsi_t_stop (VSI_CALLER CST_AUDIOTIMER); +#else + vsi_t_stop (VSI_CALLER audio_handle); +#endif + break; + default: + break; + } + + /* + * configure new tone + */ + if (in_SoundID EQ TONES_KEYBEEP) /* that is keybeep */ + { +#if defined (RIV_AUDIO) + beep.frequency_beep[0] = ((F_697) >> 5) & 0x07ff; + beep.amplitude_beep[0] = -((char) ((F_697) & 0x001f)); + beep.frequency_beep[1] = ((F_697) >> 5) & 0x07ff; + beep.amplitude_beep[1] = -((char) ((F_697) & 0x001f)); + beep.duration = 120; + #ifdef _TARGET_ + /* + * This function seems only to be available on target. (db / 2001-07-16) + */ + return audio_keybeep_start(beep,riv_audio_rp); + #endif +#else + /* MPHC is not present in GTI case */ + #if !defined(FF_GTI) && AUDIO_TASK + PALLOC (keybeep, MMI_KEYBEEP_REQ); + + keybeep->d_k_x1_kt0 = F_697; + keybeep->d_k_x1_kt1 = F_697; + keybeep->d_dur_kb = 6; /* equal 120 ms */ + PSENDX (L1, keybeep); + #endif /* FF_GTI */ +#endif + } + else + { + act_tone.call_tone = in_SoundID; +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//Before playing the tone, set the status and the tone type . +#if CONFIG_BUZZER + act_tone.status = BUZZER_SILENT; + act_tone.type = (UBYTE)TONE_TYPE[in_SoundID]; +#else //If Buzzer is not available + act_tone.status = TONE_SILENT; + act_tone.type = (UBYTE)AUDIO; +#endif + act_tone.descr = (T_DESCR *)TONE_DESCR[in_SoundID]; + act_tone.style = in_Repeats; + act_tone.descr_index = 0; +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available, call the audio_buzzer +#if CONFIG_BUZZER + if (act_tone.type EQ BUZZER) + { + act_tone.volume = act_buzVolume; + audio_buzzer (); + } + else +#endif + { + act_tone.volume = act_speakerVolume; + audio_audio (); + } + } + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_PlaySoundbyImage | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to play a sound or melody. The + image of the sound/melody is passed to the driver (the + sound image format is implmementation dependent). + +*/ + +GLOBAL UBYTE audio_PlaySoundbyImage (UBYTE in_DeviceID, + void * in_SoundImagePtr, + BYTE in_RelVolume, + UBYTE in_Repeats) +{ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_StopSoundbyID | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to manually stop playing a sound + or melody. When a sound is stopped manually, no signal is + created as to whether or not the signal AUDIO_SIGTYP_SOUNDEND + has been defined. If the function could stop playing the + specified sound, the function returns DRV_OK. If the device + is unknown or does not support this function or the specified + sound ID is invalid, the function returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_StopSoundbyID (UBYTE in_DeviceID, + UBYTE in_SoundID) +{ + +TRACE_EVENT_P1("audio_StopSoundbyID in_SoundID is %d",in_SoundID); + /* + * switch off current tone + */ + switch (act_tone.status) + { +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//If Buzzer is available, disable it. +#if CONFIG_BUZZER + case BUZZER_ON: + BZ_Disable (); + case BUZZER_SILENT: +#endif + /* + * No Break + */ + case TONE_ON: + case TONE_SILENT: + + /* Stop timer for reload */ + +#if defined (NEW_FRAME) + vsi_t_stop (VSI_CALLER CST_AUDIOTIMER); +#else + vsi_t_stop (VSI_CALLER audio_handle); +#endif + + if (act_tone.status EQ TONE_ON) + { + /* + * stop the current playing audio tone immediately + */ +#if defined (RIV_AUDIO) + #ifdef _TARGET_ + /* + * This function seems only to be available on target. (db / 2001-07-16) + */ + audio_tones_stop(riv_audio_rp); + #endif +#else + #if !defined(FF_GTI) && AUDIO_TASK + PALLOC (audio, MMI_TONE_REQ); + + audio->d_k_x1_t0 = 0; + audio->d_k_x1_t1 = 0; + audio->d_k_x1_t2 = 0; + audio->d_pe_rep = 1; + audio->d_pe_off = 0; + audio->d_se_off = 0; + audio->d_bu_off = 0; + audio->d_t0_on = 0; + audio->d_t0_off = 0; + audio->d_t1_on = 0; + audio->d_t1_off = 0; + audio->d_t2_on = 0; + audio->d_t2_off = 0; + + PSENDX (L1, audio); + #endif /* FF_GTI */ +#endif + } + act_tone.status = NO_TONE_STATE; + + break; + default: + break; + } + + return DRV_OK; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_StopSoundbyImage | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to manually stop playing a sound + or melody. When a sound is stopped manually, no signal is + created as to whether or not the signal AUDIO_SIGTYP_SOUNDEND + has been defined. If the function could stop playing the + specified sound image, the function returns DRV_OK. + If the device is unknown or does not support this function + or the specified sound ID is invalid, the function + returns DRV_INVALID_PARAMS. + +*/ + +GLOBAL UBYTE audio_StopSoundbyImage (UBYTE in_DeviceID, + void * in_SoundImagePtr) +{ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_SetSignal | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to defines a single signal or multiple + signals that is/are indicated to the process when the + event identified in the signal information data type as + SignalType occurs. To remove a signal call the function + audio_ResetSignal(). If one of the parameters of the + signal information data is invalid, the function returns + DRV_INVALID_PARAMS. If no signal call-back function has + been defined at the time of initialization, the driver + returns DRV_SIGFCT_NOTAVAILABLE. + +*/ + +GLOBAL UBYTE audio_SetSignal (drv_SignalID_Type * in_SignalIDPtr) +{ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_ResetSignal | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used to remove a previously set single + multiple signals. The signals that are removed are identified + by the Signal Information Data element Signal Type. All other + elements of the signal information data must be identical + to the signal(s) that is/are to be removed. + +*/ + +GLOBAL UBYTE audio_ResetSignal (drv_SignalID_Type * in_SignalIDPtr) +{ + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_timeout | ++--------------------------------------------------------------------+ + + PURPOSE : This function is used after timeout of the audio timer. + +*/ + +#if defined (NEW_FRAME) +GLOBAL void audio_timeout (USHORT index) +#else +GLOBAL void audio_timeout (T_VSI_THANDLE handle) +#endif +{ +#if defined (NEW_FRAME) + if (index EQ CST_AUDIOTIMER) +#else + if (handle EQ audio_handle) +#endif + { + /*ccc + * only if it is the audio timer + */ +//Apr 04, 2005 REF: ENH 30063 xdeepadh +//For Buzzer +#if CONFIG_BUZZER + if (act_tone.type EQ BUZZER) + audio_buzzer (); + else +#endif + audio_audio (); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_buzzer | ++--------------------------------------------------------------------+ + + PURPOSE : Process a buzzer tone. + +*/ +//Apr 04, 2005 REF: ENH 30063 xdeepadh +#if CONFIG_BUZZER +LOCAL void audio_buzzer (void) +{ + if (act_tone.status EQ NO_TONE_STATE) + return; + + switch (act_tone.descr + [act_tone.descr_index].command_1) + { + case 0: + /* + * switch buzzer off + */ + BZ_Disable (); +#if defined (NEW_FRAME) + vsi_t_start (VSI_CALLER CST_AUDIOTIMER, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#else + vsi_t_start (VSI_CALLER audio_handle, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#endif + act_tone.status = BUZZER_SILENT; + break; + + case 0xFFFE: + /* + * switch buzzer on continously + */ + BZ_Enable (); + BZ_Volume (act_buzVolume); + BZ_Tone (act_tone.descr + [act_tone.descr_index].command_1); + act_tone.status = BUZZER_ON; + break; + + case 0xFFFF: + /* + * end of list + */ + BZ_Disable (); + if (act_tone.style EQ AUDIO_PLAY_INFINITE) + { + act_tone.descr_index = 0; + audio_buzzer (); + } + else + act_tone.status = NO_TONE_STATE; + break; + + default: + /* + * switch buzzer on + */ + BZ_Enable (); + BZ_Volume (act_buzVolume); + BZ_Tone (act_tone.descr + [act_tone.descr_index].command_1); +#if defined (NEW_FRAME) + vsi_t_start (VSI_CALLER + CST_AUDIOTIMER, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#else + vsi_t_start (VSI_CALLER + audio_handle, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#endif + act_tone.status = BUZZER_ON; + break; + } +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_audio | ++--------------------------------------------------------------------+ + + PURPOSE : Process an audio tone. + +*/ + +LOCAL void audio_audio (void) +{ + +TRACE_EVENT("audio_audio"); + if (act_tone.status EQ NO_TONE_STATE) + return; + + switch (act_tone.descr + [act_tone.descr_index].command_1) + { + case 0: + /* + * switch audio off + */ +#if defined (NEW_FRAME) + vsi_t_start (VSI_CALLER CST_AUDIOTIMER, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#else + vsi_t_start (VSI_CALLER audio_handle, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#endif + act_tone.status = TONE_SILENT; + break; + + case 0xFFFF: + /* + * end of list + */ + if (act_tone.style EQ AUDIO_PLAY_INFINITE) + { + act_tone.descr_index = 0; + audio_audio (); + } + else + act_tone.status = NO_TONE_STATE; + break; + + default: + /* + * switch audio tone on + */ + { +#if defined (RIV_AUDIO) + USHORT fa1 = act_tone.descr[act_tone.descr_index].command_1; + USHORT fa2 = act_tone.descr[act_tone.descr_index].command_2; + ULONG len = act_tone.descr[act_tone.descr_index].length; + t.tones[0].start_tone = 0; + t.tones[0].stop_tone = (USHORT) ((60 * len) / 13); + t.tones[0].frequency_tone = (fa1 >> 5) & 0x07ff; + t.tones[0].amplitude_tone = -((char) (fa1 & 0x001f)); + t.tones[1].start_tone = 0; + t.tones[1].stop_tone = (USHORT) ((60 * len) / 13); + t.tones[1].frequency_tone = (fa2 >> 5) & 0x07ff; + t.tones[1].amplitude_tone = -((char) (fa2 & 0x001f)); + t.tones[2].start_tone = 0; +// t.tones[2].stop_tone = 1; - NDH : Removed as this does not comply with the i/f spec + t.tones[2].stop_tone = (USHORT) ((60 * len) / 13); + t.tones[2].frequency_tone = 0; + t.tones[2].amplitude_tone = 0; + t.frame_duration = (USHORT) ((60 * len) / 13); + t.sequence_duration = (USHORT) ((60 * len) / 13); /* why 120 ??? -> changed to 60 */ + t.period_duration = (USHORT) ((60 * len) / 13); /* -"- */ + t.repetition = 1; + #ifdef _TARGET_ + /* + * This function seems only to be available on target. (db / 2001-07-16) + */ + audio_tones_start(&t,riv_audio_rp); + #endif +#else + #if !defined(FF_GTI) && AUDIO_TASK + PALLOC (audio, MMI_TONE_REQ); + /* + * Convert TDMA frames to 20 ms -> 3/13 + */ + + audio->d_k_x1_t0 = act_tone.descr[act_tone.descr_index].command_1; + audio->d_k_x1_t1 = act_tone.descr[act_tone.descr_index].command_2; + audio->d_k_x1_t2 = 0; + audio->d_pe_rep = 1; + audio->d_pe_off = (6*act_tone.descr[act_tone.descr_index].length) / 13; + audio->d_se_off = (6*act_tone.descr[act_tone.descr_index].length) / 13; + audio->d_bu_off = (3*act_tone.descr[act_tone.descr_index].length) / 13; + audio->d_t0_on = 0; + audio->d_t0_off = (3*act_tone.descr[act_tone.descr_index].length) / 13; + audio->d_t1_on = 0; + audio->d_t1_off = (3*act_tone.descr[act_tone.descr_index].length) / 13; + audio->d_t2_on = 0; + audio->d_t2_off = 0; + + PSENDX (L1, audio); + #endif /* FF_GTI */ +#endif + +#if defined (NEW_FRAME) + vsi_t_start (VSI_CALLER CST_AUDIOTIMER, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#else + vsi_t_start (VSI_CALLER audio_handle, + act_tone.descr + [act_tone.descr_index++].length*60/13); +#endif + act_tone.status = TONE_ON; + } + break; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_UlMute | ++--------------------------------------------------------------------+ + + PURPOSE : This function mutes the uplink path. + +*/ +LOCAL void audio_UlMute (UBYTE mute) +{ +// Apr 26, 2005 REF : CRR 30627 xpradipg +// local variable definition +#ifdef FF_MMI_SERVICES_MIGRATION + T_AUDIO_FULL_ACCESS_WRITE p_parameter; + T_AUDIO_FULL_ACCESS_READ p_parameter1; + T_RV_RETURN_PATH return_path = {0, NULL}; + T_AUDIO_RET result; +// June 13, 2005 REF : GSM_ENH_32062 - xpradipg +// the default value is assigned to AUDIO_MICROPHONE_OUTPUT_BIAS_2_0V + static INT8 microphone_gain = AUDIO_MICROPHONE_OUTPUT_BIAS_2_0V; + INT8 setgain = AUDIO_MICROPHONE_MUTE; +#endif + if (mute) + { +#ifdef ALR +// June 13, 2005 REF : GSM_ENH_32062 - xpradipg +// the audio is unmuted for the variable "mute" with value greater than "0" +// Apr 26, 2005 REF : CRR 30627 xpradipg +// read the microphone gain, store it and mute the microphone +#ifdef FF_MMI_SERVICES_MIGRATION + p_parameter1.variable_indentifier = AUDIO_MICROPHONE_GAIN; + p_parameter1.data = (void*)µphone_gain; + result = audio_full_access_read(&p_parameter1); + if(result != 0) + { + TRACE_EVENT("error reading the handeld parameters"); + } + p_parameter.variable_indentifier = AUDIO_MICROPHONE_GAIN; + setgain = AUDIO_MICROPHONE_MUTE; + p_parameter.data = (void*)&setgain; + result = audio_full_access_write(&p_parameter, return_path); + if(result != 0) + TRACE_EVENT("ERROR - not written1"); +#else + ABB_UlMute (1); +#endif +#else + VG_UlVolume (0); +#endif + } + else + { +#ifdef ALR +// June 13, 2005 REF : GSM_ENH_32062 - xpradipg +// the audio is muted for the variable "mute" with value <= to "0" +// Apr 26, 2005 REF : CRR 30627 xpradipg +// restore the volume back once the unmuting is done +#ifdef FF_MMI_SERVICES_MIGRATION + p_parameter.variable_indentifier = (UINT8)AUDIO_MICROPHONE_GAIN ; + p_parameter.data = (void*)µphone_gain; + result = audio_full_access_write(&p_parameter, return_path); + if(result != 0) + TRACE_EVENT("ERROR - not written"); +#else + ABB_UlMute (0); +#endif +#else + VG_UlVolume (act_micVolume); +#endif + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6103) MODULE : DRV_AUDIO | +| STATE : code ROUTINE : audio_set_tty | ++--------------------------------------------------------------------+ + + PURPOSE : This function (de)activates the TTY codec. + +*/ + +#if defined (FF_TTY) || defined (_TTY_SIMU) +GLOBAL void audio_set_tty (T_TTY_CMD tty) +{ + if (tty < TTY_OFF OR tty > TTY_ALL) + { + TRACE_EVENT_P1 ("TTY invalid parameter: %d", tty); + return; + } + if (tty NEQ TTY_OFF) + { +#if defined (RIV_AUDIO) && !defined (_TTY_SIMU) + T_AUDIO_MODE_SAVE audio_mode; + T_RV_RETURN_PATH ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + + if (!tty_state) + { + tty_cfg.Mode = TTY_EXT_START; + tty_cfg.ThresholdRead = tty_cfg.ThreshHoldWrite = 0; + + ret.callback_func = audio_save_def_return; + strcpy (audio_mode.audio_mode_filename, audio_mode_names_tty[0]); + audio_ret = audio_mode_save (&audio_mode, ret); + + if (audio_ret NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE SAVE def: %d", (int)audio_ret); + } + else + { + AUDIO_TRC_FUNC ("AUDIO MODE SAVE def"); + tty_cmd = (UBYTE)tty; + } + } + else + { + AUDIO_TRC_EVENT ("TTY running"); + } +#else + TRACE_EVENT_P1 ("TTY start: %d", tty); +#endif + } + else + { +#if defined (RIV_AUDIO) && !defined (_TTY_SIMU) + T_RV_RETURN_PATH ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + + if (tty_state) + { + ret.callback_func = audio_tty_return; + tty_cfg.ThresholdRead = tty_cfg.ThreshHoldWrite = 0; + tty_cfg.Mode = TTY_STOP; + audio_ret = audio_tty_set_config (&tty_cfg, &ret); + + if (audio_ret NEQ AUDIO_OK) + { + tty_state = FALSE; + AUDIO_TRC_EVENT_P1 ("Error TTY stop: %d", (int)audio_ret); + } + else + { + AUDIO_TRC_FUNC ("TTY to be stopped"); + } + } + else + { + AUDIO_TRC_FUNC ("TTY already ended"); + } +#else + TRACE_EVENT ("TTY stop"); +#endif + } +} + +/* This function changes the TTY mode during an active TTY call */ +GLOBAL void audio_dyn_set_tty (T_TTY_CMD tty) +{ + T_AUDIO_MODE_LOAD audio_mode; + T_RV_RETURN_PATH load_ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + UBYTE cmd; + + if (tty < TTY_OFF OR tty > TTY_ALL) + { + TRACE_EVENT_P1 ("TTY invalid parameter: %d", tty); + return; + } + +#if defined (RIV_AUDIO) && !defined (_TTY_SIMU) + + cmd = (UBYTE)tty; + if (tty_state) + { + load_ret.callback_func = audio_dyn_load_return; + } + else + { + /* + * If the TTY mode was default before then need to start + * the TTY driver + */ + tty_cfg.Mode = TTY_EXT_START; + tty_cfg.ThresholdRead = tty_cfg.ThreshHoldWrite = 0; + load_ret.callback_func = audio_load_return; + } + + strcpy (audio_mode.audio_mode_filename, audio_mode_names_tty[(int)cmd]); + audio_ret = audio_mode_load (&audio_mode, load_ret); + + if (audio_ret NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE LOAD TTY: %d", (int)audio_ret); + } + else + { + AUDIO_TRC_FUNC ("AUDIO MODE LOAD def"); + tty_cmd = (UBYTE)tty; + } +#else + TRACE_EVENT_P1 ("TTY mode change: %d", tty); +#endif + +} + +#if defined (RIV_AUDIO) AND !defined (_TTY_SIMU) +LOCAL void audio_tty_return (void *tty_result) +{ + T_AUDIO_MODE_LOAD audio_mode; + T_RV_RETURN_PATH ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + + if (((T_AUDIO_TTY_STATUS *)tty_result)->status NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error TTY callback: %d", + (int)((T_AUDIO_TTY_STATUS *)tty_result)->status); + } + tty_state = FALSE; + tty_cfg.Mode = TTY_STOP; + AUDIO_TRC_FUNC ("TTY end"); + + ret.callback_func = audio_load_return; + strcpy (audio_mode.audio_mode_filename, audio_mode_names_tty[0]); + audio_ret = audio_mode_load (&audio_mode, ret); + + if (audio_ret NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE LOAD def: %d", (int)audio_ret); + } +} + +LOCAL void audio_save_def_return (void *result) +{ + T_AUDIO_MODE_LOAD audio_mode; + T_RV_RETURN_PATH load_ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + + if (((T_AUDIO_SAVE_DONE *)result)->status NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE SAVE def callback: %d", + (int)((T_AUDIO_SAVE_DONE *)result)->status); + } + else + { + AUDIO_TRC_FUNC ("AUDIO def saved"); + + load_ret.callback_func = audio_load_return; + strcpy (audio_mode.audio_mode_filename, audio_mode_names_tty[(int)tty_cmd]); + audio_ret = audio_mode_load (&audio_mode, load_ret); + + if (audio_ret NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE LOAD TTY: %d", (int)audio_ret); + } + } +} + +LOCAL void audio_load_return (void *result) +{ + if (((T_AUDIO_LOAD_DONE *)result)->status NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE LOAD callback: %d", + (int)((T_AUDIO_LOAD_DONE *)result)->status); + } + else + { + T_RV_RETURN_PATH ret = {NOT_PRESENT_8BIT, NULL}; + T_AUDIO_RET audio_ret; + + if (!tty_state AND tty_cfg.Mode EQ TTY_EXT_START) + { + ret.callback_func = audio_tty_return; + audio_ret = audio_tty_set_config (&tty_cfg, &ret); + + if (audio_ret NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error TTY set: %d", (int)audio_ret); + } + else + { + tty_state = TRUE; + AUDIO_TRC_FUNC ("AUDIO TTY loaded & start"); + } + } + else if (!tty_state AND tty_cfg.Mode EQ TTY_STOP) + { + tty_cmd = (UBYTE)TTY_OFF; + AUDIO_TRC_FUNC ("AUDIO def loaded"); + } + else + { + AUDIO_TRC_EVENT_P2 ("TTY improper state: %d; mode: %d", + (int)tty_state, (int)tty_cfg.Mode); + } + } +} + +LOCAL void audio_dyn_load_return (void *result) +{ + if (((T_AUDIO_LOAD_DONE *)result)->status NEQ AUDIO_OK) + { + AUDIO_TRC_EVENT_P1 ("Error AUDIO MODE LOAD callback: %d", + (int)((T_AUDIO_LOAD_DONE *)result)->status); + } + else + { + AUDIO_TRC_EVENT_P1 ("TTY mode changed: %d", (int)tty_cmd); + } +} +#endif +#endif + +/******************************************************************* + * * + * PART II: Simulation for Windows * + * * + *******************************************************************/ + +#if defined (_SIMULATION_) +/* + * Dummies for driver calls + */ + +LOCAL void BZ_Init (void) +{ +} + +LOCAL void BZ_Enable (void) +{ +} + +LOCAL void BZ_Disable (void) +{ +} + +LOCAL void BZ_Tone (int f) +{ +} + +LOCAL void BZ_Volume (int v) +{ +} + +#ifdef ALR +LOCAL void ABB_DlVolume (UBYTE v) +{ +} + +LOCAL void ABB_DlMute (UBYTE mute) +{ +} + +LOCAL void ABB_UlMute (UBYTE value) +{ +} + +LOCAL void ABB_SideTone (UBYTE v) +{ +} +#else +LOCAL void VG_UlVolume (UBYTE v) +{ +} + +LOCAL void VG_DlVolume (UBYTE v) +{ +} + +LOCAL void VG_DlMute (UBYTE mute) +{ +} + +LOCAL void VG_SideTone (UBYTE v) +{ +} +#endif + +#endif + +#if defined (RIV_AUDIO) +void audio_riv_audio_cb (void *buf) +{ + /* nothing to do for this time */ +} +#endif