안녕하세요, 타이젠 개발자 윤진입니다.


본 포스팅에 앞서 sound manager를 두 차례 다뤘는데요,

[Tizen] 타이젠 개발, Sound manager로 볼륨을 조절하기

[Tizen] 타이젠 개발, Sound manager로 세션을 조절하기

이번 포스팅에서는 Tone player로 사전정의된 음색을 재생/정지하는 방법을 다루겠습니다.



tone_player의 API는 단 2개입니다.

tone_player_start()로 재생을 하고 tone_player_stop()으로 정지를 합니다.

tone_player_start()에 duration_ms을 넣어주기 때문에,

굳이 tone_player_stop()을 사용하지 않아도 됩니다.

tone_player_start()의 첫번째 인자로 tone type을 넘겨줍니다.

tone type에는 총 111개의 내장 타입이 존재합니다.


/**
 * @brief Enumeration of tone.
 * @since_tizen 2.3
 */
typedef enum
{
    TONE_TYPE_DEFAULT = 0,            /**< The default tone */
    TONE_TYPE_DTMF_0 = 0,                /**< Predefined DTMF 0 */
    TONE_TYPE_DTMF_1,                 /**< Predefined DTMF 1 */
    TONE_TYPE_DTMF_2,                /**< Predefined DTMF 2 */
    TONE_TYPE_DTMF_3,                /**< Predefined DTMF 3 */
    TONE_TYPE_DTMF_4,                /**< Predefined DTMF 4 */
    TONE_TYPE_DTMF_5,                /**< Predefined DTMF 5 */
    TONE_TYPE_DTMF_6,                /**< Predefined DTMF 6 */
    TONE_TYPE_DTMF_7,                /**< Predefined DTMF 7 */
    TONE_TYPE_DTMF_8,                /**< Predefined DTMF 8 */
    TONE_TYPE_DTMF_9,                /**< Predefined DTMF 9 */
    TONE_TYPE_DTMF_S,               /**< Predefined DTMF Star - Asterisk (*) */
    TONE_TYPE_DTMF_P,                /**< Predefined DTMF sharP (#) */
    TONE_TYPE_DTMF_A,                /**< Predefined DTMF A (A) */
    TONE_TYPE_DTMF_B,                /**< Predefined DTMF B (B) */
    TONE_TYPE_DTMF_C,                /**< Predefined DTMF C (C) */
    TONE_TYPE_DTMF_D,                /**< Predefined DTMF D (D) */
    TONE_TYPE_SUP_DIAL,     /**< Call supervisory tone, Dial tone: CEPT: 425Hz, continuous */
    TONE_TYPE_ANSI_DIAL,    /**< Call supervisory tone, Dial tone: ANSI (IS-95): 350Hz+440Hz, continuous */
    TONE_TYPE_JAPAN_DIAL,    /**< Call supervisory tone, Dial tone: JAPAN: 400Hz, continuous */
    TONE_TYPE_SUP_BUSY,    /**< Call supervisory tone, Busy: CEPT: 425Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_ANSI_BUSY,     /**< Call supervisory tone, Busy: ANSI (IS-95): 480Hz+620Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_JAPAN_BUSY,     /**< Call supervisory tone, Busy: JAPAN: 400Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_SUP_CONGESTION,   /**< Call supervisory tone, Congestion: CEPT, JAPAN: 425Hz, 200ms ON, 200ms OFF */
    TONE_TYPE_ANSI_CONGESTION,  /**< Call supervisory tone, Congestion: ANSI (IS-95): 480Hz+620Hz, 250ms ON, 250ms OFF... */
    TONE_TYPE_SUP_RADIO_ACK,   /**< Call supervisory tone, Radio path acknowledgment : CEPT, ANSI: 425Hz, 200ms ON  */
    TONE_TYPE_JAPAN_RADIO_ACK,  /**< Call supervisory tone, Radio path acknowledgment : JAPAN: 400Hz, 1s ON, 2s OFF...*/
    TONE_TYPE_SUP_RADIO_NOTAVAIL,  /**< Call supervisory tone, Radio path not available: 425Hz, 200ms ON, 200 OFF 3 bursts */
    TONE_TYPE_SUP_ERROR,    /**< Call supervisory tone, Error/Special info: 950Hz+1400Hz+1800Hz, 330ms ON, 1s OFF... */
    TONE_TYPE_SUP_CALL_WAITING,  /**< Call supervisory tone, Call Waiting: CEPT, JAPAN: 425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF... */
    TONE_TYPE_ANSI_CALL_WAITING,  /**< Call supervisory tone, Call Waiting: ANSI (IS-95): 440 Hz, 300 ms ON, 9.7 s OFF, (100 ms ON, 100 ms OFF, 100 ms ON, 9.7s OFF ...) */
    TONE_TYPE_SUP_RINGTONE,   /**< Call supervisory tone, Ring Tone: CEPT, JAPAN: 425Hz, 1s ON, 4s OFF... */
    TONE_TYPE_ANSI_RINGTONE,   /**< Call supervisory tone, Ring Tone: ANSI (IS-95): 440Hz + 480Hz, 2s ON, 4s OFF... */
    TONE_TYPE_PROP_BEEP,    /**< General beep: 400Hz+1200Hz, 35ms ON */
    TONE_TYPE_PROP_ACK,     /**< Proprietary tone, positive acknowledgment: 1200Hz, 100ms ON, 100ms OFF 2 bursts */
    TONE_TYPE_PROP_NACK,     /**< Proprietary tone, negative acknowledgment: 300Hz+400Hz+500Hz, 400ms ON */
    TONE_TYPE_PROP_PROMPT,    /**< Proprietary tone, prompt tone: 400Hz+1200Hz, 200ms ON  */
    TONE_TYPE_PROP_BEEP2,     /**< Proprietary tone, general double beep: twice 400Hz+1200Hz, 35ms ON, 200ms OFF, 35ms ON */
    TONE_TYPE_SUP_INTERCEPT,       /**< Call supervisory tone (IS-95), intercept tone: alternating 440 Hz and 620 Hz tones, each on for 250 ms */
    TONE_TYPE_SUP_INTERCEPT_ABBREV,    /**< Call supervisory tone (IS-95), abbreviated intercept: intercept tone limited to 4 seconds */
    TONE_TYPE_SUP_CONGESTION_ABBREV,     /**< Call supervisory tone (IS-95), abbreviated congestion: congestion tone limited to 4 seconds */
    TONE_TYPE_SUP_CONFIRM,       /**< Call supervisory tone (IS-95), confirm tone: a 350 Hz tone added to a 440 Hz tone repeated 3 times in a 100 ms on, 100 ms off cycle */
    TONE_TYPE_SUP_PIP,        /**< Call supervisory tone (IS-95), pip tone: four bursts of a 480 Hz tone (0.1 s on, 0.1 s off) */
    TONE_TYPE_CDMA_DIAL_TONE_LITE,     /**< 425Hz continuous */
    TONE_TYPE_CDMA_NETWORK_USA_RINGBACK,   /**< CDMA USA Ringback: 440Hz+480Hz 2s ON, 4000 OFF ... */
    TONE_TYPE_CDMA_INTERCEPT,      /**< CDMA Intercept tone: 440Hz 250ms ON, 620Hz 250ms ON ... */
    TONE_TYPE_CDMA_ABBR_INTERCEPT,     /**< CDMA Abbr Intercept tone: 440Hz 250ms ON, 620Hz 250ms ON */
    TONE_TYPE_CDMA_REORDER,       /**< CDMA Reorder tone: 480Hz+620Hz 250ms ON, 250ms OFF... */
    TONE_TYPE_CDMA_ABBR_REORDER,     /**< CDMA Abbr Reorder tone: 480Hz+620Hz 250ms ON, 250ms OFF repeated for 8 times */
    TONE_TYPE_CDMA_NETWORK_BUSY,     /**< CDMA Network Busy tone: 480Hz+620Hz 500ms ON, 500ms OFF continuous */
    TONE_TYPE_CDMA_CONFIRM,       /**< CDMA Confirm tone: 350Hz+440Hz 100ms ON, 100ms OFF repeated for 3 times */
    TONE_TYPE_CDMA_ANSWER,       /**< CDMA answer tone: silent tone - definition Frequency 0, 0ms ON, 0ms OFF */
    TONE_TYPE_CDMA_NETWORK_CALLWAITING,    /**< CDMA Network Callwaiting tone: 440Hz 300ms ON */
    TONE_TYPE_CDMA_PIP,        /**< CDMA PIP tone: 480Hz 100ms ON, 100ms OFF repeated for 4 times */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_NORMAL,   /**< ISDN Call Signal Normal tone: {2091Hz 32ms ON, 2556 64ms ON} 20 times, 2091 32ms ON, 2556 48ms ON, 4s OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP,  /**< ISDN Call Signal Intergroup tone: {2091Hz 32ms ON, 2556 64ms ON} 8 times, 2091Hz 32ms ON, 400ms OFF, {2091Hz 32ms ON, 2556Hz 64ms ON} 8times, 2091Hz 32ms ON, 4s OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_SP_PRI,   /**< ISDN Call Signal SP PRI tone:{2091Hz 32ms ON, 2556 64ms ON} 4 times 2091Hz 16ms ON, 200ms OFF, {2091Hz 32ms ON, 2556Hz 64ms ON} 4 times, 2091Hz 16ms ON, 200ms OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT3,   /**< SDN Call sign PAT3 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PING_RING,  /**< ISDN Ping Ring tone: {2091Hz 32ms ON, 2556Hz 64ms ON} 5 times 2091Hz 20ms ON */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT5,   /**< ISDN Pat5 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT6,   /**< ISDN Pat6 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT7,   /**< ISDN Pat7 tone: silent tone */
    TONE_TYPE_CDMA_HIGH_L,       /**< TONE_CDMA_HIGH_L tone: {3700Hz 25ms, 4000Hz 25ms} 40 times 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_MED_L,       /**< TONE_CDMA_MED_L tone: {2600Hz 25ms, 2900Hz 25ms} 40 times 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_LOW_L,       /**< TONE_CDMA_LOW_L tone: {1300Hz 25ms, 1450Hz 25ms} 40 times, 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_HIGH_SS,       /**< CDMA HIGH SS tone: {3700Hz 25ms, 4000Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_MED_SS,       /**< CDMA MED SS tone: {2600Hz 25ms, 2900Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_LOW_SS,       /**< CDMA LOW SS tone: {1300z 25ms, 1450Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_HIGH_SSL,       /**< CDMA HIGH SSL tone: {3700Hz 25ms, 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} repeat 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_MED_SSL,       /**< CDMA MED SSL tone: {2600Hz 25ms, 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} repeat 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_LOW_SSL,       /**< CDMA LOW SSL tone: {1300Hz 25ms, 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} repeat 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_HIGH_SS_2,      /**< CDMA HIGH SS2 tone: {3700Hz 25ms, 4000Hz 25ms} 20 times, 1000ms OFF, {3700Hz 25ms, 4000Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_MED_SS_2,       /**< CDMA MED SS2 tone: {2600Hz 25ms, 2900Hz 25ms} 20 times, 1000ms OFF, {2600Hz 25ms, 2900Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_LOW_SS_2,       /**< CDMA LOW SS2 tone: {1300Hz 25ms, 1450Hz 25ms} 20 times, 1000ms OFF, {1300Hz 25ms, 1450Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_HIGH_SLS,       /**< CDMA HIGH SLS tone: {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 20 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_MED_SLS,       /**< CDMA MED SLS tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 20 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_LOW_SLS,       /**< CDMA LOW SLS tone: {1300Hz 25ms, 1450Hz 25ms} 10 times, 500ms OFF, {1300Hz 25ms, 1450Hz 25ms} 20 times, 500ms OFF, {1300Hz 25ms, 1450Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_HIGH_S_X4,      /**< CDMA HIGH S X4 tone: {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_S_X4,       /**< CDMA MED S X4 tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_S_X4,       /**< CDMA LOW S X4 tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_L,      /**< CDMA HIGH PBX L: {3700Hz 25ms, 4000Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_L,      /**< CDMA MED PBX L: {2600Hz 25ms, 2900Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_L,      /**< CDMA LOW PBX L: {1300Hz 25ms,1450Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SS,      /**< CDMA HIGH PBX SS tone: {3700Hz 25ms, 4000Hz 25ms} 8 times 200 ms OFF, {3700Hz 25ms 4000Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_SS,      /**< CDMA MED PBX SS tone: {2600Hz 25ms, 2900Hz 25ms} 8 times 200 ms OFF, {2600Hz 25ms 2900Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SS,      /**< CDMA LOW PBX SS tone: {1300Hz 25ms, 1450Hz 25ms} 8 times 200 ms OFF, {1300Hz 25ms 1450Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SSL,      /**< CDMA HIGH PBX SSL tone:{3700Hz 25ms, 4000Hz 25ms} 8 times 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_SSL,      /**< CDMA MED PBX SSL tone:{2600Hz 25ms, 2900Hz 25ms} 8 times 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SSL,      /**< CDMA LOW PBX SSL tone:{1300Hz 25ms, 1450Hz 25ms} 8 times 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SLS,      /**< CDMA HIGH PBX SLS tone:{3700Hz 25ms, 4000Hz 25ms} 8 times 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 16 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 8 times, 1000ms OFF, REPEAT....  */
    TONE_TYPE_CDMA_MED_PBX_SLS,      /**< CDMA MED PBX SLS tone:{2600Hz 25ms, 2900Hz 25ms} 8 times 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 16 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 8 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SLS,      /**< CDMA LOW PBX SLS tone:{1300Hz 25ms, 1450Hz 25ms} 8 times 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 16 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 8 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_S_X4,     /**< CDMA HIGH PBX X S4 tone: {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_MED_PBX_S_X4,      /**< CDMA MED PBX X S4 tone: {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_LOW_PBX_S_X4,      /**< CDMA LOW PBX X S4 tone: {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_ALERT_NETWORK_LITE,    /**< CDMA Alert Network Lite tone: 1109Hz 62ms ON, 784Hz 62ms ON, 740Hz 62ms ON 622Hz 62ms ON, 1109Hz 62ms ON */
    TONE_TYPE_CDMA_ALERT_AUTOREDIAL_LITE,   /**< CDMA Alert Auto Redial tone: {1245Hz 62ms ON, 659Hz 62ms ON} 3 times, 1245 62ms ON */
    TONE_TYPE_CDMA_ONE_MIN_BEEP,      /**< CDMA One Min Beep tone: 1150Hz+770Hz 400ms ON */
    TONE_TYPE_CDMA_KEYPAD_VOLUME_KEY_LITE,   /**< CDMA KEYPAD Volume key lite tone: 941Hz+1477Hz 120ms ON */
    TONE_TYPE_CDMA_PRESSHOLDKEY_LITE,    /**< CDMA PRESSHOLDKEY LITE tone: 587Hz 375ms ON, 1175Hz 125ms ON */
    TONE_TYPE_CDMA_ALERT_INCALL_LITE,     /**< CDMA ALERT INCALL LITE tone: 587Hz 62ms, 784 62ms, 831Hz 62ms, 784Hz 62ms, 1109 62ms, 784Hz 62ms, 831Hz 62ms, 784Hz 62ms */
    TONE_TYPE_CDMA_EMERGENCY_RINGBACK,    /**< CDMA EMERGENCY RINGBACK tone: {941Hz 125ms ON, 10ms OFF} 3times 4990ms OFF, REPEAT... */
    TONE_TYPE_CDMA_ALERT_CALL_GUARD,    /**< CDMA ALERT CALL GUARD tone: {1319Hz 125ms ON, 125ms OFF} 3 times */
    TONE_TYPE_CDMA_SOFT_ERROR_LITE,     /**< CDMA SOFT ERROR LITE tone: 1047Hz 125ms ON, 370Hz 125ms */
    TONE_TYPE_CDMA_CALLDROP_LITE,     /**< CDMA CALLDROP LITE tone: 1480Hz 125ms, 1397Hz 125ms, 784Hz 125ms */
    TONE_TYPE_CDMA_NETWORK_BUSY_ONE_SHOT,   /**< CDMA_NETWORK_BUSY_ONE_SHOT tone: 425Hz 500ms ON, 500ms OFF */
    TONE_TYPE_CDMA_ABBR_ALERT,      /**< CDMA_ABBR_ALERT tone: 1150Hz+770Hz 400ms ON */
    TONE_TYPE_CDMA_SIGNAL_OFF,    /**< CDMA_SIGNAL_OFF - silent tone */
    TONE_TYPE_USER_DEFINED_LOW_FRE,                    /**< User Defined Tone: 100Hz continuous */
    TONE_TYPE_USER_DEFINED_MED_FRE,                    /**< User Defined Tone: 200Hz continuous */
    TONE_TYPE_USER_DEFINED_HIGH_FRE                   /**< User Defined Tone: 300Hz continuous */
} tone_type_e;


