[ 
https://issues.apache.org/jira/browse/CB-11369?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

dw1 updated CB-11369:
---------------------
    Description: 
Any sound file that has an ANDROID_LOOP=true exif header, such as many of the 
/system/media/audio files included with Lollipop, will always loop forever even 
if only expected to play once via the media plugin. This can lead to having to 
shut down an app to stop the sound. The plugin should ignore the header and 
play the sound once unless using the plugin loop feature, as expected.

My workaround: http://pastebin.com/raw/Q9kCriab

  was:
Any sound file that has an ANDROID_LOOP=true exif header, such as many of the 
/system/media/audio files included with Lollipop, will always loop forever even 
if only expected to play once via the media plugin. This can lead to having to 
shut down an app to stop the sound. The plugin should ignore the header and 
play the sound once unless using the plugin loop feature, as expected.

My workaround in an app that allows choosing of system sounds that may or may 
not have ANDROID_LOOP=true set involves checking the file and making a note as 
follows:

                        window.resolveLocalFileSystemURL($('#soundfile').val(), 
function(entry){
                                console.log('got file entry=',entry);
                                entry.file(function(file){
                                        var reader = new FileReader(); 
                                        reader.onload = function(e) {
                                                this.result = 
this.result.substr(0,1024);
                                                
if(this.result.toLowerCase().indexOf("android_loop=true")>0){
                                                        
console.log("ANDROID_LOOP=true detected!");
                                                        
settings.alarm_looper=true;
                                                } else 
if(settings.hasOwnProperty('alarm_looper')) delete settings.alarm_looper;
                                                // async, so..
                                                
play_sound($('#soundfile').val());
                                                
localStorage.setItem('settings',JSON.stringify(settings));
                                        }
                                        reader.readAsText(file);
                                });
                        }, function(e){
                                console.log('failed to get file e=',e);
                                if(settings.hasOwnProperty('alarm_looper')) 
delete settings.alarm_looper;
                        });

Then I use a setInterval that detects duration to play the sound:

        sound_start=new Date().getTime();
        media1.play({ numberOfLoops: 1 });
        // hack for bug where files with ANDROID_LOOP=true always loop
        if(settings.alarm_looper){
                sound_end=null;
                if(!handle.hasOwnProperty('media')) 
handle.media=setInterval(function(){
                        // wait until media gives us the duration..
                        if(media1._duration==-1){
                                console.log('media1._duration=-1, interval 
return');
                                return;
                        } else if(sound_end===null) 
sound_end=Math.round(sound_start+(media1._duration*1000)-40);
                        
                        var now=new Date().getTime();
                        if(now>=sound_end){
                                console.log('now>=sound_end 
'+now+'>='+sound_end+' killing media');
                                if(media1!=null) media1.release();
                                if(handle.hasOwnProperty('media')){
                                        clearInterval(handle.media);
                                        delete handle.media;
                                }
                                sound_end=null;
                        }
                }, 50);
        }


> Media Plugin: Ignore ANDROID_LOOP exif header
> ---------------------------------------------
>
>                 Key: CB-11369
>                 URL: https://issues.apache.org/jira/browse/CB-11369
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android, Plugin Media
>            Reporter: dw1
>
> Any sound file that has an ANDROID_LOOP=true exif header, such as many of the 
> /system/media/audio files included with Lollipop, will always loop forever 
> even if only expected to play once via the media plugin. This can lead to 
> having to shut down an app to stop the sound. The plugin should ignore the 
> header and play the sound once unless using the plugin loop feature, as 
> expected.
> My workaround: http://pastebin.com/raw/Q9kCriab



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to