Skip to content
This repository was archived by the owner on Oct 25, 2023. It is now read-only.

Commit 0a2b5fb

Browse files
committed
Make it work with recordjs
File is now encoded to Opus, like in other apps
1 parent b6fa42d commit 0a2b5fb

9 files changed

Lines changed: 345 additions & 89 deletions

File tree

‎app/index.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@
7878
<script type="text/javascript" src="vendor/ogv.js/ogv-decoder-audio-vorbis.js"></script>
7979
<script type="text/javascript" src="vendor/ogv.js/ogv-support.js"></script>
8080

81+
<script type="text/javascript" src="vendor/recorderjs/recorder.js"></script>
82+
8183
<script type="text/javascript" src="js/lib/utils.js"></script>
8284
<script type="text/javascript" src="js/lib/bin_utils.js"></script>
8385
<script type="text/javascript" src="js/lib/tl_utils.js"></script>

‎app/js/controllers.js‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,6 @@ angular.module('myApp.controllers', ['myApp.i18n'])
518518
skipped: false
519519
}
520520

521-
$scope.voiceRecorder = { time : '', recording : null, processing : false };
522-
523521
$scope.openSettings = function () {
524522
$modal.open({
525523
templateUrl: templateUrl('settings_modal'),

‎app/js/directives.js‎

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,7 @@ angular.module('myApp.directives', ['myApp.filters'])
15471547
}
15481548
})
15491549

