Skip to content

Commit 39dcdea

Browse files
author
Ariel Faur
committed
use multiple promises $q to get media duration and position
v1.0.1
1 parent 9338b45 commit 39dcdea

File tree

5 files changed

+68
-35
lines changed

5 files changed

+68
-35
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
## v1.0.1
2+
3+
- Use multiple promises for playback, track position and duration
4+
- Module is now independent from ngCordova and lives in its own namespace
5+
6+
## v1.0.0
7+
8+
- First release

README.md

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,49 @@ media duration and position. It does so by using the `notify` method of the Defe
1515
<script src="js/cordovaMedia2.js"></script>
1616
```
1717

18-
## Inject `ngCordova` in your app's module
18+
## Inject `ngCordova.plugins.media2` in your app's module
1919

20-
`angular.module('app', ['ionic', 'ngCordova'])`
20+
`angular.module('app', ['ionic', 'ngCordova', 'ngCordova.plugins.media2'])`
2121

2222
## Inject `$cordovaMedia2` in your controller:
2323

2424
```
2525
controller('MusicCtrl', ['$scope', '$cordovaMedia2', function($scope, $cordovaMedia2) {
26+
var media;
27+
28+
document.addEventListener("deviceready", function() {
29+
media = $cordovaMedia2.newMedia($scope.tracks[0].url);
30+
}, false);
31+
2632
$scope.playSomething = function() {
27-
var url = 'song.mp3';
28-
var media = $cordovaMedia2.newMedia(url);
33+
media.getDuration().then(function(duration) {
34+
console.log('media duration: ' + duration);
35+
});
36+
37+
media.getCurrentPosition().then(function() {
38+
console.log('finished playback')
39+
}, null, function(position) {
40+
console.log('position ' + position)
41+
});
2942
3043
media.play().then(function() {
3144
// success
3245
console.log('finished playback');
33-
media.release();
34-
}, function (err) {
35-
// error
36-
console.error(JSON.stringify(err));
37-
}, function(data) {
38-
// here we get progress in a JSON object
39-
// {status: 0, position: 55, duration: 125} }
40-
41-
console.log(JSON.stringify(data));
46+
}, null, function(status) {
47+
console.log('status: ' + status);
4248
});
43-
}
49+
};
50+
51+
$scope.pauseSomething = function() {
52+
media.pause();
53+
};
54+
55+
$scope.stopSomething = function() {
56+
media.stop();
57+
};
58+
59+
$scope.$on('destroy', function() {
60+
media.release();
61+
});
4462
}])
4563
```

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "cordovaMedia2",
33
"main": "cordovaMedia2.js",
4-
"version": "1.0.0",
4+
"version": "1.0.1",
55
"description": "A rewrite of the $cordovaMedia class (ngCordova) that properly reports media position and duration using Promises",
66
"devDependencies": {
77
"angular": "~1.3.15"

cordovaMedia2.js

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
/**
2-
* A rewrite of the $cordovaMedia class (ngCordova) that properly reports media position and duration using Promises
2+
* A rewrite of the Media class from ngCordova that properly reports media position and duration using Promises
33
*
44
* Author: Ariel Faur
5-
* Version 1.0.0
6-
* Date 26/05/2015.
5+
* Version 1.0.1
6+
* Date 27/05/2015
77
*/
88

99
// install : cordova plugin add org.apache.cordova.media
1010
// link : https://github.com/apache/cordova-plugin-media
1111

12-
angular.module('ngCordova.plugins.media', [])
12+
angular.module('ngCordova.plugins.media2', [])
1313

1414
.service('NewMedia', ['$q', '$interval', function ($q, $interval) {
15-
var q, mediaStatus = null, mediaPosition = -1, mediaTimer, mediaDuration = -1;
15+
var q = {}, mediaStatus = null, mediaPosition = -1, mediaTimer, mediaDuration = -1;
1616

1717
function setTimer(media) {
1818
mediaTimer = $interval(function () {
1919
if (mediaDuration < 0) {
2020
mediaDuration = media.getDuration();
21+
if (q.duration && mediaDuration > 0) q.duration.resolve(mediaDuration);
2122
}
2223

2324
media.getCurrentPosition(
@@ -32,9 +33,8 @@ angular.module('ngCordova.plugins.media', [])
3233
console.log("Error getting pos=" + e);
3334
});
3435

35-
if (angular.isDefined(q)) {
36-
q.notify({status: mediaStatus, position: mediaPosition, duration: mediaDuration});
37-
}
36+
if (q.position) q.position.notify(mediaPosition);
37+
3838
}, 1000);
3939
}
4040

@@ -55,37 +55,44 @@ angular.module('ngCordova.plugins.media', [])
5555
function (success) {
5656
clearTimer();
5757
resetValues();
58-
if (angular.isDefined(q)) {
59-
q.resolve(success);
60-
}
58+
q.playback.resolve(success);
59+
q.position.resolve(success);
6160
}, function (error) {
6261
clearTimer();
6362
resetValues();
64-
if (angular.isDefined(q)) {
65-
q.reject(error);
66-
}
63+
q.playback.reject(error);
64+
q.position.reject(error);
6765
}, function (status) {
6866
mediaStatus = status;
69-
if (angular.isDefined(q)) {
70-
q.notify({status: mediaStatus, position: mediaPosition, duration: mediaDuration});
71-
}
67+
q.playback.notify(mediaStatus);
7268
});
7369
}
7470

71+
NewMedia.prototype.getCurrentPosition = function () {
72+
q.position = $q.defer();
73+
return q.position.promise;
74+
};
75+
76+
NewMedia.prototype.getDuration = function () {
77+
q.duration = $q.defer();
78+
return q.duration.promise;
79+
};
80+
7581
// iOS quirks :
7682
// - myMedia.play({ numberOfLoops: 2 }) -> looping
7783
// - myMedia.play({ playAudioWhenScreenIsLocked : false })
7884
NewMedia.prototype.play = function (options) {
79-
q = $q.defer();
85+
q.playback = $q.defer();
8086

8187
if (typeof options !== "object") {
8288
options = {};
8389
}
90+
8491
this.media.play(options);
8592

8693
setTimer(this.media);
8794

88-
return q.promise;
95+
return q.playback.promise;
8996
};
9097

9198
NewMedia.prototype.pause = function () {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cordovaMedia2",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "A rewrite of the $cordovaMedia class (ngCordova) that properly reports media position and duration using Promises",
55
"main": "cordovaMedia2.js",
66
"scripts": {

0 commit comments

Comments
 (0)