{ "id": "168684", "key": "TIMOB-24909", "fields": { "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20238", "description": "", "name": "Release 7.5.0", "archived": false, "released": true, "releaseDate": "2018-11-15" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2018-07-28T17:39:38.000+0000", "created": "2017-06-29T19:44:04.000+0000", "priority": { "name": "High", "id": "2" }, "labels": [ "audioplayer", "demo_app" ], "versions": [], "issuelinks": [ { "id": "56348", "type": { "id": "10002", "name": "Duplicate", "inward": "is duplicated by", "outward": "duplicates" }, "inwardIssue": { "id": "171223", "key": "AC-5636", "fields": { "summary": "iOS AudioPlayer setTime is not available but it's very useful", "status": { "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.", "name": "Resolved", "id": "5", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } }, { "id": "55314", "type": { "id": "10122", "name": "Gantt: start-finish", "inward": "is triggered by", "outward": "is triggering" }, "inwardIssue": { "id": "132365", "key": "TIMOB-19519", "fields": { "summary": "iOS - Ti.Media.AudioPlayer - error after sleep/wake", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Critical", "id": "1" }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } }, { "id": "55315", "type": { "id": "10122", "name": "Gantt: start-finish", "inward": "is triggered by", "outward": "is triggering" }, "inwardIssue": { "id": "64007", "key": "TIMOB-3375", "fields": { "summary": "TiAPI: Implement several missing Ti.Media.AudioPlayer features", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false } } } }, { "id": "56675", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "outwardIssue": { "id": "171903", "key": "TIMOB-26196", "fields": { "summary": "iOS: Move Ti.Media microphone related APIs to AVAudioRecorder and remove 3rd-party library", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false } } } } ], "assignee": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "updated": "2018-10-10T12:48:38.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10206", "name": "iOS", "description": "iOS Platform" } ], "description": "Right now, we use the (outdated and unmaintained) iOS library \"AudioStreamer\" for our Ti.Media.AudioPlayer API. Nowadays, modern iOS API's help us, especially the {{AVPlayer}} inside {{AVFoundation}}. This will also resolve a number of tickets with a high numbers of watchers:\r\n- TIMOB-19519\r\n- TIMOB-3375\r\n\r\nThe time-frame should be around SDK release 7.1.0 / 7.2.0 with 100 % backwards-compatibility.\r\n\r\nSee the [Ti.Media.AudioPlayer|http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Media.AudioPlayer] docs for more infos.\r\n", "attachment": [ { "id": "63961", "filename": "sample.mp3", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-01-15T08:28:03.000+0000", "size": 37596, "mimeType": "audio/mp3" } ], "flagged": false, "summary": "iOS: Move Ti.Media.AudioPlayer to AVPlayer internally, remove external library-dependency", "creator": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "subtasks": [], "reporter": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "environment": null, "closedSprints": [ { "id": 1028, "state": "closed", "name": "2018 Sprint 09 SDK", "startDate": "2018-04-22T22:53:08.928Z", "endDate": "2018-05-06T22:53:00.000Z", "completeDate": "2018-05-07T00:02:15.883Z", "originBoardId": 114 }, { "id": 1045, "state": "closed", "name": "2018 Sprint 13 SDK", "startDate": "2018-06-17T20:47:13.621Z", "endDate": "2018-07-01T20:47:00.000Z", "completeDate": "2018-07-02T18:40:05.029Z", "originBoardId": 114 }, { "id": 1018, "state": "closed", "name": "2018 Sprint 07 SDK", "startDate": "2018-03-25T21:59:36.637Z", "endDate": "2018-04-08T21:59:00.000Z", "completeDate": "2018-04-08T17:55:14.467Z", "originBoardId": 114 }, { "id": 1034, "state": "closed", "name": "2018 Sprint 10 SDK", "startDate": "2018-05-07T00:03:21.636Z", "endDate": "2018-05-21T00:03:00.000Z", "completeDate": "2018-05-20T20:54:58.928Z", "originBoardId": 114 }, { "id": 1050, "state": "closed", "name": "2018 Sprint 14 SDK", "startDate": "2018-07-01T18:40:57.193Z", "endDate": "2018-07-15T18:40:00.000Z", "completeDate": "2018-07-16T03:27:08.720Z", "originBoardId": 114 }, { "id": 1035, "state": "closed", "name": "2018 Sprint 11 SDK", "startDate": "2018-05-20T20:57:43.542Z", "endDate": "2018-06-03T20:57:00.000Z", "completeDate": "2018-06-04T15:13:14.425Z", "originBoardId": 114 }, { "id": 1021, "state": "closed", "name": "2018 Sprint 08 SDK", "startDate": "2018-04-08T17:57:36.122Z", "endDate": "2018-04-22T17:57:00.000Z", "completeDate": "2018-04-22T22:51:19.120Z", "originBoardId": 114 }, { "id": 1053, "state": "closed", "name": "2018 Sprint 15 SDK", "startDate": "2018-07-15T21:52:05.453Z", "endDate": "2018-07-29T21:52:00.000Z", "completeDate": "2018-07-29T22:25:11.723Z", "originBoardId": 114 }, { "id": 1039, "state": "closed", "name": "2018 Sprint 12 SDK", "startDate": "2018-06-03T15:22:23.401Z", "endDate": "2018-06-17T15:22:00.000Z", "completeDate": "2018-06-18T20:45:36.363Z", "originBoardId": 114 }, { "id": 1008, "state": "closed", "name": "2018 Sprint 06 SDK", "startDate": "2018-03-11T22:18:04.396Z", "endDate": "2018-03-25T22:18:00.000Z", "completeDate": "2018-03-25T21:52:36.683Z", "originBoardId": 216 } ], "comment": { "comments": [ { "id": "433126", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "I must admit I gave up on this and implemented by own player in Hyperloop using AVPlayer. It works quite well but for not being able to implement any kind of listeners to get feedback from the the player. AVPlayer has no delegate and Apple expect us to use KVO, but nobody has been able to tell me how to do that it Hyperloop! I ended up using a 3 second setInterval to poll the player's 'timeControlStatus' property. So a new version of Ti.Media.AudioPlayer using AVPlayer with player monitoring would be good!", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-01-13T21:03:22.000+0000", "updated": "2018-01-13T21:03:22.000+0000" }, { "id": "433134", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "PR: https://github.com/appcelerator/titanium_mobile/pull/9732\r\n\r\nTest-Cases:\r\n\r\n*#1: Remote file, some events*\r\n{code:js}\r\nvar win = Ti.UI.createWindow({\r\n title: 'Audio Test',\r\n backgroundColor: '#fff',\r\n layout: 'vertical'\r\n});\r\n\r\nvar startStopButton = Ti.UI.createButton({\r\n title: 'Start/Stop Streaming',\r\n top: 10,\r\n});\r\n\r\nvar pauseResumeButton = Ti.UI.createButton({\r\n title: 'Pause/Resume Streaming',\r\n top: 10,\r\n enabled: false\r\n});\r\n\r\nvar changeURLButton = Ti.UI.createButton({\r\n title: 'Change URL',\r\n top: 10\r\n});\r\n\r\nwin.add(startStopButton);\r\nwin.add(pauseResumeButton);\r\nwin.add(changeURLButton);\r\n\r\n// allowBackground: true on Android allows the\r\n// player to keep playing when the app is in the\r\n// background.\r\nvar audioPlayer = Ti.Media.createAudioPlayer({\r\n url: 'http://www.noiseaddicts.com/samples_1w72b820/13.mp3',\r\n allowBackground: true\r\n});\r\n\r\nstartStopButton.addEventListener('click',function() {\r\n // When paused, playing returns false.\r\n // If both are false, playback is stopped.\r\n if (audioPlayer.playing || audioPlayer.paused) {\r\n audioPlayer.stop();\r\n pauseResumeButton.enabled = false;\r\n if (Ti.Platform.name === 'android')\r\n {\r\n audioPlayer.release();\r\n }\r\n } else {\r\n audioPlayer.start();\r\n pauseResumeButton.enabled = true;\r\n }\r\n});\r\n\r\npauseResumeButton.addEventListener('click', function() {\r\n if (audioPlayer.paused) {\r\n audioPlayer.start();\r\n } else {\r\n audioPlayer.pause();\r\n }\r\n});\r\n\r\nchangeURLButton.addEventListener('click', function() {\r\n audioPlayer.setUrl('sample.mp3');\r\n});\r\n\r\naudioPlayer.addEventListener('progress', function(e) {\r\n Ti.API.info('Time Played: ' + Math.round(e.progress) + ' milliseconds');\r\n});\r\n\r\naudioPlayer.addEventListener('change', function(e) {\r\n Ti.API.info('State: ' + e.description + ' (' + e.state + ')');\r\n});\r\n\r\nwin.addEventListener('close',function() {\r\n audioPlayer.stop();\r\n if (Ti.Platform.osname === 'android')\r\n {\r\n audioPlayer.release();\r\n }\r\n});\r\n\r\nwin.open();\r\n{code}\r\n\r\n*#2: Real time radio streams*:\r\n{code:js}\r\nvar win = Ti.UI.createWindow({\r\n title: 'Audio Test',\r\n backgroundColor: '#fff',\r\n layout: 'vertical'\r\n});\r\n\r\nvar startStopButton = Ti.UI.createButton({\r\n title: 'Start/Stop Streaming',\r\n top: 10,\r\n width: 200,\r\n height: 40\r\n});\r\n\r\nvar pauseResumeButton = Ti.UI.createButton({\r\n title: 'Pause/Resume Streaming',\r\n top: 10,\r\n width: 200,\r\n height: 40,\r\n enabled: false\r\n});\r\n\r\nwin.add(startStopButton);\r\nwin.add(pauseResumeButton);\r\n\r\nvar audioPlayer = Ti.Media.createAudioPlayer({\r\n url: 'http://ca2.rcast.net:8044/'\r\n});\r\n\r\nstartStopButton.addEventListener('click',function() {\r\n // When paused, playing returns false.\r\n // If both are false, playback is stopped.\r\n Ti.API.info('PLAYING = ' + audioPlayer.playing);\r\n Ti.API.info('PAUSED = ' + audioPlayer.paused);\r\n\r\n if (audioPlayer.playing || audioPlayer.paused) {\r\n audioPlayer.stop();\r\n pauseResumeButton.enabled = false;\r\n } else {\r\n audioPlayer.start();\r\n pauseResumeButton.enabled = true;\r\n }\r\n});\r\n\r\npauseResumeButton.addEventListener('click', function() {\r\n Ti.API.info('PLAYING = ' + audioPlayer.playing);\r\n Ti.API.info('PAUSED = ' + audioPlayer.paused);\r\n\r\n if (audioPlayer.paused) {\r\n audioPlayer.start();\r\n } else {\r\n audioPlayer.pause();\r\n }\r\n});\r\n\r\naudioPlayer.addEventListener('progress', function(e) {\r\n Ti.API.info('Time Played: ' + Math.round(e.progress) + ' milliseconds');\r\n});\r\n\r\naudioPlayer.addEventListener('change', function(e) {\r\n Ti.API.info('State: ' + e.description + ' (' + e.state + ')');\r\n});\r\n\r\naudioPlayer.addEventListener('metadata', function(e) {\r\n Ti.API.info(e);\r\n});\r\n\r\nwin.addEventListener('close',function() {\r\n audioPlayer.stop();\r\n});\r\n\r\nwin.open();\r\n{code}", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-01-14T14:20:25.000+0000", "updated": "2018-04-03T13:00:06.000+0000" }, { "id": "436219", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "For the watchers of this ticket: Now is the chance to propose API's that could be added with AVPlayer. Let me know if there are specific functionalities being useful for the general developer.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-04-03T11:35:03.000+0000", "updated": "2018-04-03T11:35:03.000+0000" }, { "id": "436220", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "Thanks for reaching out Hans. For me, as I am using AudioPlayer for radio streaming, being able to picked timedMetadata for the playing artist & title is important. In fact so much so that I have written my own module using AVPlayer (which I am still testing). But as you are way ahead of me on the Objective-C skills I am happy to use the updated official Appcelerator AudioPlayer API when it is released. \r\n\r\nHave you any rough idea of when SKD 7.2.0 is likely to happen?\r\n\r\nCheers.", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-04-03T11:56:51.000+0000", "updated": "2018-04-03T11:56:51.000+0000" }, { "id": "436222", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Thanks [~patrickmounteney]. The {{timedMetadata}} API is huge. What API's from there are relevant? Only the value of each item in the array?\r\n\r\n*EDIT*: Looks like key, keySpace, value & extraAttributes are pretty powerful already (some debug output from Xcode):\r\n{code}\r\n(lldb) po playerItem.timedMetadata\r\n<__NSArrayI 0x7f8898e4afe0>(\r\n,\r\n\r\n)\r\n(lldb) po (AVMetadataItem *)playerItem.timedMetadata[0]\r\n\r\n\r\n(lldb) po [(AVMetadataItem *)playerItem.timedMetadata[0] key]\r\ntitle\r\n\r\n(lldb) po [(AVMetadataItem *)playerItem.timedMetadata[0] value]\r\nLar Wolkan - Too Much of Not Enough\r\n\r\n(lldb) po [(AVMetadataItem *)playerItem.timedMetadata[0] keySpace]\r\ncomn\r\n\r\n(lldb) po [(AVMetadataItem *)playerItem.timedMetadata[0] extraAttributes]\r\n{\r\n}\r\n{code}\r\nMapped into a Titanium event:\r\n{code}\r\nitems = (\r\n {\r\n extraAttributes = {\r\n };\r\n key = title;\r\n keySpace = comn;\r\n value = \"Pops Staples - Somebody Was Watching\";\r\n },\r\n {\r\n extraAttributes = {\r\n };\r\n key = publisher;\r\n keySpace = comn;\r\n value = t;\r\n }\r\n );\r\n source = \"[object TiMediaAudioPlayer]\";\r\n type = metadata;\r\n{code}\r\nUsing a new {{metadata}} event. Timeline for 7.2.0 is over the next few months, but you can use the pull request and patch your 7.x SDK today.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-04-03T12:23:15.000+0000", "updated": "2018-04-03T12:38:00.000+0000" }, { "id": "436224", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "All I am doing is sticking a listener on the playerItem as per:\r\n\r\n{code}[playerItem addObserver:self forKeyPath:@\"timedMetadata\" options:NSKeyValueObservingOptionNew context:nil];{code}\r\n\r\nand picking it up in 'observeValueForKeyPath' like this:\r\n\r\n{code}if ([keyPath isEqualToString:@\"timedMetadata\"]) {\r\n //NSLog(@\"[INFO] timedMetadata changed\");\r\n AVPlayerItem* playerItem = object;\r\n for (AVMetadataItem* metadata in playerItem.timedMetadata) {\r\n [self fireEvent:@\"metadata\" withObject:@{@\"title\": metadata.stringValue}]; // fire back to host app\r\n }\r\n }{code}\r\n\r\nBut I have not worked with Objective-C much and I expect there is a better way to do it.\r\nSorry - how does one get code to appear as you have it in a nice box?", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-04-03T12:41:12.000+0000", "updated": "2018-04-03T13:08:38.000+0000" }, { "id": "436225", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Use the {{\\{code\\}}} tags for that (or select from the \"+\" at the right).\r\n\r\nI've just pushed [this commit|https://github.com/appcelerator/titanium_mobile/pull/9732/commits/94b748ccdfbdedae943b94616bdeac9b78acbe76] that adds the {{metadata}} event as part of the main [pull request|https://github.com/appcelerator/titanium_mobile/pull/9732]. Try it out!", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-04-03T12:58:33.000+0000", "updated": "2018-04-03T12:58:33.000+0000" }, { "id": "436226", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "That's great Hans. I'll have a look when I have a moment.", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-04-03T13:10:55.000+0000", "updated": "2018-04-03T13:10:55.000+0000" }, { "id": "436278", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "Another useful addition would be to make Ti.Media.AudioPlayer work with the iOS MPNowPlayingInfoCenter and the lockscreen. Something I have been unable to do in my little module. There is an existing module for this (by Foddy), but I don't think it is able to update in the background.", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-04-04T13:21:23.000+0000", "updated": "2018-04-04T13:21:23.000+0000" }, { "id": "437246", "author": { "name": "topener", "key": "topener", "displayName": "Rene Pot", "active": true, "timeZone": "Europe/Berlin" }, "body": "[~patrickmounteney] that would be the {{Ti.Media.MusicPlayer}}, not the audioPlayer.", "updateAuthor": { "name": "topener", "key": "topener", "displayName": "Rene Pot", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-05-01T12:08:50.000+0000", "updated": "2018-05-01T12:08:50.000+0000" }, { "id": "437289", "author": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "body": "Well, in my DIY module I am using MPNowPlayingInfoCenter as per:\r\n\r\n{code}MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];\r\n [infoCenter setNowPlayingInfo:@{MPMediaItemPropertyTitle:title, MPMediaItemPropertyArtist:artist}];{code}\r\n\r\nThe the title and artist are obtained from AVPlayerItem's timedMetadata. And that does seem to update the lock screen whilst the player is in the background.", "updateAuthor": { "name": "patrickmounteney", "key": "patrickmounteney", "displayName": "Patrick Mounteney", "active": true, "timeZone": "Europe/London" }, "created": "2018-05-02T16:24:00.000+0000", "updated": "2018-05-02T16:24:00.000+0000" }, { "id": "437297", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "[~patrickmounteney] The initial implementation has been finished already, so new features won't slip into the core change of the API at this time. But you could use Hyperloop easily for this, even today already:\r\n{code:js}\r\nvar MPNowPlayingInfoCenter = require('MediaPlayer/MPNowPlayingInfoCenter');\r\nvar MediaPlayer = require('MediaPlayer/MediaPlayer');\r\nvar MPMediaItemPropertyTitle = MediaPlayer.MPMediaItemPropertyTitle;\r\nvar MPMediaItemPropertyArtist = MediaPlayer.MPMediaItemPropertyArtist;\r\n\r\n// ES 6+, Hyperloop 3.1.0+\r\n// import { MPNowPlayingInfoCenter, MediaPlayer } from 'MediaPlayer';\r\n\r\nMPNowPlayingInfoCenter.defaultCenter. setNowPlayingInfo({\r\n MPMediaItemPropertyTitle: 'My Title', \r\n MPMediaItemPropertyArtist:'My Artist'\r\n});\r\n{code}\r\nEventually, the JavaScript {{Object}} object needs to be mapped to a native {{NSDictionary}}, but it could even work like this already.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-05-02T17:20:21.000+0000", "updated": "2018-05-02T17:20:21.000+0000" }, { "id": "442484", "author": { "name": "smohammed", "key": "smohammed", "displayName": "Samir Mohammed", "active": true, "timeZone": "America/Los_Angeles" }, "body": "*Closing ticket.* Verified improvement on SDK Version {{7.5.0.v20181008124804}}.\r\n\r\n*FR Passed (Test Steps)*\r\n# Created a new Titanium application \r\n# Added the first test case mentioned above in to the {{app.js}}\r\n# Ran the program\r\n# Started stream and was able to hear sound\r\n# Pressed {{stop}} and sound was stopped \r\n# Also able to pause and resume using the {{pause/resume stream}} button\r\n# Pressed {{Change URL}}\r\n# URL was changed and local file started to play\r\n# Backgrounded the application and sound was still playing\r\n# Above steps were also used for the second test case (Real time audio streams)\r\n\r\n*Test Environment*\r\n{code:java}\r\nAPPC Studio: 5.1.0.201808080937\r\niPhone 6 Sim (12.0)\r\nAPPC CLI: 7.0.7-master.4\r\nOperating System Name: Mac OS Mojave\r\nOperating System Version: 10.14\r\nNode.js Version: 8.9.1\r\nXcode 10.0\r\n{code}\r\n", "updateAuthor": { "name": "smohammed", "key": "smohammed", "displayName": "Samir Mohammed", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-10-10T12:48:25.000+0000", "updated": "2018-10-10T12:48:25.000+0000" } ], "maxResults": 14, "total": 14, "startAt": 0 } } }