Call과 관련된 온갖 종류의 톤이 명시되어 있습니다.


static Eina_Bool _clk_beep_play_cb(void *data)
{
    tone_player_start(TONE_TYPE_PROP_ACK, SOUND_TYPE_ALARM, 400, NULL);
    return ECORE_CALLBACK_RENEW;
}


위의 코드는 clock 앱에서 sound를 제어하는 부분에서 가져왔습니다.

duration_ms를 400으로 주고 있기에 400ms가 지나면 저절로 멈춥니다.

따라서 따로 tone_player_stop()을 사용할 필요가 없습니다.


tone_player_stop()은,

버튼을 누르면 재생하고 손을 떼면 정지하는 상황에서 사용하면 됩니다.


tone play는 111가지 타입 중 사용목적에 맞는 톤을 고르는 것이 중요합니다.

enum 값으로 의미를 확인하고 실제로 소리를 들어본 후 루틴에 반영하세요.


tone player를 위한 샘플앱이 있습니다.

New > Tizen Native Project > Online Sample > Multimedia > Media

Tizen 2.4 IDE에서 위의 경로로 샘플앱을 생성하세요.


static const tone_type_e _tone_list[] = { 
    TONE_TYPE_DTMF_0,
    TONE_TYPE_DTMF_1,
    TONE_TYPE_DTMF_2,
    TONE_TYPE_DTMF_3,
    TONE_TYPE_DTMF_4,
    TONE_TYPE_DTMF_5,
    TONE_TYPE_DTMF_6,
    TONE_TYPE_DTMF_7,
    TONE_TYPE_DTMF_8,
    TONE_TYPE_DTMF_9,
    TONE_TYPE_DTMF_S,
    TONE_TYPE_DTMF_P,
    TONE_TYPE_DTMF_A,
    TONE_TYPE_DTMF_B,
    TONE_TYPE_DTMF_C,
    TONE_TYPE_DTMF_D
};