1550-
.directive('mySendForm', function (_, $q, $timeout, $compile, $modalStack, $http, $interpolate, Storage, AppStickersManager, AppDocsManager, ErrorService, AppInlineBotsManager, FileManager, shouldFocusOnInteraction) {
1550+
.directive('mySendForm', function (_, $q, $timeout, $interval, $window, $compile, $modalStack, $http, $interpolate, Storage, AppStickersManager, AppDocsManager, ErrorService, AppInlineBotsManager, FileManager, shouldFocusOnInteraction) {
15511551
return {
15521552
link: link,
15531553
scope: {
@@ -1564,17 +1564,25 @@ angular.module('myApp.directives', ['myApp.filters'])
15641564
var fileSelects = $('input', element)
15651565
var dropbox = $('.im_send_dropbox_wrap', element)[0]
15661566
var messageFieldWrap = $('.im_send_field_wrap', element)[0]
1567+
var sendFieldPanel = $('.im_send_field_panel', element)[0]
15671568
var dragStarted
15681569
var dragTimeout
15691570
var submitBtn = $('.im_submit', element)[0]
1570-
var voiceRecord = $('.im_record', element);
1571+
var voiceRecordBtn = $('.im_record', element)[0]
15711572

15721573
var stickerImageCompiled = $compile('<a class="composer_sticker_btn" data-sticker="{{::document.id}}" my-load-sticker document="document" thumb="true" img-class="composer_sticker_image"></a>')
15731574
var cachedStickerImages = {}
15741575

1575-
var audioRecorder = null;
1576-
var audioPromise = null;
1577-
var audioStream = null;
1576+
var voiceRecorder = null
1577+
var voiceRecordSuccess = false
1578+
var voiceRecordSupported = Recorder.isRecordingSupported()
1579+
var voiceRecordDurationInterval = null
1580+
var voiceRecorderPromise = null
1581+
if (voiceRecordSupported) {
1582+
$(sendFieldPanel).addClass('im_record_supported')
1583+
}
1584+
1585+
$scope.voiceRecorder = {duration: 0, recording: false, processing: false}
15781586

15791587
var emojiTooltip = new EmojiTooltip(emojiButton, {
15801588
getStickers: function (callback) {
@@ -1688,82 +1696,82 @@ angular.module('myApp.directives', ['myApp.filters'])
16881696
})
16891697
})
16901698

1691-
navigator.getUserMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
1692-
1693-
voiceRecord.on('touchstart', function(e) {
1694-
if ($scope.$parent.$parent.voiceRecorder.processing) { return; }
1699+
$(voiceRecordBtn).on('contextmenu', cancelEvent)
16951700

1696-
navigator.getUserMedia({audio : true}, function(stream){
1697-
var start = Date.now();
1698-
var touch = null;
1699-
1700-
audioPromise = null;
1701-
audioStream = stream;
1702-
audioRecorder = new MediaRecorder(stream);
1703-
1704-
var interval = setInterval(function(){
1705-
var time = (new Date());
1701+
$(voiceRecordBtn).on('touchstart', function(e) {
1702+
if ($scope.voiceRecorder.processing) {
1703+
return
1704+
}
17061705

1707-
time.setTime(Date.now() - start);
1706+
voiceRecorderPromise = null
17081707

1709-
$scope.$apply(function(){
1710-
$scope.$parent.$parent.voiceRecorder.time = (time.getMinutes() < 10 ? '0' : '') + time.getMinutes() + ':' + (time.getSeconds() < 10 ? '0' : '') + time.getSeconds();
1711-
});
1712-
}, 1000);
1708+
voiceRecorder = new Recorder({
1709+
monitorGain: 0,
1710+
numberOfChannels: 1,
1711+
bitRate: 64000,
1712+
encoderSampleRate: 48000,
1713+
encoderPath: 'vendor/recorderjs/encoder_worker.js'
1714+
})
17131715

1714-
$scope.$apply(function(){
1715-
$scope.$parent.$parent.voiceRecorder.time = '00:00';
1716-
$scope.$parent.$parent.voiceRecorder.recording = interval;
1717-
});
1716+
voiceRecorder.addEventListener('start', function(e) {
1717+
var startTime = tsNow(true)
17181718

1719-
audioRecorder.start();
1719+
voiceRecordSuccess = false
17201720

1721-
console.log('recording now!');
1721+
voiceRecordDurationInterval = $interval(function() {
1722+
$scope.voiceRecorder.duration = tsNow(true) - startTime
1723+
}, 1000)
17221724

1723-
}, function(e){
1724-
console.error(e);
1725-
});
1726-
});
1725+
$scope.$apply(function() {
1726+
$scope.voiceRecorder.recording = true
1727+
})
17271728

1728-
voiceRecord.on('click', function(){
1729-
if (audioPromise) {
1730-
$scope.$parent.$parent.voiceRecorder.processing = true;
1729+
console.warn(dT(), 'recording now!')
1730+
})
17311731

1732-
audioPromise.then(function(e) {
1733-
var blob = e.data;
1732+
voiceRecorder.addEventListener('streamReady', function(e) {
1733+
voiceRecorder.start()
1734+
})
17341735

1735-
console.log(blob);
1736-
$scope.draftMessage.files = [blob];
1737-
$scope.draftMessage.isMedia = true;
1736+
voiceRecorder.initStream()
17381737

1739-
$scope.$parent.$parent.voiceRecorder.processing = false;
1738+
$($window).one('touchend', function() {
1739+
var deferred = $q.defer()
1740+
voiceRecorder.addEventListener('dataAvailable', function(e) {
1741+
var blob = blobConstruct([e.detail], 'audio/ogg')
1742+
deferred.resolve(blob)
1743+
})
1744+
voiceRecorderPromise = deferred.promise
1745+
voiceRecorder.stop()
17401746

1741-
audioPromise = null;
1742-
});
1743-
}
1744-
});
1747+
$interval.cancel(voiceRecordDurationInterval)
17451748

1746-
$($window).on('touchend', function(){
1747-
if (audioStream && audioRecorder) {
1748-
audioPromise = new Promise(function(resolve) {
1749-
audioRecorder.ondataavailable = resolve;
1750-
});
1749+
$scope.$apply(function() {
1750+
$scope.voiceRecorder.recording = false
1751+
})
1752+
})
1753+
})
17511754

1752-
audioRecorder.stop();
1753-
audioStream.stop();
1755+
$(voiceRecordBtn).on('touchend', function(e) {
1756+
voiceRecordSuccess = true
1757+
$timeout(function () {
1758+
if (voiceRecorderPromise) {
1759+
$scope.voiceRecorder.processing = true
17541760

1755-
audioRecorder = null;
1756-
audioStream = null;
1761+
voiceRecorderPromise.then(function(blob) {
1762+
console.warn(dT(), 'got audio', blob)
1763+
$scope.draftMessage.files = [blob]
1764+
$scope.draftMessage.isMedia = true
17571765

1758-
clearInterval($scope.$parent.$parent.voiceRecorder.recording);
1766+
$scope.voiceRecorder.processing = false
17591767

1760-
$scope.$apply(function(){
1761-
$scope.$parent.$parent.voiceRecorder.recording = null;
1762-
});
1763-
}
1764-
});
1768+
voiceRecorderPromise = null
1769+
})
1770+
}
1771+
}, 100)
1772+
})
17651773

1766-
var sendOnEnter = true;
1774+
var sendOnEnter = true
17671775
function updateSendSettings () {
17681776
Storage.get('send_ctrlenter').then(function (sendOnCtrl) {
17691777
sendOnEnter = !sendOnCtrl

‎app/less/mobile.less‎

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,7 +1431,7 @@ a.im_message_fwd_author {
14311431
background-position: -12px -285px;
14321432
}
14331433

1434-
.im_attach, .im_record {
1434+
.im_attach {
14351435
cursor: pointer;
14361436
display: none;
14371437
overflow: hidden;
@@ -1442,6 +1442,7 @@ a.im_message_fwd_author {
14421442
width: 50px;
14431443
height: 32px;
14441444
padding: 3px 13px 4px 16px;
1445+
right: 0;
14451446

14461447
&:active {
14471448
.icon-paperclip {
@@ -1451,29 +1452,15 @@ a.im_message_fwd_author {
14511452
}
14521453
}
14531454

1454-
.non_ffos {
1455-
.im_attach {
1456-
right: 0;
1457-
}
1458-
}
1459-
14601455
.im_record {
1461-
right: 0;
1462-
user-select: none;
1463-
-moz-user-select: none;
1464-
-webkit-user-select: none;
1465-
-ms-user-select: none;
1466-
}
1467-
1468-
.ffos {
1469-
.im_send_form_empty {
1470-
.im_send_field_wrap {
1471-
margin-right: 85px;
1472-
}
1456+
right: 0;
1457+
user-select: none;
1458+
-moz-user-select: none;
1459+
-webkit-user-select: none;
1460+
-ms-user-select: none;
14731461

1474-
.im_record {
1475-
display: block;
1476-
}
1462+
.im_record_supported .im_send_form_empty & {
1463+
display: block;
14771464
}
14781465
}
14791466

‎app/partials/mobile/im.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ <h5 my-i18n="im_messages"></h5>
163163

164164
<div class="im_voice_recorder_wrap">
165165
<div class="im_recorder_indicator"><i></i></div>
166-
<div class="im_recorder_time">{{voiceRecorder.time}}</div>
166+
<div class="im_recorder_time" ng-bind="voiceRecorder.duration | duration"></div>
167167
<div class="im_recorder_label">
168168
<i class="icon icon-back"></i>
169169
<span my-i18n="im_voice_recorder_label"></span>

‎app/vendor/recorderjs/encoder_worker.js‎

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)