-
111muk_web_preview_audio/README.rst
-
2muk_web_preview_audio/__manifest__.py
-
15muk_web_preview_audio/i18n/de.po
-
24muk_web_preview_audio/i18n/es.po
-
24muk_web_preview_audio/i18n/fr.po
-
8muk_web_preview_audio/i18n/muk_web_preview_audio.pot
-
24muk_web_preview_audio/i18n/nl.po
-
112muk_web_preview_audio/static/description/index.html
-
BINmuk_web_preview_audio/static/description/preview.png
-
BINmuk_web_preview_audio/static/description/service_customization.png
-
BINmuk_web_preview_audio/static/description/service_development.png
-
BINmuk_web_preview_audio/static/description/service_implementation.png
-
BINmuk_web_preview_audio/static/description/service_integration.png
-
BINmuk_web_preview_audio/static/description/service_support.png
-
112muk_web_preview_audio/static/lib/visualizer/visualizer.js
-
75muk_web_preview_audio/static/src/js/audio.js
-
40muk_web_preview_audio/static/src/js/preview_generator.js
-
66muk_web_preview_audio/static/src/js/preview_handler.js
-
19muk_web_preview_audio/static/src/scss/audio.scss
-
12muk_web_preview_audio/static/src/xml/audio.xml
-
5muk_web_preview_audio/template/assets.xml
@ -0,0 +1,111 @@ |
|||||
|
================= |
||||
|
MuK Preview Audio |
||||
|
================= |
||||
|
|
||||
|
Extendes the Preview Dialog to support audio files. Currently the following audio extensions |
||||
|
are supported: |
||||
|
|
||||
|
* Wav (\*.wav, audio/wav) |
||||
|
* Ogg Theora Vorbis (\*.ogg, audio/ogg) |
||||
|
* MP3 (\*.mp3, audio/mpeg) |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
|
||||
|
To install this module, you need to: |
||||
|
|
||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to |
||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the |
||||
|
list by clicking on the "Update Apps List" link. Now install the module by |
||||
|
clicking on the install button. |
||||
|
|
||||
|
Another way to install this module is via the package management for Python |
||||
|
(`PyPI <https://pypi.org/project/pip/>`_). |
||||
|
|
||||
|
To install our modules using the package manager make sure |
||||
|
`odoo-autodiscover <https://pypi.org/project/odoo-autodiscover/>`_ is installed |
||||
|
correctly. Then open a console and install the module by entering the following |
||||
|
command: |
||||
|
|
||||
|
``pip install --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
||||
|
|
||||
|
The module name consists of the Odoo version and the module name, where |
||||
|
underscores are replaced by a dash. |
||||
|
|
||||
|
**Module:** |
||||
|
|
||||
|
``odoo<version>-addon-<module_name>`` |
||||
|
|
||||
|
**Example:** |
||||
|
|
||||
|
``sudo -H pip3 install --extra-index-url https://nexus.mukit.at/repository/odoo/simple odoo11-addon-muk-utils`` |
||||
|
|
||||
|
Once the installation has been successfully completed, the app is already in the |
||||
|
correct folder. Log on to your Odoo server and go to the Apps menu. Trigger the |
||||
|
debug mode and update the list by clicking on the "Update Apps List" link. Now |
||||
|
install the module by clicking on the install button. |
||||
|
|
||||
|
The biggest advantage of this variant is that you can now also update the app |
||||
|
using the "pip" command. To do this, enter the following command in your console: |
||||
|
|
||||
|
``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
||||
|
|
||||
|
When the process is finished, restart your server and update the application in |
||||
|
Odoo. The steps are the same as for the installation only the button has changed |
||||
|
from "Install" to "Upgrade". |
||||
|
|
||||
|
You can also view available Apps directly in our `repository <https://nexus.mukit.at/#browse/browse:odoo>`_ |
||||
|
and find a more detailed installation guide on our `website <https://mukit.at/page/open-source>`_. |
||||
|
|
||||
|
For modules licensed under OPL-1, you will receive access data when you purchase |
||||
|
the module. If the modules were not purchased directly from |
||||
|
`MuK IT <https://www.mukit.at/>`_ please contact our support (support@mukit.at) |
||||
|
with a confirmation of purchase to receive the corresponding access data. |
||||
|
|
||||
|
Upgrade |
||||
|
============ |
||||
|
|
||||
|
To upgrade this module, you need to: |
||||
|
|
||||
|
Download the module and add it to your Odoo addons folder. Restart the server |
||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by |
||||
|
clicking on the upgrade button. |
||||
|
|
||||
|
If you installed the module using the "pip" command, you can also update the |
||||
|
module in the same way. Just type the following command into the console: |
||||
|
|
||||
|
``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
||||
|
|
||||
|
When the process is finished, restart your server and update the application in |
||||
|
Odoo, just like you would normally. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
|
||||
|
No additional configuration is needed to use this module. |
||||
|
|
||||
|
Usage |
||||
|
============= |
||||
|
|
||||
|
Go to a binary that contains an audio file and open the preview dialog to view |
||||
|
the preview. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Mathias Markl <mathias.markl@mukit.at> |
||||
|
|
||||
|
Author & Maintainer |
||||
|
------------------- |
||||
|
|
||||
|
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_. |
||||
|
|
||||
|
MuK IT is an Austrian company specialized in customizing and extending Odoo. |
||||
|
We develop custom solutions for your individual needs to help you focus on |
||||
|
your strength and expertise to grow your business. |
||||
|
|
||||
|
If you want to get in touch please contact us via mail |
||||
|
(sale@mukit.at) or visit our website (https://mukit.at). |
@ -0,0 +1,24 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * muk_web_preview_audio |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 12.0-20190128\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2019-03-05 18:58+0000\n" |
||||
|
"PO-Revision-Date: 2019-03-05 18:58+0000\n" |
||||
|
"Last-Translator: <>\n" |
||||
|
"Language-Team: \n" |
||||
|
"MIME-Version: 1.0\n" |
||||
|
"Content-Type: text/plain; charset=UTF-8\n" |
||||
|
"Content-Transfer-Encoding: \n" |
||||
|
"Plural-Forms: \n" |
||||
|
|
||||
|
#. module: muk_web_preview_audio |
||||
|
#. openerp-web |
||||
|
#: code:addons/muk_web_preview_audio/static/src/xml/audio.xml:30 |
||||
|
#, python-format |
||||
|
msgid "Your browser does not support the audio element." |
||||
|
msgstr "" |
||||
|
|
@ -0,0 +1,24 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * muk_web_preview_audio |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 12.0-20190128\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2019-03-05 18:58+0000\n" |
||||
|
"PO-Revision-Date: 2019-03-05 18:58+0000\n" |
||||
|
"Last-Translator: <>\n" |
||||
|
"Language-Team: \n" |
||||
|
"MIME-Version: 1.0\n" |
||||
|
"Content-Type: text/plain; charset=UTF-8\n" |
||||
|
"Content-Transfer-Encoding: \n" |
||||
|
"Plural-Forms: \n" |
||||
|
|
||||
|
#. module: muk_web_preview_audio |
||||
|
#. openerp-web |
||||
|
#: code:addons/muk_web_preview_audio/static/src/xml/audio.xml:30 |
||||
|
#, python-format |
||||
|
msgid "Your browser does not support the audio element." |
||||
|
msgstr "" |
||||
|
|
@ -0,0 +1,24 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * muk_web_preview_audio |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 12.0-20190128\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2019-03-05 18:58+0000\n" |
||||
|
"PO-Revision-Date: 2019-03-05 18:58+0000\n" |
||||
|
"Last-Translator: <>\n" |
||||
|
"Language-Team: \n" |
||||
|
"MIME-Version: 1.0\n" |
||||
|
"Content-Type: text/plain; charset=UTF-8\n" |
||||
|
"Content-Transfer-Encoding: \n" |
||||
|
"Plural-Forms: \n" |
||||
|
|
||||
|
#. module: muk_web_preview_audio |
||||
|
#. openerp-web |
||||
|
#: code:addons/muk_web_preview_audio/static/src/xml/audio.xml:30 |
||||
|
#, python-format |
||||
|
msgid "Your browser does not support the audio element." |
||||
|
msgstr "" |
||||
|
|
After Width: 1000 | Height: 200 | Size: 32 KiB |
After Width: 250 | Height: 250 | Size: 27 KiB |
After Width: 250 | Height: 250 | Size: 28 KiB |
After Width: 250 | Height: 250 | Size: 26 KiB |
After Width: 250 | Height: 250 | Size: 24 KiB |
After Width: 250 | Height: 250 | Size: 24 KiB |
@ -0,0 +1,112 @@ |
|||||
|
/********************************************************************************** |
||||
|
* |
||||
|
* Copyright (C) 2017 MuK IT GmbH |
||||
|
* |
||||
|
* This program is free software: you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU Affero General Public License as |
||||
|
* published by the Free Software Foundation, either version 3 of the |
||||
|
* License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU Affero General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU Affero General Public License |
||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
* |
||||
|
**********************************************************************************/ |
||||
|
|
||||
|
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext; |
||||
|
|
||||
|
function Visualizer($audio, $container, $canvas) { |
||||
|
var _this = this; |
||||
|
|
||||
|
this.$audio = $audio; |
||||
|
this.$container = $container; |
||||
|
this.$canvas = $canvas; |
||||
|
|
||||
|
this.audio = $audio.get(0); |
||||
|
this.canvas = $canvas.get(0); |
||||
|
|
||||
|
this.audioCtx = new AudioContext(); |
||||
|
this.analyser = this.audioCtx.createAnalyser(); |
||||
|
this.audioSrc = this.audioCtx.createMediaElementSource(this.audio); |
||||
|
this.frequencyData = new Uint8Array(this.analyser.frequencyBinCount); |
||||
|
this.smoothEndingCounter = 0; |
||||
|
|
||||
|
this.audioSrc.connect(this.analyser); |
||||
|
this.analyser.connect(this.audioCtx.destination); |
||||
|
|
||||
|
this.ctx = this.canvas.getContext('2d'), |
||||
|
|
||||
|
this.capYPositionArray = []; |
||||
|
|
||||
|
this.$audio.bind('play', function (e) { |
||||
|
_this.smoothEndingCounter = 0; |
||||
|
_this.calcCanvas(); |
||||
|
_this.renderFrame(); |
||||
|
}); |
||||
|
|
||||
|
this.map = function (num, in_min, in_max, out_min, out_max) { |
||||
|
return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
||||
|
} |
||||
|
|
||||
|
this.calcCanvas = function() { |
||||
|
_this.canvas.width = _this.$container.width() !== 0 ? _this.$container.width() : 650; |
||||
|
_this.canvas.height = _this.$container.height() !== 0 ? _this.$container.height() : 360; |
||||
|
_this.cwidth = _this.canvas.width; |
||||
|
_this.cheight = _this.canvas.height - 4; |
||||
|
_this.meterWidth = 10; |
||||
|
_this.capHeight = 4; |
||||
|
_this.capStyle = '#FFF'; |
||||
|
_this.meterNum = (_this.$container.width() !== 0 ? _this.$container.width() : 650) / (10 + 2); |
||||
|
|
||||
|
_this.gradient = _this.ctx.createLinearGradient(0, 0, 0, _this.cheight); |
||||
|
_this.gradient.addColorStop(1, '#1CD5FB'); |
||||
|
_this.gradient.addColorStop(0.75, '#19DECA'); |
||||
|
_this.gradient.addColorStop(0.5, '#28F5A6'); |
||||
|
_this.gradient.addColorStop(0.25, '#19DE5A'); |
||||
|
_this.gradient.addColorStop(0, '#1CFB27'); |
||||
|
} |
||||
|
|
||||
|
this.renderFrame = function() { |
||||
|
if(_this.$container.width() !== _this.cwidth) { |
||||
|
_this.calcCanvas(); |
||||
|
} |
||||
|
|
||||
|
_this.ctx.clearRect(0, 0, _this.cwidth, _this.cheight); |
||||
|
|
||||
|
_this.analyser.getByteFrequencyData(_this.frequencyData); |
||||
|
var step = Math.round(_this.frequencyData.length / _this.meterNum); |
||||
|
|
||||
|
for (var i = 0; i < _this.meterNum; i++) { |
||||
|
var valueBar = _this.map(_this.frequencyData[i * step], 0, 255, 0, _this.cheight); |
||||
|
var valueCap = _this.map(_this.frequencyData[i * step], 0, 255, 0, _this.canvas.height); |
||||
|
|
||||
|
if (_this.capYPositionArray.length < Math.round(_this.meterNum)) { |
||||
|
_this.capYPositionArray.push(valueCap); |
||||
|
}; |
||||
|
|
||||
|
_this.ctx.fillStyle = _this.gradient; |
||||
|
_this.ctx.fillRect(i * 12, _this.cheight - valueBar, _this.meterWidth, _this.cheight); |
||||
|
|
||||
|
_this.ctx.fillStyle = _this.capStyle; |
||||
|
if (valueCap < _this.capYPositionArray[i]) { |
||||
|
_this.ctx.fillRect(i * 12, _this.canvas.height - (--_this.capYPositionArray[i]), _this.meterWidth, _this.capHeight); |
||||
|
} else { |
||||
|
_this.ctx.fillRect(i * 12, _this.canvas.height - valueCap, _this.meterWidth, _this.capHeight); |
||||
|
_this.capYPositionArray[i] = valueCap; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
if(!_this.audio.paused) { |
||||
|
requestAnimationFrame(_this.renderFrame); |
||||
|
} else { |
||||
|
if(_this.smoothEndingCounter < 500) { |
||||
|
requestAnimationFrame(_this.renderFrame); |
||||
|
} |
||||
|
_this.smoothEndingCounter++; |
||||
|
} |
||||
|
} |
||||
|
}; |
@ -0,0 +1,75 @@ |
|||||
|
/********************************************************************************** |
||||
|
* |
||||
|
* Copyright (C) 2017 MuK IT GmbH |
||||
|
* |
||||
|
* This program is free software: you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU Affero General Public License as |
||||
|
* published by the Free Software Foundation, either version 3 of the |
||||
|
* License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU Affero General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU Affero General Public License |
||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
* |
||||
|
**********************************************************************************/ |
||||
|
|
||||
|
odoo.define('muk_preview_markdown.PreviewContentAudio', function (require) { |
||||
|
"use strict"; |
||||
|
|
||||
|
var core = require('web.core'); |
||||
|
var ajax = require('web.ajax'); |
||||
|
var utils = require('web.utils'); |
||||
|
var session = require('web.session'); |
||||
|
|
||||
|
var registry = require('muk_preview.registry'); |
||||
|
|
||||
|
var AbstractPreviewContent = require('muk_preview.AbstractPreviewContent'); |
||||
|
|
||||
|
var QWeb = core.qweb; |
||||
|
var _t = core._t; |
||||
|
|
||||
|
var PreviewContentAudio = AbstractPreviewContent.extend({ |
||||
|
template: "muk_preview.PreviewContentAudio", |
||||
|
jsLibs: [ |
||||
|
'/muk_web_preview_audio/static/lib/visualizer/visualizer.js', |
||||
|
], |
||||
|
mimetypeMap: { |
||||
|
'.wav': 'audio/wav', '.ogg': 'audio/ogg', '.mp3': 'audio/mpeg', |
||||
|
'wav': 'audio/wav', 'ogg': 'audio/ogg', 'mp3': 'audio/mpeg', |
||||
|
}, |
||||
|
init: function(parent, url, mimetype, filename) { |
||||
|
this._super.apply(this, arguments); |
||||
|
if(this.mimetype === 'application/octet-stream') { |
||||
|
var extension = this.filename.split('.').pop(); |
||||
|
this.mimetype = this.mimetypeMap[extension]; |
||||
|
} |
||||
|
}, |
||||
|
renderPreviewContent: function() { |
||||
|
this.visualizer = new Visualizer( |
||||
|
this.$('audio'), |
||||
|
this.$('.visualizer'), |
||||
|
this.$('canvas') |
||||
|
); |
||||
|
return this._super.apply(this, arguments); |
||||
|
}, |
||||
|
downloadable: true, |
||||
|
printable: false, |
||||
|
}); |
||||
|
|
||||
|
_.each(['.wav', '.ogg', '.mp3', ], function(extension) { |
||||
|
registry.add(extension, PreviewContentAudio); |
||||
|
}); |
||||
|
_.each(['wav', 'ogg', 'mp3'], function(extension) { |
||||
|
registry.add(extension, PreviewContentAudio); |
||||
|
}); |
||||
|
_.each(['audio/wav', ' audio/ogg', 'audio/mpeg'], function(mimetype) { |
||||
|
registry.add(mimetype, PreviewContentAudio); |
||||
|
}); |
||||
|
|
||||
|
return PreviewContentMarkdown; |
||||
|
|
||||
|
}); |
@ -1,40 +0,0 @@ |
|||||
/********************************************************************************** |
|
||||
* |
|
||||
* Copyright (C) 2017 MuK IT GmbH |
|
||||
* |
|
||||
* This program is free software: you can redistribute it and/or modify |
|
||||
* it under the terms of the GNU Affero General Public License as |
|
||||
* published by the Free Software Foundation, either version 3 of the |
|
||||
* License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU Affero General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU Affero General Public License |
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||
* |
|
||||
**********************************************************************************/ |
|
||||
|
|
||||
odoo.define('muk_preview_audio.PreviewGenerator', function (require) { |
|
||||
"use strict"; |
|
||||
|
|
||||
var core = require('web.core'); |
|
||||
|
|
||||
var PreviewGenerator = require('muk_preview.PreviewGenerator'); |
|
||||
var PreviewHandler = require('muk_preview_audio.PreviewHandler'); |
|
||||
|
|
||||
var QWeb = core.qweb; |
|
||||
var _t = core._t; |
|
||||
|
|
||||
PreviewGenerator.include({ |
|
||||
init: function(widget, additional_handler) { |
|
||||
this._super(widget, additional_handler); |
|
||||
this.handler = _.extend(this.handler, { |
|
||||
"AudioHandler": new PreviewHandler.AudioHandler(widget), |
|
||||
}); |
|
||||
}, |
|
||||
}); |
|
||||
|
|
||||
}); |
|
@ -1,66 +0,0 @@ |
|||||
/********************************************************************************** |
|
||||
* |
|
||||
* Copyright (C) 2017 MuK IT GmbH |
|
||||
* |
|
||||
* This program is free software: you can redistribute it and/or modify |
|
||||
* it under the terms of the GNU Affero General Public License as |
|
||||
* published by the Free Software Foundation, either version 3 of the |
|
||||
* License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU Affero General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU Affero General Public License |
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||
* |
|
||||
**********************************************************************************/ |
|
||||
|
|
||||
odoo.define('muk_preview_audio.PreviewHandler', function (require) { |
|
||||
"use strict"; |
|
||||
|
|
||||
var ajax = require('web.ajax'); |
|
||||
var core = require('web.core'); |
|
||||
|
|
||||
var PreviewHandler = require('muk_preview.PreviewHandler'); |
|
||||
|
|
||||
var QWeb = core.qweb; |
|
||||
var _t = core._t; |
|
||||
|
|
||||
var AudioHandler = PreviewHandler.BaseHandler.extend({ |
|
||||
cssLibs: [ |
|
||||
], |
|
||||
jsLibs: [ |
|
||||
'/muk_web_utils/static/lib/visualizer/visualizer.js', |
|
||||
], |
|
||||
mimetypeMap: { |
|
||||
'.wav': 'audio/wav', '.ogg': 'audio/ogg', '.mp3': 'audio/mpeg', |
|
||||
'wav': 'audio/wav', 'ogg': 'audio/ogg', 'mp3': 'audio/mpeg', |
|
||||
}, |
|
||||
checkExtension: function(extension) { |
|
||||
return ['.wav', '.ogg', '.mp3', 'wav', 'ogg', 'mp3'].includes(extension); |
|
||||
}, |
|
||||
checkType: function(mimetype) { |
|
||||
return ['audio/wav', ' audio/ogg', 'audio/mpeg'].includes(mimetype); |
|
||||
}, |
|
||||
createHtml: function(url, mimetype, extension, title) { |
|
||||
var self = this; |
|
||||
var result = $.Deferred(); |
|
||||
ajax.loadLibs(this).then(function() { |
|
||||
if(!mimetype || mimetype === 'application/octet-stream') { |
|
||||
mimetype = self.mimetypeMap[extension]; |
|
||||
} |
|
||||
var $content = $(QWeb.render('AudioHTMLContent', {url: url, type: mimetype, title: title})); |
|
||||
var visualizer = new Visualizer($content.find('audio'), $content.find('.visualizer'), $content.find('canvas')); |
|
||||
result.resolve($content); |
|
||||
}); |
|
||||
return result; |
|
||||
}, |
|
||||
}); |
|
||||
|
|
||||
return { |
|
||||
AudioHandler: AudioHandler, |
|
||||
}; |
|
||||
|
|
||||
}); |
|