위의 tone type을 버튼을 눌러 하나씩 확인할 수 있습니다.

Media/src/audio/src/tone_player_view.c를 참고하시면 됩니다.


그럼 오늘은 이만 마치겠습니다.

좋은 하루 보내세요~


끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__TONE__PLAYER__MODULE.html

  1. 2015.12.01 00:29

    비밀댓글입니다


안녕하세요, 타이젠 개발자 윤진입니다.


지난 포스팅에서는 sound manager의 volume 부분을 살펴보았는데요,

[Tizen] 타이젠 개발, Sound manager로 볼륨을 조절하기

이번 포스팅에서는 sound manager의 session 부분을 보도록 하겠습니다.


세션 API


session과 관련하여 공개된 함수는 위의 10개가 전부입니다.

각각의 함수를 살펴보기에 앞서,

session type을 하나씩 먼저 언급해보도록 하겠습니다.



플랫폼 개발자 입장에서 살펴보면,

Media, Alarm, Notification은 제법 눈에 익습니다.

플랫폼에 이미 탑재되어 여기저기서 사용하고 있는 세션들이라 그렇겠지요.

위의 세 세션은 이전 볼륨 포스트에서도 나왔습니다.


SOUND_TYPE_MEDIA
Sound type for media

SOUND_TYPE_ALARM
Sound type for alarm

