Class for playing sound using local file or scripted data.

Class for playing sound using local file or scripted data.

1. Class definition

========================================================

function SoundPlayer(scriptNameForSounds) {

    LL.bindClass(‘java.io.File’);

    LL.bindClass(‘java.io.FileInputStream’);            

    LL.bindClass(‘java.io.FileOutputStream’);

    LL.bindClass(‘android.os.Environment’);

    LL.bindClass(‘android.media.MediaPlayer’);

    LL.bindClass(‘android.util.Base64’);

    

    this.SCRIPT_NAME_FOR_SOUNDS = scriptNameForSounds;

    this.PATH_SOUNDS = Environment.getExternalStorageDirectory() + ‘/LightningLauncher/Sounds’;

    

    new File(this.PATH_SOUNDS).mkdir();

    

    // Use one MediaPlayer for several instance of SoundPlayer.

    if (self.mediaPlayer) {

        this.mediaPlayer = self.mediaPlayer;

    }

    else {

        this.mediaPlayer = self.mediaPlayer = new MediaPlayer();

    }

    SoundPlayer.prototype.play = function(name) {

        try {

            if (!name) {

                throw ‘Error(SoundPlayer.play): No sound name entered.’;

            }

            var soundFile = new File(this.PATH_SOUNDS, name);

            if (!soundFile.exists() || soundFile.length() == 0) {

                if (!this.SCRIPT_NAME_FOR_SOUNDS) {

                    return; // No script for sounds and no file in folder, just exit.

                }

                

                var scriptSounds = LL.getScriptByName(this.SCRIPT_NAME_FOR_SOUNDS);

                if (!scriptSounds) { throw ‘Error(SoundPlayer.play): No ‘ + this.SCRIPT_NAME_FOR_SOUNDS + ‘ script’; }            

                

                var sounds = eval(scriptSounds.getText());

                if (!sounds[name]) { throw ‘Error(SoundPlayer.play): No ‘ + name + ‘ in ‘ + this.SCRIPT_NAME_FOR_SOUNDS + ‘ script’; }

                

                var fos = new FileOutputStream(soundFile);

                fos.write(Base64.decode(sounds[name], Base64.DEFAULT));

                fos.close();            

            }

            var mp = this.mediaPlayer;

            mp.reset();

            mp.setDataSource(new FileInputStream(soundFile).getFD());

            mp.prepare();

            mp.start();    

        }

        catch(e) {

            // for debug. normally ignore all errors/exceptions silently.

            // Android.makeNewToast(e, true).show();

        }        

    }

}

========================================================

2. How to play local sound file (for normal end users)

– Place any sound files under ~LightningLauncher/Sounds folder.

In your script,

var player = new SoundPlayer();

player.play(‘click1.mp3’);  // plays ~LL…/Sounds/click1.mp3

========================================================

3. How to play scripted sound file (for developers who want to distribute their own sound clips or open-sourced ones within scripts)

– Prepare sound clip.

– Encode it to MP3, or OGG for a small size. I use http://media.io site.

– Encode MP3/OGG.. to base64 form I use http://base64-encoding.online-domain-tools.com

– Create and fill it with

// my_sounds_script_name

(function() {

  return {

    SOUND_NAME : ‘BASE64 String…’,

    ‘click2.mp3’ : ‘ZFSAACSD … =’,

    ‘click3.ogg’ : ‘DSDSW.ds … =’

  };

})();

You can embed as many as BASE64’ed sound clip in script.

In your script using sounds,

var player = new SoundPlayer(SOUND_SCRIPT_NAME);

player.play(SOUND_NAME); 

ie.

var player = new SoundPlayer(‘my_sounds_script_name’);

player.play(‘click1.mp3’); 

player.play(‘click3.ogg’);

// If ~LL…/Sounds/click1.mp3 exists, then play that file.

// If not, it creates ‘click1.mp3’ file using ‘s data, and then play that.

If you’ are to use sounds in several scripts, you had better cache SoundPlayer object, for example:

