본문 바로가기

IT/Tizen

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


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


지난 포스팅에서는 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