SOUND_TYPE_NOTIFICATION
Sound type for notifications


미디어나 알람은 누구나 세션을 열어서 사용할 수 있고,

더불어 해당 세션을 위한 볼륨도 조절할 수 있습니다.

노티를 위한 세션은 통상 시스템 레벨의 앱에서 알림을 목적으로 사용합니다.

외부 개발자들도 알림을 목적으로만 사용하는게 좋겠네요.


Emergency는 어느 세션보다 우선하여 동작하는 세션입니다.

Emergency 세션 위로 다른 세션이 포개질 수 없습니다.

Emergency는 silent도 되지 않기 때문에 함부로 사용하면 안되겠죠?


VoIP는 Voice Over IP를 위해 새롭게 추가된 세션입니다.

볼륨에도 아래와 같이 VOIP를 위한 타입이 추가된 상태입니다.


SOUND_TYPE_VOIP
Sound type for voip (Since 2.4)


VoIP를 위한 세션까지 구비되어 있으니,

VoIP 서비스 업체들은 어서 타이젠으로 조인해주세요 :)

그외에 볼륨 타입에는 존재하지만 세션에는 노출되지 않은 세션이 있습니다.


SOUND_TYPE_SYSTEM
Sound type for system

SOUND_TYPE_RINGTONE
Sound type for ringtones (Since 2.4)

