Javascript-форум (https://javascript.ru/forum/)
-   Flash (https://javascript.ru/forum/flash-actionscript-program/)
-   -   JavaScript <> ActionScript 2.0 (https://javascript.ru/forum/flash-actionscript-program/35258-javascript-actionscript-2-0-a.html)

Раед 05.02.2013 13:32

JavaScript<>ActionScript 2.0 errors
 
Доброго времени суток. Давно я тут не появлялся. Но вот проблема.
Появилась задача создать кроссбраузерный плеер, проигрывающий нужные звуки по запросу из JavaScript.

ActionScript в первом и единственном кадре:
Код:

import flash.external.ExternalInterface;

function playSound (s) {
        var sound = new Sound();
        sound.attachSound(s);
        sound.start();
}

ExternalInterface.addCallback('play', null, playSound);

Вставка ролика:
<div id="player">
 <object width="1" height="1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
  <param name="allowScriptAccess" value="sameDomain">
  <param name="movie" value="sounds.swf">
  <embed width="1" height="1" src="sounds.swf" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" scale="exactfit" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
 </object>
</div>


И javascript:
sounds = {
 _movie: null,

 init: function() {
  var ie = '\v'==='v';
  this._movie = document.getElementById('player').getElementsByTagName(ie ? 'object' : 'embed')[0];
 },
 
 play: function(s) {
  this._movie.play(s);
 }
}

sounds.init вызывается при загрузке страницы.
Во флеш-ролике есть звук twins. Импорт для ActionScript включён.
Когда пишу в консоль sounds.play('twins') выскакивает ошибка uncaught exception: Error in Actionscript. Use a try/catch block to find error.
Нет во флеш никаких ошибок. Я проверял (вызов playSound в AS проходит нормально). Очевидно, ошибка возникает при работе ExternalInterface.

-------------------------------------------------

Пробовал вместо ExternalInterface использовать SetVariable
AS:
Код:

mes = null;

function playSound (s) {
        var sound = new Sound();
        sound.attachSound(s);
        sound.start();
}

_root.onEnterFrame = function() {
        if (mes!==null) {
                playSound(mes);
                mes = null;
        }
}

javascript:
sounds = {
 _movie: null,

 init: function() {
  var ie = '\v'==='v';
  this._movie = document.getElementById('player').getElementsByTagName(ie ? 'object' : 'embed')[0];
 },
 
 play: function(s) {
  this._movie.SetVariable('mes', s);
 }
}


Теперь при вызове sounds.play получаем:
Error: Error calling method on NPObject!
this._movie.SetVariable('mes', s);

Что такое NPObject?!!

Гугл не помог. Помогите понять, в чём проблема.

-------------Это можно не читать-----------------
Я пробовал ещё один способ. sounds.play пихал звук в конец массива, а AS на каждом кадре через ExternalInterface вызывал sounds.getStack, возвращавший и удалявший первый элемент этого массива, либо false, если элементов нет. Это работало, но с ощутимой задержкой. Поэтому решил не извращаться, а разобраться с ошибками.

Раед 07.02.2013 15:23

Проблема решена запуском под локальным сервером.


Часовой пояс GMT +3, время: 08:03.