if (!self.mySoundPlayer) {

  self.mySoundPlayer = new SoundPlayer(‘my_sound_script’);

}

self.mySoundPlayer.play(‘click.mp3’);

========================================================

Using this method, you can use sound effects and distribute them only using LL’s script feature.

http://media.io
]]>

16 Commentsto Class for playing sound using local file or scripted data.

  1. Anonymous says:

    < ![CDATA[

    //==================================


    if (!self.mySoundPlayer) {


      self.mySoundPlayer = new SoundPlayer();


    }


    self.mySoundPlayer.play(‘click’);



    LL.getEvent().getItem().launch();


    // OR in some case


    LL.runScript(‘…’); // if an item has been assigned another ‘Run Script’ before.


    //==================================

    ]]>

  2. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 아이콘 클릭했을때 클릭음 재생을 하려고 알려주신 방법을 쓰려고 하는데..코드 이해가 잘 안되서요… 1. 클래스 정의는 무조건 해야 하나요?

    ]]>

  3. Anonymous says:

    < ![CDATA[

    HEEKWON LEE 네. 오래되서 가물하긴 한데, 데스크탑/폴더 등의 load 이벤트 스크립트에 클래스 정의 부분을 두시고, 필요한 곳 가령에서 2번 스크립트 예처럼 쓰시면 될겁니다. 물론 이 경우엔 매 아이템마다 탭 이벤트를 손수 지정해야하므로, 데탑 내 모든 아이템의 탭 마다 소리를 내려면 불편하겠죠. 특정한 경우에만 쓴다면 괜찮을테구요.



    마켓에 LL Windows7 템플릿이 있는데, 여기에 있는 스크립트를 이용하면, 한번에 모든 탭에 소리를 연결할수 있긴 합니다. 물론 자바스크립트와 LL Script를 조금 이해하시는 경우만, 설치되는 소스를 조금 보시고 응용하시면 될텐데,,, 초보시라면 조금 어려울수있구요.

    ]]>

  4. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 1번과 2번을 합쳐서 스크립트로 만든 후 아이콘 생성하여 스크립트를 연결하니 소리가 나는데 일단 성공했네요 ^^ 그런데 아니콘의 목적은 앱을 실행하는 건데 앱 연결과 스크립트 실행 둘다 적용이 안되네요.. 소리가 난 후 앱 실행이 안되는거 보면요. 제가 뭘 또 수정해줘야 할까요?

    ]]>

  5. Anonymous says:

    < ![CDATA[

    HEEKWON LEE 



    //==========================


    // 1. play sound.


    // player.play(…);


    //==========================


    // 2. launch its original shortcut action.


    var item = LL.getEvent().getItem();


    if (item.getType() == ‘Shortcut’) {


      item.launch();


    }


    //==========================



    소리 재생은, 다른 액션들처럼 엔드유저들이 쉽게 적용할 수 있는 단계가 아니라, LL Script API를 한번 일견하지 않으면, 별것아님에도 적응이 조금 어렵다 볼수 있습니다. 잘 판단하시고 사용하세요 ㅎㅎ

    ]]>

  6. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 일단 알려주신 방법으로 성공했네요…소리나면서 앱 실행도 일단 되는군요…API일견 해보겠습니다. sw문외한 이지만 이번 기회를 통해서 한번..도~~저어어언..

    ]]>

  7. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 오늘 적용해보니 아이콘은 되는데 folder는 또 안되더라구요 



    var item = LL.getEvent().getItem();


    if (item.getType() == ‘Shortcut’) {


      item.launch();



    shortcut 대신 folder를 쎃어도 안되네요..ㅜㅡ

    ]]>

  8. Anonymous says:

    < ![CDATA[

    var item = LL.getEvent().getItem();


    var type = item.getType();


    if (type == ‘Shortcut’) {


        item.launch();


    }


    else if (type == ‘Folder’) {


        if (item.isOpen()) {


          item.close();


        }


        else {


          item.open();


        }


    }


    //==========================

    ]]>

  9. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 감사합니다.덕분에 자동차에 버튼에 생기가^^ 1.5초 사운드 파일인데 재생할때 간헐적으로 짤리고 끝에만 들리는 듯한데 혹시 딜레이 같은걸 줘야 할까요?

    ]]>

  10. Anonymous says:

    < ![CDATA[

    HEEKWON LEE 딜레이로 될것 같진 않은데 시도는 해보시죠. 블투로 연결하면 더 그런건 특성상 어쩔수없다 보구요. 특히 짧은 사운드의 경우엔 더 그렇죠. 조금 더 해볼수 있는거라면, 사운드파일을 mp3보다는 wav나 ogg가 좀더 낫지 않았나..싶습니다. 

    ]]>

  11. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 네 지금 딜레이 펑션 함수를 찾고 있는데 어딜봐야 이런게 정리되어 있는건지 에구…초짜는 어룝네요 ㅎㅎ

    ]]>

  12. Anonymous says:

    < ![CDATA[

    HEEKWON LEE setTimeout(function() { // play… }, 1000); // 1초 후 play.

    ]]>

  13. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 지금 제가 알려주신걸 모두 차량용으로 사용하고 있습니다. Tasker도 함께요. 혹시 홈화면에서 일정시간동안 터치하지 않는다면 특정앱(스크린세이버: 시간/ 날씨정도 간단히 나타내는 앱을 찾고 있습니다.)을 실행 시킬 수 있는 스크립트가 있을까요? 아님 테스커엔 일정시간 터치 없음에 대한 기준을 홈하면에 둘순 없어서요(왜냐면 네비 안내도중 바뀌거나 할까봐요) 딱 홈화면에서만 적용되도록…

    ]]>

  14. Anonymous says:

    < ![CDATA[

    HEEKWON LEE 그런 스크립트가 있는지는 모르겠네요. 제가 만약 해본다면, 보통 네비앱들은 화면이 작동중일땐 화면이 꺼지지 않죠. 그러다 홈으로 나가면 설정에서 정한 display timeout에 걸려서, 그 시간이 지나면 화면이 꺼지겠죠. 그렇다면 태스커에서 display off를 이벤트로 잡아서 원하는 뭔가를 할수 있을것 같기도 합니다.(물론 원치않는 사이드이펙트가 생길 가능성도 있구요) 홈화면, 그러니까 LL에서만 작동하길 원한다면 스크립트를 짜서, 홈의 모든 아이템에 걸고.. 또 그걸 감시하는 스크립트가 주기적으로 돌면서 확인하고… 쉽지 않은 일 같습니다.

    ]]>

  15. Anonymous says:

    < ![CDATA[

    KyungJoon Lee 매번 도움 감사드립니다. 이번에 데스크탑 1, 2를 만들어서 시간베이스로 전환을 테스커로 하고 있는데… 1이 홈이고 2가 추가 화면이면 2로 바뀌었을때 “back” 버튼(폰/ 네비)을 누르면 홈으로 지정된 1번 화면으로 가더라구요…안 가게 막을 순 없을까요?

    ]]>

  16. Anonymous says:

    < ![CDATA[

    백키를 눌렀을때 화면(액티비티)가 이전께 나타나는것은 os가 관리하는 부분이니까, 그걸 우리가 터치할순 없을거 같구요. 다만 홈을 바꾼후에, LL restart를 실행해주면, 이전 액티비티 스택이 없어지고 새로 시작하니까 그때부턴 현재(new) 홈이 맨밑(처음) 액티비티가 될겁니다.



    아~ 그리고 죄송한데, 현재 본문글(사운드 재생)이랑 관계없는 내용이 계속 댓글 형식으로 달리는데, 그것보다는 포스트를 작성하시고 +(플러스)를 이용해 호출(?)하는 식으로 하시면 더 좋을것 같습니다…

    ]]>

Leave a Reply

Your email address will not be published. Required fields are marked *