SOUND_TYPE_CALL
Sound type for call (Since 2.4)

SOUND_TYPE_VOICE
Sound type for voice


위의 세션을 살펴보면 몇가지 알 수 있는 사실이 있습니다.

요금 과금과 직접적으로 관련된 Call 기능은 3rd party가 개발할 수 없다는 것이지요.

사용자 '돈'과 직접적으로 만나는 부분은 아무래도 조심스럽습니다.

단순히 기존 아키텍쳐를 바꾸고 몇몇 API만 공개한다고 될 수준은 아닙니다.


그리고 System 세션은 3rd party에게 열 이유가 없습니다.

System은 플랫폼에서 독점적으로 사용하고 있습니다.

외부에서는 볼륨을 조절하는 것으로 만족해야겠네요.


클락앱의 알람을 설정하는 코드를 살짝 엿보겠습니다.

static bool ring_app_create(void *data)
{
    retvm_if(!data, FALSE, "data null");
    int nErr = SUCCESS;
    struct appdata *ad = (struct appdata *)data;

    ad->is_create = EINA_FALSE;
    nErr = alarmdb_init(NULL);
    retvm_if(SUCCESS != nErr, FALSE, "alarmdb_init failed! return=%d\n",
         nErr);
    nErr = alarmmgr_init(PKGNAME);
    retvm_if(SUCCESS != nErr, FALSE, "alarmmgr_init failed! return=%d", nErr);
    //mm
    sound_manager_set_session_type(SOUND_SESSION_TYPE_ALARM);
    // 
    ring_util_state_get(ad);
    nErr = alarmmgr_set_cb(_ring_mgr_cb_func, ad);
    retvm_if(SUCCESS != nErr, FALSE, "alarmmgr_set_cb failed! return=%d", nErr);
    ad->motion_sensor_handle = -1;
    //_ring_init_motion_sensor(ad);
    return TRUE;
}


