🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

915閲覧

DecodeAudioDataの完了を待ちたい(Safari)

JoeyYuas

総合スコア13

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/01/18 13:47

SafariでもDecodeAudioDataでPromise処理をしたい…

あるプロジェクトでdecodeAudioDataを用いてオーディオデータの変換を行っております。
このdecodeAudioDataをPromiseチェーンで繋ぎ、正常なデコードが完了したことを知りたいです。

現在、Chromeでは以下のようにやっています。

typescript

1 public static decodeAudioWithPromise(binary: any, callback: (buf: AudioBuffer) => void): Promise<void> { 2 return new Promise((resolve) => { 3 if (SoundManager.sharedContext) { 4 SoundManager.sharedContext 5 .decodeAudioData(binary) 6 .then(callback) 7 .then(() => { 8 resolve(); 9 }); 10 } 11 });

これを受けて、decodeAudioWithPromiseをthen()で繋ぐことで、デコードの完了が通知されます。
ですがSafariのdecodeAudioDataはPromiseを持たないので、上記のようにできません。

仕方なく、setTimeoutでわずかに遅延させて対応しています。

typescript

1 public static decodeAudio(binary: any, callback: (buf: AudioBuffer) => void): Promise<void> { 2 return new Promise((resolve) => { 3 if (SoundManager.sharedContext) { 4 SoundManager.sharedContext.decodeAudioData(binary, callback); 5 setTimeout(() => { 6 resolve(); 7 }, 500); 8 } 9 }); 10 }

Chromeと同様にSafariでもデコードの終了を待つことはできないでしょうか?
なにとぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/01/18 14:30

Safari では callbak を使えば良いのでは。
JoeyYuas

2021/01/19 05:53

仰る通りでした…! callback後の処理の位置を間違えていたようです。ありがとうございます。
guest

回答1

0

自己解決

typescript

1 2 /** 3 * Safari用の遅延込みオーディオデータのデコード処理 4 */ 5 public static decodeAudio(binary: any, callback: (buf: AudioBuffer) => void) { 6 if (SoundManager.sharedContext) { 7 SoundManager.sharedContext.decodeAudioData(binary, callback); 8 } 9 } 10 11 /** 12 * Chrome用、Promiseチェーンありきのデコード処理 13 */ 14 public static decodeAudioWithPromise(binary: any, callback: (buf: AudioBuffer) => void) { 15 if (SoundManager.sharedContext) { 16 SoundManager.sharedContext.decodeAudioData(binary).then(callback); 17 } 18 }

この読み込み先で、

Typescript

1 SoundManager[methodName](resource.data, (buf: AudioBuffer) => { 2 console.log(resource); 3 resource.buffer = buf; 4 next(); // この位置を取り違えていた 5 });

このようにcallbackを呼び出せば問題ありませんでした。ありがとうございます。

投稿2021/01/19 05:55

JoeyYuas

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問