IT/Tizen2015.11.28 18:00


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


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

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

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


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

Posted by 타이젠 개발자, 윤진