클락앱은 알람을 설정할 수 있는 기능이 있는데요,

알람을 설정할 때 sound_manager_set_session_type()을 이용하여 세션을 설정합니다.


Media session은 sound_manager_set_media_session_option()을 이용하여,

- 미디어 세션 시작시 다른 세션과 Mix할 것인지 다른 세션을 Pause시킬지

- 미디어 세션 플레이 중에 인터럽트를 허용할 것인지

두가지 옵션을 설정할 수 있도록 준비되어 있습니다.

아래의 enum을 참고하시면 보다 명확하게 이해하실 수 있을겁니다.



보통은 하나의 API가 하나의 옵션을 지정하게 되어있는데요,

Session 옵션을 지정하는 API는 두가지 옵션을 지정하게 되어있습니다.

Media session의 옵션을 모두 다루려고 그렇게 설계한 것일까요?



하지만, 안타깝게도 media session 옵션용 API가 하나 더 생겨납니다.

위의 enum은 sound_manager_set_media_session_resumption_option()에서 사용합니다.

Resumption option은 Media 세션이 다른 세션에 의해 중지되었을때 Resume 정책을 지정합니다.

- 시스템 정책에 따라 세션을 resume하거나

- 시스템 정책 + 이 세션을 중지한 미디어 세션이 중지될 때

위의 두가지 정책 중에 하나를 선택할 수 있습니다.


미디어 세션은 여타의 세션들 중에 우선순위가 가장 낮은 부류에 속하기 때문에,

다른 세션들에 의해 쉽게 interrupt 될 수 있습니다.

그래서 resume에 대한 부분도 미리 고려해줄 필요가 있습니다.


sound_manager_set_session_interrupted_cb() 함수로 인터럽트 상황을 통제할 수 있습니다.

우선 인터럽트 상황을 처리할 콜백함수를 위의 함수로 등록해줍니다.

그리고 인터럽트 상황이 발생하면 콜백함수가 불리면서 아래 enum 값을 콜백함수로 넘겨줍니다.


각각의 인터럽트 상황에 맞게 동작을 처리해줍니다.

미디어를 재생하고 있는데 헤드폰이 뽑혔다면 어떻게 해야할까요?

일반적으로는 재생이 중지됩니다. :)


Sound manager의 세션은 이 정도로 정리하도록 하겠습니다.

다음 포스팅에서는 sound의 다른 부분을 살펴보도록 하겠습니다.


그럼 좋은 하루 보내세요~

끝_



* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__SOUND__MANAGER__SESSION__MODULE.html



안녕하세요, 타이젠 개발자 윤진입니다.


앱 개발을 하려면, 플랫폼에서 제공하는 다양한 요소를 사용해야합니다.

앞으로 몇 개의 포스팅에 걸쳐서 '소리'와 관련된 부분을 다뤄보도록 하겠습니다.

첫 포스팅에서는 가볍게 워밍업 하는 기분으로 '볼륨'을 이야기해보죠.


2015년 11월 현재,

Tizen 2.4가 최신 버전이기 때문에, 2.4를 기준으로 설명하겠습니다.

Tizen 2.4가 올라간 타겟은 두 대가 있는데요,

- 지난 10월에 인도에서 출시된 Z3

- 타이젠 데브랩 행사에서 사용하고 있는 TM1

필요하면 위의 타겟들과 에뮬레이터를 이용하여 포스팅하도록 하겠습니다.


볼륨 API를 살펴보기에 앞서 Z3에 올라가 있는 볼륨 앱을 실행해보도록 해보죠.

근데... Z3를 어디에 뒀는지 통 찾을 수가 없네요;

우선 Tizen 2.4 에뮬을 띄워 볼륨앱을 실행해보도록 하겠습니다;



볼륨앱은 단순하며 직관적으로 조작할 수 있는 UI를 가지고 있습니다.

하드키인 볼륨키나 화면의 슬라이더를 이용하여 볼륨을 조절할 수 있도록 지원합니다.

플랫폼에서는 볼륨앱이 volume API를 가장 적극적으로 사용하고 있겠죠?


Volume API


2.4 기준으로 외부에 노출되어 있는 볼륨 API는 위의 8개 뿐입니다.

볼륨 조작을 위해서는 사운드 타입정도만 인지하면 되기때문에 API가 단촐합니다.

실제 볼륨앱 소스를 보면서 위의 API가 어떤 식으로 활용되고 있는지 보겠습니다.


볼륨앱의 소스는 당연히 공개되어 있는데요,

공개된 소스가 플랫폼 2.4 소스와 완벽하게 일치하진 않겠지만(계속 진화하고 있으므로),

volume을 제어하는 control 루틴을 변화가 적으니 그 코드를 그대로 봐도 괜찮을겁니다.

볼륨 소스를 git으로 다운로드 받으시려면 아래 repo.를 이용하세요.

repo. : git://review.tizen.org/apps/core/preloaded/volume-app

branch : tizen


볼륨앱에는 하나의 슬라이더가 나오는데요,

볼륨앱을 실행하는 시점에 활성화된 볼륨타입을 가져와서 화면에 보여줍니다.



sound_manager_get_current_sound_type()으로 활성화되어 있는 사운드 타입을 가져오면,

바로 위에 명시된 8개의 enum 값 중 하나를 얻어올 수 있습니다.

2.4에는 ringtones, call, voip와 같이 콜과 관련된 사운드 타입이 추가되었죠.

타이젠 플랫폼이 3rd party를 위해 call 관련 API, 특히 VoIP를 정비하고 있나보네요.


sound_type_e volume_sound_sound_manager_type_get(void)
{
    int ret = 0;
    sound_type_e sound_type = -1;

    ret = sound_manager_get_current_sound_type(&sound_type);
    _D("ret: %d, sound type: %d", ret, sound_type);
    switch (ret) {
    case SOUND_MANAGER_ERROR_NONE:
        _D("Error none");
        break;
    case SOUND_MANAGER_ERROR_NO_PLAYING_SOUND:
        _D("NO playing sound");
        sound_type = SOUND_TYPE_RINGTONE;
        break;
    default:
        _E("Failed to get sound type : %d", ret);
        sound_type = SOUND_TYPE_RINGTONE;
        return sound_type;
    }  

    if(sound_type == SOUND_TYPE_SYSTEM)
        sound_type = SOUND_TYPE_RINGTONE;

    return sound_type;
}


볼륨앱에서는 ringtones를 기본으로 설정하고 있습니다.

사용자가 홈화면에서 볼륨키를 누르면 링톤의 음량을 조절할 수 있겠네요.


그리고 sound_manager_get_max_volume()과 sound_manager_get_volume()을 이용하여,

슬라이더의 단계와 활성화된 영역을 표시합니다.


int volume_sound_sound_manager_step_get(sound_type_e type)
{
    _D("volume sound manager step get");
    int ret = -1, step = 0;

    ret = sound_manager_get_max_volume(type, &step);
    retvm_if(ret < 0, -1, "Failed to get step");

    sound_info.sound_step = step;

    return step;
}

int volume_sound_sound_manager_volume_get(sound_type_e type)
{
    int ret = -1, val = 0;
    ret = sound_manager_get_volume(type, &val);
    retvm_if(ret < 0, -1, "Failed to get volume");
    return val;
}


위의 volume_sound_sound_manager_step_get()에서,

sound_manager_get_max_volume()을 이용하여 전체 단계를 얻고 있네요.

그리고 volume_sound_sound_manager_volume_get()에서,

sound_manager_get_volume()으로 현재 단계를 얻고 있습니다.


그리고 sound_manager_set_volume()으로 현재 설정된 사운드 타입의 볼륨을 조절합니다.

sound_manager_set_volume_changed_cb()으로 등록한 콜백에서는 볼륨이 변할때마다,

화면을 다시 그리고 볼륨값을 관리하고 있네요.

이 부분 소스는 따로 언급하지 않겠습니다.


사실 sound manager의 볼륨 API에는 낯선 함수가 하나 있습니다.

sound_manager_unset_current_sound_type() 함수인데요,

이 함수는 sound_manager_set_current_sound_type()과 짝을 이루는 함수입니다.

set이 있으니 당연히 unset도 존재하는 것이지요.

하지만, 플랫폼에서는 위 함수를 사용하는 부분을 찾지 못했습니다.


볼륨앱의 경우,

sound_manager_get_current_sound_type()으로 현재 사운드타입을 얻어서 볼륨을 조절하는데요,

위의 unset 함수를 누군가 사용한다면 current sound type을 못 가져오겠지요.

물론 볼륨앱은 예외처리는 되어 있습니다만,

실제 유저시나리오 중에 unset이 필요한 경우가 있는지 모르겠습니다.

볼륨키를 컨트롤하려면 어느 상황에서나 사운드타입이 결정되어 있어야 하지 않나 싶기도 하네요.

(이 부분은 제 지식이 짧아서 좀 더 알아봐야겠습니다)


이것으로 볼륨 관련 포스팅은 마치겠습니다.

다음 포스팅은 좀 더 흥미로운 부분을 다뤄보도록 하겠습니다.


그럼 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__SOUND__MANAGER__VOLUME__MODULE.html

https://developer.tizen.org/community/code-snippet/native-code-snippet/set-volume-level?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/track-volume-changes?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/get-maximum-volume-level-given-sound-type.?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/get-current-volume-level?tab=all

+ Recent posts