From 2f5e6801df48b972a6d84e7da8c887d7ea349df8 Mon Sep 17 00:00:00 2001 From: Marco Bavagnoli Date: Sun, 23 Jun 2024 23:26:36 +0200 Subject: [PATCH 01/34] moved into new folder some sources --- example/tests/tests.dart | 2 +- lib/src/{ => bindings}/bindings_capture_ffi.dart | 0 lib/src/{ => bindings}/bindings_player_ffi.dart | 0 lib/src/{ => bindings}/soloud_controller.dart | 4 ++-- lib/src/soloud.dart | 2 +- lib/src/soloud_capture.dart | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) rename lib/src/{ => bindings}/bindings_capture_ffi.dart (100%) rename lib/src/{ => bindings}/bindings_player_ffi.dart (100%) rename lib/src/{ => bindings}/soloud_controller.dart (86%) diff --git a/example/tests/tests.dart b/example/tests/tests.dart index afae10a..ec41a67 100644 --- a/example/tests/tests.dart +++ b/example/tests/tests.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; -import 'package:flutter_soloud/src/soloud_controller.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; import 'package:logging/logging.dart'; /// An end-to-end test. diff --git a/lib/src/bindings_capture_ffi.dart b/lib/src/bindings/bindings_capture_ffi.dart similarity index 100% rename from lib/src/bindings_capture_ffi.dart rename to lib/src/bindings/bindings_capture_ffi.dart diff --git a/lib/src/bindings_player_ffi.dart b/lib/src/bindings/bindings_player_ffi.dart similarity index 100% rename from lib/src/bindings_player_ffi.dart rename to lib/src/bindings/bindings_player_ffi.dart diff --git a/lib/src/soloud_controller.dart b/lib/src/bindings/soloud_controller.dart similarity index 86% rename from lib/src/soloud_controller.dart rename to lib/src/bindings/soloud_controller.dart index aaf3edf..033c4c5 100644 --- a/lib/src/soloud_controller.dart +++ b/lib/src/bindings/soloud_controller.dart @@ -1,8 +1,8 @@ import 'dart:ffi' as ffi; import 'dart:io'; -import 'package:flutter_soloud/src/bindings_capture_ffi.dart'; -import 'package:flutter_soloud/src/bindings_player_ffi.dart'; +import 'package:flutter_soloud/src/bindings/bindings_capture_ffi.dart'; +import 'package:flutter_soloud/src/bindings/bindings_player_ffi.dart'; /// Controller that expose method channel and FFI class SoLoudController { diff --git a/lib/src/soloud.dart b/lib/src/soloud.dart index 4a52849..03fbd06 100644 --- a/lib/src/soloud.dart +++ b/lib/src/soloud.dart @@ -10,7 +10,7 @@ import 'package:flutter_soloud/src/enums.dart'; import 'package:flutter_soloud/src/exceptions/exceptions.dart'; import 'package:flutter_soloud/src/filter_params.dart'; import 'package:flutter_soloud/src/soloud_capture.dart'; -import 'package:flutter_soloud/src/soloud_controller.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; import 'package:flutter_soloud/src/sound_handle.dart'; import 'package:flutter_soloud/src/sound_hash.dart'; import 'package:flutter_soloud/src/utils/loader.dart'; diff --git a/lib/src/soloud_capture.dart b/lib/src/soloud_capture.dart index 7a2f333..72f812a 100644 --- a/lib/src/soloud_capture.dart +++ b/lib/src/soloud_capture.dart @@ -2,7 +2,7 @@ import 'dart:ffi' as ffi; import 'package:flutter_soloud/src/enums.dart'; import 'package:flutter_soloud/src/soloud.dart'; -import 'package:flutter_soloud/src/soloud_controller.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; From 218c8005f4698c1ff3bbe7802dba829b46daff47 Mon Sep 17 00:00:00 2001 From: Marco Bavagnoli Date: Sat, 29 Jun 2024 21:32:36 +0200 Subject: [PATCH 02/34] ++ --- .vscode/c_cpp_properties.json | 14 + .vscode/launch.json | 6 + .vscode/tasks.json | 28 +- example/.metadata | 16 +- example/assets/shaders/test9.frag | 4 +- example/lib/controls.dart | 12 +- example/lib/main.dart | 254 +- example/lib/main_complete.dart | 127 + example/lib/page_hello_flutter.dart | 83 +- example/lib/page_multi_track.dart | 30 +- example/lib/page_visualizer.dart | 180 +- example/lib/page_waveform.dart | 22 +- example/lib/{waveform => ui}/bars.dart | 30 +- example/lib/{waveform => ui}/filter_fx.dart | 3 +- .../lib/{waveform => ui}/keyboard_widget.dart | 0 .../lib/{waveform => ui}/knobs_groups.dart | 2 +- example/lib/{waveform => ui}/text_slider.dart | 0 .../lib/{waveform => ui}/touch_slider.dart | 0 example/lib/visualizer/bars_fft_widget.dart | 26 +- example/lib/visualizer/bars_wave_widget.dart | 24 +- example/lib/visualizer/visualizer.dart | 494 +- example/pubspec.lock | 2 +- example/pubspec.yaml | 2 +- example/test/widget_test.dart | 30 + example/web/favicon.png | Bin 0 -> 917 bytes example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes example/web/index.html | 39 + example/web/manifest.json | 35 + lib/flutter_soloud.dart | 2 + lib/src/bindings/audio_data.dart | 272 + lib/src/bindings/audio_data_extensions.dart | 110 + lib/src/bindings/audio_data_ffi.dart | 100 + lib/src/bindings/audio_data_web.dart | 95 + lib/src/bindings/bindings_capture.dart | 45 + lib/src/bindings/bindings_capture_ffi.dart | 111 +- lib/src/bindings/bindings_capture_web.dart | 102 + lib/src/bindings/bindings_player.dart | 706 ++ lib/src/bindings/bindings_player_ffi.dart | 633 +- lib/src/bindings/bindings_player_web.dart | 690 ++ lib/src/bindings/js_extension.dart | 442 + lib/src/bindings/soloud_controller.dart | 42 +- lib/src/bindings/soloud_controller_ffi.dart | 32 + lib/src/bindings/soloud_controller_web.dart | 20 + lib/src/enums.dart | 9 +- lib/src/enums.dart.orig | 235 + lib/src/exceptions/exceptions.dart | 24 + lib/src/exceptions/exceptions_from_cpp.dart | 54 +- lib/src/soloud.dart | 383 +- lib/src/soloud_capture.dart | 81 +- lib/src/utils/loader.dart | 305 +- lib/src/utils/loader_io.dart | 303 + lib/src/utils/loader_web.dart | 94 + lib/src/worker/worker.dart | 108 + pubspec.yaml | 20 +- src/bindings.cpp | 91 +- src/bindings_capture.cpp | 194 +- src/enums.h | 6 +- src/filters/filters.cpp | 6 + src/player.cpp | 10 +- src/soloud/src/backend/miniaudio/miniaudio.h | 4253 ++++---- wasm.sh | 4 + web.sh | 4 + web/CMakeLists.txt | 55 - web/Configure.cmake | 48 - web/compile | 6 - web/compile_wasm.sh | 53 + web/compile_worker.bat | 2 + web/compile_worker.sh | 1 + web/libflutter_soloud_plugin.js | 4814 +++++++++ web/libflutter_soloud_plugin.wasm | Bin 0 -> 5428520 bytes web/src.cmake | 327 - web/worker.dart | 26 + web/worker.dart.js | 9211 +++++++++++++++++ web/worker.dart.js.deps | 347 + web/worker.dart.js.map | 16 + 78 files changed, 21615 insertions(+), 4340 deletions(-) create mode 100644 example/lib/main_complete.dart rename example/lib/{waveform => ui}/bars.dart (76%) rename example/lib/{waveform => ui}/filter_fx.dart (97%) rename example/lib/{waveform => ui}/keyboard_widget.dart (100%) rename example/lib/{waveform => ui}/knobs_groups.dart (95%) rename example/lib/{waveform => ui}/text_slider.dart (100%) rename example/lib/{waveform => ui}/touch_slider.dart (100%) create mode 100644 example/test/widget_test.dart create mode 100644 example/web/favicon.png create mode 100644 example/web/icons/Icon-192.png create mode 100644 example/web/icons/Icon-512.png create mode 100644 example/web/icons/Icon-maskable-192.png create mode 100644 example/web/icons/Icon-maskable-512.png create mode 100644 example/web/index.html create mode 100644 example/web/manifest.json create mode 100644 lib/src/bindings/audio_data.dart create mode 100644 lib/src/bindings/audio_data_extensions.dart create mode 100644 lib/src/bindings/audio_data_ffi.dart create mode 100644 lib/src/bindings/audio_data_web.dart create mode 100644 lib/src/bindings/bindings_capture.dart create mode 100644 lib/src/bindings/bindings_capture_web.dart create mode 100644 lib/src/bindings/bindings_player.dart create mode 100644 lib/src/bindings/bindings_player_web.dart create mode 100644 lib/src/bindings/js_extension.dart create mode 100644 lib/src/bindings/soloud_controller_ffi.dart create mode 100644 lib/src/bindings/soloud_controller_web.dart create mode 100644 lib/src/enums.dart.orig create mode 100644 lib/src/utils/loader_io.dart create mode 100644 lib/src/utils/loader_web.dart create mode 100644 lib/src/worker/worker.dart create mode 100644 wasm.sh create mode 100644 web.sh delete mode 100644 web/CMakeLists.txt delete mode 100644 web/Configure.cmake delete mode 100755 web/compile create mode 100755 web/compile_wasm.sh create mode 100755 web/compile_worker.bat create mode 100755 web/compile_worker.sh create mode 100644 web/libflutter_soloud_plugin.js create mode 100755 web/libflutter_soloud_plugin.wasm delete mode 100644 web/src.cmake create mode 100644 web/worker.dart create mode 100644 web/worker.dart.js create mode 100644 web/worker.dart.js.deps create mode 100644 web/worker.dart.js.map diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index d112e0a..7195ddf 100755 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -15,6 +15,20 @@ "intelliSenseMode": "linux-clang-x64", "configurationProvider": "ms-vscode.cmake-tools" }, + { + "name": "Chrome", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/src", + "/usr/lib/emscripten/system/include" + ], + "defines": ["WITH_MINIAUDIO", "DR_MP3_IMPLEMENTATION", "__EMSCRIPTEN__"], // to see the code in between "#if defined" + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "${default}", + "configurationProvider": "ms-vscode.cmake-tools" + }, { "name": "Win32", "includePath": [ diff --git a/.vscode/launch.json b/.vscode/launch.json index 8e76531..72ab720 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -78,6 +78,12 @@ "request": "launch", "program": "${workspaceFolder}/example/build/linux/x64/debug/bundle/flutter_soloud_example", "cwd": "${workspaceFolder}" + }, + { + "name": "Chrome", + "type": "chrome", + "preLaunchTask": "compile web debug", + "request": "launch" } ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 3c6802d..729c81a 100755 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,49 +10,27 @@ { "label": "compile linux debug", "command": "cd ${workspaceFolder}/example; flutter build linux -t lib/main.dart --debug", - // "args": ["build", "linux"], "type": "shell" }, { "label": "compile linux test debug", "command": "cd ${workspaceFolder}/example; flutter build linux -t tests/tests.dart --debug", - // "args": ["build", "linux"], "type": "shell" }, { "label": "compile windows debug verbose", "command": "cd ${workspaceFolder}/example; flutter build windows -t lib/main.dart --debug --verbose", - // "args": ["build", "linux"], "type": "shell" }, { "label": "compile windows debug", "command": "cd ${workspaceFolder}/example; flutter build windows -t lib/main.dart --debug", - // "args": ["build", "linux"], "type": "shell" }, { - "type": "cppbuild", - "label": "C/C++: gcc build active file", - "command": "/usr/bin/gcc", - "args": [ - "-fdiagnostics-color=always", - "-g", - "${file}", - "-o", - "${fileDirname}/${fileBasenameNoExtension}" - ], - "options": { - "cwd": "${fileDirname}" - }, - "problemMatcher": [ - "$gcc" - ], - "group": { - "kind": "build", - "isDefault": true - }, - "detail": "Task generated by Debugger." + "label": "compile web debug", + "command": "cd ${workspaceFolder}/example; flutter run -d chrome --web-renderer canvaskit --web-browser-flag '--disable-web-security' -t lib/main.dart --release", + "type": "shell" } ] } diff --git a/example/.metadata b/example/.metadata index 730798a..784ce12 100644 --- a/example/.metadata +++ b/example/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - channel: stable + revision: "a14f74ff3a1cbd521163c5f03d68113d50af93d3" + channel: "stable" project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - - platform: windows - create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 - base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 + create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + - platform: web + create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 + base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3 # User provided section diff --git a/example/assets/shaders/test9.frag b/example/assets/shaders/test9.frag index 5b80c31..8cd31a8 100644 --- a/example/assets/shaders/test9.frag +++ b/example/assets/shaders/test9.frag @@ -174,11 +174,11 @@ void mainImage( out vec4 fragColor, in vec2 fragCoord ) // rotate view float a; - a = -0.6; + a = -0.8; rd = rotateX(rd, a); ro = rotateX(ro, a); - a = 1.5; + a = 1.8; // a = sin(iTime)*.5 + 1.570796327; rd = rotateY(rd, a); ro = rotateY(ro, a); diff --git a/example/lib/controls.dart b/example/lib/controls.dart index fce548e..2eb8da6 100644 --- a/example/lib/controls.dart +++ b/example/lib/controls.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -29,8 +29,8 @@ class _ControlsState extends State { // ignore: avoid_positional_boolean_parameters ButtonStyle buttonStyle(bool enabled) { return enabled - ? ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.green)) - : ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.red)); + ? ButtonStyle(backgroundColor: WidgetStateProperty.all(Colors.green)) + : ButtonStyle(backgroundColor: WidgetStateProperty.all(Colors.red)); } @override @@ -49,7 +49,8 @@ class _ControlsState extends State { ElevatedButton( onPressed: () async { /// Ask recording permission on mobile - if (Platform.isAndroid || Platform.isIOS) { + if (defaultTargetPlatform == TargetPlatform.android || + defaultTargetPlatform == TargetPlatform.iOS) { final p = await Permission.microphone.isGranted; if (!p) { unawaited(Permission.microphone.request()); @@ -76,9 +77,8 @@ class _ControlsState extends State { blurSigmaX: 6, blurSigmaY: 6, ), - linearShapeParams: LinearShapeParams( + linearShapeParams: const LinearShapeParams( angle: -90, - space: Platform.isAndroid || Platform.isIOS ? -10 : 10, alignment: LinearAlignment.left, ), ), diff --git a/example/lib/main.dart b/example/lib/main.dart index a0d2496..ff73cc6 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,22 +1,17 @@ +// ignore_for_file: avoid_print + import 'dart:developer' as dev; -import 'dart:ui'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; -import 'package:flutter_soloud_example/page_3d_audio.dart'; -import 'package:flutter_soloud_example/page_hello_flutter.dart'; -import 'package:flutter_soloud_example/page_multi_track.dart'; -import 'package:flutter_soloud_example/page_visualizer.dart'; -import 'package:flutter_soloud_example/page_waveform.dart'; +import 'package:flutter_soloud_example/ui/bars.dart'; import 'package:logging/logging.dart'; void main() async { - // The `flutter_soloud` package logs everything - // (from severe warnings to fine debug messages) - // using the standard `package:logging`. - // You can listen to the logs as shown below. - Logger.root.level = kDebugMode ? Level.FINE : Level.INFO; + Logger.root.level = kDebugMode ? Level.FINEST : Level.INFO; Logger.root.onRecord.listen((record) { dev.log( record.message, @@ -31,18 +26,9 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); - /// Initialize the player - await SoLoud.instance.init().then( - (_) { - Logger('main').info('player started'); - SoLoud.instance.setVisualizationEnabled(true); - SoLoud.instance.setGlobalVolume(1); - SoLoud.instance.setMaxActiveVoiceCount(32); - }, - onError: (Object e) { - Logger('main').severe('player starting error: $e'); - }, - ); + // await SoLoud.instance.init(); + // SoLoudCapture.instance.initialize(); + // SoLoud.instance.setVisualizationEnabled(true); runApp(const MyApp()); } @@ -55,67 +41,183 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - @override - void dispose() { - SoLoud.instance.deinit(); - super.dispose(); - } + // final _flutterSoloudPlugin = FlutterSoloudWeb(); + final _flutterSoloudPlugin = SoLoud.instance; + final _flutterSoloudCapturePlugin = SoLoudCapture.instance; + AudioSource? audioSource; + late SoundHash soundHash; + late SoundHandle soundHandle; + final smooth = ValueNotifier(1); @override Widget build(BuildContext context) { return MaterialApp( - themeMode: ThemeMode.dark, - darkTheme: ThemeData.dark(useMaterial3: true), - scrollBehavior: const MaterialScrollBehavior().copyWith( - // enable mouse dragging also on desktop - dragDevices: PointerDeviceKind.values.toSet(), - ), - home: const MyHomePage(), - ); - } -} + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Column( + children: [ + OutlinedButton( + onPressed: () async { + final e = _flutterSoloudCapturePlugin.listCaptureDevices(); + final devices = StringBuffer(); + for (final element in e) { + devices.write(element.isDefault ? 'X - ' : ' - '); + devices.write(element.name); + devices.write('\n'); + } + devices.write(null); -class MyHomePage extends StatelessWidget { - const MyHomePage({super.key}); + print('CAPTURE list devices:\n$devices'); + }, + child: const Text('list devices'), + ), + OutlinedButton( + onPressed: () async { + final e = _flutterSoloudCapturePlugin.startCapture(); + print('CAPTURE start $e'); + }, + child: const Text('start capture'), + ), + const SizedBox(height: 20), + //////////////////////////////////////// + //////////////////////////////////////// + //////////////////////////////////////// + OutlinedButton( + onPressed: () async { + try { + await SoLoud.instance.init(); + // SoLoudCapture.instance.init(); + // SoLoud.instance.setVisualizationEnabled(true); + } on Exception catch (_) {} + }, + child: const Text('init'), + ), + OutlinedButton( + onPressed: () async { + try { + SoLoud.instance.setVisualizationEnabled(true); + } on Exception catch (_) {} + }, + child: const Text('VisualizationEnabled'), + ), + OutlinedButton( + onPressed: () async { + // _flutterSoloudPlugin.sendMessage('voiceEndedCallback',7777); + }, + child: const Text('send to worker'), + ), + OutlinedButton( + onPressed: () async { + _flutterSoloudPlugin + .getFilterParamNames(FilterType.biquadResonantFilter); + }, + child: const Text('getFilterParamNames'), + ), + OutlinedButton( + onPressed: () async { + try { + audioSource = await _flutterSoloudPlugin.loadWaveform( + WaveForm.bounce, + true, + 1, + 1, + ); + soundHash = audioSource!.soundHash; + print('main loadWaveform audioSource: $soundHash'); + } on Exception catch (_) {} + }, + child: const Text('load waveform'), + ), + OutlinedButton( + onPressed: () async { + if (kIsWeb) { + final result = await FilePicker.platform + .pickFiles(type: FileType.any, allowMultiple: false); + if (result != null && result.files.isNotEmpty) { + final fileName = result.files.first.name; + final fileBytes = result.files.first.bytes; + try { + audioSource = await _flutterSoloudPlugin.loadMem( + fileName, + fileBytes!, + ); + soundHash = audioSource!.soundHash; + } on Exception catch (_) {} + } + } + }, + child: const Text('load mem picked file into'), + ), + OutlinedButton( + onPressed: () async { + final byteData = + await rootBundle.load('assets/audio/explosion.mp3'); + final buffer = byteData.buffer; + try { + audioSource = await _flutterSoloudPlugin.loadMem( + 'assets/explosion.mp3', + buffer.asUint8List(), + ); + soundHash = audioSource!.soundHash; + } on Exception catch (_) {} + }, + child: const Text('loadMem explosion'), + ), + OutlinedButton( + onPressed: () async { + try { + if (audioSource != null) { + soundHandle = + await _flutterSoloudPlugin.play(audioSource!); + } + } on Exception catch (_) {} + }, + child: const Text('play'), + ), + //////////////////////////////////////////////// + //////////////////////////////////////////////// + //////////////////////////////////////////////// + // OutlinedButton( + // onPressed: () { + // audioData.updateSamples(); + // final s = StringBuffer(); + // for (var i = 0; i < 20; i++) { + // s.write( + // audioData + // .get2D(SampleRow(0), SampleColumn(i)) + // .toStringAsFixed(1), + // ); + // } + // print('texture2d: $s'); + // }, + // child: const Text('get texture'), + // ), + //////////////////////////////////////////////// + //////////////////////////////////////////////// + //////////////////////////////////////////////// - @override - Widget build(BuildContext context) { - return DefaultTabController( - length: 5, - initialIndex: 2, - child: SafeArea( - child: Scaffold( - body: Column( - children: [ - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: TabBar( - isScrollable: true, - onTap: (value) { - SoLoud.instance.disposeAllSources(); - }, - tabs: const [ - Tab(text: 'hello world!'), - Tab(text: 'visualizer'), - Tab(text: 'multi track'), - Tab(text: '3D audio'), - Tab(text: 'wave form'), - ], - ), + OutlinedButton( + onPressed: _flutterSoloudPlugin.deinit, + child: const Text('dispose'), ), - const SizedBox(height: 8), - const Expanded( - child: TabBarView( - physics: NeverScrollableScrollPhysics(), - children: [ - PageHelloFlutterSoLoud(), - PageVisualizer(), - PageMultiTrack(), - Page3DAudio(), - PageWaveform(), - ], - ), + const SizedBox(height: 40), + ValueListenableBuilder( + valueListenable: smooth, + builder: (_, value, __) { + return Slider( + value: value, + onChanged: (v) { + smooth.value = v; + try { + SoLoud.instance.setFftSmoothing(smooth.value); + } on Exception catch (_) {} + },); + }, ), + const Bars(), ], ), ), diff --git a/example/lib/main_complete.dart b/example/lib/main_complete.dart new file mode 100644 index 0000000..49998df --- /dev/null +++ b/example/lib/main_complete.dart @@ -0,0 +1,127 @@ +import 'dart:developer' as dev; +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_soloud/flutter_soloud.dart'; +import 'package:flutter_soloud_example/page_3d_audio.dart'; +import 'package:flutter_soloud_example/page_hello_flutter.dart'; +import 'package:flutter_soloud_example/page_multi_track.dart'; +import 'package:flutter_soloud_example/page_visualizer.dart'; +import 'package:flutter_soloud_example/page_waveform.dart'; +import 'package:logging/logging.dart'; + +void main() async { + // The `flutter_soloud` package logs everything + // (from severe warnings to fine debug messages) + // using the standard `package:logging`. + // You can listen to the logs as shown below. + Logger.root.level = kDebugMode ? Level.FINE : Level.INFO; + Logger.root.onRecord.listen((record) { + dev.log( + record.message, + time: record.time, + level: record.level.value, + name: record.loggerName, + zone: record.zone, + error: record.error, + stackTrace: record.stackTrace, + ); + }); + + WidgetsFlutterBinding.ensureInitialized(); + + /// Initialize the player + await SoLoud.instance.init().then( + (_) { + Logger('main').info('player started'); + SoLoud.instance.setVisualizationEnabled(true); + SoLoud.instance.setGlobalVolume(1); + SoLoud.instance.setMaxActiveVoiceCount(32); + }, + onError: (Object e) { + Logger('main').severe('player starting error: $e'); + }, + ); + + // SoLoudCapture.instance.init(); + + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + void dispose() { + SoLoud.instance.deinit(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + themeMode: ThemeMode.dark, + darkTheme: ThemeData.dark(useMaterial3: true), + scrollBehavior: const MaterialScrollBehavior().copyWith( + // enable mouse dragging also on desktop + dragDevices: PointerDeviceKind.values.toSet(), + ), + home: const MyHomePage(), + ); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 5, + initialIndex: 0, + child: SafeArea( + child: Scaffold( + body: Column( + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: TabBar( + isScrollable: true, + onTap: (value) { + SoLoud.instance.disposeAllSources(); + }, + tabs: const [ + Tab(text: 'hello world!'), + Tab(text: 'visualizer'), + Tab(text: 'multi track'), + Tab(text: '3D audio'), + Tab(text: 'wave form'), + ], + ), + ), + const SizedBox(height: 8), + const Expanded( + child: TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + PageHelloFlutterSoLoud(), + PageVisualizer(), + PageMultiTrack(), + Page3DAudio(), + PageWaveform(), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/example/lib/page_hello_flutter.dart b/example/lib/page_hello_flutter.dart index 1ed3a77..f82232e 100644 --- a/example/lib/page_hello_flutter.dart +++ b/example/lib/page_hello_flutter.dart @@ -1,8 +1,6 @@ import 'dart:async'; -import 'dart:ffi' as ffi; import 'dart:typed_data'; -import 'package:ffi/ffi.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -42,11 +40,28 @@ class _PageHelloFlutterSoLoudState extends State { )) ?.files; if (paths != null) { - unawaited(play(paths.first.path!)); + unawaited(playFile(paths.first.path!)); } }, child: const Text('pick audio'), ), + /// pick audio file + ElevatedButton( + onPressed: () async { + final paths = (await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['mp3', 'wav', 'ogg', 'flac'], + onFileLoading: print, + dialogTitle: 'Pick audio file', + )) + ?.files; + + if (paths != null) { + unawaited(playWeb(paths.first.name, paths.first.bytes!)); + } + }, + child: const Text('pick audio for web'), + ), Column( children: [ /// start/stop the capture @@ -56,7 +71,7 @@ class _PageHelloFlutterSoLoudState extends State { SoLoudCapture.instance.stopCapture(); if (context.mounted) setState(() {}); } else { - final a = SoLoudCapture.instance.initialize(); + final a = SoLoudCapture.instance.init(); final b = SoLoudCapture.instance.startCapture(); if (context.mounted && a == CaptureErrors.captureNoError && @@ -82,7 +97,7 @@ class _PageHelloFlutterSoLoudState extends State { } /// play file - Future play(String file) async { + Future playFile(String file) async { /// stop any previous sound loaded if (currentSound != null) { try { @@ -107,6 +122,33 @@ class _PageHelloFlutterSoLoudState extends State { /// play it await SoLoud.instance.play(currentSound!); } + + /// play bytes for web. + Future playWeb(String fileName, Uint8List bytes) async { + /// stop any previous sound loaded + if (currentSound != null) { + try { + await SoLoud.instance.disposeSource(currentSound!); + } catch (e) { + _log.severe('dispose error', e); + return; + } + } + + /// load the audio file + final AudioSource newSound; + try { + newSound = await SoLoud.instance.loadMem(fileName, bytes); + } catch (e) { + _log.severe('load error', e); + return; + } + + currentSound = newSound; + + /// play it + await SoLoud.instance.play(currentSound!); + } } /// widget that uses a ticker to read and provide audio @@ -127,27 +169,32 @@ class MicAudioWidget extends StatefulWidget { class _MicAudioWidgetState extends State with SingleTickerProviderStateMixin { - late Ticker ticker; - late ffi.Pointer> audioData; + Ticker? ticker; + final audioData = AudioData( + GetSamplesFrom.microphone, + GetSamplesKind.wave, + ); @override void initState() { super.initState(); - audioData = calloc(); - SoLoudCapture.instance.getCaptureAudioTexture2D(audioData); ticker = createTicker((Duration elapsed) { - if (mounted) { - SoLoudCapture.instance.getCaptureAudioTexture2D(audioData); - setState(() {}); + if (context.mounted) { + try { + audioData.updateSamples(); + setState(() {}); + } on Exception catch (e) { + debugPrint('$e'); + } } }); - ticker.start(); + ticker?.start(); } @override void dispose() { - ticker.stop(); - calloc.free(audioData); + ticker?.stop(); + audioData.dispose(); super.dispose(); } @@ -168,7 +215,7 @@ class MicAudioPainter extends CustomPainter { const MicAudioPainter({ required this.audioData, }); - final ffi.Pointer> audioData; + final AudioData audioData; @override void paint(Canvas canvas, Size size) { @@ -188,9 +235,7 @@ class MicAudioPainter extends CustomPainter { for (var n = 0; n < 32; n++) { var f = 0.0; for (var i = 0; i < 8; i++) { - /// audioData[n * 8 + i] is the FFT data - /// If you want wave data, add 256 to the index - f += audioData.value[n * 8 + i + 256]; + f += audioData.getWave(SampleWave(n * 8 + i)); } data[n] = f / 8; } diff --git a/example/lib/page_multi_track.dart b/example/lib/page_multi_track.dart index 25a1fae..dbb27e8 100644 --- a/example/lib/page_multi_track.dart +++ b/example/lib/page_multi_track.dart @@ -1,12 +1,9 @@ // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:async'; -import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; import 'package:logging/logging.dart'; -import 'package:path_provider/path_provider.dart'; class PageMultiTrack extends StatefulWidget { const PageMultiTrack({super.key}); @@ -175,15 +172,8 @@ class _PlaySoundWidgetState extends State { } Future loadAsset() async { - final path = (await getAssetFile(widget.assetsAudio)).path; - final AudioSource? newSound; - try { - newSound = await SoLoud.instance.loadFile(path); - } catch (e) { - _log.severe('Load sound asset failed', e); - return false; - } + newSound = await SoLoud.instance.loadAsset(widget.assetsAudio); soundLength = SoLoud.instance.getLength(newSound); sound = newSound; @@ -260,24 +250,6 @@ class _PlaySoundWidgetState extends State { isPaused[newHandle] = ValueNotifier(false); soundPosition[newHandle] = ValueNotifier(0); } - - /// get the assets file and copy it to the temp dir - Future getAssetFile(String assetsFile) async { - final tempDir = await getTemporaryDirectory(); - final tempPath = tempDir.path; - final filePath = '$tempPath/$assetsFile'; - final file = File(filePath); - if (file.existsSync()) { - return file; - } else { - final byteData = await rootBundle.load(assetsFile); - final buffer = byteData.buffer; - await file.create(recursive: true); - return file.writeAsBytes( - buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), - ); - } - } } /// row widget containing play/pause and time slider diff --git a/example/lib/page_visualizer.dart b/example/lib/page_visualizer.dart index 27d645b..9b8ff80 100644 --- a/example/lib/page_visualizer.dart +++ b/example/lib/page_visualizer.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'dart:io'; import 'dart:ui' as ui; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; @@ -40,19 +40,29 @@ class _PageVisualizerState extends State { 'assets/audio/12Bands/audiocheck.net_sin_16000Hz_-3dBFS_2s.wav', 'assets/audio/12Bands/audiocheck.net_sin_20000Hz_-3dBFS_2s.wav', ]; - final ValueNotifier textureType = - ValueNotifier(TextureType.fft2D); + late final ValueNotifier samplesKind; final ValueNotifier fftSmoothing = ValueNotifier(0.8); final ValueNotifier isVisualizerForPlayer = ValueNotifier(true); final ValueNotifier isVisualizerEnabled = ValueNotifier(true); - final ValueNotifier fftImageRange = - ValueNotifier(const RangeValues(0, 255)); - final ValueNotifier maxFftImageRange = ValueNotifier(255); + late ValueNotifier fftImageRange; final ValueNotifier soundLength = ValueNotifier(0); final ValueNotifier soundPosition = ValueNotifier(0); Timer? timer; AudioSource? currentSound; - FftController visualizerController = FftController(); + late final VisualizerController visualizerController; + + @override + void initState() { + super.initState(); + samplesKind = ValueNotifier(GetSamplesKind.linear); + visualizerController = VisualizerController(samplesKind: samplesKind.value); + fftImageRange = ValueNotifier( + RangeValues( + visualizerController.minRange.toDouble(), + visualizerController.maxRange.toDouble(), + ), + ); + } @override Widget build(BuildContext context) { @@ -66,14 +76,14 @@ class _PageVisualizerState extends State { SoLoudCapture.instance.stopCapture(); visualizerController.changeIsCaptureStarted(false); } else { - SoLoudCapture.instance.initialize(deviceID: deviceID); + SoLoudCapture.instance.init(deviceID: deviceID); SoLoudCapture.instance.startCapture(); visualizerController.changeIsCaptureStarted(true); } }, onDeviceIdChanged: (deviceID) { SoLoudCapture.instance.stopCapture(); - SoLoudCapture.instance.initialize(deviceID: deviceID); + SoLoudCapture.instance.init(deviceID: deviceID); SoLoudCapture.instance.startCapture(); }, ), @@ -93,7 +103,10 @@ class _PageVisualizerState extends State { ), linearShapeParams: LinearShapeParams( angle: -90, - space: Platform.isAndroid || Platform.isIOS ? -10 : 10, + space: defaultTargetPlatform == TargetPlatform.android || + defaultTargetPlatform == TargetPlatform.iOS + ? -10 + : 10, alignment: LinearAlignment.left, ), ), @@ -179,7 +192,7 @@ class _PageVisualizerState extends State { ), const SizedBox(width: 10), - /// texture type + /// texture kind StarMenu( params: StarMenuParameters( shape: MenuShape.linear, @@ -198,48 +211,52 @@ class _PageVisualizerState extends State { controller.closeMenu!(); }, items: [ - /// frequencies on 1st 256 px row - /// wave on 2nd 256 px row + /// wave data (amplitudes) ActionChip( backgroundColor: Colors.blue, onPressed: () { - textureType.value = TextureType.both1D; + samplesKind.value = GetSamplesKind.wave; + visualizerController + .changeSamplesKind(GetSamplesKind.wave); + fftImageRange.value = const RangeValues(0, 255); }, - label: const Text('both 1D'), + label: const Text('wave data'), ), - /// frequencies (FFT) + /// frequencies on 1st 256 px row + /// wave on 2nd 256 px row ActionChip( backgroundColor: Colors.blue, onPressed: () { - textureType.value = TextureType.fft2D; + samplesKind.value = GetSamplesKind.linear; + visualizerController + .changeSamplesKind(GetSamplesKind.linear); + fftImageRange.value = const RangeValues(0, 255); }, - label: const Text('frequencies'), + label: const Text('linear'), ), - /// wave data (amplitudes) + /// both fft and wave ActionChip( backgroundColor: Colors.blue, onPressed: () { - textureType.value = TextureType.wave2D; + samplesKind.value = GetSamplesKind.texture; + visualizerController + .changeSamplesKind(GetSamplesKind.texture); + fftImageRange.value = const RangeValues(0, 511); }, - label: const Text('wave data'), + label: const Text('texture'), ), - - /// both fft and wave - /// not implemented yet - // ActionChip( - // backgroundColor: Colors.blue, - // onPressed: () { - // textureType.value = TextureType.both2D; - // }, - // label: const Text('both'), - // ), ], - child: const Chip( - label: Text('texture'), - backgroundColor: Colors.blue, - avatar: Icon(Icons.arrow_drop_down), + child: ValueListenableBuilder( + valueListenable: samplesKind, + builder: (_, type, __) { + return Chip( + label: Text(type.name), + backgroundColor: Colors.blue, + avatar: const Icon(Icons.arrow_drop_down), + ); + }, ), ), ], @@ -271,7 +288,15 @@ class _PageVisualizerState extends State { )) ?.files; if (paths != null) { - unawaited(play(paths.first.path!)); + final AudioSource audioFile; + if (kIsWeb) { + audioFile = await SoLoud.instance + .loadMem(paths.first.path!, paths.first.bytes!); + } else { + audioFile = + await SoLoud.instance.loadFile(paths.first.path!); + } + unawaited(play(audioFile)); } }, child: const Text('pick audio'), @@ -330,14 +355,13 @@ class _PageVisualizerState extends State { Text('FFT range ${fftRange.start.toInt()}'), Expanded( child: RangeSlider( - max: 255, - divisions: 256, + max: visualizerController.maxRangeLimit.toDouble() +1, values: fftRange, onChanged: (values) { fftImageRange.value = values; visualizerController - ..changeMinFreq(values.start.toInt()) - ..changeMaxFreq(values.end.toInt()); + ..changeMin(values.start.toInt()) + ..changeMax(values.end.toInt()); }, ), ), @@ -387,7 +411,7 @@ class _PageVisualizerState extends State { .changeIsVisualizerForPlayer(!value); }, ), - const Text('show capture data'), + const Text('show mic data'), Checkbox( value: forPlayer, onChanged: (value) { @@ -422,52 +446,19 @@ class _PageVisualizerState extends State { ), /// VISUALIZER - FutureBuilder( - future: loadShader(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ValueListenableBuilder( - valueListenable: textureType, - builder: (_, type, __) { - return Visualizer( - key: UniqueKey(), - controller: visualizerController, - shader: snapshot.data!, - textureType: type, - ); - }, - ); - } else { - if (snapshot.data == null) { - return const Placeholder( - child: Align( - child: Text('Error compiling shader.\nSee log'), - ), - ); - } - return const CircularProgressIndicator(); - } - }, - ), + Visualizer( + // key: UniqueKey(), + controller: visualizerController, + shader: shader, + ), ], ), ), ); } - /// load asynchronously the fragment shader - Future loadShader() async { - try { - final program = await ui.FragmentProgram.fromAsset(shader); - return program.fragmentShader(); - } catch (e) { - _log.severe('error compiling the shader', e); - } - return null; - } - /// play file - Future play(String file) async { + Future play(AudioSource source) async { if (currentSound != null) { try { await SoLoud.instance.disposeSource(currentSound!); @@ -477,9 +468,7 @@ class _PageVisualizerState extends State { } stopTimer(); } - - /// load the file - currentSound = await SoLoud.instance.loadFile(file); + currentSound = source; /// play it await SoLoud.instance.play(currentSound!); @@ -494,7 +483,7 @@ class _PageVisualizerState extends State { (event) { stopTimer(); - /// It's needed to call dispose when it end else it will + /// It's needed to call dispose when it ends else it will /// not be cleared SoLoud.instance.disposeSource(currentSound!); currentSound = null; @@ -505,26 +494,9 @@ class _PageVisualizerState extends State { /// plays an assets file Future playAsset(String assetsFile) async { - final audioFile = await getAssetFile(assetsFile); - return play(audioFile.path); - } - - /// get the assets file and copy it to the temp dir - Future getAssetFile(String assetsFile) async { - final tempDir = await getTemporaryDirectory(); - final tempPath = tempDir.path; - final filePath = '$tempPath/$assetsFile'; - final file = File(filePath); - if (file.existsSync()) { - return file; - } else { - final byteData = await rootBundle.load(assetsFile); - final buffer = byteData.buffer; - await file.create(recursive: true); - return file.writeAsBytes( - buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), - ); - } + // final audioFile = await getAssetFile(assetsFile); + final audioFile = await SoLoud.instance.loadAsset(assetsFile); + return play(audioFile); } /// start timer to update the audio position slider diff --git a/example/lib/page_waveform.dart b/example/lib/page_waveform.dart index 7f7ce77..3e13a60 100644 --- a/example/lib/page_waveform.dart +++ b/example/lib/page_waveform.dart @@ -1,12 +1,10 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; -import 'package:flutter_soloud_example/waveform/bars.dart'; -import 'package:flutter_soloud_example/waveform/filter_fx.dart'; -import 'package:flutter_soloud_example/waveform/keyboard_widget.dart'; -import 'package:flutter_soloud_example/waveform/knobs_groups.dart'; -import 'package:flutter_soloud_example/waveform/text_slider.dart'; +import 'package:flutter_soloud_example/ui/bars.dart'; +import 'package:flutter_soloud_example/ui/filter_fx.dart'; +import 'package:flutter_soloud_example/ui/keyboard_widget.dart'; +import 'package:flutter_soloud_example/ui/knobs_groups.dart'; +import 'package:flutter_soloud_example/ui/text_slider.dart'; import 'package:star_menu/star_menu.dart'; /// Example to demostrate how waveforms work with a keyboard @@ -82,13 +80,8 @@ class _PageWaveformState extends State { await SoLoud.instance.disposeSource(sound!); } - /// text created by ChatGPT :) await SoLoud.instance - .speechText('Flutter and So Loud audio plugin are the ' - "tech tag team you never knew you needed - they're " - 'like Batman and Robin, swooping in to save your ' - 'app with style and sound effects that would make ' - 'even Gotham jealous!') + .speechText('Hello Flutter Soloud!') .then((value) => sound = value); }, child: const Text('T2S'), @@ -290,9 +283,8 @@ class _PageWaveformState extends State { blurSigmaX: 6, blurSigmaY: 6, ), - linearShapeParams: LinearShapeParams( + linearShapeParams: const LinearShapeParams( angle: -90, - space: Platform.isAndroid || Platform.isIOS ? -10 : 10, alignment: LinearAlignment.left, ), ), diff --git a/example/lib/waveform/bars.dart b/example/lib/ui/bars.dart similarity index 76% rename from example/lib/waveform/bars.dart rename to example/lib/ui/bars.dart index e2d49aa..37465be 100644 --- a/example/lib/waveform/bars.dart +++ b/example/lib/ui/bars.dart @@ -1,6 +1,3 @@ -import 'dart:ffi' as ffi; - -import 'package:ffi/ffi.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; @@ -8,8 +5,9 @@ import 'package:flutter_soloud_example/visualizer/bars_fft_widget.dart'; import 'package:flutter_soloud_example/visualizer/bars_wave_widget.dart'; /// Visualizer for FFT and wave data -/// class Bars extends StatefulWidget { + /// If true get audio data from the player else from the mic + const Bars({super.key}); @override @@ -18,12 +16,13 @@ class Bars extends StatefulWidget { class BarsState extends State with SingleTickerProviderStateMixin { late final Ticker ticker; - ffi.Pointer> playerData = ffi.nullptr; - + final AudioData audioData = AudioData( + GetSamplesFrom.player, + GetSamplesKind.linear, + ); @override void initState() { super.initState(); - playerData = calloc(); ticker = createTicker(_tick); ticker.start(); } @@ -31,15 +30,18 @@ class BarsState extends State with SingleTickerProviderStateMixin { @override void dispose() { ticker.stop(); - calloc.free(playerData); - playerData = ffi.nullptr; + audioData.dispose(); super.dispose(); } void _tick(Duration elapsed) { - if (mounted) { - SoLoud.instance.getAudioTexture2D(playerData); - setState(() {}); + if (context.mounted) { + try { + audioData.updateSamples(); + setState(() {}); + } on Exception catch (e) { + debugPrint('$e'); + } } } @@ -50,7 +52,7 @@ class BarsState extends State with SingleTickerProviderStateMixin { child: Row( children: [ BarsFftWidget( - audioData: playerData.value, + audioData: audioData, minFreq: 0, maxFreq: 128, width: MediaQuery.sizeOf(context).width / 2 - 17, @@ -58,7 +60,7 @@ class BarsState extends State with SingleTickerProviderStateMixin { ), const SizedBox(width: 6), BarsWaveWidget( - audioData: playerData.value, + audioData: audioData, width: MediaQuery.sizeOf(context).width / 2 - 17, height: MediaQuery.sizeOf(context).width / 6, ), diff --git a/example/lib/waveform/filter_fx.dart b/example/lib/ui/filter_fx.dart similarity index 97% rename from example/lib/waveform/filter_fx.dart rename to example/lib/ui/filter_fx.dart index 99c66f1..c6d4884 100644 --- a/example/lib/waveform/filter_fx.dart +++ b/example/lib/ui/filter_fx.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; -import 'package:flutter_soloud_example/waveform/touch_slider.dart'; +import 'package:flutter_soloud_example/ui/touch_slider.dart'; class FilterFx extends StatefulWidget { const FilterFx({ @@ -9,6 +9,7 @@ class FilterFx extends StatefulWidget { }); final FilterType filterType; + @override State createState() => _FilterFxState(); } diff --git a/example/lib/waveform/keyboard_widget.dart b/example/lib/ui/keyboard_widget.dart similarity index 100% rename from example/lib/waveform/keyboard_widget.dart rename to example/lib/ui/keyboard_widget.dart diff --git a/example/lib/waveform/knobs_groups.dart b/example/lib/ui/knobs_groups.dart similarity index 95% rename from example/lib/waveform/knobs_groups.dart rename to example/lib/ui/knobs_groups.dart index db2b71b..07a9cab 100644 --- a/example/lib/waveform/knobs_groups.dart +++ b/example/lib/ui/knobs_groups.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_soloud_example/waveform/touch_slider.dart'; +import 'package:flutter_soloud_example/ui/touch_slider.dart'; class KnobsGroup extends StatefulWidget { const KnobsGroup({ diff --git a/example/lib/waveform/text_slider.dart b/example/lib/ui/text_slider.dart similarity index 100% rename from example/lib/waveform/text_slider.dart rename to example/lib/ui/text_slider.dart diff --git a/example/lib/waveform/touch_slider.dart b/example/lib/ui/touch_slider.dart similarity index 100% rename from example/lib/waveform/touch_slider.dart rename to example/lib/ui/touch_slider.dart diff --git a/example/lib/visualizer/bars_fft_widget.dart b/example/lib/visualizer/bars_fft_widget.dart index 3801c32..2eba295 100644 --- a/example/lib/visualizer/bars_fft_widget.dart +++ b/example/lib/visualizer/bars_fft_widget.dart @@ -1,7 +1,8 @@ -import 'dart:ffi' as ffi; - +// ignore_for_file: public_member_api_docs import 'package:flutter/material.dart'; +import 'package:flutter_soloud/flutter_soloud.dart'; + /// Draw the audio FFT data /// class BarsFftWidget extends StatelessWidget { @@ -14,7 +15,7 @@ class BarsFftWidget extends StatelessWidget { super.key, }); - final ffi.Pointer audioData; + final AudioData audioData; final int minFreq; final int maxFreq; final double width; @@ -22,7 +23,9 @@ class BarsFftWidget extends StatelessWidget { @override Widget build(BuildContext context) { - if (audioData.address == 0x0) return const SizedBox.shrink(); + if (audioData.getSamplesKind == GetSamplesKind.wave) { + return const Placeholder(); + } return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -55,7 +58,7 @@ class FftPainter extends CustomPainter { required this.minFreq, required this.maxFreq, }); - final ffi.Pointer audioData; + final AudioData audioData; final int minFreq; final int maxFreq; @@ -68,7 +71,18 @@ class FftPainter extends CustomPainter { ..style = PaintingStyle.stroke; for (var i = minFreq; i <= maxFreq; i++) { - final barHeight = size.height * audioData[i]; + late final double barHeight; + try { + final double data; + if (audioData.getSamplesKind == GetSamplesKind.linear) { + data = audioData.getLinearFft(SampleLinear(i)); + } else { + data = audioData.getTexture(SampleRow(0), SampleColumn(i)); + } + barHeight = size.height * data; + } on Exception { + barHeight = 0; + } canvas.drawRect( Rect.fromLTWH( barWidth * (i - minFreq), diff --git a/example/lib/visualizer/bars_wave_widget.dart b/example/lib/visualizer/bars_wave_widget.dart index 0967064..076e7b3 100644 --- a/example/lib/visualizer/bars_wave_widget.dart +++ b/example/lib/visualizer/bars_wave_widget.dart @@ -1,6 +1,5 @@ -import 'dart:ffi' as ffi; - import 'package:flutter/material.dart'; +import 'package:flutter_soloud/flutter_soloud.dart'; /// Draw the audio wave data /// @@ -12,14 +11,12 @@ class BarsWaveWidget extends StatelessWidget { super.key, }); - final ffi.Pointer audioData; + final AudioData audioData; final double width; final double height; @override Widget build(BuildContext context) { - if (audioData.address == 0x0) return const SizedBox.shrink(); - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -45,7 +42,7 @@ class WavePainter extends CustomPainter { const WavePainter({ required this.audioData, }); - final ffi.Pointer audioData; + final AudioData audioData; @override void paint(Canvas canvas, Size size) { @@ -56,7 +53,20 @@ class WavePainter extends CustomPainter { ..style = PaintingStyle.stroke; for (var i = 0; i < 256; i++) { - final barHeight = size.height * audioData[i + 256]; + late final double barHeight; + try { + final double data; + if (audioData.getSamplesKind == GetSamplesKind.wave) { + data = audioData.getWave(SampleWave(i)); + } else if (audioData.getSamplesKind == GetSamplesKind.linear) { + data = audioData.getLinearWave(SampleLinear(i)); + } else { + data = audioData.getTexture(SampleRow(0), SampleColumn(i+256)); + } + barHeight = size.height * data; + } on Exception { + barHeight = 0; + } canvas.drawRect( Rect.fromLTWH( barWidth * i, diff --git a/example/lib/visualizer/visualizer.dart b/example/lib/visualizer/visualizer.dart index 23c0ce2..efda036 100644 --- a/example/lib/visualizer/visualizer.dart +++ b/example/lib/visualizer/visualizer.dart @@ -1,11 +1,11 @@ // ignore_for_file: avoid_positional_boolean_parameters import 'dart:async'; -import 'dart:ffi' as ffi; +import 'dart:math'; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'package:ffi/ffi.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_soloud/flutter_soloud.dart'; @@ -15,49 +15,52 @@ import 'package:flutter_soloud_example/visualizer/bars_wave_widget.dart'; import 'package:flutter_soloud_example/visualizer/bmp_header.dart'; import 'package:flutter_soloud_example/visualizer/paint_texture.dart'; -/// enum to tell [Visualizer] to build a texture as: -/// [both1D] frequencies data on the 1st 256px row, wave on the 2nd 256px -/// [fft2D] frequencies data 256x256 px -/// [wave2D] wave data 256x256px -/// [both2D] both frequencies & wave data interleaved 256x512px -enum TextureType { - both1D, - fft2D, - wave2D, - both2D, // no implemented yet -} - -class FftController extends ChangeNotifier { - FftController({ - this.minFreqRange = 0, - this.maxFreqRange = 255, +class VisualizerController extends ChangeNotifier { + VisualizerController({ this.isVisualizerEnabled = true, this.isVisualizerForPlayer = true, this.isCaptureStarted = false, - }); + this.samplesKind = GetSamplesKind.texture, + }) : maxRangeLimit = samplesKind == GetSamplesKind.texture ? 511 : 255, + maxRange = samplesKind == GetSamplesKind.texture ? 511 : 255, + minRange = 0 { + audioData = AudioData( + isVisualizerForPlayer ? GetSamplesFrom.player : GetSamplesFrom.microphone, + samplesKind, + ); + } - int minFreqRange; - int maxFreqRange; + int maxRangeLimit; + int minRange; + int maxRange; bool isVisualizerEnabled; bool isVisualizerForPlayer; bool isCaptureStarted; + GetSamplesKind samplesKind; + late AudioData audioData; - void changeMinFreq(int minFreq) { - if (minFreq < 0) return; - if (minFreq >= maxFreqRange) return; - minFreqRange = minFreq; - notifyListeners(); + void changeMin(int min, {bool notify = true}) { + minRange = min.clamp(0, maxRange); + if (notify) { + notifyListeners(); + } } - void changeMaxFreq(int maxFreq) { - if (maxFreq > 255) return; - if (maxFreq <= minFreqRange) return; - maxFreqRange = maxFreq; - notifyListeners(); + void changeMax(int max, {bool notify = true}) { + final nMax = samplesKind == GetSamplesKind.texture ? 511 : 255; + maxRange = max.clamp(minRange, nMax); + if (notify) { + notifyListeners(); + } } void changeIsVisualizerForPlayer(bool isForPlayer) { isVisualizerForPlayer = isForPlayer; + audioData.dispose(); + audioData = AudioData( + isVisualizerForPlayer ? GetSamplesFrom.player : GetSamplesFrom.microphone, + samplesKind, + ); notifyListeners(); } @@ -71,51 +74,59 @@ class FftController extends ChangeNotifier { isCaptureStarted = enabled; notifyListeners(); } + + void changeSamplesKind(GetSamplesKind kind) { + samplesKind = kind; + switch (kind) { + case GetSamplesKind.linear: + changeMin(0, notify: false); + changeMax(255, notify: false); + maxRangeLimit = 255; + case GetSamplesKind.texture: + changeMin(0, notify: false); + changeMax(511, notify: false); + maxRangeLimit = 511; + case GetSamplesKind.wave: + changeMin(0, notify: false); + changeMax(255, notify: false); + maxRangeLimit = 255; + } + audioData.dispose(); + audioData = AudioData( + isVisualizerForPlayer ? GetSamplesFrom.player : GetSamplesFrom.microphone, + samplesKind, + ); + notifyListeners(); + } } class Visualizer extends StatefulWidget { const Visualizer({ required this.controller, required this.shader, - this.textureType = TextureType.fft2D, super.key, }); - final FftController controller; - final ui.FragmentShader shader; - final TextureType textureType; + final VisualizerController controller; + final String shader; @override State createState() => _VisualizerState(); } -class _VisualizerState extends State - with SingleTickerProviderStateMixin { +class _VisualizerState extends State with TickerProviderStateMixin { late Ticker ticker; late Stopwatch sw; - late Bmp32Header fftImageRow; - late Bmp32Header fftImageMatrix; - late int fftSize; - late int halfFftSize; - late int fftBitmapRange; - ffi.Pointer> playerData = ffi.nullptr; - ffi.Pointer> captureData = ffi.nullptr; + late Bmp32Header image; + late int bitmapRange; late Future Function() buildImageCallback; - late int Function(int row, int col) textureTypeCallback; + late int Function(SampleRow row, SampleColumn col) textureTypeCallback; int nFrames = 0; @override void initState() { super.initState(); - /// these constants must not be touched since SoLoud - /// gives back a size of 256 values - fftSize = 512; - halfFftSize = fftSize >> 1; - - playerData = calloc(); - captureData = calloc(); - ticker = createTicker(_tick); sw = Stopwatch(); sw.start(); @@ -126,7 +137,10 @@ class _VisualizerState extends State SoLoudCapture.instance.isCaptureStarted(); widget.controller.addListener(() { - ticker.stop(); + ticker + ..stop() + ..dispose(); + ticker = createTicker(_tick); setupBitmapSize(); ticker.start(); sw.reset(); @@ -136,55 +150,65 @@ class _VisualizerState extends State @override void dispose() { - ticker.stop(); + ticker + ..stop() + ..dispose(); sw.stop(); - calloc.free(playerData); - playerData = ffi.nullptr; - calloc.free(captureData); - captureData = ffi.nullptr; super.dispose(); } void _tick(Duration elapsed) { nFrames++; - if (mounted) { - setState(() {}); + if (context.mounted) { + try { + widget.controller.audioData.updateSamples(); + setState(() {}); + } on Exception catch (e) { + debugPrint('$e'); + } } } - void setupBitmapSize() { - fftBitmapRange = - widget.controller.maxFreqRange - widget.controller.minFreqRange; - fftImageRow = Bmp32Header.setHeader(fftBitmapRange, 2); - fftImageMatrix = Bmp32Header.setHeader(fftBitmapRange, 256); - - switch (widget.textureType) { - case TextureType.both1D: - { - buildImageCallback = buildImageFromLatestSamplesRow; - break; - } - case TextureType.fft2D: - { - buildImageCallback = buildImageFromAllSamplesMatrix; - textureTypeCallback = getFFTDataCallback; - break; - } - case TextureType.wave2D: - { - buildImageCallback = buildImageFromAllSamplesMatrix; - textureTypeCallback = getWaveDataCallback; - break; - } - // TODO(marco): implement this - case TextureType.both2D: - { - buildImageCallback = buildImageFromAllSamplesMatrix; - textureTypeCallback = getWaveDataCallback; - break; - } - } - } + // @override + // Widget build(BuildContext context) { + // return Row( + // children: [ + // Column( + // children: [ + // const Text( + // 'FFT data', + // style: TextStyle(fontWeight: FontWeight.bold), + // ), + + // /// FFT bars + // BarsFftWidget( + // audioData: widget.controller.audioData, + // minFreq: widget.controller.minRange, + // maxFreq: widget.controller.maxRange, + // width: 250, + // height: 120, + // ), + // ], + // ), + // const SizedBox(width: 6), + // Column( + // children: [ + // const Text( + // '256 wave data', + // style: TextStyle(fontWeight: FontWeight.bold), + // ), + + // /// wave data bars + // BarsWaveWidget( + // audioData: widget.controller.audioData, + // width: 250, + // height: 120, + // ), + // ], + // ), + // ], + // ); + // } @override Widget build(BuildContext context) { @@ -193,19 +217,13 @@ class _VisualizerState extends State builder: (context, dataTexture) { final fps = nFrames.toDouble() / (sw.elapsedMilliseconds / 1000.0); if (!dataTexture.hasData || dataTexture.data == null) { - return Placeholder( - color: Colors.yellow, - fallbackWidth: 100, - fallbackHeight: 100, + return const Placeholder( + color: Colors.red, strokeWidth: 0.5, - child: Text("can't get audio samples\n" - 'FPS: ${fps.toStringAsFixed(1)}'), + child: Text("\n can't get audio samples \n"), ); } - final nFft = - widget.controller.maxFreqRange - widget.controller.minFreqRange; - return LayoutBuilder( builder: (context, constraints) { return Column( @@ -244,12 +262,28 @@ class _VisualizerState extends State sw.reset(); nFrames = 0; }, - child: AudioShader( - width: constraints.maxWidth, - height: constraints.maxWidth / 2.4, - image: dataTexture.data!, - shader: widget.shader, - iTime: sw.elapsedMilliseconds / 1000.0, + child: FutureBuilder( + future: loadShader(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return AudioShader( + width: constraints.maxWidth, + height: constraints.maxWidth / 2.4, + image: dataTexture.data!, + shader: snapshot.data!, + iTime: sw.elapsedMilliseconds / 1000.0, + ); + } else { + if (snapshot.data == null) { + return const Placeholder( + child: Align( + child: Text('Error compiling shader.\nSee log'), + ), + ); + } + return const CircularProgressIndicator(); + } + }, ), ), @@ -257,9 +291,9 @@ class _VisualizerState extends State children: [ Column( children: [ - Text( - '$nFft FFT data', - style: const TextStyle(fontWeight: FontWeight.bold), + const Text( + 'FFT data', + style: TextStyle(fontWeight: FontWeight.bold), ), /// FFT bars @@ -271,11 +305,9 @@ class _VisualizerState extends State nFrames = 0; }, child: BarsFftWidget( - audioData: widget.controller.isVisualizerForPlayer - ? playerData.value - : captureData.value, - minFreq: widget.controller.minFreqRange, - maxFreq: widget.controller.maxFreqRange, + audioData: widget.controller.audioData, + minFreq: widget.controller.minRange, + maxFreq: widget.controller.maxRange, width: constraints.maxWidth / 2 - 3, height: constraints.maxWidth / 6, ), @@ -299,9 +331,7 @@ class _VisualizerState extends State nFrames = 0; }, child: BarsWaveWidget( - audioData: widget.controller.isVisualizerForPlayer - ? playerData.value - : captureData.value, + audioData: widget.controller.audioData, width: constraints.maxWidth / 2 - 3, height: constraints.maxWidth / 6, ), @@ -318,142 +348,182 @@ class _VisualizerState extends State ); } - /// build an image to be passed to the shader. - /// The image is a matrix of 256x2 RGBA pixels representing: - /// in the 1st row the frequencies data - /// in the 2nd row the wave data - Future buildImageFromLatestSamplesRow() async { - if (!widget.controller.isVisualizerEnabled) { - return null; + /// load asynchronously the fragment shader + Future loadShader() async { + try { + final program = await ui.FragmentProgram.fromAsset(widget.shader); + return program.fragmentShader(); + } catch (e) { + debugPrint('error compiling the shader $e'); } + return null; + } - /// get audio data from player or capture device - if (widget.controller.isVisualizerForPlayer) { - try { - SoLoud.instance.getAudioTexture2D(playerData); - } catch (e) { - return null; - } - } else if (!widget.controller.isVisualizerForPlayer && - widget.controller.isCaptureStarted) { - final ret = SoLoudCapture.instance.getCaptureAudioTexture2D(captureData); - if (ret != CaptureErrors.captureNoError) { - return null; - } - } else { - return null; + void setupBitmapSize() { + bitmapRange = widget.controller.maxRange - widget.controller.minRange + 1; + + switch (widget.controller.samplesKind) { + case GetSamplesKind.wave: + { + image = Bmp32Header.setHeader(bitmapRange, 1); + buildImageCallback = buildImageForWave; + break; + } + case GetSamplesKind.linear: + { + image = Bmp32Header.setHeader(bitmapRange, 2); + buildImageCallback = buildImageForLinear; + break; + } + case GetSamplesKind.texture: + { + image = Bmp32Header.setHeader(bitmapRange, 256); + buildImageCallback = buildImageForTexture; + break; + } } + } - if (!mounted) { + /// Build an image to be passed to the shader. + /// The image is a matrix of 256x1 RGBA pixels representing the wave data. + Future buildImageForWave() async { + if (!context.mounted) { + return null; + } + if (!(widget.controller.isVisualizerEnabled && + SoLoud.instance.getVoiceCount() > 0) && + !widget.controller.isCaptureStarted) { return null; } final completer = Completer(); - final bytes = Uint8List(fftBitmapRange * 2 * 4); + final bytes = Uint8List(bitmapRange * 4); // Fill the texture bitmap var col = 0; - for (var i = widget.controller.minFreqRange; - i < widget.controller.maxFreqRange; + for (var i = widget.controller.minRange; + i <= widget.controller.maxRange; ++i, ++col) { - // fill 1st bitmap row with magnitude - bytes[col * 4 + 0] = getFFTDataCallback(0, i); + // fill bitmap row with wave data + final z = getWave(SampleWave(i)); + bytes[col * 4 + 0] = z; bytes[col * 4 + 1] = 0; bytes[col * 4 + 2] = 0; bytes[col * 4 + 3] = 255; - // fill 2nd bitmap row with amplitude - bytes[(fftBitmapRange + col) * 4 + 0] = getWaveDataCallback(0, i); - bytes[(fftBitmapRange + col) * 4 + 1] = 0; - bytes[(fftBitmapRange + col) * 4 + 2] = 0; - bytes[(fftBitmapRange + col) * 4 + 3] = 255; } - final img = fftImageRow.storeBitmap(bytes); + final img = image.storeBitmap(bytes); ui.decodeImageFromList(img, completer.complete); return completer.future; } - /// build an image to be passed to the shader. - /// The image is a matrix of 256x256 RGBA pixels representing - /// rows of wave data or frequencies data. - /// Passing [getWaveDataCallback] as parameter, it will return wave data - /// Passing [getFFTDataCallback] as parameter, it will return FFT data - Future buildImageFromAllSamplesMatrix() async { - if (!widget.controller.isVisualizerEnabled) { + /// Build an image to be passed to the shader. + /// The image is a matrix of 256x2 RGBA pixels representing: + /// in the 1st row the frequencies data + /// in the 2nd row the wave data + Future buildImageForLinear() async { + if (!context.mounted) { return null; } - - /// get audio data from player or capture device - if (widget.controller.isVisualizerForPlayer) { - try { - SoLoud.instance.getAudioTexture2D(playerData); - } catch (e) { - return null; - } - } else if (!widget.controller.isVisualizerForPlayer && - widget.controller.isCaptureStarted) { - final ret = SoLoudCapture.instance.getCaptureAudioTexture2D(captureData); - if (ret != CaptureErrors.captureNoError) { - return null; - } - } else { + if (!(widget.controller.isVisualizerEnabled && + SoLoud.instance.getVoiceCount() > 0) && + !widget.controller.isCaptureStarted) { return null; } - if (!mounted) { - return null; + final completer = Completer(); + final bytes = Uint8List(bitmapRange * 4 * 2); + var col = 0; + // Fill the texture bitmap + for (var i = widget.controller.minRange; + i <= widget.controller.maxRange; + ++i, ++col) { + // fill 1st bitmap row with FFT magnitude + bytes[col * 4 + 0] = getLinearFft(SampleLinear(i)); + bytes[col * 4 + 1] = 0; + bytes[col * 4 + 2] = 0; + bytes[col * 4 + 3] = 255; + // fill 2nd bitmap row with wave amplitudes + bytes[col * 4 + 256 * 4 + 0] = getLinearWave(SampleLinear(i)); + bytes[col * 4 + 256 * 4 + 1] = 0; + bytes[col * 4 + 256 * 4 + 2] = 0; + bytes[col * 4 + 256 * 4 + 3] = 255; } - /// IMPORTANT: if [mounted] is not checked here, could happens that - /// dispose() is called before this is called but it is called! - /// Since in dispose the [audioData] is freed, there will be a crash! - /// I do not understand why this happens because the FutureBuilder - /// seems has not finished before dispose()!? - if (!mounted) { + final img = image.storeBitmap(bytes); + ui.decodeImageFromList(img, completer.complete); + + return completer.future; + } + + /// Build an image to be passed to the shader. + /// The image is a matrix of 256x256 RGBA pixels representing + /// rows of wave data or frequencies data. + Future buildImageForTexture() async { + if (!context.mounted) { return null; } + if (!(widget.controller.isVisualizerEnabled && + SoLoud.instance.getVoiceCount() > 0) && + !widget.controller.isCaptureStarted) { + return null; + } + + final width = widget.controller.maxRange - widget.controller.minRange; + + /// On the web seems there are some problems with `decodeImageFromList` + /// and larger image. Setting here an height of 80 instead of 256. + const height = kIsWeb ? 80 : 256; + final completer = Completer(); - final bytes = Uint8List(fftBitmapRange * 256 * 4); + final bytes = Uint8List(width * height * 4); // Fill the texture bitmap with wave data - for (var y = 0; y < 256; ++y) { + var row = 0; + for (var y = 0; y < height; ++y, ++row) { var col = 0; - for (var x = widget.controller.minFreqRange; - x < widget.controller.maxFreqRange; - ++x, ++col) { - bytes[y * fftBitmapRange * 4 + col * 4 + 0] = textureTypeCallback(y, x); - bytes[y * fftBitmapRange * 4 + col * 4 + 1] = 0; - bytes[y * fftBitmapRange * 4 + col * 4 + 2] = 0; - bytes[y * fftBitmapRange * 4 + col * 4 + 3] = 255; + for (var x = 0; x < width; ++x, ++col) { + final z = getTexture(SampleRow(y), SampleColumn(x)); + bytes[row * width * 4 + col * 4 + 0] = z; + bytes[row * width * 4 + col * 4 + 1] = 0; + bytes[row * width * 4 + col * 4 + 2] = 0; + bytes[row * width * 4 + col * 4 + 3] = 255; } } - final img = fftImageMatrix.storeBitmap(bytes); + image = Bmp32Header.setHeader(width, height); + final img = image.storeBitmap(bytes); ui.decodeImageFromList(img, completer.complete); + // final ui.Codec codec = await ui.instantiateImageCodec(img); + // final ui.FrameInfo frameInfo = await codec.getNextFrame(); + // completer.complete(frameInfo.image); return completer.future; } - int getFFTDataCallback(int row, int col) { - if (widget.controller.isVisualizerForPlayer) { - return (playerData.value[row * fftSize + col] * 255.0).toInt(); - } else { - return (captureData.value[row * fftSize + col] * 255.0).toInt(); - } + int getWave(SampleWave offset) { + final n = widget.controller.audioData.getWave(offset); + return (((n + 1.0) / 2.0).clamp(0, 1) * 128).toInt(); } - int getWaveDataCallback(int row, int col) { - if (widget.controller.isVisualizerForPlayer) { - return (((playerData.value[row * fftSize + halfFftSize + col] + 1.0) / - 2.0) * - 128) - .toInt(); - } else { - return (((captureData.value[row * fftSize + halfFftSize + col] + 1.0) / - 2.0) * - 128) - .toInt(); - } + int getLinearFft(SampleLinear offset) { + return (widget.controller.audioData.getLinearFft(offset).clamp(0, 1) * 255) + .toInt(); + } + + int getLinearWave(SampleLinear offset) { + final n = widget.controller.audioData.getLinearWave(offset).abs(); + return (((n + 1.0) / 2.0).clamp(0, 1) * 128).toInt(); + } + + int getTexture(SampleRow row, SampleColumn col) { + final n = widget.controller.audioData.getTexture(row, col); + + /// With col<256 we are asking for FFT values. + if (col.value < 256) return (n.clamp(0, 1) * 255).toInt(); + + /// With col>256 we are asking for wave values. + return (((n + 1.0) / 2.0).clamp(0, 1) * 128).toInt(); } } diff --git a/example/pubspec.lock b/example/pubspec.lock index 5ca483a..074bf54 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -405,5 +405,5 @@ packages: source: hosted version: "1.0.4" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.4.1 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e480168..d701be1 100755 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -7,7 +7,7 @@ maintainer: Marco Bavagnoli (@lildeimos) version: 0.1.0+1 environment: - sdk: '>=3.0.0 <4.0.0' + sdk: '>=3.4.1 <4.0.0' dependencies: cupertino_icons: ^1.0.2 diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 0000000..092d222 --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:example/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/example/web/favicon.png b/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 zcmd5=2T+s!lYZ%-(h(2@5fr2dC?F^$C=i-}R6$UX8af(!je;W5yC_|HmujSgN*6?W z3knF*TL1$|?oD*=zPbBVex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s literal 0 HcmV?d00001 diff --git a/example/web/icons/Icon-maskable-192.png b/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/example/web/icons/Icon-maskable-512.png b/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/example/web/index.html b/example/web/index.html new file mode 100644 index 0000000..0561a1b --- /dev/null +++ b/example/web/index.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + flutter_soloud example + + + + + + + diff --git a/example/web/manifest.json b/example/web/manifest.json new file mode 100644 index 0000000..096edf8 --- /dev/null +++ b/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/lib/flutter_soloud.dart b/lib/flutter_soloud.dart index ddc7ec9..a860ad2 100644 --- a/lib/flutter_soloud.dart +++ b/lib/flutter_soloud.dart @@ -2,6 +2,8 @@ library flutter_soloud; export 'src/audio_source.dart'; +export 'src/bindings/audio_data.dart'; +export 'src/bindings/audio_data_extensions.dart'; export 'src/enums.dart' hide PlayerErrors, PlayerStateNotification; export 'src/exceptions/exceptions.dart'; export 'src/filter_params.dart'; diff --git a/lib/src/bindings/audio_data.dart b/lib/src/bindings/audio_data.dart new file mode 100644 index 0000000..89c2e7a --- /dev/null +++ b/lib/src/bindings/audio_data.dart @@ -0,0 +1,272 @@ +import 'package:flutter_soloud/src/bindings/audio_data_extensions.dart'; +import 'package:flutter_soloud/src/bindings/audio_data_ffi.dart' + if (dart.library.html) 'audio_data_web.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; +import 'package:flutter_soloud/src/exceptions/exceptions.dart'; +import 'package:meta/meta.dart'; + +/// Enum to tell [AudioData] from where to get audio data. +/// Every time [AudioData.updateSamples] is called, the audio data will +/// be acquired by the respective device. +enum GetSamplesFrom { + /// Take data from the player. + player, + + /// Take data from the microphone. + microphone, +} + +/// The way the audio data should be acquired. +/// +/// Every time [AudioData.updateSamples] is called it is possible to query the +/// acquired new audio data using [AudioData.getLinearFft], +/// [AudioData.getLinearWave], [AudioData.getTexture] or [AudioData.getWave]. +enum GetSamplesKind { + /// Get data in a linear manner: the first 256 floats are audio FFI values, + /// the other 256 are audio wave samples. + /// To get the audio data use [AudioData.getLinearFft] or + /// [AudioData.getLinearWave]. + linear, + + /// Get data in a 2D way. The resulting data will be a matrix of 256 + /// [linear] rows. Each time the [AudioData.updateSamples] method is called, + /// the last row is discarded and the new one will be the first. + /// To get the audio data use [AudioData.getTexture]. + texture, + + /// Get the 256 float of wave audio data. + /// To get the audio data use [AudioData.getWave]. + wave, +} + +/// Class to manage audio samples. +/// +/// The `visualization` must be enabled to be able to acquire data. You can +/// achieve this by calling `SoLoud.instance.setVisualizationEnabled(true);`. +/// +/// Audio samples can be get from the player or from the microphone, and +/// in a texture matrix or a linear array way. +/// +/// IMPORTANT: remember to call [dispose] method when there is no more need +/// to acquire audio. +/// +/// After calling [updateSamples] it's possible to call the proper getter +/// to have back the audio samples. For example using a "Ticker" +/// in a Widget that needs the audio data to be displayed: +/// ``` +/// ... +/// late final Ticker ticker; +/// late final AudioData audioData; +/// late final double waveData; +/// late final double fftData; +/// +/// @override +/// void initState() { +/// super.initState(); +/// audioData = AudioData(GetSamplesFrom.player, GetSamplesKind.linear); +/// ticker = createTicker(_tick); +/// ticker.start(); +/// } +/// +/// @override +/// void dispose() { +/// ticker.stop(); +/// audioData.dispose(); +/// super.dispose(); +/// } +/// +/// void _tick(Duration elapsed) { +/// if (context.mounted) { +/// try { +/// audioData.updateSamples(); +/// setState(() {}); +/// } on Exception { +/// debugPrint('Player not initialized or visualization is not enabled!'); +/// } +/// } +/// } +/// ``` +/// Then in your "build" method, you can read the audio data: +/// ``` +/// try { +/// /// Use [getTexture] if you have inizialized [AudioData] +/// /// with [GetSamplesKind.texture] +/// ffiData = audioData.getLinearFft(i); +/// waveData = audioData.getLinearWave(i); +/// } on Exception { +/// ffiData = 0; +/// waveData = 0; +/// } +/// ``` +/// +/// To smooth FFT value use [SoLoud.instance.setFftSmoothing] or +/// [SoLoudCapture.instance.setCaptureFftSmoothing]. +@experimental +class AudioData { + /// Initialize the way the audio data should be acquired. + AudioData( + this._getSamplesFrom, + this._getSamplesKind, + ) : ctrl = AudioDataCtrl() { + switch (_getSamplesFrom) { + case GetSamplesFrom.player: + switch (_getSamplesKind) { + case GetSamplesKind.wave: + _updateCallback = ctrl.waveCallback; + _samplesWave = ctrl.allocSampleWave(); + case GetSamplesKind.linear: + _updateCallback = ctrl.textureCallback; + _samples1D = ctrl.allocSample1D(); + case GetSamplesKind.texture: + _updateCallback = ctrl.texture2DCallback; + _samples2D = ctrl.allocSample2D(); + } + case GetSamplesFrom.microphone: + switch (_getSamplesKind) { + case GetSamplesKind.wave: + _updateCallback = ctrl.captureWaveCallback; + _samplesWave = ctrl.allocSampleWave(); + case GetSamplesKind.linear: + _updateCallback = ctrl.captureAudioTextureCallback; + _samples1D = ctrl.allocSample1D(); + case GetSamplesKind.texture: + _updateCallback = ctrl.captureTexture2DCallback; + _samples2D = ctrl.allocSample2D(); + } + } + } + + /// The controller used to allocate, dispose and get audio data. + @internal + final AudioDataCtrl ctrl; + + /// Where the FFT or wave data is stored. + SampleFormat2D? _samplesWave; + + /// The getter for [_samplesWave]. + @internal + SampleFormat2D? get samplesWave => _samplesWave; + + /// Where the audio 2D data is stored. + SampleFormat2D? _samples2D; + + /// The getter for [_samples2D]. + @internal + SampleFormat2D? get samples2D => _samples2D; + + /// Where the audio 1D data is stored. + SampleFormat1D? _samples1D; + + /// The getter for [_samples1D]. + @internal + SampleFormat1D? get samples1D => _samples1D; + + /// Where to get audio samples. See [GetSamplesFrom]. + final GetSamplesFrom _getSamplesFrom; + + /// The current device to acquire data. + GetSamplesFrom get getSamplesFrom => _getSamplesFrom; + + /// Kind of audio samples. See [GetSamplesKind]. + final GetSamplesKind _getSamplesKind; + + /// The current type of data to acquire. + GetSamplesKind get getSamplesKind => _getSamplesKind; + + /// The callback used to get new audio samples. + /// This callback is used in [updateSamples] to avoid to + /// do the [GetSamplesFrom] and [GetSamplesKind] checks on every calls. + late void Function(AudioData) _updateCallback; + + /// Update the content of samples memory to be get with [getLinear] + /// or [getTexture]. + /// + /// When using [GetSamplesFrom.microphone] throws + /// [SoLoudCaptureNotYetInitializededException] if the capture is + /// not initialized. + /// When using [GetSamplesFrom.player] throws [SoLoudNotInitializedException] + /// if the engine is not initialized. + /// When using [GetSamplesFrom.player] throws + /// [SoLoudVisualizationNotEnabledException] if the visualization + /// flag is not enableb. Please, Use `setVisualizationEnabled(true)` + /// when needed. + /// Throws [SoLoudNullPointerException] something is going wrong with the + /// player engine. Please, open an issue on + /// [GitHub](https://github.com/alnitak/flutter_soloud/issues) providing + /// a simple working example. + void updateSamples() { + _updateCallback(this); + } + + /// Dispose the memory allocated to acquire audio data. + /// Must be called when there is no more need of [AudioData]. + void dispose() { + ctrl.dispose(_getSamplesKind, _samplesWave, _samples1D, _samples2D); + } + + /// Get the wave data at offset [offset]. + /// + /// Use this method to get data when using [GetSamplesKind.linear]. + /// The data is composed of 256 floats. + double getWave(SampleWave offset) { + if (_getSamplesKind != GetSamplesKind.wave || _samplesWave == null) { + return 0; + } + + if (_getSamplesFrom == GetSamplesFrom.player && + !SoLoudController().soLoudFFI.getVisualizationEnabled()) { + throw const SoLoudVisualizationNotEnabledException(); + } + return ctrl.getWave(_samplesWave!, offset); + } + + /// Get the FFT audio data at offset [offset]. + /// + /// Use this method to get FFT data when using [GetSamplesKind.linear]. + /// The data is composed of 256 floats. + double getLinearFft(SampleLinear offset) { + if (_getSamplesKind != GetSamplesKind.linear || _samples1D == null) { + return 0; + } + + if (_getSamplesFrom == GetSamplesFrom.player && + !SoLoudController().soLoudFFI.getVisualizationEnabled()) { + throw const SoLoudVisualizationNotEnabledException(); + } + return ctrl.getLinearFft(_samples1D!, offset); + } + + /// Get the wave audio data at offset [offset]. + /// + /// Use this method to get wave data when using [GetSamplesKind.linear]. + /// The data is composed of 256 floats. + double getLinearWave(SampleLinear offset) { + if (_getSamplesKind != GetSamplesKind.linear || _samples1D == null) { + return 0; + } + + if (_getSamplesFrom == GetSamplesFrom.player && + !SoLoudController().soLoudFFI.getVisualizationEnabled()) { + throw const SoLoudVisualizationNotEnabledException(); + } + return ctrl.getLinearWave(_samples1D!, offset); + } + + /// Get the audio data at row [row] and column [column]. + /// Use this method to get data when using [GetSamplesKind.texture]. + /// This matrix represents 256 rows. Each rows is represented by 256 floats + /// of FFT data and 256 floats of wave data. + /// Each time the [AudioData.updateSamples] method is called, + /// the last row is discarded and the new one will be the first. + double getTexture(SampleRow row, SampleColumn column) { + if (_getSamplesKind != GetSamplesKind.texture || _samples2D == null) { + return 0; + } + + if (_getSamplesFrom == GetSamplesFrom.player && + !SoLoudController().soLoudFFI.getVisualizationEnabled()) { + throw const SoLoudVisualizationNotEnabledException(); + } + return ctrl.getTexture(_samples2D!, _getSamplesFrom, row, column); + } +} diff --git a/lib/src/bindings/audio_data_extensions.dart b/lib/src/bindings/audio_data_extensions.dart new file mode 100644 index 0000000..0aa8811 --- /dev/null +++ b/lib/src/bindings/audio_data_extensions.dart @@ -0,0 +1,110 @@ +/// The extension type for the `AudioData.get2D` method which accepts +/// the [value] value in 0~255 range. +extension type SampleRow._(int value) { + /// Constructs a valid row with [value]. + SampleRow(this.value) + : assert(value >= 0 && value <= 255, 'row must in 0~255 included range.'); + + /// Operator "*", clamp the resulting value. + SampleRow operator *(int other) { + final result = (other * value).clamp(0, 255); + return SampleRow(result); + } + + /// Operator "+", clamp the resulting value. + SampleRow operator +(int other) { + final result = (other + value).clamp(0, 255); + return SampleRow(result); + } + + /// Operator "-", clamp the resulting value. + SampleRow operator -(int other) { + final result = (other - value).clamp(0, 255); + return SampleRow(result); + } +} + +/// The extension type for the `AudioData.get2D` method which accepts +/// the [value] value in 0~511 range. +extension type SampleColumn._(int value) { + /// Constructs a valid column with [value]. + SampleColumn(this.value) + : assert(value >= 0 && value <= 511, 'row must in 0~511 included range.'); + + /// Operator "*", clamp the resulting value. + SampleColumn operator *(int other) { + final result = (other * value).clamp(0, 511); + return SampleColumn(result); + } + + /// Operator "+", clamp the resulting value. + SampleColumn operator +(int other) { + final result = (other + value).clamp(0, 511); + return SampleColumn(result); + } + + /// Operator "-", clamp the resulting value. + SampleColumn operator -(int other) { + final result = (other - value).clamp(0, 511); + return SampleColumn(result); + } +} + +/// The extension type for the `AudioData.getLinearFft` and +/// `AudioData.getLinearWave` method which accept +/// the [value] value in 0~255 range. +extension type SampleLinear._(int value) { + /// Constructs a valid offset with [value]. + SampleLinear(this.value) + : assert( + value >= 0 && value <= 255, + 'offset must in 0~255 included range.', + ); + + /// Operator "*", clamp the resulting value. + SampleLinear operator *(int other) { + final result = (other * value).clamp(0, 255); + return SampleLinear(result); + } + + /// Operator "+", clamp the resulting value. + SampleLinear operator +(int other) { + final result = (other + value).clamp(0, 255); + return SampleLinear(result); + } + + /// Operator "-", clamp the resulting value. + SampleLinear operator -(int other) { + final result = (other - value).clamp(0, 255); + return SampleLinear(result); + } +} + +/// The extension type for the `AudioData.getWave` +/// method which accepts the [value] value in 0~255 range. +extension type SampleWave._(int value) { + /// Constructs a valid offset with [value]. + SampleWave(this.value) + : assert( + value >= 0 && value <= 255, + 'offset must in 0~255 included range.', + ); + + /// Operator "*", clamp the resulting value. + SampleWave operator *(int other) { + final result = (other * value).clamp(0, 255); + return SampleWave(result); + } + + /// Operator "+", clamp the resulting value. + SampleWave operator +(int other) { + final result = (other + value).clamp(0, 255); + return SampleWave(result); + } + + /// Operator "-", clamp the resulting value. + SampleWave operator -(int other) { + final result = (other - value).clamp(0, 255); + return SampleWave(result); + } +} diff --git a/lib/src/bindings/audio_data_ffi.dart b/lib/src/bindings/audio_data_ffi.dart new file mode 100644 index 0000000..a9acd75 --- /dev/null +++ b/lib/src/bindings/audio_data_ffi.dart @@ -0,0 +1,100 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:ffi'; + +import 'package:ffi/ffi.dart' show calloc; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:flutter_soloud/src/bindings/audio_data_extensions.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; +import 'package:flutter_soloud/src/enums.dart'; +import 'package:meta/meta.dart'; + +typedef SampleFormat2D = Pointer>; +typedef SampleFormat1D = Pointer; + +@internal +@immutable +class AudioDataCtrl { + /// To reflect [AudioDataCtrl] for web. Not used with `dart:ffi` + final int _samplesPtr = 0; + int get samplesPtr => _samplesPtr; + + final void Function(AudioData) waveCallback = + SoLoudController().soLoudFFI.getWave; + + final PlayerErrors Function(AudioData) texture2DCallback = + SoLoudController().soLoudFFI.getAudioTexture2D; + + final void Function(AudioData) textureCallback = + SoLoudController().soLoudFFI.getAudioTexture; + + final void Function(AudioData) captureWaveCallback = + SoLoudController().captureFFI.getCaptureWave; + + final CaptureErrors Function(AudioData) captureTexture2DCallback = + SoLoudController().captureFFI.getCaptureAudioTexture2D; + + final void Function(AudioData) captureAudioTextureCallback = + SoLoudController().captureFFI.getCaptureAudioTexture; + + SampleFormat2D allocSample2D() { + return calloc(); + } + + SampleFormat1D allocSample1D() { + return calloc(512 * 4); + } + + SampleFormat2D allocSampleWave() { + return calloc(); + } + + void dispose( + GetSamplesKind getSamplesKind, + SampleFormat2D? sWave, + SampleFormat1D? s1D, + SampleFormat2D? s2D, + ) { + if (getSamplesKind == GetSamplesKind.wave && + sWave != null && + sWave != nullptr) { + calloc.free(sWave); + } + if (getSamplesKind == GetSamplesKind.linear && + s1D != null && + s1D != nullptr) { + calloc.free(s1D); + } + if (getSamplesKind == GetSamplesKind.texture && + s2D != null && + s2D != nullptr) { + calloc.free(s2D); + } + } + + double getWave(SampleFormat2D s2D, SampleWave offset) { + final val = Pointer.fromAddress(s2D.value.address); + if (val == nullptr) return 0; + return val[offset.value]; + } + + double getLinearFft(SampleFormat1D s1D, SampleLinear offset) { + return s1D[offset.value]; + } + + double getLinearWave(SampleFormat1D s1D, SampleLinear offset) { + return s1D[offset.value + 256]; + } + + double getTexture( + SampleFormat2D s2D, + GetSamplesFrom getSamplesFrom, + SampleRow row, + SampleColumn column, + ) { + const stride = 512; + final val = s2D.value; + if (val == nullptr) return 0; + return val[stride * row.value + column.value]; + } +} diff --git a/lib/src/bindings/audio_data_web.dart b/lib/src/bindings/audio_data_web.dart new file mode 100644 index 0000000..f652a92 --- /dev/null +++ b/lib/src/bindings/audio_data_web.dart @@ -0,0 +1,95 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flutter/foundation.dart'; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:flutter_soloud/src/bindings/audio_data_extensions.dart'; +import 'package:flutter_soloud/src/bindings/js_extension.dart'; +import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; +import 'package:flutter_soloud/src/enums.dart'; +import 'package:meta/meta.dart'; + +typedef SampleFormat2D = Float32List; +typedef SampleFormat1D = Float32List; + +@internal +@immutable +class AudioDataCtrl { + late final int _samplesPtr; + int get samplesPtr => _samplesPtr; + + final void Function(AudioData) waveCallback = + SoLoudController().soLoudFFI.getWave; + + final void Function(AudioData) texture2DCallback = + SoLoudController().soLoudFFI.getAudioTexture2D; + + final void Function(AudioData) textureCallback = + SoLoudController().soLoudFFI.getAudioTexture; + + final void Function(AudioData) captureWaveCallback = + SoLoudController().captureFFI.getCaptureWave; + + final CaptureErrors Function(AudioData) captureTexture2DCallback = + SoLoudController().captureFFI.getCaptureAudioTexture2D; + + final void Function(AudioData) captureAudioTextureCallback = + SoLoudController().captureFFI.getCaptureAudioTexture; + + SampleFormat2D allocSample2D() { + _samplesPtr = wasmMalloc(4); + return Float32List(512 * 256); + } + + SampleFormat1D allocSample1D() { + _samplesPtr = wasmMalloc(4); + return Float32List(512); + } + + SampleFormat1D allocSampleWave() { + _samplesPtr = wasmMalloc(256 * 4); + return Float32List(256); + } + + void dispose( + GetSamplesKind getSamplesKind, + SampleFormat2D? sWave, + SampleFormat1D? s1D, + SampleFormat2D? s2D, + ) { + wasmFree(_samplesPtr); + } + + double getWave(SampleFormat2D s2D, SampleWave offset) { + final samplePtr = wasmGetI32Value(_samplesPtr, '*'); + final data = wasmGetF32Value(samplePtr + offset.value * 4, 'float'); + return data; + } + + double getLinearFft(SampleFormat1D s1D, SampleLinear offset) { + final data = wasmGetF32Value(_samplesPtr + offset.value * 4, 'float'); + return data; + } + + double getLinearWave(SampleFormat1D s1D, SampleLinear offset) { + final data = + wasmGetF32Value(_samplesPtr + offset.value * 4 + 256 * 4, 'float'); + return data; + } + + double getTexture( + SampleFormat2D s2D, + GetSamplesFrom getSamplesFrom, + SampleRow row, + SampleColumn column, + ) { + // final offset = samplesPtr + ((row.value * 256 + column.value) * 4); + // final data = wasmGetF32Value(offset, 'float'); + final double data; + if (getSamplesFrom == GetSamplesFrom.player) { + data = wasmGetTextureValue(row.value, column.value); + } else { + data = wasmGetCaptureTextureValue(row.value, column.value); + } + return data; + } +} diff --git a/lib/src/bindings/bindings_capture.dart b/lib/src/bindings/bindings_capture.dart new file mode 100644 index 0000000..23a7f32 --- /dev/null +++ b/lib/src/bindings/bindings_capture.dart @@ -0,0 +1,45 @@ +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:flutter_soloud/src/enums.dart'; +import 'package:meta/meta.dart'; + +export 'package:flutter_soloud/src/bindings/bindings_capture_ffi.dart' + if (dart.library.html) 'package:flutter_soloud/src/bindings/bindings_capture_web.dart'; + +@experimental +abstract class FlutterCapture { + @mustBeOverridden + List listCaptureDevices(); + + @mustBeOverridden + CaptureErrors initCapture(int deviceID); + + @mustBeOverridden + void disposeCapture(); + + @mustBeOverridden + bool isCaptureInited(); + + @mustBeOverridden + bool isCaptureStarted(); + + @mustBeOverridden + CaptureErrors startCapture(); + + @mustBeOverridden + CaptureErrors stopCapture(); + + @mustBeOverridden + void getCaptureFft(AudioData fft); + + @mustBeOverridden + void getCaptureWave(AudioData wave); + + @mustBeOverridden + void getCaptureAudioTexture(AudioData samples); + + @mustBeOverridden + CaptureErrors getCaptureAudioTexture2D(AudioData samples); + + @mustBeOverridden + CaptureErrors setCaptureFftSmoothing(double smooth); +} diff --git a/lib/src/bindings/bindings_capture_ffi.dart b/lib/src/bindings/bindings_capture_ffi.dart index 7ce327b..86154af 100644 --- a/lib/src/bindings/bindings_capture_ffi.dart +++ b/lib/src/bindings/bindings_capture_ffi.dart @@ -1,12 +1,8 @@ -// ignore_for_file: always_specify_types -// ignore_for_file: camel_case_types -// ignore_for_file: non_constant_identifier_names - -// Generated by `package:ffigen`. -// ignore_for_file: type=lint import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; +import 'package:flutter_soloud/src/bindings/bindings_capture.dart'; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; import 'package:flutter_soloud/src/enums.dart'; /// CaptureDevice struct exposed in C @@ -18,7 +14,7 @@ final class _CaptureDevice extends ffi.Struct { } /// FFI bindings to capture with miniaudio -class FlutterCaptureFfi { +class FlutterCaptureFfi extends FlutterCapture { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) _lookup; @@ -33,57 +29,68 @@ class FlutterCaptureFfi { lookup) : _lookup = lookup; - /// --------------------- copy here the new functions to generate + @override List listCaptureDevices() { List ret = []; - ffi.Pointer> devices = - calloc(ffi.sizeOf<_CaptureDevice>()); - ffi.Pointer n_devices = calloc(); + ffi.Pointer> deviceNames = + calloc(ffi.sizeOf>>() * 50); + ffi.Pointer> deviceIsDefault = + calloc(ffi.sizeOf>>() * 50); + ffi.Pointer nDevices = calloc(); _listCaptureDevices( - devices, - n_devices, + deviceNames, + deviceIsDefault, + nDevices, ); - int ndev = n_devices.value; + int ndev = nDevices.value; for (int i = 0; i < ndev; i++) { - var s = (devices + i).value.ref.name.cast().toDartString(); - var n = (devices + i).value.ref.isDefault; + var s1 = (deviceNames + i).value; + var s = s1.cast().toDartString(); + var n1 = (deviceIsDefault + i).value; + var n = n1.value; ret.add(CaptureDevice(s, n == 1 ? true : false)); } - /// free allocated memory done in C - /// this work on linux and android, not on win + /// Free allocated memory done in C. + /// This work on all platforms but not on win. // for (int i = 0; i < ndev; i++) { // calloc.free(devices.elementAt(i).value.ref.name); // calloc.free(devices.elementAt(i).value); // } _freeListCaptureDevices( - devices, + deviceNames, + deviceIsDefault, ndev, ); - calloc.free(devices); - calloc.free(n_devices); + calloc.free(deviceNames); + calloc.free(nDevices); return ret; } late final _listCaptureDevicesPtr = _lookup< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer>, + ffi.Void Function( + ffi.Pointer>, + ffi.Pointer>, ffi.Pointer)>>('listCaptureDevices'); late final _listCaptureDevices = _listCaptureDevicesPtr.asFunction< - void Function( - ffi.Pointer>, ffi.Pointer)>(); + void Function(ffi.Pointer>, + ffi.Pointer>, ffi.Pointer)>(); late final _freeListCaptureDevicesPtr = _lookup< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer>, + ffi.Void Function( + ffi.Pointer>, + ffi.Pointer>, ffi.Int)>>('freeListCaptureDevices'); late final _freeListCaptureDevices = _freeListCaptureDevicesPtr.asFunction< - void Function(ffi.Pointer>, int)>(); + void Function(ffi.Pointer>, + ffi.Pointer>, int)>(); - /// + @override CaptureErrors initCapture(int deviceID) { final e = _initCapture(deviceID); return CaptureErrors.values[e]; @@ -93,6 +100,7 @@ class FlutterCaptureFfi { _lookup>('initCapture'); late final _initCapture = _initCapturePtr.asFunction(); + @override void disposeCapture() { return _disposeCapture(); } @@ -101,15 +109,17 @@ class FlutterCaptureFfi { _lookup>('disposeCapture'); late final _disposeCapture = _disposeCapturePtr.asFunction(); + @override bool isCaptureInited() { return _isCaptureInited() == 1 ? true : false; } late final _isCaptureInitedPtr = - _lookup>('isCaptureInited'); + _lookup>(''); late final _isCaptureInited = _isCaptureInitedPtr.asFunction(); + @override bool isCaptureStarted() { return _isCaptureStarted() == 1 ? true : false; } @@ -119,6 +129,7 @@ class FlutterCaptureFfi { late final _isCaptureStarted = _isCaptureStartedPtr.asFunction(); + @override CaptureErrors startCapture() { return CaptureErrors.values[_startCapture()]; } @@ -127,6 +138,7 @@ class FlutterCaptureFfi { _lookup>('startCapture'); late final _startCapture = _startCapturePtr.asFunction(); + @override CaptureErrors stopCapture() { return CaptureErrors.values[_stopCapture()]; } @@ -135,10 +147,44 @@ class FlutterCaptureFfi { _lookup>('stopCapture'); late final _stopCapture = _stopCapturePtr.asFunction(); - CaptureErrors getCaptureAudioTexture2D( - ffi.Pointer> samples, - ) { - int ret = _getCaptureAudioTexture2D(samples); + @override + void getCaptureFft(AudioData fft) { + return _getCaptureFft(fft.samplesWave!); + } + + late final _getCaptureFftPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer>)>>('getCaptureFft'); + late final _getCaptureFft = _getCaptureFftPtr + .asFunction>)>(); + + @override + void getCaptureWave(AudioData wave) { + return _getCaptureWave(wave.samplesWave!); + } + + late final _getCaptureWavePtr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer>)>>('getCaptureWave'); + late final _getCaptureWave = _getCaptureWavePtr + .asFunction>)>(); + + @override + void getCaptureAudioTexture(AudioData samples) { + return _getCaptureTexture(samples.samples1D!); + } + + late final _getCaptureTexturePtr = + _lookup)>>( + 'getCaptureTexture'); + late final _getCaptureTexture = + _getCaptureTexturePtr.asFunction)>(); + + @override + CaptureErrors getCaptureAudioTexture2D(AudioData samples) { + int ret = _getCaptureAudioTexture2D(samples.samples2D!); return CaptureErrors.values[ret]; } @@ -149,6 +195,7 @@ class FlutterCaptureFfi { late final _getCaptureAudioTexture2D = _getCaptureAudioTexture2DPtr .asFunction>)>(); + @override CaptureErrors setCaptureFftSmoothing(double smooth) { int ret = _setCaptureFftSmoothing(smooth); return CaptureErrors.values[ret]; diff --git a/lib/src/bindings/bindings_capture_web.dart b/lib/src/bindings/bindings_capture_web.dart new file mode 100644 index 0000000..ffa8696 --- /dev/null +++ b/lib/src/bindings/bindings_capture_web.dart @@ -0,0 +1,102 @@ +import 'dart:typed_data'; +import 'dart:js_interop'; + +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:flutter_soloud/src/bindings/bindings_capture.dart'; +import 'package:flutter_soloud/src/enums.dart'; +import 'package:flutter_soloud/src/sound_hash.dart'; +import 'package:flutter_soloud/src/sound_handle.dart'; +import 'package:flutter_soloud/src/bindings/js_extension.dart'; + +class FlutterCaptureWeb extends FlutterCapture { + @override + List listCaptureDevices() { + /// allocate 50 device strings + final namesPtr = wasmMalloc(50 * 150); + final isDefaultPtr = wasmMalloc(50 * 4); + final nDevicesPtr = wasmMalloc(4); // 4 bytes for an int + + wasmListCaptureDevices( + namesPtr, + isDefaultPtr, + nDevicesPtr, + ); + + final nDevices = wasmGetI32Value(nDevicesPtr, '*'); + final devices = []; + for (var i = 0; i < nDevices; i++) { + final namePtr = wasmGetI32Value(namesPtr + i * 4, '*'); + final name = wasmUtf8ToString(namePtr); + final isDefault = wasmGetI32Value( + wasmGetI32Value(isDefaultPtr + i * 4, '*'), '*'); + + devices.add(CaptureDevice(name, isDefault == 1)); + } + + wasmFreeListCaptureDevices(namesPtr, isDefaultPtr, nDevices); + + wasmFree(nDevicesPtr); + wasmFree(isDefaultPtr); + wasmFree(namesPtr); + + return devices; + } + + @override + CaptureErrors initCapture(int deviceID) { + final e = wasmInitCapture(deviceID); + return CaptureErrors.values[e]; + } + + @override + void disposeCapture() { + return wasmDisposeCapture(); + } + + @override + bool isCaptureInited() { + return wasmIsCaptureInited() == 1 ? true : false; + } + + @override + bool isCaptureStarted() { + return wasmIsCaptureStarted() == 1 ? true : false; + } + + @override + CaptureErrors startCapture() { + return CaptureErrors.values[wasmStartCapture()]; + } + + @override + CaptureErrors stopCapture() { + return CaptureErrors.values[wasmStopCapture()]; + } + + @override + void getCaptureFft(AudioData fft) { + return wasmGetCaptureFft(fft.ctrl.samplesPtr); + } + + @override + void getCaptureWave(AudioData wave) { + return wasmGetCaptureWave(wave.ctrl.samplesPtr); + } + + @override + void getCaptureAudioTexture(AudioData samples) { + wasmGetCaptureAudioTexture(samples.ctrl.samplesPtr); + } + + @override + CaptureErrors getCaptureAudioTexture2D(AudioData samples) { + final e = wasmGetCaptureAudioTexture2D(samples.ctrl.samplesPtr); + return CaptureErrors.values[e]; + } + + @override + CaptureErrors setCaptureFftSmoothing(double smooth) { + final e = wasmSetCaptureFftSmoothing(smooth); + return CaptureErrors.values[e]; + } +} diff --git a/lib/src/bindings/bindings_player.dart b/lib/src/bindings/bindings_player.dart new file mode 100644 index 0000000..591d1d3 --- /dev/null +++ b/lib/src/bindings/bindings_player.dart @@ -0,0 +1,706 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:flutter_soloud/src/enums.dart'; +import 'package:flutter_soloud/src/sound_hash.dart'; +import 'package:flutter_soloud/src/sound_handle.dart'; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:meta/meta.dart'; + +export 'package:flutter_soloud/src/bindings/bindings_player_ffi.dart' + if (dart.library.html) + 'package:flutter_soloud/src/bindings/bindings_player_web.dart'; + +/// Abstract class defining the interface for the platform-specific +/// implementations. +abstract class FlutterSoLoud { + /// Controller to listen to voice ended events. + late final StreamController voiceEndedEventController = + StreamController.broadcast(); + + /// Listener for voices ended. + Stream get voiceEndedEvents => voiceEndedEventController.stream; + + /// Controller to listen to file loaded events. + /// Not used on the web. + late final StreamController> fileLoadedEventsController = + StreamController.broadcast(); + + /// Listener for file loaded. + /// Not used on the web. + Stream> get fileLoadedEvents => + fileLoadedEventsController.stream; + + /// Controller to listen to voice ended events. + /// Not used on the web. + @experimental + late final StreamController stateChangedController = + StreamController.broadcast(); + + /// listener for voices ended. + /// Not used on the web. + @experimental + Stream get stateChangedEvents => + stateChangedController.stream; + + /// Set Dart functions to call when an event occurs. + /// + /// On the web, only the `voiceEndedCallback` is supported. On the other + /// platform there are also `fileLoadedCallback` and `stateChangedCallback`. + @mustBeOverridden + void setDartEventCallbacks(); + + /// Initialize the player. Must be called before any other player functions. + /// + /// Returns [PlayerErrors.noError] if success. + @mustBeOverridden + PlayerErrors initEngine(); + + /// Must be called when the player is no more needed or when closing the app. + @mustBeOverridden + void deinit(); + + /// Gets the state of player + /// + /// Return true if initilized + @mustBeOverridden + bool isInited(); + + /// Load a new sound to be played once or multiple times later. + /// This is not supported on the web, use [loadMem] instead. + /// + /// After loading the file, the [_fileLoadedCallback] will call the + /// Dart function defined with [_setDartEventCallback] which gives back + /// the error and the new hash. + /// + /// [completeFileName] the complete file path. + /// [LoadMode] if `LoadMode.memory`, Soloud::wav will be used which loads + /// all audio data into memory. Used to prevent gaps or lags + /// when seeking/starting a sound (less CPU, more memory allocated). + /// If `LoadMode.disk` is used, the audio data is loaded + /// from the given file when needed (more CPU, less memory allocated). + /// See the [seek] note problem when using [LoadMode] = `LoadMode.disk`. + /// `soundHash` return hash of the sound. + @mustBeOverridden + void loadFile( + String completeFileName, + LoadMode mode, + ); + + /// Load a new sound stored into [buffer] as file bytes to be played once + /// or multiple times later. + /// This is used on the web instead of [loadFile] because the browsers are + /// not allowed to read files directly, but it works also on the other + /// platforms. + /// + /// [uniqueName] the unique name of the sound. Used only to have the [hash]. + /// [buffer] the audio data. These contains the audio file bytes. + @mustBeOverridden + ({PlayerErrors error, SoundHash soundHash}) loadMem( + String uniqueName, + Uint8List buffer, + ); + + /// Load a new waveform to be played once or multiple times later. + /// + /// [waveform] + /// [superWave] + /// [scale] + /// [detune] + /// `soundHash` return hash of the sound. + /// Returns [PlayerErrors.noError] if success. + @mustBeOverridden + ({PlayerErrors error, SoundHash soundHash}) loadWaveform( + WaveForm waveform, + bool superWave, + double scale, + double detune, + ); + + /// Set the scale of an already loaded waveform identified by [hash]. + /// + /// [hash] the unique sound hash of a waveform sound. + /// [newScale] the new scale of the wave. + @mustBeOverridden + void setWaveformScale(SoundHash hash, double newScale); + + /// Set the detune of an already loaded waveform identified by [hash]. + /// + /// [hash] the unique sound hash of a waveform sound. + /// [newDetune] the new detune of the wave. + @mustBeOverridden + void setWaveformDetune(SoundHash hash, double newDetune); + + /// Set a new frequency of an already loaded waveform identified by [hash]. + /// + /// [hash] the unique sound hash of a waveform sound. + /// [newFreq] the new frequence of the wave. + @mustBeOverridden + void setWaveformFreq(SoundHash hash, double newFreq); + + /// Set a new frequence of an already loaded waveform identified by [hash]. + /// + /// [hash] the unique sound hash of a waveform sound. + /// [superwave] 1 if using the super wave. + @mustBeOverridden + void setWaveformSuperWave(SoundHash hash, int superwave); + + /// Set a new wave form of an already loaded waveform identified by [hash]. + /// + /// [hash] the unique sound hash of a waveform sound. + /// [newWaveform] the new kind of [WaveForm] to be used. + @mustBeOverridden + void setWaveform(SoundHash hash, WaveForm newWaveform); + + /// Speech the text given. + /// + /// [textToSpeech] the text to be spoken. + /// Returns [PlayerErrors.noError] if success and handle sound identifier. + // TODO(marco): add other T2S parameters + @mustBeOverridden + ({PlayerErrors error, SoundHandle handle}) speechText(String textToSpeech); + + /// Switch pause state of an already loaded sound identified by [handle]. + /// + /// [handle] the sound handle. + @mustBeOverridden + void pauseSwitch(SoundHandle handle); + + /// Pause or unpause already loaded sound identified by [handle]. + /// + /// [handle] the sound handle. + /// [pause] the new state. + @mustBeOverridden + void setPause(SoundHandle handle, int pause); + + /// Gets the pause state. + /// + /// [handle] the sound handle. + /// Return true if paused. + @mustBeOverridden + bool getPause(SoundHandle handle); + + /// Set a sound's relative play speed. + /// Setting the value to 0 will cause undefined behavior, likely a crash. + /// Change the relative play speed of a sample. This changes the effective + /// sample rate while leaving the base sample rate alone. + /// + /// Note that playing a sound at a higher sample rate will require SoLoud + /// to request more samples from the sound source, which will require more + /// memory and more processing power. Playing at a slower sample + /// rate is cheaper. + /// + /// [handle] the sound handle. + /// [speed] the new speed. + @mustBeOverridden + void setRelativePlaySpeed(SoundHandle handle, double speed); + + /// Return the current play speed. + /// + /// [handle] the sound handle. + @mustBeOverridden + double getRelativePlaySpeed(SoundHandle handle); + + /// Play already loaded sound identified by [soundHash]. + /// + /// [soundHash] the unique sound hash of a sound. + /// [volume] 1.0 full volume. + /// [pan] 0.0 centered. + /// [paused] false not paused. + /// [looping] whether to start the sound in looping state. + /// [loopingStartAt] If looping is enabled, the loop point is, by default, + /// the start of the stream. The loop start point can be set with this + /// parameter, and current loop point can be queried with `getLoopingPoint()` + /// and changed by `setLoopingPoint()`. + /// Return the error if any and a new `newHandle` of this sound. + @mustBeOverridden + ({PlayerErrors error, SoundHandle newHandle}) play( + SoundHash soundHash, { + double volume = 1, + double pan = 0, + bool paused = false, + bool looping = false, + Duration loopingStartAt = Duration.zero, + }); + + /// Stop already loaded sound identified by [handle] and clear it. + /// + /// [handle] the sound handle. + @mustBeOverridden + void stop(SoundHandle handle); + + /// Stop all handles of the already loaded sound identified + /// by [soundHash] and dispose it. + /// + /// [soundHash] the unique sound hash of a sound. + @mustBeOverridden + void disposeSound(SoundHash soundHash); + + /// Dispose all sounds already loaded. + @mustBeOverridden + void disposeAllSound(); + + /// Query whether a sound is set to loop. + /// + /// [handle] the sound handle. + /// Returns true if flagged for looping. + @mustBeOverridden + bool getLooping(SoundHandle handle); + + /// This function can be used to set a sample to play on repeat, + /// instead of just playing it once. + /// + /// [handle] the sound handle. + /// [enable] enable or not the looping. + @mustBeOverridden + void setLooping(SoundHandle handle, bool enable); + + /// Get sound loop point value. + /// + /// [handle] the sound handle. + /// Returns the duration. + @mustBeOverridden + Duration getLoopPoint(SoundHandle handle); + + /// Set sound loop point value. + /// + /// [handle] the sound handle. + /// [timestamp] the time in which the loop will restart. + @mustBeOverridden + void setLoopPoint(SoundHandle handle, Duration timestamp); + + // TODO(marco): implement Soloud.getLoopCount() also? + + /// Enable or disable visualization. + /// Not yet supported on the web. + /// + /// [enabled] whether to enable or disable. + @mustBeOverridden + void setVisualizationEnabled(bool enabled); + + /// Get visualization state. + /// Not yet supported on the web. + /// + /// Return true if enabled. + @mustBeOverridden + bool getVisualizationEnabled(); + + /// Returns valid data only if VisualizationEnabled is true. + /// Not yet supported on the web. + /// + /// [fft] on all platforms web excluded, the [fft] type is `Pointer`. + /// Return a 256 float array int the [fft] pointer containing FFT data. + @mustBeOverridden + void getFft(AudioData fft); + + /// Returns valid data only if VisualizationEnabled is true + /// + /// [wave] on all platforms web excluded, the [wave] type is `Pointer`. + /// Return a 256 float array int the [wave] pointer containing audio data. + @mustBeOverridden + void getWave(AudioData wave); + + /// Smooth FFT data. + /// Not yet supported on the web. + /// + /// When new data is read and the values are decreasing, the new value will be + /// decreased with an amplitude between the old and the new value. + /// This will result on a less shaky visualization. + /// + /// [smooth] must be in the [0.0 ~ 1.0] range. + /// 0 = no smooth + /// 1 = full smooth + /// the new value is calculated with: + /// newFreq = smooth * oldFreq + (1 - smooth) * newFreq + @mustBeOverridden + void setFftSmoothing(double smooth); + + /// Return in [samples] a 512 float array. + /// The first 256 floats represent the FFT frequencies data [>=0.0]. + /// The other 256 floats represent the wave data (amplitude) [-1.0~1.0]. + /// Not yet supported on the web. + /// + /// [samples] on all platforms web excluded, the [samples] type is + /// `Pointer`. + @mustBeOverridden + void getAudioTexture(AudioData samples); + + /// Return a floats matrix of 256x512 + /// Every row are composed of 256 FFT values plus 256 of wave data + /// Every time is called, a new row is stored in the + /// first row and all the previous rows are shifted + /// up and the last one will be lost. + /// + /// [samples] on all platforms web excluded, the [samples] type is + /// `Pointer>`. + @mustBeOverridden + PlayerErrors getAudioTexture2D(AudioData samples); + + /// Get the sound length. + /// + /// [soundHash] the sound hash. + /// Returns sound length. + @mustBeOverridden + Duration getLength(SoundHash soundHash); + + /// Seek playing to [time] position. + /// + /// [time] the time position to seek to. + /// [handle] the sound handle. + /// Returns [PlayerErrors.noError] if success. + /// + /// NOTE: when seeking an MP3 file loaded using `mode`=`LoadMode.disk` the + /// seek operation is performed but there will be delays. This occurs because + /// the MP3 codec must compute each frame length to gain a new position. + /// The problem is explained in souloud_wavstream.cpp + /// in `WavStreamInstance::seek` function. + /// + /// This mode is useful ie for background music, not for a music player + /// where a seek slider for MP3s is a must. + /// If you need to seek MP3s without lags, please, use + /// `mode`=`LoadMode.memory` instead or other supported audio formats! + @mustBeOverridden + int seek(SoundHandle handle, Duration time); + + /// Get current sound position.. + /// + /// [handle] the sound handle. + /// Returns time position. + @mustBeOverridden + Duration getPosition(SoundHandle handle); + + /// Get current Global volume. + /// + /// Returns the volume. + @mustBeOverridden + double getGlobalVolume(); + + /// Set current Global volume. + /// + /// Returns [PlayerErrors.noError] if success. + @mustBeOverridden + int setGlobalVolume(double volume); + + /// Get current [handle] volume. + /// + /// Returns the volume. + @mustBeOverridden + double getVolume(SoundHandle handle); + + /// Set current [handle] volume. + /// + /// Returns [PlayerErrors.noError] if success. + @mustBeOverridden + int setVolume(SoundHandle handle, double volume); + + /// Check if the [handle] is still valid. + /// + /// [handle] handle to check. + /// Return true if it still exists. + @mustBeOverridden + bool getIsValidVoiceHandle(SoundHandle handle); + + /// Returns the number of concurrent sounds that are playing at the moment. + @mustBeOverridden + int getActiveVoiceCount(); + + /// Returns the number of concurrent sounds that are playing a + /// specific audio source. + @mustBeOverridden + int countAudioSource(SoundHash soundHash); + + /// Returns the number of voices the application has told SoLoud to play. + @mustBeOverridden + int getVoiceCount(); + + /// Get a sound's protection state. + @mustBeOverridden + bool getProtectVoice(SoundHandle handle); + + /// Set a sound's protection state. + /// + /// Normally, if you try to play more sounds than there are voices, + /// SoLoud will kill off the oldest playing sound to make room. + /// This will most likely be your background music. This can be worked + /// around by protecting the sound. + /// If all voices are protected, the result will be undefined. + /// + /// [handle] handle to check. + /// [protect] whether to protect or not. + @mustBeOverridden + void setProtectVoice(SoundHandle handle, bool protect); + + /// Get the current maximum active voice count. + @mustBeOverridden + int getMaxActiveVoiceCount(); + + /// Set the current maximum active voice count. + /// If voice count is higher than the maximum active voice count, + /// SoLoud will pick the ones with the highest volume to actually play. + /// [maxVoiceCount] the max concurrent sounds that can be played. + /// + /// NOTE: The number of concurrent voices is limited, as having unlimited + /// voices would cause performance issues, as well as lead to unnecessary + /// clipping. The default number of concurrent voices is 16, but this can be + /// adjusted at runtime. The hard maximum number is 4095, but if more are + /// required, SoLoud can be modified to support more. But seriously, if you + /// need more than 4095 sounds at once, you're probably going to make + /// some serious changes in any case. + @mustBeOverridden + void setMaxActiveVoiceCount(int maxVoiceCount); + + // /////////////////////////////////////// + // faders + // /////////////////////////////////////// + + /// Smoothly change the global volume over specified [duration]. + @mustBeOverridden + int fadeGlobalVolume(double to, Duration duration); + + /// Smoothly change a channel's volume over specified [duration]. + @mustBeOverridden + int fadeVolume(SoundHandle handle, double to, Duration duration); + + /// Smoothly change a channel's pan setting over specified [duration]. + @mustBeOverridden + int fadePan(SoundHandle handle, double to, Duration duration); + + /// Smoothly change a channel's relative play speed over specified time. + @mustBeOverridden + int fadeRelativePlaySpeed(SoundHandle handle, double to, Duration time); + + /// After specified [duration], pause the channel. + @mustBeOverridden + int schedulePause(SoundHandle handle, Duration duration); + + /// After specified time, stop the channel. + @mustBeOverridden + int scheduleStop(SoundHandle handle, Duration duration); + + /// Set fader to oscillate the volume at specified frequency. + @mustBeOverridden + int oscillateVolume( + SoundHandle handle, double from, double to, Duration time); + + /// Set fader to oscillate the panning at specified frequency. + @mustBeOverridden + int oscillatePan(SoundHandle handle, double from, double to, Duration time); + + /// Set fader to oscillate the relative play speed at specified frequency. + @mustBeOverridden + int oscillateRelativePlaySpeed( + SoundHandle handle, double from, double to, Duration time); + + /// Set fader to oscillate the global volume at specified frequency. + @mustBeOverridden + int oscillateGlobalVolume(double from, double to, Duration time); + + // /////////////////////////////////////// + // Filters + // /////////////////////////////////////// + + /// Check if the given filter is active or not. + /// + /// [filterType] filter to check. + /// Returns [PlayerErrors.noError] if no errors and the index of + /// the active filter (-1 if the filter is not active). + @mustBeOverridden + ({PlayerErrors error, int index}) isFilterActive(int filterType); + + /// Get parameters names of the given filter. + /// + /// [filterType] filter to get param names. + /// Returns [PlayerErrors.noError] if no errors and the list of param names. + @mustBeOverridden + ({PlayerErrors error, List names}) getFilterParamNames( + int filterType); + + /// Add the filter [filterType]. + /// + /// [filterType] filter to add. + /// Returns: + /// [PlayerErrors.noError] if no errors. + /// [PlayerErrors.filterNotFound] if the [filterType] does not exits. + /// [PlayerErrors.filterAlreadyAdded] when trying to add an already + /// added filter. + /// [PlayerErrors.maxNumberOfFiltersReached] when the maximum number of + /// filters has been reached (default is 8). + @mustBeOverridden + PlayerErrors addGlobalFilter(int filterType); + + /// Remove the filter [filterType]. + /// + /// [filterType] filter to remove. + /// Returns [PlayerErrors.noError] if no errors. + @mustBeOverridden + int removeGlobalFilter(int filterType); + + /// Set the effect parameter with id [attributeId] of [filterType] + /// with [value] value. + /// + /// [filterType] filter to modify a param. + /// Returns [PlayerErrors.noError] if no errors. + @mustBeOverridden + int setFilterParams(int filterType, int attributeId, double value); + + /// Get the effect parameter with id [attributeId] of [filterType]. + /// + /// [filterType] the filter to modify a parameter. + /// Returns the value of the parameter. + @mustBeOverridden + double getFilterParams(int filterType, int attributeId); + + // /////////////////////////////////////// + // 3D audio methods + // /////////////////////////////////////// + + /// play3d() is the 3d version of the play() call. + /// + /// [posX], [posY], [posZ] are the audio source position coordinates. + /// [velX], [velY], [velZ] are the audio source velocity. + /// [looping] whether to start the sound in looping state. + /// [loopingStartAt] If looping is enabled, the loop point is, by default, + /// the start of the stream. The loop start point can be set with this + /// parameter, and current loop point can be queried with `getLoopingPoint()` + /// and changed by `setLoopingPoint()`. + /// Returns the handle of the sound, 0 if error. + @mustBeOverridden + ({PlayerErrors error, SoundHandle newHandle}) play3d( + SoundHash soundHash, + double posX, + double posY, + double posZ, { + double velX = 0, + double velY = 0, + double velZ = 0, + double volume = 1, + bool paused = false, + bool looping = false, + Duration loopingStartAt = Duration.zero, + }); + + /// Since SoLoud has no knowledge of the scale of your coordinates, + /// you may need to adjust the speed of sound for these effects + /// to work correctly. The default value is 343, which assumes + /// that your world coordinates are in meters (where 1 unit is 1 meter), + /// and that the environment is dry air at around 20 degrees Celsius. + @mustBeOverridden + void set3dSoundSpeed(double speed); + + /// Get the sound speed. + @mustBeOverridden + double get3dSoundSpeed(); + + /// You can set the position, at-vector, up-vector and velocity parameters + /// of the 3d audio listener with one call. + @mustBeOverridden + void set3dListenerParameters( + double posX, + double posY, + double posZ, + double atX, + double atY, + double atZ, + double upX, + double upY, + double upZ, + double velocityX, + double velocityY, + double velocityZ, + ); + + /// You can set the position parameter of the 3d audio listener. + @mustBeOverridden + void set3dListenerPosition(double posX, double posY, double posZ); + + /// You can set the "at" vector parameter of the 3d audio listener. + @mustBeOverridden + void set3dListenerAt(double atX, double atY, double atZ); + + /// You can set the "up" vector parameter of the 3d audio listener. + @mustBeOverridden + void set3dListenerUp(double upX, double upY, double upZ); + + /// You can set the listener's velocity vector parameter. + @mustBeOverridden + void set3dListenerVelocity( + double velocityX, + double velocityY, + double velocityZ, + ); + + /// You can set the position and velocity parameters of a live + /// 3d audio source with one call. + @mustBeOverridden + void set3dSourceParameters( + SoundHandle handle, + double posX, + double posY, + double posZ, + double velocityX, + double velocityY, + double velocityZ, + ); + + /// You can set the position parameters of a live 3d audio source. + @mustBeOverridden + void set3dSourcePosition( + SoundHandle handle, + double posX, + double posY, + double posZ, + ); + + /// You can set the velocity parameters of a live 3d audio source. + @mustBeOverridden + void set3dSourceVelocity( + SoundHandle handle, + double velocityX, + double velocityY, + double velocityZ, + ); + + /// You can set the minimum and maximum distance parameters + /// of a live 3d audio source. + @mustBeOverridden + void set3dSourceMinMaxDistance( + SoundHandle handle, + double minDistance, + double maxDistance, + ); + + /// You can change the attenuation model and rolloff factor parameters of + /// a live 3d audio source. + /// + /// NO_ATTENUATION No attenuation + /// INVERSE_DISTANCE Inverse distance attenuation model + /// LINEAR_DISTANCE Linear distance attenuation model + /// EXPONENTIAL_DISTANCE Exponential distance attenuation model + /// + /// see https://solhsa.com/soloud/concepts3d.html + @mustBeOverridden + void set3dSourceAttenuation( + SoundHandle handle, + int attenuationModel, + double attenuationRolloffFactor, + ); + + /// You can change the doppler factor of a live 3d audio source. + @mustBeOverridden + void set3dSourceDopplerFactor(SoundHandle handle, double dopplerFactor); +} + +/// Used for easier conversion from [double] to [Duration]. +extension DoubleToDuration on double { + Duration toDuration() { + return Duration( + microseconds: (this * Duration.microsecondsPerSecond).round()); + } +} + +/// Used for easier conversion from [Duration] to [double]. +extension DurationToDouble on Duration { + double toDouble() { + return inMicroseconds / Duration.microsecondsPerSecond; + } +} diff --git a/lib/src/bindings/bindings_player_ffi.dart b/lib/src/bindings/bindings_player_ffi.dart index f3d1435..43fb363 100644 --- a/lib/src/bindings/bindings_player_ffi.dart +++ b/lib/src/bindings/bindings_player_ffi.dart @@ -4,11 +4,12 @@ // ignore_for_file: avoid_positional_boolean_parameters,require_trailing_commas // ignore_for_file: public_member_api_docs -import 'dart:async'; import 'dart:ffi' as ffi; import 'dart:typed_data'; import 'package:ffi/ffi.dart'; +import 'package:flutter_soloud/src/bindings/bindings_player.dart'; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; import 'package:flutter_soloud/src/enums.dart'; import 'package:flutter_soloud/src/sound_handle.dart'; import 'package:flutter_soloud/src/sound_hash.dart'; @@ -47,7 +48,8 @@ typedef DartdartStateChangedCallbackTFunction = void Function( ffi.Pointer); /// FFI bindings to SoLoud -class FlutterSoLoudFfi { + @internal +class FlutterSoLoudFfi extends FlutterSoLoud { static final Logger _log = Logger('flutter_soloud.FlutterSoLoudFfi'); /// Holds the symbol lookup function. @@ -65,39 +67,10 @@ class FlutterSoLoudFfi { ffi.Pointer Function(String symbolName) lookup, ) : _lookup = lookup; - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// + // //////////////////////////////////////////////// + // Callbacks impl + // //////////////////////////////////////////////// - /// When allocating memory in C code, more attention must be given when - /// we are on Windows OS. It's not good to call `calloc.free()` because - /// Windows could use different allocating methods for this and the same - /// must be used freeing it. `calloc.free()` use the standard `free()` and - /// doesn't have problems using it in other OSes. - void nativeFree(ffi.Pointer pointer) { - return _nativeFree(pointer); - } - - late final _nativeFreePtr = - _lookup)>>( - 'nativeFree'); - late final _nativeFree = - _nativeFreePtr.asFunction)>(); - - /// Controller to listen to voice ended events. - @internal - late final StreamController voiceEndedEventController = - StreamController.broadcast(); - - /// listener for voices ended. - @internal - Stream get voiceEndedEvents => voiceEndedEventController.stream; - - /// void _voiceEndedCallback(ffi.Pointer handle) { _log.finest(() => 'VOICE ENDED EVENT handle: ${handle.value}'); voiceEndedEventController.add(handle.value); @@ -106,16 +79,6 @@ class FlutterSoLoudFfi { nativeFree(handle.cast()); } - /// Controller to listen to file loaded events. - @internal - late final StreamController> fileLoadedEventsController = - StreamController.broadcast(); - - /// listener for file loaded. - @internal - Stream> get fileLoadedEvents => - fileLoadedEventsController.stream; - /// void _fileLoadedCallback( ffi.Pointer error, @@ -139,16 +102,6 @@ class FlutterSoLoudFfi { nativeFree(hash.cast()); } - /// Controller to listen to voice ended events. - @internal - late final StreamController stateChangedController = - StreamController.broadcast(); - - /// listener for voices ended. - @internal - Stream get stateChangedEvents => - stateChangedController.stream; - void _stateChangedCallback(ffi.Pointer state) { final s = PlayerStateNotification.values[state.value]; // Must free a pointer made on cpp. On Windows this must be freed @@ -158,8 +111,7 @@ class FlutterSoLoudFfi { stateChangedController.add(s); } - /// Set a Dart function to call when a sound ends. - /// + @override void setDartEventCallbacks() { // Create a NativeCallable for the Dart functions final nativeVoiceEndedCallable = @@ -190,16 +142,26 @@ class FlutterSoLoudFfi { void Function(DartVoiceEndedCallbackT, DartFileLoadedCallbackT, DartStateChangedCallbackT)>(); - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - /// Initialize the player. Must be called before any other player functions - /// - /// Returns [PlayerErrors.noError] if success + // //////////////////////////////////////////////// + // Navtive bindings + // //////////////////////////////////////////////// + + /// When allocating memory in C code, more attention must be given when + /// we are on Windows OS. It's not good to call `calloc.free()` because + /// Windows could use different allocating methods for this and the same + /// must be used freeing it. `calloc.free()` use the standard `free()` and + /// doesn't have problems using it in other OSes. + void nativeFree(ffi.Pointer pointer) { + return _nativeFree(pointer); + } + + late final _nativeFreePtr = + _lookup)>>( + 'nativeFree'); + late final _nativeFree = + _nativeFreePtr.asFunction)>(); + + @override PlayerErrors initEngine() { return PlayerErrors.values[_initEngine()]; } @@ -208,9 +170,7 @@ class FlutterSoLoudFfi { _lookup>('initEngine'); late final _initEngine = _initEnginePtr.asFunction(); - /// Must be called when there is no more need of the player - /// or when closing the app - /// + @override void deinit() { return _dispose(); } @@ -219,9 +179,7 @@ class FlutterSoLoudFfi { _lookup>('dispose'); late final _dispose = _disposePtr.asFunction(); - /// Gets the state of player - /// - /// Return true if initilized + @override bool isInited() { return _isInited() == 1; } @@ -231,20 +189,7 @@ class FlutterSoLoudFfi { ); late final _isInited = _isInitedPtr.asFunction(); - /// Load a new sound to be played once or multiple times later. - /// - /// After loading the file, the [_fileLoadedCallback] will call the - /// Dart function defined with [_setDartEventCallback] which gives back - /// the error and the new hash. - /// - /// [completeFileName] the complete file path. - /// [LoadMode] if `LoadMode.memory`, Soloud::wav will be used which loads - /// all audio data into memory. Used to prevent gaps or lags - /// when seeking/starting a sound (less CPU, more memory allocated). - /// If `LoadMode.disk` is used, the audio data is loaded - /// from the given file when needed (more CPU, less memory allocated). - /// See the [seek] note problem when using [LoadMode] = `LoadMode.disk`. - /// `soundHash` return hash of the sound. + @override void loadFile( String completeFileName, LoadMode mode, @@ -268,13 +213,7 @@ class FlutterSoLoudFfi { late final _loadFile = _loadFilePtr.asFunction, int)>(); - /// Load a new sound stored into [buffer] as file bytes to be played once - /// or multiple times later. - /// Use this on web because the browsers are not allowed to read - /// files directly. - /// - /// [uniqueName] the unique name of the sound. Used only to have the [hash]. - /// [buffer] the audio data. These contains the audio file bytes. + @override ({PlayerErrors error, SoundHash soundHash}) loadMem( String uniqueName, Uint8List buffer, @@ -308,14 +247,7 @@ class FlutterSoLoudFfi { int Function(ffi.Pointer, ffi.Pointer, int, ffi.Pointer)>(); - /// Load a new waveform to be played once or multiple times later - /// - /// [waveform] - /// [superWave] - /// [scale] - /// [detune] - /// `soundHash` return hash of the sound - /// Returns [PlayerErrors.noError] if success + @override ({PlayerErrors error, SoundHash soundHash}) loadWaveform( WaveForm waveform, bool superWave, @@ -345,10 +277,7 @@ class FlutterSoLoudFfi { late final _loadWaveform = _loadWaveformPtr.asFunction< int Function(int, int, double, double, ffi.Pointer)>(); - /// Set the scale of an already loaded waveform identified by [hash] - /// - /// [hash] the unique sound hash of a waveform sound - /// [newScale] + @override void setWaveformScale(SoundHash hash, double newScale) { return _setWaveformScale(hash.hash, newScale); } @@ -359,10 +288,7 @@ class FlutterSoLoudFfi { late final _setWaveformScale = _setWaveformScalePtr.asFunction(); - /// Set the detune of an already loaded waveform identified by [hash] - /// - /// [hash] the unique sound hash of a waveform sound - /// [newDetune] + @override void setWaveformDetune(SoundHash hash, double newDetune) { return _setWaveformDetune(hash.hash, newDetune); } @@ -373,10 +299,7 @@ class FlutterSoLoudFfi { late final _setWaveformDetune = _setWaveformDetunePtr.asFunction(); - /// Set a new frequency of an already loaded waveform identified by [hash] - /// - /// [hash] the unique sound hash of a waveform sound - /// [newFreq] + @override void setWaveformFreq(SoundHash hash, double newFreq) { return _setWaveformFreq(hash.hash, newFreq); } @@ -387,10 +310,7 @@ class FlutterSoLoudFfi { late final _setWaveformFreq = _setWaveformFreqPtr.asFunction(); - /// Set a new frequence of an already loaded waveform identified by [hash] - /// - /// [hash] the unique sound hash of a waveform sound - /// [superwave] + @override void setWaveformSuperWave(SoundHash hash, int superwave) { return _setSuperWave(hash.hash, superwave); } @@ -401,18 +321,7 @@ class FlutterSoLoudFfi { late final _setSuperWave = _setSuperWavePtr.asFunction(); - /// Set a new wave form of an already loaded waveform identified by [hash] - /// - /// [hash] the unique sound hash of a waveform sound - /// [newWaveform] WAVE_SQUARE = 0, - /// WAVE_SAW, - /// WAVE_SIN, - /// WAVE_TRIANGLE, - /// WAVE_BOUNCE, - /// WAVE_JAWS, - /// WAVE_HUMPS, - /// WAVE_FSQUARE, - /// WAVE_FSAW + @override void setWaveform(SoundHash hash, WaveForm newWaveform) { return _setWaveform(hash.hash, newWaveform.index); } @@ -423,11 +332,7 @@ class FlutterSoLoudFfi { late final _setWaveform = _setWaveformPtr.asFunction(); - /// Speech the text given - /// - /// [textToSpeech] - /// Returns PlayerErrors.noError if success and handle sound identifier - // TODO(marco): add other T2S parameters + @override ({PlayerErrors error, SoundHandle handle}) speechText(String textToSpeech) { // ignore: omit_local_variable_types final ffi.Pointer handle = calloc(); @@ -450,9 +355,7 @@ class FlutterSoLoudFfi { late final _speechText = _speechTextPtr.asFunction< int Function(ffi.Pointer, ffi.Pointer)>(); - /// Switch pause state of an already loaded sound identified by [handle] - /// - /// [handle] the sound handle + @override void pauseSwitch(SoundHandle handle) { return _pauseSwitch(handle.id); } @@ -463,10 +366,7 @@ class FlutterSoLoudFfi { ); late final _pauseSwitch = _pauseSwitchPtr.asFunction(); - /// Pause or unpause already loaded sound identified by [handle] - /// - /// [handle] the sound handle - /// [pause] the sound handle + @override void setPause(SoundHandle handle, int pause) { return _setPause(handle.id, pause); } @@ -476,10 +376,7 @@ class FlutterSoLoudFfi { 'setPause'); late final _setPause = _setPausePtr.asFunction(); - /// Gets the pause state - /// - /// [handle] the sound handle - /// Return true if paused + @override bool getPause(SoundHandle handle) { return _getPause(handle.id) == 1; } @@ -490,18 +387,7 @@ class FlutterSoLoudFfi { ); late final _getPause = _getPausePtr.asFunction(); - /// Set a sound's relative play speed. - /// Setting the value to 0 will cause undefined behavior, likely a crash. - /// Change the relative play speed of a sample. This changes the effective - /// sample rate while leaving the base sample rate alone. - /// - /// Note that playing a sound at a higher sample rate will require SoLoud - /// to request more samples from the sound source, which will require more - /// memory and more processing power. Playing at a slower sample - /// rate is cheaper. - /// - /// [handle] the sound handle - /// [speed] the new speed + @override void setRelativePlaySpeed(SoundHandle handle, double speed) { return _setRelativePlaySpeed(handle.id, speed); } @@ -512,9 +398,7 @@ class FlutterSoLoudFfi { late final _setRelativePlaySpeed = _setRelativePlaySpeedPtr.asFunction(); - /// Return the current play speed. - /// - /// [handle] the sound handle + @override double getRelativePlaySpeed(SoundHandle handle) { return _getRelativePlaySpeed(handle.id); } @@ -525,18 +409,7 @@ class FlutterSoLoudFfi { late final _getRelativePlaySpeed = _getRelativePlaySpeedPtr.asFunction(); - /// Play already loaded sound identified by [soundHash] - /// - /// [soundHash] the unique sound hash of a sound - /// [volume] 1.0 full volume - /// [pan] 0.0 centered - /// [paused] false not paused - /// [looping] whether to start the sound in looping state. - /// [loopingStartAt] If looping is enabled, the loop point is, by default, - /// the start of the stream. The loop start point can be set with this - /// parameter, and current loop point can be queried with `getLoopingPoint()` - /// and changed by `setLoopingPoint()`. - /// Return the error if any and a new `newHandle` of this sound + @override ({PlayerErrors error, SoundHandle newHandle}) play( SoundHash soundHash, { double volume = 1, @@ -571,9 +444,7 @@ class FlutterSoLoudFfi { int Function(int, double, double, int, int, double, ffi.Pointer)>(); - /// Stop already loaded sound identified by [handle] and clear it. - /// - /// [handle] + @override void stop(SoundHandle handle) { return _stop(handle.id); } @@ -582,10 +453,7 @@ class FlutterSoLoudFfi { _lookup>('stop'); late final _stop = _stopPtr.asFunction(); - /// Stop all handles of the already loaded sound identified - /// by [soundHash] and dispose it. - /// - /// [soundHash] + @override void disposeSound(SoundHash soundHash) { return _disposeSound(soundHash.hash); } @@ -596,7 +464,7 @@ class FlutterSoLoudFfi { ); late final _disposeSound = _disposeSoundPtr.asFunction(); - /// Dispose all sounds already loaded + @override void disposeAllSound() { return _disposeAllSound(); } @@ -606,10 +474,7 @@ class FlutterSoLoudFfi { late final _disposeAllSound = _disposeAllSoundPtr.asFunction(); - /// Query whether a sound is set to loop. - /// - /// [handle] - /// Returns true if flagged for looping. + @override bool getLooping(SoundHandle handle) { return _getLooping(handle.id) == 1; } @@ -619,11 +484,7 @@ class FlutterSoLoudFfi { 'getLooping'); late final _getLooping = _getLoopingPtr.asFunction(); - /// This function can be used to set a sample to play on repeat, - /// instead of just playing once - /// - /// [handle] - /// [enable] + @override void setLooping(SoundHandle handle, bool enable) { return _setLooping(handle.id, enable ? 1 : 0); } @@ -634,10 +495,7 @@ class FlutterSoLoudFfi { ); late final _setLooping = _setLoopingPtr.asFunction(); - /// Get sound loop point value. - /// - /// [handle] - /// Returns the duration. + @override Duration getLoopPoint(SoundHandle handle) { return _getLoopPoint(handle.id).toDuration(); } @@ -648,10 +506,7 @@ class FlutterSoLoudFfi { late final _getLoopPoint = _getLoopPointPtr.asFunction(); - /// Set sound loop point value. - /// - /// [handle] - /// [timestamp] + @override void setLoopPoint(SoundHandle handle, Duration timestamp) { _setLoopPoint(handle.id, timestamp.toDouble()); } @@ -662,11 +517,7 @@ class FlutterSoLoudFfi { late final _setLoopPoint = _setLoopPointPtr.asFunction(); - // TODO(marco): implement Soloud.getLoopCount() also? - - /// Enable or disable visualization - /// - /// [enabled] enable or disable it + @override void setVisualizationEnabled(bool enabled) { return _setVisualizationEnabled( enabled ? 1 : 0, @@ -680,9 +531,7 @@ class FlutterSoLoudFfi { late final _setVisualizationEnabled = _setVisualizationEnabledPtr.asFunction(); - /// Get visualization state - /// - /// Return true if enabled + @override bool getVisualizationEnabled() { return _getVisualizationEnabled() == 1; } @@ -693,46 +542,29 @@ class FlutterSoLoudFfi { late final _getVisualizationEnabled = _getVisualizationEnabledPtr.asFunction(); - /// Returns valid data only if VisualizationEnabled is true - /// - /// [fft] - /// Return a 256 float array containing FFT data. - void getFft(ffi.Pointer fft) { - return _getFft(fft); + @override + void getFft(AudioData fft) { + return _getFft(fft.samplesWave!); } - late final _getFftPtr = - _lookup)>>( - 'getFft', - ); - late final _getFft = - _getFftPtr.asFunction)>(); + late final _getFftPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer>)>>('getFft'); + late final _getFft = _getFftPtr + .asFunction>)>(); - /// Returns valid data only if VisualizationEnabled is true - /// - /// fft - /// Return a 256 float array containing wave data. - void getWave(ffi.Pointer wave) { - return _getWave(wave); + @override + void getWave(AudioData wave) { + return _getWave(wave.samplesWave!); } - late final _getWavePtr = - _lookup)>>( - 'getWave', - ); - late final _getWave = - _getWavePtr.asFunction)>(); + late final _getWavePtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer>)>>('getWave'); + late final _getWave = _getWavePtr + .asFunction>)>(); - /// Smooth FFT data. - /// When new data is read and the values are decreasing, the new value will be - /// decreased with an amplitude between the old and the new value. - /// This will result on a less shaky visualization. - /// - /// [smooth] must be in the [0.0 ~ 1.0] range. - /// 0 = no smooth - /// 1 = full smooth - /// the new value is calculated with: - /// newFreq = smooth * oldFreq + (1 - smooth) * newFreq + @override void setFftSmoothing(double smooth) { return _setFftSmoothing(smooth); } @@ -744,13 +576,9 @@ class FlutterSoLoudFfi { late final _setFftSmoothing = _setFftSmoothingPtr.asFunction(); - /// Return in [samples] a 512 float array. - /// The first 256 floats represent the FFT frequencies data [>=0.0]. - /// The other 256 floats represent the wave data (amplitude) [-1.0~1.0]. - /// - /// [samples] should be allocated and freed in dart side - void getAudioTexture(ffi.Pointer samples) { - return _getAudioTexture(samples); + @override + void getAudioTexture(AudioData samples) { + return _getAudioTexture(samples.samples1D!); } late final _getAudioTexturePtr = @@ -760,16 +588,9 @@ class FlutterSoLoudFfi { late final _getAudioTexture = _getAudioTexturePtr.asFunction)>(); - /// Return a floats matrix of 256x512 - /// Every row are composed of 256 FFT values plus 256 of wave data - /// Every time is called, a new row is stored in the - /// first row and all the previous rows are shifted - /// up (the last one will be lost). - /// - /// [samples] - PlayerErrors getAudioTexture2D(ffi.Pointer> samples) { - if (samples == ffi.nullptr) return PlayerErrors.nullPointer; - final ret = _getAudioTexture2D(samples); + @override + PlayerErrors getAudioTexture2D(AudioData samples) { + final ret = _getAudioTexture2D(samples.samples2D!); return PlayerErrors.values[ret]; } @@ -781,10 +602,7 @@ class FlutterSoLoudFfi { late final _getAudioTexture2D = _getAudioTexture2DPtr .asFunction>)>(); - /// Get the sound length. - /// - /// [soundHash] the sound hash - /// Returns sound length in seconds + @override Duration getLength(SoundHash soundHash) { return _getLength(soundHash.hash).toDuration(); } @@ -795,22 +613,7 @@ class FlutterSoLoudFfi { ); late final _getLength = _getLengthPtr.asFunction(); - /// Seek playing in [time] seconds - /// [time] - /// [handle] the sound handle - /// Returns [PlayerErrors.noError] if success - /// - /// NOTE: when seeking an MP3 file loaded using `mode`=`LoadMode.disk` the - /// seek operation is performed but there will be delays. This occurs because - /// the MP3 codec must compute each frame length to gain a new position. - /// The problem is explained in souloud_wavstream.cpp - /// in `WavStreamInstance::seek` function. - /// - /// This mode is useful ie for background music, not for a music player - /// where a seek slider for MP3s is a must. - /// If you need to seek MP3s without lags, please, use - /// `mode`=`LoadMode.memory` instead or other supported audio formats! - /// + @override int seek(SoundHandle handle, Duration time) { return _seek(handle.id, time.toDouble()); } @@ -821,10 +624,7 @@ class FlutterSoLoudFfi { ); late final _seek = _seekPtr.asFunction(); - /// Get current sound position in seconds - /// - /// [handle] the sound handle - /// Returns time + @override Duration getPosition(SoundHandle handle) { return _getPosition(handle.id).toDuration(); } @@ -835,9 +635,7 @@ class FlutterSoLoudFfi { ); late final _getPosition = _getPositionPtr.asFunction(); - /// Get current Global volume - /// - /// Returns the volume + @override double getGlobalVolume() { return _getGlobalVolume(); } @@ -847,9 +645,7 @@ class FlutterSoLoudFfi { late final _getGlobalVolume = _getGlobalVolumePtr.asFunction(); - /// Set current Global volume - /// - /// Returns [PlayerErrors.noError] if success + @override int setGlobalVolume(double volume) { return _setGlobalVolume(volume); } @@ -860,9 +656,7 @@ class FlutterSoLoudFfi { late final _setGlobalVolume = _setGlobalVolumePtr.asFunction(); - /// Get current [handle] volume - /// - /// Returns the volume + @override double getVolume(SoundHandle handle) { return _getVolume(handle.id); } @@ -872,9 +666,7 @@ class FlutterSoLoudFfi { 'getVolume'); late final _getVolume = _getVolumePtr.asFunction(); - /// Set current [handle] volume - /// - /// Returns [PlayerErrors.noError] if success + @override int setVolume(SoundHandle handle, double volume) { return _setVolume(handle.id, volume); } @@ -884,57 +676,7 @@ class FlutterSoLoudFfi { 'setVolume'); late final _setVolume = _setVolumePtr.asFunction(); - /// Get a sound's current pan setting. - /// - /// [handle] the sound handle. - /// Returns the range of the pan values is -1 to 1, where -1 is left, 0 is - /// middle and and 1 is right. - double getPan(int handle) { - // Note that because of the float<=>double conversion precision error - // (SoLoud lib uses floats), the returned value is not precise. - return _getPan(handle); - } - - late final _getPanPtr = - _lookup>( - 'getPan'); - late final _getPan = _getPanPtr.asFunction(); - - /// Set a sound's current pan setting. - /// - /// [handle] the sound handle. - /// [pan] the range of the pan values is -1 to 1, where -1 is left, 0 is - /// middle and and 1 is right. - void setPan(int handle, double pan) { - return _setPan(handle, pan); - } - - late final _setPanPtr = _lookup< - ffi.NativeFunction>( - 'setPan'); - late final _setPan = _setPanPtr.asFunction(); - - /// Set the left/right volumes directly. - /// Note that this does not affect the value returned by getPan. - /// - /// [handle] the sound handle. - /// [panLeft] value for the left pan. - /// [panRight] value for the right pan. - void setPanAbsolute(int handle, double panLeft, double panRight) { - return _setPanAbsolute(handle, panLeft, panRight); - } - - late final _setPanAbsolutePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.UnsignedInt, ffi.Double, ffi.Double)>>('setPanAbsolute'); - late final _setPanAbsolute = - _setPanAbsolutePtr.asFunction(); - - /// Check if a handle is still valid. - /// - /// [handle] handle to check - /// Return true if it still exists + @override bool getIsValidVoiceHandle(SoundHandle handle) { return _getIsValidVoiceHandle(handle.id) == 1; } @@ -946,7 +688,7 @@ class FlutterSoLoudFfi { late final _getIsValidVoiceHandle = _getIsValidVoiceHandlePtr.asFunction(); - /// Returns the number of concurrent sounds that are playing at the moment. + @override int getActiveVoiceCount() { return _getActiveVoiceCount(); } @@ -957,8 +699,7 @@ class FlutterSoLoudFfi { late final _getActiveVoiceCount = _getActiveVoiceCountPtr.asFunction(); - /// Returns the number of concurrent sounds that are playing a - /// specific audio source. + @override int countAudioSource(SoundHash soundHash) { return _countAudioSource(soundHash.hash); } @@ -969,7 +710,7 @@ class FlutterSoLoudFfi { late final _countAudioSource = _countAudioSourcePtr.asFunction(); - /// Returns the number of voices the application has told SoLoud to play. + @override int getVoiceCount() { return _getVoiceCount(); } @@ -978,7 +719,7 @@ class FlutterSoLoudFfi { _lookup>('getVoiceCount'); late final _getVoiceCount = _getVoiceCountPtr.asFunction(); - /// Get a sound's protection state. + @override bool getProtectVoice(SoundHandle handle) { return _getProtectVoice(handle.id) == 1; } @@ -989,16 +730,7 @@ class FlutterSoLoudFfi { late final _getProtectVoice = _getProtectVoicePtr.asFunction(); - /// Set a sound's protection state. - /// - /// Normally, if you try to play more sounds than there are voices, - /// SoLoud will kill off the oldest playing sound to make room. - /// This will most likely be your background music. This can be worked - /// around by protecting the sound. - /// If all voices are protected, the result will be undefined. - /// - /// [handle] handle to check. - /// [protect] whether to protect or not. + @override void setProtectVoice(SoundHandle handle, bool protect) { return _setProtectVoice(handle.id, protect ? 1 : 0); } @@ -1009,7 +741,7 @@ class FlutterSoLoudFfi { late final _setProtectVoice = _setProtectVoicePtr.asFunction(); - /// Get the current maximum active voice count. + @override int getMaxActiveVoiceCount() { return _getMaxActiveVoiceCount(); } @@ -1020,18 +752,7 @@ class FlutterSoLoudFfi { late final _getMaxActiveVoiceCount = _getMaxActiveVoiceCountPtr.asFunction(); - /// Set the current maximum active voice count. - /// If voice count is higher than the maximum active voice count, - /// SoLoud will pick the ones with the highest volume to actually play. - /// [maxVoiceCount] the max concurrent sounds that can be played. - /// - /// NOTE: The number of concurrent voices is limited, as having unlimited - /// voices would cause performance issues, as well as lead to unnecessary - /// clipping. The default number of concurrent voices is 16, but this can be - /// adjusted at runtime. The hard maximum number is 4095, but if more are - /// required, SoLoud can be modified to support more. But seriously, if you - /// need more than 4095 sounds at once, you're probably going to make - /// some serious changes in any case. + @override void setMaxActiveVoiceCount(int maxVoiceCount) { return _setMaxActiveVoiceCount(maxVoiceCount); } @@ -1046,8 +767,7 @@ class FlutterSoLoudFfi { /// faders ///////////////////////////////////////// - /// Smoothly change the global volume over specified [duration]. - /// + @override int fadeGlobalVolume(double to, Duration duration) { return _fadeGlobalVolume(to, duration.toDouble()); } @@ -1058,8 +778,7 @@ class FlutterSoLoudFfi { late final _fadeGlobalVolume = _fadeGlobalVolumePtr.asFunction(); - /// Smoothly change a channel's volume over specified [duration]. - /// + @override int fadeVolume(SoundHandle handle, double to, Duration duration) { return _fadeVolume(handle.id, to, duration.toDouble()); } @@ -1071,8 +790,7 @@ class FlutterSoLoudFfi { late final _fadeVolume = _fadeVolumePtr.asFunction(); - /// Smoothly change a channel's pan setting over specified [duration]. - /// + @override int fadePan(SoundHandle handle, double to, Duration duration) { return _fadePan(handle.id, to, duration.toDouble()); } @@ -1084,8 +802,7 @@ class FlutterSoLoudFfi { late final _fadePan = _fadePanPtr.asFunction(); - /// Smoothly change a channel's relative play speed over specified time. - /// + @override int fadeRelativePlaySpeed(SoundHandle handle, double to, Duration time) { return _fadeRelativePlaySpeed(handle.id, to, time.toDouble()); } @@ -1097,8 +814,7 @@ class FlutterSoLoudFfi { late final _fadeRelativePlaySpeed = _fadeRelativePlaySpeedPtr.asFunction(); - /// After specified [duration], pause the channel. - /// + @override int schedulePause(SoundHandle handle, Duration duration) { return _schedulePause(handle.id, duration.toDouble()); } @@ -1109,8 +825,7 @@ class FlutterSoLoudFfi { late final _schedulePause = _schedulePausePtr.asFunction(); - /// After specified time, stop the channel. - /// + @override int scheduleStop(SoundHandle handle, Duration duration) { return _scheduleStop(handle.id, duration.toDouble()); } @@ -1121,8 +836,7 @@ class FlutterSoLoudFfi { late final _scheduleStop = _scheduleStopPtr.asFunction(); - /// Set fader to oscillate the volume at specified frequency. - /// + @override int oscillateVolume( SoundHandle handle, double from, double to, Duration time) { return _oscillateVolume(handle.id, from, to, time.toDouble()); @@ -1135,8 +849,7 @@ class FlutterSoLoudFfi { late final _oscillateVolume = _oscillateVolumePtr .asFunction(); - /// Set fader to oscillate the panning at specified frequency. - /// + @override int oscillatePan(SoundHandle handle, double from, double to, Duration time) { return _oscillatePan(handle.id, from, to, time.toDouble()); } @@ -1148,8 +861,7 @@ class FlutterSoLoudFfi { late final _oscillatePan = _oscillatePanPtr.asFunction(); - /// Set fader to oscillate the relative play speed at specified frequency. - /// + @override int oscillateRelativePlaySpeed( SoundHandle handle, double from, double to, Duration time) { return _oscillateRelativePlaySpeed(handle.id, from, to, time.toDouble()); @@ -1162,8 +874,7 @@ class FlutterSoLoudFfi { late final _oscillateRelativePlaySpeed = _oscillateRelativePlaySpeedPtr .asFunction(); - /// Set fader to oscillate the global volume at specified frequency. - /// + @override int oscillateGlobalVolume(double from, double to, Duration time) { return _oscillateGlobalVolume(from, to, time.toDouble()); } @@ -1175,16 +886,11 @@ class FlutterSoLoudFfi { late final _oscillateGlobalVolume = _oscillateGlobalVolumePtr .asFunction(); - ///////////////////////////////////////// - /// Filters - ///////////////////////////////////////// + // /////////////////////////////////////// + // Filters + // /////////////////////////////////////// - /// Check if the given filter is active or not. - /// - /// [filterType] filter to check - /// Returns [PlayerErrors.noError] if no errors and the index of - /// the given filter (-1 if the filter is not active) - /// + @override ({PlayerErrors error, int index}) isFilterActive(int filterType) { // ignore: omit_local_variable_types final ffi.Pointer id = calloc(ffi.sizeOf()); @@ -1201,11 +907,7 @@ class FlutterSoLoudFfi { late final _isFilterActive = _isFilterActivePtr.asFunction)>(); - /// Get parameters names of the given filter. - /// - /// [filterType] filter to get param names - /// Returns [PlayerErrors.noError] if no errors and the list of param names - /// + @override ({PlayerErrors error, List names}) getFilterParamNames( int filterType) { // ignore: omit_local_variable_types @@ -1246,17 +948,7 @@ class FlutterSoLoudFfi { int Function( int, ffi.Pointer, ffi.Pointer>)>(); - /// Add the filter [filterType]. - /// - /// [filterType] filter to add. - /// Returns: - /// [PlayerErrors.noError] if no errors - /// [PlayerErrors.filterNotFound] if the [filterType] does not exits - /// [PlayerErrors.filterAlreadyAdded] when trying to add an already - /// added filter - /// [PlayerErrors.maxNumberOfFiltersReached] when the maximum number of - /// filters has been reached (default is 8) - /// + @override PlayerErrors addGlobalFilter(int filterType) { final e = _addGlobalFilter(filterType); return PlayerErrors.values[e]; @@ -1268,11 +960,7 @@ class FlutterSoLoudFfi { late final _addGlobalFilter = _addGlobalFilterPtr.asFunction(); - /// Remove the filter [filterType]. - /// - /// [filterType] filter to remove - /// Returns [PlayerErrors.noError] if no errors - /// + @override int removeGlobalFilter(int filterType) { return _removeGlobalFilter(filterType); } @@ -1283,12 +971,7 @@ class FlutterSoLoudFfi { late final _removeGlobalFilter = _removeGlobalFilterPtr.asFunction(); - /// Set the effect parameter with id [attributeId] - /// of [filterType] with [value] value. - /// - /// [filterType] filter to modify a param - /// Returns [PlayerErrors.noError] if no errors - /// + @override int setFilterParams(int filterType, int attributeId, double value) { return _setFxParams(filterType, attributeId, value); } @@ -1299,11 +982,7 @@ class FlutterSoLoudFfi { late final _setFxParams = _setFxParamsPtr.asFunction(); - /// Get the effect parameter with id [attributeId] of [filterType]. - /// - /// [filterType] filter to modify a param - /// Returns the value of param - /// + @override double getFilterParams(int filterType, int attributeId) { return _getFxParams(filterType, attributeId); } @@ -1318,16 +997,7 @@ class FlutterSoLoudFfi { /// 3D audio methods ///////////////////////////////////////// - /// play3d() is the 3d version of the play() call - /// - /// [posX], [posY], [posZ] are the audio source position coordinates. - /// [velX], [velY], [velZ] are the audio source velocity. - /// [looping] whether to start the sound in looping state. - /// [loopingStartAt] If looping is enabled, the loop point is, by default, - /// the start of the stream. The loop start point can be set with this - /// parameter, and current loop point can be queried with `getLoopingPoint()` - /// and changed by `setLoopingPoint()`. - /// Returns the handle of the sound, 0 if error + @override ({PlayerErrors error, SoundHandle newHandle}) play3d( SoundHash soundHash, double posX, @@ -1382,12 +1052,7 @@ class FlutterSoLoudFfi { int Function(int, double, double, double, double, double, double, double, int, int, double, ffi.Pointer)>(); - /// Since SoLoud has no knowledge of the scale of your coordinates, - /// you may need to adjust the speed of sound for these effects - /// to work correctly. The default value is 343, which assumes - /// that your world coordinates are in meters (where 1 unit is 1 meter), - /// and that the environment is dry air at around 20 degrees Celsius. - /// + @override void set3dSoundSpeed(double speed) { return _set3dSoundSpeed(speed); } @@ -1399,8 +1064,7 @@ class FlutterSoLoudFfi { late final _set3dSoundSpeed = _set3dSoundSpeedPtr.asFunction(); - /// Get the sound speed. - /// + @override double get3dSoundSpeed() { return _get3dSoundSpeed(); } @@ -1410,9 +1074,7 @@ class FlutterSoLoudFfi { late final _get3dSoundSpeed = _get3dSoundSpeedPtr.asFunction(); - /// You can set the position, at-vector, up-vector and velocity - /// parameters of the 3d audio listener with one call - /// + @override void set3dListenerParameters( double posX, double posY, @@ -1475,8 +1137,7 @@ class FlutterSoLoudFfi { double, )>(); - /// You can set the position parameter of the 3d audio listener - /// + @override void set3dListenerPosition(double posX, double posY, double posZ) { return _set3dListenerPosition(posX, posY, posZ); } @@ -1491,8 +1152,7 @@ class FlutterSoLoudFfi { late final _set3dListenerPosition = _set3dListenerPositionPtr .asFunction(); - /// You can set the "at" vector parameter of the 3d audio listener. - /// + @override void set3dListenerAt(double atX, double atY, double atZ) { return _set3dListenerAt(atX, atY, atZ); } @@ -1507,8 +1167,7 @@ class FlutterSoLoudFfi { late final _set3dListenerAt = _set3dListenerAtPtr.asFunction(); - /// You can set the "up" vector parameter of the 3d audio listener. - /// + @override void set3dListenerUp(double upX, double upY, double upZ) { return _set3dListenerUp(upX, upY, upZ); } @@ -1523,8 +1182,7 @@ class FlutterSoLoudFfi { late final _set3dListenerUp = _set3dListenerUpPtr.asFunction(); - /// You can set the listener's velocity vector parameter. - /// + @override void set3dListenerVelocity( double velocityX, double velocityY, @@ -1543,9 +1201,7 @@ class FlutterSoLoudFfi { late final _set3dListenerVelocity = _set3dListenerVelocityPtr .asFunction(); - /// You can set the position and velocity parameters of a live - /// 3d audio source with one call. - /// + @override void set3dSourceParameters( SoundHandle handle, double posX, @@ -1580,8 +1236,7 @@ class FlutterSoLoudFfi { late final _set3dSourceParameters = _set3dSourceParametersPtr.asFunction< void Function(int, double, double, double, double, double, double)>(); - /// You can set the position parameters of a live 3d audio source - /// + @override void set3dSourcePosition( SoundHandle handle, double posX, double posY, double posZ) { return _set3dSourcePosition(handle.id, posX, posY, posZ); @@ -1598,8 +1253,7 @@ class FlutterSoLoudFfi { late final _set3dSourcePosition = _set3dSourcePositionPtr .asFunction(); - /// You can set the velocity parameters of a live 3d audio source - /// + @override void set3dSourceVelocity( SoundHandle handle, double velocityX, @@ -1620,9 +1274,7 @@ class FlutterSoLoudFfi { late final _set3dSourceVelocity = _set3dSourceVelocityPtr .asFunction(); - /// You can set the minimum and maximum distance parameters - /// of a live 3d audio source - /// + @override void set3dSourceMinMaxDistance( SoundHandle handle, double minDistance, @@ -1641,16 +1293,7 @@ class FlutterSoLoudFfi { late final _set3dSourceMinMaxDistance = _set3dSourceMinMaxDistancePtr .asFunction(); - /// You can change the attenuation model and rolloff factor parameters of - /// a live 3d audio source. - /// - /// NO_ATTENUATION No attenuation - /// INVERSE_DISTANCE Inverse distance attenuation model - /// LINEAR_DISTANCE Linear distance attenuation model - /// EXPONENTIAL_DISTANCE Exponential distance attenuation model - /// - /// see https://solhsa.com/soloud/concepts3d.html - /// + @override void set3dSourceAttenuation( SoundHandle handle, int attenuationModel, @@ -1673,8 +1316,7 @@ class FlutterSoLoudFfi { late final _set3dSourceAttenuation = _set3dSourceAttenuationPtr.asFunction(); - /// You can change the doppler factor of a live 3d audio source - /// + @override void set3dSourceDopplerFactor(SoundHandle handle, double dopplerFactor) { return _set3dSourceDopplerFactor(handle.id, dopplerFactor); } @@ -1685,29 +1327,4 @@ class FlutterSoLoudFfi { ); late final _set3dSourceDopplerFactor = _set3dSourceDopplerFactorPtr.asFunction(); - - /// internal test. Does nothing now - /// - void test() { - return _test(); - } - - late final _testPtr = - _lookup>('test'); - late final _test = _testPtr.asFunction(); -} - -/// Used for easier conversion from [double] to [Duration]. -extension _DoubleToDuration on double { - Duration toDuration() { - return Duration( - microseconds: (this * Duration.microsecondsPerSecond).round()); - } -} - -/// Used for easier conversion from [Duration] to [double]. -extension _DurationToDouble on Duration { - double toDouble() { - return inMicroseconds / Duration.microsecondsPerSecond; - } } diff --git a/lib/src/bindings/bindings_player_web.dart b/lib/src/bindings/bindings_player_web.dart new file mode 100644 index 0000000..d812a33 --- /dev/null +++ b/lib/src/bindings/bindings_player_web.dart @@ -0,0 +1,690 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter_soloud/src/bindings/audio_data.dart'; +import 'package:flutter_soloud/src/bindings/bindings_player.dart'; +import 'package:flutter_soloud/src/bindings/js_extension.dart'; + +import 'package:flutter_soloud/src/enums.dart'; +import 'package:flutter_soloud/src/sound_hash.dart'; +import 'package:flutter_soloud/src/sound_handle.dart'; +import 'package:flutter_soloud/src/worker/worker.dart'; +import 'package:meta/meta.dart'; +import 'package:logging/logging.dart'; + +/// https://kapadia.github.io/emscripten/2013/09/13/emscripten-pointers-and-pointers.html +/// https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#access-memory-from-javascript + +/// https://github.com/isar/isar/blob/main/packages/isar/lib/src/web/web.dart +/// chromium --disable-web-security --disable-gpu --user-data-dir=~/chromeTemp +/// +/// Call Dart method from JS in Flutter Web +/// https://stackoverflow.com/questions/65423861/call-dart-method-from-js-in-flutter-web + +/// JS/WASM bindings to SoLoud +@internal +class FlutterSoLoudWeb extends FlutterSoLoud { + static final Logger _log = Logger('flutter_soloud.FlutterSoLoudFfi'); + + // static FlutterSoLoudWeb? _instance; + + WorkerController? _workerController; + + // FlutterSoLoudWeb._(); + + // factory FlutterSoLoudWeb() => _instance ??= FlutterSoLoudWeb._(); + + /// Create the worker in the WASM Module and listen for events coming + /// from `web/worker.dart.js` + @override + void setDartEventCallbacks() { + // This calls the native WASM `createWorkerInWasm()` in `bindings.cpp`. + // The latter creates a web Worker using `EM_ASM` inlining JS code to + // create the worker in the WASM `Module`. + wasmCreateWorkerInWasm(); + + // Here the `Module.wasmModule` binded to a local [WorkerController] + // is used in the main isolate to listen for events coming from native. + // From native the events can be sent from the main thread and even from + // other threads like the audio thread. + _workerController = WorkerController(); + _workerController!.setWasmWorker(wasmWorker); + _workerController!.onReceive().listen( + (event) { + /// The [event] coming from `web/worker.dart.js` is of String type. + /// Only `voiceEndedCallback` event in web for now. + switch (event) { + case String(): + final decodedMap = jsonDecode(event); + if (decodedMap['message'] == 'voiceEndedCallback') { + _log.finest( + () => 'VOICE ENDED EVENT handle: ${decodedMap['value']}\n'); + voiceEndedEventController.add(decodedMap['value']); + } + } + }, + ); + } + + /// If we will need to send messages to the native. Not used now. + void sendMessageToWasmWorker(String message, int value) { + final messagePtr = wasmMalloc(message.length); + for (var i = 0; i < message.length; i++) { + wasmSetValue(messagePtr + i, message.codeUnits[i], 'i8'); + } + wasmSendToWorker(messagePtr, value); + wasmFree(messagePtr); + } + + @override + PlayerErrors initEngine() { + return PlayerErrors.values[wasmInitEngine()]; + } + + @override + void deinit() => wasmDeinit(); + + @override + bool isInited() => wasmIsInited() == 1; + + @override + ({PlayerErrors error, SoundHash soundHash}) loadFile( + String completeFileName, + LoadMode mode, + ) { + throw UnimplementedError('[loadFile] in not supported on the web platfom! ' + 'Please use [loadMem].'); + } + + @override + ({PlayerErrors error, SoundHash soundHash}) loadMem( + String uniqueName, + Uint8List buffer, + ) { + final hashPtr = wasmMalloc(4); // 4 bytes for an int + final bytesPtr = wasmMalloc(buffer.length); + final pathPtr = wasmMalloc(uniqueName.length); + for (var i = 0; i < buffer.length; i++) { + wasmSetValue(bytesPtr + i, buffer[i], 'i8'); + } + for (var i = 0; i < uniqueName.length; i++) { + wasmSetValue(pathPtr + i, uniqueName.codeUnits[i], 'i8'); + } + final result = wasmLoadMem( + pathPtr, + bytesPtr, + buffer.length, + hashPtr, + ); + + /// "*" means unsigned int 32 + final hash = wasmGetI32Value(hashPtr, '*'); + final soundHash = SoundHash(hash); + final ret = (error: PlayerErrors.values[result], soundHash: soundHash); + + wasmFree(hashPtr); + wasmFree(bytesPtr); + wasmFree(pathPtr); + + return ret; + } + + @override + ({PlayerErrors error, SoundHash soundHash}) loadWaveform( + WaveForm waveform, + bool superWave, + double scale, + double detune, + ) { + final hashPtr = wasmMalloc(4); // 4 bytes for an int + final result = wasmLoadWaveform( + waveform.index, + superWave, + scale, + detune, + hashPtr, + ); + + /// "*" means unsigned int 32 + var hash = wasmGetI32Value(hashPtr, '*'); + final soundHash = SoundHash(hash); + final ret = (error: PlayerErrors.values[result], soundHash: soundHash); + wasmFree(hashPtr); + + return ret; + } + + @override + void setWaveformScale(SoundHash hash, double newScale) { + return wasmSetWaveformScale(hash.hash, newScale); + } + + @override + void setWaveformDetune(SoundHash hash, double newDetune) { + return wasmSetWaveformDetune(hash.hash, newDetune); + } + + @override + void setWaveformFreq(SoundHash hash, double newFreq) { + return wasmSetWaveformFreq(hash.hash, newFreq); + } + + @override + void setWaveformSuperWave(SoundHash hash, int superwave) { + return wasmSetSuperWave(hash.hash, superwave); + } + + @override + void setWaveform(SoundHash hash, WaveForm newWaveform) { + return wasmSetWaveform(hash.hash, newWaveform.index); + } + + @override + ({PlayerErrors error, SoundHandle handle}) speechText(String textToSpeech) { + final handlePtr = wasmMalloc(4); // 4 bytes for an int + final textToSpeechPtr = wasmMalloc(textToSpeech.length); + final result = wasmSpeechText( + textToSpeechPtr, + handlePtr, + ); + + /// "*" means unsigned int 32 + final newHandle = wasmGetI32Value(handlePtr, '*'); + final ret = ( + error: PlayerErrors.values[result], + handle: SoundHandle(newHandle), + ); + wasmFree(textToSpeechPtr); + wasmFree(handlePtr); + + return ret; + } + + @override + void pauseSwitch(SoundHandle handle) { + return wasmPauseSwitch(handle.id); + } + + @override + void setPause(SoundHandle handle, int pause) { + return wasmSetPause(handle.id, pause); + } + + @override + bool getPause(SoundHandle handle) { + return wasmGetPause(handle.id) == 1; + } + + @override + void setRelativePlaySpeed(SoundHandle handle, double speed) { + return wasmSetRelativePlaySpeed(handle.id, speed); + } + + @override + double getRelativePlaySpeed(SoundHandle handle) { + return wasmGetRelativePlaySpeed(handle.id); + } + + @override + ({PlayerErrors error, SoundHandle newHandle}) play( + SoundHash soundHash, { + double volume = 1, + double pan = 0, + bool paused = false, + bool looping = false, + Duration loopingStartAt = Duration.zero, + }) { + final handlePtr = wasmMalloc(4); // 4 bytes for an int + final result = wasmPlay( + soundHash.hash, + volume, + pan, + paused, + looping, + loopingStartAt.toDouble(), + handlePtr, + ); + + /// "*" means unsigned int 32 + final newHandle = wasmGetI32Value(handlePtr, '*'); + final ret = + (error: PlayerErrors.values[result], newHandle: SoundHandle(newHandle)); + wasmFree(handlePtr); + + return ret; + } + + @override + void stop(SoundHandle handle) { + return wasmStop(handle.id); + } + + @override + void disposeSound(SoundHash soundHash) { + return wasmDisposeSound(soundHash.hash); + } + + @override + void disposeAllSound() { + return wasmDisposeAllSound(); + } + + @override + bool getLooping(SoundHandle handle) { + return wasmGetLooping(handle.id) == 1; + } + + @override + void setLooping(SoundHandle handle, bool enable) { + return wasmSetLooping(handle.id, enable ? 1 : 0); + } + + @override + Duration getLoopPoint(SoundHandle handle) { + return wasmGetLoopPoint(handle.id).toDuration(); + } + + @override + void setLoopPoint(SoundHandle handle, Duration timestamp) { + wasmSetLoopPoint(handle.id, timestamp.toDouble()); + } + + @override + void setVisualizationEnabled(bool enabled) { + wasmSetVisualizationEnabled(enabled ? 1 : 0); + } + + @override + bool getVisualizationEnabled() { + bool b = wasmGetVisualizationEnabled() == 1; + return b; + } + + @override + void getFft(AudioData fft) { + wasmGetWave(fft.ctrl.samplesPtr); + } + + @override + void getWave(AudioData wave) { + wasmGetWave(wave.ctrl.samplesPtr); + } + + @override + void setFftSmoothing(double smooth) { + wasmSetFftSmoothing(smooth); + } + + @override + void getAudioTexture(AudioData samples) { + wasmGetAudioTexture(samples.ctrl.samplesPtr); + } + + @override + PlayerErrors getAudioTexture2D(AudioData samples) { + final e = wasmGetAudioTexture2D(samples.ctrl.samplesPtr); + return PlayerErrors.values[e]; + } + + @override + Duration getLength(SoundHash soundHash) { + return wasmGetLength(soundHash.hash).toDuration(); + } + + @override + int seek(SoundHandle handle, Duration time) { + return wasmSeek(handle.id, time.toDouble()); + } + + @override + Duration getPosition(SoundHandle handle) { + return wasmGetPosition(handle.id).toDuration(); + } + + @override + double getGlobalVolume() { + return wasmGetGlobalVolume(); + } + + @override + int setGlobalVolume(double volume) { + return wasmSetGlobalVolume(volume); + } + + @override + double getVolume(SoundHandle handle) { + return wasmGetVolume(handle.id); + } + + @override + int setVolume(SoundHandle handle, double volume) { + return wasmSetVolume(handle.id, volume); + } + + @override + bool getIsValidVoiceHandle(SoundHandle handle) { + return wasmGetIsValidVoiceHandle(handle.id) == 1; + } + + @override + int getActiveVoiceCount() { + return wasmGetActiveVoiceCount(); + } + + @override + int countAudioSource(SoundHash soundHash) { + return wasmCountAudioSource(soundHash.hash); + } + + @override + int getVoiceCount() { + return wasmGetVoiceCount(); + } + + @override + bool getProtectVoice(SoundHandle handle) { + return wasmGetProtectVoice(handle.id) == 1; + } + + @override + void setProtectVoice(SoundHandle handle, bool protect) { + return wasmSetProtectVoice(handle.id, protect ? 1 : 0); + } + + @override + int getMaxActiveVoiceCount() { + return wasmGetMaxActiveVoiceCount(); + } + + @override + void setMaxActiveVoiceCount(int maxVoiceCount) { + return wasmSetMaxActiveVoiceCount(maxVoiceCount); + } + + // /////////////////////////////////////// + // faders + // /////////////////////////////////////// + + @override + int fadeGlobalVolume(double to, Duration duration) { + return wasmFadeGlobalVolume(to, duration.toDouble()); + } + + @override + int fadeVolume(SoundHandle handle, double to, Duration duration) { + return wasmFadeVolume(handle.id, to, duration.toDouble()); + } + + @override + int fadePan(SoundHandle handle, double to, Duration duration) { + return wasmFadePan(handle.id, to, duration.toDouble()); + } + + @override + int fadeRelativePlaySpeed(SoundHandle handle, double to, Duration time) { + return wasmFadeRelativePlaySpeed(handle.id, to, time.toDouble()); + } + + @override + int schedulePause(SoundHandle handle, Duration duration) { + return wasmSchedulePause(handle.id, duration.toDouble()); + } + + @override + int scheduleStop(SoundHandle handle, Duration duration) { + return wasmScheduleStop(handle.id, duration.toDouble()); + } + + @override + int oscillateVolume( + SoundHandle handle, double from, double to, Duration time) { + return wasmOscillateVolume(handle.id, from, to, time.toDouble()); + } + + @override + int oscillatePan(SoundHandle handle, double from, double to, Duration time) { + return wasmOscillatePan(handle.id, from, to, time.toDouble()); + } + + @override + int oscillateRelativePlaySpeed( + SoundHandle handle, double from, double to, Duration time) { + return wasmOscillateRelativePlaySpeed(handle.id, from, to, time.toDouble()); + } + + @override + int oscillateGlobalVolume(double from, double to, Duration time) { + return wasmOscillateGlobalVolume(from, to, time.toDouble()); + } + + // /////////////////////////////////////// + // Filters + // /////////////////////////////////////// + + @override + ({PlayerErrors error, int index}) isFilterActive(int filterType) { + // ignore: omit_local_variable_types + final idPtr = wasmMalloc(4); // 4 bytes for an int + final e = wasmIsFilterActive(filterType, idPtr); + final ret = + (error: PlayerErrors.values[e], index: wasmGetI32Value(idPtr, '*')); + wasmFree(idPtr); + return ret; + } + + @override + ({PlayerErrors error, List names}) getFilterParamNames( + int filterType) { + final paramsCountPtr = wasmMalloc(4); // 4 bytes for an int + final namesPtr = wasmMalloc(30 * 20); // list of 30 String with 20 chars + final e = wasmGetFilterParamNames(filterType, paramsCountPtr, namesPtr); + + final pNames = []; + var offsetPtr = 0; + for (var i = 0; i < wasmGetI32Value(paramsCountPtr, '*'); i++) { + final namePtr = wasmGetI32Value(namesPtr + offsetPtr, '*'); + final name = wasmUtf8ToString(namePtr); + offsetPtr += name.length; + + pNames.add(name); + } + + final ret = (error: PlayerErrors.values[e], names: pNames); + wasmFree(namesPtr); + wasmFree(paramsCountPtr); + return ret; + } + + @override + PlayerErrors addGlobalFilter(int filterType) { + final e = wasmAddGlobalFilter(filterType); + return PlayerErrors.values[e]; + } + + @override + int removeGlobalFilter(int filterType) { + return wasmRemoveGlobalFilter(filterType); + } + + @override + int setFilterParams(int filterType, int attributeId, double value) { + return wasmSetFxParams(filterType, attributeId, value); + } + + @override + double getFilterParams(int filterType, int attributeId) { + return wasmGetFxParams(filterType, attributeId); + } + + // ////////////////////////////////////// + // 3D audio methods + // ////////////////////////////////////// + + @override + ({PlayerErrors error, SoundHandle newHandle}) play3d( + SoundHash soundHash, + double posX, + double posY, + double posZ, { + double velX = 0, + double velY = 0, + double velZ = 0, + double volume = 1, + bool paused = false, + bool looping = false, + Duration loopingStartAt = Duration.zero, + }) { + final handlePtr = wasmMalloc(4); // 4 bytes for an int + final result = wasmPlay3d( + soundHash.hash, + posX, + posY, + posZ, + velX, + velY, + velZ, + volume, + paused ? 1 : 0, + looping ? 1 : 0, + loopingStartAt.toDouble(), + handlePtr, + ); + + /// "*" means unsigned int 32 + final newHandle = wasmGetI32Value(handlePtr, '*'); + final ret = + (error: PlayerErrors.values[result], newHandle: SoundHandle(newHandle)); + wasmFree(handlePtr); + + return ret; + } + + @override + void set3dSoundSpeed(double speed) { + return wasmSet3dSoundSpeed(speed); + } + + @override + double get3dSoundSpeed() { + return wasmGet3dSoundSpeed(); + } + + @override + void set3dListenerParameters( + double posX, + double posY, + double posZ, + double atX, + double atY, + double atZ, + double upX, + double upY, + double upZ, + double velocityX, + double velocityY, + double velocityZ, + ) { + return wasmSet3dListenerParameters( + posX, + posY, + posZ, + atX, + atY, + atZ, + upX, + upY, + upZ, + velocityX, + velocityY, + velocityZ, + ); + } + + @override + void set3dListenerPosition(double posX, double posY, double posZ) { + return wasmSet3dListenerPosition(posX, posY, posZ); + } + + @override + void set3dListenerAt(double atX, double atY, double atZ) { + return wasmSet3dListenerAt(atX, atY, atZ); + } + + @override + void set3dListenerUp(double upX, double upY, double upZ) { + return wasmSet3dListenerUp(upX, upY, upZ); + } + + @override + void set3dListenerVelocity( + double velocityX, + double velocityY, + double velocityZ, + ) { + return wasmSet3dListenerVelocity(velocityX, velocityY, velocityZ); + } + + @override + void set3dSourceParameters( + SoundHandle handle, + double posX, + double posY, + double posZ, + double velocityX, + double velocityY, + double velocityZ, + ) { + return wasmSet3dSourceParameters( + handle.id, + posX, + posY, + posZ, + velocityX, + velocityY, + velocityZ, + ); + } + + @override + void set3dSourcePosition( + SoundHandle handle, double posX, double posY, double posZ) { + return wasmSet3dSourcePosition(handle.id, posX, posY, posZ); + } + + @override + void set3dSourceVelocity( + SoundHandle handle, + double velocityX, + double velocityY, + double velocityZ, + ) { + return wasmSet3dSourceVelocity(handle.id, velocityX, velocityY, velocityZ); + } + + @override + void set3dSourceMinMaxDistance( + SoundHandle handle, + double minDistance, + double maxDistance, + ) { + return wasmSet3dSourceMinMaxDistance(handle.id, minDistance, maxDistance); + } + + @override + void set3dSourceAttenuation( + SoundHandle handle, + int attenuationModel, + double attenuationRolloffFactor, + ) { + return wasmSet3dSourceAttenuation( + handle.id, + attenuationModel, + attenuationRolloffFactor, + ); + } + + @override + void set3dSourceDopplerFactor(SoundHandle handle, double dopplerFactor) { + return wasmSet3dSourceDopplerFactor(handle.id, dopplerFactor); + } +} diff --git a/lib/src/bindings/js_extension.dart b/lib/src/bindings/js_extension.dart new file mode 100644 index 0000000..95ec7cb --- /dev/null +++ b/lib/src/bindings/js_extension.dart @@ -0,0 +1,442 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:js_interop'; +import 'package:web/web.dart' as web; + +// @JS() +// external $Module get wasmModule; + +// @JS() +// extension type $Module._(JSObject _) implements JSObject { +@JS('Module._malloc') +external int wasmMalloc(int bytesCount); + +@JS('Module._free') +external void wasmFree(int ptrAddress); + +@JS('Module.getValue') +external int wasmGetI32Value(int ptrAddress, String type); + +@JS('Module.getValue') +external double wasmGetF32Value(int ptrAddress, String type); + +@JS('Module.UTF8ToString') +external String wasmUtf8ToString(int ptrAddress); + +@JS('Module.setValue') +external void wasmSetValue(int ptrAddress, int value, String type); + +@JS('Module.cwrap') +external JSFunction wasmCwrap( + JSString fName, + JSString returnType, + JSArray argTypes, +); + +@JS('Module.ccall') +external JSFunction wasmCccall( + JSString fName, + JSString returnType, + JSArray argTypes, + JSArray args, +); + +@JS('Module._createWorkerInWasm') +external void wasmCreateWorkerInWasm(); + +@JS('Module._sendToWorker') +external void wasmSendToWorker(int message, int value); + +@JS('Module.wasmWorker') +external web.Worker wasmWorker; + +@JS('Module._initEngine') +external int wasmInitEngine(); + +@JS('Module._dispose') +external void wasmDeinit(); + +@JS('Module._isInited') +external int wasmIsInited(); + +@JS('Module._loadFile') +external int wasmLoadFile( + int completeFileNamePtr, + int loadIntoMem, + int hashPtr, +); + +@JS('Module._loadMem') +external int wasmLoadMem( + int uniqueNamePtr, + int memPtr, + int length, + int hashPtr, +); +@JS('Module._loadWaveform') +external int wasmLoadWaveform( + int waveform, + // ignore: avoid_positional_boolean_parameters + bool superWave, + double scale, + double detune, + int hashPtr, +); + +@JS('Module._setWaveformScale') +external void wasmSetWaveformScale(int soundHash, double newScale); + +@JS('Module._setWaveformDetune') +external void wasmSetWaveformDetune(int soundHash, double newDetune); + +@JS('Module._setWaveformFreq') +external void wasmSetWaveformFreq(int soundHash, double newFreq); + +@JS('Module._setSuperWave') +external void wasmSetSuperWave(int soundHash, int superwave); + +@JS('Module._setWaveform') +external void wasmSetWaveform(int soundHash, int newWaveform); + +@JS('Module._speechText') +external int wasmSpeechText(int textToSpeechPtr, int handlePtr); + +@JS('Module._pauseSwitch') +external void wasmPauseSwitch(int handle); + +@JS('Module._setPause') +external void wasmSetPause(int handle, int pause); + +@JS('Module._getPause') +external int wasmGetPause(int handle); + +@JS('Module._setRelativePlaySpeed') +external void wasmSetRelativePlaySpeed(int handle, double speed); + +@JS('Module._getRelativePlaySpeed') +external double wasmGetRelativePlaySpeed(int handle); + +@JS('Module._play') +external int wasmPlay( + int soundHash, + double volume, + double pan, + // ignore: avoid_positional_boolean_parameters + bool paused, + bool looping, + double loopingStartAt, + int handlePtr, +); + +@JS('Module._stop') +external void wasmStop(int handle); + +@JS('Module._disposeSound') +external void wasmDisposeSound(int soundHash); + +@JS('Module._disposeAllSound') +external void wasmDisposeAllSound(); + +@JS('Module._getLooping') +external int wasmGetLooping(int handle); + +@JS('Module._setLooping') +external void wasmSetLooping(int handle, int enable); + +@JS('Module._getLoopPoint') +external double wasmGetLoopPoint(int handle); + +@JS('Module._setLoopPoint') +external void wasmSetLoopPoint(int handle, double time); + +@JS('Module._setVisualizationEnabled') +external void wasmSetVisualizationEnabled(int enabled); + +@JS('Module._getVisualizationEnabled') +external int wasmGetVisualizationEnabled(); + +@JS('Module._getWave') +external void wasmGetWave(int samplesPtr); + +@JS('Module._getFft') +external void wasmGetFft(int samplesPtr); + +@JS('Module._setFftSmoothing') +external void wasmSetFftSmoothing(double smooth); + +@JS('Module._getCaptureFft') +external void wasmGetCaptureFft(int samplesPtr); + +@JS('Module._getCaptureWave') +external void wasmGetCaptureWave(int samplesPtr); + +@JS('Module._getAudioTexture') +external void wasmGetAudioTexture(int samplesPtr); + +@JS('Module._getAudioTexture2D') +external int wasmGetAudioTexture2D(int samplesPtr); + +@JS('Module._getTextureValue') +external double wasmGetTextureValue(int row, int column); + +@JS('Module._getCaptureTexture') +external void wasmGetCaptureAudioTexture(int samplesPtr); + +@JS('Module._getCaptureTextureValue') +external double wasmGetCaptureTextureValue(int row, int column); + +@JS('Module._getCaptureAudioTexture2D') +external int wasmGetCaptureAudioTexture2D(int samplesPtr); + +@JS('Module._setCaptureFftSmoothing') +external int wasmSetCaptureFftSmoothing(double smooth); + +@JS('Module._getLength') +external double wasmGetLength(int soundHash); + +@JS('Module._seek') +external int wasmSeek(int handle, double time); + +@JS('Module._getPosition') +external double wasmGetPosition(int handle); + +@JS('Module._getGlobalVolume') +external double wasmGetGlobalVolume(); + +@JS('Module._setGlobalVolume') +external int wasmSetGlobalVolume(double volume); + +@JS('Module._getVolume') +external double wasmGetVolume(int handle); + +@JS('Module._setVolume') +external int wasmSetVolume(int handle, double volume); + +@JS('Module._getPan') +external double wasmGetPan(int handle); + +@JS('Module._setPan') +external void wasmSetPan(int handle, double pan); + +@JS('Module._setPanAbsolute') +external void wasmSetPanAbsolute(int handle, double panLeft, double panRight); + +@JS('Module._getIsValidVoiceHandle') +external int wasmGetIsValidVoiceHandle(int handle); + +@JS('Module._getActiveVoiceCount') +external int wasmGetActiveVoiceCount(); + +@JS('Module._countAudioSource') +external int wasmCountAudioSource(int soundHash); + +@JS('Module._getVoiceCount') +external int wasmGetVoiceCount(); + +@JS('Module._getProtectVoice') +external int wasmGetProtectVoice(int handle); + +@JS('Module._setProtectVoice') +external void wasmSetProtectVoice(int handle, int protect); + +@JS('Module._getMaxActiveVoiceCount') +external int wasmGetMaxActiveVoiceCount(); + +@JS('Module._setMaxActiveVoiceCount') +external void wasmSetMaxActiveVoiceCount(int maxVoiceCount); + +@JS('Module._fadeGlobalVolume') +external int wasmFadeGlobalVolume(double to, double duration); + +@JS('Module._fadeVolume') +external int wasmFadeVolume(int handle, double to, double duration); + +@JS('Module._fadePan') +external int wasmFadePan(int handle, double to, double duration); + +@JS('Module._fadeRelativePlaySpeed') +external int wasmFadeRelativePlaySpeed(int handle, double to, double duration); + +@JS('Module._schedulePause') +external int wasmSchedulePause(int handle, double duration); + +@JS('Module._scheduleStop') +external int wasmScheduleStop(int handle, double duration); + +@JS('Module._oscillateVolume') +external int wasmOscillateVolume( + int handle, + double from, + double to, + double time, +); + +@JS('Module._oscillatePan') +external int wasmOscillatePan(int handle, double from, double to, double time); + +@JS('Module._oscillateRelativePlaySpeed') +external int wasmOscillateRelativePlaySpeed( + int handle, + double from, + double to, + double time, +); + +@JS('Module._oscillateGlobalVolume') +external int wasmOscillateGlobalVolume(double from, double to, double time); + +@JS('Module._isFilterActive') +external int wasmIsFilterActive(int filterType, int idPtr); + +@JS('Module._getFilterParamNames') +external int wasmGetFilterParamNames( + int filterType, + int paramsCountPtr, + int namesPtr, +); + +@JS('Module._addGlobalFilter') +external int wasmAddGlobalFilter(int filterType); + +@JS('Module._removeGlobalFilter') +external int wasmRemoveGlobalFilter(int filterType); + +@JS('Module._setFxParams') +external int wasmSetFxParams(int filterType, int attributeId, double value); + +@JS('Module._getFxParams') +external double wasmGetFxParams(int filterType, int attributeId); + +@JS('Module._play3d') +external int wasmPlay3d( + int soundHash, + double posX, + double posY, + double posZ, + double velX, + double velY, + double velZ, + double volume, + int paused, + int looping, + double loopingStartAt, + int handlePtr, +); + +@JS('Module._set3dSoundSpeed') +external void wasmSet3dSoundSpeed(double speed); + +@JS('Module._get3dSoundSpeed') +external double wasmGet3dSoundSpeed(); + +@JS('Module._set3dListenerParameters') +external void wasmSet3dListenerParameters( + double posX, + double posY, + double posZ, + double atX, + double atY, + double atZ, + double upX, + double upY, + double upZ, + double velocityX, + double velocityY, + double velocityZ, +); + +@JS('Module._set3dListenerPosition') +external void wasmSet3dListenerPosition(double posX, double posY, double posZ); + +@JS('Module._set3dListenerAt') +external void wasmSet3dListenerAt(double atX, double atY, double atZ); + +@JS('Module._set3dListenerUp') +external void wasmSet3dListenerUp(double upX, double upY, double upZ); + +@JS('Module._set3dListenerVelocity') +external void wasmSet3dListenerVelocity( + double velocityX, + double velocityY, + double velocityZ, +); + +@JS('Module._set3dSourceParameters') +external void wasmSet3dSourceParameters( + int handle, + double posX, + double posY, + double posZ, + double velocityX, + double velocityY, + double velocityZ, +); + +@JS('Module._set3dSourcePosition') +external void wasmSet3dSourcePosition( + int handle, + double posX, + double posY, + double posZ, +); + +@JS('Module._set3dSourceVelocity') +external void wasmSet3dSourceVelocity( + int handle, + double velocityX, + double velocityY, + double velocityZ, +); + +@JS('Module._set3dSourceMinMaxDistance') +external void wasmSet3dSourceMinMaxDistance( + int handle, + double minDistance, + double maxDistance, +); + +@JS('Module._set3dSourceAttenuation') +external void wasmSet3dSourceAttenuation( + int handle, + int attenuationModel, + double attenuationRolloffFactor, +); + +@JS('Module._set3dSourceDopplerFactor') +external void wasmSet3dSourceDopplerFactor(int handle, double dopplerFactor); + +// /////////////////////////// +// Capture +// /////////////////////////// +@JS('Module._listCaptureDevices') +external void wasmListCaptureDevices( + int namesPtr, + int isDefaultPtr, + int nDevicePtr, +); + +@JS('Module._freeListCaptureDevices') +external void wasmFreeListCaptureDevices( + int namesPtr, + int isDefaultPtr, + int nDevice, +); + +@JS('Module._initCapture') +external int wasmInitCapture(int deviceID); + +@JS('Module._disposeCapture') +external void wasmDisposeCapture(); + +@JS('Module._isCaptureInited') +external int wasmIsCaptureInited(); + +@JS('Module._isCaptureStarted') +external int wasmIsCaptureStarted(); + +@JS('Module._startCapture') +external int wasmStartCapture(); + +@JS('Module._stopCapture') +external int wasmStopCapture(); +// } diff --git a/lib/src/bindings/soloud_controller.dart b/lib/src/bindings/soloud_controller.dart index 033c4c5..f41e1be 100644 --- a/lib/src/bindings/soloud_controller.dart +++ b/lib/src/bindings/soloud_controller.dart @@ -1,39 +1,3 @@ -import 'dart:ffi' as ffi; -import 'dart:io'; - -import 'package:flutter_soloud/src/bindings/bindings_capture_ffi.dart'; -import 'package:flutter_soloud/src/bindings/bindings_player_ffi.dart'; - -/// Controller that expose method channel and FFI -class SoLoudController { - /// - factory SoLoudController() => _instance ??= SoLoudController._(); - - SoLoudController._() { - initialize(); - } - - static SoLoudController? _instance; - - /// - late ffi.DynamicLibrary nativeLib; - - /// - late final FlutterSoLoudFfi soLoudFFI; - - /// - late final FlutterCaptureFfi captureFFI; - - /// - void initialize() { - nativeLib = Platform.isLinux - ? ffi.DynamicLibrary.open('libflutter_soloud_plugin.so') - : (Platform.isAndroid - ? ffi.DynamicLibrary.open('libflutter_soloud_plugin.so') - : (Platform.isWindows - ? ffi.DynamicLibrary.open('flutter_soloud_plugin.dll') - : ffi.DynamicLibrary.process())); - soLoudFFI = FlutterSoLoudFfi.fromLookup(nativeLib.lookup); - captureFFI = FlutterCaptureFfi.fromLookup(nativeLib.lookup); - } -} +export 'package:flutter_soloud/src/bindings/soloud_controller_ffi.dart' + if (dart.library.html) 'package:flutter_soloud/src/bindings/soloud_controller_web.dart'; + \ No newline at end of file diff --git a/lib/src/bindings/soloud_controller_ffi.dart b/lib/src/bindings/soloud_controller_ffi.dart new file mode 100644 index 0000000..9038f25 --- /dev/null +++ b/lib/src/bindings/soloud_controller_ffi.dart @@ -0,0 +1,32 @@ +import 'dart:ffi' as ffi; +import 'dart:io'; + +import 'bindings_capture_ffi.dart'; +import 'bindings_player_ffi.dart'; + +/// Controller that expose method channel and FFI +class SoLoudController { + factory SoLoudController() => _instance ??= SoLoudController._(); + + SoLoudController._() { + /// Initialize lib + nativeLib = Platform.isLinux + ? ffi.DynamicLibrary.open('libflutter_soloud_plugin.so') + : (Platform.isAndroid + ? ffi.DynamicLibrary.open('libflutter_soloud_plugin.so') + : (Platform.isWindows + ? ffi.DynamicLibrary.open('flutter_soloud_plugin.dll') + : ffi.DynamicLibrary.process())); + soLoudFFI = FlutterSoLoudFfi.fromLookup(nativeLib.lookup); + captureFFI = FlutterCaptureFfi.fromLookup(nativeLib.lookup); + } + + static SoLoudController? _instance; + + late ffi.DynamicLibrary nativeLib; + + late final FlutterSoLoudFfi soLoudFFI; + + late final FlutterCaptureFfi captureFFI; + +} diff --git a/lib/src/bindings/soloud_controller_web.dart b/lib/src/bindings/soloud_controller_web.dart new file mode 100644 index 0000000..1a29b96 --- /dev/null +++ b/lib/src/bindings/soloud_controller_web.dart @@ -0,0 +1,20 @@ +import 'package:flutter_soloud/src/bindings/bindings_capture_web.dart'; + +import 'bindings_player_web.dart'; + +/// Controller that expose method channel and FFI +class SoLoudController { + factory SoLoudController() => _instance ??= SoLoudController._(); + + SoLoudController._(); + + static SoLoudController? _instance; + + final FlutterSoLoudWeb _soLoudFFI = FlutterSoLoudWeb(); + + FlutterSoLoudWeb get soLoudFFI => _soLoudFFI; + + final FlutterCaptureWeb _captureFFI = FlutterCaptureWeb(); + + FlutterCaptureWeb get captureFFI => _captureFFI; +} diff --git a/lib/src/enums.dart b/lib/src/enums.dart index 884ae39..e433c9a 100644 --- a/lib/src/enums.dart +++ b/lib/src/enums.dart @@ -24,6 +24,10 @@ enum CaptureErrors { /// Capture not yet initialized captureNotInited, + /// null pointer. Could happens when passing a non initialized + /// pointer (with calloc()) to retrieve FFT or wave data + failedToStartDevice, + /// null pointer. Could happens when passing a non initialized /// pointer (with calloc()) to retrieve FFT or wave data nullPointer; @@ -37,10 +41,11 @@ enum CaptureErrors { return 'Capture failed to initialize'; case CaptureErrors.captureNotInited: return 'Capture not yet initialized'; + case CaptureErrors.failedToStartDevice: + return 'Failed to start capture device.'; case CaptureErrors.nullPointer: return 'Capture null pointer error. Could happens when passing a non ' - 'initialized pointer (with calloc()) to retrieve FFT or wave data. ' - 'Or, setVisualization has not been enabled.'; + 'initialized pointer (with calloc()) to retrieve FFT or wave data.'; } } diff --git a/lib/src/enums.dart.orig b/lib/src/enums.dart.orig new file mode 100644 index 0000000..e433c9a --- /dev/null +++ b/lib/src/enums.dart.orig @@ -0,0 +1,235 @@ +import 'package:meta/meta.dart'; + +/// CaptureDevice exposed to Dart +final class CaptureDevice { + /// Constructs a new [CaptureDevice]. + // ignore: avoid_positional_boolean_parameters + const CaptureDevice(this.name, this.isDefault); + + /// The name of the device. + final String name; + + /// Whether this is the default capture device. + final bool isDefault; +} + +/// Possible capture errors +enum CaptureErrors { + /// No error + captureNoError, + + /// Capture failed to initialize + captureInitFailed, + + /// Capture not yet initialized + captureNotInited, + + /// null pointer. Could happens when passing a non initialized + /// pointer (with calloc()) to retrieve FFT or wave data + failedToStartDevice, + + /// null pointer. Could happens when passing a non initialized + /// pointer (with calloc()) to retrieve FFT or wave data + nullPointer; + + /// Returns a human-friendly sentence describing the error. + String get _asSentence { + switch (this) { + case CaptureErrors.captureNoError: + return 'No error'; + case CaptureErrors.captureInitFailed: + return 'Capture failed to initialize'; + case CaptureErrors.captureNotInited: + return 'Capture not yet initialized'; + case CaptureErrors.failedToStartDevice: + return 'Failed to start capture device.'; + case CaptureErrors.nullPointer: + return 'Capture null pointer error. Could happens when passing a non ' + 'initialized pointer (with calloc()) to retrieve FFT or wave data.'; + } + } + + @override + String toString() => 'CaptureErrors.$name ($_asSentence)'; +} + +/// Possible player errors. +/// New values must be enumerated at the bottom +/// +/// WARNING: Keep these in sync with `src/enums.h`. +@internal +enum PlayerErrors { + /// No error + noError(0), + + /// Some parameter is invalid + invalidParameter(1), + + /// File not found + fileNotFound(2), + + /// File found, but could not be loaded + fileLoadFailed(3), + + /// The sound file has already been loaded + fileAlreadyLoaded(4), + + /// DLL not found, or wrong DLL + dllNotFound(5), + + /// Out of memory + outOfMemory(6), + + /// Feature not implemented + notImplemented(7), + + /// Other error + unknownError(8), + + /// null pointer. Could happens when passing a non initialized + /// pointer (with calloc()) to retrieve FFT or wave data + nullPointer(9), + + /// The sound with specified hash is not found + soundHashNotFound(10), + + /// Player not initialized + backendNotInited(11), + + /// Filter not found + filterNotFound(12), + + /// asking for wave and FFT is not enabled + visualizationNotEnabled(13), + + /// The maximum number of filters has been reached (default is 8). + maxNumberOfFiltersReached(14), + + /// The filter has already been added. + filterAlreadyAdded(15), + + /// Player already inited. + playerAlreadyInited(16), + + /// Audio handle is not found + soundHandleNotFound(17); + + const PlayerErrors(this.value); + + /// The integer value of the error. This is the same number that is returned + /// from the C++ API. + final int value; + + /// Returns a human-friendly sentence describing the error. + String get _asSentence { + switch (this) { + case PlayerErrors.noError: + return 'No error'; + case PlayerErrors.invalidParameter: + return 'Some parameters are invalid!'; + case PlayerErrors.fileNotFound: + return 'File not found!'; + case PlayerErrors.fileLoadFailed: + return 'File found, but could not be loaded!'; + case PlayerErrors.fileAlreadyLoaded: + return 'The sound file has already been loaded!'; + case PlayerErrors.dllNotFound: + return 'DLL not found, or wrong DLL!'; + case PlayerErrors.outOfMemory: + return 'Out of memory!'; + case PlayerErrors.notImplemented: + return 'Feature not implemented!'; + case PlayerErrors.unknownError: + return 'Unknown error!'; + case PlayerErrors.nullPointer: + return 'Capture null pointer error. Could happens when passing a non ' + 'initialized pointer (with calloc()) to retrieve FFT or wave data. ' + 'Or, setVisualization has not been enabled.'; + case PlayerErrors.soundHashNotFound: + return 'The sound with specified hash is not found!'; + case PlayerErrors.backendNotInited: + return 'Player not initialized!'; + case PlayerErrors.filterNotFound: + return 'Filter not found!'; + case PlayerErrors.visualizationNotEnabled: + return 'Asking for audio data is not enabled! Please use ' + '`setVisualizationEnabled(true);` to enable!'; + case PlayerErrors.maxNumberOfFiltersReached: + return 'The maximum number of filters has been reached (default is 8)!'; + case PlayerErrors.filterAlreadyAdded: + return 'Filter not found!'; + case PlayerErrors.playerAlreadyInited: + return 'The player has already been inited!'; + case PlayerErrors.soundHandleNotFound: + return 'The handle is not found! The playing handle could have been ' + 'stopped or ended and it is no more valid!'; + } + } + + @override + String toString() => 'PlayerErrors.$name ($_asSentence)'; +} + +/// The types of waveforms. +enum WaveForm { + /// Raw, harsh square wave. + square, + + /// Raw, harsh saw wave. + saw, + + /// Sine wave. + sin, + + /// Triangle wave. + triangle, + + /// Bounce, i.e, abs(sin()). + bounce, + + /// Quarter sine wave, rest of period quiet. + jaws, + + /// Half sine wave, rest of period quiet. + humps, + + /// "Fourier" square wave; less noisy. + fSquare, + + /// "Fourier" saw wave; less noisy. + fSaw, +} + +/// The way an audio file is loaded. +enum LoadMode { + /// Load and decompress the audio file into RAM. + /// Less CPU, more memory allocated, low latency. + memory, + + /// Keep the file on disk and only load chunks as needed. + /// More CPU, less memory allocated, seeking lags with MP3s. + disk, +} + +/// Audio state changes. Not doing much now. Notifications should work +/// on iOS but none of the Android backends will report this notification. +/// However the started and stopped events should be reliable for all backends. +enum PlayerStateNotification { + /// + started, + + /// + stopped, + + /// + rerouted, + + /// + interruptionBegan, + + /// + interruptionEnded, + + /// + unlocked, +} diff --git a/lib/src/exceptions/exceptions.dart b/lib/src/exceptions/exceptions.dart index e4e1afc..33767c6 100644 --- a/lib/src/exceptions/exceptions.dart +++ b/lib/src/exceptions/exceptions.dart @@ -103,4 +103,28 @@ abstract class SoLoudCppException extends SoLoudException { return const SoLoudSoundHandleNotFoundCppException(); } } + + /// Takes a [CaptureErrors] enum value and returns a corresponding exception. + /// This is useful when we need to convert a C++ error to a Dart exception. + /// + /// If [error] is "CaptureErrors.noError", this constructor throws + /// an [ArgumentError]. + factory SoLoudCppException.fromCaptureError(CaptureErrors error) { + switch (error) { + case CaptureErrors.captureNoError: + throw ArgumentError( + 'Trying to create an exception from CaptureErrors.noError. ' + 'This is a bug in the library. Please report it.', + 'error', + ); + case CaptureErrors.captureInitFailed: + return const SoLoudCaptureInitFailedException(); + case CaptureErrors.captureNotInited: + return const SoLoudCaptureNotYetInitializededException(); + case CaptureErrors.failedToStartDevice: + return const SoLoudCaptureFailedToStartException(); + case CaptureErrors.nullPointer: + return const SoLoudCaptureNullPointerException(); + } + } } diff --git a/lib/src/exceptions/exceptions_from_cpp.dart b/lib/src/exceptions/exceptions_from_cpp.dart index e3afed8..f9274c4 100644 --- a/lib/src/exceptions/exceptions_from_cpp.dart +++ b/lib/src/exceptions/exceptions_from_cpp.dart @@ -1,8 +1,8 @@ part of 'exceptions.dart'; -// /////////////////////// -// / C++-side exceptions / -// /////////////////////// +// ////////////////////////////////////// +// / C++-side exceptions for the player / +// ////////////////////////////////////// /// An exception that is thrown when an invalid parameter was passed /// to SoLoud (C++). @@ -175,3 +175,51 @@ class SoLoudSoundHandleNotFoundCppException extends SoLoudCppException { String get description => 'The sound handle is not found ' '(on the C++ side).'; } + +// /////////////////////////////// +// / C++-side exceptions capture / +// /////////////////////////////// + +/// An exception that is thrown when SoLoud (C++) cannot initialize +/// a capture device. +class SoLoudCaptureInitFailedException extends SoLoudCppException { + /// Creates a new [SoLoudCaptureInitFailedException]. + const SoLoudCaptureInitFailedException([super.message]); + + @override + String get description => 'The capture device has failed to initialize ' + '(on the C++ side).'; +} + +/// An exception that is thrown when SoLoud (C++) has not yet been initialized +/// and the operation asked to perform cannot be performed. +class SoLoudCaptureNotYetInitializededException extends SoLoudCppException { + /// Creates a new [SoLoudCaptureNotYetInitializededException]. + const SoLoudCaptureNotYetInitializededException([super.message]); + + @override + String get description => 'The capture device has not yet been initialized ' + '(on the C++ side).'; +} + +/// An exception that is thrown when SoLoud (C++) when the start device +/// task gives problems. +class SoLoudCaptureFailedToStartException extends SoLoudCppException { + /// Creates a new [SoLoudCaptureFailedToStartException]. + const SoLoudCaptureFailedToStartException([super.message]); + + @override + String get description => 'The capture device failed to start ' + '(on the C++ side).'; +} + +/// Capture null pointer error. Could happens when passing a non initialized +/// pointer (with calloc()) to retrieve FFT or wave data. +class SoLoudCaptureNullPointerException extends SoLoudCppException { + /// Creates a new [SoLoudCaptureNullPointerException]. + const SoLoudCaptureNullPointerException([super.message]); + @override + String get description => 'Capture null pointer error. Could happens ' + 'when passing a non initialized pointer (with calloc()) to retrieve ' + 'FFT or wave data (on the C++ side).'; +} diff --git a/lib/src/soloud.dart b/lib/src/soloud.dart index 03fbd06..a1b186b 100644 --- a/lib/src/soloud.dart +++ b/lib/src/soloud.dart @@ -1,7 +1,6 @@ // ignore_for_file: require_trailing_commas, avoid_positional_boolean_parameters import 'dart:async'; -import 'dart:ffi' as ffi; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -9,11 +8,11 @@ import 'package:flutter_soloud/src/audio_source.dart'; import 'package:flutter_soloud/src/enums.dart'; import 'package:flutter_soloud/src/exceptions/exceptions.dart'; import 'package:flutter_soloud/src/filter_params.dart'; -import 'package:flutter_soloud/src/soloud_capture.dart'; import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; import 'package:flutter_soloud/src/sound_handle.dart'; import 'package:flutter_soloud/src/sound_hash.dart'; import 'package:flutter_soloud/src/utils/loader.dart'; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; @@ -31,6 +30,8 @@ interface class SoLoud { static final Logger _log = Logger('flutter_soloud.SoLoud'); + final _controller = SoLoudController(); + /// The singleton instance of [SoLoud]. Only one SoLoud instance /// can exist in C++ land, so – for consistency and to avoid confusion /// – only one instance can exist in Dart land. @@ -101,10 +102,10 @@ interface class SoLoud { /// Use [isInitialized] only if you want to check the current status of /// the engine synchronously and you don't care that it might be ready soon. // TODO(filip): related to `get initialized`. This line below is the old one. - // bool get isInitialized => _isInitialized; + bool get isInitialized => _isInitialized; // TODO(filip): this line below is the new one I leaved to let the /// plugin to work. - bool get isInitialized => SoLoudController().soLoudFFI.isInited(); + // bool get isInitialized => _controller.soLoudFFI.isInited(); /// The completer for an initialization in progress. /// @@ -231,9 +232,11 @@ interface class SoLoud { // Initialize native callbacks _initializeNativeCallbacks(); - final error = SoLoudController().soLoudFFI.initEngine(); + final error = _controller.soLoudFFI.initEngine(); _logPlayerError(error, from: 'initialize() result'); if (error == PlayerErrors.noError) { + _isInitialized = true; + /// get the visualization flag from the player on C side. /// Eventually we can set this as a parameter during the /// initialization with some other parameters like `sampleRate` @@ -243,7 +246,8 @@ interface class SoLoud { _loader.automaticCleanup = automaticCleanup; // TODO(filip): The Loader is not compatible with web! - await _loader.initialize(); + // Commenting this temporarly! + // await _loader.initialize(); } else { _log.severe('initialize() failed with error: $error'); } @@ -257,8 +261,9 @@ interface class SoLoud { void deinit() { _log.finest('deinit() called'); - SoLoudController().soLoudFFI.disposeAllSound(); - SoLoudController().soLoudFFI.deinit(); + _isInitialized = false; + _controller.soLoudFFI.disposeAllSound(); + _controller.soLoudFFI.deinit(); _activeSounds.clear(); } @@ -275,8 +280,8 @@ interface class SoLoud { /// when they are stopped/ended from anywhere or when a file has been loaded. /// /// Currently available: - /// - [SoLoudController().soLoudFFI.voiceEndedEvents] - /// - [SoLoudController().soLoudFFI.fileLoadedEvents] + /// - [_controller.soLoudFFI.voiceEndedEvents] + /// - [_controller.soLoudFFI.fileLoadedEvents] /// /// These events are coming from `FlutterSoLoudFfi`. The callbacks /// `_voiceEndedCallback` and `_fileLoadedCallback` are called from CPP. @@ -286,11 +291,11 @@ interface class SoLoud { // to manage then only once. void _initializeNativeCallbacks() { // Initialize callbacks. - SoLoudController().soLoudFFI.setDartEventCallbacks(); + _controller.soLoudFFI.setDartEventCallbacks(); // Listen when a handle becomes invalid becaus has been stopped/ended - if (!SoLoudController().soLoudFFI.voiceEndedEventController.hasListener) { - SoLoudController().soLoudFFI.voiceEndedEvents.listen((handle) { + if (!_controller.soLoudFFI.voiceEndedEventController.hasListener) { + _controller.soLoudFFI.voiceEndedEvents.listen((handle) { // Remove this UNIQUE [handle] from the `AudioSource` that own it. final soundHandleFound = _isHandlePresent(SoundHandle(handle)); @@ -318,8 +323,8 @@ interface class SoLoud { } // Listen when a file has been loaded - if (!SoLoudController().soLoudFFI.fileLoadedEventsController.hasListener) { - SoLoudController().soLoudFFI.fileLoadedEvents.listen((result) { + if (!_controller.soLoudFFI.fileLoadedEventsController.hasListener) { + _controller.soLoudFFI.fileLoadedEvents.listen((result) { final exists = loadedFileCompleters.containsKey(result['completeFileName']); if (exists) { @@ -363,8 +368,8 @@ interface class SoLoud { // This doesn't work on Android. See "ma_device_notification_proc" // in miniaudio.h. Only `started` and `stopped` are working. // Leaving this commented out for futher investigation. - // if (!SoLoudController().soLoudFFI.stateChangedController.hasListener) { - // SoLoudController().soLoudFFI.stateChangedEvents.listen((newState) { + // if (!_controller.soLoudFFI.stateChangedController.hasListener) { + // _controller.soLoudFFI.stateChangedEvents.listen((newState) { // _log.fine(() => 'Audio engine state changed: $newState'); // }); // } @@ -401,7 +406,7 @@ interface class SoLoud { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.loadFile(path, mode); + _controller.soLoudFFI.loadFile(path, mode); final completer = Completer(); loadedFileCompleters.addAll({ @@ -424,6 +429,8 @@ interface class SoLoud { /// /// It is useful when using this plugin on the web browsers because /// they cannot read directly files in the loal storage. + /// + /// Throws [SoLoudNotInitializedException] if the engine is not initialized. Future loadMem( String path, Uint8List buffer, @@ -437,12 +444,12 @@ interface class SoLoud { path: completer, }); - final ret = SoLoudController().soLoudFFI.loadMem(path, buffer); + final ret = _controller.soLoudFFI.loadMem(path, buffer); /// There is not a callback in cpp that is supposed to add the /// "load file event". Manually send this event to have only one /// place to do this "loaded" job. - SoLoudController().soLoudFFI.fileLoadedEventsController.add({ + _controller.soLoudFFI.fileLoadedEventsController.add({ 'error': ret.error.index, 'completeFileName': path, 'hash': ret.soundHash.hash, @@ -482,9 +489,14 @@ interface class SoLoud { throw const SoLoudNotInitializedException(); } - final file = await _loader.loadAsset(key, assetBundle: assetBundle); + // if (kIsWeb) { + final bytes = + await _loader.loadAsset(key, assetBundle: assetBundle) as Uint8List; + return loadMem(key, bytes); + // } - return loadFile(file.absolute.path, mode: mode); + // final file = await _loader.loadAsset(key, assetBundle: assetBundle); + // return loadFile(file.absolute.path, mode: mode); } /// Load a new sound to be played once or multiple times later, from @@ -520,9 +532,13 @@ interface class SoLoud { throw const SoLoudNotInitializedException(); } - final file = await _loader.loadUrl(url, httpClient: httpClient); + // if (kIsWeb) { + final bytes = await _loader.loadUrl(url) as Uint8List; + return loadMem(url, bytes); + // } - return loadFile(file.absolute.path, mode: mode); + // final file = await _loader.loadUrl(url, httpClient: httpClient); + // return loadFile(file.absolute.path, mode: mode); } /// Load a new waveform to be played once or multiple times later. @@ -545,12 +561,12 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.loadWaveform( - waveform, - superWave, - scale, - detune, - ); + final ret = _controller.soLoudFFI.loadWaveform( + waveform, + superWave, + scale, + detune, + ); if (ret.error == PlayerErrors.noError) { final newSound = AudioSource(ret.soundHash); @@ -571,7 +587,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setWaveform(sound.soundHash, newWaveform); + _controller.soLoudFFI.setWaveform(sound.soundHash, newWaveform); } /// If this sound is a `superWave` you can change the scale at runtime. @@ -584,7 +600,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setWaveformScale(sound.soundHash, newScale); + _controller.soLoudFFI.setWaveformScale(sound.soundHash, newScale); } /// If this sound is a `superWave` you can change the detune at runtime. @@ -597,7 +613,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setWaveformDetune(sound.soundHash, newDetune); + _controller.soLoudFFI.setWaveformDetune(sound.soundHash, newDetune); } /// Set the frequency of the given waveform sound. @@ -610,7 +626,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setWaveformFreq(sound.soundHash, newFrequency); + _controller.soLoudFFI.setWaveformFreq(sound.soundHash, newFrequency); } /// Set the given waveform sound's super wave flag. @@ -623,10 +639,10 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setWaveformSuperWave( - sound.soundHash, - superwave ? 1 : 0, - ); + _controller.soLoudFFI.setWaveformSuperWave( + sound.soundHash, + superwave ? 1 : 0, + ); } /// Create a new audio source from the given [textToSpeech]. @@ -638,7 +654,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.speechText(textToSpeech); + final ret = _controller.soLoudFFI.speechText(textToSpeech); _logPlayerError(ret.error, from: 'speechText() result'); if (ret.error == PlayerErrors.noError) { @@ -684,14 +700,14 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.play( - sound.soundHash, - volume: volume, - pan: pan, - paused: paused, - looping: looping, - loopingStartAt: loopingStartAt, - ); + final ret = _controller.soLoudFFI.play( + sound.soundHash, + volume: volume, + pan: pan, + paused: paused, + looping: looping, + loopingStartAt: loopingStartAt, + ); _logPlayerError(ret.error, from: 'play()'); if (ret.error != PlayerErrors.noError) { throw SoLoudCppException.fromPlayerError(ret.error); @@ -719,7 +735,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.pauseSwitch(handle); + _controller.soLoudFFI.pauseSwitch(handle); } /// Pause or unpause a currently playing sound identified by [handle]. @@ -729,7 +745,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setPause(handle, pause ? 1 : 0); + _controller.soLoudFFI.setPause(handle, pause ? 1 : 0); } /// Gets the pause state of a currently playing sound identified by [handle]. @@ -739,7 +755,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getPause(handle); + return _controller.soLoudFFI.getPause(handle); } /// Set a sound's relative play speed. @@ -748,7 +764,7 @@ interface class SoLoud { /// and the new [speed]. /// /// Setting the speed value to `0` will cause undefined behavior, - /// likely a crash. The lower limit is clamped to be >=0.05 silently. + /// likely a crash. The lower limit is clamped to 0.05 silently. /// /// This changes the effective sample rate /// while leaving the base sample rate alone. @@ -762,7 +778,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setRelativePlaySpeed(handle, speed); + _controller.soLoudFFI.setRelativePlaySpeed(handle, speed); } /// Get a sound's relative play speed. Provide the sound instance via @@ -773,7 +789,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getRelativePlaySpeed(handle); + return _controller.soLoudFFI.getRelativePlaySpeed(handle); } /// Stop a currently playing sound identified by [handle] @@ -789,7 +805,7 @@ interface class SoLoud { final completer = Completer(); voiceEndedCompleters[handle] = completer; - SoLoudController().soLoudFFI.stop(handle); + _controller.soLoudFFI.stop(handle); return completer.future .timeout(const Duration(milliseconds: 300)) @@ -813,7 +829,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.disposeSound(source.soundHash); + _controller.soLoudFFI.disposeSound(source.soundHash); source.soundEventsController.add(( event: SoundEventType.soundDisposed, @@ -840,7 +856,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.disposeAllSound(); + _controller.soLoudFFI.disposeAllSound(); for (final sound in _activeSounds) { sound.soundEventsController.add(( @@ -865,7 +881,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getLooping(handle); + return _controller.soLoudFFI.getLooping(handle); } /// Set the looping flag of a currently playing sound, provided via @@ -876,7 +892,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setLooping(handle, enable); + _controller.soLoudFFI.setLooping(handle, enable); } /// Get the loop point value of a currently playing sound, provided via @@ -889,7 +905,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getLoopPoint(handle); + return _controller.soLoudFFI.getLoopPoint(handle); } /// Set the loop point of a currently playing sound, provided via @@ -902,7 +918,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setLoopPoint(handle, time); + _controller.soLoudFFI.setLoopPoint(handle, time); } /// Enable or disable visualization. @@ -916,7 +932,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setVisualizationEnabled(enabled); + _controller.soLoudFFI.setVisualizationEnabled(enabled); _isVisualizationEnabled = enabled; } @@ -929,7 +945,8 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getVisualizationEnabled(); + _isVisualizationEnabled = _controller.soLoudFFI.getVisualizationEnabled(); + return _isVisualizationEnabled; } /// Get the length of a loaded audio [source]. @@ -941,7 +958,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getLength(source.soundHash); + return _controller.soLoudFFI.getLength(source.soundHash); } /// Seek a currently playing sound instance, provided via its [handle]. @@ -969,7 +986,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.seek(handle, time); + final ret = _controller.soLoudFFI.seek(handle, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'seek(): $error'); @@ -989,7 +1006,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getPosition(handle); + return _controller.soLoudFFI.getPosition(handle); } /// Gets the current global volume. @@ -998,17 +1015,11 @@ interface class SoLoud { /// and `1.0` meaning full volume. /// /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setGlobalVolume()` to `0.8` and then - /// `getGlobalVolume()`, you might get a slightly different number, - /// such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. double getGlobalVolume() { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getGlobalVolume(); + return _controller.soLoudFFI.getGlobalVolume(); } /// Sets the global volume which affects all sounds. @@ -1017,17 +1028,11 @@ interface class SoLoud { /// to `1.0` (meaning full volume). /// /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setGlobalVolume()` to `0.8` and then - /// `getGlobalVolume()`, you might get a slightly different number, - /// such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. void setGlobalVolume(double volume) { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.setGlobalVolume(volume); + final ret = _controller.soLoudFFI.setGlobalVolume(volume); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'setGlobalVolume(): $error'); @@ -1042,16 +1047,11 @@ interface class SoLoud { /// and `1.0` means its playing at full volume. /// /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setVolume()` to `0.8` and then `getVolume()`, you might - /// get a slightly different number, such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. double getVolume(SoundHandle handle) { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getVolume(handle); + return _controller.soLoudFFI.getVolume(handle); } /// Set the volume for a currently playing sound instance, provided @@ -1061,85 +1061,11 @@ interface class SoLoud { /// to `1.0` (meaning it should play at full volume). /// /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setVolume()` to `0.8` and then `getVolume()`, you might - /// get a slightly different number, such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. void setVolume(SoundHandle handle, double volume) { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setVolume(handle, volume); - } - - /// Get a sound's current pan setting. - /// - /// [handle] the sound handle. - /// Returns the range of the pan values is -1 to 1, where -1 is left, 0 is - /// middle and and 1 is right. - /// - /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setPan()` to `0.8` and then `getPan()`, you might - /// get a slightly different number, such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. - double getPan(SoundHandle handle) { - if (!isInitialized) { - throw const SoLoudNotInitializedException(); - } - return SoLoudController().soLoudFFI.getPan(handle.id); - } - - /// Set a sound's current pan setting. - /// - /// [handle] the sound handle. - /// [pan] the range of the pan values is -1 to 1, where -1 is left, 0 is - /// middle and and 1 is right. - /// - /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - /// - /// Note that if you `setPan()` to `0.8` and then `getPan()`, you might - /// get a slightly different number, such as `0.800000042353`. - /// This is expected since the internal audio engine uses float - /// instead of double, and so there are rounding errors. - void setPan(SoundHandle handle, double pan) { - if (!isInitialized) { - throw const SoLoudNotInitializedException(); - } - assert( - pan >= -1 && pan <= 1, - 'The pan argument must be in range -1 to 1 inclusive!', - ); - return SoLoudController().soLoudFFI.setPan(handle.id, pan.clamp(-1, 1)); - } - - /// Set the left/right volumes directly. - /// Note that this does not affect the value returned by getPan. - /// - /// [handle] the sound handle. - /// [panLeft] value for the left pan. Must be >= -1 and <= 1. - /// [panRight] value for the right pan. Must be >= -1 and <= 1. - /// - /// Throws [SoLoudNotInitializedException] if the engine is not initialized. - void setPanAbsolute(SoundHandle handle, double panLeft, double panRight) { - if (!isInitialized) { - throw const SoLoudNotInitializedException(); - } - assert( - panLeft >= -1 && panLeft <= 1, - 'The panLeft argument must be in range -1 to 1 inclusive!', - ); - assert( - panRight >= -1 && panRight <= 1, - 'The panRight argument must be in range -1 to 1 inclusive!', - ); - return SoLoudController().soLoudFFI.setPanAbsolute( - handle.id, - panLeft.clamp(-1, 1), - panRight.clamp(-1, 1), - ); + _controller.soLoudFFI.setVolume(handle, volume); } /// Check if the [handle] is still valid. @@ -1153,7 +1079,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getIsValidVoiceHandle(handle); + return _controller.soLoudFFI.getIsValidVoiceHandle(handle); } /// Returns the number of concurrent sounds that are playing at the moment. @@ -1161,7 +1087,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getActiveVoiceCount(); + return _controller.soLoudFFI.getActiveVoiceCount(); } /// Returns the number of concurrent sounds that are playing a @@ -1170,7 +1096,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.countAudioSource(audioSource.soundHash); + return _controller.soLoudFFI.countAudioSource(audioSource.soundHash); } /// Returns the number of voices the application has told SoLoud to play. @@ -1178,7 +1104,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getVoiceCount(); + return _controller.soLoudFFI.getVoiceCount(); } /// Get a sound's protection state. @@ -1188,7 +1114,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getProtectVoice(handle); + return _controller.soLoudFFI.getProtectVoice(handle); } /// Sets a sound instance's protection state. @@ -1218,7 +1144,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setProtectVoice(handle, protect); + _controller.soLoudFFI.setProtectVoice(handle, protect); } /// Gets the current maximum active voice count. @@ -1226,7 +1152,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - return SoLoudController().soLoudFFI.getMaxActiveVoiceCount(); + return _controller.soLoudFFI.getMaxActiveVoiceCount(); } /// Sets the current maximum active voice count. @@ -1247,7 +1173,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setMaxActiveVoiceCount(maxVoiceCount); + _controller.soLoudFFI.setMaxActiveVoiceCount(maxVoiceCount); } /// Return a floats matrix of 256x512. @@ -1271,21 +1197,19 @@ interface class SoLoud { /// [GitHub](https://github.com/alnitak/flutter_soloud/issues) providing /// a simple working example. @experimental - void getAudioTexture2D(ffi.Pointer> audioData) { - if (!isInitialized || audioData == ffi.nullptr) { + @Deprecated('Please use AudioData class instead.') + void getAudioTexture2D(AudioData audioData) { + if (!isInitialized) { throw const SoLoudNotInitializedException(); } if (!_isVisualizationEnabled) { throw const SoLoudVisualizationNotEnabledException(); } - final error = SoLoudController().soLoudFFI.getAudioTexture2D(audioData); + final error = _controller.soLoudFFI.getAudioTexture2D(audioData); _logPlayerError(error, from: 'getAudioTexture2D() result'); if (error != PlayerErrors.noError) { throw SoLoudCppException.fromPlayerError(error); } - if (audioData.value == ffi.nullptr) { - throw const SoLoudNullPointerException(); - } } /// Smooth FFT data. @@ -1305,7 +1229,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - SoLoudController().soLoudFFI.setFftSmoothing(smooth); + _controller.soLoudFFI.setFftSmoothing(smooth); } // /////////////////////////////////////// @@ -1320,7 +1244,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.fadeGlobalVolume(to, time); + final ret = _controller.soLoudFFI.fadeGlobalVolume(to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'fadeGlobalVolume(): $error'); @@ -1338,7 +1262,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.fadeVolume(handle, to, time); + final ret = _controller.soLoudFFI.fadeVolume(handle, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'fadeVolume(): $error'); @@ -1356,7 +1280,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.fadePan(handle, to, time); + final ret = _controller.soLoudFFI.fadePan(handle, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'fadePan(): $error'); @@ -1374,8 +1298,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = - SoLoudController().soLoudFFI.fadeRelativePlaySpeed(handle, to, time); + final ret = _controller.soLoudFFI.fadeRelativePlaySpeed(handle, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'fadeRelativePlaySpeed(): $error'); @@ -1392,7 +1315,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.schedulePause(handle, time); + final ret = _controller.soLoudFFI.schedulePause(handle, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'schedulePause(): $error'); @@ -1409,7 +1332,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.scheduleStop(handle, time); + final ret = _controller.soLoudFFI.scheduleStop(handle, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'scheduleStop(): $error'); @@ -1431,8 +1354,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = - SoLoudController().soLoudFFI.oscillateVolume(handle, from, to, time); + final ret = _controller.soLoudFFI.oscillateVolume(handle, from, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'oscillateVolume(): $error'); @@ -1453,8 +1375,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = - SoLoudController().soLoudFFI.oscillatePan(handle, from, to, time); + final ret = _controller.soLoudFFI.oscillatePan(handle, from, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'oscillatePan(): $error'); @@ -1476,8 +1397,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController() - .soLoudFFI + final ret = _controller.soLoudFFI .oscillateRelativePlaySpeed(handle, from, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { @@ -1497,8 +1417,7 @@ interface class SoLoud { if (!isInitialized) { throw const SoLoudNotInitializedException(); } - final ret = - SoLoudController().soLoudFFI.oscillateGlobalVolume(from, to, time); + final ret = _controller.soLoudFFI.oscillateGlobalVolume(from, to, time); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'oscillateGlobalVolume(): $error'); @@ -1515,7 +1434,7 @@ interface class SoLoud { /// Returns `-1` if the filter is not active. Otherwise, returns /// the index of the given filter. int isFilterActive(FilterType filterType) { - final ret = SoLoudController().soLoudFFI.isFilterActive(filterType.index); + final ret = _controller.soLoudFFI.isFilterActive(filterType.index); if (ret.error != PlayerErrors.noError) { _log.severe(() => 'isFilterActive(): ${ret.error}'); throw SoLoudCppException.fromPlayerError(ret.error); @@ -1529,8 +1448,7 @@ interface class SoLoud { /// /// Returns the list of param names. List getFilterParamNames(FilterType filterType) { - final ret = - SoLoudController().soLoudFFI.getFilterParamNames(filterType.index); + final ret = _controller.soLoudFFI.getFilterParamNames(filterType.index); if (ret.error != PlayerErrors.noError) { _log.severe(() => 'getFilterParamNames(): ${ret.error}'); throw SoLoudCppException.fromPlayerError(ret.error); @@ -1545,7 +1463,7 @@ interface class SoLoud { /// Throws [SoLoudFilterAlreadyAddedException] when trying to add a filter /// that has already been added. void addGlobalFilter(FilterType filterType) { - final e = SoLoudController().soLoudFFI.addGlobalFilter(filterType.index); + final e = _controller.soLoudFFI.addGlobalFilter(filterType.index); if (e != PlayerErrors.noError) { _log.severe(() => 'addGlobalFilter(): $e'); throw SoLoudCppException.fromPlayerError(e); @@ -1554,8 +1472,7 @@ interface class SoLoud { /// Removes [filterType] from all sounds. void removeGlobalFilter(FilterType filterType) { - final ret = - SoLoudController().soLoudFFI.removeGlobalFilter(filterType.index); + final ret = _controller.soLoudFFI.removeGlobalFilter(filterType.index); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { _log.severe(() => 'removeGlobalFilter(): $error'); @@ -1569,8 +1486,7 @@ interface class SoLoud { /// [getFilterParamNames]), and its new [value]. void setFilterParameter( FilterType filterType, int attributeId, double value) { - final ret = SoLoudController() - .soLoudFFI + final ret = _controller.soLoudFFI .setFilterParams(filterType.index, attributeId, value); final error = PlayerErrors.values[ret]; if (error != PlayerErrors.noError) { @@ -1586,9 +1502,7 @@ interface class SoLoud { /// /// Returns the value as [double]. double getFilterParameter(FilterType filterType, int attributeId) { - return SoLoudController() - .soLoudFFI - .getFilterParams(filterType.index, attributeId); + return _controller.soLoudFFI.getFilterParams(filterType.index, attributeId); } // //////////////////////////////////////////////// @@ -1644,19 +1558,19 @@ interface class SoLoud { throw const SoLoudNotInitializedException(); } - final ret = SoLoudController().soLoudFFI.play3d( - sound.soundHash, - posX, - posY, - posZ, - velX: velX, - velY: velY, - velZ: velZ, - volume: volume, - paused: paused, - looping: looping, - loopingStartAt: loopingStartAt, - ); + final ret = _controller.soLoudFFI.play3d( + sound.soundHash, + posX, + posY, + posZ, + velX: velX, + velY: velY, + velZ: velZ, + volume: volume, + paused: paused, + looping: looping, + loopingStartAt: loopingStartAt, + ); _logPlayerError(ret.error, from: 'play3d()'); if (ret.error != PlayerErrors.noError) { @@ -1684,14 +1598,14 @@ interface class SoLoud { /// that your world coordinates are in meters (where 1 unit is 1 meter), /// and that the environment is dry air at around 20 degrees Celsius. void set3dSoundSpeed(double speed) { - SoLoudController().soLoudFFI.set3dSoundSpeed(speed); + _controller.soLoudFFI.set3dSoundSpeed(speed); } /// Gets the speed of sound. /// /// See [set3dSoundSpeed] for details. double get3dSoundSpeed() { - return SoLoudController().soLoudFFI.get3dSoundSpeed(); + return _controller.soLoudFFI.get3dSoundSpeed(); } /// Sets the position, at-vector, up-vector and velocity @@ -1709,30 +1623,29 @@ interface class SoLoud { double velocityX, double velocityY, double velocityZ) { - SoLoudController().soLoudFFI.set3dListenerParameters(posX, posY, posZ, atX, - atY, atZ, upX, upY, upZ, velocityX, velocityY, velocityZ); + _controller.soLoudFFI.set3dListenerParameters(posX, posY, posZ, atX, atY, + atZ, upX, upY, upZ, velocityX, velocityY, velocityZ); } /// Sets the position parameter of the 3D audio listener. void set3dListenerPosition(double posX, double posY, double posZ) { - SoLoudController().soLoudFFI.set3dListenerPosition(posX, posY, posZ); + _controller.soLoudFFI.set3dListenerPosition(posX, posY, posZ); } /// Sets the at-vector (i.e. position) parameter of the 3D audio listener. void set3dListenerAt(double atX, double atY, double atZ) { - SoLoudController().soLoudFFI.set3dListenerAt(atX, atY, atZ); + _controller.soLoudFFI.set3dListenerAt(atX, atY, atZ); } /// Sets the up-vector parameter of the 3D audio listener. void set3dListenerUp(double upX, double upY, double upZ) { - SoLoudController().soLoudFFI.set3dListenerUp(upX, upY, upZ); + _controller.soLoudFFI.set3dListenerUp(upX, upY, upZ); } /// Sets the 3D listener's velocity vector. void set3dListenerVelocity( double velocityX, double velocityY, double velocityZ) { - SoLoudController() - .soLoudFFI + _controller.soLoudFFI .set3dListenerVelocity(velocityX, velocityY, velocityZ); } @@ -1742,21 +1655,20 @@ interface class SoLoud { /// The sound instance is provided via its [handle]. void set3dSourceParameters(SoundHandle handle, double posX, double posY, double posZ, double velocityX, double velocityY, double velocityZ) { - SoLoudController().soLoudFFI.set3dSourceParameters( + _controller.soLoudFFI.set3dSourceParameters( handle, posX, posY, posZ, velocityX, velocityY, velocityZ); } /// Sets the position of a live 3D audio source. void set3dSourcePosition( SoundHandle handle, double posX, double posY, double posZ) { - SoLoudController().soLoudFFI.set3dSourcePosition(handle, posX, posY, posZ); + _controller.soLoudFFI.set3dSourcePosition(handle, posX, posY, posZ); } /// Set the velocity parameter of a live 3D audio source. void set3dSourceVelocity(SoundHandle handle, double velocityX, double velocityY, double velocityZ) { - SoLoudController() - .soLoudFFI + _controller.soLoudFFI .set3dSourceVelocity(handle, velocityX, velocityY, velocityZ); } @@ -1764,8 +1676,7 @@ interface class SoLoud { /// of a live 3D audio source. void set3dSourceMinMaxDistance( SoundHandle handle, double minDistance, double maxDistance) { - SoLoudController() - .soLoudFFI + _controller.soLoudFFI .set3dSourceMinMaxDistance(handle, minDistance, maxDistance); } @@ -1785,18 +1696,16 @@ interface class SoLoud { int attenuationModel, double attenuationRolloffFactor, ) { - SoLoudController().soLoudFFI.set3dSourceAttenuation( - handle, - attenuationModel, - attenuationRolloffFactor, - ); + _controller.soLoudFFI.set3dSourceAttenuation( + handle, + attenuationModel, + attenuationRolloffFactor, + ); } /// Sets the doppler factor of a live 3D audio source. void set3dSourceDopplerFactor(SoundHandle handle, double dopplerFactor) { - SoLoudController() - .soLoudFFI - .set3dSourceDopplerFactor(handle, dopplerFactor); + _controller.soLoudFFI.set3dSourceDopplerFactor(handle, dopplerFactor); } /// Utility method that logs a [Level.SEVERE] message if [playerError] diff --git a/lib/src/soloud_capture.dart b/lib/src/soloud_capture.dart index 72f812a..2e8ee34 100644 --- a/lib/src/soloud_capture.dart +++ b/lib/src/soloud_capture.dart @@ -1,6 +1,8 @@ -import 'dart:ffi' as ffi; +// import 'dart:ffi' as ffi; +import 'package:flutter_soloud/src/bindings/audio_data.dart'; import 'package:flutter_soloud/src/enums.dart'; +import 'package:flutter_soloud/src/exceptions/exceptions.dart'; import 'package:flutter_soloud/src/soloud.dart'; import 'package:flutter_soloud/src/bindings/soloud_controller.dart'; import 'package:logging/logging.dart'; @@ -75,55 +77,28 @@ interface class SoLoudCapture { // Below all the methods implemented with FFI for the capture // //////////////////////////////////////////////// - /// Return a floats matrix of 256x512 - /// Every row are composed of 256 FFT values plus 256 of wave data - /// Every time is called, a new row is stored in the - /// first row and all the previous rows are shifted - /// up (the last one will be lost). - /// - /// Return [CaptureErrors.captureNoError] if no error. - /// - CaptureErrors getCaptureAudioTexture2D( - ffi.Pointer> audioData, - ) { - if (!isCaptureInited || audioData == ffi.nullptr) { - _log.severe( - () => 'getCaptureAudioTexture2D(): ${CaptureErrors.captureNotInited}', - ); - return CaptureErrors.captureNotInited; - } - - final ret = - SoLoudController().captureFFI.getCaptureAudioTexture2D(audioData); - _logCaptureError(ret, from: 'getCaptureAudioTexture2D() result'); - - if (ret != CaptureErrors.captureNoError) { - return ret; - } - if (audioData.value == ffi.nullptr) { - _logCaptureError( - CaptureErrors.nullPointer, - from: 'getCaptureAudioTexture2D() result', - ); - return CaptureErrors.nullPointer; - } - return CaptureErrors.captureNoError; - } - /// Initialize input device with [deviceID]. /// /// Return [CaptureErrors.captureNoError] if no error. /// - CaptureErrors initialize({int deviceID = -1}) { + CaptureErrors init({int deviceID = -1}) { final ret = SoLoudController().captureFFI.initCapture(deviceID); _logCaptureError(ret, from: 'initCapture() result'); if (ret == CaptureErrors.captureNoError) { isCaptureInited = true; + } else { + throw SoLoudCppException.fromCaptureError(ret); } return ret; } + /// Dispose capture device. + void deinit() { + SoLoudController().captureFFI.disposeCapture(); + isCaptureInited = false; + } + /// Get the status of the device. /// bool isCaptureInitialized() { @@ -162,6 +137,33 @@ interface class SoLoudCapture { return ret; } + /// Return a floats matrix of 256x512 + /// Every row are composed of 256 FFT values plus 256 of wave data + /// Every time is called, a new row is stored in the + /// first row and all the previous rows are shifted + /// up (the last one will be lost). + /// + /// Return [CaptureErrors.captureNoError] if no error. + /// + @Deprecated('Please use AudioData class instead.') + CaptureErrors getCaptureAudioTexture2D(AudioData audioData) { + if (!isCaptureInited) { + _log.severe( + () => 'getCaptureAudioTexture2D(): ${CaptureErrors.captureNotInited}', + ); + return CaptureErrors.captureNotInited; + } + + final ret = + SoLoudController().captureFFI.getCaptureAudioTexture2D(audioData); + _logCaptureError(ret, from: 'getCaptureAudioTexture2D() result'); + + if (ret != CaptureErrors.captureNoError) { + return ret; + } + return CaptureErrors.captureNoError; + } + /// Start capturing audio data. /// /// Return [CaptureErrors.captureNoError] if no error @@ -169,6 +171,9 @@ interface class SoLoudCapture { CaptureErrors startCapture() { final ret = SoLoudController().captureFFI.startCapture(); _logCaptureError(ret, from: 'startCapture() result'); + if (ret != CaptureErrors.captureNoError) { + throw SoLoudCppException.fromCaptureError(ret); + } return ret; } @@ -181,6 +186,8 @@ interface class SoLoudCapture { _logCaptureError(ret, from: 'stopCapture() result'); if (ret == CaptureErrors.captureNoError) { isCaptureInited = false; + } else { + throw SoLoudCppException.fromCaptureError(ret); } return ret; } diff --git a/lib/src/utils/loader.dart b/lib/src/utils/loader.dart index 23b19b8..4f4f1c4 100644 --- a/lib/src/utils/loader.dart +++ b/lib/src/utils/loader.dart @@ -1,303 +1,2 @@ -import 'dart:io'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_soloud/src/exceptions/exceptions.dart'; -import 'package:http/http.dart' as http; -import 'package:logging/logging.dart'; -import 'package:meta/meta.dart'; -import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart' as path_provider; - -/// A long-living helper class that loads assets and URLs into temporary files -/// that can be played by SoLoud. -@internal -class SoLoudLoader { - SoLoudLoader(); - - static const String _temporaryDirectoryName = 'SoLoudLoader-Temp-Files'; - - static final Logger _log = Logger('flutter_soloud.SoLoudLoader'); - - /// When `true`, the loader will automatically call [cleanUp], - /// deleting files in the temporary directory at various points. - bool automaticCleanup = false; - - final Map<_TemporaryFileIdentifier, File> _temporaryFiles = {}; - - Directory? _temporaryDirectory; - - /// Deletes temporary files. It is good practice to call this method - /// once in a while, in order not to bloat the temporary directory. - /// This is especially important when the application plays a lot of - /// different files during its lifetime (e.g. a music player - /// loading tracks from the network). - /// - /// For applications and games that play sounds from assets or from - /// the file system, this is probably unnecessary, as the amount of data will - /// be finite. - Future cleanUp() async { - _log.finest('cleanUp() called'); - final directory = _temporaryDirectory; - - if (directory == null) { - _log.warning("Temporary directory hasn't been initialized, " - 'yet cleanUp() is called.'); - return; - } - - // Clear the set in case someone tries to access the files - // while we're deleting them. - _temporaryFiles.clear(); - - try { - final files = await directory.list(followLinks: false).toList(); - - Future deleteFile(FileSystemEntity entity) async { - try { - await entity.delete(recursive: true); - } on FileSystemException catch (e) { - _log.warning(() => 'cleanUp() cannot remove ${entity.path}: $e'); - return false; - } - return true; - } - - // Delete files in parallel. - final results = await Future.wait(files.map(deleteFile)); - - if (results.any((success) => !success)) { - _log.severe('Cannot clean up temporary directory. See warnings above.'); - } - - await _temporaryDirectory?.delete(recursive: true); - } on FileSystemException catch (e) { - _log.severe('Cannot clean up temporary directory: $e'); - } - } - - /// This method can be run safely several times. - Future initialize() async { - _log.finest('initialize() called'); - if (_temporaryDirectory != null) { - _log.fine( - () => 'Loader has already been initialized. Not initializing again.', - ); - if (automaticCleanup) { - await cleanUp(); - } - return; - } - - final systemTempDir = await path_provider.getTemporaryDirectory(); - final directoryPath = - path.join(systemTempDir.path, _temporaryDirectoryName); - final directory = Directory(directoryPath); - - try { - _temporaryDirectory = await directory.create(); - } catch (e) { - _log.severe( - "Couldn't initialize loader. Temporary directory couldn't be created.", - e, - ); - // There is no way we can recover from this. If we have nowhere to save - // files, we can't play anything. - rethrow; - } - - _log.info(() => 'Temporary directory initialized at ${directory.path}'); - - if (automaticCleanup) { - await cleanUp(); - } - } - - /// Loads the asset with [key] (e.g. `assets/sound.mp3`), and creates - /// a temporary file that can be played by SoLoud. - /// - /// Provide [assetBundle] if needed. By default, the method uses - /// [rootBundle]. - /// - /// Returns `null` if there's a problem with some implementation detail - /// (e.g. cannot create temporary file). - /// - /// Throws [FlutterError] when the asset doesn't exist or cannot be loaded. - /// (This is the same exception that [AssetBundle.load] would throw.) - Future loadAsset( - String key, { - AssetBundle? assetBundle, - }) async { - final id = _TemporaryFileIdentifier(_Source.asset, key); - - // TODO(filiph): Add the option to check the filesystem first. - // This could be a cache-invalidation problem (if the asset - // changes from one version to another). But it could speed - // up start up times. - if (_temporaryFiles.containsKey(id)) { - final existingFile = _temporaryFiles[id]!; - if (existingFile.existsSync()) { - _log.finest(() => 'Asset $key already exists as a temporary file.'); - return _temporaryFiles[id]!; - } - } - - final directory = _temporaryDirectory; - - if (directory == null) { - throw const SoLoudTemporaryFolderFailedException( - "Temporary directory hasn't been initialized, " - 'yet loadAsset() is called.'); - } - - final newFilepath = _getFullTempFilePath(id); - final newFile = File(newFilepath); - - final ByteData byteData; - final bundle = assetBundle ?? rootBundle; - - try { - byteData = await bundle.load(key); - } catch (e) { - _log.severe("loadAsset() couldn't load $key from $bundle", e); - // Fail-fast principle. If the developer tries to load an asset - // that's not available, this should be seen during debugging, - // and the developer should be able to catch and deal with the error - // in a try-catch block. - rethrow; - } - - final buffer = byteData.buffer; - try { - await newFile.create(recursive: true); - await newFile.writeAsBytes( - buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), - ); - } catch (e) { - throw SoLoudTemporaryFolderFailedException( - "loadAsset() couldn't write $newFile to disk", - ); - } - - _temporaryFiles[id] = newFile; - - return newFile; - } - - /// Optionally, you can provide your own [httpClient]. This is a good idea - /// if you're loading several files in a short span of time (such as - /// on program startup). When no [httpClient] is provided, this method - /// will create a new one and close it afterwards. - /// - /// Throws [FormatException] if the [url] is invalid. - /// Throws [SoLoudNetworkStatusCodeException] if the request fails. - Future loadUrl( - String url, { - http.Client? httpClient, - }) async { - final uri = Uri.parse(url); - - final id = _TemporaryFileIdentifier(_Source.url, url); - - // TODO(filiph): Add the option to check the filesystem first. - // This could be a cache-invalidation problem (if the asset - // changes from one version to another). But it could speed - // up start up times. - if (_temporaryFiles.containsKey(id)) { - final existingFile = _temporaryFiles[id]!; - if (existingFile.existsSync()) { - _log.finest( - () => 'Sound from $url already exists as a temporary file.', - ); - return _temporaryFiles[id]!; - } - } - - final directory = _temporaryDirectory; - - if (directory == null) { - throw const SoLoudTemporaryFolderFailedException( - "Temporary directory hasn't been initialized, " - 'yet loadUrl() is called.'); - } - - final newFilepath = _getFullTempFilePath(id); - final newFile = File(newFilepath); - - final Uint8List byteData; - - try { - http.Response response; - if (httpClient != null) { - response = await httpClient.get(uri); - } else { - response = await http.get(uri); - } - if (response.statusCode == 200) { - byteData = response.bodyBytes; - } else { - throw SoLoudNetworkStatusCodeException( - response.statusCode, - 'Failed to fetch file from URL: $url', - ); - } - } catch (e) { - _log.severe(() => 'Error fetching $url', e); - rethrow; - } - - final buffer = byteData.buffer; - try { - await newFile.create(recursive: true); - await newFile.writeAsBytes( - buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), - ); - } catch (e) { - throw SoLoudTemporaryFolderFailedException( - "loadAsset() couldn't write $newFile to disk", - ); - } - - _temporaryFiles[id] = newFile; - - return newFile; - } - - String _getFullTempFilePath(_TemporaryFileIdentifier id) { - final directory = _temporaryDirectory; - - if (directory == null) { - throw StateError("Temporary directory hasn't been initialized, " - 'yet _getTempFile() is called.'); - } - - return path.join(directory.absolute.path, id.asFilename); - } -} - -enum _Source { - url, - asset, -} - -@immutable -class _TemporaryFileIdentifier { - const _TemporaryFileIdentifier(this.source, this.path); - - final _Source source; - - final String path; - - String get asFilename => - 'temp-sound-${source.name}-0x${path.hashCode.toRadixString(16)}'; - - @override - int get hashCode => Object.hash(source, path); - - @override - bool operator ==(Object other) { - return other is _TemporaryFileIdentifier && - other.source == source && - other.path == path; - } -} +export 'package:flutter_soloud/src/utils/loader_io.dart' + if (dart.library.html) 'package:flutter_soloud/src/utils/loader_web.dart'; diff --git a/lib/src/utils/loader_io.dart b/lib/src/utils/loader_io.dart new file mode 100644 index 0000000..c4f46ed --- /dev/null +++ b/lib/src/utils/loader_io.dart @@ -0,0 +1,303 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_soloud/src/exceptions/exceptions.dart'; +import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; +import 'package:meta/meta.dart'; +import 'package:path/path.dart' as path; +import 'package:path_provider/path_provider.dart' as path_provider; + +/// A long-living helper class that loads assets and URLs into temporary files +/// that can be played by SoLoud. +@internal +class SoLoudLoader { + SoLoudLoader(); + + static const String _temporaryDirectoryName = 'SoLoudLoader-Temp-Files'; + + static final Logger _log = Logger('flutter_soloud.SoLoudLoader_io'); + + /// When `true`, the loader will automatically call [cleanUp], + /// deleting files in the temporary directory at various points. + bool automaticCleanup = false; + + final Map<_TemporaryFileIdentifier, File> _temporaryFiles = {}; + + Directory? _temporaryDirectory; + + /// Deletes temporary files. It is good practice to call this method + /// once in a while, in order not to bloat the temporary directory. + /// This is especially important when the application plays a lot of + /// different files during its lifetime (e.g. a music player + /// loading tracks from the network). + /// + /// For applications and games that play sounds from assets or from + /// the file system, this is probably unnecessary, as the amount of data will + /// be finite. + Future cleanUp() async { + _log.finest('cleanUp() called'); + final directory = _temporaryDirectory; + + if (directory == null) { + _log.warning("Temporary directory hasn't been initialized, " + 'yet cleanUp() is called.'); + return; + } + + // Clear the set in case someone tries to access the files + // while we're deleting them. + _temporaryFiles.clear(); + + try { + final files = await directory.list(followLinks: false).toList(); + + Future deleteFile(FileSystemEntity entity) async { + try { + await entity.delete(recursive: true); + } on FileSystemException catch (e) { + _log.warning(() => 'cleanUp() cannot remove ${entity.path}: $e'); + return false; + } + return true; + } + + // Delete files in parallel. + final results = await Future.wait(files.map(deleteFile)); + + if (results.any((success) => !success)) { + _log.severe('Cannot clean up temporary directory. See warnings above.'); + } + + await _temporaryDirectory?.delete(recursive: true); + } on FileSystemException catch (e) { + _log.severe('Cannot clean up temporary directory: $e'); + } + } + + /// This method can be run safely several times. + Future initialize() async { + _log.finest('initialize() called'); + if (_temporaryDirectory != null) { + _log.fine( + () => 'Loader has already been initialized. Not initializing again.', + ); + if (automaticCleanup) { + await cleanUp(); + } + return; + } + + final systemTempDir = await path_provider.getTemporaryDirectory(); + final directoryPath = + path.join(systemTempDir.path, _temporaryDirectoryName); + final directory = Directory(directoryPath); + + try { + _temporaryDirectory = await directory.create(); + } catch (e) { + _log.severe( + "Couldn't initialize loader. Temporary directory couldn't be created.", + e, + ); + // There is no way we can recover from this. If we have nowhere to save + // files, we can't play anything. + rethrow; + } + + _log.info(() => 'Temporary directory initialized at ${directory.path}'); + + if (automaticCleanup) { + await cleanUp(); + } + } + + /// Loads the asset with [key] (e.g. `assets/sound.mp3`), and creates + /// a temporary file that can be played by SoLoud. + /// + /// Provide [assetBundle] if needed. By default, the method uses + /// [rootBundle]. + /// + /// Returns `null` if there's a problem with some implementation detail + /// (e.g. cannot create temporary file). + /// + /// Throws [FlutterError] when the asset doesn't exist or cannot be loaded. + /// (This is the same exception that [AssetBundle.load] would throw.) + Future loadAsset( + String key, { + AssetBundle? assetBundle, + }) async { + final id = _TemporaryFileIdentifier(_Source.asset, key); + + // TODO(filiph): Add the option to check the filesystem first. + // This could be a cache-invalidation problem (if the asset + // changes from one version to another). But it could speed + // up start up times. + if (_temporaryFiles.containsKey(id)) { + final existingFile = _temporaryFiles[id]!; + if (existingFile.existsSync()) { + _log.finest(() => 'Asset $key already exists as a temporary file.'); + return _temporaryFiles[id]!; + } + } + + final directory = _temporaryDirectory; + + if (directory == null) { + throw const SoLoudTemporaryFolderFailedException( + "Temporary directory hasn't been initialized, " + 'yet loadAsset() is called.'); + } + + final newFilepath = _getFullTempFilePath(id); + final newFile = File(newFilepath); + + final ByteData byteData; + final bundle = assetBundle ?? rootBundle; + + try { + byteData = await bundle.load(key); + } catch (e) { + _log.severe("loadAsset() couldn't load $key from $bundle", e); + // Fail-fast principle. If the developer tries to load an asset + // that's not available, this should be seen during debugging, + // and the developer should be able to catch and deal with the error + // in a try-catch block. + rethrow; + } + + final buffer = byteData.buffer; + try { + await newFile.create(recursive: true); + await newFile.writeAsBytes( + buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), + ); + } catch (e) { + throw SoLoudTemporaryFolderFailedException( + "loadAsset() couldn't write $newFile to disk", + ); + } + + _temporaryFiles[id] = newFile; + + return newFile; + } + + /// Optionally, you can provide your own [httpClient]. This is a good idea + /// if you're loading several files in a short span of time (such as + /// on program startup). When no [httpClient] is provided, this method + /// will create a new one and close it afterwards. + /// + /// Throws [FormatException] if the [url] is invalid. + /// Throws [SoLoudNetworkStatusCodeException] if the request fails. + Future loadUrl( + String url, { + http.Client? httpClient, + }) async { + final uri = Uri.parse(url); + + final id = _TemporaryFileIdentifier(_Source.url, url); + + // TODO(filiph): Add the option to check the filesystem first. + // This could be a cache-invalidation problem (if the asset + // changes from one version to another). But it could speed + // up start up times. + if (_temporaryFiles.containsKey(id)) { + final existingFile = _temporaryFiles[id]!; + if (existingFile.existsSync()) { + _log.finest( + () => 'Sound from $url already exists as a temporary file.', + ); + return _temporaryFiles[id]!; + } + } + + final directory = _temporaryDirectory; + + if (directory == null) { + throw const SoLoudTemporaryFolderFailedException( + "Temporary directory hasn't been initialized, " + 'yet loadUrl() is called.'); + } + + final newFilepath = _getFullTempFilePath(id); + final newFile = File(newFilepath); + + final Uint8List byteData; + + try { + http.Response response; + if (httpClient != null) { + response = await httpClient.get(uri); + } else { + response = await http.get(uri); + } + if (response.statusCode == 200) { + byteData = response.bodyBytes; + } else { + throw SoLoudNetworkStatusCodeException( + response.statusCode, + 'Failed to fetch file from URL: $url', + ); + } + } catch (e) { + _log.severe(() => 'Error fetching $url', e); + rethrow; + } + + final buffer = byteData.buffer; + try { + await newFile.create(recursive: true); + await newFile.writeAsBytes( + buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), + ); + } catch (e) { + throw SoLoudTemporaryFolderFailedException( + "loadAsset() couldn't write $newFile to disk", + ); + } + + _temporaryFiles[id] = newFile; + + return newFile; + } + + String _getFullTempFilePath(_TemporaryFileIdentifier id) { + final directory = _temporaryDirectory; + + if (directory == null) { + throw StateError("Temporary directory hasn't been initialized, " + 'yet _getTempFile() is called.'); + } + + return path.join(directory.absolute.path, id.asFilename); + } +} + +enum _Source { + url, + asset, +} + +@immutable +class _TemporaryFileIdentifier { + const _TemporaryFileIdentifier(this.source, this.path); + + final _Source source; + + final String path; + + String get asFilename => + 'temp-sound-${source.name}-0x${path.hashCode.toRadixString(16)}'; + + @override + int get hashCode => Object.hash(source, path); + + @override + bool operator ==(Object other) { + return other is _TemporaryFileIdentifier && + other.source == source && + other.path == path; + } +} diff --git a/lib/src/utils/loader_web.dart b/lib/src/utils/loader_web.dart new file mode 100644 index 0000000..f6d40e1 --- /dev/null +++ b/lib/src/utils/loader_web.dart @@ -0,0 +1,94 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_soloud/src/exceptions/exceptions.dart'; +import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; +import 'package:meta/meta.dart'; + +/// A long-living helper class that loads assets and URLs into temporary files +/// that can be played by SoLoud. +@internal +class SoLoudLoader { + SoLoudLoader(); + + static final Logger _log = Logger('flutter_soloud.SoLoudLoader_web'); + + /// To reflect [SoLoudLoader] for `io`. + bool automaticCleanup = false; + + /// To reflect [SoLoudLoader] for `io`. + Future initialize() async {} + + /// Loads the asset with [key] (e.g. `assets/sound.mp3`), and return + /// the file byte as `Uint8List` to be passed to `SoLoud.LoadMem` for + /// the web platfom. + /// + /// Provide [assetBundle] if needed. By default, the method uses + /// [rootBundle]. + /// + /// Returns `null` if there's a problem with some implementation detail + /// (e.g. cannot create temporary file). + /// + /// Throws [FlutterError] when the asset doesn't exist or cannot be loaded. + /// (This is the same exception that [AssetBundle.load] would throw.) + Future loadAsset( + String key, { + AssetBundle? assetBundle, + }) async { + final ByteData byteData; + final bundle = assetBundle ?? rootBundle; + + try { + byteData = await bundle.load(key); + } catch (e) { + _log.severe("loadAsset() couldn't load $key from $bundle", e); + // Fail-fast principle. If the developer tries to load an asset + // that's not available, this should be seen during debugging, + // and the developer should be able to catch and deal with the error + // in a try-catch block. + rethrow; + } + + return byteData.buffer + .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes); + } + + /// Optionally, you can provide your own [httpClient]. This is a good idea + /// if you're loading several files in a short span of time (such as + /// on program startup). When no [httpClient] is provided, this method + /// will create a new one and close it afterwards. + /// + /// Throws [FormatException] if the [url] is invalid. + /// Throws [SoLoudNetworkStatusCodeException] if the request fails. + Future loadUrl( + String url, { + http.Client? httpClient, + }) async { + final uri = Uri.parse(url); + + final Uint8List byteData; + + try { + http.Response response; + if (httpClient != null) { + response = await httpClient.get(uri); + } else { + response = await http.get(uri); + } + if (response.statusCode == 200) { + byteData = response.bodyBytes; + } else { + throw SoLoudNetworkStatusCodeException( + response.statusCode, + 'Failed to fetch file from URL: $url', + ); + } + } catch (e) { + _log.severe(() => 'Error fetching $url', e); + rethrow; + } + + return byteData.buffer + .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes); + } +} diff --git a/lib/src/worker/worker.dart b/lib/src/worker/worker.dart new file mode 100644 index 0000000..ec4efc2 --- /dev/null +++ b/lib/src/worker/worker.dart @@ -0,0 +1,108 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; +import 'dart:js_util'; +import 'dart:convert' show jsonEncode; + +import 'package:meta/meta.dart'; +import 'package:web/web.dart' as web; + +// Masked type: ServiceWorkerGlobalScope +@JS('self') +external JSAny get globalScopeSelf; + +@JS('self.importScript') +external JSAny _importScript(String path); + +void jsSendMessage(JSAny m) { + globalContext.callMethod('postMessage'.toJS, m); +} + +Stream callbackToStream( + dynamic object, + String name, + T Function(J jsValue) unwrapValue, +) { + final controller = StreamController.broadcast(sync: true); + setProperty(object as Object, name, allowInterop((J event) { + controller.add(unwrapValue(event)); + })); + return controller.stream; +} + +@internal +class Worker { + late StreamController _outputController; + + Worker() { + _outputController = StreamController(); + callbackToStream(globalScopeSelf, 'onmessage', (web.MessageEvent e) { + _outputController.add(getProperty(e, 'data')); + }); + } + + Stream onReceive() => _outputController.stream; + + void sendMessage(JSAny message) { + jsSendMessage(message); + } +} + +@internal +class WorkerController { + web.Worker? _worker; + StreamController? _outputController; + + /// Spawn a new web Worker with the given JS source (not used now). + static Future spawn(String path) async { + final controller = WorkerController(); + controller._outputController = StreamController(); + path = (path.endsWith('.dart') ? '$path.js' : path); + controller._worker = web.Worker(path); + + controller._worker?.onmessage = (((web.MessageEvent event) { + controller._outputController?.add(event.data.dartify()); + })).toJS; + + return controller; + } + + /// Set the worker created in WASM. + /// This is used to get events sent from the native audio thread. + void setWasmWorker(web.Worker wasmWorker) { + _outputController = StreamController(); + _worker = wasmWorker; + _worker?.onmessage = (((web.MessageEvent event) { + _outputController?.add(event.data.dartify()); + })).toJS; + } + + /// Not used with `Module.wasmWorker`. + void sendMessage(dynamic message) { + switch (message) { + case Map(): + final mapEncoded = jsonEncode(message); + _worker?.postMessage(mapEncoded.jsify()); + case num(): + _worker?.postMessage(message.toJS); + case String(): + _worker?.postMessage(message.toJS); + default: + throw UnsupportedError( + 'sendMessage(): Type ${message.runtimeType} unsupported'); + } + } + + /// The receiver Stream. + Stream onReceive() { + return _outputController!.stream; + } + + /// Kill the Worker. + void kill() { + _worker?.terminate(); + } +} + diff --git a/pubspec.yaml b/pubspec.yaml index 7ae68ab..cbae7fc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,19 +23,20 @@ screenshots: path: img/screenshot.png environment: - sdk: '>=3.3.0 <4.0.0' + sdk: '>=3.4.1 <4.0.0' flutter: '>=3.3.0' dependencies: - ffi: ^2.0.2 + ffi: ^2.1.2 flutter: sdk: flutter - http: ^1.1.0 - logging: ^1.0.0 + http: ^1.2.1 + logging: ^1.2.0 meta: ^1.0.0 - path: ^1.8.1 - path_provider: ^2.0.15 - plugin_platform_interface: ^2.1.5 + path: ^1.9.0 + path_provider: ^2.1.3 + plugin_platform_interface: ^2.1.8 + web: ^0.5.1 dev_dependencies: ffigen: ^12.0.0 @@ -57,3 +58,8 @@ flutter: ffiPlugin: true windows: ffiPlugin: true + + assets: + - web/worker.dart.js + - web/libflutter_soloud_plugin.js + - web/libflutter_soloud_plugin.wasm diff --git a/src/bindings.cpp b/src/bindings.cpp index b8157c5..cdee7b3 100644 --- a/src/bindings.cpp +++ b/src/bindings.cpp @@ -6,6 +6,10 @@ #include "common.h" #endif +#ifdef __EMSCRIPTEN__ +#include +#endif + #include "soloud/include/soloud_fft.h" #include "soloud_thread.h" @@ -31,6 +35,51 @@ extern "C" void (*dartFileLoadedCallback)(enum PlayerErrors *, char *completeFileName, unsigned int *) = nullptr; void (*dartStateChangedCallback)(enum PlayerStateEvents *) = nullptr; + ////////////////////////////////////////////////////////////// + /// WEB WORKER + +#ifdef __EMSCRIPTEN__ + /// Create the web worker and store a global "Module.workerUri" in JS. + FFI_PLUGIN_EXPORT void createWorkerInWasm() + { + printf("CPP void createWorkerInWasm()\n"); + + EM_ASM({ + if (!Module.wasmWorker) + { + // Create a new Worker from the URI + var workerUri = "assets/packages/flutter_soloud/web/worker.dart.js"; + console.log("EM_ASM creating web worker!"); + Module.wasmWorker = new Worker(workerUri); + } + else + { + console.log("EM_ASM web worker already created!"); + } + }); + } + + /// Post a message with the web worker. + FFI_PLUGIN_EXPORT void sendToWorker(const char *message, int value) + { + EM_ASM({ + if (Module.wasmWorker) + { + console.log("EM_ASM posting message " + UTF8ToString($0) + + " with value " + $1); + // Send the message + Module.wasmWorker.postMessage(JSON.stringify({ + "message" : UTF8ToString($0), + "value" : $1 + })); + } + else + { + console.error('Worker not found.'); + } }, message, value); + } +#endif + FFI_PLUGIN_EXPORT void nativeFree(void *pointer) { free(pointer); @@ -38,9 +87,17 @@ extern "C" /// The callback to monitor when a voice ends. /// - /// It is called by void `Soloud::stopVoice_internal(unsigned int aVoice)` when a voice ends. - void voiceEndedCallback(unsigned int *handle) + /// It is called by void `Soloud::stopVoice_internal(unsigned int aVoice)` when a voice ends + /// and comes from the audio thread (so on the web, from a different web worker). + FFI_PLUGIN_EXPORT void voiceEndedCallback(unsigned int *handle) { +#ifdef __EMSCRIPTEN__ + // Calling JavaScript from C/C++ + // https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-call-javascript-from-native + // emscripten_run_script("voiceEndedCallbackJS('1234')"); + sendToWorker("voiceEndedCallback", *handle); +#endif + if (dartVoiceEndedCallback == nullptr) return; player->removeHandle(*handle); @@ -395,7 +452,8 @@ extern "C" { if (player.get() == nullptr || !player.get()->isInited()) return backendNotInited; - *handle = player.get()->play(soundHash, volume, pan, paused, looping, loopingStartAt); + unsigned int newHandle = player.get()->play(soundHash, volume, pan, paused, looping, loopingStartAt); + *handle = newHandle; return *handle == 0 ? soundHashNotFound : noError; } @@ -500,24 +558,22 @@ extern "C" /// Returns valid data only if VisualizationEnabled is true /// - /// [fft] /// Return a 256 float array containing FFT data. - FFI_PLUGIN_EXPORT void getFft(float *fft) + FFI_PLUGIN_EXPORT void getFft(float **fft) { if (player.get() == nullptr || !player.get()->isInited()) return; - fft = player.get()->calcFFT(); + *fft = player.get()->calcFFT(); } /// Returns valid data only if VisualizationEnabled is true /// - /// fft /// Return a 256 float array containing wave data. - FFI_PLUGIN_EXPORT void getWave(float *wave) + FFI_PLUGIN_EXPORT void getWave(float **wave) { if (player.get() == nullptr || !player.get()->isInited()) return; - wave = player.get()->getWave(); + *wave = player.get()->getWave(); } /// Smooth FFT data. @@ -557,22 +613,19 @@ extern "C" memcpy(samples + 256, wave, sizeof(float) * 256); } - /// Return a floats matrix of 512x256 + /// Return a floats matrix of 256x512 /// Every row are composed of 256 FFT values plus 256 of wave data /// Every time is called, a new row is stored in the /// first row and all the previous rows are shifted /// up (the last one will be lost). - /// - /// [samples] - float texture2D[512][256]; + float texture2D[256][512]; FFI_PLUGIN_EXPORT enum PlayerErrors getAudioTexture2D(float **samples) { if (player.get() == nullptr || !player.get()->isInited() || analyzer.get() == nullptr || !player.get()->isVisualizationEnabled()) { - if (*samples == nullptr) - return unknownError; - memset(samples, 0, sizeof(float) * 512 * 256); + *samples = *texture2D; + memset(*samples, 0, sizeof(float) * 512 * 256); return backendNotInited; } /// shift up 1 row @@ -583,6 +636,10 @@ extern "C" return noError; } + FFI_PLUGIN_EXPORT float getTextureValue(int row, int column) { + return texture2D[row][column]; + } + /// Get the sound length in seconds /// /// [soundHash] the sound hash @@ -937,7 +994,7 @@ extern "C" std::vector pNames = player.get()->mFilters.getFilterParamNames(filterType); *paramsCount = static_cast(pNames.size()); *names = (char *)malloc(sizeof(char *) * *paramsCount); - printf("C paramsCount: %p **names: %p\n", paramsCount, names); + // printf("C paramsCount: %p **names: %p\n", paramsCount, names); for (int i = 0; i < *paramsCount; i++) { names[i] = strdup(pNames[i].c_str()); diff --git a/src/bindings_capture.cpp b/src/bindings_capture.cpp index 67b6953..93437f9 100644 --- a/src/bindings_capture.cpp +++ b/src/bindings_capture.cpp @@ -11,106 +11,142 @@ #include #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -Capture capture; -std::unique_ptr analyzerCapture = std::make_unique(256); + Capture capture; + std::unique_ptr analyzerCapture = std::make_unique(256); -FFI_PLUGIN_EXPORT void listCaptureDevices(struct CaptureDevice **devices, int *n_devices) -{ - std::vector d = capture.listCaptureDevices(); - int numDevices = 0; - for (int i=0; i<(int)d.size(); i++) + FFI_PLUGIN_EXPORT void listCaptureDevices( + char **devicesName, + int **isDefault, + int *n_devices) { - bool hasSpecialChar = false; - /// check if the device name has some strange chars (happens on linux) - for (int n=0; n<5; n++) if (d[i].name[n] < 0x20) hasSpecialChar = true; - if (strlen(d[i].name) <= 5 || hasSpecialChar) break; - - devices[i] = (CaptureDevice*)malloc(sizeof(CaptureDevice)); - devices[i]->name = strdup(d[i].name); - devices[i]->isDefault = d[i].isDefault; + std::vector d = capture.listCaptureDevices(); + + int numDevices = 0; + for (int i = 0; i < (int)d.size(); i++) + { + bool hasSpecialChar = false; + /// check if the device name has some strange chars (happens on linux) + for (int n = 0; n < 5; n++) + if (d[i].name[n] < 0x20) + hasSpecialChar = true; + if (strlen(d[i].name) <= 5 || hasSpecialChar) + continue; + + devicesName[i] = strdup(d[i].name); + isDefault[i] = (int *)malloc(sizeof(int *)); + *isDefault[i] = d[i].isDefault; + + numDevices++; + } + *n_devices = numDevices; + } - numDevices++; + FFI_PLUGIN_EXPORT void freeListCaptureDevices( + char **devicesName, + int **isDefault, + int n_devices) + { + for (int i = 0; i < n_devices; i++) + { + free(devicesName[i]); + free(isDefault[i]); + } } - *n_devices = numDevices; -} -FFI_PLUGIN_EXPORT void freeListCaptureDevices(struct CaptureDevice **devices, int n_devices) -{ - for (int i=0; iname); - free(devices[i]); + CaptureErrors res = capture.init(deviceID); + return res; } -} -FFI_PLUGIN_EXPORT enum CaptureErrors initCapture(int deviceID) -{ - CaptureErrors res = capture.init(deviceID); - return res; -} + FFI_PLUGIN_EXPORT void disposeCapture() + { + capture.dispose(); + } -FFI_PLUGIN_EXPORT void disposeCapture() -{ - capture.dispose(); -} + FFI_PLUGIN_EXPORT int isCaptureInited() + { + return capture.isInited() ? 1 : 0; + } -FFI_PLUGIN_EXPORT int isCaptureInited() -{ - return capture.isInited() ? 1 : 0; -} + FFI_PLUGIN_EXPORT int isCaptureStarted() + { + return capture.isStarted() ? 1 : 0; + } -FFI_PLUGIN_EXPORT int isCaptureStarted() -{ - return capture.isStarted() ? 1 : 0; -} + FFI_PLUGIN_EXPORT enum CaptureErrors startCapture() + { + return capture.startCapture(); + } -FFI_PLUGIN_EXPORT enum CaptureErrors startCapture() -{ - return capture.startCapture(); -} + FFI_PLUGIN_EXPORT enum CaptureErrors stopCapture() + { + return capture.stopCapture(); + } -FFI_PLUGIN_EXPORT enum CaptureErrors stopCapture() -{ - return capture.stopCapture(); -} + /// Return a 256 float array containing FFT data. + FFI_PLUGIN_EXPORT void getCaptureFft(float **fft) + { + if (!capture.isInited()) + return; + float *wave = capture.getWave(); + *fft = analyzerCapture.get()->calcFFT(wave); + } + /// Return a 256 float array containing wave data. + FFI_PLUGIN_EXPORT void getCaptureWave(float **wave) + { + if (!capture.isInited()) + return; + *wave = capture.getWave(); + } -FFI_PLUGIN_EXPORT void getCaptureTexture(float* samples) -{ - if (analyzerCapture.get() == nullptr || !capture.isInited()) { - memset(samples,0, sizeof(float) * 512); - return; + FFI_PLUGIN_EXPORT void getCaptureTexture(float *samples) + { + if (analyzerCapture.get() == nullptr || !capture.isInited()) + { + memset(samples, 0, sizeof(float) * 512); + return; + } + float *wave = capture.getWave(); + float *fft = analyzerCapture.get()->calcFFT(wave); + + memcpy(samples, fft, sizeof(float) * 256); + memcpy(samples + 256, wave, sizeof(float) * 256); } - float *wave = capture.getWave(); - float *fft = analyzerCapture.get()->calcFFT(wave); - memcpy(samples, fft, sizeof(float) * 256); - memcpy(samples + 256, wave, sizeof(float) * 256); -} + float capturedTexture2D[256][512]; + FFI_PLUGIN_EXPORT enum CaptureErrors getCaptureAudioTexture2D(float **samples) + { + if (analyzerCapture.get() == nullptr || !capture.isInited()) + { + *samples = *capturedTexture2D; + memset(*samples, 0, sizeof(float) * 512 * 256); + return capture_not_inited; + } + /// shift up 1 row + memmove(*capturedTexture2D + 512, capturedTexture2D, sizeof(float) * 512 * 255); + /// store the new 1st row + getCaptureTexture(capturedTexture2D[0]); + *samples = *capturedTexture2D; + return capture_noError; + } -float capturedTexture2D[256][512]; -FFI_PLUGIN_EXPORT enum CaptureErrors getCaptureAudioTexture2D(float** samples) -{ - if (analyzerCapture.get() == nullptr || !capture.isInited()) { - memset(samples,0, sizeof(float) * 512 * 256); - return capture_not_inited; + FFI_PLUGIN_EXPORT float getCaptureTextureValue(int row, int column) { + return capturedTexture2D[row][column]; } - /// shift up 1 row - memmove(*capturedTexture2D+512, capturedTexture2D, sizeof(float) * 512 * 255); - /// store the new 1st row - getCaptureTexture(capturedTexture2D[0]); - *samples = *capturedTexture2D; - return capture_noError; -} -FFI_PLUGIN_EXPORT enum CaptureErrors setCaptureFftSmoothing(float smooth) -{ - if (!capture.isInited()) return capture_not_inited; - analyzerCapture.get()->setSmoothing(smooth); - return capture_noError; -} + FFI_PLUGIN_EXPORT enum CaptureErrors setCaptureFftSmoothing(float smooth) + { + if (!capture.isInited()) + return capture_not_inited; + analyzerCapture.get()->setSmoothing(smooth); + return capture_noError; + } #ifdef __cplusplus } diff --git a/src/enums.h b/src/enums.h index 1d2832f..96beb7c 100644 --- a/src/enums.h +++ b/src/enums.h @@ -51,11 +51,11 @@ typedef enum CaptureErrors { /// No error capture_noError, - /// + /// The capture device has failed to initialize. capture_init_failed, - /// + /// The capture device has not yet been initialized. capture_not_inited, - /// + /// Failed to start the device. failed_to_start_device, } CaptureErrors_t; diff --git a/src/filters/filters.cpp b/src/filters/filters.cpp index cf915a4..b69a564 100644 --- a/src/filters/filters.cpp +++ b/src/filters/filters.cpp @@ -61,6 +61,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case LofiFilter: { SoLoud::LofiFilter f; @@ -70,6 +71,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case FlangerFilter: { SoLoud::FlangerFilter f; @@ -79,6 +81,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case BassboostFilter: { SoLoud::BassboostFilter f; @@ -88,6 +91,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case WaveShaperFilter: { SoLoud::WaveShaperFilter f; @@ -97,6 +101,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case RobotizeFilter: { SoLoud::RobotizeFilter f; @@ -106,6 +111,7 @@ std::vector Filters::getFilterParamNames(FilterType filterType) ret.push_back(f.getParamName(i)); } } + break; case FreeverbFilter: { SoLoud::FreeverbFilter f; diff --git a/src/player.cpp b/src/player.cpp index ff9d331..9c4a2dc 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -329,22 +329,16 @@ unsigned int Player::play( bool looping, double loopingStartAt) { - // printf("*** PLAYER:PLAY() sounds length: %d looking for hash: %u\n", sounds.size(), soundHash); - - // for (int i = 0; i < sounds.size(); i++) - // printf("*** PLAYER:PLAY()1 sounds hash: %u\n", sounds[i].get()->soundHash); - auto const &s = std::find_if( sounds.begin(), sounds.end(), [&](std::shared_ptr const &f) - { - // printf("*** PLAYER:PLAY() sound1 hash: %u\n", f->soundHash); - return f->soundHash == soundHash; }); + { return f->soundHash == soundHash; }); if (s == sounds.end()) return 0; ActiveSound *sound = s->get(); + SoLoud::handle newHandle = soloud.play( *sound->sound.get(), volume, pan, paused, 0); if (newHandle != 0) diff --git a/src/soloud/src/backend/miniaudio/miniaudio.h b/src/soloud/src/backend/miniaudio/miniaudio.h index d8ca3ed..47332e1 100644 --- a/src/soloud/src/backend/miniaudio/miniaudio.h +++ b/src/soloud/src/backend/miniaudio/miniaudio.h @@ -1,6 +1,6 @@ /* Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. -miniaudio - v0.11.22 - TBD +miniaudio - v0.11.21 - 2023-11-15 David Reid - mackron@gmail.com @@ -293,7 +293,7 @@ avoids the same sound being loaded multiple times. The node graph is used for mixing and effect processing. The idea is that you connect a number of nodes into the graph by connecting each node's outputs to another node's inputs. Each node can -implement its own effect. By chaining nodes together, advanced mixing and effect processing can +implement it's own effect. By chaining nodes together, advanced mixing and effect processing can be achieved. The engine encapsulates both the resource manager and the node graph to create a simple, easy to @@ -398,7 +398,7 @@ the be started and/or stopped at a specific time. This can be done with the foll ``` The start/stop time needs to be specified based on the absolute timer which is controlled by the -engine. The current global time in PCM frames can be retrieved with +engine. The current global time time in PCM frames can be retrieved with `ma_engine_get_time_in_pcm_frames()`. The engine's global time can be changed with `ma_engine_set_time_in_pcm_frames()` for synchronization purposes if required. Note that scheduling a start time still requires an explicit call to `ma_sound_start()` before anything will play: @@ -1309,7 +1309,7 @@ only works for sounds that were initialized with `ma_sound_init_from_file()` and When you initialize a sound, if you specify a sound group the sound will be attached to that group automatically. If you set it to NULL, it will be automatically attached to the engine's endpoint. -If you would instead rather leave the sound unattached by default, you can specify the +If you would instead rather leave the sound unattached by default, you can can specify the `MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT` flag. This is useful if you want to set up a complex node graph. @@ -1564,28 +1564,22 @@ formats through the use of custom decoders. To do so, pass in your `ma_decoding_ vtables into the resource manager config: ```c - ma_decoding_backend_vtable* pBackendVTables[] = + ma_decoding_backend_vtable* pCustomBackendVTables[] = { - ma_decoding_backend_libvorbis, // Custom - ma_decoding_backend_libopus, // Custom - ma_decoding_backend_wav, // Stock - ma_decoding_backend_flac, // Stock - ma_decoding_backend_mp3 // Stock + &g_ma_decoding_backend_vtable_libvorbis, + &g_ma_decoding_backend_vtable_libopus }; ... - resourceManagerConfig.ppDecodingBackendVTables = pBackendVTables; - resourceManagerConfig.decodingBackendCount = sizeof(pBackendVTables) / sizeof(pBackendVTables[0]); + resourceManagerConfig.ppCustomDecodingBackendVTables = pCustomBackendVTables; + resourceManagerConfig.customDecodingBackendCount = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]); + resourceManagerConfig.pCustomDecodingBackendUserData = NULL; ``` -Note that when specifying a decoding backend, you need to specify every backend you want to -support, including stock backends. If `resourceManagerConfig.ppDecodingBackendVTables` is set to -null, only stock backends will be used, and will be in a fixed order of priority. The order in -which you list the backends in `resourceManagerConfig.ppDecodingBackendVTables` is the priority -order. This system can allow you to support any kind of file format in any priority you like. See -the "Decoding" section for details on how to implement custom decoders. The miniaudio repository -includes examples for Opus via libopus and libopusfile and Vorbis via libvorbis and libvorbisfile. +This system can allow you to support any kind of file format. See the "Decoding" section for +details on how to implement custom decoders. The miniaudio repository includes examples for Opus +via libopus and libopusfile and Vorbis via libvorbis and libvorbisfile. Asynchronicity is achieved via a job system. When an operation needs to be performed, such as the decoding of a page, a job will be posted to a queue which will then be processed by a job thread. @@ -1692,7 +1686,6 @@ combination of the following flags: MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING ``` When no flags are specified (set to 0), the sound will be fully loaded into memory, but not @@ -1713,14 +1706,6 @@ can instead stream audio data which you can do by specifying the second pages. When a new page needs to be decoded, a job will be posted to the job queue and then subsequently processed in a job thread. -The `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING` flag can be used so that the sound will loop -when it reaches the end by default. It's recommended you use this flag when you want to have a -looping streaming sound. If you try loading a very short sound as a stream, you will get a glitch. -This is because the resource manager needs to pre-fill the initial buffer at initialization time, -and if you don't specify the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING` flag, the resource -manager will assume the sound is not looping and will stop filling the buffer when it reaches the -end, therefore resulting in a discontinuous buffer. - For in-memory sounds, reference counting is used to ensure the data is loaded only once. This means multiple calls to `ma_resource_manager_data_source_init()` with the same file path will result in the file data only being loaded once. Each call to `ma_resource_manager_data_source_init()` must be @@ -1735,7 +1720,7 @@ actual file paths. When `ma_resource_manager_data_source_init()` is called (with `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag), the resource manager will look for these explicitly registered data buffers and, if found, will use it as the backing data for the data source. Note that the resource manager does *not* make a copy of this data so it is up to the -caller to ensure the pointer stays valid for its lifetime. Use +caller to ensure the pointer stays valid for it's lifetime. Use `ma_resource_manager_unregister_data()` to unregister the self-managed data. You can also use `ma_resource_manager_register_file()` and `ma_resource_manager_unregister_file()` to register and unregister a file. It does not make sense to use the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` @@ -2046,7 +2031,7 @@ In the above graph, it starts with two data sources whose outputs are attached t splitter node. It's at this point that the two data sources are mixed. After mixing, the splitter performs it's processing routine and produces two outputs which is simply a duplication of the input stream. One output is attached to a low pass filter, whereas the other output is attached to -a echo/delay. The outputs of the low pass filter and the echo are attached to the endpoint, and +a echo/delay. The outputs of the the low pass filter and the echo are attached to the endpoint, and since they're both connected to the same input bus, they'll be mixed. Each input bus must be configured to accept the same number of channels, but the number of channels @@ -2087,7 +2072,7 @@ data from the graph: ``` When you read audio data, miniaudio starts at the node graph's endpoint node which then pulls in -data from its input attachments, which in turn recursively pull in data from their inputs, and so +data from it's input attachments, which in turn recursively pull in data from their inputs, and so on. At the start of the graph there will be some kind of data source node which will have zero inputs and will instead read directly from a data source. The base nodes don't literally need to read from a `ma_data_source` object, but they will always have some kind of underlying object that @@ -2333,7 +2318,7 @@ You can start and stop a node with the following: By default the node is in a started state, but since it won't be connected to anything won't actually be invoked by the node graph until it's connected. When you stop a node, data will not be -read from any of its input connections. You can use this property to stop a group of sounds +read from any of it's input connections. You can use this property to stop a group of sounds atomically. You can configure the initial state of a node in it's config: @@ -2426,29 +2411,29 @@ audio thread is finished so that control is not handed back to the caller thereb chance to free the node's memory. When the audio thread is processing a node, it does so by reading from each of the output buses of -the node. In order for a node to process data for one of its output buses, it needs to read from -each of its input buses, and so on an so forth. It follows that once all output buses of a node +the node. In order for a node to process data for one of it's output buses, it needs to read from +each of it's input buses, and so on an so forth. It follows that once all output buses of a node are detached, the node as a whole will be disconnected and no further processing will occur unless it's output buses are reattached, which won't be happening when the node is being uninitialized. By having `ma_node_detach_output_bus()` wait until the audio thread is finished with it, we can simplify a few things, at the expense of making `ma_node_detach_output_bus()` a bit slower. By doing this, the implementation of `ma_node_uninit()` becomes trivial - just detach all output -nodes, followed by each of the attachments to each of its input nodes, and then do any final clean +nodes, followed by each of the attachments to each of it's input nodes, and then do any final clean up. With the above design, the worst-case scenario is `ma_node_detach_output_bus()` taking as long as it takes to process the output bus being detached. This will happen if it's called at just the wrong moment where the audio thread has just iterated it and has just started processing. The caller of `ma_node_detach_output_bus()` will stall until the audio thread is finished, which -includes the cost of recursively processing its inputs. This is the biggest compromise made with -the approach taken by miniaudio for its lock-free processing system. The cost of detaching nodes +includes the cost of recursively processing it's inputs. This is the biggest compromise made with +the approach taken by miniaudio for it's lock-free processing system. The cost of detaching nodes earlier in the pipeline (data sources, for example) will be cheaper than the cost of detaching higher level nodes, such as some kind of final post-processing endpoint. If you need to do mass detachments, detach starting from the lowest level nodes and work your way towards the final endpoint node (but don't try detaching the node graph's endpoint). If the audio thread is not running, detachment will be fast and detachment in any order will be the same. The reason nodes need to wait for their input attachments to complete is due to the potential for desyncs between -data sources. If the node was to terminate processing mid way through processing its inputs, +data sources. If the node was to terminate processing mid way through processing it's inputs, there's a chance that some of the underlying data sources will have been read, but then others not. That will then result in a potential desynchronization when detaching and reattaching higher-level nodes. A possible solution to this is to have an option when detaching to terminate processing @@ -2592,25 +2577,20 @@ A custom decoder must implement a data source. A vtable called `ma_decoding_back to be implemented which is then passed into the decoder config: ```c - ma_decoding_backend_vtable* pBackendVTables[] = + ma_decoding_backend_vtable* pCustomBackendVTables[] = { - ma_decoding_backend_libvorbis, - ma_decoding_backend_libopus, - ma_decoding_backend_wav, - ma_decoding_backend_flac, - ma_decoding_backend_mp3 + &g_ma_decoding_backend_vtable_libvorbis, + &g_ma_decoding_backend_vtable_libopus }; ... decoderConfig = ma_decoder_config_init_default(); - decoderConfig.ppBackendVTables = pBackendVTables; - decoderConfig.backendCount = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]); + decoderConfig.pCustomBackendUserData = NULL; + decoderConfig.ppCustomBackendVTables = pCustomBackendVTables; + decoderConfig.customBackendCount = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]); ``` -Note that when specify your own decoding backends, you must explicitly include any stock backends -you want to use, and in the order in which you want them to be tried. - The `ma_decoding_backend_vtable` vtable has the following functions: ``` @@ -2618,8 +2598,7 @@ The `ma_decoding_backend_vtable` vtable has the following functions: onInitFile onInitFileW onInitMemory - onUninit, - onGetEncodingFormat + onUninit ``` There are only two functions that must be implemented - `onInit` and `onUninit`. The other @@ -2652,14 +2631,6 @@ initialization routine is clean. When a decoder is uninitialized, the `onUninit` callback will be fired which will give you an opportunity to clean up and internal data. -The `onGetEncodingFormat` function is used to retrieve the encoding format of the data source. This -is used as a hint to help miniaudio determine which decoding backend to use. If you don't know the -encoding format, you can return `ma_encoding_format_unknown` and miniaudio will deal with it for -you through trial and error. - -The miniaudio repository includes some examples of custom decoders in the "extras" folder. The -"custom_decoder" example demonstrates how to use a custom decoder with miniaudio. - 9. Encoding @@ -2833,7 +2804,7 @@ weights. Custom weights can be passed in as the last parameter of `ma_channel_converter_config_init()`. Predefined channel maps can be retrieved with `ma_channel_map_init_standard()`. This takes a -`ma_standard_channel_map` enum as its first parameter, which can be one of the following: +`ma_standard_channel_map` enum as it's first parameter, which can be one of the following: +-----------------------------------+-----------------------------------------------------------+ | Name | Description | @@ -3752,7 +3723,7 @@ extern "C" { #define MA_VERSION_MAJOR 0 #define MA_VERSION_MINOR 11 -#define MA_VERSION_REVISION 22 +#define MA_VERSION_REVISION 21 #define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION) #if defined(_MSC_VER) && !defined(__clang__) @@ -3834,7 +3805,7 @@ typedef void* ma_handle; typedef void* ma_ptr; /* -ma_proc is annoying because when compiling with GCC we get pedantic warnings about converting +ma_proc is annoying because when compiling with GCC we get pendantic warnings about converting between `void*` and `void (*)()`. We can't use `void (*)()` with MSVC however, because we'll get warning C4191 about "type cast between incompatible function types". To work around this I'm going to use a different data type depending on the compiler. @@ -4028,7 +3999,7 @@ Special wchar_t type to ensure any structures in the public sections that refere consistent size across all platforms. On Windows, wchar_t is 2 bytes, whereas everywhere else it's 4 bytes. Since Windows likes to use -wchar_t for its IDs, we need a special explicitly sized wchar type that is always 2 bytes on all +wchar_t for it's IDs, we need a special explicitly sized wchar type that is always 2 bytes on all platforms. */ #if !defined(MA_POSIX) && defined(MA_WIN32) @@ -4039,66 +4010,6 @@ typedef ma_uint16 ma_wchar_win32; -/* -Basic Functions -=============== -These are mainly for custom backends so they can make use of some useful functionality without having -to reimplement it themselves. -*/ -#define ma_countof(x) (sizeof(x) / sizeof(x[0])) -#define ma_max(x, y) (((x) > (y)) ? (x) : (y)) -#define ma_min(x, y) (((x) < (y)) ? (x) : (y)) -#define ma_abs(x) (((x) > 0) ? (x) : -(x)) -#define ma_clamp(x, lo, hi) (ma_max(lo, ma_min(x, hi))) -#define ma_offset_ptr(p, offset) (((ma_uint8*)(p)) + (offset)) -#define ma_align(x, a) ((x + (a-1)) & ~(a-1)) -#define ma_align_64(x) ma_align(x, 8) - -MA_API MA_NO_INLINE int ma_strncpy_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count); - -/* Thanks to good old Bit Twiddling Hacks for this one: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */ -static MA_INLINE unsigned int ma_next_power_of_2(unsigned int x) -{ - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - x++; - - return x; -} - - - - -/* -Default Data Formats -==================== -These are made public for custom backends so they can consistently make use of standard defaults. The only -time you should be using these are within the implementations of custom backends. It's not recommended to -use these directly in a device config. Instead set them to ma_format_f32 (for format) and 0 for channels and -sample rate. -*/ - -/* The default format when ma_format_unknown (0) is requested when initializing a device. */ -#ifndef MA_DEFAULT_FORMAT -#define MA_DEFAULT_FORMAT ma_format_f32 -#endif - -/* The default channel count to use when 0 is used when initializing a device. */ -#ifndef MA_DEFAULT_CHANNELS -#define MA_DEFAULT_CHANNELS 2 -#endif - -/* The default sample rate to use when 0 is used when initializing a device. */ -#ifndef MA_DEFAULT_SAMPLE_RATE -#define MA_DEFAULT_SAMPLE_RATE 48000 -#endif - - - /* Logging Levels ============== @@ -4114,7 +4025,7 @@ MA_LOG_LEVEL_INFO callback. MA_LOG_LEVEL_WARNING - Warnings. You should enable this in you development builds and action them when encountered. These + Warnings. You should enable this in you development builds and action them when encounted. These logs usually indicate a potential problem or misconfiguration, but still allow you to keep running. This will never be called from within the data callback. @@ -4618,20 +4529,6 @@ MA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat, ...) MA_ATTRIBUTE_FORMAT(3, 4); - -/************************************************************************************************************************************************************** - -Dynamic Linking - -These functions are available for use by custom backends so they can dynamically link to their backend libraries at runtime. - -**************************************************************************************************************************************************************/ -MA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename); -MA_API void ma_dlclose(ma_log* pLog, ma_handle handle); -MA_API ma_proc ma_dlsym(ma_log* pLog, ma_handle handle, const char* symbol); - - - /************************************************************************************************************************************************************** Biquad Filtering @@ -5054,6 +4951,8 @@ typedef struct ma_uint32 sampleRate; ma_uint32 delayInFrames; ma_bool32 delayStart; /* Set to true to delay the start of the output; false otherwise. */ + float wet; /* 0..1. Default = 1. */ + float dry; /* 0..1. Default = 1. */ float decay; /* 0..1. Default = 0 (no feedback). Feedback decay. Use this for echo. */ } ma_delay_config; @@ -5071,6 +4970,10 @@ typedef struct MA_API ma_result ma_delay_init(const ma_delay_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay* pDelay); MA_API void ma_delay_uninit(ma_delay* pDelay, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount); +MA_API void ma_delay_set_wet(ma_delay* pDelay, float value); +MA_API float ma_delay_get_wet(const ma_delay* pDelay); +MA_API void ma_delay_set_dry(ma_delay* pDelay, float value); +MA_API float ma_delay_get_dry(const ma_delay* pDelay); MA_API void ma_delay_set_decay(ma_delay* pDelay, float value); MA_API float ma_delay_get_decay(const ma_delay* pDelay); @@ -5554,7 +5457,7 @@ input frames. MA_API ma_result ma_resampler_get_expected_output_frame_count(const ma_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount); /* -Resets the resampler's timer and clears its internal cache. +Resets the resampler's timer and clears it's internal cache. */ MA_API ma_result ma_resampler_reset(ma_resampler* pResampler); @@ -5775,7 +5678,7 @@ MA_API void ma_channel_map_init_standard(ma_standard_channel_map standardChannel /* Copies a channel map. -Both input and output channel map buffers must have a capacity of at least `channels`. +Both input and output channel map buffers must have a capacity of at at least `channels`. */ MA_API void ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels); @@ -5944,10 +5847,10 @@ typedef struct const void* pData; } ma_audio_buffer_ref; -MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef); +MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef); MA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef); MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames); -MA_API ma_result ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); +MA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop); MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex); MA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount); MA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount); /* Returns MA_AT_END if the end has been reached. This should be considered successful. */ @@ -5968,7 +5871,7 @@ typedef struct ma_allocation_callbacks allocationCallbacks; } ma_audio_buffer_config; -MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks); typedef struct { @@ -5983,7 +5886,7 @@ MA_API ma_result ma_audio_buffer_init_copy(const ma_audio_buffer_config* pConfig MA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer** ppAudioBuffer); /* Always copies the data. Doesn't make sense to use this otherwise. Use ma_audio_buffer_uninit_and_free() to uninit. */ MA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer); MA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer); -MA_API ma_result ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); +MA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop); MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex); MA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount); MA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount); /* Returns MA_AT_END if the end has been reached. This should be considered successful. */ @@ -6279,12 +6182,6 @@ MA_API ma_result ma_event_wait(ma_event* pEvent); Signals the specified auto-reset event. */ MA_API ma_result ma_event_signal(ma_event* pEvent); - - -MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore); -MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore); -MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore); -MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore); #endif /* MA_NO_THREADING */ @@ -6326,7 +6223,6 @@ typedef void ma_async_notification; typedef struct { void (* onSignal)(ma_async_notification* pNotification); - void* pUserData; } ma_async_notification_callbacks; MA_API ma_result ma_async_notification_signal(ma_async_notification* pNotification); @@ -6936,6 +6832,28 @@ typedef void (* ma_device_data_proc)(ma_device* pDevice, void* pOutput, const vo + +/* +DEPRECATED. Use ma_device_notification_proc instead. + +The callback for when the device has been stopped. + +This will be called when the device is stopped explicitly with `ma_device_stop()` and also called implicitly when the device is stopped through external forces +such as being unplugged or an internal error occurring. + + +Parameters +---------- +pDevice (in) + A pointer to the device that has just stopped. + + +Remarks +------- +Do not restart or uninitialize the device from the callback. +*/ +typedef void (* ma_stop_proc)(ma_device* pDevice); /* DEPRECATED. Use ma_device_notification_proc instead. */ + typedef enum { ma_device_type_playback = 1, @@ -7089,19 +7007,9 @@ typedef union } ma_device_id; -typedef struct ma_context_config ma_context_config; -typedef struct ma_device_config ma_device_config; -typedef struct ma_device_backend_vtable ma_device_backend_vtable; -typedef struct ma_backend_callbacks ma_backend_callbacks; - -/* For defining vtables, configs and user data pointers for custom backends. */ -typedef struct -{ - const ma_device_backend_vtable* pVTable; /* The vtable of the backend. */ - const void* pConfig; /* Contextual based on whether or not this is being used for a context or device. The object this points to depends on the backend. */ - void* pUserData; /* User data pointer passed into each callback in the vtable. */ -} ma_device_backend_spec; - +typedef struct ma_context_config ma_context_config; +typedef struct ma_device_config ma_device_config; +typedef struct ma_backend_callbacks ma_backend_callbacks; #define MA_DATA_FORMAT_FLAG_EXCLUSIVE_MODE (1U << 1) /* If set, this is supported in exclusive mode. Otherwise not natively supported by exclusive mode. */ @@ -7140,6 +7048,7 @@ struct ma_device_config ma_bool8 noFixedSizedCallback; /* Disables strict fixed-sized data callbacks. Setting this to true will result in the period size being treated only as a hint to the backend. This is an optimization for those who don't need fixed sized callbacks. */ ma_device_data_proc dataCallback; ma_device_notification_proc notificationCallback; + ma_stop_proc stopCallback; void* pUserData; ma_resampler_config resampling; struct @@ -7204,11 +7113,6 @@ struct ma_device_config ma_bool32 noAutoStartAfterReroute; ma_bool32 enableCompatibilityWorkarounds; } aaudio; - struct - { - ma_device_backend_spec* pBackends; - size_t count; - } custom; }; @@ -7280,7 +7184,7 @@ and on output returns detailed information about the device in `ma_device_info`. case when the device ID is NULL, in which case information about the default device needs to be retrieved. Once the context has been created and the device ID retrieved (if using anything other than the default device), the device can be created. -This is a little bit more complicated than initialization of the context due to its more complicated configuration. When initializing a +This is a little bit more complicated than initialization of the context due to it's more complicated configuration. When initializing a device, a duplex device may be requested. This means a separate data format needs to be specified for both playback and capture. On input, the data format is set to what the application wants. On output it's set to the native format which should match as closely as possible to the requested format. The conversion between the format requested by the application and the device's native format will be handled @@ -7301,10 +7205,10 @@ asynchronous reading and writing, `onDeviceStart()` and `onDeviceStop()` should The handling of data delivery between the application and the device is the most complicated part of the process. To make this a bit easier, some helper callbacks are available. If the backend uses a blocking read/write style of API, the `onDeviceRead()` and `onDeviceWrite()` callbacks can optionally be implemented. These are blocking and work just like reading and writing from a file. If the -backend uses a callback for data delivery, that callback must call `ma_device_handle_backend_data_callback()` from within its callback. +backend uses a callback for data delivery, that callback must call `ma_device_handle_backend_data_callback()` from within it's callback. This allows miniaudio to then process any necessary data conversion and then pass it to the miniaudio data callback. -If the backend requires absolute flexibility with its data delivery, it can optionally implement the `onDeviceDataLoop()` callback +If the backend requires absolute flexibility with it's data delivery, it can optionally implement the `onDeviceDataLoop()` callback which will allow it to implement the logic that will run on the audio thread. This is much more advanced and is completely optional. The audio thread should run data delivery logic in a loop while `ma_device_get_state() == ma_device_state_started` and no errors have been @@ -7336,32 +7240,6 @@ struct ma_backend_callbacks ma_result (* onDeviceGetInfo)(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo); }; -struct ma_device_backend_vtable -{ - ma_result (* onContextInit )(void* pUserData, ma_context* pContext, const ma_context_config* pConfig); - ma_result (* onContextUninit )(void* pUserData, ma_context* pContext); - ma_result (* onContextEnumerateDevices)(void* pUserData, ma_context* pContext, ma_enum_devices_callback_proc callback, void* pCallbackUserData); - ma_result (* onContextGetDeviceInfo )(void* pUserData, ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo); - ma_result (* onDeviceInit )(void* pUserData, ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture); - ma_result (* onDeviceUninit )(void* pUserData, ma_device* pDevice); - ma_result (* onDeviceStart )(void* pUserData, ma_device* pDevice); - ma_result (* onDeviceStop )(void* pUserData, ma_device* pDevice); - ma_result (* onDeviceRead )(void* pUserData, ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead); - ma_result (* onDeviceWrite )(void* pUserData, ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten); - ma_result (* onDeviceDataLoop )(void* pUserData, ma_device* pDevice); - ma_result (* onDeviceDataLoopWakeup )(void* pUserData, ma_device* pDevice); - ma_result (* onDeviceGetInfo )(void* pUserData, ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo); - - /* This is temporary while we migrate backends over to the new callback system. */ - ma_bool32 (* onHasStart )(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasStop )(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasRead )(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasWrite )(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasDataLoop )(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasDataLoopWakeup)(void* pUserData, ma_context* pContext); - ma_bool32 (* onHasDeviceGetInfo )(void* pUserData, ma_context* pContext); -}; - struct ma_context_config { ma_log* pLog; @@ -7370,10 +7248,6 @@ struct ma_context_config void* pUserData; ma_allocation_callbacks allocationCallbacks; struct - { - ma_handle hWnd; /* HWND. Optional window handle to pass into SetCooperativeLevel(). Will default to the foreground window, and if that fails, the desktop window. */ - } dsound; - struct { ma_bool32 useVerboseDeviceEnumeration; } alsa; @@ -7395,11 +7269,7 @@ struct ma_context_config const char* pClientName; ma_bool32 tryStartServer; } jack; - struct - { - ma_device_backend_spec* pBackends; - size_t count; - } custom; + ma_backend_callbacks custom; }; /* WASAPI specific structure for some commands which must run on a common thread due to bugs in WASAPI. */ @@ -7430,10 +7300,7 @@ typedef struct struct ma_context { - ma_backend_callbacks callbacks; /* Old system. Will be removed when all stock backends have been converted over to the new system. */ - const ma_device_backend_vtable* pVTable; /* New system. */ - void* pVTableUserData; - void* pBackendData; /* This is not used by miniaudio, but is a way for custom backends to store associate some backend-specific data with the device. Custom backends are free to use this pointer however they like. */ + ma_backend_callbacks callbacks; ma_backend backend; /* DirectSound, ALSA, etc. */ ma_log* pLog; ma_log log; /* Only used if the log is owned by the context. The pLog member will be set to &log in this case. */ @@ -7469,7 +7336,6 @@ struct ma_context #ifdef MA_SUPPORT_DSOUND struct { - ma_handle hWnd; /* Can be null. */ ma_handle hDSoundDLL; ma_proc DirectSoundCreate; ma_proc DirectSoundEnumerateA; @@ -7847,8 +7713,8 @@ struct ma_device ma_atomic_device_state state; /* The state of the device is variable and can change at any time on any thread. Must be used atomically. */ ma_device_data_proc onData; /* Set once at initialization time and should not be changed after. */ ma_device_notification_proc onNotification; /* Set once at initialization time and should not be changed after. */ + ma_stop_proc onStop; /* DEPRECATED. Use the notification callback instead. Set once at initialization time and should not be changed after. */ void* pUserData; /* Application defined data. */ - void* pBackendData; /* This is not used by miniaudio, but is a way for custom backends to associate some backend-specific data with the device. Custom backends are free to use this pointer however they like. */ ma_mutex startStopLock; ma_event wakeupEvent; ma_event startEvent; @@ -7876,6 +7742,7 @@ struct ma_device { ma_device_id* pID; /* Set to NULL if using default ID, otherwise set to the address of "id". */ ma_device_id id; /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */ + char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; /* Maybe temporary. Likely to be replaced with a query API. */ ma_share_mode shareMode; /* Set to whatever was passed in when the device was initialized. */ ma_format format; ma_uint32 channels; @@ -7901,6 +7768,7 @@ struct ma_device { ma_device_id* pID; /* Set to NULL if using default ID, otherwise set to the address of "id". */ ma_device_id id; /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */ + char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; /* Maybe temporary. Likely to be replaced with a query API. */ ma_share_mode shareMode; /* Set to whatever was passed in when the device was initialized. */ ma_format format; ma_uint32 channels; @@ -8161,19 +8029,6 @@ ma_context_init() */ MA_API ma_context_config ma_context_config_init(void); - -/* -Helper function for retrieving a pointer to a custom backend's context config. - - -Remarks -------- -This should only ever be used by custom backend implementations. It's used for retrieving the -pConfig pointer that has been associated with the specified backend vtable. -*/ -MA_API const void* ma_context_config_find_custom_backend_config(const ma_context_config* pConfig, const ma_device_backend_vtable* pVTable); - - /* Initializes a context. @@ -8682,18 +8537,6 @@ ma_device_init_ex() MA_API ma_device_config ma_device_config_init(ma_device_type deviceType); -/* -Helper function for retrieving a pointer to a custom backend's context config. - - -Remarks -------- -This should only ever be used by custom backend implementations. It's used for retrieving the -pConfig pointer that has been associated with the specified backend vtable. -*/ -MA_API const void* ma_device_config_find_custom_backend_config(const ma_device_config* pConfig, const ma_device_backend_vtable* pVTable); - - /* Initializes a device. @@ -8702,7 +8545,7 @@ from a microphone. Whether or not you should send or receive data from the devic playback, capture, full-duplex or loopback. (Note that loopback mode is only supported on select backends.) Sending and receiving audio data to and from the device is done via a callback which is fired by miniaudio at periodic time intervals. -The frequency at which data is delivered to and from a device depends on the size of its period. The size of the period can be defined in terms of PCM frames +The frequency at which data is delivered to and from a device depends on the size of it's period. The size of the period can be defined in terms of PCM frames or milliseconds, whichever is more convenient. Generally speaking, the smaller the period, the lower the latency at the expense of higher CPU usage and increased risk of glitching due to the more frequent and granular data deliver intervals. The size of a period will depend on your requirements, but miniaudio's defaults should work fine for most scenarios. If you're building a game you should leave this fairly small, whereas if you're building a simple @@ -8776,7 +8619,7 @@ then be set directly on the structure. Below are the members of the `ma_device_c performanceProfile A hint to miniaudio as to the performance requirements of your program. Can be either `ma_performance_profile_low_latency` (default) or - `ma_performance_profile_conservative`. This mainly affects the size of default buffers and can usually be left at its default value. + `ma_performance_profile_conservative`. This mainly affects the size of default buffers and can usually be left at it's default value. noPreSilencedOutputBuffer When set to true, the contents of the output buffer passed into the data callback will be left undefined. When set to false (default), the contents of @@ -8816,7 +8659,7 @@ then be set directly on the structure. Below are the members of the `ma_device_c A pointer that will passed to callbacks in pBackendVTable. resampling.linear.lpfOrder - The linear resampler applies a low-pass filter as part of its processing for anti-aliasing. This setting controls the order of the filter. The higher + The linear resampler applies a low-pass filter as part of it's processing for anti-aliasing. This setting controls the order of the filter. The higher the value, the better the quality, in general. Setting this to 0 will disable low-pass filtering altogether. The maximum value is `MA_MAX_FILTER_ORDER`. The default value is `min(4, MA_MAX_FILTER_ORDER)`. @@ -9066,7 +8909,7 @@ Unsafe. It is not safe to call this inside any callback. Remarks ------- -You only need to use this function if you want to configure the context differently to its defaults. You should never use this function if you want to manage +You only need to use this function if you want to configure the context differently to it's defaults. You should never use this function if you want to manage your own context. See the documentation for `ma_context_init()` for information on the different context configuration options. @@ -10013,8 +9856,7 @@ typedef enum ma_encoding_format_wav, ma_encoding_format_flac, ma_encoding_format_mp3, - ma_encoding_format_vorbis, - ma_encoding_format_opus + ma_encoding_format_vorbis } ma_encoding_format; #endif @@ -10031,25 +9873,22 @@ you do your own synchronization. typedef struct ma_decoder ma_decoder; -MA_API ma_encoding_format ma_encoding_format_from_path(const char* pFilePath); -MA_API ma_encoding_format ma_encoding_format_from_path_w(const wchar_t* pFilePath); - - typedef struct { ma_format preferredFormat; - ma_uint32 seekPointCount; /* Set to > 0 to generate a seektable if the decoding backend supports it. */ - ma_encoding_format encodingFormat; /* This is the encoding format that the caller wants to use. If set to ma_encoding_format_unknown, the decoding backend should try initializing from any of it's supported formats. */ + ma_uint32 seekPointCount; /* Set to > 0 to generate a seektable if the decoding backend supports it. */ } ma_decoding_backend_config; +MA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount); + + typedef struct { - ma_result (* onInit )(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); - ma_result (* onInitFile )(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - ma_result (* onInitFileW )(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - ma_result (* onInitMemory )(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - void (* onUninit )(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks); - ma_encoding_format (* onGetEncodingFormat)(void* pUserData, ma_data_source* pBackend); /* Optional, in which case ma_encoding_format_unknown will be assumed. When pBackend is not null, return the actual encoding format of the decoder if known. If pBackend is null, return the format supported by the backend. Return ma_encoding_format_unknown if the backend supports multiple formats. */ + ma_result (* onInit )(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); + ma_result (* onInitFile )(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ + ma_result (* onInitFileW )(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ + ma_result (* onInitMemory)(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ + void (* onUninit )(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks); } ma_decoding_backend_vtable; @@ -10069,9 +9908,9 @@ typedef struct ma_allocation_callbacks allocationCallbacks; ma_encoding_format encodingFormat; ma_uint32 seekPointCount; /* When set to > 0, specifies the number of seek points to use for the generation of a seek table. Not all decoding backends support this. */ - const ma_decoding_backend_vtable** ppBackendVTables; - void** ppBackendUserData; - ma_uint32 backendCount; + ma_decoding_backend_vtable** ppCustomBackendVTables; + ma_uint32 customBackendCount; + void* pCustomBackendUserData; } ma_decoder_config; struct ma_decoder @@ -10092,7 +9931,7 @@ struct ma_decoder void* pInputCache; /* In input format. Can be null if it's not needed. */ ma_uint64 inputCacheCap; /* The capacity of the input cache. */ ma_uint64 inputCacheConsumed; /* The number of frames that have been consumed in the cache. Used for determining the next valid frame. */ - ma_uint64 inputCacheRemaining; /* The number of valid frames remaining in the cache. */ + ma_uint64 inputCacheRemaining; /* The number of valid frames remaining in the cahce. */ ma_allocation_callbacks allocationCallbacks; union { @@ -10133,7 +9972,7 @@ This is not thread safe without your own synchronization. MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); /* -Seeks to a PCM frame based on its absolute index. +Seeks to a PCM frame based on it's absolute index. This is not thread safe without your own synchronization. */ @@ -10176,14 +10015,6 @@ returned. */ MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64* pAvailableFrames); -/* -Retrieves the encoding format of the given decoder. - -This is just a hint, and some decoding backends may return `ma_encoding_format_unknown`. This is not an error as -it may just mean the decoding backend is a format not recognized by the enumeration in miniaudio. -*/ -MA_API ma_encoding_format ma_decoder_get_encoding_format(const ma_decoder* pDecoder); - /* Helper for opening and decoding a file into a heap allocated block of memory. Free the returned pointer with ma_free(). On input, pConfig should be set to what you want. On output it will be set to what you got. @@ -10192,12 +10023,6 @@ MA_API ma_result ma_decode_from_vfs(ma_vfs* pVFS, const char* pFilePath, ma_deco MA_API ma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut); MA_API ma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut); - -/* Expose our decoding backend vtables so they can be plugged into a priority list. */ -extern const ma_decoding_backend_vtable* ma_decoding_backend_wav; -extern const ma_decoding_backend_vtable* ma_decoding_backend_flac; -extern const ma_decoding_backend_vtable* ma_decoding_backend_mp3; - #endif /* MA_NO_DECODING */ @@ -10381,6 +10206,7 @@ MA_API void ma_noise_uninit(ma_noise* pNoise, const ma_allocation_callbacks* pAl MA_API ma_result ma_noise_read_pcm_frames(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); MA_API ma_result ma_noise_set_amplitude(ma_noise* pNoise, double amplitude); MA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed); +MA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type); #endif /* MA_NO_GENERATION */ @@ -10409,8 +10235,7 @@ typedef enum MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE = 0x00000002, /* Decode data before storing in memory. When set, decoding is done at the resource manager level rather than the mixing thread. Results in faster mixing, but higher memory usage. */ MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC = 0x00000004, /* When set, the resource manager will load the data source asynchronously. */ MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT = 0x00000008, /* When set, waits for initialization of the underlying data source before returning from ma_resource_manager_data_source_init(). */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH = 0x00000010, /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING = 0x00000020 /* When set, configures the data source to loop by default. */ + MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH = 0x00000010 /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */ } ma_resource_manager_data_source_flags; @@ -10433,6 +10258,26 @@ MA_API ma_resource_manager_pipeline_notifications ma_resource_manager_pipeline_n +/* BEGIN BACKWARDS COMPATIBILITY */ +/* TODO: Remove this block in version 0.12. */ +#if 1 +#define ma_resource_manager_job ma_job +#define ma_resource_manager_job_init ma_job_init +#define MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_FLAG_NON_BLOCKING MA_JOB_QUEUE_FLAG_NON_BLOCKING +#define ma_resource_manager_job_queue_config ma_job_queue_config +#define ma_resource_manager_job_queue_config_init ma_job_queue_config_init +#define ma_resource_manager_job_queue ma_job_queue +#define ma_resource_manager_job_queue_get_heap_size ma_job_queue_get_heap_size +#define ma_resource_manager_job_queue_init_preallocated ma_job_queue_init_preallocated +#define ma_resource_manager_job_queue_init ma_job_queue_init +#define ma_resource_manager_job_queue_uninit ma_job_queue_uninit +#define ma_resource_manager_job_queue_post ma_job_queue_post +#define ma_resource_manager_job_queue_next ma_job_queue_next +#endif +/* END BACKWARDS COMPATIBILITY */ + + + /* Maximum job thread count will be restricted to this, but this may be removed later and replaced with a heap allocation thereby removing any limitation. */ #ifndef MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT @@ -10458,6 +10303,7 @@ typedef struct ma_uint64 rangeEndInPCMFrames; ma_uint64 loopPointBegInPCMFrames; ma_uint64 loopPointEndInPCMFrames; + ma_bool32 isLooping; ma_uint32 flags; } ma_resource_manager_data_source_config; @@ -10588,9 +10434,9 @@ typedef struct ma_uint32 jobQueueCapacity; /* The maximum number of jobs that can fit in the queue at a time. Defaults to MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY. Cannot be zero. */ ma_uint32 flags; ma_vfs* pVFS; /* Can be NULL in which case defaults will be used. */ - const ma_decoding_backend_vtable** ppDecodingBackendVTables; - ma_uint32 decodingBackendCount; - void** ppDecodingBackendUserData; + ma_decoding_backend_vtable** ppCustomDecodingBackendVTables; + ma_uint32 customDecodingBackendCount; + void* pCustomDecodingBackendUserData; } ma_resource_manager_config; MA_API ma_resource_manager_config ma_resource_manager_config_init(void); @@ -10701,16 +10547,6 @@ Node Graph /* Use this when the bus count is determined by the node instance rather than the vtable. */ #define MA_NODE_BUS_COUNT_UNKNOWN 255 - -/* For some internal memory management of ma_node_graph. */ -typedef struct -{ - size_t offset; - size_t sizeInBytes; - unsigned char _data[1]; -} ma_stack; - - typedef struct ma_node_graph ma_node_graph; typedef void ma_node; @@ -10835,14 +10671,10 @@ typedef struct ma_node_base ma_node_base; struct ma_node_base { /* These variables are set once at startup. */ - ma_node_graph* pNodeGraph; /* The graph this node belongs to. */ + ma_node_graph* pNodeGraph; /* The graph this node belongs to. */ const ma_node_vtable* vtable; - ma_uint32 inputBusCount; - ma_uint32 outputBusCount; - ma_node_input_bus* pInputBuses; - ma_node_output_bus* pOutputBuses; - float* pCachedData; /* Allocated on the heap. Fixed size. Needs to be stored on the heap because reading from output buses is done in separate function calls. */ - ma_uint16 cachedDataCapInFramesPerBus; /* The capacity of the input data cache in frames, per bus. */ + float* pCachedData; /* Allocated on the heap. Fixed size. Needs to be stored on the heap because reading from output buses is done in separate function calls. */ + ma_uint16 cachedDataCapInFramesPerBus; /* The capacity of the input data cache in frames, per bus. */ /* These variables are read and written only from the audio thread. */ ma_uint16 cachedFrameCountOut; @@ -10850,9 +10682,13 @@ struct ma_node_base ma_uint16 consumedFrameCountIn; /* These variables are read and written between different threads. */ - MA_ATOMIC(4, ma_node_state) state; /* When set to stopped, nothing will be read, regardless of the times in stateTimes. */ - MA_ATOMIC(8, ma_uint64) stateTimes[2]; /* Indexed by ma_node_state. Specifies the time based on the global clock that a node should be considered to be in the relevant state. */ - MA_ATOMIC(8, ma_uint64) localTime; /* The node's local clock. This is just a running sum of the number of output frames that have been processed. Can be modified by any thread with `ma_node_set_time()`. */ + MA_ATOMIC(4, ma_node_state) state; /* When set to stopped, nothing will be read, regardless of the times in stateTimes. */ + MA_ATOMIC(8, ma_uint64) stateTimes[2]; /* Indexed by ma_node_state. Specifies the time based on the global clock that a node should be considered to be in the relevant state. */ + MA_ATOMIC(8, ma_uint64) localTime; /* The node's local clock. This is just a running sum of the number of output frames that have been processed. Can be modified by any thread with `ma_node_set_time()`. */ + ma_uint32 inputBusCount; + ma_uint32 outputBusCount; + ma_node_input_bus* pInputBuses; + ma_node_output_bus* pOutputBuses; /* Memory management. */ ma_node_input_bus _inputBuses[MA_MAX_NODE_LOCAL_BUS_COUNT]; @@ -10888,8 +10724,7 @@ MA_API ma_result ma_node_set_time(ma_node* pNode, ma_uint64 localTime); typedef struct { ma_uint32 channels; - ma_uint32 processingSizeInFrames; /* This is the preferred processing size for node processing callbacks unless overridden by a node itself. Can be 0 in which case it will be based on the frame count passed into ma_node_graph_read_pcm_frames(), but will not be well defined. */ - size_t preMixStackSizeInBytes; /* Defaults to 512KB per channel. Reducing this will save memory, but the depth of your node graph will be more restricted. */ + ma_uint16 nodeCacheCapInFrames; } ma_node_graph_config; MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels); @@ -10897,19 +10732,13 @@ MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels); struct ma_node_graph { - ma_data_source_base ds; - /* Immutable. */ - ma_node_base endpoint; /* Special node that all nodes eventually connect to. Data is read from this node in ma_node_graph_read_pcm_frames(). */ - float* pProcessingCache; /* This will be allocated when processingSizeInFrames is non-zero. This is needed because ma_node_graph_read_pcm_frames() can be called with a variable number of frames, and we may need to do some buffering in situations where the caller requests a frame count that's not a multiple of processingSizeInFrames. */ - ma_uint32 processingCacheFramesRemaining; - ma_uint32 processingSizeInFrames; + ma_node_base base; /* The node graph itself is a node so it can be connected as an input to different node graph. This has zero inputs and calls ma_node_graph_read_pcm_frames() to generate it's output. */ + ma_node_base endpoint; /* Special node that all nodes eventually connect to. Data is read from this node in ma_node_graph_read_pcm_frames(). */ + ma_uint16 nodeCacheCapInFrames; /* Read and written by multiple threads. */ MA_ATOMIC(4, ma_bool32) isReading; - - /* Modified only by the audio thread. */ - ma_stack* pPreMixStack; }; MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph); @@ -11165,6 +10994,10 @@ typedef struct MA_API ma_result ma_delay_node_init(ma_node_graph* pNodeGraph, const ma_delay_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay_node* pDelayNode); MA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value); +MA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode); +MA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value); +MA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode); MA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value); MA_API float ma_delay_node_get_decay(const ma_delay_node* pDelayNode); #endif /* MA_NO_NODE_GRAPH */ @@ -11190,7 +11023,6 @@ typedef enum MA_SOUND_FLAG_ASYNC = 0x00000004, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC */ MA_SOUND_FLAG_WAIT_INIT = 0x00000008, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT */ MA_SOUND_FLAG_UNKNOWN_LENGTH = 0x00000010, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH */ - MA_SOUND_FLAG_LOOPING = 0x00000020, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING */ /* ma_sound specific flags. */ MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT = 0x00001000, /* Do not attach to the endpoint by default. Useful for when setting up nodes in a complex graph system. */ @@ -11230,7 +11062,7 @@ MA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_e /* Base node object for both ma_sound and ma_sound_group. */ typedef struct { - ma_node_base baseNode; /* Must be the first member for compatibility with the ma_node API. */ + ma_node_base baseNode; /* Must be the first member for compatiblity with the ma_node API. */ ma_engine* pEngine; /* A pointer to the engine. Set based on the value from the config. */ ma_uint32 sampleRate; /* The sample rate of the input data. For sounds backed by a data source, this will be the data source's sample rate. Otherwise it'll be the engine's sample rate. */ ma_uint32 volumeSmoothTimeInPCMFrames; @@ -11270,39 +11102,37 @@ MA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocati #define MA_SOUND_SOURCE_CHANNEL_COUNT 0xFFFFFFFF -typedef struct -{ - ma_fence* pLoadedFence; /* Set to NULL if not using a fence. */ - void (* onLoaded )(void* pUserData, ma_sound* pSuond); /* Fired by the resource manager when the sound has finished loading. */ - void (* onAtEnd )(void* pUserData, ma_sound* pSound); /* Fired when the sound reaches the end of the data source. */ - void (* onProcess)(void* pUserData, ma_sound* pSound, float* pFrames, ma_uint64 frameCount); - void* pUserData; -} ma_sound_notifications; - -MA_API ma_sound_notifications ma_sound_notifications_init(void); - +/* Callback for when a sound reaches the end. */ +typedef void (* ma_sound_end_proc)(void* pUserData, ma_sound* pSound); typedef struct { - const char* pFilePath; /* Set this to load from the resource manager. */ - const wchar_t* pFilePathW; /* Set this to load from the resource manager. */ - ma_data_source* pDataSource; /* Set this to load from an existing data source. */ - ma_node* pInitialAttachment; /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */ - ma_uint32 initialAttachmentInputBusIndex; /* The index of the input bus of pInitialAttachment to attach the sound to. */ - ma_uint32 channelsIn; /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */ - ma_uint32 channelsOut; /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */ - ma_mono_expansion_mode monoExpansionMode; /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */ - ma_uint32 flags; /* A combination of MA_SOUND_FLAG_* flags. */ - ma_uint32 volumeSmoothTimeInPCMFrames; /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */ - ma_uint64 initialSeekPointInPCMFrames; /* Initializes the sound such that it's seeked to this location by default. */ + const char* pFilePath; /* Set this to load from the resource manager. */ + const wchar_t* pFilePathW; /* Set this to load from the resource manager. */ + ma_data_source* pDataSource; /* Set this to load from an existing data source. */ + ma_node* pInitialAttachment; /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */ + ma_uint32 initialAttachmentInputBusIndex; /* The index of the input bus of pInitialAttachment to attach the sound to. */ + ma_uint32 channelsIn; /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */ + ma_uint32 channelsOut; /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */ + ma_mono_expansion_mode monoExpansionMode; /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */ + ma_uint32 flags; /* A combination of MA_SOUND_FLAG_* flags. */ + ma_uint32 volumeSmoothTimeInPCMFrames; /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */ + ma_uint64 initialSeekPointInPCMFrames; /* Initializes the sound such that it's seeked to this location by default. */ ma_uint64 rangeBegInPCMFrames; ma_uint64 rangeEndInPCMFrames; ma_uint64 loopPointBegInPCMFrames; ma_uint64 loopPointEndInPCMFrames; - const ma_sound_notifications* pNotifications; /* A pointer to an object containing callbacks for when a sound has finished loading, reached the end, etc. A copy of this structure will be made internally. */ + ma_bool32 isLooping; + ma_sound_end_proc endCallback; /* Fired when the sound reaches the end. Will be fired from the audio thread. Do not restart, uninitialize or otherwise change the state of the sound from here. Instead fire an event or set a variable to indicate to a different thread to change the start of the sound. Will not be fired in response to a scheduled stop with ma_sound_set_stop_time_*(). */ + void* pEndCallbackUserData; +#ifndef MA_NO_RESOURCE_MANAGER + ma_resource_manager_pipeline_notifications initNotifications; +#endif + ma_fence* pDoneFence; /* Deprecated. Use initNotifications instead. Released when the resource manager has finished decoding the entire sound. Not used with streams. */ } ma_sound_config; -MA_API ma_sound_config ma_sound_config_init(ma_engine* pEngine); +MA_API ma_sound_config ma_sound_config_init(void); /* Deprecated. Will be removed in version 0.12. Use ma_sound_config_2() instead. */ +MA_API ma_sound_config ma_sound_config_init_2(ma_engine* pEngine); /* Will be renamed to ma_sound_config_init() in version 0.12. */ struct ma_sound { @@ -11310,7 +11140,8 @@ struct ma_sound ma_data_source* pDataSource; MA_ATOMIC(8, ma_uint64) seekTarget; /* The PCM frame index to seek to in the mixing thread. Set to (~(ma_uint64)0) to not perform any seeking. */ MA_ATOMIC(4, ma_bool32) atEnd; - ma_sound_notifications notifications; + ma_sound_end_proc endCallback; + void* pEndCallbackUserData; ma_bool8 ownsDataSource; /* @@ -11319,7 +11150,6 @@ struct ma_sound */ #ifndef MA_NO_RESOURCE_MANAGER ma_resource_manager_data_source* pResourceManagerDataSource; - ma_async_notification_callbacks resourceManagerDoneNotification; #endif }; @@ -11336,7 +11166,8 @@ struct ma_sound_inlined typedef ma_sound_config ma_sound_group_config; typedef ma_sound ma_sound_group; -MA_API ma_sound_group_config ma_sound_group_config_init(ma_engine* pEngine); /* Will be renamed to ma_sound_config_init() in version 0.12. */ +MA_API ma_sound_group_config ma_sound_group_config_init(void); /* Deprecated. Will be removed in version 0.12. Use ma_sound_config_2() instead. */ +MA_API ma_sound_group_config ma_sound_group_config_init_2(ma_engine* pEngine); /* Will be renamed to ma_sound_config_init() in version 0.12. */ typedef void (* ma_engine_process_proc)(void* pUserData, float* pFramesOut, ma_uint64 frameCount); @@ -11361,7 +11192,6 @@ typedef struct ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. If set to 0, will use gainSmoothTimeInMilliseconds. */ ma_uint32 gainSmoothTimeInMilliseconds; /* When set to 0, gainSmoothTimeInFrames will be used. If both are set to 0, a default value will be used. */ ma_uint32 defaultVolumeSmoothTimeInPCMFrames; /* Defaults to 0. Controls the default amount of smoothing to apply to volume changes to sounds. High values means more smoothing at the expense of high latency (will take longer to reach the new volume). */ - ma_uint32 preMixStackSizeInBytes; /* A stack is used for internal processing in the node graph. This allows you to configure the size of this stack. Smaller values will reduce the maximum depth of your node graph. You should rarely need to modify this. */ ma_allocation_callbacks allocationCallbacks; ma_bool32 noAutoStart; /* When set to true, requires an explicit call to ma_engine_start(). This is false by default, meaning the engine will be started automatically in ma_engine_init(). */ ma_bool32 noDevice; /* When set to true, don't create a default device. ma_engine_read_pcm_frames() can be called manually to read data. */ @@ -11376,12 +11206,12 @@ MA_API ma_engine_config ma_engine_config_init(void); struct ma_engine { - ma_node_graph nodeGraph; /* An engine is a node graph. It should be able to be plugged into any ma_node_graph API (with a cast) which means this must be the first member of this struct. */ + ma_node_graph nodeGraph; /* An engine is a node graph. It should be able to be plugged into any ma_node_graph API (with a cast) which means this must be the first member of this struct. */ #if !defined(MA_NO_RESOURCE_MANAGER) ma_resource_manager* pResourceManager; #endif #if !defined(MA_NO_DEVICE_IO) - ma_device* pDevice; /* Optionally set via the config, otherwise allocated by the engine in ma_engine_init(). */ + ma_device* pDevice; /* Optionally set via the config, otherwise allocated by the engine in ma_engine_init(). */ #endif ma_log* pLog; ma_uint32 sampleRate; @@ -11390,10 +11220,10 @@ struct ma_engine ma_allocation_callbacks allocationCallbacks; ma_bool8 ownsResourceManager; ma_bool8 ownsDevice; - ma_spinlock inlinedSoundLock; /* For synchronizing access to the inlined sound list. */ - ma_sound_inlined* pInlinedSoundHead; /* The first inlined sound. Inlined sounds are tracked in a linked list. */ - MA_ATOMIC(4, ma_uint32) inlinedSoundCount; /* The total number of allocated inlined sound objects. Used for debugging. */ - ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. */ + ma_spinlock inlinedSoundLock; /* For synchronizing access so the inlined sound list. */ + ma_sound_inlined* pInlinedSoundHead; /* The first inlined sound. Inlined sounds are tracked in a linked list. */ + MA_ATOMIC(4, ma_uint32) inlinedSoundCount; /* The total number of allocated inlined sound objects. Used for debugging. */ + ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. */ ma_uint32 defaultVolumeSmoothTimeInPCMFrames; ma_mono_expansion_mode monoExpansionMode; ma_engine_process_proc onProcess; @@ -11414,6 +11244,8 @@ MA_API ma_uint64 ma_engine_get_time_in_pcm_frames(const ma_engine* pEngine); MA_API ma_uint64 ma_engine_get_time_in_milliseconds(const ma_engine* pEngine); MA_API ma_result ma_engine_set_time_in_pcm_frames(ma_engine* pEngine, ma_uint64 globalTime); MA_API ma_result ma_engine_set_time_in_milliseconds(ma_engine* pEngine, ma_uint64 globalTime); +MA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine); /* Deprecated. Use ma_engine_get_time_in_pcm_frames(). Will be removed in version 0.12. */ +MA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime); /* Deprecated. Use ma_engine_set_time_in_pcm_frames(). Will be removed in version 0.12. */ MA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine); MA_API ma_uint32 ma_engine_get_sample_rate(const ma_engine* pEngine); @@ -11445,11 +11277,11 @@ MA_API ma_result ma_engine_play_sound(ma_engine* pEngine, const char* pFilePath, #endif #ifndef MA_NO_RESOURCE_MANAGER -MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound); -MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound); -MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound); +MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound); +MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound); +MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound); #endif -MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound); +MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound); MA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound); MA_API void ma_sound_uninit(ma_sound* pSound); MA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound); @@ -11521,6 +11353,7 @@ MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength); MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor); MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength); +MA_API ma_result ma_sound_set_end_callback(ma_sound* pSound, ma_sound_end_proc callback, void* pUserData); MA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup); MA_API ma_result ma_sound_group_init_ex(ma_engine* pEngine, const ma_sound_group_config* pConfig, ma_sound_group* pGroup); @@ -12242,6 +12075,21 @@ int ma_android_sdk_version() #endif +/* The default format when ma_format_unknown (0) is requested when initializing a device. */ +#ifndef MA_DEFAULT_FORMAT +#define MA_DEFAULT_FORMAT ma_format_f32 +#endif + +/* The default channel count to use when 0 is used when initializing a device. */ +#ifndef MA_DEFAULT_CHANNELS +#define MA_DEFAULT_CHANNELS 2 +#endif + +/* The default sample rate to use when 0 is used when initializing a device. */ +#ifndef MA_DEFAULT_SAMPLE_RATE +#define MA_DEFAULT_SAMPLE_RATE 48000 +#endif + /* Default periods when none is specified in ma_device_init(). More periods means more work on the CPU. */ #ifndef MA_DEFAULT_PERIODS #define MA_DEFAULT_PERIODS 3 @@ -12377,6 +12225,7 @@ static MA_INLINE void ma_zero_memory_default(void* p, size_t sz) } } + #ifndef MA_ZERO_MEMORY #define MA_ZERO_MEMORY(p, sz) ma_zero_memory_default((p), (sz)) #endif @@ -12389,6 +12238,15 @@ static MA_INLINE void ma_zero_memory_default(void* p, size_t sz) #define MA_ZERO_OBJECT(p) MA_ZERO_MEMORY((p), sizeof(*(p))) +#define ma_countof(x) (sizeof(x) / sizeof(x[0])) +#define ma_max(x, y) (((x) > (y)) ? (x) : (y)) +#define ma_min(x, y) (((x) < (y)) ? (x) : (y)) +#define ma_abs(x) (((x) > 0) ? (x) : -(x)) +#define ma_clamp(x, lo, hi) (ma_max(lo, ma_min(x, hi))) +#define ma_offset_ptr(p, offset) (((ma_uint8*)(p)) + (offset)) +#define ma_align(x, a) (((x) + ((a)-1)) & ~((a)-1)) +#define ma_align_64(x) ma_align(x, 8) + #define ma_buffer_frame_capacity(buffer, channels, format) (sizeof(buffer) / ma_get_bytes_per_sample(format) / (channels)) static MA_INLINE double ma_sind(double x) @@ -13432,6 +13290,19 @@ static MA_INLINE void ma_zero_memory_64(void* dst, ma_uint64 sizeInBytes) } +/* Thanks to good old Bit Twiddling Hacks for this one: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */ +static MA_INLINE unsigned int ma_next_power_of_2(unsigned int x) +{ + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x++; + + return x; +} static MA_INLINE unsigned int ma_prev_power_of_2(unsigned int x) { @@ -16271,34 +16142,19 @@ static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority if (priority == ma_thread_priority_idle) { sched.sched_priority = priorityMin; } else if (priority == ma_thread_priority_realtime) { - #if defined(MA_PTHREAD_REALTIME_THREAD_PRIORITY) - { - sched.sched_priority = MA_PTHREAD_REALTIME_THREAD_PRIORITY; + sched.sched_priority = priorityMax; + } else { + sched.sched_priority += ((int)priority + 5) * priorityStep; /* +5 because the lowest priority is -5. */ + if (sched.sched_priority < priorityMin) { + sched.sched_priority = priorityMin; } - #else - { + if (sched.sched_priority > priorityMax) { sched.sched_priority = priorityMax; } - #endif - } else { - sched.sched_priority += ((int)priority + 5) * priorityStep; /* +5 because the lowest priority is -5. */ - } - - if (sched.sched_priority < priorityMin) { - sched.sched_priority = priorityMin; - } - if (sched.sched_priority > priorityMax) { - sched.sched_priority = priorityMax; } - /* I'm not treating a failure of setting the priority as a critical error so not aborting on failure here. */ - if (pthread_attr_setschedparam(&attr, &sched) == 0) { - #if !defined(MA_ANDROID) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) - { - pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); - } - #endif - } + /* I'm not treating a failure of setting the priority as a critical error so not checking the return value here. */ + pthread_attr_setschedparam(&attr, &sched); } } } @@ -17082,7 +16938,7 @@ MA_API ma_result ma_async_notification_signal(ma_async_notification* pNotificati } pNotificationCallbacks->onSignal(pNotification); - return MA_SUCCESS; + return MA_INVALID_ARGS; } @@ -17895,7 +17751,7 @@ MA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob) is stored. One thread can fall through to the freeing of this item while another is still using "head" for the retrieval of the "next" variable. - The slot allocator might need to make use of some reference counting to ensure it's only truly freed when + The slot allocator might need to make use of some reference counting to ensure it's only truely freed when there are no more references to the item. This must be fixed before removing these locks. */ @@ -18083,220 +17939,6 @@ DEVICE I/O #endif #endif -/* This must be set to at least 26. */ -#ifndef MA_AAUDIO_MIN_ANDROID_SDK_VERSION -#define MA_AAUDIO_MIN_ANDROID_SDK_VERSION 27 -#endif - - - -static ma_result ma_context_init__compat(void* pUserData, ma_context* pContext, const ma_context_config* pConfig) -{ - (void)pUserData; - return pContext->callbacks.onContextInit(pContext, pConfig, &pContext->callbacks); -} - -static ma_result ma_context_uninit__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - - if (pContext->callbacks.onContextUninit == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pContext->callbacks.onContextUninit(pContext); -} - -static ma_result ma_context_enumerate_devices__compat(void* pUserData, ma_context* pContext, ma_enum_devices_callback_proc callback, void* pCallbackUserData) -{ - (void)pUserData; - - if (pContext->callbacks.onContextEnumerateDevices == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pContext->callbacks.onContextEnumerateDevices(pContext, callback, pCallbackUserData); -} - -static ma_result ma_context_get_device_info__compat(void* pUserData, ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - (void)pUserData; - - if (pContext->callbacks.onContextGetDeviceInfo == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pContext->callbacks.onContextGetDeviceInfo(pContext, deviceType, pDeviceID, pDeviceInfo); -} - -static ma_result ma_device_init__compat(void* pUserData, ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceInit == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceInit(pDevice, pConfig, pDescriptorPlayback, pDescriptorCapture); -} - -static ma_result ma_device_uninit__compat(void* pUserData, ma_device* pDevice) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceUninit == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceUninit(pDevice); -} - -static ma_result ma_device_start__compat(void* pUserData, ma_device* pDevice) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceStart == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceStart(pDevice); -} - -static ma_result ma_device_stop__compat(void* pUserData, ma_device* pDevice) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceStop == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceStop(pDevice); -} - -static ma_result ma_device_read__compat(void* pUserData, ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceRead == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceRead(pDevice, pFrames, frameCount, pFramesRead); -} - -static ma_result ma_device_write__compat(void* pUserData, ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceWrite == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceWrite(pDevice, pFrames, frameCount, pFramesWritten); -} - -static ma_result ma_device_data_loop__compat(void* pUserData, ma_device* pDevice) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceDataLoop == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceDataLoop(pDevice); -} - -static ma_result ma_device_data_loop_wakeup__compat(void* pUserData, ma_device* pDevice) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceDataLoopWakeup == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceDataLoopWakeup(pDevice); -} - -static ma_result ma_device_get_info__compat(void* pUserData, ma_device* pDevice, ma_device_type deviceType, ma_device_info* pDeviceInfo) -{ - (void)pUserData; - - if (pDevice->pContext->callbacks.onDeviceGetInfo == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDevice->pContext->callbacks.onDeviceGetInfo(pDevice, deviceType, pDeviceInfo); -} - - -static ma_bool32 ma_device_has_start__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceStart != NULL; -} - -static ma_bool32 ma_device_has_stop__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceStop != NULL; -} - -static ma_bool32 ma_device_has_read__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceRead != NULL; -} - -static ma_bool32 ma_device_has_write__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceWrite != NULL; -} - -static ma_bool32 ma_device_has_data_loop__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceDataLoop != NULL; -} - -static ma_bool32 ma_device_has_data_loop_wakeup__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceDataLoopWakeup != NULL; -} - -static ma_bool32 ma_device_has_get_info__compat(void* pUserData, ma_context* pContext) -{ - (void)pUserData; - return pContext->callbacks.onDeviceGetInfo != NULL; -} - -static ma_device_backend_vtable ma_gDeviceVTable_Compat = -{ - ma_context_init__compat, - ma_context_uninit__compat, - ma_context_enumerate_devices__compat, - ma_context_get_device_info__compat, - ma_device_init__compat, - ma_device_uninit__compat, - ma_device_start__compat, - ma_device_stop__compat, - ma_device_read__compat, - ma_device_write__compat, - ma_device_data_loop__compat, - ma_device_data_loop_wakeup__compat, - ma_device_get_info__compat, - - /* Temporary compatibility functions. Will be removed when all backends implement the new vtable system. */ - ma_device_has_start__compat, - ma_device_has_stop__compat, - ma_device_has_read__compat, - ma_device_has_write__compat, - ma_device_has_data_loop__compat, - ma_device_has_data_loop_wakeup__compat, - ma_device_has_get_info__compat -}; - MA_API void ma_device_info_add_native_data_format(ma_device_info* pDeviceInfo, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 flags) @@ -18443,7 +18085,7 @@ MA_API ma_bool32 ma_is_backend_enabled(ma_backend backend) #if defined(MA_HAS_AAUDIO) #if defined(MA_ANDROID) { - return ma_android_sdk_version() >= MA_AAUDIO_MIN_ANDROID_SDK_VERSION; + return ma_android_sdk_version() >= 26; } #else return MA_FALSE; @@ -19002,6 +18644,11 @@ static void ma_device__on_notification(ma_device_notification notification) if (notification.pDevice->onNotification != NULL) { notification.pDevice->onNotification(¬ification); } + + /* TEMP FOR COMPATIBILITY: If it's a stopped notification, fire the onStop callback as well. This is only for backwards compatibility and will be removed. */ + if (notification.pDevice->onStop != NULL && notification.type == ma_device_notification_type_stopped) { + notification.pDevice->onStop(notification.pDevice); + } } static void ma_device__on_notification_started(ma_device* pDevice) @@ -19023,16 +18670,11 @@ static void ma_device__on_notification_rerouted(ma_device* pDevice) #endif #if defined(MA_EMSCRIPTEN) -#ifdef __cplusplus -extern "C" { -#endif -void EMSCRIPTEN_KEEPALIVE ma_device__on_notification_unlocked(ma_device* pDevice) +EMSCRIPTEN_KEEPALIVE +void ma_device__on_notification_unlocked(ma_device* pDevice) { ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_unlocked)); } -#ifdef __cplusplus -} -#endif #endif @@ -19160,7 +18802,7 @@ static void ma_device__handle_data_callback(ma_device* pDevice, void* pFramesOut unsigned int prevDenormalState = ma_device_disable_denormals(pDevice); { /* Volume control of input makes things a bit awkward because the input buffer is read-only. We'll need to use a temp buffer and loop in this case. */ - if (pFramesIn != NULL && masterVolumeFactor != 1) { + if (pFramesIn != NULL && masterVolumeFactor < 1) { ma_uint8 tempFramesIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; ma_uint32 bpfCapture = ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); ma_uint32 bpfPlayback = ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); @@ -19183,7 +18825,7 @@ static void ma_device__handle_data_callback(ma_device* pDevice, void* pFramesOut /* Volume control and clipping for playback devices. */ if (pFramesOut != NULL) { - if (masterVolumeFactor != 1) { + if (masterVolumeFactor < 1) { if (pFramesIn == NULL) { /* <-- In full-duplex situations, the volume will have been applied to the input samples before the data callback. Applying it again post-callback will incorrectly compound it. */ ma_apply_volume_factor_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels, masterVolumeFactor); } @@ -19323,7 +18965,7 @@ static void ma_device__send_frames_to_client(ma_device* pDevice, ma_uint32 frame ma_uint64 totalClientFramesProcessed = 0; const void* pRunningFramesInDeviceFormat = pFramesInDeviceFormat; - /* We just keep going until we've exhausted all of our input frames and cannot generate any more output frames. */ + /* We just keep going until we've exhaused all of our input frames and cannot generate any more output frames. */ for (;;) { ma_uint64 deviceFramesProcessedThisIteration; ma_uint64 clientFramesProcessedThisIteration; @@ -19546,7 +19188,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) /* Just some quick validation on the device type and the available callbacks. */ if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - if (pDevice->pContext->pVTable->onDeviceRead == NULL || (pDevice->pContext->pVTable->onHasRead && pDevice->pContext->pVTable->onHasRead(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_FALSE)) { + if (pDevice->pContext->callbacks.onDeviceRead == NULL) { return MA_NOT_IMPLEMENTED; } @@ -19554,7 +19196,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) } if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - if (pDevice->pContext->pVTable->onDeviceWrite == NULL || (pDevice->pContext->pVTable->onHasWrite && pDevice->pContext->pVTable->onHasWrite(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_FALSE)) { + if (pDevice->pContext->callbacks.onDeviceWrite == NULL) { return MA_NOT_IMPLEMENTED; } @@ -19580,7 +19222,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) capturedDeviceFramesToTryProcessing = capturedDeviceDataCapInFrames; } - result = pDevice->pContext->pVTable->onDeviceRead(pDevice->pContext->pVTableUserData, pDevice, capturedDeviceData, capturedDeviceFramesToTryProcessing, &capturedDeviceFramesToProcess); + result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, capturedDeviceFramesToTryProcessing, &capturedDeviceFramesToProcess); if (result != MA_SUCCESS) { exitLoop = MA_TRUE; break; @@ -19606,7 +19248,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) } /* - If we weren't able to generate any output frames it must mean we've exhausted all of our input. The only time this would not be the case is if capturedClientData was too small + If we weren't able to generate any output frames it must mean we've exhaused all of our input. The only time this would not be the case is if capturedClientData was too small which should never be the case when it's of the size MA_DATA_CONVERTER_STACK_BUFFER_SIZE. */ if (capturedClientFramesToProcessThisIteration == 0) { @@ -19627,7 +19269,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) break; } - result = pDevice->pContext->pVTable->onDeviceWrite(pDevice->pContext->pVTableUserData, pDevice, playbackDeviceData, (ma_uint32)convertedDeviceFrameCount, NULL); /* Safe cast. */ + result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, (ma_uint32)convertedDeviceFrameCount, NULL); /* Safe cast. */ if (result != MA_SUCCESS) { exitLoop = MA_TRUE; break; @@ -19668,7 +19310,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) framesToReadThisIteration = capturedDeviceDataCapInFrames; } - result = pDevice->pContext->pVTable->onDeviceRead(pDevice->pContext->pVTableUserData, pDevice, capturedDeviceData, framesToReadThisIteration, &framesProcessed); + result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, framesToReadThisIteration, &framesProcessed); if (result != MA_SUCCESS) { exitLoop = MA_TRUE; break; @@ -19700,7 +19342,7 @@ static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) ma_device__read_frames_from_client(pDevice, framesToWriteThisIteration, playbackDeviceData); - result = pDevice->pContext->pVTable->onDeviceWrite(pDevice->pContext->pVTableUserData, pDevice, playbackDeviceData, framesToWriteThisIteration, &framesProcessed); + result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, framesToWriteThisIteration, &framesProcessed); if (result != MA_SUCCESS) { exitLoop = MA_TRUE; break; @@ -21626,7 +21268,7 @@ static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context } /* - Exclusive Mode. We repeatedly call IsFormatSupported() here. This is not currently supported on + Exlcusive Mode. We repeatedly call IsFormatSupported() here. This is not currently supported on UWP. Failure to retrieve the exclusive mode format is not considered an error, so from here on out, MA_SUCCESS is guaranteed to be returned. */ @@ -22624,7 +22266,7 @@ static ma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device if (bufferDuration > 500*10000) { break; } else { - if (bufferDuration == 0) { /* <-- Just a sanity check to prevent an infinite loop. Should never happen, but it makes me feel better. */ + if (bufferDuration == 0) { /* <-- Just a sanity check to prevent an infinit loop. Should never happen, but it makes me feel better. */ break; } @@ -22955,6 +22597,7 @@ static ma_result ma_device_reinit__wasapi(ma_device* pDevice, ma_device_type dev MA_COPY_MEMORY(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); pDevice->capture.internalPeriodSizeInFrames = data.periodSizeInFramesOut; pDevice->capture.internalPeriods = data.periodsOut; + ma_strcpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), data.deviceName); ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, (HANDLE)pDevice->wasapi.hEventCapture); @@ -22975,6 +22618,7 @@ static ma_result ma_device_reinit__wasapi(ma_device* pDevice, ma_device_type dev MA_COPY_MEMORY(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); pDevice->playback.internalPeriodSizeInFrames = data.periodSizeInFramesOut; pDevice->playback.internalPeriods = data.periodsOut; + ma_strcpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), data.deviceName); ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, (HANDLE)pDevice->wasapi.hEventPlayback); @@ -24011,13 +23655,6 @@ DirectSound Backend #define MA_DSBPLAY_TERMINATEBY_DISTANCE 0x00000010 #define MA_DSBPLAY_TERMINATEBY_PRIORITY 0x00000020 -#define MA_DSBSTATUS_PLAYING 0x00000001 -#define MA_DSBSTATUS_BUFFERLOST 0x00000002 -#define MA_DSBSTATUS_LOOPING 0x00000004 -#define MA_DSBSTATUS_LOCHARDWARE 0x00000008 -#define MA_DSBSTATUS_LOCSOFTWARE 0x00000010 -#define MA_DSBSTATUS_TERMINATED 0x00000020 - #define MA_DSCBSTART_LOOPING 0x00000001 typedef struct @@ -24387,12 +24024,9 @@ static ma_result ma_context_create_IDirectSound__dsound(ma_context* pContext, ma } /* The cooperative level must be set before doing anything else. */ - hWnd = (HWND)pContext->dsound.hWnd; + hWnd = ((MA_PFN_GetForegroundWindow)pContext->win32.GetForegroundWindow)(); if (hWnd == 0) { - hWnd = ((MA_PFN_GetForegroundWindow)pContext->win32.GetForegroundWindow)(); - if (hWnd == 0) { - hWnd = ((MA_PFN_GetDesktopWindow)pContext->win32.GetDesktopWindow)(); - } + hWnd = ((MA_PFN_GetDesktopWindow)pContext->win32.GetDesktopWindow)(); } hr = ma_IDirectSound_SetCooperativeLevel(pDirectSound, hWnd, (shareMode == ma_share_mode_exclusive) ? MA_DSSCL_EXCLUSIVE : MA_DSSCL_PRIORITY); @@ -24896,8 +24530,8 @@ static ma_result ma_device_init__dsound(ma_device* pDevice, const ma_device_conf } /* - Unfortunately DirectSound uses different APIs and data structures for playback and capture devices. We need to initialize - the capture device first because we'll want to match its buffer size and period count on the playback side if we're using + Unfortunately DirectSound uses different APIs and data structures for playback and catpure devices. We need to initialize + the capture device first because we'll want to match it's buffer size and period count on the playback side if we're using full-duplex mode. */ if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { @@ -25180,7 +24814,6 @@ static ma_result ma_device_data_loop__dsound(ma_device* pDevice) ma_bool32 isPlaybackDeviceStarted = MA_FALSE; ma_uint32 framesWrittenToPlaybackDevice = 0; /* For knowing whether or not the playback device needs to be started. */ ma_uint32 waitTimeInMilliseconds = 1; - DWORD playbackBufferStatus = 0; MA_ASSERT(pDevice != NULL); @@ -25509,20 +25142,6 @@ static ma_result ma_device_data_loop__dsound(ma_device* pDevice) break; } - hr = ma_IDirectSoundBuffer_GetStatus((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &playbackBufferStatus); - if (SUCCEEDED(hr) && (playbackBufferStatus & MA_DSBSTATUS_PLAYING) == 0 && isPlaybackDeviceStarted) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[DirectSound] Attempting to resume audio due to state: %d.", (int)playbackBufferStatus); - hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING); - if (FAILED(hr)) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Play() failed after attempting to resume from state %d.", (int)playbackBufferStatus); - return ma_result_from_HRESULT(hr); - } - - isPlaybackDeviceStarted = MA_TRUE; - ma_sleep(waitTimeInMilliseconds); - continue; - } - if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) { physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback; } @@ -25724,8 +25343,6 @@ static ma_result ma_context_init__dsound(ma_context* pContext, const ma_context_ return MA_API_NOT_FOUND; } - pContext->dsound.hWnd = pConfig->dsound.hWnd; - pCallbacks->onContextInit = ma_context_init__dsound; pCallbacks->onContextUninit = ma_context_uninit__dsound; pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__dsound; @@ -26048,7 +25665,7 @@ static ma_result ma_context_get_device_info_from_WAVECAPS(ma_context* pContext, - If the name GUID is not present in the registry we'll also need to stick to the original 31 characters. - I like consistency, so I want the returned device names to be consistent with those returned by WASAPI and DirectSound. The problem, however is that WASAPI and DirectSound use " ()" format (such as "Speakers (High Definition Audio)"), - but WinMM does not specify the component name. From my admittedly limited testing, I've notice the component name seems to + but WinMM does not specificy the component name. From my admittedly limited testing, I've notice the component name seems to usually fit within the 31 characters of the fixed sized buffer, so what I'm going to do is parse that string for the component name, and then concatenate the name from the registry. */ @@ -26316,7 +25933,7 @@ static ma_result ma_device_init__winmm(ma_device* pDevice, const ma_device_confi return MA_DEVICE_TYPE_NOT_SUPPORTED; } - /* No exclusive mode with WinMM. */ + /* No exlusive mode with WinMM. */ if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { return MA_SHARE_MODE_NOT_SUPPORTED; @@ -26338,7 +25955,7 @@ static ma_result ma_device_init__winmm(ma_device* pDevice, const ma_device_confi /* We use an event to know when a new fragment needs to be enqueued. */ pDevice->winmm.hEventCapture = (ma_handle)CreateEventA(NULL, TRUE, TRUE, NULL); if (pDevice->winmm.hEventCapture == NULL) { - errorMsg = "[WinMM] Failed to create event for fragment enqueuing for the capture device.", errorCode = ma_result_from_GetLastError(GetLastError()); + errorMsg = "[WinMM] Failed to create event for fragment enqueing for the capture device.", errorCode = ma_result_from_GetLastError(GetLastError()); goto on_error; } @@ -26376,7 +25993,7 @@ static ma_result ma_device_init__winmm(ma_device* pDevice, const ma_device_confi /* We use an event to know when a new fragment needs to be enqueued. */ pDevice->winmm.hEventPlayback = (ma_handle)CreateEventA(NULL, TRUE, TRUE, NULL); if (pDevice->winmm.hEventPlayback == NULL) { - errorMsg = "[WinMM] Failed to create event for fragment enqueuing for the playback device.", errorCode = ma_result_from_GetLastError(GetLastError()); + errorMsg = "[WinMM] Failed to create event for fragment enqueing for the playback device.", errorCode = ma_result_from_GetLastError(GetLastError()); goto on_error; } @@ -27498,7 +27115,7 @@ static ma_result ma_context_open_pcm__alsa(ma_context* pContext, ma_share_mode s /* We're trying to open a specific device. There's a few things to consider here: - miniaudio recognizes a special format of device id that excludes the "hw", "dmix", etc. prefix. It looks like this: ":0,0", ":0,1", etc. When + miniaudio recongnizes a special format of device id that excludes the "hw", "dmix", etc. prefix. It looks like this: ":0,0", ":0,1", etc. When an ID of this format is specified, it indicates to miniaudio that it can try different combinations of plugins ("hw", "dmix", etc.) until it finds an appropriate one that works. This comes in very handy when trying to open a device in shared mode ("dmix"), vs exclusive mode ("hw"). */ @@ -27597,7 +27214,7 @@ static ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enu /* At this point, hwid looks like "hw:0,0". In simplified enumeration mode, we actually want to strip off the plugin name so it looks like ":0,0". The reason for this is that this special format is detected at device - initialization time and is used as an indicator to try to use the most appropriate plugin depending on the + initialization time and is used as an indicator to try and use the most appropriate plugin depending on the device type and sharing mode. */ char* dst = hwid; @@ -27776,7 +27393,7 @@ static void ma_context_iterate_rates_and_add_native_data_format__alsa(ma_context ((ma_snd_pcm_hw_params_get_rate_min_proc)pContext->alsa.snd_pcm_hw_params_get_rate_min)(pHWParams, &minSampleRate, &sampleRateDir); ((ma_snd_pcm_hw_params_get_rate_max_proc)pContext->alsa.snd_pcm_hw_params_get_rate_max)(pHWParams, &maxSampleRate, &sampleRateDir); - /* Make sure our sample rates are clamped to sane values. Stupid devices like "pulse" will reports rates like "1" which is ridiculous. */ + /* Make sure our sample rates are clamped to sane values. Stupid devices like "pulse" will reports rates like "1" which is ridiculus. */ minSampleRate = ma_clamp(minSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max); maxSampleRate = ma_clamp(maxSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max); @@ -27852,10 +27469,10 @@ static ma_result ma_context_get_device_info__alsa(ma_context* pContext, ma_devic /* Some ALSA devices can support many permutations of formats, channels and rates. We only support a fixed number of permutations which means we need to employ some strategies to ensure the best - combinations are returned. An example is the "pulse" device which can do its own data conversion + combinations are returned. An example is the "pulse" device which can do it's own data conversion in software and as a result can support any combination of format, channels and rate. - We want to ensure that the first data formats are the best. We have a list of favored sample + We want to ensure the the first data formats are the best. We have a list of favored sample formats and sample rates, so these will be the basis of our iteration. */ @@ -28446,7 +28063,6 @@ static ma_result ma_device_stop__alsa(ma_device* pDevice) a small chance that our wakeupfd has not been cleared. We'll clear that out now if applicable. */ int resultPoll; - int resultRead; if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Dropping capture device...\n"); @@ -28461,15 +28077,12 @@ static ma_result ma_device_stop__alsa(ma_device* pDevice) ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing capture device successful.\n"); } - /* Clear the wakeupfd. */ - resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture, 1, 0); - if (resultPoll > 0) { - ma_uint64 t; - resultRead = read(((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture)[0].fd, &t, sizeof(t)); - if (resultRead != sizeof(t)) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Failed to read from capture wakeupfd. read() = %d\n", resultRead); - } - } + /* Clear the wakeupfd. */ + resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture, 1, 0); + if (resultPoll > 0) { + ma_uint64 t; + read(((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture)[0].fd, &t, sizeof(t)); + } } if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { @@ -28486,14 +28099,11 @@ static ma_result ma_device_stop__alsa(ma_device* pDevice) } /* Clear the wakeupfd. */ - resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback, 1, 0); - if (resultPoll > 0) { - ma_uint64 t; - resultRead = read(((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback)[0].fd, &t, sizeof(t)); - if (resultRead != sizeof(t)) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Failed to read from playback wakeupfd. read() = %d\n", resultRead); - } - } + resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback, 1, 0); + if (resultPoll > 0) { + ma_uint64 t; + read(((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback)[0].fd, &t, sizeof(t)); + } } @@ -29001,7 +28611,7 @@ get fun, and I don't mean that in a good way... The problems start with the very name of the API - "asynchronous". Yes, this is an asynchronous oriented API which means your commands don't immediately take effect. You instead need to issue your commands, and then wait for them to complete. The waiting mechanism is -enabled through the use of a "main loop". In the asynchronous API you cannot get away from the main loop, and the main loop is where almost +enabled through the use of a "main loop". In the asychronous API you cannot get away from the main loop, and the main loop is where almost all of PulseAudio's problems stem from. When you first initialize PulseAudio you need an object referred to as "main loop". You can implement this yourself by defining your own @@ -29051,7 +28661,7 @@ because PulseAudio takes it literally, specifically the "can be". You would thin writing and reading data to and from the stream, and that would be right, except when it's not. When you initialize the stream, you can set a flag that tells PulseAudio to not start the stream automatically. This is required because miniaudio does not auto-start devices straight after initialization - you need to call `ma_device_start()` manually. The problem is that even when this flag is specified, -PulseAudio will immediately fire its write or read callback. This is *technically* correct (based on the wording in the documentation) +PulseAudio will immediately fire it's write or read callback. This is *technically* correct (based on the wording in the documentation) because indeed, data *can* be written at this point. The problem is that it's not *practical*. It makes sense that the write/read callback would be where a program will want to write or read data to or from the stream, but when it's called before the application has even requested that the stream be started, it's just not practical because the program probably isn't ready for any kind of data delivery at @@ -30033,6 +29643,39 @@ static void ma_device_source_info_callback(ma_pa_context* pPulseContext, const m (void)pPulseContext; /* Unused. */ } +#if 0 +static void ma_device_sink_name_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData) +{ + ma_device* pDevice; + + if (endOfList > 0) { + return; + } + + pDevice = (ma_device*)pUserData; + MA_ASSERT(pDevice != NULL); + + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), pInfo->description, (size_t)-1); + + (void)pPulseContext; /* Unused. */ +} + +static void ma_device_source_name_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData) +{ + ma_device* pDevice; + + if (endOfList > 0) { + return; + } + + pDevice = (ma_device*)pUserData; + MA_ASSERT(pDevice != NULL); + + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), pInfo->description, (size_t)-1); + + (void)pPulseContext; /* Unused. */ +} +#endif static ma_result ma_context_get_sink_info__pulse(ma_context* pContext, const char* pDeviceName, ma_pa_sink_info* pSinkInfo) { @@ -30659,7 +30302,6 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi ma_pa_buffer_attr attr; const ma_pa_sample_spec* pActualSS = NULL; const ma_pa_buffer_attr* pActualAttr = NULL; - const ma_pa_channel_map* pActualChannelMap = NULL; ma_uint32 iChannel; ma_pa_stream_flags_t streamFlags; @@ -30809,12 +30451,7 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi goto on_error4; } - /* Internal channel map. */ - pActualChannelMap = ((ma_pa_stream_get_channel_map_proc)pDevice->pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - if (pActualChannelMap == NULL) { - pActualChannelMap = &cmap; /* Fallback just in case. */ - } /* Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting @@ -30824,8 +30461,8 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi fixed sooner than later. I might remove this hack later. */ if (pDescriptorCapture->channels > 2) { - for (iChannel = 0; iChannel < pDescriptorCapture->channels; iChannel += 1) { - pDescriptorCapture->channelMap[iChannel] = ma_channel_position_from_pulse(pActualChannelMap->map[iChannel]); + for (iChannel = 0; iChannel < pDescriptorCapture->channels; ++iChannel) { + pDescriptorCapture->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]); } } else { /* Hack for mono and stereo. */ @@ -30966,12 +30603,7 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi goto on_error4; } - /* Internal channel map. */ - pActualChannelMap = ((ma_pa_stream_get_channel_map_proc)pDevice->pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - if (pActualChannelMap == NULL) { - pActualChannelMap = &cmap; /* Fallback just in case. */ - } /* Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting @@ -30981,8 +30613,8 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi fixed sooner than later. I might remove this hack later. */ if (pDescriptorPlayback->channels > 2) { - for (iChannel = 0; iChannel < pDescriptorPlayback->channels; iChannel += 1) { - pDescriptorPlayback->channelMap[iChannel] = ma_channel_position_from_pulse(pActualChannelMap->map[iChannel]); + for (iChannel = 0; iChannel < pDescriptorPlayback->channels; ++iChannel) { + pDescriptorPlayback->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]); } } else { /* Hack for mono and stereo. */ @@ -32226,7 +31858,7 @@ that supports this level of detail. There was some public domain sample code I s and AudioUnit APIs, but I couldn't see anything that gave low-level control over device selection and capabilities (the distinction between playback and capture in particular). Therefore, miniaudio is using the AudioObject API. -Most (all?) functions in the AudioObject API take a AudioObjectID as its input. This is the device identifier. When +Most (all?) functions in the AudioObject API take a AudioObjectID as it's input. This is the device identifier. When retrieving global information, such as the device list, you use kAudioObjectSystemObject. When retrieving device-specific data, you pass in the ID for that device. In order to retrieve device-specific IDs you need to enumerate over each of the devices. This is done using the AudioObjectGetPropertyDataSize() and AudioObjectGetPropertyData() APIs which seem to be @@ -34592,7 +34224,7 @@ static ma_result ma_device_init_internal__coreaudio(ma_context* pContext, ma_dev returning a result code of -10863. I have also tried changing the format directly on the input scope on the input bus, but this just results in `ca_require: IsStreamFormatWritable(inScope, inElement) NotWritable` when trying to set the format. - Something that does seem to work, however, has been setting the nominal sample rate on the device object. The problem with + Something that does seem to work, however, has been setting the nominal sample rate on the deivce object. The problem with this, however, is that it actually changes the sample rate at the operating system level and not just the application. This could be intrusive to the user, however, so I don't think it's wise to make this the default. Instead I'm making this a configuration option. When the `coreaudio.allowNominalSampleRateChange` config option is set to true, changing the sample @@ -34978,7 +34610,7 @@ static ma_result ma_device_init__coreaudio(ma_device* pDevice, const ma_device_c ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDCapture, sizeof(pDevice->capture.id.coreaudio), pDevice->capture.id.coreaudio); /* - If we are using the default device we'll need to listen for changes to the system's default device so we can seamlessly + If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly switch the device in the background. */ if (pConfig->capture.pDeviceID == NULL) { @@ -35042,7 +34674,7 @@ static ma_result ma_device_init__coreaudio(ma_device* pDevice, const ma_device_c ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDPlayback, sizeof(pDevice->playback.id.coreaudio), pDevice->playback.id.coreaudio); /* - If we are using the default device we'll need to listen for changes to the system's default device so we can seamlessly + If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly switch the device in the background. */ if (pDescriptorPlayback->pDeviceID == NULL && (pConfig->deviceType != ma_device_type_duplex || pDescriptorCapture->pDeviceID != NULL)) { @@ -37454,7 +37086,7 @@ static ma_result ma_device_init_fd__oss(ma_device* pDevice, const ma_device_conf } /* - The OSS documentation is very clear about the order we should be initializing the device's properties: + The OSS documantation is very clear about the order we should be initializing the device's properties: 1) Format 2) Channels 3) Sample rate. @@ -38045,11 +37677,11 @@ static ma_result ma_create_and_configure_AAudioStreamBuilder__aaudio(ma_context* There have been reports where setting the frames per data callback results in an error later on from Android. To address this, I'm experimenting with simply not setting it on anything from Android 11 and earlier. Suggestions welcome on how we might be able to make - this more targeted. + this more targetted. */ if (!pConfig->aaudio.enableCompatibilityWorkarounds || ma_android_sdk_version() > 30) { /* - AAudio is annoying when it comes to its buffer calculation stuff because it doesn't let you + AAudio is annoying when it comes to it's buffer calculation stuff because it doesn't let you retrieve the actual sample rate until after you've opened the stream. But you need to configure the buffer capacity before you open the stream... :/ @@ -38379,7 +38011,7 @@ static ma_result ma_device_start_stream__aaudio(ma_device* pDevice, ma_AAudioStr return ma_result_from_aaudio(resultAA); } - /* Do we actually need to wait for the device to transition into its started state? */ + /* Do we actually need to wait for the device to transition into it's started state? */ /* The device should be in either a starting or started state. If it's not set to started we need to wait for it to transition. It should go from starting to started. */ currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream); @@ -40016,7 +39648,7 @@ TODO: Version 0.12: Swap this logic around so that AudioWorklets are used by def /* The thread stack size must be a multiple of 16. */ #ifndef MA_AUDIO_WORKLETS_THREAD_STACK_SIZE -#define MA_AUDIO_WORKLETS_THREAD_STACK_SIZE 131072 +#define MA_AUDIO_WORKLETS_THREAD_STACK_SIZE 16384 #endif #if defined(MA_USE_AUDIO_WORKLETS) @@ -40142,7 +39774,7 @@ static ma_result ma_device_uninit__webaudio(ma_device* pDevice) #if defined(MA_USE_AUDIO_WORKLETS) { EM_ASM({ - var device = window.miniaudio.get_device_by_index($0); + var device = miniaudio.get_device_by_index($0); if (device.streamNode !== undefined) { device.streamNode.disconnect(); @@ -40157,7 +39789,7 @@ static ma_result ma_device_uninit__webaudio(ma_device* pDevice) #else { EM_ASM({ - var device = window.miniaudio.get_device_by_index($0); + var device = miniaudio.get_device_by_index($0); /* Make sure all nodes are disconnected and marked for collection. */ if (device.scriptNode !== undefined) { @@ -40184,7 +39816,7 @@ static ma_result ma_device_uninit__webaudio(ma_device* pDevice) /* Clean up the device on the JS side. */ EM_ASM({ - window.miniaudio.untrack_device_by_index($0); + miniaudio.untrack_device_by_index($0); }, pDevice->webaudio.deviceIndex); ma_free(pDevice->webaudio.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks); @@ -40317,7 +39949,7 @@ static void ma_audio_worklet_processor_created__webaudio(EMSCRIPTEN_WEBAUDIO_T a count from MediaStreamAudioSourceNode (what we use for capture)? The only way to have control is to configure an output channel count on the capture side. This is slightly confusing for capture mode because intuitively you wouldn't actually connect an output to an input-only node, but this is what we'll have to do in order to have - proper control over the channel count. In the capture case, we'll have to output silence to its output node. + proper control over the channel count. In the capture case, we'll have to output silence to it's output node. */ if (pParameters->pConfig->deviceType == ma_device_type_capture) { channels = (int)((pParameters->pDescriptorCapture->channels > 0) ? pParameters->pDescriptorCapture->channels : MA_DEFAULT_CHANNELS); @@ -40349,6 +39981,7 @@ static void ma_audio_worklet_processor_created__webaudio(EMSCRIPTEN_WEBAUDIO_T a return; } + pParameters->pDevice->webaudio.audioWorklet = emscripten_create_wasm_audio_worklet_node(audioContext, "miniaudio", &audioWorkletOptions, &ma_audio_worklet_process_callback__webaudio, pParameters->pDevice); /* With the audio worklet initialized we can now attach it to the graph. */ @@ -40488,6 +40121,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co /* It's not clear if this can return an error. None of the tests in the Emscripten repository check for this, so neither am I for now. */ pDevice->webaudio.audioContext = emscripten_create_audio_context(&audioContextAttributes); + /* With the context created we can now create the worklet. We can only have a single worklet per audio context which means we'll need to craft this appropriately to handle duplex devices correctly. @@ -40536,7 +40170,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co /* We need to add an entry to the miniaudio.devices list on the JS side so we can do some JS/C interop. */ pDevice->webaudio.deviceIndex = EM_ASM_INT({ - return window.miniaudio.track_device({ + return miniaudio.track_device({ webaudio: emscriptenGetAudioObject($0), state: 1 /* 1 = ma_device_state_stopped */ }); @@ -40552,7 +40186,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co ma_uint32 sampleRate; ma_uint32 periodSizeInFrames; - /* The channel count will depend on the device type. If it's a capture, use its, otherwise use the playback side. */ + /* The channel count will depend on the device type. If it's a capture, use it's, otherwise use the playback side. */ if (pConfig->deviceType == ma_device_type_capture) { channels = (pDescriptorCapture->channels > 0) ? pDescriptorCapture->channels : MA_DEFAULT_CHANNELS; } else { @@ -40621,11 +40255,11 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co /* The node processing callback. */ device.scriptNode.onaudioprocess = function(e) { if (device.intermediaryBufferView == null || device.intermediaryBufferView.length == 0) { - device.intermediaryBufferView = new Float32Array(HEAPF32.buffer, pIntermediaryBuffer, bufferSize * channels); + device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, pIntermediaryBuffer, bufferSize * channels); } /* Do the capture side first. */ - if (deviceType == window.miniaudio.device_type.capture || deviceType == window.miniaudio.device_type.duplex) { + if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { /* The data must be interleaved before being processed miniaudio. */ for (var iChannel = 0; iChannel < channels; iChannel += 1) { var inputBuffer = e.inputBuffer.getChannelData(iChannel); @@ -40639,7 +40273,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co _ma_device_process_pcm_frames_capture__webaudio(pDevice, bufferSize, pIntermediaryBuffer); } - if (deviceType == window.miniaudio.device_type.playback || deviceType == window.miniaudio.device_type.duplex) { + if (deviceType == miniaudio.device_type.playback || deviceType == miniaudio.device_type.duplex) { _ma_device_process_pcm_frames_playback__webaudio(pDevice, bufferSize, pIntermediaryBuffer); for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { @@ -40659,7 +40293,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co }; /* Now we need to connect our node to the graph. */ - if (deviceType == window.miniaudio.device_type.capture || deviceType == window.miniaudio.device_type.duplex) { + if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { navigator.mediaDevices.getUserMedia({audio:true, video:false}) .then(function(stream) { device.streamNode = device.webaudio.createMediaStreamSource(stream); @@ -40671,13 +40305,13 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co }); } - if (deviceType == window.miniaudio.device_type.playback) { + if (deviceType == miniaudio.device_type.playback) { device.scriptNode.connect(device.webaudio.destination); } device.pDevice = pDevice; - return window.miniaudio.track_device(device); + return miniaudio.track_device(device); }, pConfig->deviceType, channels, sampleRate, periodSizeInFrames, pDevice->webaudio.pIntermediaryBuffer, pDevice); if (deviceIndex < 0) { @@ -40687,7 +40321,7 @@ static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_co pDevice->webaudio.deviceIndex = deviceIndex; /* Grab the sample rate from the audio context directly. */ - sampleRate = (ma_uint32)EM_ASM_INT({ return window.miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex); + sampleRate = (ma_uint32)EM_ASM_INT({ return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex); if (pDescriptorCapture != NULL) { pDescriptorCapture->format = ma_format_f32; @@ -40717,9 +40351,9 @@ static ma_result ma_device_start__webaudio(ma_device* pDevice) MA_ASSERT(pDevice != NULL); EM_ASM({ - var device = window.miniaudio.get_device_by_index($0); + var device = miniaudio.get_device_by_index($0); device.webaudio.resume(); - device.state = window.miniaudio.device_state.started; + device.state = miniaudio.device_state.started; }, pDevice->webaudio.deviceIndex); return MA_SUCCESS; @@ -40739,9 +40373,9 @@ static ma_result ma_device_stop__webaudio(ma_device* pDevice) do any kind of explicit draining. */ EM_ASM({ - var device = window.miniaudio.get_device_by_index($0); + var device = miniaudio.get_device_by_index($0); device.webaudio.suspend(); - device.state = window.miniaudio.device_state.stopped; + device.state = miniaudio.device_state.stopped; }, pDevice->webaudio.deviceIndex); ma_device__on_notification_stopped(pDevice); @@ -40759,10 +40393,6 @@ static ma_result ma_context_uninit__webaudio(ma_context* pContext) /* Remove the global miniaudio object from window if there are no more references to it. */ EM_ASM({ if (typeof(window.miniaudio) !== 'undefined') { - miniaudio.unlock_event_types.map(function(event_type) { - document.removeEventListener(event_type, miniaudio.unlock, true); - }); - window.miniaudio.referenceCount -= 1; if (window.miniaudio.referenceCount === 0) { delete window.miniaudio; @@ -40804,7 +40434,6 @@ static ma_result ma_context_init__webaudio(ma_context* pContext, const ma_contex window.miniaudio.device_state.started = $4; /* Device cache for mapping devices to indexes for JavaScript/C interop. */ - let miniaudio = window.miniaudio; miniaudio.devices = []; miniaudio.track_device = function(device) { @@ -40856,13 +40485,13 @@ static ma_result ma_context_init__webaudio(ma_context* pContext, const ma_contex var device = miniaudio.devices[i]; if (device != null && device.webaudio != null && - device.state === miniaudio.device_state.started) { + device.state === window.miniaudio.device_state.started) { device.webaudio.resume().then(() => { - _ma_device__on_notification_unlocked(device.pDevice); - }, - (error) => {console.error("Failed to resume audiocontext", error); - }); + Module._ma_device__on_notification_unlocked(device.pDevice); + }, + (error) => {console.error("Failed to resume audiocontext", error); + }); } } miniaudio.unlock_event_types.map(function(event_type) { @@ -40929,18 +40558,10 @@ static ma_bool32 ma__is_channel_map_valid(const ma_channel* pChannelMap, ma_uint static ma_bool32 ma_context_is_backend_asynchronous(ma_context* pContext) { - ma_bool32 hasRead; - ma_bool32 hasWrite; - MA_ASSERT(pContext != NULL); - hasRead = pContext->pVTable->onDeviceRead != NULL && (pContext->pVTable->onHasRead == NULL || pContext->pVTable->onHasRead (pContext->pVTableUserData, pContext) == MA_TRUE); - hasWrite = pContext->pVTable->onDeviceWrite != NULL && (pContext->pVTable->onHasWrite == NULL || pContext->pVTable->onHasWrite(pContext->pVTableUserData, pContext) == MA_TRUE); - - if (hasRead == MA_FALSE && hasWrite == MA_FALSE) { - ma_bool32 hasDataLoop = pContext->pVTable->onDeviceDataLoop != NULL && (pContext->pVTable->onHasDataLoop == NULL || pContext->pVTable->onHasDataLoop(pContext->pVTableUserData, pContext) == MA_TRUE); - - if (hasDataLoop == MA_FALSE) { + if (pContext->callbacks.onDeviceRead == NULL && pContext->callbacks.onDeviceWrite == NULL) { + if (pContext->callbacks.onDeviceDataLoop == NULL) { return MA_TRUE; } else { return MA_FALSE; @@ -41135,6 +40756,8 @@ static ma_result ma_device__post_init_setup(ma_device* pDevice, ma_device_type d MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceType, const ma_device_descriptor* pDescriptorPlayback, const ma_device_descriptor* pDescriptorCapture) { + ma_result result; + if (pDevice == NULL) { return MA_INVALID_ARGS; } @@ -41175,6 +40798,42 @@ MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceTy } } + /* + The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead. + For loopback devices, we need to retrieve the name of the playback device. + */ + { + ma_device_info deviceInfo; + + if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { + result = ma_device_get_info(pDevice, (deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo); + if (result == MA_SUCCESS) { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1); + } else { + /* We failed to retrieve the device info. Fall back to a default name. */ + if (pDescriptorCapture->pDeviceID == NULL) { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); + } else { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), "Capture Device", (size_t)-1); + } + } + } + + if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { + result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo); + if (result == MA_SUCCESS) { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1); + } else { + /* We failed to retrieve the device info. Fall back to a default name. */ + if (pDescriptorPlayback->pDeviceID == NULL) { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); + } else { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), "Playback Device", (size_t)-1); + } + } + } + } + /* Update data conversion. */ return ma_device__post_init_setup(pDevice, deviceType); /* TODO: Should probably rename ma_device__post_init_setup() to something better. */ } @@ -41194,7 +40853,7 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) #endif /* - When the device is being initialized its initial state is set to ma_device_state_uninitialized. Before returning from + When the device is being initialized it's initial state is set to ma_device_state_uninitialized. Before returning from ma_device_init(), the state needs to be set to something valid. In miniaudio the device's default state immediately after initialization is stopped, so therefore we need to mark the device as such. miniaudio will wait on the worker thread to signal an event to know when the worker thread is ready for action. @@ -41225,8 +40884,8 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_starting); /* If the device has a start callback, start it now. */ - if (pDevice->pContext->pVTable->onDeviceStart != NULL && (pDevice->pContext->pVTable->onHasStart == NULL || pDevice->pContext->pVTable->onHasStart(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - startResult = pDevice->pContext->pVTable->onDeviceStart(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceStart != NULL) { + startResult = pDevice->pContext->callbacks.onDeviceStart(pDevice); } else { startResult = MA_SUCCESS; } @@ -41247,16 +40906,16 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) ma_device__on_notification_started(pDevice); - if (pDevice->pContext->pVTable->onDeviceDataLoop != NULL && (pDevice->pContext->pVTable->onHasDataLoop == NULL || pDevice->pContext->pVTable->onHasDataLoop(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - pDevice->pContext->pVTable->onDeviceDataLoop(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceDataLoop != NULL) { + pDevice->pContext->callbacks.onDeviceDataLoop(pDevice); } else { /* The backend is not using a custom main loop implementation, so now fall back to the blocking read-write implementation. */ ma_device_audio_thread__default_read_write(pDevice); } /* Getting here means we have broken from the main loop which happens the application has requested that device be stopped. */ - if (pDevice->pContext->pVTable->onDeviceStop != NULL && (pDevice->pContext->pVTable->onHasStop == NULL || pDevice->pContext->pVTable->onHasStop(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - stopResult = pDevice->pContext->pVTable->onDeviceStop(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceStop != NULL) { + stopResult = pDevice->pContext->callbacks.onDeviceStop(pDevice); } else { stopResult = MA_SUCCESS; /* No stop callback with the backend. Just assume successful. */ } @@ -41539,23 +41198,6 @@ MA_API ma_result ma_device_job_thread_next(ma_device_job_thread* pJobThread, ma_ } -static const void* ma_find_device_backend_config(const ma_device_backend_spec* pBackends, size_t count, const ma_device_backend_vtable* pVTable) -{ - size_t iBackend; - - if (pBackends == NULL || count == 0) { - return NULL; - } - - for (iBackend = 0; iBackend < count; iBackend += 1) { - if (pBackends[iBackend].pVTable == pVTable) { - return pBackends[iBackend].pConfig; - } - } - - return NULL; -} - MA_API ma_context_config ma_context_config_init(void) { @@ -41565,16 +41207,6 @@ MA_API ma_context_config ma_context_config_init(void) return config; } -MA_API const void* ma_context_config_find_custom_backend_config(const ma_context_config* pConfig, const ma_device_backend_vtable* pVTable) -{ - if (pVTable == NULL || pConfig == NULL) { - return NULL; - } - - return ma_find_device_backend_config(pConfig->custom.pBackends, pConfig->custom.count, pVTable); -} - - MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext) { ma_result result; @@ -41642,10 +41274,6 @@ MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendC /* Make sure all callbacks are reset so we don't accidentally drag in any from previously failed initialization attempts. */ MA_ZERO_OBJECT(&pContext->callbacks); - pContext->pVTable = NULL; - pContext->pVTableUserData = NULL; - - /* For stock backends we can just map the backend enum to the appropriate vtable. */ /* These backends are using the new callback system. */ switch (backend) { @@ -41653,70 +41281,60 @@ MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendC case ma_backend_wasapi: { pContext->callbacks.onContextInit = ma_context_init__wasapi; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_DSOUND case ma_backend_dsound: { pContext->callbacks.onContextInit = ma_context_init__dsound; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_WINMM case ma_backend_winmm: { pContext->callbacks.onContextInit = ma_context_init__winmm; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_COREAUDIO case ma_backend_coreaudio: { pContext->callbacks.onContextInit = ma_context_init__coreaudio; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_SNDIO case ma_backend_sndio: { pContext->callbacks.onContextInit = ma_context_init__sndio; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_AUDIO4 case ma_backend_audio4: { pContext->callbacks.onContextInit = ma_context_init__audio4; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_OSS case ma_backend_oss: { pContext->callbacks.onContextInit = ma_context_init__oss; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_PULSEAUDIO case ma_backend_pulseaudio: { pContext->callbacks.onContextInit = ma_context_init__pulse; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_ALSA case ma_backend_alsa: { pContext->callbacks.onContextInit = ma_context_init__alsa; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_JACK case ma_backend_jack: { pContext->callbacks.onContextInit = ma_context_init__jack; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_AAUDIO @@ -41724,7 +41342,6 @@ MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendC { if (ma_is_backend_enabled(backend)) { pContext->callbacks.onContextInit = ma_context_init__aaudio; - pContext->pVTable = &ma_gDeviceVTable_Compat; } } break; #endif @@ -41733,7 +41350,6 @@ MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendC { if (ma_is_backend_enabled(backend)) { pContext->callbacks.onContextInit = ma_context_init__opensl; - pContext->pVTable = &ma_gDeviceVTable_Compat; } } break; #endif @@ -41741,67 +41357,41 @@ MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendC case ma_backend_webaudio: { pContext->callbacks.onContextInit = ma_context_init__webaudio; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif #ifdef MA_HAS_CUSTOM case ma_backend_custom: { - /* Custom backends are handled differently. */ + /* Slightly different logic for custom backends. Custom backends can optionally set all of their callbacks in the config. */ + pContext->callbacks = pConfig->custom; } break; #endif #ifdef MA_HAS_NULL case ma_backend_null: { pContext->callbacks.onContextInit = ma_context_init__null; - pContext->pVTable = &ma_gDeviceVTable_Compat; } break; #endif default: break; } - /* Special case for custom backends. */ - if (backend == ma_backend_custom) { - /* It's a custom backend. We need to iterate over each vtable and use the first one that works. */ - if (pConfig->custom.pBackends != NULL && pConfig->custom.count > 0) { - size_t iCustomBackend; - for (iCustomBackend = 0; iCustomBackend < pConfig->custom.count; iCustomBackend += 1) { - pContext->pVTable = pConfig->custom.pBackends[iCustomBackend].pVTable; - pContext->pVTableUserData = pConfig->custom.pBackends[iCustomBackend].pUserData; - - if (pContext->pVTable != NULL) { - MA_ASSERT(pContext->pVTable->onContextInit != NULL); /* onContextInit() must always be specified. */ - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Attempting to initialize custom backend %d...\n", (int)iCustomBackend); - - result = pContext->pVTable->onContextInit(pContext->pVTableUserData, pContext, pConfig); - if (result == MA_SUCCESS) { - break; - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Failed to initialize custom backend %d.\n", (int)iCustomBackend); - } - } - } - } else { - /* No custom backend vtables defined. */ - result = MA_NO_BACKEND; - } + if (pContext->callbacks.onContextInit != NULL) { + ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Attempting to initialize %s backend...\n", ma_get_backend_name(backend)); + result = pContext->callbacks.onContextInit(pContext, pConfig, &pContext->callbacks); } else { - /* It's not a custom backend. */ - if (pContext->pVTable != NULL) { - MA_ASSERT(pContext->pVTable->onContextInit != NULL); /* onContextInit() must always be specified. */ - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Attempting to initialize %s backend...\n", ma_get_backend_name(backend)); - result = pContext->pVTable->onContextInit(pContext->pVTableUserData, pContext, pConfig); + /* Getting here means the onContextInit callback is not set which means the backend is not enabled. Special case for the custom backend. */ + if (backend != ma_backend_custom) { + result = MA_BACKEND_NOT_ENABLED; } else { - /* Getting here means the vtable is not set which means the backend is not enabled. */ + #if !defined(MA_HAS_CUSTOM) result = MA_BACKEND_NOT_ENABLED; + #else + result = MA_NO_BACKEND; + #endif } } - - /* If this iteration was successful, return. */ if (result == MA_SUCCESS) { result = ma_mutex_init(&pContext->deviceEnumLock); @@ -41842,8 +41432,8 @@ MA_API ma_result ma_context_uninit(ma_context* pContext) return MA_INVALID_ARGS; } - if (pContext->pVTable->onContextUninit != NULL) { - pContext->pVTable->onContextUninit(pContext->pVTableUserData, pContext); + if (pContext->callbacks.onContextUninit != NULL) { + pContext->callbacks.onContextUninit(pContext); } ma_mutex_uninit(&pContext->deviceEnumLock); @@ -41882,13 +41472,13 @@ MA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devi return MA_INVALID_ARGS; } - if (pContext->pVTable->onContextEnumerateDevices == NULL) { + if (pContext->callbacks.onContextEnumerateDevices == NULL) { return MA_INVALID_OPERATION; } ma_mutex_lock(&pContext->deviceEnumLock); { - result = pContext->pVTable->onContextEnumerateDevices(pContext->pVTableUserData, pContext, callback, pUserData); + result = pContext->callbacks.onContextEnumerateDevices(pContext, callback, pUserData); } ma_mutex_unlock(&pContext->deviceEnumLock); @@ -41958,7 +41548,7 @@ MA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** p return MA_INVALID_ARGS; } - if (pContext->pVTable->onContextEnumerateDevices == NULL) { + if (pContext->callbacks.onContextEnumerateDevices == NULL) { return MA_INVALID_OPERATION; } @@ -41970,7 +41560,7 @@ MA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** p pContext->captureDeviceInfoCount = 0; /* Now enumerate over available devices. */ - result = pContext->pVTable->onContextEnumerateDevices(pContext->pVTableUserData, pContext, ma_context_get_devices__enum_callback, NULL); + result = pContext->callbacks.onContextEnumerateDevices(pContext, ma_context_get_devices__enum_callback, NULL); if (result == MA_SUCCESS) { /* Playback devices. */ if (ppPlaybackDeviceInfos != NULL) { @@ -42016,13 +41606,13 @@ MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type MA_COPY_MEMORY(&deviceInfo.id, pDeviceID, sizeof(*pDeviceID)); } - if (pContext->pVTable->onContextGetDeviceInfo == NULL) { + if (pContext->callbacks.onContextGetDeviceInfo == NULL) { return MA_INVALID_OPERATION; } ma_mutex_lock(&pContext->deviceInfoLock); { - result = pContext->pVTable->onContextGetDeviceInfo(pContext->pVTableUserData, pContext, deviceType, pDeviceID, &deviceInfo); + result = pContext->callbacks.onContextGetDeviceInfo(pContext, deviceType, pDeviceID, &deviceInfo); } ma_mutex_unlock(&pContext->deviceInfoLock); @@ -42050,16 +41640,6 @@ MA_API ma_device_config ma_device_config_init(ma_device_type deviceType) return config; } -MA_API const void* ma_device_config_find_custom_backend_config(const ma_device_config* pConfig, const ma_device_backend_vtable* pVTable) -{ - if (pVTable == NULL || pConfig == NULL) { - return NULL; - } - - return ma_find_device_backend_config(pConfig->custom.pBackends, pConfig->custom.count, pVTable); -} - - MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice) { ma_result result; @@ -42082,7 +41662,7 @@ MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pC } /* Check that we have our callbacks defined. */ - if (pContext->pVTable->onDeviceInit == NULL) { + if (pContext->callbacks.onDeviceInit == NULL) { return MA_INVALID_OPERATION; } @@ -42113,6 +41693,7 @@ MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pC pDevice->pUserData = pConfig->pUserData; pDevice->onData = pConfig->dataCallback; pDevice->onNotification = pConfig->notificationCallback; + pDevice->onStop = pConfig->stopCallback; if (pConfig->playback.pDeviceID != NULL) { MA_COPY_MEMORY(&pDevice->playback.id, pConfig->playback.pDeviceID, sizeof(pDevice->playback.id)); @@ -42221,7 +41802,7 @@ MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pC } - result = pContext->pVTable->onDeviceInit(pContext->pVTableUserData, pDevice, pConfig, &descriptorPlayback, &descriptorCapture); + result = pContext->callbacks.onDeviceInit(pDevice, pConfig, &descriptorPlayback, &descriptorCapture); if (result != MA_SUCCESS) { ma_event_uninit(&pDevice->startEvent); ma_event_uninit(&pDevice->wakeupEvent); @@ -42229,6 +41810,87 @@ MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pC return result; } +#if 0 + /* + On output the descriptors will contain the *actual* data format of the device. We need this to know how to convert the data between + the requested format and the internal format. + */ + if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { + if (!ma_device_descriptor_is_valid(&descriptorCapture)) { + ma_device_uninit(pDevice); + return MA_INVALID_ARGS; + } + + pDevice->capture.internalFormat = descriptorCapture.format; + pDevice->capture.internalChannels = descriptorCapture.channels; + pDevice->capture.internalSampleRate = descriptorCapture.sampleRate; + ma_channel_map_copy(pDevice->capture.internalChannelMap, descriptorCapture.channelMap, descriptorCapture.channels); + pDevice->capture.internalPeriodSizeInFrames = descriptorCapture.periodSizeInFrames; + pDevice->capture.internalPeriods = descriptorCapture.periodCount; + + if (pDevice->capture.internalPeriodSizeInFrames == 0) { + pDevice->capture.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorCapture.periodSizeInMilliseconds, descriptorCapture.sampleRate); + } + } + + if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { + if (!ma_device_descriptor_is_valid(&descriptorPlayback)) { + ma_device_uninit(pDevice); + return MA_INVALID_ARGS; + } + + pDevice->playback.internalFormat = descriptorPlayback.format; + pDevice->playback.internalChannels = descriptorPlayback.channels; + pDevice->playback.internalSampleRate = descriptorPlayback.sampleRate; + ma_channel_map_copy(pDevice->playback.internalChannelMap, descriptorPlayback.channelMap, descriptorPlayback.channels); + pDevice->playback.internalPeriodSizeInFrames = descriptorPlayback.periodSizeInFrames; + pDevice->playback.internalPeriods = descriptorPlayback.periodCount; + + if (pDevice->playback.internalPeriodSizeInFrames == 0) { + pDevice->playback.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorPlayback.periodSizeInMilliseconds, descriptorPlayback.sampleRate); + } + } + + + /* + The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead. + For loopback devices, we need to retrieve the name of the playback device. + */ + { + ma_device_info deviceInfo; + + if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { + result = ma_device_get_info(pDevice, (pConfig->deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo); + if (result == MA_SUCCESS) { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1); + } else { + /* We failed to retrieve the device info. Fall back to a default name. */ + if (descriptorCapture.pDeviceID == NULL) { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); + } else { + ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), "Capture Device", (size_t)-1); + } + } + } + + if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { + result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo); + if (result == MA_SUCCESS) { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1); + } else { + /* We failed to retrieve the device info. Fall back to a default name. */ + if (descriptorPlayback.pDeviceID == NULL) { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); + } else { + ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), "Playback Device", (size_t)-1); + } + } + } + } + + + ma_device__post_init_setup(pDevice, pConfig->deviceType); +#endif result = ma_device_post_init(pDevice, pConfig->deviceType, &descriptorPlayback, &descriptorCapture); if (result != MA_SUCCESS) { @@ -42309,7 +41971,7 @@ MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pC return result; } - /* Wait for the worker thread to put the device into its stopped state for real. */ + /* Wait for the worker thread to put the device into it's stopped state for real. */ ma_event_wait(&pDevice->stopEvent); MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped); } else { @@ -42509,8 +42171,8 @@ MA_API void ma_device_uninit(ma_device* pDevice) ma_thread_wait(&pDevice->thread); } - if (pDevice->pContext->pVTable->onDeviceUninit != NULL) { - pDevice->pContext->pVTable->onDeviceUninit(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceUninit != NULL) { + pDevice->pContext->callbacks.onDeviceUninit(pDevice); } @@ -42580,8 +42242,8 @@ MA_API ma_result ma_device_get_info(ma_device* pDevice, ma_device_type type, ma_ } /* If the onDeviceGetInfo() callback is set, use that. Otherwise we'll fall back to ma_context_get_device_info(). */ - if (pDevice->pContext->pVTable->onDeviceGetInfo != NULL && (pDevice->pContext->pVTable->onHasDeviceGetInfo == NULL || pDevice->pContext->pVTable->onHasDeviceGetInfo(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - return pDevice->pContext->pVTable->onDeviceGetInfo(pDevice->pContext->pVTableUserData, pDevice, type, pDeviceInfo); + if (pDevice->pContext->callbacks.onDeviceGetInfo != NULL) { + return pDevice->pContext->callbacks.onDeviceGetInfo(pDevice, type, pDeviceInfo); } /* Getting here means onDeviceGetInfo is not implemented so we need to fall back to an alternative. */ @@ -42656,8 +42318,8 @@ MA_API ma_result ma_device_start(ma_device* pDevice) /* Asynchronous backends need to be handled differently. */ if (ma_context_is_backend_asynchronous(pDevice->pContext)) { - if (pDevice->pContext->pVTable->onDeviceStart != NULL && (pDevice->pContext->pVTable->onHasStart == NULL || pDevice->pContext->pVTable->onHasStart(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - result = pDevice->pContext->pVTable->onDeviceStart(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceStart != NULL) { + result = pDevice->pContext->callbacks.onDeviceStart(pDevice); } else { result = MA_INVALID_OPERATION; } @@ -42717,8 +42379,8 @@ MA_API ma_result ma_device_stop(ma_device* pDevice) /* Asynchronous backends need to be handled differently. */ if (ma_context_is_backend_asynchronous(pDevice->pContext)) { /* Asynchronous backends must have a stop operation. */ - if (pDevice->pContext->pVTable->onDeviceStop != NULL && (pDevice->pContext->pVTable->onHasStop == NULL || pDevice->pContext->pVTable->onHasStop(pDevice->pContext->pVTableUserData, pDevice->pContext) == MA_TRUE)) { - result = pDevice->pContext->pVTable->onDeviceStop(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceStop != NULL) { + result = pDevice->pContext->callbacks.onDeviceStop(pDevice); } else { result = MA_INVALID_OPERATION; } @@ -42727,14 +42389,14 @@ MA_API ma_result ma_device_stop(ma_device* pDevice) } else { /* Synchronous backends. The stop callback is always called from the worker thread. Do not call the stop callback here. If - the backend is implementing its own audio thread loop we'll need to wake it up if required. Note that we need to make + the backend is implementing it's own audio thread loop we'll need to wake it up if required. Note that we need to make sure the state of the device is *not* playing right now, which it shouldn't be since we set it above. This is super important though, so I'm asserting it here as well for extra safety in case we accidentally change something later. */ MA_ASSERT(ma_device_get_state(pDevice) != ma_device_state_started); - if (pDevice->pContext->pVTable->onDeviceDataLoopWakeup != NULL) { - pDevice->pContext->pVTable->onDeviceDataLoopWakeup(pDevice->pContext->pVTableUserData, pDevice); + if (pDevice->pContext->callbacks.onDeviceDataLoopWakeup != NULL) { + pDevice->pContext->callbacks.onDeviceDataLoopWakeup(pDevice); } /* @@ -48722,6 +48384,8 @@ MA_API ma_delay_config ma_delay_config_init(ma_uint32 channels, ma_uint32 sample config.sampleRate = sampleRate; config.delayInFrames = delayInFrames; config.delayStart = (decay == 0) ? MA_TRUE : MA_FALSE; /* Delay the start if it looks like we're not configuring an echo. */ + config.wet = 1; + config.dry = 1; config.decay = decay; return config; @@ -48786,18 +48450,18 @@ MA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, /* Delayed start. */ /* Read */ - pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer]; + pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet; /* Feedback */ - pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + pFramesInF32[iChannel]; + pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry); } else { /* Immediate start */ /* Feedback */ - pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + pFramesInF32[iChannel]; + pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry); /* Read */ - pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer]; + pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet; } } @@ -48810,6 +48474,42 @@ MA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, return MA_SUCCESS; } +MA_API void ma_delay_set_wet(ma_delay* pDelay, float value) +{ + if (pDelay == NULL) { + return; + } + + pDelay->config.wet = value; +} + +MA_API float ma_delay_get_wet(const ma_delay* pDelay) +{ + if (pDelay == NULL) { + return 0; + } + + return pDelay->config.wet; +} + +MA_API void ma_delay_set_dry(ma_delay* pDelay, float value) +{ + if (pDelay == NULL) { + return; + } + + pDelay->config.dry = value; +} + +MA_API float ma_delay_get_dry(const ma_delay* pDelay) +{ + if (pDelay == NULL) { + return 0; + } + + return pDelay->config.dry; +} + MA_API void ma_delay_set_decay(ma_delay* pDelay, float value) { if (pDelay == NULL) { @@ -49989,9 +49689,9 @@ static float ma_attenuation_exponential(float distance, float minDistance, float /* -Doppler Effect calculation taken from the OpenAL spec, with two main differences: +Dopper Effect calculation taken from the OpenAL spec, with two main differences: - 1) The source to listener vector will have already been calculated at an earlier step so we can + 1) The source to listener vector will have already been calcualted at an earlier step so we can just use that directly. We need only the position of the source relative to the origin. 2) We don't scale by a frequency because we actually just want the ratio which we'll plug straight @@ -50364,7 +50064,7 @@ MA_API ma_spatializer_config ma_spatializer_config_init(ma_uint32 channelsIn, ma config.maxDistance = MA_FLT_MAX; config.rolloff = 1; config.coneInnerAngleInRadians = 6.283185f; /* 360 degrees. */ - config.coneOuterAngleInRadians = 6.283185f; /* 360 degrees. */ + config.coneOuterAngleInRadians = 6.283185f; /* 360 degress. */ config.coneOuterGain = 0.0f; config.dopplerFactor = 1; config.directionalAttenuationFactor = 1; @@ -50598,7 +50298,7 @@ static float ma_calculate_angular_gain(ma_vec3f dirA, ma_vec3f dirB, float coneI To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We just need to get the direction from the source to the listener and then do a dot product against that and the direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer - angles. If the dot product is greater than the outer angle, we just use coneOuterGain. If it's less than + angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain. */ if (coneInnerAngleInRadians < 6.283185f) { @@ -50749,11 +50449,11 @@ MA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We just need to get the direction from the source to the listener and then do a dot product against that and the direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer - angles. If the dot product is greater than the outer angle, we just use coneOuterGain. If it's less than + angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain. */ if (distance > 0) { - /* Source angular gain. */ + /* Source anglular gain. */ float spatializerConeInnerAngle; float spatializerConeOuterAngle; float spatializerConeOuterGain; @@ -51265,7 +50965,7 @@ MA_API void ma_spatializer_get_relative_position_and_direction(const ma_spatiali listenerDirection = ma_spatializer_listener_get_direction(pListener); /* - We need to calculate the right vector from our forward and up vectors. This is done with + We need to calcualte the right vector from our forward and up vectors. This is done with a cross product. */ axisZ = ma_vec3f_normalize(listenerDirection); /* Normalization required here because we can't trust the caller. */ @@ -51411,7 +51111,7 @@ static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pRes lpfConfig = ma_lpf_config_init(pResampler->config.format, pResampler->config.channels, lpfSampleRate, lpfCutoffFrequency, pResampler->config.lpfOrder); /* - If the resampler is already initialized we don't want to do a fresh initialization of the low-pass filter because it will result in the cached frames + If the resampler is alreay initialized we don't want to do a fresh initialization of the low-pass filter because it will result in the cached frames getting cleared. Instead we re-initialize the filter which will maintain any cached frames. */ if (isResamplerAlreadyInitialized) { @@ -52106,7 +51806,7 @@ MA_API ma_result ma_linear_resampler_get_expected_output_frame_count(const ma_li preliminaryInputFrameCount = (pResampler->inTimeInt + outputFrameCount*pResampler->inAdvanceInt ) + preliminaryInputFrameCountFromFrac; /* - If the total number of *whole* input frames that would be required to generate our preliminary output frame count is greater than + If the total number of *whole* input frames that would be required to generate our preliminary output frame count is greather than the amount of whole input frames we have available as input we need to *not* add an extra output frame as there won't be enough data to actually process. Otherwise we need to add the extra output frame. */ @@ -52144,7 +51844,7 @@ MA_API ma_result ma_linear_resampler_reset(ma_linear_resampler* pResampler) } } - /* The low pass filter needs to have its cache reset. */ + /* The low pass filter needs to have it's cache reset. */ ma_lpf_clear_cache(&pResampler->lpf); return MA_SUCCESS; @@ -52661,19 +52361,19 @@ static float ma_calculate_channel_position_rectangular_weight(ma_channel channel of contribution to apply to the side/left and back/left speakers, however, is a bit more complicated. Imagine the front/left speaker as emitting audio from two planes - the front plane and the left plane. You can think of the front/left - speaker emitting half of its total volume from the front, and the other half from the left. Since part of its volume is being emitted + speaker emitting half of it's total volume from the front, and the other half from the left. Since part of it's volume is being emitted from the left side, and the side/left and back/left channels also emit audio from the left plane, one would expect that they would receive some amount of contribution from front/left speaker. The amount of contribution depends on how many planes are shared between the two speakers. Note that in the examples below I've added a top/front/left speaker as an example just to show how the math works across 3 spatial dimensions. The first thing to do is figure out how each speaker's volume is spread over each of plane: - - front/left: 2 planes (front and left) = 1/2 = half its total volume on each plane + - front/left: 2 planes (front and left) = 1/2 = half it's total volume on each plane - side/left: 1 plane (left only) = 1/1 = entire volume from left plane - - back/left: 2 planes (back and left) = 1/2 = half its total volume on each plane - - top/front/left: 3 planes (top, front and left) = 1/3 = one third its total volume on each plane + - back/left: 2 planes (back and left) = 1/2 = half it's total volume on each plane + - top/front/left: 3 planes (top, front and left) = 1/3 = one third it's total volume on each plane - The amount of volume each channel contributes to each of its planes is what controls how much it is willing to given and take to other + The amount of volume each channel contributes to each of it's planes is what controls how much it is willing to given and take to other channels on the same plane. The volume that is willing to the given by one channel is multiplied by the volume that is willing to be taken by the other to produce the final contribution. */ @@ -52816,8 +52516,8 @@ static ma_result ma_channel_map_build_shuffle_table(const ma_channel* pChannelMa } /* - When building the shuffle table we just do a 1:1 mapping based on the first occurrence of a channel. If the - input channel has more than one occurrence of a channel position, the second one will be ignored. + When building the shuffle table we just do a 1:1 mapping based on the first occurance of a channel. If the + input channel has more than one occurance of a channel position, the second one will be ignored. */ for (iChannelOut = 0; iChannelOut < channelCountOut; iChannelOut += 1) { ma_channel channelOut; @@ -54219,7 +53919,7 @@ MA_API ma_data_converter_config ma_data_converter_config_init_default(void) config.allowDynamicSampleRate = MA_FALSE; /* Disable dynamic sample rates by default because dynamic rate adjustments should be quite rare and it allows an optimization for cases when the in and out sample rates are the same. */ /* Linear resampling defaults. */ - config.resampling.linear.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER); + config.resampling.linear.lpfOrder = 1; return config; } @@ -54249,7 +53949,7 @@ static ma_bool32 ma_data_converter_config_is_resampler_required(const ma_data_co { MA_ASSERT(pConfig != NULL); - return (pConfig->allowDynamicSampleRate == MA_TRUE) || (pConfig->sampleRateIn != pConfig->sampleRateOut); + return pConfig->allowDynamicSampleRate || pConfig->sampleRateIn != pConfig->sampleRateOut; } static ma_format ma_data_converter_config_get_mid_format(const ma_data_converter_config* pConfig) @@ -55112,7 +54812,7 @@ static ma_result ma_data_converter_process_pcm_frames__channels_first(ma_data_co Before doing any processing we need to determine how many frames we should try processing this iteration, for both input and output. The resampler requires us to perform format and channel conversion before passing any data into it. If we get our input count wrong, we'll - end up performing redundant pre-processing. This isn't the end of the world, but it does + end up peforming redundant pre-processing. This isn't the end of the world, but it does result in some inefficiencies proportionate to how far our estimates are off. If the resampler has a means to calculate exactly how much we'll need, we'll use that. @@ -57636,7 +57336,7 @@ MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, voi totalFramesProcessed += framesProcessed; /* - If we encountered an error from the read callback, make sure it's propagated to the caller. The caller may need to know whether or not MA_BUSY is returned which is + If we encounted an error from the read callback, make sure it's propagated to the caller. The caller may need to know whether or not MA_BUSY is returned which is not necessarily considered an error. */ if (result != MA_SUCCESS && result != MA_AT_END) { @@ -57883,11 +57583,6 @@ MA_API ma_result ma_data_source_get_cursor_in_seconds(ma_data_source* pDataSourc return result; } - /* If there is no notion of a sample rate we can't convert to seconds. */ - if (sampleRate == 0) { - return MA_INVALID_OPERATION; - } - /* VC6 does not support division of unsigned 64-bit integers with floating point numbers. Need to use a signed number. This shouldn't effect anything in practice. */ *pCursor = (ma_int64)cursorInPCMFrames / (float)sampleRate; @@ -57916,11 +57611,6 @@ MA_API ma_result ma_data_source_get_length_in_seconds(ma_data_source* pDataSourc return result; } - /* If there is no notion of a sample rate we can't convert to seconds. */ - if (sampleRate == 0) { - return MA_INVALID_OPERATION; - } - /* VC6 does not support division of unsigned 64-bit integers with floating point numbers. Need to use a signed number. This shouldn't effect anything in practice. */ *pLength = (ma_int64)lengthInPCMFrames / (float)sampleRate; @@ -57974,7 +57664,7 @@ MA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSou /* We may need to adjust the position of the cursor to ensure it's clamped to the range. Grab it now - so we can calculate its absolute position before we change the range. + so we can calculate it's absolute position before we change the range. */ result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &relativeCursor); if (result == MA_SUCCESS) { @@ -58008,7 +57698,7 @@ MA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSou /* Seek to within range. Note that our seek positions here are relative to the new range. We don't want - to do this if we failed to retrieve the cursor earlier on because it probably means the data source + do do this if we failed to retrieve the cursor earlier on because it probably means the data source has no notion of a cursor. In practice the seek would probably fail (which we silently ignore), but I'm just not even going to attempt it. */ @@ -58159,7 +57849,18 @@ MA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_da static ma_result ma_audio_buffer_ref__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) { - return ma_audio_buffer_ref_read_pcm_frames((ma_audio_buffer_ref*)pDataSource, pFramesOut, frameCount, pFramesRead); + ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource; + ma_uint64 framesRead = ma_audio_buffer_ref_read_pcm_frames(pAudioBufferRef, pFramesOut, frameCount, MA_FALSE); + + if (pFramesRead != NULL) { + *pFramesRead = framesRead; + } + + if (framesRead < frameCount || framesRead == 0) { + return MA_AT_END; + } + + return MA_SUCCESS; } static ma_result ma_audio_buffer_ref__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) @@ -58208,7 +57909,7 @@ static ma_data_source_vtable g_ma_audio_buffer_ref_data_source_vtable = 0 }; -MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef) +MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef) { ma_result result; ma_data_source_config dataSourceConfig; @@ -58229,7 +57930,7 @@ MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, pAudioBufferRef->format = format; pAudioBufferRef->channels = channels; - pAudioBufferRef->sampleRate = sampleRate; + pAudioBufferRef->sampleRate = 0; /* TODO: Version 0.12. Set this to sampleRate. */ pAudioBufferRef->cursor = 0; pAudioBufferRef->sizeInFrames = sizeInFrames; pAudioBufferRef->pData = pData; @@ -58259,41 +57960,47 @@ MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferR return MA_SUCCESS; } -MA_API ma_result ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) +MA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop) { - ma_uint64 framesAvailable; - ma_uint64 framesToRead; + ma_uint64 totalFramesRead = 0; - if (pFramesRead != NULL) { - *pFramesRead = 0; + if (pAudioBufferRef == NULL) { + return 0; } - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; + if (frameCount == 0) { + return 0; } - framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; + while (totalFramesRead < frameCount) { + ma_uint64 framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; + ma_uint64 framesRemaining = frameCount - totalFramesRead; + ma_uint64 framesToRead; - framesToRead = frameCount; - if (framesToRead > framesAvailable) { - framesToRead = framesAvailable; - } + framesToRead = framesRemaining; + if (framesToRead > framesAvailable) { + framesToRead = framesAvailable; + } - if (pFramesOut != NULL && framesToRead > 0) { - ma_copy_pcm_frames(pFramesOut, ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), framesToRead, pAudioBufferRef->format, pAudioBufferRef->channels); - } + if (pFramesOut != NULL) { + ma_copy_pcm_frames(ma_offset_ptr(pFramesOut, totalFramesRead * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), framesToRead, pAudioBufferRef->format, pAudioBufferRef->channels); + } - pAudioBufferRef->cursor += framesToRead; + totalFramesRead += framesToRead; - if (pFramesRead != NULL) { - *pFramesRead = framesToRead; - } + pAudioBufferRef->cursor += framesToRead; + if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) { + if (loop) { + pAudioBufferRef->cursor = 0; + } else { + break; /* We've reached the end and we're not looping. Done. */ + } + } - if (framesToRead == 0) { - return MA_AT_END; - } else { - return MA_SUCCESS; + MA_ASSERT(pAudioBufferRef->cursor < pAudioBufferRef->sizeInFrames); } + + return totalFramesRead; } MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex) @@ -58429,14 +58136,14 @@ MA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ -MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks) { ma_audio_buffer_config config; MA_ZERO_OBJECT(&config); config.format = format; config.channels = channels; - config.sampleRate = sampleRate; + config.sampleRate = 0; /* TODO: Version 0.12. Set this to sampleRate. */ config.sizeInFrames = sizeInFrames; config.pData = pData; ma_allocation_callbacks_init_copy(&config.allocationCallbacks, pAllocationCallbacks); @@ -58462,11 +58169,14 @@ static ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig, return MA_INVALID_ARGS; /* Not allowing buffer sizes of 0 frames. */ } - result = ma_audio_buffer_ref_init(pConfig->format, pConfig->channels, pConfig->sampleRate, NULL, 0, &pAudioBuffer->ref); + result = ma_audio_buffer_ref_init(pConfig->format, pConfig->channels, NULL, 0, &pAudioBuffer->ref); if (result != MA_SUCCESS) { return result; } + /* TODO: Version 0.12. Set this in ma_audio_buffer_ref_init() instead of here. */ + pAudioBuffer->ref.sampleRate = pConfig->sampleRate; + ma_allocation_callbacks_init_copy(&pAudioBuffer->allocationCallbacks, &pConfig->allocationCallbacks); if (doCopy) { @@ -58585,13 +58295,13 @@ MA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer) ma_audio_buffer_uninit_ex(pAudioBuffer, MA_TRUE); } -MA_API ma_result ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) +MA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop) { if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; + return 0; } - return ma_audio_buffer_ref_read_pcm_frames(&pAudioBuffer->ref, pFramesOut, frameCount, pFramesRead); + return ma_audio_buffer_ref_read_pcm_frames(&pAudioBuffer->ref, pFramesOut, frameCount, loop); } MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex) @@ -59445,7 +59155,7 @@ static ma_result ma_default_vfs_seek__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i result = ma_SetFilePointerEx((HANDLE)file, liDistanceToMove, NULL, dwMoveMethod); } else if (ma_SetFilePointer != NULL) { /* No SetFilePointerEx() so restrict to 31 bits. */ - if (offset > 0x7FFFFFFF) { + if (origin > 0x7FFFFFFF) { return MA_OUT_OF_RANGE; } @@ -60048,7 +59758,7 @@ extern "C" { #define MA_DR_WAV_XSTRINGIFY(x) MA_DR_WAV_STRINGIFY(x) #define MA_DR_WAV_VERSION_MAJOR 0 #define MA_DR_WAV_VERSION_MINOR 13 -#define MA_DR_WAV_VERSION_REVISION 16 +#define MA_DR_WAV_VERSION_REVISION 13 #define MA_DR_WAV_VERSION_STRING MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MAJOR) "." MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MINOR) "." MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_REVISION) #include #define MA_DR_WAVE_FORMAT_PCM 0x1 @@ -60755,7 +60465,7 @@ extern "C" { #define MA_DR_MP3_XSTRINGIFY(x) MA_DR_MP3_STRINGIFY(x) #define MA_DR_MP3_VERSION_MAJOR 0 #define MA_DR_MP3_VERSION_MINOR 6 -#define MA_DR_MP3_VERSION_REVISION 39 +#define MA_DR_MP3_VERSION_REVISION 38 #define MA_DR_MP3_VERSION_STRING MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MAJOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MINOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_REVISION) #include #define MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152 @@ -60864,6 +60574,444 @@ Decoding **************************************************************************************************************************************************************/ #ifndef MA_NO_DECODING +static ma_result ma_decoder_read_bytes(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) +{ + MA_ASSERT(pDecoder != NULL); + + return pDecoder->onRead(pDecoder, pBufferOut, bytesToRead, pBytesRead); +} + +static ma_result ma_decoder_seek_bytes(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin) +{ + MA_ASSERT(pDecoder != NULL); + + return pDecoder->onSeek(pDecoder, byteOffset, origin); +} + +static ma_result ma_decoder_tell_bytes(ma_decoder* pDecoder, ma_int64* pCursor) +{ + MA_ASSERT(pDecoder != NULL); + + if (pDecoder->onTell == NULL) { + return MA_NOT_IMPLEMENTED; + } + + return pDecoder->onTell(pDecoder, pCursor); +} + + +MA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount) +{ + ma_decoding_backend_config config; + + MA_ZERO_OBJECT(&config); + config.preferredFormat = preferredFormat; + config.seekPointCount = seekPointCount; + + return config; +} + + +MA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate) +{ + ma_decoder_config config; + MA_ZERO_OBJECT(&config); + config.format = outputFormat; + config.channels = outputChannels; + config.sampleRate = outputSampleRate; + config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate doesn't matter here. */ + config.encodingFormat = ma_encoding_format_unknown; + + /* Note that we are intentionally leaving the channel map empty here which will cause the default channel map to be used. */ + + return config; +} + +MA_API ma_decoder_config ma_decoder_config_init_default() +{ + return ma_decoder_config_init(ma_format_unknown, 0, 0); +} + +MA_API ma_decoder_config ma_decoder_config_init_copy(const ma_decoder_config* pConfig) +{ + ma_decoder_config config; + if (pConfig != NULL) { + config = *pConfig; + } else { + MA_ZERO_OBJECT(&config); + } + + return config; +} + +static ma_result ma_decoder__init_data_converter(ma_decoder* pDecoder, const ma_decoder_config* pConfig) +{ + ma_result result; + ma_data_converter_config converterConfig; + ma_format internalFormat; + ma_uint32 internalChannels; + ma_uint32 internalSampleRate; + ma_channel internalChannelMap[MA_MAX_CHANNELS]; + + MA_ASSERT(pDecoder != NULL); + MA_ASSERT(pConfig != NULL); + + result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, &internalSampleRate, internalChannelMap, ma_countof(internalChannelMap)); + if (result != MA_SUCCESS) { + return result; /* Failed to retrieve the internal data format. */ + } + + + /* Make sure we're not asking for too many channels. */ + if (pConfig->channels > MA_MAX_CHANNELS) { + return MA_INVALID_ARGS; + } + + /* The internal channels should have already been validated at a higher level, but we'll do it again explicitly here for safety. */ + if (internalChannels > MA_MAX_CHANNELS) { + return MA_INVALID_ARGS; + } + + + /* Output format. */ + if (pConfig->format == ma_format_unknown) { + pDecoder->outputFormat = internalFormat; + } else { + pDecoder->outputFormat = pConfig->format; + } + + if (pConfig->channels == 0) { + pDecoder->outputChannels = internalChannels; + } else { + pDecoder->outputChannels = pConfig->channels; + } + + if (pConfig->sampleRate == 0) { + pDecoder->outputSampleRate = internalSampleRate; + } else { + pDecoder->outputSampleRate = pConfig->sampleRate; + } + + converterConfig = ma_data_converter_config_init( + internalFormat, pDecoder->outputFormat, + internalChannels, pDecoder->outputChannels, + internalSampleRate, pDecoder->outputSampleRate + ); + converterConfig.pChannelMapIn = internalChannelMap; + converterConfig.pChannelMapOut = pConfig->pChannelMap; + converterConfig.channelMixMode = pConfig->channelMixMode; + converterConfig.ditherMode = pConfig->ditherMode; + converterConfig.allowDynamicSampleRate = MA_FALSE; /* Never allow dynamic sample rate conversion. Setting this to true will disable passthrough optimizations. */ + converterConfig.resampling = pConfig->resampling; + + result = ma_data_converter_init(&converterConfig, &pDecoder->allocationCallbacks, &pDecoder->converter); + if (result != MA_SUCCESS) { + return result; + } + + /* + Now that we have the decoder we need to determine whether or not we need a heap-allocated cache. We'll + need this if the data converter does not support calculation of the required input frame count. To + determine support for this we'll just run a test. + */ + { + ma_uint64 unused; + + result = ma_data_converter_get_required_input_frame_count(&pDecoder->converter, 1, &unused); + if (result != MA_SUCCESS) { + /* + We were unable to calculate the required input frame count which means we'll need to use + a heap-allocated cache. + */ + ma_uint64 inputCacheCapSizeInBytes; + + pDecoder->inputCacheCap = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(internalFormat, internalChannels); + + /* Not strictly necessary, but keeping here for safety in case we change the default value of pDecoder->inputCacheCap. */ + inputCacheCapSizeInBytes = pDecoder->inputCacheCap * ma_get_bytes_per_frame(internalFormat, internalChannels); + if (inputCacheCapSizeInBytes > MA_SIZE_MAX) { + ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); + return MA_OUT_OF_MEMORY; + } + + pDecoder->pInputCache = ma_malloc((size_t)inputCacheCapSizeInBytes, &pDecoder->allocationCallbacks); /* Safe cast to size_t. */ + if (pDecoder->pInputCache == NULL) { + ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); + return MA_OUT_OF_MEMORY; + } + } + } + + return MA_SUCCESS; +} + + + +static ma_result ma_decoder_internal_on_read__custom(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) +{ + ma_decoder* pDecoder = (ma_decoder*)pUserData; + MA_ASSERT(pDecoder != NULL); + + return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead, pBytesRead); +} + +static ma_result ma_decoder_internal_on_seek__custom(void* pUserData, ma_int64 offset, ma_seek_origin origin) +{ + ma_decoder* pDecoder = (ma_decoder*)pUserData; + MA_ASSERT(pDecoder != NULL); + + return ma_decoder_seek_bytes(pDecoder, offset, origin); +} + +static ma_result ma_decoder_internal_on_tell__custom(void* pUserData, ma_int64* pCursor) +{ + ma_decoder* pDecoder = (ma_decoder*)pUserData; + MA_ASSERT(pDecoder != NULL); + + return ma_decoder_tell_bytes(pDecoder, pCursor); +} + + +static ma_result ma_decoder_init_from_vtable__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result; + ma_decoding_backend_config backendConfig; + ma_data_source* pBackend; + + MA_ASSERT(pVTable != NULL); + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pVTable->onInit == NULL) { + return MA_NOT_IMPLEMENTED; + } + + backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount); + + result = pVTable->onInit(pVTableUserData, ma_decoder_internal_on_read__custom, ma_decoder_internal_on_seek__custom, ma_decoder_internal_on_tell__custom, pDecoder, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); + if (result != MA_SUCCESS) { + return result; /* Failed to initialize the backend from this vtable. */ + } + + /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ + pDecoder->pBackend = pBackend; + pDecoder->pBackendVTable = pVTable; + pDecoder->pBackendUserData = pConfig->pCustomBackendUserData; + + return MA_SUCCESS; +} + +static ma_result ma_decoder_init_from_file__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result; + ma_decoding_backend_config backendConfig; + ma_data_source* pBackend; + + MA_ASSERT(pVTable != NULL); + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pVTable->onInitFile == NULL) { + return MA_NOT_IMPLEMENTED; + } + + backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount); + + result = pVTable->onInitFile(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); + if (result != MA_SUCCESS) { + return result; /* Failed to initialize the backend from this vtable. */ + } + + /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ + pDecoder->pBackend = pBackend; + pDecoder->pBackendVTable = pVTable; + pDecoder->pBackendUserData = pConfig->pCustomBackendUserData; + + return MA_SUCCESS; +} + +static ma_result ma_decoder_init_from_file_w__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result; + ma_decoding_backend_config backendConfig; + ma_data_source* pBackend; + + MA_ASSERT(pVTable != NULL); + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pVTable->onInitFileW == NULL) { + return MA_NOT_IMPLEMENTED; + } + + backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount); + + result = pVTable->onInitFileW(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); + if (result != MA_SUCCESS) { + return result; /* Failed to initialize the backend from this vtable. */ + } + + /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ + pDecoder->pBackend = pBackend; + pDecoder->pBackendVTable = pVTable; + pDecoder->pBackendUserData = pConfig->pCustomBackendUserData; + + return MA_SUCCESS; +} + +static ma_result ma_decoder_init_from_memory__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result; + ma_decoding_backend_config backendConfig; + ma_data_source* pBackend; + + MA_ASSERT(pVTable != NULL); + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pVTable->onInitMemory == NULL) { + return MA_NOT_IMPLEMENTED; + } + + backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount); + + result = pVTable->onInitMemory(pVTableUserData, pData, dataSize, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); + if (result != MA_SUCCESS) { + return result; /* Failed to initialize the backend from this vtable. */ + } + + /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ + pDecoder->pBackend = pBackend; + pDecoder->pBackendVTable = pVTable; + pDecoder->pBackendUserData = pConfig->pCustomBackendUserData; + + return MA_SUCCESS; +} + + + +static ma_result ma_decoder_init_custom__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result = MA_NO_BACKEND; + size_t ivtable; + + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pConfig->ppCustomBackendVTables == NULL) { + return MA_NO_BACKEND; + } + + /* The order each backend is listed is what defines the priority. */ + for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) { + const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable]; + if (pVTable != NULL) { + result = ma_decoder_init_from_vtable__internal(pVTable, pConfig->pCustomBackendUserData, pConfig, pDecoder); + if (result == MA_SUCCESS) { + return MA_SUCCESS; + } else { + /* Initialization failed. Move on to the next one, but seek back to the start first so the next vtable starts from the first byte of the file. */ + result = ma_decoder_seek_bytes(pDecoder, 0, ma_seek_origin_start); + if (result != MA_SUCCESS) { + return result; /* Failed to seek back to the start. */ + } + } + } else { + /* No vtable. */ + } + } + + /* Getting here means we couldn't find a backend. */ + return MA_NO_BACKEND; +} + +static ma_result ma_decoder_init_custom_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result = MA_NO_BACKEND; + size_t ivtable; + + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pConfig->ppCustomBackendVTables == NULL) { + return MA_NO_BACKEND; + } + + /* The order each backend is listed is what defines the priority. */ + for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) { + const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable]; + if (pVTable != NULL) { + result = ma_decoder_init_from_file__internal(pVTable, pConfig->pCustomBackendUserData, pFilePath, pConfig, pDecoder); + if (result == MA_SUCCESS) { + return MA_SUCCESS; + } + } else { + /* No vtable. */ + } + } + + /* Getting here means we couldn't find a backend. */ + return MA_NO_BACKEND; +} + +static ma_result ma_decoder_init_custom_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result = MA_NO_BACKEND; + size_t ivtable; + + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pConfig->ppCustomBackendVTables == NULL) { + return MA_NO_BACKEND; + } + + /* The order each backend is listed is what defines the priority. */ + for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) { + const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable]; + if (pVTable != NULL) { + result = ma_decoder_init_from_file_w__internal(pVTable, pConfig->pCustomBackendUserData, pFilePath, pConfig, pDecoder); + if (result == MA_SUCCESS) { + return MA_SUCCESS; + } + } else { + /* No vtable. */ + } + } + + /* Getting here means we couldn't find a backend. */ + return MA_NO_BACKEND; +} + +static ma_result ma_decoder_init_custom_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + ma_result result = MA_NO_BACKEND; + size_t ivtable; + + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); + + if (pConfig->ppCustomBackendVTables == NULL) { + return MA_NO_BACKEND; + } + + /* The order each backend is listed is what defines the priority. */ + for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) { + const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable]; + if (pVTable != NULL) { + result = ma_decoder_init_from_memory__internal(pVTable, pConfig->pCustomBackendUserData, pData, dataSize, pConfig, pDecoder); + if (result == MA_SUCCESS) { + return MA_SUCCESS; + } + } else { + /* No vtable. */ + } + } + + /* Getting here means we couldn't find a backend. */ + return MA_NO_BACKEND; +} + /* WAV */ #ifdef ma_dr_wav_h @@ -61519,26 +61667,34 @@ static void ma_decoding_backend_uninit__wav(void* pUserData, ma_data_source* pBa ma_free(pWav, pAllocationCallbacks); } -static ma_encoding_format ma_decoding_backend_get_encoding_format__wav(void* pUserData, ma_data_source* pBackend) -{ - (void)pUserData; - (void)pBackend; - - return ma_encoding_format_wav; -} - static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_wav = { ma_decoding_backend_init__wav, ma_decoding_backend_init_file__wav, ma_decoding_backend_init_file_w__wav, ma_decoding_backend_init_memory__wav, - ma_decoding_backend_uninit__wav, - ma_decoding_backend_get_encoding_format__wav + ma_decoding_backend_uninit__wav }; -const ma_decoding_backend_vtable* ma_decoding_backend_wav = &g_ma_decoding_backend_vtable_wav; -#else -const ma_decoding_backend_vtable* ma_decoding_backend_wav = NULL; + +static ma_result ma_decoder_init_wav__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_wav, NULL, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_wav_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_wav, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_wav_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_wav, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_wav_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_wav, NULL, pData, dataSize, pConfig, pDecoder); +} #endif /* ma_dr_wav_h */ /* FLAC */ @@ -62133,26 +62289,34 @@ static void ma_decoding_backend_uninit__flac(void* pUserData, ma_data_source* pB ma_free(pFlac, pAllocationCallbacks); } -static ma_encoding_format ma_decoding_backend_get_encoding_format__flac(void* pUserData, ma_data_source* pBackend) -{ - (void)pUserData; - (void)pBackend; - - return ma_encoding_format_flac; -} - static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_flac = { ma_decoding_backend_init__flac, ma_decoding_backend_init_file__flac, ma_decoding_backend_init_file_w__flac, ma_decoding_backend_init_memory__flac, - ma_decoding_backend_uninit__flac, - ma_decoding_backend_get_encoding_format__flac + ma_decoding_backend_uninit__flac }; -const ma_decoding_backend_vtable* ma_decoding_backend_flac = &g_ma_decoding_backend_vtable_flac; -#else -const ma_decoding_backend_vtable* ma_decoding_backend_flac = NULL; + +static ma_result ma_decoder_init_flac__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_flac, NULL, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_flac_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_flac, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_flac_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_flac, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_flac_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_flac, NULL, pData, dataSize, pConfig, pDecoder); +} #endif /* ma_dr_flac_h */ /* MP3 */ @@ -62805,26 +62969,34 @@ static void ma_decoding_backend_uninit__mp3(void* pUserData, ma_data_source* pBa ma_free(pMP3, pAllocationCallbacks); } -static ma_encoding_format ma_decoding_backend_get_encoding_format__mp3(void* pUserData, ma_data_source* pBackend) -{ - (void)pUserData; - (void)pBackend; - - return ma_encoding_format_mp3; -} - static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_mp3 = { ma_decoding_backend_init__mp3, ma_decoding_backend_init_file__mp3, ma_decoding_backend_init_file_w__mp3, ma_decoding_backend_init_memory__mp3, - ma_decoding_backend_uninit__mp3, - ma_decoding_backend_get_encoding_format__mp3 + ma_decoding_backend_uninit__mp3 }; -const ma_decoding_backend_vtable* ma_decoding_backend_mp3 = &g_ma_decoding_backend_vtable_mp3; -#else -const ma_decoding_backend_vtable* ma_decoding_backend_mp3 = NULL; + +static ma_result ma_decoder_init_mp3__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_mp3_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_mp3_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pFilePath, pConfig, pDecoder); +} + +static ma_result ma_decoder_init_mp3_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +{ + return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pData, dataSize, pConfig, pDecoder); +} #endif /* ma_dr_mp3_h */ /* Vorbis */ @@ -63048,7 +63220,7 @@ MA_API ma_result ma_stbvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_ #if !defined(MA_NO_VORBIS) { /* - stb_vorbis lacks a callback based API for its pulling API which means we're stuck with the + stb_vorbis lacks a callback based API for it's pulling API which means we're stuck with the pushing API. In order for us to be able to successfully initialize the decoder we need to supply it with enough data. We need to keep loading data until we have enough. */ @@ -63129,7 +63301,7 @@ MA_API ma_result ma_stbvorbis_init_memory(const void* pData, size_t dataSize, co { (void)pAllocationCallbacks; - /* stb_vorbis uses an int as its size specifier, restricting it to 32-bit even on 64-bit systems. *sigh*. */ + /* stb_vorbis uses an int as it's size specifier, restricting it to 32-bit even on 64-bit systems. *sigh*. */ if (dataSize > INT_MAX) { return MA_TOO_BIG; } @@ -63219,7 +63391,7 @@ MA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFram /* The first thing to do is read from any already-cached frames. */ ma_uint32 framesToReadFromCache = (ma_uint32)ma_min(pVorbis->push.framesRemaining, (frameCount - totalFramesRead)); /* Safe cast because pVorbis->framesRemaining is 32-bit. */ - /* The output pointer can be null in which case we just treat it as a seek. */ + /* The output pointer can be null in which case we just treate it as a seek. */ if (pFramesOut != NULL) { ma_uint64 iFrame; for (iFrame = 0; iFrame < framesToReadFromCache; iFrame += 1) { @@ -63293,7 +63465,7 @@ MA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFram } } - /* If we don't have a success code at this point it means we've encountered an error or the end of the file has been reached (probably the latter). */ + /* If we don't have a success code at this point it means we've encounted an error or the end of the file has been reached (probably the latter). */ if (result != MA_SUCCESS) { break; } @@ -63629,556 +63801,35 @@ static void ma_decoding_backend_uninit__stbvorbis(void* pUserData, ma_data_sourc ma_free(pVorbis, pAllocationCallbacks); } -static ma_encoding_format ma_decoding_backend_get_encoding_format__stbvorbis(void* pUserData, ma_data_source* pBackend) -{ - (void)pUserData; - (void)pBackend; - - return ma_encoding_format_vorbis; -} - static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_stbvorbis = { ma_decoding_backend_init__stbvorbis, ma_decoding_backend_init_file__stbvorbis, NULL, /* onInitFileW() */ ma_decoding_backend_init_memory__stbvorbis, - ma_decoding_backend_uninit__stbvorbis, - ma_decoding_backend_get_encoding_format__stbvorbis + ma_decoding_backend_uninit__stbvorbis }; -#endif /* STB_VORBIS_INCLUDE_STB_VORBIS_H */ - - - -static const char* ma_path_file_name(const char* path) -{ - const char* fileName; - - if (path == NULL) { - return NULL; - } - - fileName = path; - - /* We just loop through the path until we find the last slash. */ - while (path[0] != '\0') { - if (path[0] == '/' || path[0] == '\\') { - fileName = path; - } - - path += 1; - } - - /* At this point the file name is sitting on a slash, so just move forward. */ - while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { - fileName += 1; - } - - return fileName; -} - -static const wchar_t* ma_path_file_name_w(const wchar_t* path) -{ - const wchar_t* fileName; - - if (path == NULL) { - return NULL; - } - - fileName = path; - - /* We just loop through the path until we find the last slash. */ - while (path[0] != '\0') { - if (path[0] == '/' || path[0] == '\\') { - fileName = path; - } - - path += 1; - } - - /* At this point the file name is sitting on a slash, so just move forward. */ - while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { - fileName += 1; - } - - return fileName; -} - - -static const char* ma_path_extension(const char* path) -{ - const char* extension; - const char* lastOccurance; - - if (path == NULL) { - path = ""; - } - - extension = ma_path_file_name(path); - lastOccurance = NULL; - - /* Just find the last '.' and return. */ - while (extension[0] != '\0') { - if (extension[0] == '.') { - extension += 1; - lastOccurance = extension; - } - - extension += 1; - } - - return (lastOccurance != NULL) ? lastOccurance : extension; -} - -static const wchar_t* ma_path_extension_w(const wchar_t* path) -{ - const wchar_t* extension; - const wchar_t* lastOccurance; - - if (path == NULL) { - path = L""; - } - - extension = ma_path_file_name_w(path); - lastOccurance = NULL; - - /* Just find the last '.' and return. */ - while (extension[0] != '\0') { - if (extension[0] == '.') { - extension += 1; - lastOccurance = extension; - } - - extension += 1; - } - - return (lastOccurance != NULL) ? lastOccurance : extension; -} - - -static ma_bool32 ma_path_extension_equal(const char* path, const char* extension) -{ - const char* ext1; - const char* ext2; - - if (path == NULL || extension == NULL) { - return MA_FALSE; - } - - ext1 = extension; - ext2 = ma_path_extension(path); - -#if defined(_MSC_VER) || defined(__DMC__) - return _stricmp(ext1, ext2) == 0; -#else - return strcasecmp(ext1, ext2) == 0; -#endif -} - -static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* extension) -{ - const wchar_t* ext1; - const wchar_t* ext2; - - if (path == NULL || extension == NULL) { - return MA_FALSE; - } - - ext1 = extension; - ext2 = ma_path_extension_w(path); - -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) - return _wcsicmp(ext1, ext2) == 0; -#else - /* - I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This - isn't the most efficient way to do it, but it should work OK. - */ - { - char ext1MB[4096]; - char ext2MB[4096]; - const wchar_t* pext1 = ext1; - const wchar_t* pext2 = ext2; - mbstate_t mbs1; - mbstate_t mbs2; - - MA_ZERO_OBJECT(&mbs1); - MA_ZERO_OBJECT(&mbs2); - - if (wcsrtombs(ext1MB, &pext1, sizeof(ext1MB), &mbs1) == (size_t)-1) { - return MA_FALSE; - } - if (wcsrtombs(ext2MB, &pext2, sizeof(ext2MB), &mbs2) == (size_t)-1) { - return MA_FALSE; - } - - return strcasecmp(ext1MB, ext2MB) == 0; - } -#endif -} - - -MA_API ma_encoding_format ma_encoding_format_from_path(const char* pFilePath) -{ - /* */ if (ma_path_extension_equal(pFilePath, "wav")) { - return ma_encoding_format_wav; - } else if (ma_path_extension_equal(pFilePath, "flac")) { - return ma_encoding_format_flac; - } else if (ma_path_extension_equal(pFilePath, "mp3")) { - return ma_encoding_format_mp3; - } else if (ma_path_extension_equal(pFilePath, "ogg")) { - return ma_encoding_format_vorbis; - } else if (ma_path_extension_equal(pFilePath, "opus")) { - return ma_encoding_format_opus; - } else { - return ma_encoding_format_unknown; - } -} - -MA_API ma_encoding_format ma_encoding_format_from_path_w(const wchar_t* pFilePath) -{ - /* */ if (ma_path_extension_equal_w(pFilePath, L"wav")) { - return ma_encoding_format_wav; - } else if (ma_path_extension_equal_w(pFilePath, L"flac")) { - return ma_encoding_format_flac; - } else if (ma_path_extension_equal_w(pFilePath, L"mp3")) { - return ma_encoding_format_mp3; - } else if (ma_path_extension_equal_w(pFilePath, L"ogg")) { - return ma_encoding_format_vorbis; - } else if (ma_path_extension_equal_w(pFilePath, L"opus")) { - return ma_encoding_format_opus; - } else { - return ma_encoding_format_unknown; - } -} - - -static ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount, ma_encoding_format encodingFormat) -{ - ma_decoding_backend_config config; - - MA_ZERO_OBJECT(&config); - config.preferredFormat = preferredFormat; - config.seekPointCount = seekPointCount; - config.encodingFormat = encodingFormat; - - return config; -} - - -MA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate) -{ - ma_decoder_config config; - MA_ZERO_OBJECT(&config); - config.format = outputFormat; - config.channels = outputChannels; - config.sampleRate = outputSampleRate; - config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate doesn't matter here. */ - config.encodingFormat = ma_encoding_format_unknown; - - /* Note that we are intentionally leaving the channel map empty here which will cause the default channel map to be used. */ - - return config; -} - -MA_API ma_decoder_config ma_decoder_config_init_default() -{ - return ma_decoder_config_init(ma_format_unknown, 0, 0); -} - - - -static const ma_decoding_backend_vtable* ma_DefaultDecodingBackendVTables[] = -{ -#if defined(MA_HAS_WAV) - &g_ma_decoding_backend_vtable_wav, -#else - NULL, -#endif -#if defined(MA_HAS_FLAC) - &g_ma_decoding_backend_vtable_flac, -#else - NULL, -#endif -#if defined(MA_HAS_MP3) - &g_ma_decoding_backend_vtable_mp3, -#else - NULL, -#endif -#if defined(MA_HAS_VORBIS) - &g_ma_decoding_backend_vtable_stbvorbis -#else - NULL -#endif -}; - -static ma_decoder_config ma_decoder_config_init_copy(const ma_decoder_config* pConfig) -{ - ma_decoder_config config; - if (pConfig != NULL) { - config = *pConfig; - } else { - MA_ZERO_OBJECT(&config); - } - - /* Make sure we always have a valid VTable for initialization time. */ - if (config.ppBackendVTables == NULL) { - config.ppBackendVTables = ma_DefaultDecodingBackendVTables; - config.backendCount = ma_countof(ma_DefaultDecodingBackendVTables); - } - - return config; -} - -static ma_result ma_decoder__init_data_converter(ma_decoder* pDecoder, const ma_decoder_config* pConfig) -{ - ma_result result; - ma_data_converter_config converterConfig; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_channel internalChannelMap[MA_MAX_CHANNELS]; - - MA_ASSERT(pDecoder != NULL); - MA_ASSERT(pConfig != NULL); - - result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, &internalSampleRate, internalChannelMap, ma_countof(internalChannelMap)); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal data format. */ - } - - - /* Make sure we're not asking for too many channels. */ - if (pConfig->channels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - /* The internal channels should have already been validated at a higher level, but we'll do it again explicitly here for safety. */ - if (internalChannels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - - /* Output format. */ - if (pConfig->format == ma_format_unknown) { - pDecoder->outputFormat = internalFormat; - } else { - pDecoder->outputFormat = pConfig->format; - } - - if (pConfig->channels == 0) { - pDecoder->outputChannels = internalChannels; - } else { - pDecoder->outputChannels = pConfig->channels; - } - - if (pConfig->sampleRate == 0) { - pDecoder->outputSampleRate = internalSampleRate; - } else { - pDecoder->outputSampleRate = pConfig->sampleRate; - } - - converterConfig = ma_data_converter_config_init( - internalFormat, pDecoder->outputFormat, - internalChannels, pDecoder->outputChannels, - internalSampleRate, pDecoder->outputSampleRate - ); - converterConfig.pChannelMapIn = internalChannelMap; - converterConfig.pChannelMapOut = pConfig->pChannelMap; - converterConfig.channelMixMode = pConfig->channelMixMode; - converterConfig.ditherMode = pConfig->ditherMode; - converterConfig.allowDynamicSampleRate = MA_FALSE; /* Never allow dynamic sample rate conversion. Setting this to true will disable passthrough optimizations. */ - converterConfig.resampling = pConfig->resampling; - - result = ma_data_converter_init(&converterConfig, &pDecoder->allocationCallbacks, &pDecoder->converter); - if (result != MA_SUCCESS) { - return result; - } - - /* - Now that we have the decoder we need to determine whether or not we need a heap-allocated cache. We'll - need this if the data converter does not support calculation of the required input frame count. To - determine support for this we'll just run a test. - */ - { - ma_uint64 unused; - - result = ma_data_converter_get_required_input_frame_count(&pDecoder->converter, 1, &unused); - if (result != MA_SUCCESS) { - /* - We were unable to calculate the required input frame count which means we'll need to use - a heap-allocated cache. - */ - ma_uint64 inputCacheCapSizeInBytes; - - pDecoder->inputCacheCap = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(internalFormat, internalChannels); - - /* Not strictly necessary, but keeping here for safety in case we change the default value of pDecoder->inputCacheCap. */ - inputCacheCapSizeInBytes = pDecoder->inputCacheCap * ma_get_bytes_per_frame(internalFormat, internalChannels); - if (inputCacheCapSizeInBytes > MA_SIZE_MAX) { - ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - pDecoder->pInputCache = ma_malloc((size_t)inputCacheCapSizeInBytes, &pDecoder->allocationCallbacks); /* Safe cast to size_t. */ - if (pDecoder->pInputCache == NULL) { - ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - } - } - - return MA_SUCCESS; -} - - - - - -static ma_result ma_decoder_on_read(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - return pDecoder->onRead(pDecoder, pBufferOut, bytesToRead, pBytesRead); -} - -static ma_result ma_decoder_on_seek(void* pUserData, ma_int64 offset, ma_seek_origin origin) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - return pDecoder->onSeek(pDecoder, offset, origin); -} - -static ma_result ma_decoder_on_tell(void* pUserData, ma_int64* pCursor) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - if (pDecoder->onTell == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDecoder->onTell(pDecoder, pCursor); -} - -static ma_result ma_decoder_init_from_vtable__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +static ma_result ma_decoder_init_vorbis__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) { - ma_result result; - ma_decoding_backend_config backendConfig; - ma_data_source* pBackend; - - MA_ASSERT(pVTable != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pVTable->onInit == NULL) { - return MA_NOT_IMPLEMENTED; - } - - backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount, pConfig->encodingFormat); - - result = pVTable->onInit(pVTableUserData, ma_decoder_on_read, ma_decoder_on_seek, ma_decoder_on_tell, pDecoder, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the backend from this vtable. */ - } - - /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ - pDecoder->pBackend = pBackend; - pDecoder->pBackendVTable = pVTable; - pDecoder->pBackendUserData = pVTableUserData; - - return MA_SUCCESS; + return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pConfig, pDecoder); } -static ma_result ma_decoder_init_from_file__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +static ma_result ma_decoder_init_vorbis_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) { - ma_result result; - ma_decoding_backend_config backendConfig; - ma_data_source* pBackend; - - MA_ASSERT(pVTable != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pVTable->onInitFile == NULL) { - return MA_NOT_IMPLEMENTED; - } - - backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount, pConfig->encodingFormat); - - result = pVTable->onInitFile(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the backend from this vtable. */ - } - - /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ - pDecoder->pBackend = pBackend; - pDecoder->pBackendVTable = pVTable; - pDecoder->pBackendUserData = pVTableUserData; - - return MA_SUCCESS; + return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pFilePath, pConfig, pDecoder); } -static ma_result ma_decoder_init_from_file_w__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +static ma_result ma_decoder_init_vorbis_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) { - ma_result result; - ma_decoding_backend_config backendConfig; - ma_data_source* pBackend; - - MA_ASSERT(pVTable != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pVTable->onInitFileW == NULL) { - return MA_NOT_IMPLEMENTED; - } - - backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount, pConfig->encodingFormat); - - result = pVTable->onInitFileW(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the backend from this vtable. */ - } - - /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ - pDecoder->pBackend = pBackend; - pDecoder->pBackendVTable = pVTable; - pDecoder->pBackendUserData = pVTableUserData; - - return MA_SUCCESS; + return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pFilePath, pConfig, pDecoder); } -static ma_result ma_decoder_init_from_memory__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) +static ma_result ma_decoder_init_vorbis_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) { - ma_result result; - ma_decoding_backend_config backendConfig; - ma_data_source* pBackend; - - MA_ASSERT(pVTable != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pVTable->onInitMemory == NULL) { - return MA_NOT_IMPLEMENTED; - } - - backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount, pConfig->encodingFormat); - - result = pVTable->onInitMemory(pVTableUserData, pData, dataSize, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the backend from this vtable. */ - } - - /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ - pDecoder->pBackend = pBackend; - pDecoder->pBackendVTable = pVTable; - pDecoder->pBackendUserData = pVTableUserData; - - return MA_SUCCESS; + return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pData, dataSize, pConfig, pDecoder); } +#endif /* STB_VORBIS_INCLUDE_STB_VORBIS_H */ @@ -64280,91 +63931,110 @@ static ma_result ma_decoder__postinit(const ma_decoder_config* pConfig, ma_decod return result; } -static ma_result ma_decoder__postinit_or_uninit(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - - result = ma_decoder__postinit(pConfig, pDecoder); - if (result != MA_SUCCESS) { - /* - The backend was initialized successfully, but for some reason post-initialization failed. This is most likely - due to an out of memory error. We're going to abort with an error here and not try to recover. - */ - if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { - pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); - } - - return result; - } - - return MA_SUCCESS; -} - -static ma_bool32 ma_can_decoding_backend_possibly_handle_encoding_format(const ma_decoding_backend_vtable* pBackendVTable, void* pBackendUserData, ma_encoding_format encodingFormat) +static ma_result ma_decoder_init__internal(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) { - ma_encoding_format backendEncodingFormat = ma_encoding_format_unknown; - - if (pBackendVTable == NULL) { - return MA_FALSE; - } + ma_result result = MA_NO_BACKEND; - if (encodingFormat == ma_encoding_format_unknown) { - return MA_TRUE; /* The backend can handle anything. */ - } + MA_ASSERT(pConfig != NULL); + MA_ASSERT(pDecoder != NULL); - if (pBackendVTable != NULL && pBackendVTable->onGetEncodingFormat != NULL) { - backendEncodingFormat = pBackendVTable->onGetEncodingFormat(pBackendUserData, NULL); - } + /* Silence some warnings in the case that we don't have any decoder backends enabled. */ + (void)onRead; + (void)onSeek; + (void)pUserData; - if (backendEncodingFormat == ma_encoding_format_unknown) { - return MA_TRUE; /* The backend does not specify an encoding format which means we must assume it can handle anything. */ - } - return backendEncodingFormat == encodingFormat; -} + /* If we've specified a specific encoding type, try that first. */ + if (pConfig->encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (pConfig->encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav__internal(pConfig, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (pConfig->encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac__internal(pConfig, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (pConfig->encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3__internal(pConfig, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (pConfig->encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis__internal(pConfig, pDecoder); + } + #endif -static void* ma_decoder_config_get_backend_user_data(const ma_decoder_config* pConfig, ma_uint32 iBackend) -{ - if (pConfig->ppBackendUserData == NULL) { - return NULL; + /* If we weren't able to initialize the decoder, seek back to the start to give the next attempts a clean start. */ + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); + } } - return pConfig->ppBackendUserData[iBackend]; -} - - -static ma_result ma_decoder_init__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result = MA_NO_BACKEND; - ma_uint32 iBackend; + if (result != MA_SUCCESS) { + /* Getting here means we couldn't load a specific decoding backend based on the encoding format. */ - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + if (result != MA_SUCCESS) { + result = ma_decoder_init_custom__internal(pConfig, pDecoder); + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); + } + } - /* The backend vtable list should have been filled out by a higher level function. */ - MA_ASSERT(pConfig->ppBackendVTables != NULL); + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (pConfig->encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } - for (iBackend = 0; iBackend < pConfig->backendCount; iBackend += 1) { - if (ma_can_decoding_backend_possibly_handle_encoding_format(pConfig->ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(pConfig, iBackend), pConfig->encodingFormat)) { - /* Getting here means the backend may support the encoding format. */ - result = ma_decoder_init_from_vtable__internal(pConfig->ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(pConfig, iBackend), pConfig, pDecoder); - if (result == MA_SUCCESS) { - return ma_decoder__postinit_or_uninit(pConfig, pDecoder); - } else { - /* Initialization failed. Move on to the next one, but seek back to the start first so the next vtable starts from the first byte of the file. */ - result = ma_decoder_on_seek(pDecoder, 0, ma_seek_origin_start); - if (result != MA_SUCCESS) { - return result; /* Failed to seek back to the start. */ - } + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS) { + result = ma_decoder_init_wav__internal(pConfig, pDecoder); + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); } - } else { - /* The backend does not support the specified encoding format. Skip. */ } + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS) { + result = ma_decoder_init_flac__internal(pConfig, pDecoder); + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS) { + result = ma_decoder_init_mp3__internal(pConfig, pDecoder); + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS) { + result = ma_decoder_init_vorbis__internal(pConfig, pDecoder); + if (result != MA_SUCCESS) { + onSeek(pDecoder, 0, ma_seek_origin_start); + } + } + #endif } - /* Getting here means we couldn't find a backend. */ - return MA_NO_BACKEND; + if (result != MA_SUCCESS) { + return result; + } + + return ma_decoder__postinit(pConfig, pDecoder); } MA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) @@ -64379,7 +64049,7 @@ MA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_pr return result; } - return ma_decoder_init__internal(&config, pDecoder); + return ma_decoder_init__internal(onRead, onSeek, pUserData, &config, pDecoder); } @@ -64490,7 +64160,6 @@ MA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, cons { ma_result result; ma_decoder_config config; - ma_uint32 iBackend; config = ma_decoder_config_init_copy(pConfig); @@ -64503,40 +64172,286 @@ MA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, cons return MA_INVALID_ARGS; } - for (iBackend = 0; iBackend < config.backendCount; iBackend += 1) { - if (ma_can_decoding_backend_possibly_handle_encoding_format(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), config.encodingFormat)) { - /* Getting here means the backend may support the encoding format. */ - result = ma_decoder_init_from_memory__internal(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), pData, dataSize, &config, pDecoder); - if (result == MA_SUCCESS) { - return ma_decoder__postinit_or_uninit(&config, pDecoder); - } else { - /* - Initialization failed, but it could just be because the backend does not implement onInitMemory. In this case we need to - try again using callbacks. - */ - if (result == MA_NOT_IMPLEMENTED) { - /* Probably no implementation of onInitMemory. Use miniaudio's abstraction instead. */ - result = ma_decoder__preinit_memory_wrapper(pData, dataSize, &config, pDecoder); - if (result != MA_SUCCESS) { - return result; - } + /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */ + result = MA_NO_BACKEND; - result = ma_decoder_init__internal(&config, pDecoder); - if (result == MA_SUCCESS) { - return ma_decoder__postinit_or_uninit(&config, pDecoder); - } - } else { - /* Initialization failed. Probably an unsupported format. Skip. */ - } + if (config.encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (config.encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (config.encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (config.encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (config.encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + } + + if (result != MA_SUCCESS) { + /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ + + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + result = ma_decoder_init_custom_from_memory__internal(pData, dataSize, &config, pDecoder); + + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } + + /* Use trial and error for stock decoders. */ + if (result != MA_SUCCESS) { + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS) { + result = ma_decoder_init_wav_from_memory__internal(pData, dataSize, &config, pDecoder); } - } else { - /* The backend does not support the specified encoding format. Skip. */ + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS) { + result = ma_decoder_init_flac_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS) { + result = ma_decoder_init_mp3_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS) { + result = ma_decoder_init_vorbis_from_memory__internal(pData, dataSize, &config, pDecoder); + } + #endif } } - /* Getting here means we couldn't find a backend. */ - return MA_NO_BACKEND; + /* + If at this point we still haven't successfully initialized the decoder it most likely means + the backend doesn't have an implementation for loading from a file path. We'll try using + miniaudio's built-in file IO for loading file. + */ + if (result == MA_SUCCESS) { + /* Initialization was successful. Finish up. */ + result = ma_decoder__postinit(&config, pDecoder); + if (result != MA_SUCCESS) { + /* + The backend was initialized successfully, but for some reason post-initialization failed. This is most likely + due to an out of memory error. We're going to abort with an error here and not try to recover. + */ + if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { + pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); + } + + return result; + } + } else { + /* Probably no implementation for loading from a block of memory. Use miniaudio's abstraction instead. */ + result = ma_decoder__preinit_memory_wrapper(pData, dataSize, &config, pDecoder); + if (result != MA_SUCCESS) { + return result; + } + + result = ma_decoder_init__internal(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, NULL, &config, pDecoder); + if (result != MA_SUCCESS) { + return result; + } + } + + return MA_SUCCESS; +} + + +#if defined(MA_HAS_WAV) || \ + defined(MA_HAS_MP3) || \ + defined(MA_HAS_FLAC) || \ + defined(MA_HAS_VORBIS) || \ + defined(MA_HAS_OPUS) +#define MA_HAS_PATH_API +#endif + +#if defined(MA_HAS_PATH_API) +static const char* ma_path_file_name(const char* path) +{ + const char* fileName; + + if (path == NULL) { + return NULL; + } + + fileName = path; + + /* We just loop through the path until we find the last slash. */ + while (path[0] != '\0') { + if (path[0] == '/' || path[0] == '\\') { + fileName = path; + } + + path += 1; + } + + /* At this point the file name is sitting on a slash, so just move forward. */ + while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { + fileName += 1; + } + + return fileName; +} + +static const wchar_t* ma_path_file_name_w(const wchar_t* path) +{ + const wchar_t* fileName; + + if (path == NULL) { + return NULL; + } + + fileName = path; + + /* We just loop through the path until we find the last slash. */ + while (path[0] != '\0') { + if (path[0] == '/' || path[0] == '\\') { + fileName = path; + } + + path += 1; + } + + /* At this point the file name is sitting on a slash, so just move forward. */ + while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { + fileName += 1; + } + + return fileName; +} + + +static const char* ma_path_extension(const char* path) +{ + const char* extension; + const char* lastOccurance; + + if (path == NULL) { + path = ""; + } + + extension = ma_path_file_name(path); + lastOccurance = NULL; + + /* Just find the last '.' and return. */ + while (extension[0] != '\0') { + if (extension[0] == '.') { + extension += 1; + lastOccurance = extension; + } + + extension += 1; + } + + return (lastOccurance != NULL) ? lastOccurance : extension; +} + +static const wchar_t* ma_path_extension_w(const wchar_t* path) +{ + const wchar_t* extension; + const wchar_t* lastOccurance; + + if (path == NULL) { + path = L""; + } + + extension = ma_path_file_name_w(path); + lastOccurance = NULL; + + /* Just find the last '.' and return. */ + while (extension[0] != '\0') { + if (extension[0] == '.') { + extension += 1; + lastOccurance = extension; + } + + extension += 1; + } + + return (lastOccurance != NULL) ? lastOccurance : extension; +} + + +static ma_bool32 ma_path_extension_equal(const char* path, const char* extension) +{ + const char* ext1; + const char* ext2; + + if (path == NULL || extension == NULL) { + return MA_FALSE; + } + + ext1 = extension; + ext2 = ma_path_extension(path); + +#if defined(_MSC_VER) || defined(__DMC__) + return _stricmp(ext1, ext2) == 0; +#else + return strcasecmp(ext1, ext2) == 0; +#endif +} + +static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* extension) +{ + const wchar_t* ext1; + const wchar_t* ext2; + + if (path == NULL || extension == NULL) { + return MA_FALSE; + } + + ext1 = extension; + ext2 = ma_path_extension_w(path); + +#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) + return _wcsicmp(ext1, ext2) == 0; +#else + /* + I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This + isn't the most efficient way to do it, but it should work OK. + */ + { + char ext1MB[4096]; + char ext2MB[4096]; + const wchar_t* pext1 = ext1; + const wchar_t* pext2 = ext2; + mbstate_t mbs1; + mbstate_t mbs2; + + MA_ZERO_OBJECT(&mbs1); + MA_ZERO_OBJECT(&mbs2); + + if (wcsrtombs(ext1MB, &pext1, sizeof(ext1MB), &mbs1) == (size_t)-1) { + return MA_FALSE; + } + if (wcsrtombs(ext2MB, &pext2, sizeof(ext2MB), &mbs2) == (size_t)-1) { + return MA_FALSE; + } + + return strcasecmp(ext1MB, ext2MB) == 0; + } +#endif } +#endif /* MA_HAS_PATH_API */ @@ -64593,20 +64508,98 @@ MA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config config; config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_vfs(pVFS, pFilePath, &config, pDecoder); if (result != MA_SUCCESS) { return result; } - result = ma_decoder_init__internal(&config, pDecoder); - if (result == MA_SUCCESS) { - result = ma_decoder__postinit_or_uninit(&config, pDecoder); + result = MA_NO_BACKEND; + + if (config.encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (config.encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (config.encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (config.encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (config.encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis__internal(&config, pDecoder); + } + #endif + + /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */ + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + + if (result != MA_SUCCESS) { + /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ + + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + if (result != MA_SUCCESS) { + result = ma_decoder_init_custom__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (config.encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } + + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "wav")) { + result = ma_decoder_init_wav__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "flac")) { + result = ma_decoder_init_flac__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "mp3")) { + result = ma_decoder_init_mp3__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + #endif } - /* If we failed to initialize a decoder make sure our file handle is closed. */ + /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */ if (result != MA_SUCCESS) { - if (pDecoder->data.vfs.file != NULL) { + result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder); + } else { + result = ma_decoder__postinit(&config, pDecoder); + } + + if (result != MA_SUCCESS) { + if (pDecoder->data.vfs.file != NULL) { /* <-- Will be reset to NULL if ma_decoder_uninit() is called in one of the steps above which allows us to avoid a double close of the file. */ ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file); } @@ -64648,23 +64641,98 @@ MA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, c ma_decoder_config config; config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_vfs_w(pVFS, pFilePath, &config, pDecoder); if (result != MA_SUCCESS) { return result; } - result = ma_decoder_init__internal(&config, pDecoder); - if (result == MA_SUCCESS) { - result = ma_decoder__postinit_or_uninit(&config, pDecoder); + result = MA_NO_BACKEND; + + if (config.encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (config.encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (config.encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (config.encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3__internal(&config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (config.encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis__internal(&config, pDecoder); + } + #endif + + /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */ + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } } - /* If we failed to initialize a decoder make sure our file handle is closed. */ if (result != MA_SUCCESS) { - if (pDecoder->data.vfs.file != NULL) { - ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file); + /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ + + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + if (result != MA_SUCCESS) { + result = ma_decoder_init_custom__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (config.encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } + + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"wav")) { + result = ma_decoder_init_wav__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"flac")) { + result = ma_decoder_init_flac__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"mp3")) { + result = ma_decoder_init_mp3__internal(&config, pDecoder); + if (result != MA_SUCCESS) { + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); + } } + #endif + } + /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */ + if (result != MA_SUCCESS) { + result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder); + } else { + result = ma_decoder__postinit(&config, pDecoder); + } + + if (result != MA_SUCCESS) { + ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file); return result; } @@ -64692,45 +64760,134 @@ MA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_co { ma_result result; ma_decoder_config config; - ma_uint32 iBackend; config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_file(pFilePath, &config, pDecoder); if (result != MA_SUCCESS) { return result; } - for (iBackend = 0; iBackend < config.backendCount; iBackend += 1) { - if (ma_can_decoding_backend_possibly_handle_encoding_format(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), config.encodingFormat)) { - /* Getting here means the backend may support the encoding format. */ - result = ma_decoder_init_from_file__internal(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), pFilePath, &config, pDecoder); - if (result == MA_SUCCESS) { - return ma_decoder__postinit_or_uninit(&config, pDecoder); - } else { - /* - Initialization failed, but it could just be because the backend does not implement onInitMemory. In this case we need to - try again using callbacks. - */ - if (result == MA_NOT_IMPLEMENTED) { - /* Probably no implementation onInitFile. Use miniaudio's file IO instead. */ - result = ma_decoder_init_vfs(NULL, pFilePath, pConfig, pDecoder); - if (result == MA_SUCCESS) { - return MA_SUCCESS; - } else { - /* Initialization failed. Probably an unsupported format. Skip. */ - } - } else { - /* Initialization failed. Probably an unsupported format. Skip. */ - } + /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */ + result = MA_NO_BACKEND; + + if (config.encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (config.encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (config.encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (config.encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (config.encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + } + + if (result != MA_SUCCESS) { + /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ + + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + result = ma_decoder_init_custom_from_file__internal(pFilePath, &config, pDecoder); + + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } + + /* First try loading based on the file extension so we don't waste time opening and closing files. */ + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "wav")) { + result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "flac")) { + result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "mp3")) { + result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "ogg")) { + result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + + /* + If we still haven't got a result just use trial and error. Custom decoders have already been attempted, so here we + need only iterate over our stock decoders. + */ + if (result != MA_SUCCESS) { + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS) { + result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder); } - } else { - /* The backend does not support the specified encoding format. Skip. */ + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS) { + result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS) { + result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS) { + result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder); + } + #endif } } - /* Getting here means we couldn't find a backend. */ - return MA_NO_BACKEND; + /* + If at this point we still haven't successfully initialized the decoder it most likely means + the backend doesn't have an implementation for loading from a file path. We'll try using + miniaudio's built-in file IO for loading file. + */ + if (result == MA_SUCCESS) { + /* Initialization was successful. Finish up. */ + result = ma_decoder__postinit(&config, pDecoder); + if (result != MA_SUCCESS) { + /* + The backend was initialized successfully, but for some reason post-initialization failed. This is most likely + due to an out of memory error. We're going to abort with an error here and not try to recover. + */ + if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { + pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); + } + + return result; + } + } else { + /* Probably no implementation for loading from a file path. Use miniaudio's file IO instead. */ + result = ma_decoder_init_vfs(NULL, pFilePath, pConfig, pDecoder); + if (result != MA_SUCCESS) { + return result; + } + } + + return MA_SUCCESS; } static ma_result ma_decoder__preinit_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) @@ -64753,45 +64910,134 @@ MA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decod { ma_result result; ma_decoder_config config; - ma_uint32 iBackend; config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_file_w(pFilePath, &config, pDecoder); if (result != MA_SUCCESS) { return result; } - for (iBackend = 0; iBackend < config.backendCount; iBackend += 1) { - if (ma_can_decoding_backend_possibly_handle_encoding_format(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), config.encodingFormat)) { - /* Getting here means the backend may support the encoding format. */ - result = ma_decoder_init_from_file_w__internal(config.ppBackendVTables[iBackend], ma_decoder_config_get_backend_user_data(&config, iBackend), pFilePath, &config, pDecoder); - if (result == MA_SUCCESS) { - return ma_decoder__postinit_or_uninit(&config, pDecoder); - } else { - /* - Initialization failed, but it could just be because the backend does not implement onInitMemory. In this case we need to - try again using callbacks. - */ - if (result == MA_NOT_IMPLEMENTED) { - /* Probably no implementation onInitFile. Use miniaudio's file IO instead. */ - result = ma_decoder_init_vfs_w(NULL, pFilePath, pConfig, pDecoder); - if (result == MA_SUCCESS) { - return MA_SUCCESS; - } else { - /* Initialization failed. Probably an unsupported format. Skip. */ - } - } else { - /* Initialization failed. Probably an unsupported format. Skip. */ - } + /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */ + result = MA_NO_BACKEND; + + if (config.encodingFormat != ma_encoding_format_unknown) { + #ifdef MA_HAS_WAV + if (config.encodingFormat == ma_encoding_format_wav) { + result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (config.encodingFormat == ma_encoding_format_flac) { + result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (config.encodingFormat == ma_encoding_format_mp3) { + result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (config.encodingFormat == ma_encoding_format_vorbis) { + result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + } + + if (result != MA_SUCCESS) { + /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ + + /* + We use trial and error to open a decoder. We prioritize custom decoders so that if they + implement the same encoding format they take priority over the built-in decoders. + */ + result = ma_decoder_init_custom_from_file_w__internal(pFilePath, &config, pDecoder); + + /* + If we get to this point and we still haven't found a decoder, and the caller has requested a + specific encoding format, there's no hope for it. Abort. + */ + if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) { + return MA_NO_BACKEND; + } + + /* First try loading based on the file extension so we don't waste time opening and closing files. */ + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"wav")) { + result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"flac")) { + result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"mp3")) { + result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"ogg")) { + result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + + /* + If we still haven't got a result just use trial and error. Custom decoders have already been attempted, so here we + need only iterate over our stock decoders. + */ + if (result != MA_SUCCESS) { + #ifdef MA_HAS_WAV + if (result != MA_SUCCESS) { + result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder); } - } else { - /* The backend does not support the specified encoding format. Skip. */ + #endif + #ifdef MA_HAS_FLAC + if (result != MA_SUCCESS) { + result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_MP3 + if (result != MA_SUCCESS) { + result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif + #ifdef MA_HAS_VORBIS + if (result != MA_SUCCESS) { + result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder); + } + #endif } } - /* Getting here means we couldn't find a backend. */ - return MA_NO_BACKEND; + /* + If at this point we still haven't successfully initialized the decoder it most likely means + the backend doesn't have an implementation for loading from a file path. We'll try using + miniaudio's built-in file IO for loading file. + */ + if (result == MA_SUCCESS) { + /* Initialization was successful. Finish up. */ + result = ma_decoder__postinit(&config, pDecoder); + if (result != MA_SUCCESS) { + /* + The backend was initialized successfully, but for some reason post-initialization failed. This is most likely + due to an out of memory error. We're going to abort with an error here and not try to recover. + */ + if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { + pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); + } + + return result; + } + } else { + /* Probably no implementation for loading from a file path. Use miniaudio's file IO instead. */ + result = ma_decoder_init_vfs_w(NULL, pFilePath, pConfig, pDecoder); + if (result != MA_SUCCESS) { + return result; + } + } + + return MA_SUCCESS; } MA_API ma_result ma_decoder_uninit(ma_decoder* pDecoder) @@ -64849,7 +65095,7 @@ MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesO } else { /* Getting here means we need to do data conversion. If we're seeking forward and are _not_ doing resampling we can run this in a fast path. If we're doing resampling we - need to run through each sample because we need to ensure its internal cache is updated. + need to run through each sample because we need to ensure it's internal cache is updated. */ if (pFramesOut == NULL && pDecoder->converter.hasResampler == MA_FALSE) { result = ma_data_source_read_pcm_frames(pDecoder->pBackend, NULL, frameCount, &totalFramesReadOut); @@ -65132,15 +65378,6 @@ MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64 return MA_SUCCESS; } -MA_API ma_encoding_format ma_decoder_get_encoding_format(const ma_decoder* pDecoder) -{ - if (pDecoder == NULL || pDecoder->pBackendVTable == NULL || pDecoder->pBackendVTable->onGetEncodingFormat == NULL) { - return ma_encoding_format_unknown; - } - - return pDecoder->pBackendVTable->onGetEncodingFormat(pDecoder->pBackendUserData, pDecoder->pBackend); -} - static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) { @@ -66422,6 +66659,23 @@ MA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed) } +MA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type) +{ + if (pNoise == NULL) { + return MA_INVALID_ARGS; + } + + /* + This function should never have been implemented in the first place. Changing the type dynamically is not + supported. Instead you need to uninitialize and reinitiailize a fresh `ma_noise` object. This function + will be removed in version 0.12. + */ + MA_ASSERT(MA_FALSE); + (void)type; + + return MA_INVALID_OPERATION; +} + static MA_INLINE float ma_noise_f32_white(ma_noise* pNoise) { return (float)(ma_lcg_rand_f64(&pNoise->lcg) * pNoise->config.amplitude); @@ -67459,7 +67713,7 @@ MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pCon pResourceManager->config.pVFS = &pResourceManager->defaultVFS; } - /* If threading has been disabled at compile time, enforce it at run time as well. */ + /* If threading has been disabled at compile time, enfore it at run time as well. */ #ifdef MA_NO_THREADING { pResourceManager->config.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING; @@ -67494,34 +67748,19 @@ MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pCon /* Custom decoding backends. */ - if (pConfig->ppDecodingBackendVTables != NULL && pConfig->decodingBackendCount > 0) { - size_t vtableSizeInBytes; - size_t vtableUserDataSizeInBytes; - - vtableSizeInBytes = sizeof(*pResourceManager->config.ppDecodingBackendVTables) * pConfig->decodingBackendCount; - - if (pConfig->ppDecodingBackendUserData != NULL) { - vtableUserDataSizeInBytes = sizeof(*pResourceManager->config.ppDecodingBackendUserData) * pConfig->decodingBackendCount; - } else { - vtableUserDataSizeInBytes = 0; /* No vtable user data present. No need for an allocation. */ - } + if (pConfig->ppCustomDecodingBackendVTables != NULL && pConfig->customDecodingBackendCount > 0) { + size_t sizeInBytes = sizeof(*pResourceManager->config.ppCustomDecodingBackendVTables) * pConfig->customDecodingBackendCount; - pResourceManager->config.ppDecodingBackendVTables = (const ma_decoding_backend_vtable**)ma_malloc(vtableSizeInBytes + vtableUserDataSizeInBytes, &pResourceManager->config.allocationCallbacks); - if (pResourceManager->config.ppDecodingBackendVTables == NULL) { + pResourceManager->config.ppCustomDecodingBackendVTables = (ma_decoding_backend_vtable**)ma_malloc(sizeInBytes, &pResourceManager->config.allocationCallbacks); + if (pResourceManager->config.ppCustomDecodingBackendVTables == NULL) { ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks); return MA_OUT_OF_MEMORY; } - MA_COPY_MEMORY(pResourceManager->config.ppDecodingBackendVTables, pConfig->ppDecodingBackendVTables, vtableSizeInBytes); - - if (pConfig->ppDecodingBackendUserData != NULL) { - pResourceManager->config.ppDecodingBackendUserData = (void**)ma_offset_ptr(pResourceManager->config.ppDecodingBackendVTables, vtableSizeInBytes); - MA_COPY_MEMORY(pResourceManager->config.ppDecodingBackendUserData, pConfig->ppDecodingBackendUserData, vtableUserDataSizeInBytes); - } else { - pResourceManager->config.ppDecodingBackendUserData = NULL; - } + MA_COPY_MEMORY(pResourceManager->config.ppCustomDecodingBackendVTables, pConfig->ppCustomDecodingBackendVTables, sizeInBytes); - pResourceManager->config.decodingBackendCount = pConfig->decodingBackendCount; + pResourceManager->config.customDecodingBackendCount = pConfig->customDecodingBackendCount; + pResourceManager->config.pCustomDecodingBackendUserData = pConfig->pCustomDecodingBackendUserData; } @@ -67583,7 +67822,7 @@ MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager) /* Job threads need to be killed first. To do this we need to post a quit message to the message queue and then wait for the thread. The quit message will never be removed from the - queue which means it will never not be returned after being encountered for the first time which means all threads will eventually receive it. + queue which means it will never not be returned after being encounted for the first time which means all threads will eventually receive it. */ ma_resource_manager_post_job_quit(pResourceManager); @@ -67623,7 +67862,7 @@ MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager) #endif } - ma_free(pResourceManager->config.ppDecodingBackendVTables, &pResourceManager->config.allocationCallbacks); /* <-- This also frees pResourceManager->config.ppDecodingBackendUserData because it's all in one allocation. */ + ma_free(pResourceManager->config.ppCustomDecodingBackendVTables, &pResourceManager->config.allocationCallbacks); if (pResourceManager->config.pLog == &pResourceManager->log) { ma_log_uninit(&pResourceManager->log); @@ -67650,6 +67889,7 @@ MA_API ma_resource_manager_data_source_config ma_resource_manager_data_source_co config.rangeEndInPCMFrames = MA_DATA_SOURCE_DEFAULT_RANGE_END; config.loopPointBegInPCMFrames = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_BEG; config.loopPointEndInPCMFrames = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_END; + config.isLooping = MA_FALSE; return config; } @@ -67660,10 +67900,10 @@ static ma_decoder_config ma_resource_manager__init_decoder_config(ma_resource_ma ma_decoder_config config; config = ma_decoder_config_init(pResourceManager->config.decodedFormat, pResourceManager->config.decodedChannels, pResourceManager->config.decodedSampleRate); - config.allocationCallbacks = pResourceManager->config.allocationCallbacks; - config.ppBackendVTables = pResourceManager->config.ppDecodingBackendVTables; - config.backendCount = pResourceManager->config.decodingBackendCount; - config.ppBackendUserData = pResourceManager->config.ppDecodingBackendUserData; + config.allocationCallbacks = pResourceManager->config.allocationCallbacks; + config.ppCustomBackendVTables = pResourceManager->config.ppCustomDecodingBackendVTables; + config.customBackendCount = pResourceManager->config.customDecodingBackendCount; + config.pCustomBackendUserData = pResourceManager->config.pCustomDecodingBackendUserData; return config; } @@ -67755,7 +67995,7 @@ static ma_result ma_resource_manager_data_buffer_init_connector(ma_resource_mana case ma_resource_manager_data_supply_type_decoded: /* Connector is an audio buffer. */ { ma_audio_buffer_config config; - config = ma_audio_buffer_config_init(pDataBuffer->pNode->data.backend.decoded.format, pDataBuffer->pNode->data.backend.decoded.channels, pDataBuffer->pNode->data.backend.decoded.sampleRate, pDataBuffer->pNode->data.backend.decoded.totalFrameCount, pDataBuffer->pNode->data.backend.decoded.pData, NULL); + config = ma_audio_buffer_config_init(pDataBuffer->pNode->data.backend.decoded.format, pDataBuffer->pNode->data.backend.decoded.channels, pDataBuffer->pNode->data.backend.decoded.totalFrameCount, pDataBuffer->pNode->data.backend.decoded.pData, NULL); result = ma_audio_buffer_init(&config, &pDataBuffer->connector.buffer); } break; @@ -67799,8 +68039,8 @@ static ma_result ma_resource_manager_data_buffer_init_connector(ma_resource_mana ma_data_source_set_loop_point_in_pcm_frames(pDataBuffer, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); } - if ((pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING) != 0) { - ma_data_source_set_looping(pDataBuffer, MA_TRUE); + if (pConfig->isLooping != MA_FALSE) { + ma_data_source_set_looping(pDataBuffer, pConfig->isLooping); } ma_atomic_bool32_set(&pDataBuffer->isConnectorInitialized, MA_TRUE); @@ -68193,7 +68433,7 @@ static ma_result ma_resource_manager_data_buffer_node_acquire_critical_section(m if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { ma_resource_manager_inline_notification_uninit(pInitNotification); } else { - /* These will have been freed by the job thread, but with WAIT_INIT they will already have happened since the job has already been handled. */ + /* These will have been freed by the job thread, but with WAIT_INIT they will already have happend sinced the job has already been handled. */ ma_free(pFilePathCopy, &pResourceManager->config.allocationCallbacks); ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks); } @@ -68570,7 +68810,7 @@ static ma_result ma_resource_manager_data_buffer_init_ex_internal(ma_resource_ma These fences are always released at the "done" tag at the end of this function. They'll be acquired a second if loading asynchronously. This double acquisition system is just done to - simplify code maintenance. + simplify code maintanence. */ ma_resource_manager_pipeline_notifications_acquire_all_fences(¬ifications); { @@ -68615,7 +68855,7 @@ static ma_result ma_resource_manager_data_buffer_init_ex_internal(ma_resource_ma /* The status of the data buffer needs to be set to MA_BUSY before posting the job so that the - worker thread is aware of its busy state. If the LOAD_DATA_BUFFER job sees a status other + worker thread is aware of it's busy state. If the LOAD_DATA_BUFFER job sees a status other than MA_BUSY, it'll assume an error and fall through to an early exit. */ ma_atomic_exchange_i32(&pDataBuffer->result, MA_BUSY); @@ -68634,7 +68874,7 @@ static ma_result ma_resource_manager_data_buffer_init_ex_internal(ma_resource_ma job.data.resourceManager.loadDataBuffer.rangeEndInPCMFrames = pConfig->rangeEndInPCMFrames; job.data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames = pConfig->loopPointBegInPCMFrames; job.data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames = pConfig->loopPointEndInPCMFrames; - job.data.resourceManager.loadDataBuffer.isLooping = (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING) != 0; + job.data.resourceManager.loadDataBuffer.isLooping = pConfig->isLooping; /* If we need to wait for initialization to complete we can just process the job in place. */ if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { @@ -68855,29 +69095,22 @@ MA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_man isDecodedBufferBusy = (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY); if (ma_resource_manager_data_buffer_get_available_frames(pDataBuffer, &availableFrames) == MA_SUCCESS) { - /* Don't try reading more than the available frame count if the data buffer node is still loading. */ - if (isDecodedBufferBusy) { - if (frameCount > availableFrames) { - frameCount = availableFrames; + /* Don't try reading more than the available frame count. */ + if (frameCount > availableFrames) { + frameCount = availableFrames; - /* - If there's no frames available we want to set the status to MA_AT_END. The logic below - will check if the node is busy, and if so, change it to MA_BUSY. The reason we do this - is because we don't want to call `ma_data_source_read_pcm_frames()` if the frame count - is 0 because that'll result in a situation where it's possible MA_AT_END won't get - returned. - */ - if (frameCount == 0) { - result = MA_AT_END; - } - } else { - isDecodedBufferBusy = MA_FALSE; /* We have enough frames available in the buffer to avoid a MA_BUSY status. */ - } - } else { /* - Getting here means the buffer has been fully loaded. We can just pass the frame count straight - into ma_data_source_read_pcm_frames() below and let ma_data_source handle it. + If there's no frames available we want to set the status to MA_AT_END. The logic below + will check if the node is busy, and if so, change it to MA_BUSY. The reason we do this + is because we don't want to call `ma_data_source_read_pcm_frames()` if the frame count + is 0 because that'll result in a situation where it's possible MA_AT_END won't get + returned. */ + if (frameCount == 0) { + result = MA_AT_END; + } + } else { + isDecodedBufferBusy = MA_FALSE; /* We have enough frames available in the buffer to avoid a MA_BUSY status. */ } } } @@ -69277,7 +69510,6 @@ MA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pR ma_bool32 waitBeforeReturning = MA_FALSE; ma_resource_manager_inline_notification waitNotification; ma_resource_manager_pipeline_notifications notifications; - ma_uint32 flags; if (pDataStream == NULL) { if (pConfig != NULL && pConfig->pNotifications != NULL) { @@ -69308,15 +69540,13 @@ MA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pR return result; } - flags = pConfig->flags; - pDataStream->pResourceManager = pResourceManager; pDataStream->flags = pConfig->flags; pDataStream->result = MA_BUSY; ma_data_source_set_range_in_pcm_frames(pDataStream, pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames); ma_data_source_set_loop_point_in_pcm_frames(pDataStream, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); - ma_data_source_set_looping(pDataStream, (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING) != 0); + ma_data_source_set_looping(pDataStream, pConfig->isLooping); if (pResourceManager == NULL || (pConfig->pFilePath == NULL && pConfig->pFilePathW == NULL)) { ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); @@ -70514,10 +70744,7 @@ static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob dataSourceConfig.rangeEndInPCMFrames = pJob->data.resourceManager.loadDataBuffer.rangeEndInPCMFrames; dataSourceConfig.loopPointBegInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames; dataSourceConfig.loopPointEndInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames; - - if (pJob->data.resourceManager.loadDataBuffer.isLooping) { - dataSourceConfig.flags |= MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_LOOPING; - } + dataSourceConfig.isLooping = pJob->data.resourceManager.loadDataBuffer.isLooping; result = ma_resource_manager_data_buffer_init_connector(pDataBuffer, &dataSourceConfig, pJob->data.resourceManager.loadDataBuffer.pInitNotification, pJob->data.resourceManager.loadDataBuffer.pInitFence); if (result != MA_SUCCESS) { @@ -70848,74 +71075,11 @@ static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob #ifndef MA_NO_NODE_GRAPH - -static ma_stack* ma_stack_init(size_t sizeInBytes, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_stack* pStack; - - if (sizeInBytes == 0) { - return NULL; - } - - pStack = (ma_stack*)ma_malloc(sizeof(*pStack) - sizeof(pStack->_data) + sizeInBytes, pAllocationCallbacks); - if (pStack == NULL) { - return NULL; - } - - pStack->offset = 0; - pStack->sizeInBytes = sizeInBytes; - - return pStack; -} - -static void ma_stack_uninit(ma_stack* pStack, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pStack == NULL) { - return; - } - - ma_free(pStack, pAllocationCallbacks); -} - -static void* ma_stack_alloc(ma_stack* pStack, size_t sz) -{ - /* The size of the allocation is stored in the memory directly before the pointer. This needs to include padding to keep it aligned to ma_uintptr */ - void* p = (void*)((char*)pStack->_data + pStack->offset); - size_t* pSize = (size_t*)p; - - sz = (sz + (sizeof(ma_uintptr) - 1)) & ~(sizeof(ma_uintptr) - 1); /* Padding. */ - if (pStack->offset + sz + sizeof(size_t) > pStack->sizeInBytes) { - return NULL; /* Out of memory. */ - } - - pStack->offset += sz + sizeof(size_t); - - *pSize = sz; - return (void*)((char*)p + sizeof(size_t)); -} - -static void ma_stack_free(ma_stack* pStack, void* p) -{ - size_t* pSize; - - if (p == NULL) { - return; - } - - pSize = (size_t*)p - 1; - pStack->offset -= *pSize + sizeof(size_t); -} - - - /* 10ms @ 48K = 480. Must never exceed 65535. */ #ifndef MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS #define MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS 480 #endif -#ifndef MA_DEFAULT_PREMIX_STACK_SIZE_PER_CHANNEL -#define MA_DEFAULT_PREMIX_STACK_SIZE_PER_CHANNEL 524288 -#endif static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusIndex, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime); @@ -70955,8 +71119,8 @@ MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels) ma_node_graph_config config; MA_ZERO_OBJECT(&config); - config.channels = channels; - config.processingSizeInFrames = 0; + config.channels = channels; + config.nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS; return config; } @@ -70977,53 +71141,28 @@ static ma_bool32 ma_node_graph_is_reading(ma_node_graph* pNodeGraph) #endif - -static ma_result ma_node_graph_data_source__on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - /* Since there's no notion of an end, we don't ever want to return MA_AT_END here. But it is possible to return 0. */ - ma_node_graph* pNodeGraph = (ma_node_graph*)pDataSource; - MA_ASSERT(pNodeGraph != NULL); - - return ma_node_graph_read_pcm_frames(pNodeGraph, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_node_graph_data_source__on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) +static void ma_node_graph_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) { - ma_node_graph* pNodeGraph = (ma_node_graph*)pDataSource; - MA_ASSERT(pNodeGraph != NULL); - - if (pFormat != NULL) { - *pFormat = ma_format_f32; - } - - if (pChannels != NULL) { - *pChannels = ma_node_graph_get_channels(pNodeGraph); - } + ma_node_graph* pNodeGraph = (ma_node_graph*)pNode; + ma_uint64 framesRead; - if (pSampleRate != NULL) { - *pSampleRate = 0; /* There's no notion of a sample rate. It's just whatever rate is supplied by the underlying nodes. */ - } + ma_node_graph_read_pcm_frames(pNodeGraph, ppFramesOut[0], *pFrameCountOut, &framesRead); - /* Just assume the default channel map. */ - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, *pChannels); - } + *pFrameCountOut = (ma_uint32)framesRead; /* Safe cast. */ - return MA_SUCCESS; + (void)ppFramesIn; + (void)pFrameCountIn; } -static ma_data_source_vtable ma_gNodeGraphDataSourceVTable = +static ma_node_vtable g_node_graph_node_vtable = { - ma_node_graph_data_source__on_read, - NULL, /* onSeek */ - ma_node_graph_data_source__on_get_data_format, - NULL, /* onGetCursor */ - NULL, /* onGetLength */ - NULL, /* onSetLooping */ - 0 + ma_node_graph_node_process_pcm_frames, + NULL, /* onGetRequiredInputFrameCount */ + 0, /* 0 input buses. */ + 1, /* 1 output bus. */ + 0 /* Flags. */ }; - static void ma_node_graph_endpoint_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) { MA_ASSERT(pNode != NULL); @@ -71039,6 +71178,13 @@ static void ma_node_graph_endpoint_process_pcm_frames(ma_node* pNode, const floa (void)pFrameCountIn; (void)ppFramesOut; (void)pFrameCountOut; + +#if 0 + /* The data has already been mixed. We just need to move it to the output buffer. */ + if (ppFramesIn != NULL) { + ma_copy_pcm_frames(ppFramesOut[0], ppFramesIn[0], *pFrameCountOut, ma_format_f32, ma_node_get_output_channels(pNode, 0)); + } +#endif } static ma_node_vtable g_node_graph_endpoint_vtable = @@ -71053,7 +71199,7 @@ static ma_node_vtable g_node_graph_endpoint_vtable = MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph) { ma_result result; - ma_data_source_config dataSourceConfig; + ma_node_config baseConfig; ma_node_config endpointConfig; if (pNodeGraph == NULL) { @@ -71061,13 +71207,18 @@ MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const m } MA_ZERO_OBJECT(pNodeGraph); - pNodeGraph->processingSizeInFrames = pConfig->processingSizeInFrames; + pNodeGraph->nodeCacheCapInFrames = pConfig->nodeCacheCapInFrames; + if (pNodeGraph->nodeCacheCapInFrames == 0) { + pNodeGraph->nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS; + } - /* Data source. */ - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &ma_gNodeGraphDataSourceVTable; - result = ma_data_source_init(&dataSourceConfig, &pNodeGraph->ds); + /* Base node so we can use the node graph as a node into another graph. */ + baseConfig = ma_node_config_init(); + baseConfig.vtable = &g_node_graph_node_vtable; + baseConfig.pOutputChannels = &pConfig->channels; + + result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pNodeGraph->base); if (result != MA_SUCCESS) { return result; } @@ -71081,42 +71232,10 @@ MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const m result = ma_node_init(pNodeGraph, &endpointConfig, pAllocationCallbacks, &pNodeGraph->endpoint); if (result != MA_SUCCESS) { - ma_data_source_uninit(&pNodeGraph->ds); + ma_node_uninit(&pNodeGraph->base, pAllocationCallbacks); return result; } - - /* Processing cache. */ - if (pConfig->processingSizeInFrames > 0) { - pNodeGraph->pProcessingCache = (float*)ma_malloc(pConfig->processingSizeInFrames * pConfig->channels * sizeof(float), pAllocationCallbacks); - if (pNodeGraph->pProcessingCache == NULL) { - ma_node_uninit(&pNodeGraph->endpoint, pAllocationCallbacks); - return MA_OUT_OF_MEMORY; - } - } - - - /* - We need a pre-mix stack. The size of this stack is configurable via the config. The default value depends on the channel count. - */ - { - size_t preMixStackSizeInBytes = pConfig->preMixStackSizeInBytes; - if (preMixStackSizeInBytes == 0) { - preMixStackSizeInBytes = pConfig->channels * MA_DEFAULT_PREMIX_STACK_SIZE_PER_CHANNEL; - } - - pNodeGraph->pPreMixStack = ma_stack_init(preMixStackSizeInBytes, pAllocationCallbacks); - if (pNodeGraph->pPreMixStack == NULL) { - ma_node_uninit(&pNodeGraph->endpoint, pAllocationCallbacks); - if (pNodeGraph->pProcessingCache != NULL) { - ma_free(pNodeGraph->pProcessingCache, pAllocationCallbacks); - } - - return MA_OUT_OF_MEMORY; - } - } - - return MA_SUCCESS; } @@ -71127,17 +71246,6 @@ MA_API void ma_node_graph_uninit(ma_node_graph* pNodeGraph, const ma_allocation_ } ma_node_uninit(&pNodeGraph->endpoint, pAllocationCallbacks); - ma_data_source_uninit(&pNodeGraph->ds); - - if (pNodeGraph->pProcessingCache != NULL) { - ma_free(pNodeGraph->pProcessingCache, pAllocationCallbacks); - pNodeGraph->pProcessingCache = NULL; - } - - if (pNodeGraph->pPreMixStack != NULL) { - ma_stack_uninit(pNodeGraph->pPreMixStack, pAllocationCallbacks); - pNodeGraph->pPreMixStack = NULL; - } } MA_API ma_node* ma_node_graph_get_endpoint(ma_node_graph* pNodeGraph) @@ -71170,72 +71278,27 @@ MA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* totalFramesRead = 0; while (totalFramesRead < frameCount) { ma_uint32 framesJustRead; - ma_uint64 framesToRead; - float* pRunningFramesOut; + ma_uint64 framesToRead = frameCount - totalFramesRead; - framesToRead = frameCount - totalFramesRead; if (framesToRead > 0xFFFFFFFF) { framesToRead = 0xFFFFFFFF; } - pRunningFramesOut = (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels); - - /* If there's anything in the cache, consume that first. */ - if (pNodeGraph->processingCacheFramesRemaining > 0) { - ma_uint32 framesToReadFromCache; - - framesToReadFromCache = (ma_uint32)framesToRead; - if (framesToReadFromCache > pNodeGraph->processingCacheFramesRemaining) { - framesToReadFromCache = pNodeGraph->processingCacheFramesRemaining; - } - - MA_COPY_MEMORY(pRunningFramesOut, pNodeGraph->pProcessingCache, framesToReadFromCache * channels * sizeof(float)); - MA_MOVE_MEMORY(pNodeGraph->pProcessingCache, pNodeGraph->pProcessingCache + (framesToReadFromCache * channels), (pNodeGraph->processingCacheFramesRemaining - framesToReadFromCache) * channels * sizeof(float)); - pNodeGraph->processingCacheFramesRemaining -= framesToReadFromCache; - - totalFramesRead += framesToReadFromCache; - continue; - } else { - /* - If processingSizeInFrames is non-zero, we need to make sure we always read in chunks of that size. If the frame count is less than - that, we need to read into the cache and then continue on. - */ - float* pReadDst = pRunningFramesOut; - - if (pNodeGraph->processingSizeInFrames > 0) { - if (framesToRead < pNodeGraph->processingSizeInFrames) { - pReadDst = pNodeGraph->pProcessingCache; /* We need to read into the cache because otherwise we'll overflow the output buffer. */ - } - - framesToRead = pNodeGraph->processingSizeInFrames; - } - - ma_node_graph_set_is_reading(pNodeGraph, MA_TRUE); - { - result = ma_node_read_pcm_frames(&pNodeGraph->endpoint, 0, pReadDst, (ma_uint32)framesToRead, &framesJustRead, ma_node_get_time(&pNodeGraph->endpoint)); - } - ma_node_graph_set_is_reading(pNodeGraph, MA_FALSE); + ma_node_graph_set_is_reading(pNodeGraph, MA_TRUE); + { + result = ma_node_read_pcm_frames(&pNodeGraph->endpoint, 0, (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), (ma_uint32)framesToRead, &framesJustRead, ma_node_get_time(&pNodeGraph->endpoint)); + } + ma_node_graph_set_is_reading(pNodeGraph, MA_FALSE); - /* - Do not increment the total frames read counter if we read into the cache. We use this to determine how many frames have - been written to the final output buffer. - */ - if (pReadDst == pNodeGraph->pProcessingCache) { - /* We read into the cache. */ - pNodeGraph->processingCacheFramesRemaining = framesJustRead; - } else { - /* We read straight into the output buffer. */ - totalFramesRead += framesJustRead; - } + totalFramesRead += framesJustRead; - if (result != MA_SUCCESS) { - break; - } + if (result != MA_SUCCESS) { + break; + } - /* Abort if we weren't able to read any frames or else we risk getting stuck in a loop. */ - if (framesJustRead == 0) { - break; - } + /* Abort if we weren't able to read any frames or else we risk getting stuck in a loop. */ + if (framesJustRead == 0) { + break; } } @@ -71436,7 +71499,7 @@ static void ma_node_input_bus_detach__no_output_bus_lock(ma_node_input_bus* pInp *not* using a lock when iterating over the list in the audio thread. We therefore need to craft this in a way such that the iteration on the audio thread doesn't break. - The first thing to do is swap out the "next" pointer of the previous output bus with the + The the first thing to do is swap out the "next" pointer of the previous output bus with the new "next" output bus. This is the operation that matters for iteration on the audio thread. After that, the previous pointer on the new "next" pointer needs to be updated, after which point the linked list will be in a good state. @@ -71529,7 +71592,7 @@ static void ma_node_input_bus_attach(ma_node_input_bus* pInputBus, ma_node_outpu /* Now we need to attach the output bus to the linked list. This involves updating two pointers on two different output buses so I'm going to go ahead and keep this simple and just use a lock. - There are ways to do this without a lock, but it's just too hard to maintain for its value. + There are ways to do this without a lock, but it's just too hard to maintain for it's value. Although we're locking here, it's important to remember that we're *not* locking when iterating and reading audio data since that'll be running on the audio thread. As a result we need to be @@ -71622,9 +71685,11 @@ static ma_result ma_node_input_bus_read_pcm_frames(ma_node* pInputNode, ma_node_ ma_uint32 inputChannels; ma_bool32 doesOutputBufferHaveContent = MA_FALSE; + (void)pInputNode; /* Not currently used. */ + /* This will be called from the audio thread which means we can't be doing any locking. Basically, - this function will not perform any locking, whereas attaching and detaching will, but crafted in + this function will not perfom any locking, whereas attaching and detaching will, but crafted in such a way that we don't need to perform any locking here. The important thing to remember is to always iterate in a forward direction. @@ -71670,12 +71735,19 @@ static ma_result ma_node_input_bus_read_pcm_frames(ma_node* pInputNode, ma_node_ if (pFramesOut != NULL) { /* Read. */ + float temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE / sizeof(float)]; + ma_uint32 tempCapInFrames = ma_countof(temp) / inputChannels; + while (framesProcessed < frameCount) { float* pRunningFramesOut; ma_uint32 framesToRead; - ma_uint32 framesJustRead = 0; + ma_uint32 framesJustRead; framesToRead = frameCount - framesProcessed; + if (framesToRead > tempCapInFrames) { + framesToRead = tempCapInFrames; + } + pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(pFramesOut, framesProcessed, inputChannels); if (doesOutputBufferHaveContent == MA_FALSE) { @@ -71683,32 +71755,11 @@ static ma_result ma_node_input_bus_read_pcm_frames(ma_node* pInputNode, ma_node_ result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, pRunningFramesOut, framesToRead, &framesJustRead, globalTime + framesProcessed); } else { /* Slow path. Not the first attachment. Mixing required. */ - ma_uint32 preMixBufferCapInFrames = ((ma_node_base*)pInputNode)->cachedDataCapInFramesPerBus; - float* pPreMixBuffer = (float*)ma_stack_alloc(((ma_node_base*)pInputNode)->pNodeGraph->pPreMixStack, preMixBufferCapInFrames * inputChannels * sizeof(float)); - - if (pPreMixBuffer == NULL) { - /* - If you're hitting this assert it means you've got an unusually deep chain of nodes, you've got an excessively large processing - size, or you have a combination of both, and as a result have run out of stack space. You can increase this using the - preMixStackSizeInBytes variable in ma_node_graph_config. If you're using ma_engine, you can do it via the preMixStackSizeInBytes - variable in ma_engine_config. It defaults to 512KB per output channel. - */ - MA_ASSERT(MA_FALSE); - } else { - if (framesToRead > preMixBufferCapInFrames) { - framesToRead = preMixBufferCapInFrames; - } - - result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, pPreMixBuffer, framesToRead, &framesJustRead, globalTime + framesProcessed); - if (result == MA_SUCCESS || result == MA_AT_END) { - if (isSilentOutput == MA_FALSE) { /* Don't mix if the node outputs silence. */ - ma_mix_pcm_frames_f32(pRunningFramesOut, pPreMixBuffer, framesJustRead, inputChannels, /*volume*/1); - } + result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, temp, framesToRead, &framesJustRead, globalTime + framesProcessed); + if (result == MA_SUCCESS || result == MA_AT_END) { + if (isSilentOutput == MA_FALSE) { /* Don't mix if the node outputs silence. */ + ma_mix_pcm_frames_f32(pRunningFramesOut, temp, framesJustRead, inputChannels, /*volume*/1); } - - /* The pre-mix buffer is no longer required. */ - ma_stack_free(((ma_node_base*)pInputNode)->pNodeGraph->pPreMixStack, pPreMixBuffer); - pPreMixBuffer = NULL; } } @@ -71763,25 +71814,6 @@ MA_API ma_node_config ma_node_config_init(void) return config; } -static ma_uint16 ma_node_config_get_cache_size_in_frames(const ma_node_config* pConfig, const ma_node_graph* pNodeGraph) -{ - ma_uint32 cacheSizeInFrames; - - (void)pConfig; - - if (pNodeGraph->processingSizeInFrames > 0) { - cacheSizeInFrames = pNodeGraph->processingSizeInFrames; - } else { - cacheSizeInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS; - } - - if (cacheSizeInFrames > 0xFFFF) { - cacheSizeInFrames = 0xFFFF; - } - - return (ma_uint16)cacheSizeInFrames; -} - static ma_result ma_node_detach_full(ma_node* pNode); @@ -71936,7 +71968,7 @@ static ma_result ma_node_get_heap_layout(ma_node_graph* pNodeGraph, const ma_nod /* Cached audio data. - We need to allocate memory for caching both input and output data. We have an optimization + We need to allocate memory for a caching both input and output data. We have an optimization where no caching is necessary for specific conditions: - The node has 0 inputs and 1 output. @@ -71955,18 +71987,14 @@ static ma_result ma_node_get_heap_layout(ma_node_graph* pNodeGraph, const ma_nod } else { /* Slow path. Cache needed. */ size_t cachedDataSizeInBytes = 0; - ma_uint32 cacheCapInFrames; ma_uint32 iBus; - /* The capacity of the cache is based on our callback processing size. */ - cacheCapInFrames = ma_node_config_get_cache_size_in_frames(pConfig, pNodeGraph); - for (iBus = 0; iBus < inputBusCount; iBus += 1) { - cachedDataSizeInBytes += cacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pInputChannels[iBus]); + cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pInputChannels[iBus]); } for (iBus = 0; iBus < outputBusCount; iBus += 1) { - cachedDataSizeInBytes += cacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pOutputChannels[iBus]); + cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pOutputChannels[iBus]); } pHeapLayout->cachedDataOffset = pHeapLayout->sizeInBytes; @@ -72052,12 +72080,13 @@ MA_API ma_result ma_node_init_preallocated(ma_node_graph* pNodeGraph, const ma_n if (heapLayout.cachedDataOffset != MA_SIZE_MAX) { pNodeBase->pCachedData = (float*)ma_offset_ptr(pHeap, heapLayout.cachedDataOffset); - pNodeBase->cachedDataCapInFramesPerBus = ma_node_config_get_cache_size_in_frames(pConfig, pNodeGraph); + pNodeBase->cachedDataCapInFramesPerBus = pNodeGraph->nodeCacheCapInFrames; } else { pNodeBase->pCachedData = NULL; } + /* We need to run an initialization step for each input and output bus. */ for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNodeBase); iInputBus += 1) { result = ma_node_input_bus_init(pConfig->pInputChannels[iInputBus], &pNodeBase->pInputBuses[iInputBus]); @@ -72231,7 +72260,7 @@ static ma_result ma_node_detach_full(ma_node* pNode) /* At this point all output buses will have been detached from the graph and we can be guaranteed - that none of its input nodes will be getting processed by the graph. We can detach these + that none of it's input nodes will be getting processed by the graph. We can detach these without needing to worry about the audio thread touching them. */ for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNode); iInputBus += 1) { @@ -72246,7 +72275,7 @@ static ma_result ma_node_detach_full(ma_node* pNode) linked list logic. We don't need to worry about the audio thread referencing these because the step above severed the connection to the graph. */ - for (pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pInputBus->head.pNext); pOutputBus != NULL; pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pInputBus->head.pNext)) { + for (pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pInputBus->head.pNext); pOutputBus != NULL; pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pOutputBus->pNext)) { ma_node_detach_output_bus(pOutputBus->pNode, pOutputBus->outputBusIndex); /* This won't do any waiting in practice and should be efficient. */ } } @@ -72268,7 +72297,7 @@ MA_API ma_result ma_node_detach_output_bus(ma_node* pNode, ma_uint32 outputBusIn return MA_INVALID_ARGS; /* Invalid output bus index. */ } - /* We need to lock the output bus because we need to inspect the input node and grab its input bus. */ + /* We need to lock the output bus because we need to inspect the input node and grab it's input bus. */ ma_node_output_bus_lock(&pNodeBase->pOutputBuses[outputBusIndex]); { pInputNodeBase = (ma_node_base*)pNodeBase->pOutputBuses[outputBusIndex].pInputNode; @@ -72434,7 +72463,7 @@ MA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_ui /* Getting here means the node is marked as started, but it may still not be truly started due to - its start time not having been reached yet. Also, the stop time may have also been reached in + it's start time not having been reached yet. Also, the stop time may have also been reached in which case it'll be considered stopped. */ if (ma_node_get_state_time(pNode, ma_node_state_started) > globalTimeBeg) { @@ -72445,7 +72474,7 @@ MA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_ui return ma_node_state_stopped; /* Stop time has been reached. */ } - /* Getting here means the node is marked as started and is within its start/stop times. */ + /* Getting here means the node is marked as started and is within it's start/stop times. */ return ma_node_state_started; } @@ -72607,12 +72636,12 @@ static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusInde frameCountOut = totalFramesRead; if (totalFramesRead > 0) { - ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Explicit cast to silence the warning. */ + ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */ } /* A passthrough should never have modified the input and output frame counts. If you're - triggering these asserts you need to fix your processing callback. + triggering these assers you need to fix your processing callback. */ MA_ASSERT(frameCountIn == totalFramesRead); MA_ASSERT(frameCountOut == totalFramesRead); @@ -72790,7 +72819,7 @@ static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusInde frames available right now. */ if (frameCountIn > 0 || (pNodeBase->vtable->flags & MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES) != 0) { - ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Explicit cast to silence the warning. */ + ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */ } else { frameCountOut = 0; /* No data was processed. */ } @@ -73897,6 +73926,42 @@ MA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_ ma_delay_uninit(&pDelayNode->delay, pAllocationCallbacks); } +MA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value) +{ + if (pDelayNode == NULL) { + return; + } + + ma_delay_set_wet(&pDelayNode->delay, value); +} + +MA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode) +{ + if (pDelayNode == NULL) { + return 0; + } + + return ma_delay_get_wet(&pDelayNode->delay); +} + +MA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value) +{ + if (pDelayNode == NULL) { + return; + } + + ma_delay_set_dry(&pDelayNode->delay, value); +} + +MA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode) +{ + if (pDelayNode == NULL) { + return 0; + } + + return ma_delay_get_dry(&pDelayNode->delay); +} + MA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value) { if (pDelayNode == NULL) { @@ -73934,8 +73999,8 @@ static void ma_sound_set_at_end(ma_sound* pSound, ma_bool32 atEnd) /* Fire any callbacks or events. */ if (atEnd) { - if (pSound->notifications.onAtEnd != NULL) { - pSound->notifications.onAtEnd(pSound->notifications.pUserData, pSound); + if (pSound->endCallback != NULL) { + pSound->endCallback(pSound->pEndCallbackUserData, pSound); } } } @@ -73991,15 +74056,15 @@ static ma_bool32 ma_engine_node_is_pitching_enabled(const ma_engine_node* pEngin { MA_ASSERT(pEngineNode != NULL); - /* Don't try to be clever by skipping resampling in the pitch=1 case or else you'll glitch when moving away from 1. */ - return ma_atomic_load_explicit_32(&pEngineNode->isPitchDisabled, ma_atomic_memory_order_acquire) == 0; + /* Don't try to be clever by skiping resampling in the pitch=1 case or else you'll glitch when moving away from 1. */ + return !ma_atomic_load_explicit_32(&pEngineNode->isPitchDisabled, ma_atomic_memory_order_acquire); } static ma_bool32 ma_engine_node_is_spatialization_enabled(const ma_engine_node* pEngineNode) { MA_ASSERT(pEngineNode != NULL); - return ma_atomic_load_explicit_32(&pEngineNode->isSpatializationDisabled, ma_atomic_memory_order_acquire) == 0; + return !ma_atomic_load_explicit_32(&pEngineNode->isSpatializationDisabled, ma_atomic_memory_order_acquire); } static ma_uint64 ma_engine_node_get_required_input_frame_count(const ma_engine_node* pEngineNode, ma_uint64 outputFrameCount) @@ -74258,27 +74323,6 @@ static void ma_engine_node_process_pcm_frames__general(ma_engine_node* pEngineNo } } - /* - Fire the processing callback. We can cast pEngineNode to a `ma_sound` since that's the base object. There's - a few edge cases here. It's possible that a sound does not have a data source or an input which means the - input frame count may be zero. In this case, the output frame count at this point will also be zero since - it was unable to process any data. We need to check for this and just assume that the processing callback - is producing some data. We pre-initialize this to silence. - */ - { - ma_sound* pSound = (ma_sound*)pEngineNode; - if (pSound->notifications.onProcess != NULL) { - if (totalFramesProcessedOut == 0 && totalFramesProcessedIn == 0 && frameCountOut > 0) { - /* Pre-silence the output buffer. This should be the equivalent to setting the output frame count to 0. */ - totalFramesProcessedOut = frameCountOut; - ma_silence_pcm_frames(ppFramesOut[0], totalFramesProcessedOut, ma_format_f32, channelsOut); - } - - pSound->notifications.onProcess(pSound->notifications.pUserData, pSound, ppFramesOut[0], totalFramesProcessedOut); - } - } - - /* At this point we're done processing. */ *pFrameCountIn = totalFramesProcessedIn; *pFrameCountOut = totalFramesProcessedOut; @@ -74796,18 +74840,12 @@ MA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocati } - -MA_API ma_sound_notifications ma_sound_notifications_init(void) +MA_API ma_sound_config ma_sound_config_init(void) { - ma_sound_notifications notifications; - - MA_ZERO_OBJECT(¬ifications); - - return notifications; + return ma_sound_config_init_2(NULL); } - -MA_API ma_sound_config ma_sound_config_init(ma_engine* pEngine) +MA_API ma_sound_config ma_sound_config_init_2(ma_engine* pEngine) { ma_sound_config config; @@ -74825,7 +74863,12 @@ MA_API ma_sound_config ma_sound_config_init(ma_engine* pEngine) return config; } -MA_API ma_sound_group_config ma_sound_group_config_init(ma_engine* pEngine) +MA_API ma_sound_group_config ma_sound_group_config_init(void) +{ + return ma_sound_group_config_init_2(NULL); +} + +MA_API ma_sound_group_config ma_sound_group_config_init_2(ma_engine* pEngine) { ma_sound_group_config config; @@ -75005,10 +75048,9 @@ MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEng } - /* The engine is a node graph. This needs to be initialized after we have the device so we can determine the channel count. */ + /* The engine is a node graph. This needs to be initialized after we have the device so we can can determine the channel count. */ nodeGraphConfig = ma_node_graph_config_init(engineConfig.channels); - nodeGraphConfig.processingSizeInFrames = engineConfig.periodSizeInFrames; - nodeGraphConfig.preMixStackSizeInBytes = engineConfig.preMixStackSizeInBytes; + nodeGraphConfig.nodeCacheCapInFrames = (engineConfig.periodSizeInFrames > 0xFFFF) ? 0xFFFF : (ma_uint16)engineConfig.periodSizeInFrames; result = ma_node_graph_init(&nodeGraphConfig, &pEngine->allocationCallbacks, &pEngine->nodeGraph); if (result != MA_SUCCESS) { @@ -75326,6 +75368,16 @@ MA_API ma_result ma_engine_set_time_in_milliseconds(ma_engine* pEngine, ma_uint6 return ma_engine_set_time_in_pcm_frames(pEngine, globalTime * ma_engine_get_sample_rate(pEngine) / 1000); } +MA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine) +{ + return ma_engine_get_time_in_pcm_frames(pEngine); +} + +MA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime) +{ + return ma_engine_set_time_in_pcm_frames(pEngine, globalTime); +} + MA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine) { return ma_node_graph_get_channels(&pEngine->nodeGraph); @@ -75747,10 +75799,6 @@ static ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, con type = ma_engine_node_type_group; } - if (pConfig->pNotifications != NULL) { - pSound->notifications = *pConfig->pNotifications; - } - /* Sounds are engine nodes. Before we can initialize this we need to determine the channel count. If we can't do this we need to abort. It's up to the caller to ensure they're using a data @@ -75815,22 +75863,12 @@ static ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, con ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); } - ma_sound_set_looping(pSound, (pConfig->flags & MA_SOUND_FLAG_LOOPING) != 0); + ma_sound_set_looping(pSound, pConfig->isLooping); return MA_SUCCESS; } #ifndef MA_NO_RESOURCE_MANAGER -static void ma_sound__on_async_notification_loaded(ma_async_notification* pNotification) -{ - ma_sound* pSound = (ma_sound*)((ma_async_notification_callbacks*)pNotification)->pUserData; - MA_ASSERT(pSound != NULL); - - if (pSound->notifications.onLoaded) { - pSound->notifications.onLoaded(pSound->notifications.pUserData, pSound); - } -} - MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound) { ma_result result = MA_SUCCESS; @@ -75855,17 +75893,11 @@ MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_s return MA_OUT_OF_MEMORY; } - notifications = ma_resource_manager_pipeline_notifications_init(); - if (pConfig->pNotifications != NULL) { - notifications.done.pFence = pConfig->pNotifications->pLoadedFence; - - if (pConfig->pNotifications->onLoaded != NULL) { - pSound->resourceManagerDoneNotification.onSignal = ma_sound__on_async_notification_loaded; - pSound->resourceManagerDoneNotification.pUserData = pSound; - notifications.done.pNotification = &pSound->resourceManagerDoneNotification; - } + /* Removed in 0.12. Set pDoneFence on the notifications. */ + notifications = pConfig->initNotifications; + if (pConfig->pDoneFence != NULL && notifications.done.pFence == NULL) { + notifications.done.pFence = pConfig->pDoneFence; } - /* We must wrap everything around the fence if one was specified. This ensures ma_fence_wait() does @@ -75883,6 +75915,7 @@ MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_s resourceManagerDataSourceConfig.rangeEndInPCMFrames = pConfig->rangeEndInPCMFrames; resourceManagerDataSourceConfig.loopPointBegInPCMFrames = pConfig->loopPointBegInPCMFrames; resourceManagerDataSourceConfig.loopPointEndInPCMFrames = pConfig->loopPointEndInPCMFrames; + resourceManagerDataSourceConfig.isLooping = pConfig->isLooping; result = ma_resource_manager_data_source_init_ex(pEngine->pResourceManager, &resourceManagerDataSourceConfig, pSound->pResourceManagerDataSource); if (result != MA_SUCCESS) { @@ -75910,7 +75943,7 @@ MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_s return result; } -MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound) +MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound) { ma_sound_config config; @@ -75918,16 +75951,16 @@ MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePa return MA_INVALID_ARGS; } - config = ma_sound_config_init(pEngine); + config = ma_sound_config_init_2(pEngine); config.pFilePath = pFilePath; config.flags = flags; config.pInitialAttachment = pGroup; - config.pNotifications = pNotifications; + config.pDoneFence = pDoneFence; return ma_sound_init_ex(pEngine, &config, pSound); } -MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound) +MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound) { ma_sound_config config; @@ -75935,16 +75968,16 @@ MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pF return MA_INVALID_ARGS; } - config = ma_sound_config_init(pEngine); + config = ma_sound_config_init_2(pEngine); config.pFilePathW = pFilePath; config.flags = flags; config.pInitialAttachment = pGroup; - config.pNotifications = pNotifications; + config.pDoneFence = pDoneFence; return ma_sound_init_ex(pEngine, &config, pSound); } -MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound) +MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound) { ma_result result; ma_sound_config config; @@ -75978,13 +76011,12 @@ MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistin return result; } - config = ma_sound_config_init(pEngine); + config = ma_sound_config_init_2(pEngine); config.pDataSource = pSound->pResourceManagerDataSource; config.flags = flags; config.pInitialAttachment = pGroup; config.monoExpansionMode = pExistingSound->engineNode.monoExpansionMode; config.volumeSmoothTimeInPCMFrames = pExistingSound->engineNode.volumeSmoothTimeInPCMFrames; - config.pNotifications = pNotifications; result = ma_sound_init_from_data_source_internal(pEngine, &config, pSound); if (result != MA_SUCCESS) { @@ -76001,14 +76033,12 @@ MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistin } #endif -MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, const ma_sound_notifications* pNotifications, ma_sound* pSound) +MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound) { - ma_sound_config config = ma_sound_config_init(pEngine); + ma_sound_config config = ma_sound_config_init_2(pEngine); config.pDataSource = pDataSource; config.flags = flags; config.pInitialAttachment = pGroup; - config.pNotifications = pNotifications; - return ma_sound_init_ex(pEngine, &config, pSound); } @@ -76025,9 +76055,8 @@ MA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pCo return MA_INVALID_ARGS; } - if (pConfig->pNotifications != NULL) { - pSound->notifications = *pConfig->pNotifications; - } + pSound->endCallback = pConfig->endCallback; + pSound->pEndCallbackUserData = pConfig->pEndCallbackUserData; /* We need to load the sound differently depending on whether or not we're loading from a file. */ #ifndef MA_NO_RESOURCE_MANAGER @@ -76038,7 +76067,7 @@ MA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pCo { /* Getting here means we're not loading from a file. We may be loading from an already-initialized - data source, or none at all. If we aren't specifying any data source, we'll be initializing + data source, or none at all. If we aren't specifying any data source, we'll be initializing the the equivalent to a group. ma_data_source_init_from_data_source_internal() will deal with this for us, so no special treatment required here. */ @@ -76867,10 +76896,27 @@ MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength return ma_data_source_get_length_in_seconds(pSound->pDataSource, pLength); } +MA_API ma_result ma_sound_set_end_callback(ma_sound* pSound, ma_sound_end_proc callback, void* pUserData) +{ + if (pSound == NULL) { + return MA_INVALID_ARGS; + } + + /* The notion of an end is only valid for sounds that are backed by a data source. */ + if (pSound->pDataSource == NULL) { + return MA_INVALID_OPERATION; + } + + pSound->endCallback = callback; + pSound->pEndCallbackUserData = pUserData; + + return MA_SUCCESS; +} + MA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup) { - ma_sound_group_config config = ma_sound_group_config_init(pEngine); + ma_sound_group_config config = ma_sound_group_config_init_2(pEngine); config.flags = flags; config.pInitialAttachment = pParentGroup; return ma_sound_group_init_ex(pEngine, &config, pGroup); @@ -78509,6 +78555,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p } if (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) { if (ma_dr_wav_bytes_to_u32_ex(chunkSizeBytes, pWav->container) < 36) { + return MA_FALSE; } } else if (pWav->container == ma_dr_wav_container_rf64) { if (ma_dr_wav_bytes_to_u32_le(chunkSizeBytes) != 0xFFFFFFFF) { @@ -78835,7 +78882,9 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p } } if (isProcessingMetadata) { - ma_dr_wav__metadata_process_chunk(&metadataParser, &header, ma_dr_wav_metadata_type_all_including_unknown); + ma_uint64 metadataBytesRead; + metadataBytesRead = ma_dr_wav__metadata_process_chunk(&metadataParser, &header, ma_dr_wav_metadata_type_all_including_unknown); + MA_DR_WAV_ASSERT(metadataBytesRead <= header.sizeInBytes); if (ma_dr_wav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData) == MA_FALSE) { break; } @@ -81598,7 +81647,7 @@ MA_API void ma_dr_wav_f32_to_s32(ma_int32* pOut, const float* pIn, size_t sample return; } for (i = 0; i < sampleCount; ++i) { - *pOut++ = (ma_int32)(2147483648.0f * pIn[i]); + *pOut++ = (ma_int32)(2147483648.0 * pIn[i]); } } MA_API void ma_dr_wav_f64_to_s32(ma_int32* pOut, const double* pIn, size_t sampleCount) @@ -91086,8 +91135,8 @@ static ma_int16 ma_dr_mp3d_scale_pcm(float sample) s32 -= (s32 < 0); s = (ma_int16)ma_dr_mp3_clip_int16_arm(s32); #else - if (sample >= 32766.5f) return (ma_int16) 32767; - if (sample <= -32767.5f) return (ma_int16)-32768; + if (sample >= 32766.5) return (ma_int16) 32767; + if (sample <= -32767.5) return (ma_int16)-32768; s = (ma_int16)(sample + .5f); s -= (s < 0); #endif @@ -91473,9 +91522,9 @@ MA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_s for(; i < num_samples; i++) { float sample = in[i] * 32768.0f; - if (sample >= 32766.5f) + if (sample >= 32766.5) out[i] = (ma_int16) 32767; - else if (sample <= -32767.5f) + else if (sample <= -32767.5) out[i] = (ma_int16)-32768; else { diff --git a/wasm.sh b/wasm.sh new file mode 100644 index 0000000..2997284 --- /dev/null +++ b/wasm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd web +sh ./compile_wasm.sh diff --git a/web.sh b/web.sh new file mode 100644 index 0000000..b342433 --- /dev/null +++ b/web.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd web +sh ./compile_worker.sh diff --git a/web/CMakeLists.txt b/web/CMakeLists.txt deleted file mode 100644 index 2ef04c0..0000000 --- a/web/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -set(PROJECT_NAME "flutter_soloud") -project(${PROJECT_NAME} LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -set(PLUGIN_NAME "${PROJECT_NAME}_plugin") - -if (EMSCRIPTEN) - set(CMAKE_AR "emcc") - set(CMAKE_STATIC_LIBRARY_SUFFIX ".js") - set(CMAKE_C_CREATE_STATIC_LIBRARY " -o ") - set(CMAKE_CXX_CREATE_STATIC_LIBRARY " -o ") -endif() - -set(CMAKE_C_FLAGS "-s STANDALONE_WASM" ) - - -## Add SoLoud custom cmake files -message("**************** SOLOUD CONFIGURE.CMAKE") -include (Configure.cmake) -message("**************** SOLOUD SRC.CMAKE 1") -include_directories(../src/soloud/include ) -include_directories(../src/soloud/src) -include (src.cmake) -message("**************** SOLOUD SRC.CMAKE 2 ${TARGET_NAME}") - - -list(APPEND PLUGIN_SOURCES - "../src/common.cpp" - "../src/bindings.cpp" - "../src/player.cpp" - "../src/analyzer.cpp" - "../src/bindings_capture.cpp" - "../src/capture.cpp" - "../src/synth/basic_wave.cpp" - "../src/filters/filters.cpp" - - # add SoLoud sources. These definitions are in src.cmake - ${TARGET_SOURCES} -) -add_library(${PLUGIN_NAME} STATIC - ${PLUGIN_SOURCES} -) - - -target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) -target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/src") -target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) - - -target_compile_options(${PLUGIN_NAME} PRIVATE -Wall -Wno-error -O3 -DNDEBUG -s MAIN_MODULE=1) - -target_compile_definitions (${PLUGIN_NAME} PRIVATE __WASM__) - diff --git a/web/Configure.cmake b/web/Configure.cmake deleted file mode 100644 index 68252e1..0000000 --- a/web/Configure.cmake +++ /dev/null @@ -1,48 +0,0 @@ -# copied from souloud/contrib to set these parameters for linux - -include (${CMAKE_CURRENT_SOURCE_DIR}/../src/soloud/contrib/cmake/OptionDependentOnPackage.cmake) -include (${CMAKE_CURRENT_SOURCE_DIR}/../src/soloud/contrib/cmake/PrintOptionStatus.cmake) - -option (SOLOUD_DYNAMIC "Set to ON to build dynamic SoLoud" OFF) -print_option_status (SOLOUD_DYNAMIC "Build dynamic library") - -option (SOLOUD_STATIC "Set to ON to build static SoLoud" ON) -print_option_status (SOLOUD_STATIC "Build static library") - -option (SOLOUD_C_API "Set to ON to include the C API" OFF) -print_option_status (SOLOUD_C_API "Build C API") - - -# TODO: -option (SOLOUD_BACKEND_MINIAUDIO "Set to ON to include MiniAudio" ON) -print_option_status (SOLOUD_WITH_MINIAUDIO "Build MiniAudio") - -option (SOLOUD_BUILD_DEMOS "Set to ON for building demos" OFF) -print_option_status (SOLOUD_BUILD_DEMOS "Build demos") - -option (SOLOUD_BACKEND_NULL "Set to ON for building NULL backend" ON) -print_option_status (SOLOUD_BACKEND_NULL "NULL backend") - -option (SOLOUD_BACKEND_SDL2 "Set to ON for building SDL2 backend" OFF) -print_option_status (SOLOUD_BACKEND_SDL2 "SDL2 backend") - -option (SOLOUD_BACKEND_ALSA "Set to ON for building ALSA backend" OFF) -print_option_status (SOLOUD_BACKEND_ALSA "ALSA backend") - -option (SOLOUD_BACKEND_COREAUDIO "Set to ON for building CoreAudio backend" OFF) -print_option_status (SOLOUD_BACKEND_COREAUDIO "CoreAudio backend") - -option (SOLOUD_BACKEND_OPENSLES "Set to ON for building OpenSLES backend" OFF) -print_option_status (SOLOUD_BACKEND_OPENSLES "OpenSLES backend") - -option (SOLOUD_BACKEND_XAUDIO2 "Set to ON for building XAudio2 backend" OFF) -print_option_status (SOLOUD_BACKEND_XAUDIO2 "XAudio2 backend") - -option (SOLOUD_BACKEND_WINMM "Set to ON for building WINMM backend" OFF) -print_option_status (SOLOUD_BACKEND_WINMM "WINMM backend") - -option (SOLOUD_BACKEND_WASAPI "Set to ON for building WASAPI backend" OFF) -print_option_status (SOLOUD_BACKEND_WASAPI "WASAPI backend") - -option (SOLOUD_GENERATE_GLUE "Set to ON for generating the Glue APIs" OFF) -print_option_status (SOLOUD_GENERATE_GLUE "Generate Glue") diff --git a/web/compile b/web/compile deleted file mode 100755 index def2531..0000000 --- a/web/compile +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -rm -r build -mkdir build -cd build -emcmake cmake .. -emmake make -j30 diff --git a/web/compile_wasm.sh b/web/compile_wasm.sh new file mode 100755 index 0000000..674b1fa --- /dev/null +++ b/web/compile_wasm.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +rm -f libflutter_soloud_plugin.* +rm -r build +mkdir build +cd build + + +# https://emscripten.org/docs/tools_reference/emcc.html +# https://emscripten.org/docs/optimizing/Optimizing-Code.html +#-g3 #keep debug info, including JS whitespace, function names +#-sSTACK_SIZE=1048576 -sALLOW_MEMORY_GROWTH +# To help diagnose issues like segmentation faults, compile with debug information +# use the -g flag to include debugging symbols in the generated WASM file. + +# disable the asynchronous startup/loading behaviour +# -s BINARYEN_ASYNC_COMPILATION=0 +# https://github.com/emscripten-core/emscripten/issues/5352#issuecomment-312384604 + +# https://emscripten.org/docs/tools_reference/settings_reference.html + +# -s ASSERTIONS=1 -s SAFE_HEAP=1 \ +# -s TOTAL_MEMORY=512MB \ + +# + +em++ \ +-I ../../src -I ../../src/filters -I ../../src/synth -I ../../src/soloud/include \ +-I ../../src/soloud/src -I ../../src/soloud/include \ +../../src/soloud/src/core/*.c* \ +../../src/soloud/src/filter/*.c* \ +../../src/soloud/src/backend/miniaudio/*.c* \ +../../src/soloud/src/audiosource/ay/*.c* \ +../../src/soloud/src/audiosource/speech/*.c* \ +../../src/soloud/src/audiosource/wav/*.c* \ +../../src/common.cpp \ +../../src/bindings.cpp \ +../../src/player.cpp \ +../../src/analyzer.cpp \ +../../src/bindings_capture.cpp \ +../../src/capture.cpp \ +../../src/synth/basic_wave.cpp \ +../../src/filters/filters.cpp \ +-O0 -g -D WITH_MINIAUDIO \ +-I ~/.emscripten_cache/sysroot/include \ +-s "EXPORTED_RUNTIME_METHODS=['ccall','cwrap']" \ +-s "EXPORTED_FUNCTIONS=['_free', '_malloc']" \ +-s EXPORT_ALL=1 -s NO_EXIT_RUNTIME=1 \ +-s ASSERTIONS=1 \ +-s DEFAULT_TO_CXX \ +-s ALLOW_MEMORY_GROWTH \ +-o ../../web/libflutter_soloud_plugin.js + diff --git a/web/compile_worker.bat b/web/compile_worker.bat new file mode 100755 index 0000000..aef6762 --- /dev/null +++ b/web/compile_worker.bat @@ -0,0 +1,2 @@ + # -O4 +dart compile js -o worker.dart.js ./worker.dart \ No newline at end of file diff --git a/web/compile_worker.sh b/web/compile_worker.sh new file mode 100755 index 0000000..5940926 --- /dev/null +++ b/web/compile_worker.sh @@ -0,0 +1 @@ +dart compile js -O0 -o worker.dart.js ./worker.dart \ No newline at end of file diff --git a/web/libflutter_soloud_plugin.js b/web/libflutter_soloud_plugin.js new file mode 100644 index 0000000..cb4b889 --- /dev/null +++ b/web/libflutter_soloud_plugin.js @@ -0,0 +1,4814 @@ +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary; + +if (ENVIRONMENT_IS_NODE) { + if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split('.').slice(0, 3); + numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1); + var minVersion = 160000; + if (numericVersion < 160000) { + throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')'); + } + + // `require()` is no-op in an ESM module, use `createRequire()` to construct + // the require()` function. This is only necessary for multi-environment + // builds, `-sENVIRONMENT=node` emits a static import declaration instead. + // TODO: Swap all `require()`'s with `import()`'s? + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('fs'); + var nodePath = require('path'); + + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = nodePath.dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js +read_ = (filename, binary) => { + // We need to re-wrap `file://` strings to URLs. Normalizing isn't + // necessary in that case, the path should already be absolute. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror, binary = true) => { + // See the comment in the `read_` function. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); +}; +// end include: node_shell_read.js + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + arguments_ = process.argv.slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process.on('uncaughtException', (ex) => { + // suppress ExitStatus exceptions from showing an error + if (ex !== 'unwind' && !(ex instanceof ExitStatus) && !(ex.context instanceof ExitStatus)) { + throw ex; + } + }); + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = read; + } + + readBinary = (f) => { + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + let data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = (f, onload, onerror) => { + setTimeout(() => onload(readBinary(f))); + }; + + if (typeof clearTimeout == 'undefined') { + globalThis.clearTimeout = (id) => {}; + } + + if (typeof setTimeout == 'undefined') { + // spidermonkey lacks setTimeout but we use it above in readAsync. + globalThis.setTimeout = (f) => (typeof f == 'function') ? f() : abort(); + } + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason, we must call `quit` - the only way to + // set the exit code - but quit also halts immediately. To increase + // consistency with node (and the web) we schedule the actual quit call + // using a setTimeout to give the current stack and any exception handlers + // a chance to run. This enables features such as addOnPostRun (which + // expected to be able to run code after main returns). + setTimeout(() => { + if (!(toThrow instanceof ExitStatus)) { + let toLog = toThrow; + if (toThrow && typeof toThrow == 'object' && toThrow.stack) { + toLog = [toThrow, toThrow.stack]; + } + err(`exiting due to exception: ${toLog}`); + } + quit(status); + }); + throw toThrow; + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.startsWith('blob:')) { + scriptDirectory = ''; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/')+1); + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js +read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.error.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('asm', 'wasmExports'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.'); + +// end include: shell.js + +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +// Memory management + +var HEAP, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +// include: runtime_shared.js +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); +} +// end include: runtime_shared.js +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_assertions.js +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + +if (!Module['noFSInit'] && !FS.init.initialized) + FS.init(); +FS.ignorePermissions = false; + +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + Module['monitorRunDependencies']?.(runDependencies); + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + Module['monitorRunDependencies']?.(runDependencies); + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +/** @param {string|number=} what */ +function abort(what) { + Module['onAbort']?.(what); + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// include: URIUtils.js +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +/** + * Indicates whether filename is a base64 data URI. + * @noinline + */ +var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); +// end include: URIUtils.js +function createExportWrapper(name) { + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + return f(...args); + }; +} + +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +var wasmBinaryFile; + wasmBinaryFile = 'libflutter_soloud_plugin.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw 'both async and sync fetching of the wasm failed'; +} + +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, try to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary + && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(binaryFile) + ) { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + if (!response['ok']) { + throw `failed to load wasm binary file at '${binaryFile}'`; + } + return response['arrayBuffer'](); + }).catch(() => getBinarySync(binaryFile)); + } + else if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise((resolve, reject) => { + readAsync(binaryFile, (response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))), reject) + }); + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); +} + +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(binaryFile) && + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function') { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, imports); + + return result.then( + callback, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + wasmExports = instance.exports; + + + + wasmMemory = wasmExports['memory']; + + assert(wasmMemory, 'memory not found in wasm exports'); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateMemoryViews(); + + addOnInit(wasmExports['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + // wait for the pthread pool (if any) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// include: runtime_debug.js +function legacyModuleProp(prop, newName, incoming=true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incoming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : ''; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); + + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +function missingGlobal(sym, msg) { + if (typeof globalThis !== 'undefined') { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`); + return undefined; + } + }); + } +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + return undefined; + } + }); + } + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); +} +// end include: runtime_debug.js +// === Body === + +var ASM_CONSTS = { + 134120: ($0, $1, $2, $3, $4) => { if (typeof window === 'undefined' || (window.AudioContext || window.webkitAudioContext) === undefined) { return 0; } if (typeof(window.miniaudio) === 'undefined') { window.miniaudio = { referenceCount: 0 }; window.miniaudio.device_type = {}; window.miniaudio.device_type.playback = $0; window.miniaudio.device_type.capture = $1; window.miniaudio.device_type.duplex = $2; window.miniaudio.device_state = {}; window.miniaudio.device_state.stopped = $3; window.miniaudio.device_state.started = $4; miniaudio.devices = []; miniaudio.track_device = function(device) { for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { if (miniaudio.devices[iDevice] == null) { miniaudio.devices[iDevice] = device; return iDevice; } } miniaudio.devices.push(device); return miniaudio.devices.length - 1; }; miniaudio.untrack_device_by_index = function(deviceIndex) { miniaudio.devices[deviceIndex] = null; while (miniaudio.devices.length > 0) { if (miniaudio.devices[miniaudio.devices.length-1] == null) { miniaudio.devices.pop(); } else { break; } } }; miniaudio.untrack_device = function(device) { for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { if (miniaudio.devices[iDevice] == device) { return miniaudio.untrack_device_by_index(iDevice); } } }; miniaudio.get_device_by_index = function(deviceIndex) { return miniaudio.devices[deviceIndex]; }; miniaudio.unlock_event_types = (function(){ return ['touchend', 'click']; })(); miniaudio.unlock = function() { for(var i = 0; i < miniaudio.devices.length; ++i) { var device = miniaudio.devices[i]; if (device != null && device.webaudio != null && device.state === window.miniaudio.device_state.started) { device.webaudio.resume().then(() => { Module._ma_device__on_notification_unlocked(device.pDevice); }, (error) => {console.error("Failed to resume audiocontext", error); }); } } miniaudio.unlock_event_types.map(function(event_type) { document.removeEventListener(event_type, miniaudio.unlock, true); }); }; miniaudio.unlock_event_types.map(function(event_type) { document.addEventListener(event_type, miniaudio.unlock, true); }); } window.miniaudio.referenceCount += 1; return 1; }, + 136278: () => { if (typeof(window.miniaudio) !== 'undefined') { window.miniaudio.referenceCount -= 1; if (window.miniaudio.referenceCount === 0) { delete window.miniaudio; } } }, + 136442: () => { return (navigator.mediaDevices !== undefined && navigator.mediaDevices.getUserMedia !== undefined); }, + 136546: () => { try { var temp = new (window.AudioContext || window.webkitAudioContext)(); var sampleRate = temp.sampleRate; temp.close(); return sampleRate; } catch(e) { return 0; } }, + 136717: ($0, $1, $2, $3, $4, $5) => { var deviceType = $0; var channels = $1; var sampleRate = $2; var bufferSize = $3; var pIntermediaryBuffer = $4; var pDevice = $5; if (typeof(window.miniaudio) === 'undefined') { return -1; } var device = {}; var audioContextOptions = {}; if (deviceType == window.miniaudio.device_type.playback && sampleRate != 0) { audioContextOptions.sampleRate = sampleRate; } device.webaudio = new (window.AudioContext || window.webkitAudioContext)(audioContextOptions); device.webaudio.suspend(); device.state = window.miniaudio.device_state.stopped; var channelCountIn = 0; var channelCountOut = channels; if (deviceType != window.miniaudio.device_type.playback) { channelCountIn = channels; } device.scriptNode = device.webaudio.createScriptProcessor(bufferSize, channelCountIn, channelCountOut); device.scriptNode.onaudioprocess = function(e) { if (device.intermediaryBufferView == null || device.intermediaryBufferView.length == 0) { device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, pIntermediaryBuffer, bufferSize * channels); } if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { for (var iChannel = 0; iChannel < channels; iChannel += 1) { var inputBuffer = e.inputBuffer.getChannelData(iChannel); var intermediaryBuffer = device.intermediaryBufferView; for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) { intermediaryBuffer[iFrame*channels + iChannel] = inputBuffer[iFrame]; } } _ma_device_process_pcm_frames_capture__webaudio(pDevice, bufferSize, pIntermediaryBuffer); } if (deviceType == miniaudio.device_type.playback || deviceType == miniaudio.device_type.duplex) { _ma_device_process_pcm_frames_playback__webaudio(pDevice, bufferSize, pIntermediaryBuffer); for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { var outputBuffer = e.outputBuffer.getChannelData(iChannel); var intermediaryBuffer = device.intermediaryBufferView; for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) { outputBuffer[iFrame] = intermediaryBuffer[iFrame*channels + iChannel]; } } } else { for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { e.outputBuffer.getChannelData(iChannel).fill(0.0); } } }; if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { navigator.mediaDevices.getUserMedia({audio:true, video:false}) .then(function(stream) { device.streamNode = device.webaudio.createMediaStreamSource(stream); device.streamNode.connect(device.scriptNode); device.scriptNode.connect(device.webaudio.destination); }) .catch(function(error) { console.log("Failed to get user media: " + error); }); } if (deviceType == miniaudio.device_type.playback) { device.scriptNode.connect(device.webaudio.destination); } device.pDevice = pDevice; return miniaudio.track_device(device); }, + 139545: ($0) => { return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, + 139611: ($0) => { var device = miniaudio.get_device_by_index($0); if (device.scriptNode !== undefined) { device.scriptNode.onaudioprocess = function(e) {}; device.scriptNode.disconnect(); device.scriptNode = undefined; } if (device.streamNode !== undefined) { device.streamNode.disconnect(); device.streamNode = undefined; } device.webaudio.close(); device.webaudio = undefined; device.pDevice = undefined; }, + 140004: ($0) => { miniaudio.untrack_device_by_index($0); }, + 140047: ($0) => { var device = miniaudio.get_device_by_index($0); device.webaudio.resume(); device.state = miniaudio.device_state.started; }, + 140172: ($0) => { var device = miniaudio.get_device_by_index($0); device.webaudio.suspend(); device.state = miniaudio.device_state.stopped; }, + 140298: () => { if (!Module.wasmWorker) { var workerUri = "assets/packages/flutter_soloud/web/worker.dart.js"; console.log("EM_ASM creating web worker!"); Module.wasmWorker = new Worker(workerUri); } else { console.log("EM_ASM web worker already created!"); } }, + 140546: ($0, $1) => { if (Module.wasmWorker) { console.log("EM_ASM posting message " + UTF8ToString($0) + " with value " + $1); Module.wasmWorker.postMessage(JSON.stringify({ "message" : UTF8ToString($0), "value" : $1 })); } else { console.error('Worker not found.'); } } +}; + +// end include: preamble.js + + + /** @constructor */ + function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + Module['ExitStatus'] = ExitStatus; + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + Module['callRuntimeCallbacks'] = callRuntimeCallbacks; + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[ptr]; + case 'i8': return HEAP8[ptr]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': abort('to do getValue(i64) use WASM_BIGINT'); + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + Module['getValue'] = getValue; + + var noExitRuntime = Module['noExitRuntime'] || true; + Module['noExitRuntime'] = noExitRuntime; + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + Module['ptrToString'] = ptrToString; + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[ptr] = value; break; + case 'i8': HEAP8[ptr] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': abort('to do setValue(i64) use WASM_BIGINT'); + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + Module['setValue'] = setValue; + + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + Module['warnOnce'] = warnOnce; + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + Module['UTF8Decoder'] = UTF8Decoder; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + Module['UTF8ArrayToString'] = UTF8ArrayToString; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + }; + Module['UTF8ToString'] = UTF8ToString; + var ___assert_fail = (condition, filename, line, func) => { + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + }; + Module['___assert_fail'] = ___assert_fail; + + class ExceptionInfo { + // excPtr - Thrown object pointer to wrap. Metadata pointer is calculated from it. + constructor(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 24; + } + + set_type(type) { + HEAPU32[(((this.ptr)+(4))>>2)] = type; + } + + get_type() { + return HEAPU32[(((this.ptr)+(4))>>2)]; + } + + set_destructor(destructor) { + HEAPU32[(((this.ptr)+(8))>>2)] = destructor; + } + + get_destructor() { + return HEAPU32[(((this.ptr)+(8))>>2)]; + } + + set_caught(caught) { + caught = caught ? 1 : 0; + HEAP8[(this.ptr)+(12)] = caught; + } + + get_caught() { + return HEAP8[(this.ptr)+(12)] != 0; + } + + set_rethrown(rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(this.ptr)+(13)] = rethrown; + } + + get_rethrown() { + return HEAP8[(this.ptr)+(13)] != 0; + } + + // Initialize native structure fields. Should be called once after allocated. + init(type, destructor) { + this.set_adjusted_ptr(0); + this.set_type(type); + this.set_destructor(destructor); + } + + set_adjusted_ptr(adjustedPtr) { + HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; + } + + get_adjusted_ptr() { + return HEAPU32[(((this.ptr)+(16))>>2)]; + } + + // Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted + // when the pointer is casted to some of the exception object base classes (e.g. when virtual + // inheritance is used). When a pointer is thrown this method should return the thrown pointer + // itself. + get_exception_ptr() { + // Work around a fastcomp bug, this code is still included for some reason in a build without + // exceptions support. + var isPointer = ___cxa_is_pointer_type(this.get_type()); + if (isPointer) { + return HEAPU32[((this.excPtr)>>2)]; + } + var adjusted = this.get_adjusted_ptr(); + if (adjusted !== 0) return adjusted; + return this.excPtr; + } + } + Module['ExceptionInfo'] = ExceptionInfo; + + var exceptionLast = 0; + Module['exceptionLast'] = exceptionLast; + + var uncaughtExceptionCount = 0; + Module['uncaughtExceptionCount'] = uncaughtExceptionCount; + var ___cxa_throw = (ptr, type, destructor) => { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + }; + Module['___cxa_throw'] = ___cxa_throw; + + var PATH = { + isAbs:(path) => path.charAt(0) === '/', + splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + }, + normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + }, + dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }, + basename:(path) => { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + }, + join:(...paths) => PATH.normalize(paths.join('/')), + join2:(l, r) => PATH.normalize(l + '/' + r), + }; + Module['PATH'] = PATH; + + var initRandomFill = () => { + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + return (view) => crypto.getRandomValues(view); + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + // nodejs with LTS crypto support + return (view) => crypto_module['randomFillSync'](view); + } + // very old nodejs with the original crypto API + var randomBytes = crypto_module['randomBytes']; + return (view) => ( + view.set(randomBytes(view.byteLength)), + // Return the original view to match modern native implementations. + view + ); + } catch (e) { + // nodejs doesn't have crypto support + } + } + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + abort('no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };'); + }; + Module['initRandomFill'] = initRandomFill; + var randomFill = (view) => { + // Lazily init on the first invocation. + return (randomFill = initRandomFill())(view); + }; + Module['randomFill'] = randomFill; + + + + var PATH_FS = { + resolve:(...args) => { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + }, + relative:(from, to) => { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + Module['PATH_FS'] = PATH_FS; + + + + var FS_stdin_getChar_buffer = []; + Module['FS_stdin_getChar_buffer'] = FS_stdin_getChar_buffer; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + Module['lengthBytesUTF8'] = lengthBytesUTF8; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; + Module['stringToUTF8Array'] = stringToUTF8Array; + /** @type {function(string, boolean=, number=)} */ + function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + } + Module['intArrayFromString'] = intArrayFromString; + var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + // For some reason we must suppress a closure warning here, even though + // fd definitely exists on process.stdin, and is even the proper way to + // get the fd of stdin, + // https://github.com/nodejs/help/issues/2136#issuecomment-523649904 + // This started to happen after moving this logic out of library_tty.js, + // so it is related to the surrounding code in some unclear manner. + /** @suppress {missingProperties} */ + var fd = process.stdin.fd; + + try { + bytesRead = fs.readSync(fd, buf); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + FS_stdin_getChar_buffer = intArrayFromString(result, true); + } + return FS_stdin_getChar_buffer.shift(); + }; + Module['FS_stdin_getChar'] = FS_stdin_getChar; + var TTY = { + ttys:[], + init() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + }, + shutdown() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + }, + register(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops:{ + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops:{ + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ + 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00, + 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [24, 80]; + }, + }, + default_tty1_ops:{ + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + }; + Module['TTY'] = TTY; + + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); + return address; + }; + Module['zeroMemory'] = zeroMemory; + + var alignMemory = (size, alignment) => { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + }; + Module['alignMemory'] = alignMemory; + var mmapAlloc = (size) => { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + }; + Module['mmapAlloc'] = mmapAlloc; + var MEMFS = { + ops_table:null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + }, + node_ops:{ + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + old_node.parent = new_dir; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops:{ + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + // If the buffer is located in main memory (HEAP), and if + // memory can grow, we can't hold on to references of the + // memory buffer, as they may get invalidated. That means we + // need to do copy its contents. + if (buffer.buffer === HEAP8.buffer) { + canOwn = false; + } + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { ptr, allocated }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }, + }, + }; + Module['MEMFS'] = MEMFS; + + /** @param {boolean=} noRunDep */ + var asyncLoad = (url, onload, onerror, noRunDep) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync(url, (arrayBuffer) => { + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + }); + if (dep) addRunDependency(dep); + }; + Module['asyncLoad'] = asyncLoad; + + + var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + Module['FS_createDataFile'] = FS_createDataFile; + + var preloadPlugins = Module['preloadPlugins'] || []; + Module['preloadPlugins'] = preloadPlugins; + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + Module['FS_handledByPreloadPlugin'] = FS_handledByPreloadPlugin; + var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + onload?.(); + removeRunDependency(dep); + } + if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } + }; + Module['FS_createPreloadedFile'] = FS_createPreloadedFile; + + var FS_modeStringToFlags = (str) => { + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; + }; + Module['FS_modeStringToFlags'] = FS_modeStringToFlags; + + var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + Module['FS_getMode'] = FS_getMode; + + + + + var ERRNO_MESSAGES = { + 0:"Success", + 1:"Arg list too long", + 2:"Permission denied", + 3:"Address already in use", + 4:"Address not available", + 5:"Address family not supported by protocol family", + 6:"No more processes", + 7:"Socket already connected", + 8:"Bad file number", + 9:"Trying to read unreadable message", + 10:"Mount device busy", + 11:"Operation canceled", + 12:"No children", + 13:"Connection aborted", + 14:"Connection refused", + 15:"Connection reset by peer", + 16:"File locking deadlock error", + 17:"Destination address required", + 18:"Math arg out of domain of func", + 19:"Quota exceeded", + 20:"File exists", + 21:"Bad address", + 22:"File too large", + 23:"Host is unreachable", + 24:"Identifier removed", + 25:"Illegal byte sequence", + 26:"Connection already in progress", + 27:"Interrupted system call", + 28:"Invalid argument", + 29:"I/O error", + 30:"Socket is already connected", + 31:"Is a directory", + 32:"Too many symbolic links", + 33:"Too many open files", + 34:"Too many links", + 35:"Message too long", + 36:"Multihop attempted", + 37:"File or path name too long", + 38:"Network interface is not configured", + 39:"Connection reset by network", + 40:"Network is unreachable", + 41:"Too many open files in system", + 42:"No buffer space available", + 43:"No such device", + 44:"No such file or directory", + 45:"Exec format error", + 46:"No record locks available", + 47:"The link has been severed", + 48:"Not enough core", + 49:"No message of desired type", + 50:"Protocol not available", + 51:"No space left on device", + 52:"Function not implemented", + 53:"Socket is not connected", + 54:"Not a directory", + 55:"Directory not empty", + 56:"State not recoverable", + 57:"Socket operation on non-socket", + 59:"Not a typewriter", + 60:"No such device or address", + 61:"Value too large for defined data type", + 62:"Previous owner died", + 63:"Not super-user", + 64:"Broken pipe", + 65:"Protocol error", + 66:"Unknown protocol", + 67:"Protocol wrong type for socket", + 68:"Math result not representable", + 69:"Read only file system", + 70:"Illegal seek", + 71:"No such process", + 72:"Stale file handle", + 73:"Connection timed out", + 74:"Text file busy", + 75:"Cross-device link", + 100:"Device not a stream", + 101:"Bad font file fmt", + 102:"Invalid slot", + 103:"Invalid request code", + 104:"No anode", + 105:"Block device required", + 106:"Channel number out of range", + 107:"Level 3 halted", + 108:"Level 3 reset", + 109:"Link number out of range", + 110:"Protocol driver not attached", + 111:"No CSI structure available", + 112:"Level 2 halted", + 113:"Invalid exchange", + 114:"Invalid request descriptor", + 115:"Exchange full", + 116:"No data (for no delay io)", + 117:"Timer expired", + 118:"Out of streams resources", + 119:"Machine is not on the network", + 120:"Package not installed", + 121:"The object is remote", + 122:"Advertise error", + 123:"Srmount error", + 124:"Communication error on send", + 125:"Cross mount point (not really error)", + 126:"Given log. name not unique", + 127:"f.d. invalid for this operation", + 128:"Remote address changed", + 129:"Can access a needed shared lib", + 130:"Accessing a corrupted shared lib", + 131:".lib section in a.out corrupted", + 132:"Attempting to link in too many libs", + 133:"Attempting to exec a shared library", + 135:"Streams pipe error", + 136:"Too many users", + 137:"Socket type not supported", + 138:"Not supported", + 139:"Protocol family not supported", + 140:"Can't send after socket shutdown", + 141:"Too many references", + 142:"Host is down", + 148:"No medium (in tape drive)", + 156:"Level 2 not synchronized", + }; + Module['ERRNO_MESSAGES'] = ERRNO_MESSAGES; + + var ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + }; + Module['ERRNO_CODES'] = ERRNO_CODES; + var FS = { + root:null, + mounts:[], + devices:{ + }, + streams:[], + nextInode:1, + nameTable:null, + currentPath:"/", + initialized:false, + ignorePermissions:true, + ErrnoError:class extends Error { + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + super(ERRNO_MESSAGES[errno]); + // TODO(sbc): Use the inline member declaration syntax once we + // support it in acorn and closure. + this.name = 'ErrnoError'; + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + } + }, + genericErrors:{ + }, + filesystems:null, + syncFSRequests:0, + FSStream:class { + constructor() { + // TODO(https://github.com/emscripten-core/emscripten/issues/21414): + // Use inline field declarations. + this.shared = {}; + } + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode:class { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292/*292*/ | 73/*73*/; + this.writeMode = 146/*146*/; + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + }, + lookupPath(path, opts = {}) { + path = PATH_FS.resolve(path); + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + opts = Object.assign(defaults, opts) + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + MAX_OPEN_FDS:4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream:(fd) => FS.streams[fd], + createStream(stream, fd = -1) { + + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + chrdev_stream_ops:{ + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + }, + }, + major:(dev) => ((dev) >> 8), + minor:(dev) => ((dev) & 0xff), + makedev:(ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, + getDevice:(dev) => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push(...m.mounts); + } + + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + mount(type, opts, mountpoint) { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + }, + open(path, flags, mode) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + }, + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + assert(offset >= 0); + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + }, + cwd:() => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + }, + createDefaultDevices() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomLeft = randomFill(randomBuffer).byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + }, + createStandardStreams() { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); + }, + staticInit() { + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + }, + init(input, output, error) { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + }, + quit() { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText || '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + get chunkSize() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + }); + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr, allocated: true }; + }; + node.stream_ops = stream_ops; + return node; + }, + absolutePath() { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + }, + createFolder() { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + }, + createLink() { + abort('FS.createLink has been removed; use FS.symlink instead'); + }, + joinPath() { + abort('FS.joinPath has been removed; use PATH.join instead'); + }, + mmapAlloc() { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + }, + standardizePath() { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }, + }; + Module['FS'] = FS; + + var SYSCALLS = { + DEFAULT_POLLMASK:5, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(4))>>2)] = stat.mode; + HEAPU32[(((buf)+(8))>>2)] = stat.nlink; + HEAP32[(((buf)+(12))>>2)] = stat.uid; + HEAP32[(((buf)+(16))>>2)] = stat.gid; + HEAP32[(((buf)+(20))>>2)] = stat.rdev; + (tempI64 = [stat.size>>>0,(tempDouble = stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(24))>>2)] = tempI64[0],HEAP32[(((buf)+(28))>>2)] = tempI64[1]); + HEAP32[(((buf)+(32))>>2)] = 4096; + HEAP32[(((buf)+(36))>>2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [Math.floor(atime / 1000)>>>0,(tempDouble = Math.floor(atime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(48))>>2)] = (atime % 1000) * 1000; + (tempI64 = [Math.floor(mtime / 1000)>>>0,(tempDouble = Math.floor(mtime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(56))>>2)] = tempI64[0],HEAP32[(((buf)+(60))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(64))>>2)] = (mtime % 1000) * 1000; + (tempI64 = [Math.floor(ctime / 1000)>>>0,(tempDouble = Math.floor(ctime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(72))>>2)] = tempI64[0],HEAP32[(((buf)+(76))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(80))>>2)] = (ctime % 1000) * 1000; + (tempI64 = [stat.ino>>>0,(tempDouble = stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(88))>>2)] = tempI64[0],HEAP32[(((buf)+(92))>>2)] = tempI64[1]); + return 0; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + varargs:undefined, + get() { + assert(SYSCALLS.varargs != undefined); + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }, + getp() { return SYSCALLS.get() }, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + }; + Module['SYSCALLS'] = SYSCALLS; + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: { + var arg = SYSCALLS.getp(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 13: + case 14: + return 0; // Pretend that the locking is successful. + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + Module['___syscall_fcntl64'] = ___syscall_fcntl64; + + function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: { + if (!stream.tty) return -59; + return 0; + } + case 21505: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcgets) { + var termios = stream.tty.ops.ioctl_tcgets(stream); + var argp = SYSCALLS.getp(); + HEAP32[((argp)>>2)] = termios.c_iflag || 0; + HEAP32[(((argp)+(4))>>2)] = termios.c_oflag || 0; + HEAP32[(((argp)+(8))>>2)] = termios.c_cflag || 0; + HEAP32[(((argp)+(12))>>2)] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[(argp + i)+(17)] = termios.c_cc[i] || 0; + } + return 0; + } + return 0; + } + case 21510: + case 21511: + case 21512: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcsets) { + var argp = SYSCALLS.getp(); + var c_iflag = HEAP32[((argp)>>2)]; + var c_oflag = HEAP32[(((argp)+(4))>>2)]; + var c_cflag = HEAP32[(((argp)+(8))>>2)]; + var c_lflag = HEAP32[(((argp)+(12))>>2)]; + var c_cc = [] + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[(argp + i)+(17)]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc }); + } + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.getp(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.getp(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tiocgwinsz) { + var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); + var argp = SYSCALLS.getp(); + HEAP16[((argp)>>1)] = winsize[0]; + HEAP16[(((argp)+(2))>>1)] = winsize[1]; + } + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + case 21515: { + if (!stream.tty) return -59; + return 0; + } + default: return -28; // not supported + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + Module['___syscall_ioctl'] = ___syscall_ioctl; + + function ___syscall_openat(dirfd, path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? SYSCALLS.get() : 0; + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + Module['___syscall_openat'] = ___syscall_openat; + + var _abort = () => { + abort('native code called abort()'); + }; + Module['_abort'] = _abort; + + var readEmAsmArgsArray = []; + Module['readEmAsmArgsArray'] = readEmAsmArgsArray; + var readEmAsmArgs = (sigPtr, buf) => { + // Nobody should have mutated _readEmAsmArgsArray underneath us to be something else than an array. + assert(Array.isArray(readEmAsmArgsArray)); + // The input buffer is allocated on the stack, so it must be stack-aligned. + assert(buf % 16 == 0); + readEmAsmArgsArray.length = 0; + var ch; + // Most arguments are i32s, so shift the buffer pointer so it is a plain + // index into HEAP32. + while (ch = HEAPU8[sigPtr++]) { + var chr = String.fromCharCode(ch); + var validChars = ['d', 'f', 'i', 'p']; + assert(validChars.includes(chr), `Invalid character ${ch}("${chr}") in readEmAsmArgs! Use only [${validChars}], and do not specify "v" for void return argument.`); + // Floats are always passed as doubles, so all types except for 'i' + // are 8 bytes and require alignment. + var wide = (ch != 105); + wide &= (ch != 112); + buf += wide && (buf % 8) ? 4 : 0; + readEmAsmArgsArray.push( + // Special case for pointers under wasm64 or CAN_ADDRESS_2GB mode. + ch == 112 ? HEAPU32[((buf)>>2)] : + ch == 105 ? + HEAP32[((buf)>>2)] : + HEAPF64[((buf)>>3)] + ); + buf += wide ? 8 : 4; + } + return readEmAsmArgsArray; + }; + Module['readEmAsmArgs'] = readEmAsmArgs; + var runEmAsmFunction = (code, sigPtr, argbuf) => { + var args = readEmAsmArgs(sigPtr, argbuf); + assert(ASM_CONSTS.hasOwnProperty(code), `No EM_ASM constant found at address ${code}. The loaded WebAssembly file is likely out of sync with the generated JavaScript.`); + return ASM_CONSTS[code](...args); + }; + Module['runEmAsmFunction'] = runEmAsmFunction; + var _emscripten_asm_const_int = (code, sigPtr, argbuf) => { + return runEmAsmFunction(code, sigPtr, argbuf); + }; + Module['_emscripten_asm_const_int'] = _emscripten_asm_const_int; + + var _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + Module['_emscripten_memcpy_js'] = _emscripten_memcpy_js; + + var getHeapMax = () => + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + 2147483648; + Module['getHeapMax'] = getHeapMax; + + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size + updateMemoryViews(); + return 1 /*success*/; + } catch(e) { + err(`growMemory: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + }; + Module['growMemory'] = growMemory; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + // With multithreaded builds, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); + return false; + } + + var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + + var replacement = growMemory(newSize); + if (replacement) { + + return true; + } + } + err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`); + return false; + }; + Module['_emscripten_resize_heap'] = _emscripten_resize_heap; + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + Module['_fd_close'] = _fd_close; + + /** @param {number=} offset */ + var doReadv = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + if (typeof offset !== 'undefined') { + offset += curr; + } + } + return ret; + }; + Module['doReadv'] = doReadv; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + Module['_fd_read'] = _fd_read; + + + var convertI32PairToI53Checked = (lo, hi) => { + assert(lo == (lo >>> 0) || lo == (lo|0)); // lo should either be a i32 or a u32 + assert(hi === (hi|0)); // hi should be a i32 + return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; + }; + Module['convertI32PairToI53Checked'] = convertI32PairToI53Checked; + function _fd_seek(fd,offset_low, offset_high,whence,newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high);; + + + try { + + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble = stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + ; + } + Module['_fd_seek'] = _fd_seek; + + /** @param {number=} offset */ + var doWritev = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset !== 'undefined') { + offset += curr; + } + } + return ret; + }; + Module['doWritev'] = doWritev; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + Module['_fd_write'] = _fd_write; + + var _getentropy = (buffer, size) => { + randomFill(HEAPU8.subarray(buffer, buffer + size)); + return 0; + }; + Module['_getentropy'] = _getentropy; + + var getCFunc = (ident) => { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; + }; + Module['getCFunc'] = getCFunc; + + var writeArrayToMemory = (array, buffer) => { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); + }; + Module['writeArrayToMemory'] = writeArrayToMemory; + + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + Module['stringToUTF8'] = stringToUTF8; + var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + Module['stringToUTF8OnStack'] = stringToUTF8OnStack; + + + + + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ + var ccall = (ident, returnType, argTypes, args, opts) => { + // For fast lookup of conversion functions + var toC = { + 'string': (str) => { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + ret = stringToUTF8OnStack(str); + } + return ret; + }, + 'array': (arr) => { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') { + + return UTF8ToString(ret); + } + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; + }; + Module['ccall'] = ccall; + + + + /** + * @param {string=} returnType + * @param {Array=} argTypes + * @param {Object=} opts + */ + var cwrap = (ident, returnType, argTypes, opts) => { + return (...args) => ccall(ident, returnType, argTypes, args, opts); + }; + Module['cwrap'] = cwrap; + + FS.createPreloadedFile = FS_createPreloadedFile; + FS.staticInit();; +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var wasmImports = { + /** @export */ + __assert_fail: ___assert_fail, + /** @export */ + __cxa_throw: ___cxa_throw, + /** @export */ + __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ + __syscall_ioctl: ___syscall_ioctl, + /** @export */ + __syscall_openat: ___syscall_openat, + /** @export */ + abort: _abort, + /** @export */ + emscripten_asm_const_int: _emscripten_asm_const_int, + /** @export */ + emscripten_memcpy_js: _emscripten_memcpy_js, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_read: _fd_read, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + getentropy: _getentropy +}; +var wasmExports = createWasm(); +var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors'); +var __Z35ma_device__on_notification_unlockedP9ma_device = Module['__Z35ma_device__on_notification_unlockedP9ma_device'] = createExportWrapper('_Z35ma_device__on_notification_unlockedP9ma_device'); +var _ma_malloc_emscripten = Module['_ma_malloc_emscripten'] = createExportWrapper('ma_malloc_emscripten'); +var _ma_free_emscripten = Module['_ma_free_emscripten'] = createExportWrapper('ma_free_emscripten'); +var _ma_device_process_pcm_frames_capture__webaudio = Module['_ma_device_process_pcm_frames_capture__webaudio'] = createExportWrapper('ma_device_process_pcm_frames_capture__webaudio'); +var _ma_device_process_pcm_frames_playback__webaudio = Module['_ma_device_process_pcm_frames_playback__webaudio'] = createExportWrapper('ma_device_process_pcm_frames_playback__webaudio'); +var _malloc = Module['_malloc'] = createExportWrapper('malloc'); +var _free = Module['_free'] = createExportWrapper('free'); +var _fflush = createExportWrapper('fflush'); +var _createWorkerInWasm = Module['_createWorkerInWasm'] = createExportWrapper('createWorkerInWasm'); +var _sendToWorker = Module['_sendToWorker'] = createExportWrapper('sendToWorker'); +var _nativeFree = Module['_nativeFree'] = createExportWrapper('nativeFree'); +var _voiceEndedCallback = Module['_voiceEndedCallback'] = createExportWrapper('voiceEndedCallback'); +var _setDartEventCallback = Module['_setDartEventCallback'] = createExportWrapper('setDartEventCallback'); +var _initEngine = Module['_initEngine'] = createExportWrapper('initEngine'); +var _dispose = Module['_dispose'] = createExportWrapper('dispose'); +var _isInited = Module['_isInited'] = createExportWrapper('isInited'); +var _loadFile = Module['_loadFile'] = createExportWrapper('loadFile'); +var _loadMem = Module['_loadMem'] = createExportWrapper('loadMem'); +var _loadWaveform = Module['_loadWaveform'] = createExportWrapper('loadWaveform'); +var _setWaveformScale = Module['_setWaveformScale'] = createExportWrapper('setWaveformScale'); +var _setWaveformDetune = Module['_setWaveformDetune'] = createExportWrapper('setWaveformDetune'); +var _setWaveformFreq = Module['_setWaveformFreq'] = createExportWrapper('setWaveformFreq'); +var _setSuperWave = Module['_setSuperWave'] = createExportWrapper('setSuperWave'); +var _setWaveform = Module['_setWaveform'] = createExportWrapper('setWaveform'); +var _speechText = Module['_speechText'] = createExportWrapper('speechText'); +var _pauseSwitch = Module['_pauseSwitch'] = createExportWrapper('pauseSwitch'); +var _setPause = Module['_setPause'] = createExportWrapper('setPause'); +var _getPause = Module['_getPause'] = createExportWrapper('getPause'); +var _setRelativePlaySpeed = Module['_setRelativePlaySpeed'] = createExportWrapper('setRelativePlaySpeed'); +var _getRelativePlaySpeed = Module['_getRelativePlaySpeed'] = createExportWrapper('getRelativePlaySpeed'); +var _play = Module['_play'] = createExportWrapper('play'); +var _stop = Module['_stop'] = createExportWrapper('stop'); +var _disposeSound = Module['_disposeSound'] = createExportWrapper('disposeSound'); +var _disposeAllSound = Module['_disposeAllSound'] = createExportWrapper('disposeAllSound'); +var _getLooping = Module['_getLooping'] = createExportWrapper('getLooping'); +var _setLooping = Module['_setLooping'] = createExportWrapper('setLooping'); +var _getLoopPoint = Module['_getLoopPoint'] = createExportWrapper('getLoopPoint'); +var _setLoopPoint = Module['_setLoopPoint'] = createExportWrapper('setLoopPoint'); +var _setVisualizationEnabled = Module['_setVisualizationEnabled'] = createExportWrapper('setVisualizationEnabled'); +var _getVisualizationEnabled = Module['_getVisualizationEnabled'] = createExportWrapper('getVisualizationEnabled'); +var _getFft = Module['_getFft'] = createExportWrapper('getFft'); +var _getWave = Module['_getWave'] = createExportWrapper('getWave'); +var _setFftSmoothing = Module['_setFftSmoothing'] = createExportWrapper('setFftSmoothing'); +var _getAudioTexture = Module['_getAudioTexture'] = createExportWrapper('getAudioTexture'); +var _getAudioTexture2D = Module['_getAudioTexture2D'] = createExportWrapper('getAudioTexture2D'); +var _getTextureValue = Module['_getTextureValue'] = createExportWrapper('getTextureValue'); +var _getLength = Module['_getLength'] = createExportWrapper('getLength'); +var _seek = Module['_seek'] = createExportWrapper('seek'); +var _getPosition = Module['_getPosition'] = createExportWrapper('getPosition'); +var _getGlobalVolume = Module['_getGlobalVolume'] = createExportWrapper('getGlobalVolume'); +var _setGlobalVolume = Module['_setGlobalVolume'] = createExportWrapper('setGlobalVolume'); +var _getVolume = Module['_getVolume'] = createExportWrapper('getVolume'); +var _setVolume = Module['_setVolume'] = createExportWrapper('setVolume'); +var _getPan = Module['_getPan'] = createExportWrapper('getPan'); +var _setPan = Module['_setPan'] = createExportWrapper('setPan'); +var _setPanAbsolute = Module['_setPanAbsolute'] = createExportWrapper('setPanAbsolute'); +var _getIsValidVoiceHandle = Module['_getIsValidVoiceHandle'] = createExportWrapper('getIsValidVoiceHandle'); +var _getActiveVoiceCount = Module['_getActiveVoiceCount'] = createExportWrapper('getActiveVoiceCount'); +var _countAudioSource = Module['_countAudioSource'] = createExportWrapper('countAudioSource'); +var _getVoiceCount = Module['_getVoiceCount'] = createExportWrapper('getVoiceCount'); +var _getProtectVoice = Module['_getProtectVoice'] = createExportWrapper('getProtectVoice'); +var _setProtectVoice = Module['_setProtectVoice'] = createExportWrapper('setProtectVoice'); +var _getMaxActiveVoiceCount = Module['_getMaxActiveVoiceCount'] = createExportWrapper('getMaxActiveVoiceCount'); +var _setMaxActiveVoiceCount = Module['_setMaxActiveVoiceCount'] = createExportWrapper('setMaxActiveVoiceCount'); +var _fadeGlobalVolume = Module['_fadeGlobalVolume'] = createExportWrapper('fadeGlobalVolume'); +var _fadeVolume = Module['_fadeVolume'] = createExportWrapper('fadeVolume'); +var _fadePan = Module['_fadePan'] = createExportWrapper('fadePan'); +var _fadeRelativePlaySpeed = Module['_fadeRelativePlaySpeed'] = createExportWrapper('fadeRelativePlaySpeed'); +var _schedulePause = Module['_schedulePause'] = createExportWrapper('schedulePause'); +var _scheduleStop = Module['_scheduleStop'] = createExportWrapper('scheduleStop'); +var _oscillateVolume = Module['_oscillateVolume'] = createExportWrapper('oscillateVolume'); +var _oscillatePan = Module['_oscillatePan'] = createExportWrapper('oscillatePan'); +var _oscillateRelativePlaySpeed = Module['_oscillateRelativePlaySpeed'] = createExportWrapper('oscillateRelativePlaySpeed'); +var _oscillateGlobalVolume = Module['_oscillateGlobalVolume'] = createExportWrapper('oscillateGlobalVolume'); +var _isFilterActive = Module['_isFilterActive'] = createExportWrapper('isFilterActive'); +var _getFilterParamNames = Module['_getFilterParamNames'] = createExportWrapper('getFilterParamNames'); +var _addGlobalFilter = Module['_addGlobalFilter'] = createExportWrapper('addGlobalFilter'); +var _removeGlobalFilter = Module['_removeGlobalFilter'] = createExportWrapper('removeGlobalFilter'); +var _setFxParams = Module['_setFxParams'] = createExportWrapper('setFxParams'); +var _getFxParams = Module['_getFxParams'] = createExportWrapper('getFxParams'); +var _play3d = Module['_play3d'] = createExportWrapper('play3d'); +var _set3dSoundSpeed = Module['_set3dSoundSpeed'] = createExportWrapper('set3dSoundSpeed'); +var _get3dSoundSpeed = Module['_get3dSoundSpeed'] = createExportWrapper('get3dSoundSpeed'); +var _set3dListenerParameters = Module['_set3dListenerParameters'] = createExportWrapper('set3dListenerParameters'); +var _set3dListenerPosition = Module['_set3dListenerPosition'] = createExportWrapper('set3dListenerPosition'); +var _set3dListenerAt = Module['_set3dListenerAt'] = createExportWrapper('set3dListenerAt'); +var _set3dListenerUp = Module['_set3dListenerUp'] = createExportWrapper('set3dListenerUp'); +var _set3dListenerVelocity = Module['_set3dListenerVelocity'] = createExportWrapper('set3dListenerVelocity'); +var _set3dSourceParameters = Module['_set3dSourceParameters'] = createExportWrapper('set3dSourceParameters'); +var _set3dSourcePosition = Module['_set3dSourcePosition'] = createExportWrapper('set3dSourcePosition'); +var _set3dSourceVelocity = Module['_set3dSourceVelocity'] = createExportWrapper('set3dSourceVelocity'); +var _set3dSourceMinMaxDistance = Module['_set3dSourceMinMaxDistance'] = createExportWrapper('set3dSourceMinMaxDistance'); +var _set3dSourceAttenuation = Module['_set3dSourceAttenuation'] = createExportWrapper('set3dSourceAttenuation'); +var _set3dSourceDopplerFactor = Module['_set3dSourceDopplerFactor'] = createExportWrapper('set3dSourceDopplerFactor'); +var _listCaptureDevices = Module['_listCaptureDevices'] = createExportWrapper('listCaptureDevices'); +var _freeListCaptureDevices = Module['_freeListCaptureDevices'] = createExportWrapper('freeListCaptureDevices'); +var _initCapture = Module['_initCapture'] = createExportWrapper('initCapture'); +var _disposeCapture = Module['_disposeCapture'] = createExportWrapper('disposeCapture'); +var _isCaptureInited = Module['_isCaptureInited'] = createExportWrapper('isCaptureInited'); +var _isCaptureStarted = Module['_isCaptureStarted'] = createExportWrapper('isCaptureStarted'); +var _startCapture = Module['_startCapture'] = createExportWrapper('startCapture'); +var _stopCapture = Module['_stopCapture'] = createExportWrapper('stopCapture'); +var _getCaptureFft = Module['_getCaptureFft'] = createExportWrapper('getCaptureFft'); +var _getCaptureWave = Module['_getCaptureWave'] = createExportWrapper('getCaptureWave'); +var _getCaptureTexture = Module['_getCaptureTexture'] = createExportWrapper('getCaptureTexture'); +var _getCaptureAudioTexture2D = Module['_getCaptureAudioTexture2D'] = createExportWrapper('getCaptureAudioTexture2D'); +var _getCaptureTextureValue = Module['_getCaptureTextureValue'] = createExportWrapper('getCaptureTextureValue'); +var _setCaptureFftSmoothing = Module['_setCaptureFftSmoothing'] = createExportWrapper('setCaptureFftSmoothing'); +var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports['emscripten_stack_init'])(); +var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'])(); +var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'])(); +var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'])(); +var stackSave = createExportWrapper('stackSave'); +var stackRestore = createExportWrapper('stackRestore'); +var stackAlloc = createExportWrapper('stackAlloc'); +var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'])(); +var ___cxa_is_pointer_type = createExportWrapper('__cxa_is_pointer_type'); +var dynCall_iiiji = Module['dynCall_iiiji'] = createExportWrapper('dynCall_iiiji'); +var dynCall_jii = Module['dynCall_jii'] = createExportWrapper('dynCall_jii'); +var dynCall_jiji = Module['dynCall_jiji'] = createExportWrapper('dynCall_jiji'); + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +Module['ccall'] = ccall; +Module['cwrap'] = cwrap; + + +var calledRun; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty?.output?.length) { + has = true; + } + }); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +run(); + +// end include: postamble.js + diff --git a/web/libflutter_soloud_plugin.wasm b/web/libflutter_soloud_plugin.wasm new file mode 100755 index 0000000000000000000000000000000000000000..2cba285f3e65d8786f85fdec620fcf2194537ff9 GIT binary patch literal 5428520 zcmeF431C#!)%f2snM@`LGeAhfel7$Fs|Xkaq7p%ZJ9XayAu2-z62`3+L9NidU+iI=d?Owau+Qsg+wR^wr%l~)IeKW~~uvNe1|9uT1@4dS(=bm%!Ip>}m ztlW5h7z9E1@yre3ig0tdc}28Y|Hhl`5pE7NAh7RXMT$_3wP&!RNUPd{af)(MWaFb@g%$KPln+ZvhQ%p4(H(lzhB%8M9GX9e4Qu1xuM2=|l zrGceOYNt32rfAY#N;+!dmDX8uvQqgbtyl}!;1CJMyGCkgT8GLHmdzQB(@|CUui|0wylC+`Q-_(CiGY0+QCH;LE!X;^q}~zDwmK0iCO};Yj{yll-f1E-9^0Un;Nl zIym-2lag`wL!=Q}lQxyHwI*oebkuBVF~2M@!Z#@_&oyjbuUS_NB8{$HzI@fiE0-6~ z>s^0QP^BRa{W6^2b^fXimn<)A^ilcc%Qs%Kan;K1?&a$@bgf%i4APooXkYL-tJW2} z+vfVRbA91!)~_md2T|iiD>trLzH!~k4I9r}UtGSSx9h?+T^H?_IcN3qi+a}-yMpvi zQdE&+A&b!ADlDJbQg_F{sys*>k%X znPTty4VMJrE-K&H)wMRr#CJE{)Knj&D5olDd@1Nhlc*AgxTzrti9)ERfSc<#_U@) ztSS}GN>vRTmP!ShD30TX+8{Wi?##Nny0fT|pV}x$g{iu#APRz1l&T7&+N!!>KBx+Z~ajH>jz zJ_!h-keW0-zttqEuC68Ou)~(qC4N%*ynoU6bXAHEnjKK4{taS!;9uh)Lub;IZK3qr zo}+?z*ou|ei6dHSC?Om{(=>*R^qbE(INJxsK|Y+Q!9GD8uIiUIrk)X16P7Hg(i}lt zkuqqhigWfS7v$_GuJ$Qbmx>NYbdhgA{#)tPTdIb#tVj!wgEUi>VmwHxz2_%Nrx#E? zpV~8^A`Vkk>2#V&N;8-tV^SS6M~y+$0QkglTE{yeo23sj=~P{m39I9Cf?#xz2?(a_ z1|7D@hB731COn9#I`^RSrs~f${aI5OI>^tYwK`7+r-JVD^@W*^Qem);nT^uCP*P@n zHewp1hN@J?|3uC;HU?oj$}}FxOb5|eTD_0`gp`nq$Yei6>QB@_!vG6FBA8qg#&LBf zu8FFvQvhPRsv$jN#`Ni7dXoN3Z_puCNQkqk;c<$RtD@QsJ-yZW>Xw!u$Z3;;I9G{9YyhwAx%M3QxrEghD{XU z(qzv}W@s~^3p0(4ZZ-i?*c3*chZJYdOplJDVCEr*(BdJQb;uBY`C%3KANv|oU6p(X z!&xfn(eT zVL)|^sg7M3j*r6eVLW;??bbQYWQa-gcXBjm&Ya1*C_@8{*akZcGeL6@6RHsm)o73o zL*pZZW>y{RlTk{C4U_#)+Y)0yb%$sGB1m7%dSX4$h}`f?;uyr( zJSt`-FO7q2^Z4e&$MR>?%L6h7shao|`|Y>i`0*Vb9hZ_<%Tc5>E4yjwWt;csXG=J8 z(E5R8R}3umY=i?fa?cH8My8gjh5RJN!>mNThA!8PXB$3<>m~ zu42$618Z1Op$&Y>R9voO6Na@U(DAMdhgnO9Dd6(1f5EoHvR42K`&MZ&bf4limn}BS zNC|xKHx8%JFl|gQB?@PSQ-cdOga)XCHh5=NXbM4 zVmuUVvN`C-2X6!+IN1y{6UKDls>I#Ny9YW*G~;LTvoXj>|0)ufDd|DW4{^^ zf)tak4w^jaLzT{D745XC+c)-<` zzkeh3T?2O*K?T#~zuvCOm4~(MP{31nWny4#zb&k30C7!;fvr4;P3r)z+5`(&?7oU>-tN=tUZy6*L>)^@F4 zHm{s0xG&Yf$NAK-e%1269ZT?FY8c_?^mcXi4}B;#vz(Q!)B06i8#gZBuZHgvDN7N?Q=Tb42=_ zbGk3scwVr*Vc04*Va2YK*Y~dN>OFkj$qZ2N_nNwmUF%k#u-=CT|ES5bGhB0F*AmVB z&zfNuu4h0FTerGv^&)zz^#xn94I8_Pi&yp*54(`vS2_HuYYv9fr8d18H^)e@ix{^Ao%^o7z}hzae;Awk{cs%Sk!Hj(!48&Wz$40Ij0!BBU{azjn>09padR&{`&RB^Rz9GWOKxJC{*g00j9w_ zvqJ|2&0ZXAw{%I8lU8-KJf>v8_QO%3m(g+ZT8j$k7tMYw~n(n zk_zF(2eTun^zeaL0* z_(V3VVM(_?nXT3@?e|mJ5&F6#7=9{Szj4)hU8^tXCY{3crvaQK;CO}0&t!A!H?CUK z4P2MX{cN_b9HfPRE<39Hy<-iZ&yFa^Ry6ht*&%B-vdoKJy}sMQ7j2+@(6W`Fy<-&f z1y5&lD_5`fd3|K?jqI>qF!_Z^_mj|X+B#lxvE|(uJZn%?{`^)ptt)QM>fqZp19Mi} zvhvIHJ2p=hLEp6{GiUWtYc?W7>gu&p5hp<^p39D4R{BMiAoY7m$)!9U#o+q`f==8J z{9r)#le(Y~Yl@cyKTIM#H1(_SN7><4VG>cQ?#C6uBU!>-Q7zZ~u)mXss zO1-u<=@6}2dt4VI1LnP@DQn-*jrFU7*ENk9v;nIw=;%?*P>^lZ$!^U-;2H*eJlEQ^quJ0 z=qJ%z;$KIHwe~K=T{}BB#`g8QR={y_X#{NecV_>=LM<8Q@J$6t!S z5`R5@CjLhJ&G^~)JMp*U@5eumzZ*Xn{~&%o{%QQP_~-Ep@h{?^#J`Mx75_2*Q~aCw zxAE`d-^c$E{~`W!{FnIe@l~n6#(#_d5pPLdp1LA+W$KlwYf@LIUX%Kd)b*)Pq&}DW zV(RJCmr`F&eI@nP)Ynqarhb&VGkr(;P3cF|?@Qm4zBhee`u_9-=?BvfrQeZ$IQ>Za ziS)DSAEuv4e>?r1^!L)wrGJ$Ear%+!hcfT1zN7li>W4FrWWHYg#pjCHuF=tD5ewf3W_c`X@&`T>sdR4-R=^$cKh} zYshzoe0RumL$1wTpL=cYhTL~@&*iSpKb!wj{`>hKiJT~I-5#MY4VdM83f6(~T#=kWFvGIk*A2t5D@ehr^X#8>G zpBjJH`0K_kO_w)a+4Rb$zc>D)@zqVQX}Yc{`{kdUeN)qrAb(?1{?6L`Rr&mu5w%-W z`>C2X`G?X*)tG;Mdyd^fj83-}(%>&UifI`BGEHVM7(U@l%Gy_E z%Dx3Ri#lgfXI)Sm)M{*<+fVk()!rI44w%=0Fwr;bzzee*F}txu60c=GQ#!jk1EEfG zN{eM?b*|HrZjD-8wNyzp^XvmNl9?I_^H?P{Ot%lrN_J}0%4AkaEwk!faKG=>?i zl6ofJ2M&=TQ=?|4wMue8fDg<|zBO9L+*Zj@=EesOlVPpVDQ-A{!DIsT&D+kCKrxs)sc=T9--#D=;Nv3amj}SL0YI<7J$TFS6*yiWHpl z^K6T)yiUq%uHYt7;iS?!@o8=GwMTOo1&gP5vIbK!+2BRLfL3X3j~4orQ}~+F9xbIK zQ)TL-ZW`ay=EckSW_3Qw>P*RudGRTH&*XJx8#J5ueR1~mA~{qR72IN~TU;6; z5+26)VHMRcq54i)BArX!Qt}-xOXct$cZ3|F)qf>&M^gQf1$UG$`e>>@Mvj(aitboB zN{%f!9j}+k%eK4YWSJaSo~7d{>jXJoPAIq&sq@5sZ8(V%Pil+q(BU|l_mkVAyY&4O z-cM^ISL~=E>}A~_5-=Ya2RC?YPVF) zuNdhvb}M7j7lS`{I&U;5rnSbgtc9jkc|up^30;*$^h~O>Qy@(x;nk8>q-lW}W(Go+ z0d1z0&@GVk)Mx<{lUB}Up=QV^0&R`*Oi^0ubio_@@+hb?Ekiuc0DV3R;!H~(oZ&Np zKc~ejn60!7)8+3&ZPrrETIgr3$2C$*<6+DdM7Yj15n(v9muX8Y3sVQR)kchxQQG*? zfQ?OCj~h$QvE`iOh%f}&%Z#O!YboV);xy+325F*9kcmC6g`6$roRf&yM<&TWy`apr zOzz9sDy^DxiZV7+Wr|Gganr~;t(|lEGNTtfnN~bms&!x4SM$#5*b;&tXUTp& zZZ>&mm-Eiin7J}X=JtXZ(~1~NdE2B-^B&N#C35X@fVB6xdE}i}&O2XY4wU(FU@y2a zEekYnu6A;&1b~CXXh&KZp-D{&bGQ(Y{rGFe)W06fE;Kqr}|lZk${!lBOanSoO+V_!covt*Wj?Z?2( zQ2tx?8=4MA`6RRTQKw{FX0HWQ(=wOldcNEyXMb|-@419FV%r!+t7|%-I}6B7OM3yD zK9Bi6AXodPxOFFxQVBQxze-%A=Suw+P~#K+bWkuKxP^P`PI$(>rb^TMxW%0jB_Ogv zhATWJ?8pcvr%^^oV*wb7rKv<_NNC$NzCE{QJ2t=hOLlBZ+L9gHQIul*Vq28=gg@E3 zHT#{X?cUgY_&D3Zv1uVc8y7`|$>!DZ<=D6oF@aZrPZ^kryiRP3PT-ZzkF>N!r}%Ov z@iocsKlhP+9tG@RDCfm1Jc$H3=4w~f>^P-6ObXL)%zT~CnCjTcj7Ta!5?pM&f-&-B z1Y2#Y+p!KGvfG+;H+2*nhQMzaI$bpb2}+SnkE;O%)F^_mG;HmtzN41<*>p;6K`~29 zuzRY1f0*A{^Ge|~b8jeghE^(Frj^IK8X9bDQje=Oq*6;|A^#wrF z$Yc&iDG!H~FM{)i$j|~fZRb1^)=Odjt@PL9iPD!(<8ed(u)*I+M^~!AQnr&^ z3%RKV+NzalYUKer0s%{`TYom0x~~uNMvYX$)2x)CnYjs=o9uQVrbcQ{XEs7+qfY93 z+z^|qAowKHC`Ux_@(Ip3BsFsOIO%31%E6oVfnQk9Sn=Jdtm1yX?7xj|;{h^fD^zB-wBG`isg`*Ruo3O)Zay=6AVIcwT)@oE&(%H{4(kJd zgQ*>1!^1_TSa2ZvlGIc<3b+}4AP=0%LIg(iVT*Pf+zQf(Z3-Jwvz4JFE(1QXhXKeo zmg^9y-D+}&aV`(m84A|%tCjllx!Q*-TI*LqX)SnIx7Gv2yBBj+B`sA-51{K;MhHyN zQWJrhU@PU}cpEKEOJ*COOk1}qV$tU3d`e_k`ZW|3GjyBbmLXepFP5wQWHhc~2@hO~ z`rW?+0|uXtq&h^0HDMAJvnWd#>Ux7gRM3GzRCr{MGKP-uX!b*X*5G*3Cj^nZdWAx-B7+SJ#-7*1%$Ha*egp z$U01`?A1zZ*1e0i4L-`RL(55LG;pkpk+C@P>Nvk76z6v%rmfKu47n7%h>!R#2^BM zrYpoCXJq;fq0wmurVr&Y{n;&w$HMsV|gY=FyAUJsQ?iPx*n)jqV( z{fU$%sl)^O;D1X@!r-w!^rcF(^E!5{Vdo(Oa9)`R4PH9u?RN5S=P{aN=dnAF8N8+) zd(xNA_eC-K;Q#wl?)t6NrXA}VSaOMa^p#hcqBOew+q3hqzEb>~wnI}77Ty=OV|-s+ z-&?6qeIbLtm0CA=sioM#^X@FPR95L}=~$w1$FHM)QbN|KNeW+xc*6BQuTR+CAM$KP zQ}5Dnw~0>dZ=uO32>+XIpO6YXr>ZeTGD}?+QdtY5Q`@6ECKcX(YktL^ge2X@=@l<+z0p-RC?nEj*Nsg0~x>01DC?^-3YKu;lQ@5kEI7LoV zZHUi#y5>BCoM#l=nQ|s-iaOL3r_1tgw?fX66$Q7FoM+3~+ubTzDXSRVBp+U>4e3ew#-MCa3sb#lI}E4cOKUtjLDQn`1} zcN+-Y&>lU5v~6nizWJ_)@1FMPTlW3)`-1l9EB1Zwe0L$=7q&;gw(ke$yNmd~s6G0Sb`K zOycH_*N1Kkb0%BDg1bBvem57~6=BC`LwBWyUrG2YL*bY3t3tUdQ~~MLppfTq~4~fw^4tyR)33r-9nDn zgW84AC*^Y%s? zk~e9@oA|sd6n-`0&7r*6+H`j)Zw%$`Qkxi)w`l6O(56?}n7ma#-%6IZh4MB(CiiI2 zJp{cyl(*ZM+#7bZy8ATvK7#KLh2ML5d%zm@phi5%=R=|Js}b)ABb|P`Vs1H)iHUee!Y_%+igtVrJwKO^W9qGd-Ur)e7!f6?V-Fol=p`DDJn95RAU~c z)C#ozK0;f;{_g#u@c#aAsrx|4B6=*84}|hq*yA1#c!0_u){U4CTXN(S0NoqCP^>kB0J5>(|G^j^_jS@lZY%%E!ZQ_lZy_<`X3O zq&Dr7H0_n)qCm}Up3;D);2{;HTM2fb3guIjGTnVTq%WTd<Gq) zp@#%KB*-)M(Cgngj zRq`!jKqeOR?NGi=OvZgjW4=QSXu@K?8_IWysdLY1%yY!7PGY_n%J+!LyYFkv_lY?# ziTOb&KOm;T{ZM0mNKAJU^P^CHME6#>AFHI}C!zc}l%FtY&+DK)AA(4p3EWRL*H4+0 zpM~$!iE1 za+G$+|085b%t6VR z60{?)FE#SENN%%^yrC3wdnC78NA4(v+!@K8){!?xLPk;&^~NYa!M%wjwi@n=gx@#O z-Zv8@Z}#mi)pmEOq_;%!7OU;8rI5Ep@;0mOo>Iu$BYC^kc5ftPBqdSzM)`^EK9X2% z_ea9-ebn{4@L5j)%K23$itC5Y_&a73VCNF@3h*sM?ywY616?b zx43ta#AcXM+TKHuyr(o5wMt>$8+AMdR@I0{nSl32!tZ-|dw--b`T>pj0H2RV z!mma=9?9bd1Rsp#{gHeSwp*!gyum%8iJyoLh?geQ{GmubMB`fBlaX>N&&+opj;Qk^ z`sbsX_@k8fu}Jv+2yY*^wtPY(KEdZFBjHygFavqYs{B+WACKfyNtMx3_i0W1X{yXn zeNI0=$LHty1c&P97x?^QB%h7s^O5jE!#*74$GfMAG+gziNcer4 zF>3Ev;J&PRzD%C4M1n=lS0kldU(>*^5%~2;z8<+}Y@m>PRmnF9{AMKIjNG%4d^M71 zB6&8-PortyvP9q3MBgUScOv2UTfBWYqMGM4{5ih97YV-_{{2Y4Z(aUDB;SqX2c<4A za6i<fs# z_;W=fFGTY5NL~Pm{34QHfIvV&tx>!CWuz?Zue6F^QN^z#VHftB2tM|=k^C}}-$vc; zcai)ilHU=HkrfU44^90aeEuPlKSb`2k^DZAKZ4@jpCV5d{~XDmBKdQ))%`_7f`#s{ zk^Ci+zecyXziIBj(dN0n1%I~|{6jE? zGL|dj{B-xqm`+_4%PV8KD(-Pt$54i=WALJHz%|%&$TbLK=h}(`UA>BssnF0@$HMEY z<8AIWX7d52yf*H5GH}<$a&0WvQOETb(e7RwgQ{+b<+ZWg5EtEzu@G}332uso-`7yQ zQSWxQRa}lzK9U-sX3se zRYIM*t3tzv=#KuQKiIA^0Lh&0231ay20_4fWB@5Oh*d*CWbWHlfuQnsHKRm{upLo* zN`^ASO46)!%$=2ALYbhdu*BFI)v?x$p`~(62nb|^s=!jZ?Z@Ov^<4lEB=rSN1=#Wg*w#-s%(}1SVA>*6^@)t5TtEN!) z_Zi!GH8D&x%EGF|Bt=6I!)O@?$^mkqmN5%ksw!DfKo)b50?g}DC8cyFxa>;8TA6YO zP#7Sa-65V;`M(%cJY1OFlb@Q2%-O_(Yhm6eG4zuPK*~NEGFc|;)U-;Aw0gLhLeeP; zFa{UX5XnvRWlZPQ1B^aq%1q5@z~bRz78z$Lz!+T2mi=V5&p3xy1sGswe=6UQIt__oo%5_npT5>%FD%DSB&-$IMi}>JTQ^srH$X@Otuk z)stH{^FAf0O*=gdW$mzSMlf<)AsARoBx6>mXimqhEKw$VUXh#zg5mD_P_iAdA+_AoWE zj3EL(VMdUvFl3SOx!TW06LuJ!63F%eb$@Wz(9(dFQ|>7ctFed8S=n;hzRD&POslR{ z%-PL^;yPBUK{7Vdf~`cJN#&52Ep4@Bd0L(yc z^Q_KR02uqy1Q69!&@uzZ3Ug!q7YY(B1Ko%Q3dRN=j;{lXQSok5nk^HyLbd~GF;F`{ z+ix)Y56+J8Q?lptd>fWu*MZdRcw7P}@QT-g*--InD-9+%o^u@w-VVlrn7&j0j<8(c z4p94lDn>zauzwy{2aDN*FkAO`iNmBMIphfM8SCP|L)04c4#Db1jhSHc+oIPCHjtb6 z#?D64CDUX(5P^Y{3Y&~EU0T8T3l@nc$Wv{9o${uZVF;TjGsZ3g^7WFp6IDu9hf%)S z)^t`NgvcKQP>Gwx;H+BH7?dUoYAyj_Y|g!%Ck?qwKt55iC8! z^A`z2I@@ffRY-0}p9(M+mZeRF-gefh8`fg~5+6E;Lzf^n%`_jBXGZ;Y;K_{oZGX$8 zTt+VrqB$iEVba)zH0lspnCIY^&07aaIx6Pv&?KcDiCXFwQ^jGjSPtuPOJqqR% z&H}1KYsKMIbp+)cQ9x^Wq&te99xaE<(M1%5N69e-&ORNh!@o@X^D@poy{wz#PfO*v z0@}e?j)$)3c%49@{``}6?Ia34nOM~l$|>$t3O!9ulGBPDYC2U;FQ6VgLkm5Vh_mEO zIje|<@WkXGlSZs0^GZFmLK{==Y+z`WoGq(5-D-N&g-Woi$DIQVol^#YbE)z?a-CN| zSGWd6VT7XaTv=Q6s=|UhU(VN(*U`{*`5xc-^<>&WrVRx&f<3O6OdDmrY%HSi>y=^w zJ>LbI=|VDHn7@E#Ttw=N03Q<((YU}}%!cO@xmYe)>RwLcULh}+SM<0`?Ro=)c+O`WKs4vpNcVK16G z!qLqsA8ZNH+TCUe-(V+)Z&$4y3b-D3hpHj&D3w@;&W>4mBOOH@S8#6%(bu`Vw7+jQ zW!{_V@7*0 z8%?WC*5ZBI&HF=icIfL=Sx4;;XaXB0;!xbBP~6QAp1K{}$O64fREHPKLnJp9o^BOx zYxrp;ee+m;XSjY3Fgi4%OqGp|Ddq8@rLX?a{^|Qtl|uWM*FV?ZzrVO%^{;PWN!r%_ z@wp{n&tRZrmol$^i=3G6Z+i1?1;feHCi9>~%b z^T30^LLRsdSil4Bs9kE{6YFKj{NMl{$aZE)y`Brt>Ei??p}HK0>esA5gEYyo{J~JrdTG{^=DGYP%{d*;F()JQ$3sx-)hR%$hPEQ)gH|Q_R9;RxdmFnR?0?`+DukY#othNPT!51*zq+ z6jIA$G5dHP3n8{V7C>xsnB8#B4x-CRV`*Z*z zoJdSbj?u_5N`~c_n=#d?mu1=(BC#uZnMMi(`8avm%@E{zIi9A~BI8h)G=h90a@~{o zI7uz4N!KTdjAlb!ROKg5X%_^I5X| zOt(T-9OhOUsH~*@XWr{Dr#h*bUt-%0&f;^^<|8)&*>Ctjt$1YnRF^zWGN8b~(e7^-~@;gD#n=hd1K zLJie^4H>UB;(aX%pv?SkR*G#2uUA@xB@IOTwM0Xl>mkpKgQwWm3aE1q5^XFA#JV0@ z%~B~1RGpITOqpyig=|wKE1)BAQHtPxEK9n?TPpo9*W7frwhl{dbpSVEHWInEDGG}5Y zLw!$$Sju1<(}PKjEx%7G$E0KMX|3$jRQ8#qGHhd_vTaNe+ZZ9{^Cb9!H;M_|7ei6Y zmpb=!2nxg?=4rKw>Gc*dn7+^#Eg8F*9F{Q!_tm82uW89&S0flqVTx)8L(DTI_=cLl z=;(ek#P~%^e%81=Y+jxXF?#87-=@`=yBLa9BJ>?C`#TB0rj>nH1HMaH&n1<8Pb>Sr z+Ph%qQglBEF@(XyrJx2bKeWnzZ9lVW zTHMbymXDu@c@U1$niq(f5gdTg3z>hZmM@sM^r+oS4r3ThU-E|ArmF!=Jti;^NF$GD zU<=dnTz~}(!D`ro5zOyGc!l4Dx!T*SPu)wNrp$lrGG8U9^wNBlYo5r-A@n3B7hH=R zCrf9t%J@v@LBCsh!1%QAfbkI?Fg{~=!1y%tfbnVI0ppXGtPZUgB_i=*0m6l24M?^%)c|al@G%GbrwHBY>?Dx*SwznDwV`o8X7C z$`94m8eXJOJp+Mr2z8P)3iPM-)FEXUtwCct{y82Q1BZ2bkTHbF(D2T()@h&Mfata+ za@gKX5Uh+l-9*xum2r=oMC~|43Y0h6hgPHLn(WiJDg`o+NZqdF5lN=CMyug|ta1dw zTCNF#m%#m~pB1>D9=MAS2U`)k2waNG^wGgl5M!1r)APKgM4 z#Ld$@^T{*6fRMrREYLg$$pSg38wTeS@-(<(G|#c*QI{${ z&&xCqJd7OI4HvU4F*=rG3~*GIf1>6&i99D2;9snsQ#8-1a*CYV4exTYoK{emDRLq( zhlRRM?HRzsnR14lSwPB=m9u~azn_~0JCiN@P1&mxtgl6S#+lc|Vd<>#dl?vF2!qfmI`|=7|o8fsq0SsK2xJ^3%D{fNx!~@kc^KIqeT1+8b zi>_lAk;~Q2EuG_~aWrSw@?5w<>(-~DzT?fM9piu}Wz{PeW&4-4T9@{10T247%(vO1 z;K-$&O$}B6oYLe0LeQN62%&`s2tjzT6M~UdMqm`)mP6fye;jBJmdvd;!kM_#4ypS4f5ImpXs48!eH&nx6* z40hq1KiyE>4?q}0#x2DLp#Ox^`fqUeouaL3pUm;`Hzrx2~`U)A+{uMH${VUWVeX?qCc}&YR>Lm#2TfAE8uD;5( zGMj@OCpXGi?I|Ot$`#lvPnB0I5mXx)n@071LP#r=m05(tCxR2rQrpH#u!uUzNF78_ z)uT{JOWuqEPF)D%`D6)ai9^3KdfYI`&@e?7c~%1l%L}Z620*`Boys+PB1oalfPbSB z9aKz81TCmpnl)&o62X$^GDK6ZLkD4;};6U;5pMhL(x z3O41w6+BxD##xEX=|&>3pUhR^`~I@8t|0Otg3vq%kjKcQ<(a2>=F2>p-wj=CPfm*>%fbElU{h z5~1nj+obJFRY3S}2=-I{ZwTHE1e;HXy@cSzN5o!1Fsu?S*$W8%W9p!n0OOYNXt}IC z#kwgrtbH_;{YYBb5Az(L_;G;e0Cj{^4Yo83MkBY{S@VA8_Z;T>O!pj+Ts6A``GRhh zEZY{v2ys0H7`L;;p6Z>7f#1>p@&{Sg3)O9KGZhWuG|C@=w1W3jG-w7@-C*5W zem62#W-9ka9^7?ko;LER`JHckyXG-BkKJJ11N?5}K-nM0&s;~lo>J|S%Zh&kUZM!t8^BYaZF>QDD$d_~ zz+(?-YjBSN?;WW=_jzT2DC4bvJ!I#g7K7tQzwH550GAUAVTv!ueV3-qGy^pGNBvy^zMfvq&J z#d*(5T6S|?Y!0dwxmi$&y;S689`vyF0?8O#xt0x6l{%%iBflx6E}Om3rL#}y(&L2M z)wDzLiKEr7fYgPuQ%GIFCnk33c9Ud6VnV7gX2+lN;5d9Zs?24wOj+WlQm?6-dcbkh z6}fR}p@CE06l@M03*a~_c$OAyjvKqdar?^b0yu7tx~y(Bd(1qBqbb-+v`T6?TBY9a zyg;70I)HC4fl);Do1tH-R099&AoAaxQ@8$=8=`^VyK3P;0QaTsDu>1m%(c7p|8hJy zJ&kaaZMIaeW!Yq4CNj!QwDMq~weVn}2@f{q_~Y|((D}h=LNK3dkc{8E@n~UH;WZU= zR%F(FPQgT7f@!iAm6PO0*7|qsc6GaVl>ahkmFgw|&){{eF>L;Z2I^QaqmBhhi8eQz zU%^f;qdPgagqp6Ab!+Z#m%>JbWiG-*MhG_%1ERzwB_aw^+D2~40Clg7Cz%O9*}`e# z)yUrs#b<6uH484I9s|vVnRNiuLB-E4tj!iJzBSt7Sc4X)X55o>M11IE8f4xo)$l(n zQ`$&sUC*;35%o_a&>SvUPi8P=X82!ZF-|Y}T$rj1kQHvW{|!h%$vKCdCIz*eWv>gx zenL=P{y3r3a{`>BB3%QPR%AsA>UVpVbr9duvQV>jNQcZf=hoyw3hH-zmS-^yHEXIO zySzoRq~I010rF4cTfF@9Z-O}$I$k*<-=JvbNQy9@(pJRLie}97LN^jn?^N1nHq)v+ zv(51!6uOMy@hEkVSLX{^Ie~*gl0==@@y~xAf++MvIcbSInRKSc?Qy3vF{dihR4>w5 z^&CG2a)M*tYB^HU;D8+nHwFnmgpBF&pOtw#|jJptGb&*^s z7cE828+t8o4_e-rLz%R@uORy?3hq*0<|evpHd#e%vMyEU2wOrFz1rc+Rlj+KDR!?w zi*seDIWnkv$#RvsQn)HCs!7WJUu&7$QksIu3Zf30S`PMs#8=q?+qH24Id6)#~c^|QEzcZxv?W*-f z-P?(}mrCBPI$wMt^q}qq?%!kDN2}(&S`C_BRJ@N;3Tj{L`TMmRl)Wf_KR`7oc!_z8 z1ZaC7w`x%Ke$ZY}@jk&zgQ|E5{7|Sk8#ONg@L?U350mR7R&1U7s22M%^@o6tx2UcV zi1|1PKA{R;1vyl_xW6yycnj+Gz#4?tgQ)EFporH4ydmK8prGnqexGEZ16w2+)V%cg z3##bF^8sgeDFG#KY1W8)TATHB=uOxX>QJZ3-z>V{{Bf%M&6w^N18$`TXn!+kf6dD; z0n^a}LoQMMX3+m~mREJakj$^5-26al_DjGJdrDsRBfVpZ6L)`HN+NYI4NJ!XI{*UP zeRY1WceEsYv0l$&*L*0sBAp6ftCSimBV1;U)6iUtG)aI7V7c!j$AZKsC(}?J9MFJ_aL7>%+cK2vc9$@hdgnYVa5%4J$&5G0^Z?knpNRbO7+o z&ei@say!oS-i81f5sY}>^)Hm2@`53BZrXknV`CE6z^GYtCJAWJub)4*5lE-1 zwNq7Q-kwZI%1Au@R0bR{YGFQV2ERxGQ z(M9&Fqhzc(BhzKWnXy(FO&w{SEhkQAbOIdpge7hw@KG`nFcSgaDwd(_lT25NW3nMj zku|5>GWWEwIrhtj>C$7(Qwh|olw_LD*9ZEYM%>BPhq15J_A>UdE{47nJT|_`F%Zu} zVWX|i8tFs}i-IlD(uyNt!f~)r4Y~Dxh!jH73;jpg39`DRj?H|-H{Ks&Kn*N8JD{v> z|60Fui92cgp1{`5((EbBf#~hvl1d?L(m1%Jlg2rY(5LEF%oWo{3ce;@4`i3SBY!yM26 zGMKzXz2R{HhTivqqR%`7h_pL`RCKa0kToM$dqdSBADHl2WOn} zU268Kw@ug$Ux}E_4&Zy`LLx6ix!~D}X0INAqS&!~U62&tZ!f=Oz+PU>lvKfBLNoJh z02F}g$ysJ6P{_)-1QY2RwGs_10-yrn85G4%?CXY_$N;Rg*%?;q45noqkY_F=%8(~Oo}w(*36C0r zrYi2|QP43j66zPgKxZi_zfemI=bI zJ0d&wnLiE0XtzY6)tVNgKVX=Uaz2W76a&t#0nD#q%p3?4jf~!RU|K}8**cvAEPejf zjqNoRjGARx;zsZv<@UwdFhHMsRo@|q+NgjP~*&6l?s*x zpVp)`V!32crGhePiB4exAc#u}a(Z-1p?Oeai^7P%$(&bC@(t2rLa<-sa zInG%KIn&AMmH%ZRjSnNbhP~l`6-b}=e;%ZtQ*4`P&Hl%L^q2nkVCgget3i78sQ>dY z{p9~dG<{n%vdnqxjPLMVhvyuOci8pDNiBOYHt4r;O6Ok&lYmTBt+S2c_jU#~kFq)D zNI)0TF|}1kI>zmu$`e2a>vbEYhXr6)Rl#GssM9MQUG*ZlLO_kU%73J%q6~+gFV2JtM{$;nNXBgkBKQqw+@^YYNso zr!29mmbp~5#DOV8#^uI|4YJ)p1=kB#MRW8-O;bC1yxOrh#d@tQA~ivbshR_2#B^I>L1h7U2Fcm+&NwmM-w>H`t#Dv=%BHhVf`P>c zprVRu0Tu`l~6i4IuVxYD#>7pMiEQ zY#xP~doU~PKnk-%#6=jf`N>v53*&H&a$pN3Ifsnnj+@xdT6a3&zz&rTuUxK{MP(6f z#&ckc8I;B5?f>8KyBF}Auv`C!;TLx6e;)jP=->Ev&+u=FxB5Q}!0=Z8^8om!sChRG z#9*A&E=<+UX4;!^n*0SpommVkL&K3TNG+bzcE?lMc4~-92vqjRaiBqYDobStg8K1P z)zY9mm1S+zhu&>xbwlEJ;He;6##5!eM#A${J9V#H7D1JV>?I8`mbJgHO>_`dUb|)X zv8w0C?WP%+s@qKji5a&iSF9qW?|9yM+kf?IW*K+y*KElSe$8OPFy*rYR;o>FmSNIt zR&|taGAzB{$VwkXtH{)w?lzH`rZ{8ulbuKa%Tpns7oF+^cdN^iUGsy?d>AN_@){oi*FH~mGbKK0(^-+c|0DYQPT!NjYB9SBf)CE`^* z2>=u#k00-PP=E}x8toiZ)5NrLi>!CLX9bO=AUk|g z1S-cQ&Y%^x5uvJDW`e4_(I}~Hs7g*b8ZRwFvxywvACSZN!@6Kzq5F4XH{#UFvnh!< z)fZ*9+euM605IkK&#I){&L#g0fSsG~bO*3B+L8CS_qchKJ}=oS?5TWJ4YoRjLxFl& z-Ue$CgEhGSA1YlcowBsk9Zsc3sC8%$mZ3)`RUXBd+bMa9NpUOc zzd2WvaE|k~MY?-6M;GknY;&$?es}9wS1##W^|ENuZ902s#iJa9_Z9<0w*1Q$0~9oh zg3MyT3fhIm0P(^CW?wso1&sYbvVbw}R^6N};bGuy_M%?YH;MjY-fhB&R<{pd`+(X2 z>SP;^sd`Bs&`Kj(kq2ud~J&}=|P(A>8fUWFK{9uF-B#!&`xC5!~z+}ZOAfI`D zXDsU6!K|V~-k)T92;41L1JTxS)>vnzq#Qu(ar%DH+r3@St#WhXdE%AEuXnH;f%7ChlwSF zjgFb+Z8nzJo+e|>Ro;5s%xtX?ak6a8s$nfdp7Mugtb|5})YzX38TpioGR=8ye^Wmk z0x>UxoB9C)cKo&zM?j(SJ~E-lO{7f|lcm`LESa?}wbi+OC}=Wf3zLhk6&o9~?@Nx} zV#JU_TdXHJ%7<^sqb}jO0b?*vKvv>x8qK*D?KNXChcEmIL$HY)gZfy&hpFUd0|@rq zT=JS0O;v6>rCY-TO0c^5^$=@ z&MB%lRc}jJ10leXRI=#kK#gAE{o>KU?irB0E z$@k73w)d13Q$)jceB-VL8F8L-+}HM-sz?*2y9l$Y~&0;mnJ zFVAe5pz%Wid0XI}eG9zL^%vd5>t-dRpk|xLoZUqCVYP9}nr@cC^8{)Z68-Tq2g_jyCC-p6jR?K5Wo6=X;t@ z5a#hEgo&xNqLB>!-qjFV&y_gUKk6|iY9mDu5S;$jsOmdyXV$1PVp{x2tb|D#=f%iV zSdyt}vF;VQdWrH_wW@$>ravPI8fiB)Gd9h++83gh!O_LuhwgO529lR##7ZQlJYr=M zvu7j5q?fGs=@fuBJ{dOyIkn(t0`izI?QA!#j&z_Xlv6(Ftj^^|%BW7rNa8=I2gpjv zSb)ustHN8^!yJd5i4>}4h-U=jD<})2-9oHCzrkov#KZJ1AaTH+20=xiuwrmX{7)KJ zso(A)(QnZQLL!${?E(_jxt9T=shAZIRq>nL0j9K0w=IJK;{S!A$-neN^S=duo${}t zuUqeBMCij4ml8LCOPI3Q8tuKsW7v}Hhm3f*kUSzXkL#em4nGrzQpTa` z#n8&wgly5FA3MesRIkjvWMQj~X&y<|z43$m?_4Zo1W%e3sHh!x3vwfYvfe+zhTl8*@ z@2QqAF|GVPa=pLAGy0YHV$sI{UWV4i4A!pC%MI#d3fNB$(%T6l^`&P%rc`c{9Hd9D z$%YoKu=>+WC;s%Rygxlc>)7xs3&W}Do%_@4yTg{^@q*L;&`}@$S8afmSn{Vwb4SURpT7o8JIps8YR0J~_5F6+wCVK&73e?>n}pP0!zDZ^ytn-*mvWjj?-V*E(jz#u4O|(h2EQoM-J;{2V=fFws z?^kSxNzStc^iC5I%lDh)#F5ypCs});XX2}71WgrAYbk5IOvv}zba8VW(`AMg>M?-} zYMDqcU*lj5^TesN#H*dEH9k|l;-#CV|DKX|z)~R1T?qD+nzC%tO0+;>T#czD)rkJF z6-3`I3G|lWkbIV}is{P&J@Z_yT2y9b@veMnP|cA17e?6RoPf}8r)L#OINTCitIGbc ziU>?2zxIo){eSWkBaGqrK4Lx@r&5~nAP0fsIN(6N7_;EV$b`|X{E7L`jQ|)B=(k0S zeRn5Onjrvg6HH1o!9IMtOp!@yeY`n21I8uA>QGZ}x}Gtb1wK; z{zzDlG64yWT#AB|^qdQ$rVfDU%&ErQy{ zL97}m^Hjmrf4TD0DB*Mzo_3jFO3o-(9>N1u$(i2GjS7X;(N)Tv|C{ci4$WxZtstns zWy6DLwvW1ejhbd){Y8vfonN3KpE>)0$u-qx)bn%k;( zc`Dvf>Em?pe97D`wHtFc7GlRHZ-d$cM?PEjSN0^pbfAv0yNorG53-TP|J zS>&|q6)fj$&}oS$ff4byD`*eeq)jhbXx1#8i}J2-Ez3Nzn6*{HjOfkA3pC3?a**MNa*>H9(O1U{ZL)#)`vw}Z2A0?6}yCDJK;b&i|`|d`KyKw*J70)S%i{F zbLNpukh8xnC42}u2e+lfx#p2}RU&zgrxWIB(`p-p`;b$#wo}!Za~Uw&iL=U`SngY7=2u(YN~HL~A-L6CDQ9nUtF)P`snYDPtjcp}=DBKTRdna! zV)Hz^!&s{4*`Lb@CTd$>Vpwta|m$8-VuQTrT*BSRz zTxWcttXI#rHsBX&&Wp);aRH~9mh9r=-kkSo_ z)i}91*!5M3+K%hhfu>HzYt^^p4SG`|cO))x zH-^l}P08)WJzRsxtZX&6kJeRuWm?0xncK{5;Z|H}`cZtHU03|Na2t*^bv$sMS&awH zf;!T)HgRilq?aM$H1qbbsE#y=xq}2a(!A4rIKI*RXx@r|$KbI+uP(OQ?n+!~ZpD?R zukG$o-mG^cZo_}3)`r*2YP@C^^vYtZjT?)j@{PsC@{Pp>?=4eD00)`;zJ=P7X?(y+ zdQeMxkdhusN_vNu^su_k#9wAn{bdsK2npV)zB08WoM!U-03{{UitkL?g!9a5d}kK$ zo$1?z&&;UoGqb2ZGl_X03GkNrek%#jnf$(sk`Ra}KH{cCN_t#NN^VND-aVlu;WzUM z^_yA5Yo>b8e3Ftr9O5@q+w>80k@*-UaZ*9oHZC+N2_Kr(xX>)93r#EO6I#+I)r%&# zBNo+xCNWQu05_SRvXVX>ayKHLH@S@pCXP&X?lU21=(Bb!V&Y0OjWbQ<7K2*MUj1Gl zH=60bOB0oQcrtG7M|jJGYY)N(s#wc;_lULYJATbp#w3I^)yriPQJf0jN+Oy*;oAV# z&a%|)+>X&(F{V%@4)pilU--6zzjr;8om?kW!P*(yrY1MLX6^JC_c)!}J(a=9BpEjk zV-@57)W(kEE`p7nUMf^2t>szt{GW;A3hWA|>J0vSlb2js@?R}|Q?c7iw#iElG`;9e z-eoVzChzMnp`yGWbG%2GVNeNu1!nNZw#h9J|37W|6eXAsF|}i~4WNMO;fci+5ep!+ zRYl!Ir4=n;KU37TMNk?`i=funVNf`z0f*rl%;gXu3)9>wMyL{8%vWp{rx9ju>8HOq zbYDjA14+XkO{$(9qqTc_wa5QYldAnv_p}4hJv(^jc7k9|y@Sd{(S2L=phx#O;@Sb- zSIl4~y1ygryQ6cEIbk*iQ_+Q}xKS$1hZ8^;sV7KNGlE)I4P$AN?jBcTQt%pM_FJQ0 z3zn@Bs;;cm_WIMKZ3L>s8*YQxdc;X(GsCpxG`2QZ`__2MK=^p^--GsPFRXM2+T_DN zm#lOd6dYjp9c~z+2KQx$n0P!ci)P^xDE$tryri~M3magiWMH76 z53Hz?&g}6I$Cf-~r@-Nx9+zbtvk8#=KkD8Cz>=f5|JR$B^II&i0Ku;Yu#r!~$RNa7 z2&A)wq%&X>WURl9kuWl05jHE9jP1)g?(OBAbK1)}=bUrSIp_5IRLz_BcK7bYSz!DB z<3?=1uBvajrspjmA2xhoJae^ z`CZHHah8wPabDqxepEhI$;3R8g~?fyd<;o@)tA#cKAzt{TO~OMO8%s-^JNwJ1eV#Z zKqhkkU4i7&bvTFkDHZt)B6b3liF_6peM!e7CqvKGXjwJe&Huo! z`}RbXemwaLs|hJrbBp#<81-5Jwr=rdukFNQ@ zk5zvN^xF4Q`!_b)gZbdmT-p>l_@WTH@jD;PC4_6$+w`uUOadL=YoawDO&Y&Fo25Dt zsMfrnr_sVV%L&(b#M^-4QEjvz;vu^K>8IXjo}CT&NX;Q$#Eu5kr>x)|Vvbk?H~&mN zq9@GT2Vx!Eu??PcEkdh8Ukx+dPrUfZCtiH@h8usL(F1ES2e_Yn@ge(P?s-NKpOhyD zvPAtaa-BJmOg=T484`{&DFCu8T^_IC0sYJjn%_{+&mk%Z+L zi^x~k=I7MPXXy)ULAn*k{THOmU&-g}vtJj*x@EWkMY1F2{ z{sXWUpiyr7PJFABnUa4}*l)|X{_Q3AC)`9CCybSqxo>k5 zZ*vpsm4Dv-sr)qeVYl3C6F-xmNqJ`u6~nw=pz0T;%#oO?U!m&P%!>TFoH>$TdPj== zR#h=aB0uNGRD?ZGQg*9P8m})W=JCb42c0g;0y`VEb7&_f@Y=!B&JFt%#@TeQ{tJ%Ib#mlBx9zZZ%($gTAE$Kz# zMJ7v_u3@5tNs~TI*VH&^tc>Xq>Z89-*LW4eG|7MfRWdMNI!u#r4GeTe*s;FJl#9oX(Xn zNm8zpBv8h~V6!BOFd=UY^CJ`VaIr#FO){G%E8=7XI9<#Trz#>-B+Qpg1Ca?5DAQr! zbg>y`6J9H>NyVy~Wk}49M3^Ee)tM4QnyW}mk<8Uul5(9RfifS41vCEjQJItfFUGf6E<*YSgD>QwmG09+bO}v zfA5j)Jzk6X7vsIYsjH7z>#}^ATdB5H*aMGPkL!!E;k){%KA|s06|MPV{BIevY6a@i zxjZq<@OjHgx#JjL)%V|^Kt5X6;Uiet9!Kc$+|P87NMrDZte?<|>lJbiT3 z^-d$Qcc#@uzSsEep7Q@~pVU3{le+u6`lRlupVTT^^OKrtto=!SKYy7#s;g-~q+j90 zPkEaH*ypF{S2&;6;=WbQo33BEACnKg%TH?C8~4FKsr8X7oT*&KGP&pFY5g!N#JYz3 zSl5tSm$!!PF82y&xdyxiFJ<~cL*%G7>(6s@b_R#tTw%>ixm!=Z;BCv-Q^s`z2s)oMf=?G)_|g#n%Z&`Ff@M4V8Qq$yZAmE1BdsdCqJb zpK``Xf9H*nY+tT_(4#twQLJjwKf(KL`6u~yIR~?TOI|N!aP)?Jqb}h?X7P8pe+wkh z^I1dkU4rOr+FGB^H_5P|l7G>sb4T=h@AB!q=M(b3jb%^hy_Sx0GPAlLSV5|@Cbsv? zBmWhr*Ja&;V&c1cLaz{!ZlX1xP`06<{@+*dJg}}p{#d_tu<%`f>u9sGbDVVI%Yfb? z9yX*i;kM^cVM@eA9;bELhBM_jzv`ItiwDk*aKe30@<|HwN#@1;XD`Rc4le=m7OmCC z3z6TSRbyj6!{evaSNYZfKF5}N_w|QCf0!rsbMov}1?}b>fm*uN(^MMnR zui^Jqm`C`|N%5T%@*=@r<=Oo^`MPe~=_&c9r{wRsLtC9z&Uel?Z67Xdwnvx(v?(L@ z*~3H&3oG?Q&-1fXRtT>nV1Z#TxrK+h%>6Dm`Cabub?vC^$mI~bbGJ& zzE?_^*!T6}{#vx=^T^XtbDJA)y_v0<)9?_R)1t2+$%K}!In&zC@63e1n7#d+57vZy z&|mgo-s`AGV7-|OZaanrl(Oy)qiWe4=B0Z$qX}MNxd$8+x+Fbwb*#n`l6?1_HVLHeS59|T2@*lA7Ir?;0b?+fyj@PPbrF8cu;FWL?Wwnv06$o>GW)Rt8;*C+4iji+;cy5`Gv zyLsB#Dwxkaj(qr;hcpZ&zj@tLB!yf~rQN9<`6=6znzjYlIz3LB;EpQScE73XT-1y| zL5Kx;H#PmIq}hVK%4R30@`RCmoNN|^=%$rVkmO{` zhv~^bLGlw%JA0LxHCj`2v9^5jFF8|$45kaG@b(MIU;JfouFH+(cVBCu#QffCM^*AE zc%FLNIVkYh25jDoUjwCWAve37!IfXe?Tu=Al66$em*#zkwF{XL|2zOTt~LI9jBCNQ z{VBD7G@ci+;fqWm*}PFuUh;>BFuqKu@iM>t74aeW6^7OIFk8M=&WrPJ+%h)3U(l6`Ia~8HU4{ydf{hB zTKR{9x&Me-+r3h~gRI=HX70E7{p}j&zFx0^Tj zs;h7j{!o6zkhwCZRc(5jt5>E)0GFY( zz$?=-pz+o%VQ3Y=u+{--9jJ2K1f*3!+TfVUTh~@KwA09H!l_HuRT#uoSj|Q}gF)Pb zHLS#cNGtXoh_B#41O(q9j>JmLH0Pn3$>*({{Khn zqYt??N9>q-@8MyN?K*P5rEL5?DxK$fGh10k=pybB+F_@4Ymdwai8oL*?lc8&k!a-> z2IL*gt=}6ZfZNuJFEI+p@12_8T9LtLiLzLf_s19wl*k|3SCJtWmRjqEfI;~{wa(&$ z{AN3rP|;XE)V;VcJDjtA%}wxx=Av|s19QEb`v~URW=ZAl$HdKVgQvFqDdyU=-b;jZ z2D~_rGPe$c`Z}2Vr~X)3cUTR0pSyZWY*1hI`R0;W^ydKC$L~w-ld#&UoMrB(0QwX_ zf9@|Sf057L{JALYrXBnjm7HC>JxI~^%k=UP`$(L zLo`AHj)d^YoCc1Cv^lHog&mb&W{_GuTbrWN{ggc(c3_keZEh5+4O0u>ONHG4UdEBG z4i^H`%G^IjT2C%kY5kOYBzMqJ+5DGWh~lz#s=Ec*F(w-V4?k#kaNh^ESUjq<@FDl| zT_17dr-D-a!A z=lIAC=1-Sb=fL_u=uO?LuK9G<5JA7HTfT>?ZjFgGs+w}wfV31Qdi7D*6XfN)qR9$H z^B#Fm?l5&$`<~WC-dzA*;rr`BtNB6rXbO>fPkKG?j|gvy@#Mwy(_Xi~*Y_!ZIQ>KT z!*KzR@+YJYNqWf?iN6w?p1T)hSa z;FH!RIxzhiNjA!%?9^*(eYds&`}H_9{aB+lsblU59%|cK%YNBWeqb1puqlXt?g!|^zIHGHzYOgO zKJ}jDQ!kd^#DnJg3Nft@uPJ(sYWON1BoCj|67yq z?q5Z;+V;_N(a(f&{n}ghM|3w)DlV%1%%l9FpW%27?PoZsQ~Mb`1Biac4#9ZTjp>)j zbDpb6T_}3QLke#Zr?jfaLx1Xu_?Y@xciPW~>8@kyYdx9&nXZ@h#*3wNKtJ(1pfX-V zF+JwsDQ%`t;bLtN^L(uJ>4XAaCsgLXk7j8eR;YiB04~<2tSLT4cz*-&B7p1Ha3UdL z;o?v~gv5tbqTXY;kYe7%rKuA-LRaT4^Q(Y#cbvLj-=q~SI)36$OE2V5MNJT@%9L+PyN@YQmao)jE+pX1g_Pma`Kk`RVSEL@j){3QA^3I5iTHAu3E?o3a?Tn0ntZdA ziA-2uWD>+!|3B#F(kW*Wo>d6{|QCk*6GYrrZc1RI_CL%1iiuUH)@#s z9nV~w-mLF_7tuH6yYgn49#fLH@m1zQ4EXyf{(*2XNjV3Vd{2H@>Xz1f2**yT{HUP( zEf9VzZ^@5Ky%R}%<%*EQ%@dPu|ETL6 zRR#Yk|5@cWp!$d{tLvQ1t7xbh4aqqB47)~pO7I)Sa31B=G*&NCm3on4_>qdLa3#g0 zDH*;p97i#{M|pKPl$s-kYbl0jsi+VSQw#@_D)h9q(u`JQTvRKI9;cW&oUWRkb6h-4 zG2Bgcotybv!}}D&`Bc|w@HxcrK($9(2hHq2W|PkWj(4S_W^^Q@#pifmdJ6GC#fV_b z-yYtlPDtX1is6PT-X89#m~?_+v}>KYgKMH&Fn^|U!E-WkFnlgZx6Ew zaO(jV&Z!t4s{AeDt?ET4fo(CO+i*bVtAb#+7_n}8i-_X0>I+vt&Fn{}-6npj{$%2x ziV^Row+ZJ!4Rotg|5OYQmENj%pLnWb=Ba9c@+E|`Du%nNu2X4ZbJcAX zGq+VY6&q1-TgA+6)hjQC+bU*mtA3wj6yYhvc@>k zF27*MYlgb9teFB`2~w7D`qitR+_bhvP0#c*Qf3l=ZdOfvCb#Vjb!3YM_C*<=zr7bAYISg><7V=ft1u=uj( z!8Knq=abn%i*13%*;T0{D~8XiSh#qyViqfBg^O!zFO*y18P6-{GRn*UKu+&=9&&`RZJ)8LP<{r((Fg)&Ra%GuM(i zF)y}GGuDwY^>ayv5$kpLghFhdekhK1KKwg}aXKuy&p(DIzuRGeeR;o?_hQ0tVQZ2c z@AK&uJ|c^2l03&1Uis>ds~GVa_i$Wkm`+K(VV^3@U#UwZ#vsJ;1|j7*1^&oed4$(0 z??{X>{0MlXkAlmpc!r9i`7^wHfqsau>JRB+qz^OhdNiBt94o(HQ55pup|}b>esSKL z_rH?sBh~zSZv-8C*8W#huG%lF+J176y`X!EmUAy%ZxG@HyF%@zd`BOVlsZvkZpjCz zUEL4%ezog4xeCWROL-%AdheP7qvx ziu{lbB>~|k3J1^w@=;cle^lL!9AC-apWM}-%AZ!bAD2JTJ(6(D>e%_QdJT%}$H90U zjK@oHFh0R9t_}moI`Ze`_!B=NpDbnU_z?cYzo@d2Ave+i+|>xc!*WA2!~X0xd4MlR9FaHsrwpOwzIRIVfPQN zcYxh%@-02U?jQ4;H!IfbU=i(4n1pVP{D$}EJNhR?1f2b`!|W;}k#P_F-qjW+jJ%2+U{V?nQ66{!rQ zvQqc$di{inz@YrJlmTHm-NM`1<5#XOt_t)ik=s@nUO!&I>H2XA(XkaoZoF`jKVk_0`i2=(FDs8`}nIzzqHiom^b2+5B;?clNWAf9#c?dnOkwn0LDUVj14 ze^SN^@Z}`wA=o3Er{p6X|+ncu`zj4m!p_a;q-%2 z{3tO!ybwQ19lQzl=Xnh&m8U8^XKcO@U(*G2s@Ht6PqE+eJ+>HBy|`UfuPtq@^gJrM z_Q~`<&mGm1=e^frO#Z5%_XST#7hS(lfp;Y)Uo7Zl-L>k)k*fFm3VQ1cu`=a&RbH0A zE+t&%ORASvqk6w0UzV>_@^*~L-_%vlzY6^=dM#u|&v1@utZDv!zwQaK_pyAvg1DKO zyjsvp;Hm2UrU!A4fK&Mg)%%YgghkI(^6HG~dCp8VsNQd*_jQ)pS@d{Jy)1dX-|>Y0 zS@5w`5I`Q&-34h!b(oQO^My};dcz#vqHoH-yzYJv2-}jd%>9A2${)}wU-;&~|8|ZZ z4C|KaG=PcyNX4GxjmmMbZ@523%yuL!bN|i6{w*)|9PiYhxMc;gw>{~fzOZWL%FpY& zRDN2C|HL4FP7uw{D{-FKuV2b9CfP57%e?yq0?`qXbfM^w$*@|#NBB)^qkSLnJs zw=5}TI7a@%Elr9pyNlWOf(r04+#}wd;T6GC(lGG)-LW)gs>ajgZxJ_0(*WT#d2>JJ zHaCpt3PCk*5LCmhw$iW~{2XPtI1Hn;kMW$w*R%=X;wWIKb3^TEAMkD(zXn(PK&3e} zl!6lj-$n&FI53RYkEE$|ab0u{v>}MbD*{{<;B|$yTL51LK8y+%H$`{Vn8c^zc`3Ms zB;K2%uYw1njw8g@ctwJ{0>?#filmR;4(?Vy(8 za3DE`9Q8S94z320sU;#2xMUj|G0gXwVA6|$Iw~)lmqJc6o z3zXqm)g$Gm=8FWs!c<+V_d4M*+zuWEdD*G?L3N8!7CDc z3HTT0QY7;f124inU8z@w2f!AK;m_9i0Ya>(wl(U42uT*Zwbg2Ti&<-ATfb538N0sj3oy@C3pMkx;(tQCTy$_}P^GXi{ z5+gyIRfa>fN`dHE2{L0 zuk=y(s;~4~KuBLh>GizQ8v(gtN^jqVsv9h5e5 zq@g2?oKm;3gVM%~btvA)Sl`t|$xR(;;z(1-&6L~>^0VG2Bs_K9=E~E;k>-xHfTyMM zw1lUw@z7EkM6}Y(R%GhGcY@3vPZ9UN)z zNC&6P?dV8H=Zk4>SBFs*icz5m0Cv(JodA5+2YlA8Bu|GdogE?B8N4ov*VU0Oj&udD znUSoJzO9+R-1Q9#P#-xdT+=Kt~2RG7!l@N*<&oqJl5FgYy7G9N`-5RJcQxW2oMh z0=(u9b7YuVH5`H>j!>&cIx@nMkytg#5h$a;9_`3zvuaEpbgUyJ$70nu1swIYG%2idId`159#+Ya&)nR*uOjpvDuMLj%;>bceg0y zR!6otvXy4I&9M%D8%^;ck9E5v+Z}g@lke~!ad#TVbM7ujb~>`ldBfeU7<(Mq?Z_T5 z_Ien5eT?VaeU9vN-2Fw21C9`nv7eBl{f>Lkk%OusDLWkZkXn2Qi)pmFC*t9}#YY@D z?8p%;KC0S|IdasIV`w|>X*=#~o8z8vm%^tC%CW7j<` zS_HkSZW)voL1`I$-EF1XS_h?7P+Fs{ji;@RuZ@|optKFT?R;%1x4mIJ=XM|lo1p99 z8*WF%s0d2Opj3d-$;0U6V?5_p2Bk9Sb}nLc2}&2uNJ{6R+chX%RYOwR1>J6HaW^dH zLC|*GJ(z#f_XrB<9>GetCoKA=?-i6@xX&JPdt1hnZl53zUf-bfA^JL4?)D1`lzzcd zw|`K$dV-pN(+^OK2L@$8PzFLDq)G?zy=`y$huy)x(jh@1Jp`pg^Gb&WWtb@)o>w|T zm5vO`h@gx_>8PMU83pL*pl}T>DjlOr#|C9gP{u+Zr%K29N^|abUujiPNLQhBLSE^_ zpiDHSlk!R@tI{b!nH-cUD4iM5QOE56TSaGgawKUunvn{ zAazh?qjXMQ>D-{qHKp_NO6RN61wok~lm#eV7!)WA0bLXnt~o`ei&g28pezo`66i}+ z=~7RrzUh}Kd3jKl1!Xzp6-r(Kx%!)arShx_%1VN%;aRObtKsq9^z2gEpoMe$y#?oH zHTO!5ya#vb_?(`*spxdNAM)M#K7vQ_99T8EYNFnYqb7g#UmkaDnVLG)!B$5`}IA3+We%eRz{`$Fh|GgJq%{={8 zU9L#2ZDH--o@9~VPgO^&EmM=GzkDh0uSc($r@yMp6{!y*U6d@!6%lLZ74vJ`QTumI z&YCFq;=LC~(K0_(%?YU{5_t4;MReo&s8TJJ6E zVHG)RYpng-Ln-q6sR!q)ZN2{XQM|u3IqprXnXA8wQum|XFTW`1r;40++g7CcsoFf6 z?;-gd-d`WRHvj$di#W!{Zi_TORhviiA3RUB`bgg2d)eV(`jndd|Gl(#(&gK8 z_urz_-FH`{`Kj7Gn(txy9Nyoep8Mtd95w0s%ctD^_nmm(4egy|?$++-6s2mHhR0E) zYs#0pH*b+zn_g4a=c|cbljq&g-bu#SdH3IM)I!Sdfp=J%)7w4vs&qNNX( zDoWR`t=hjmyNmpO>JQJSmiy@5-{QSISiW-IPv(D*R@3&Hb`-6Br&JN)?h-1}{8Vio zPoqyQ{=GM!+EL{3WPRHnEdQNkYSQkF`(Nj&X;)48`_b-~@7wgd{}vJMF0mrbPu1qp zd{2kZ;r%V@y6oT z95v}RWgmp+o#g+}w0FYuZGGpzMFfwp_*+v&*$2yiCz<~}T20&U{#CpE6gWPrVRUDM z_gL$EQk})jW*^nROqw0kzxa;#>R;9&?$p05c-|VUr^ger2LQZG)p$W?M;#5Vdkm^; zv32!ptbdk_O$9&ZoD6D!-D3!{2;O1sA zWN*!To5Y`n9E$=S_6Rqw1rcwEdoeB^1@+iCGBsjDZC zd^Ugbh;Br0Q!kj~tu|!4#Zrxo(*?;#9e?HB7s$|M$xO6a1w6+}Hx?#)TTet?+j^qb zO1FBoR=T|a#0#txb*NiHA2qoAV4-fA#3Pi>D$j!GUL=U_i}G@Pg6INX5M3ETbbno} zVhg3CE{Ua+FSDpcTg+ETf2CH7A-c{=$hL8;?|v1yugO>CYh`S{`t^M90Oj-zoz$YR zUzJzo8x^cyjLF|As!Hz+dXaU^klIQ{iputLWZ!z)S79mRH}gvwwR(uHGq`W7{Lvth zb^6zF-$39y8hT#t{xdr@{|r^hmAP$jRp0$3=KV^3DZeVy4X%o1{+oOuX-wX4G$zlMENYq8 zahT|3&0-yAVo=vB%70W4k_TN^EHdW?JeAVW0$tF@K39(0IKR(Txvo%z)PzVEi^HL;gjxIoKrMq60Yg8WGZNO`*J6$QB#^u?fL#E$7 zW7_+8HO><**Z4dbFp}^*(%v@tm`iM4rH1E~>mFAKcLAONy{-n|P2qJlAyEMyJaKxS zxg07S)Y!Zpy4BTNy5p4x?}z0Pj-sXEhvhNZYR3-u1HONNa6GksfWqstL5)qYq8#YM z4^m-*@rckHjBP`F_@Nq~$9ln10`lM(9$={;@o~0cKEj0!^A&!S!s|{}gh_btqkVXe z77lAv9wB;Tv3{HnPgovlZ_|9>3CpX}u)J~&%R@MSrtl=QzOdF$gEh>0jmxvv&c^wX z!p8Y;>1I{rQ}%vD9@DI9JwbRgH4d+wC^q8xh-0%I^XC}+T!d^2 z3+$ZX1z5k(hhJp-Q7r;xvBEE@ez-8gg~NrlaEQe7R__tCLi^t9OB#4cUEKX z$~6QJ?(+}`!MkAhbTL3s9|3%oE+KbZ7tu=m9rVlIJy}s*(XhO$0YdQzyDN2xzKaoj zr`?_x-xkvNHjTt1tgcpPNL(Iv@{Yc#0eZyX)pv=^3lt*r$}}?XPN3K=Hn4_4jWx80 zyavP&H6n}9Jnw~MonvETqIYa!ae0klB0`UK*f143$Y$i2`9$ZjxnDjykInrY;`a#8 zV{<=;fIO|*d^jE(&6x}xWE)FRngri@DDCorc zMBPpF;fML~!&R7IJEH7HAWY<)XZF)xuJn~as#oOig!!H?FfV`C(cfT@@_*Q((aDo zHDH8ClpQPFO^yVZ1nE2otZSpOb#D>+mM;V1=}5N+rGvr~Pe+hl zN8kyrL%0G$r=WB)_)3MZ1ilyWbtn_U=`_*Lafz-Y-6dE-Xx$4BJ@n9X8db;DmFO;F z=)9UEo(^MZn_f5_H`hx)Zitv8uC6zl?vAE|vk*L?fW?3*DA##QX`s<^k_^YlFlha z(v@o@9o*v}5H~m8N{1LaAV+{q3>{Y$rqSl0PxMSP=t)}5#Ly8uHyLRH>R5PzqriV; z9DQV_YVK6at@iOjlpR*_$PidZdU~)vQFfpaU`MpwOu`@ur<+9xB=6-q&RNGLz|Jdp z;_J9(V-OK`i~+Hy@G(L_omULR*m2E+X@N2=fT{4vEF{OwU!=uAj2*#ui)kbT+(F6* z+%2_YAi|Da9T4v3x54EmOcP(>qpS=Pd`FyJDdBeD5ot%*-D>dGXn3Bifv`3xYYlIm z;;jR((i&Yi28HBUPq4x8Xipn`;7!_|HV0)>P&NayMbWngWlK=Dg1#*%aBhRJJt*4^ zeMeA$+d!q^q2b!W?e9{e>_Vk=)RlCVrjc%CkFQbvI#wY2EWyp~4+`o1fFDq;2ZM4T zC%2@t~YQ`XrjI2i!*o@duEI2tg!MSrEWtx`U5nvHP_75%2E}kQD3ES)Be#Nb%ZlN) z3g1S!gH>$@$Gt<2nb9Dma8zwWO90nMch+khl13qE94d92gg|c^k|u2S94dF4g#^xK z5SoXid8iIuMT?LC*C15swhReZi%^BzN{P~n^{rO5XlxC>^#W~tjct96?JPmnwhsyE z_JDU#tsO(sAtW8qS`iYsDreXG{n1GJhlF(hPEJg>QpC&!AkN~>lNJ&j% zUudhE$tpY<;WmEHG{uCe;i*2#G`5FkPiVxZE8dKdOlKo#@Mf}+G`m1Um=%&)hBsUB zW`ozl$D8Bh&DC<87m~RlnTPOvAAUhdNG||op~5c;$-kNLq z!mkIufe*jIhu^5en?kZNB%2W4?89#f3F$4MY*mhJA=w&|ZE$Q43BubU>+C zu)-e(o=;Z~{)i8MG=!_a0 z+aRn7{i3$SNfx_>h0KQGO1E)XxEh5k+$IpMGi_=KI@4ylF>mv*Gz&}faH-oOjKwX( z(jqJ^!{u(Pu)x_0LhG=!4r^!HCM;Y{0BfsR(l(s$LR&a)JJZb*-`+Q(Ls-acj}aZi z!qow}3g3uMz7ds{;OXle7Sf&3*F_EK8kR0$>53uU!UA_U2;IZd-3;jw7On~aduo>S z^bNTgaC@2livhQHSV;GVsZZD&jrI)-S060uXH0ZG{Y^cum;sicR0diCg9e3pd_}=#QdNVc{By5u=qTqkT)S z2HY`b#97v6goX52n8xKT9Um61aR5{q6aC)=vkOZnS^`TaSprKZhv^BXgk^GAri9;e zr-lX6R1BJ?mQD}Lw6ILa(ivevcm{--VVP-`&I$_}CZK3`Sh!|k#2h8c9M4kgR_AI_ z%nQrhu*^exK8j^N6IuRv)%-&XG zhGl8E_tHIpU)CEF<+~v)T| zmTgv`+f{fw!g%?-PGg4&Q%yU4lwDyVy$iA3ink{$yTh^vyuD$8doP52VcBPR`xS3L zc=#4QyaPVoK`qBaVL2Fi4+1>uVjE`{Zi!CzMR z%fRDq_294g@K;s%T3D`z1*efS$;A$2MI^`l8y+% zEg-avNXv-!cdZn@74SHlX_I?dutpAE;DFmEBBa|y=n5lV58W;zZ6neyQt7r=vG$1J z%ZB?Xi+W9r9=f9?*0O3XB4l=iyHiBCDnP1)XgzdiOJHo52t9OH&K8bHR}AZ>7I%+G zw}^Dd;vNx!vj>Ep5$S0b_lgKtC1AZZOL}944RQ~1PKfE|nd$2r(Jvxo_Qi<)5#j2G z+yLK*fxZ!gEJ2YDjtJ?&=o_Mj4CSQZhz!M$VG)6Q7=+;w8E%G*hzQpJ07q(;jPwoJ z8gNIMexA$GzOFI8uCczZaS__~_=t>)$apkVMFdh68YZafi4mC)k%!(2Q6V5j4!eh{YT<9FavBu|$co#52OWlcjo> z%ObKgBFm6oj$&CJDfX-8I$NQ+D=fEKzq-JY&75dff#zgtMnAuAa-kk?up3mi0q+2_eKQLUW#O2MD|&M z?pNXc2s4f3^&|&On09&4M>!M`(uWW`tawKvayTMKz&jcdxQ{|O7Lj9ycU%C*@&Ej<9tLAJ`dqSL@pToMTNfzyf=%s zGw5FO;V)~ex)PDg5xGLEy6VGUiwNm!pj=n@8xgr4ksH9@j0nOvA>4|{ErY+U@V9~2 z={)9{0`47hta=+n^SwwzOVEonit0ymR2oI4ag>kdDCkY2(j+QPqkJ?+1w%J4U5L zR63%yA}VlKKTVwn^zb{^(LoUFN% zEw@_dF~y9e^OzbH(o>`L-D!$8Ju1_pGCf-6&WOs4XtDE{iGa1PSyADdi9xd!c{cVG zI*&QVMCUO#DqM45nx{_6#Iqq2^@VZqxF6}UG**cg?KhPO%aHmSw-_{|Kso5`^P+G2PN)3^G-+w}3<9+hoT z*$&7KMc)~f9Z}f{`mU(JxeLPXsO&cMJy8K}3)R0jDqMTG{e4Q5eWGx|HDq+iw%@V0 z+(vve(*wrX{w0PHP1pg3ZN6jWZd3YEIzkA|2%(`4`6P}B8g5}k3-hDykli<1$({3ijQ9>1gv#cGWEjFFBsHWkvn5g;qmKYOf-nDG2!Y0Q#WPm22uyZcUyqn@b%&{^GWCS1@c8vICd#)rv(Pc=1ydho>H|~Z@#{;D6+}NR(Ec&$$5t>D z=m4CIgx^pk17kAK3UrVP4^lJiahXU5Y8n_24>1%Tm!Uq~Fg+S`ID2)oJ2xOB6n!L~ zL-yqceH4yHqHiFK#!+bKW7z#WCPQNEhs6%uF&Tro2 zVkx_L(+Ok5GNxN_6k^13CCc(@MyxO+sLqwX5vzP7R{KV*(Z^+NOxCbpHjm3XKBf6k zM%Q{ZVgpV>Mv54*k$#kqV+fn*0nLcbj855{8zZ*FgljWKY*nIc^^CAqvQ6)DJA*{N zj*;GhV%brAT#{^CZ|#ZCWCn?}tQXx~F`V7IW3nqIyAjzF!{@e_ov~uFH&)Bpy(d=7 z*}YHk_tk#z_S^09-aEipGA0Lj@D8e7hhlP&Jz;q84&zX)_TU{sz#hD#G2uGGtsPV3 zW87Kc!8>kDG_4ctpv9mPrjyEa5~jj~cgmP(38!Pibqc04%5(;%!h?6#n5e09G2uE3 z(|Kh&50gH4b({u4_kuCa4Z0T@VaDVFOqZ1D5==U?hbuAYUN)wM3^dtbi%)Qvt}4@2 zn7nzsolIksW0iAVEBOZA$e7%ql5Z0ILmx<)--^jCtK{1%d>i3${u}g;3G>u6Ad=Zo z8pefm!+5FNC=OoZxHO7O<2cjUae=!Dgr;$6$_8pgENb|3vp7K|5BE8?{D zPI0M-OQ-l-Zlw?3IWD9-gVIIeyT+wUT)G0^EiMRmgU~%L-3`8n!uJ4vkPqL}hwr7r zz2nj=F1-=%f1hs1Gf z42{c>xD3VmVLtruxR4$W$_RxY8J7`p843KTxF9?V!sxh+Huy0LKL+?-KKxi8eq0>4 z`S`eui_3W6t9`ff zfwT`@`_+g8aoHc20}u|z1>u7b4#nk=8F4r+XxNDnN8-YD7$c4GlDMa zxNpP>--wgG5vTMKI~|u(aXC#jpNR{kGw3?2Mx2Yw*|?m;i1Tql_&kIQak*edT#O4E zj$_27xNu#>h|5Zp%f1o)0`3(vq8l-baUp#brfYG}$A3L8T-N}&VNCRsH_a}Z#Vt$l zMSR;5RMH(as6j&R&~+us-G&K))G$F0mVnSWA&nB!7($bTAlw8((}XllSPzyEG~7f{ z^Mr6UOH{Zmlqf9{`Igd)e#~}Dt_--X5<wlyX?>vpyP1WVgn z0!uqs0!uq4cD!f)l8xw7IOhULu!!%Zz#==y1t&TG$n#=fv zaE*hhN|~x)D!f)F7!x%$F(F(NV49>%lVB>mRwt8VMLI>RW@a9KtTgyl3cm{Y z7C!uHAAU_j2apL_laRHv&vich`h<{P56T9G-1;yIB;+g@=M?;WLe3@RJm41+0_Oz?7ZY;Pz%L~P zxKljCmlMKuiI#UoiE;&v_Fig3cW4@UWUl!dulpKrSb}zSlYT29Hvzw;T5r>{(d(i0 zPD0?m1EE1u8YH!kYnT)uuc5V3Qn(r>E8NCPl*Y-t))oP`iS2vMGuYII@Z4uJZ!FLB ziY3t6LJ!PrnUoeuX_;hDmlQ~?l1wfqF``XUS|_CqgtlzX%x29H+OaL48PT5Y1(VV= zS?P923RioK=%_^L=o`_52^BMfXS|bdM5S*;XWxh}N!n=Fq;yG2*W_DnH+BI`N;h(WiYyiBn8qCbPZL)u%rx4$}kAS*^`+)njwrx$_O)JWKz)3A0tL3 zg=-{6j8>wI_Ko!GMtnbcOv;|3-pOgj3GIwE87AA`?lSK&FW41Uc zT#GPhi6Sq-p2EvysWI_nEK3U4Qka%2({h*!FOwC^6AfW~Qn=Q^v_Y9Rz*KmdY&0fnYEx3UHo~-7nKr{zc$sV= z$BJ~TR?W7gY)#5Gs%CpqAZ@2`cd)CeRn1Nn-ih!p^WQwXOqQo_w-2%>DWvxxwO8Tx zC1r0?_5rs)DRA$Ha3CoM4DO)99R#jC4|m9iJFN9_Bq@iJas=6;aYa9o zl;cS`0msRtAbb+Ssid4T^wWxd8uXv!(a-qkXZ0yPmz1+fIY;9>@1tKx3h4`gTvYT+ zNx7JmOQ2s)3c{BmTuI6mL%*u%S3zgNU>)a|?lpc}8@X<1bWt~a*qa(_dn+k7*|-#l z+lqZBDYuhy2kZtZfwMuX)NPoOhAHh78>Ixe>pTICQ^M6KMR1K0rAaE^DdJX4sY2RY zGZHqb+uRZi=~`HVT4|XQ(k;Pml|pIjl(b4o>l7>UQUZ4y2yIi+)|9qO36RZF%r2*d zs~t)^C{a52N`L8gG^I?gq=aMzES*x`ShF%ET%8c_Y&^8_E@lQL(bWQo1!(1OUc-jj7z=cj!y}s@t9nt_c9?RRVkUky-Z9A!V@7(O35U< zm&qwX!zdI@NeS0vjF_rKnd;xmPuyu{!(8IAeH&)@Hq7*Gn5C*_r({-2W}|9ON+8Wa z)m$aaOUc}n%!4pLB?!-luplK1%!Y+2LBn)xSdW`(T7|0BYQvh8tWL=qY*?ETgx5k?my&g6!}^qmW>rmFX}{g)aYyG11PBriAMVOvjYz7)*sO|F|*H5Kg3o z>o`m&mFXl*g)aY;F;P>eQ^Iu$rZdWP2Bt!nf0i68(sNoh=TmYnCFiM{3n_tgfx^9* zl8aU~msI!?!avCOqL)pUc7MeOxtbEvSCP7=aM$U*QgR)*8!3VN285d_xoL2>6z&#q zZ)*Aez`f0HE9X0gMrY9=owu!_9$nukEe+GsD9x;j9$D8UEsfLCBu)317C4(iXqJ{{ zY3(+frvw4xSi;cA{{Rz-=@GM(=>-*j66Z{22V(}Th`zQVSa;Lh5mg>*Zx+pE$J zX=$I94k+!I7Pvb?s7OnNDeaUNAX}#^-O99ZbwX)pB}!*s=?~m4ru0p>Yg$Nlg{52C z>o&Wmg{vFlJ&cET($mbquwIs+tLbeC4C|Ao&Gt=8pS1MFoPKG6)DLs|tDOVV(myQ& zAPh_k!UG`;O3NU#b8uSF&=W;N(!wrD$JRnc1}#ogtSb=&Pi!OcoKxk zX_;(xPDu+IMx$tITDYcQ#55(!w4$BU&4#&z*7!Ee^lg~s+b~;I%}LAbw9G-(+_XTN zi>i4_n4gw;X_*gUL0S-A0AXQT7Mcx<(t?H=*swS)T#K+_i4tXrZ^N7JQnP^vZJBSw za^Hp(z6~qWbcw6dvNA2JD2LT)fwUS`Yt)9dX<3t&wb-yOEeNlJus$v8&4vwWLBld^ z*q9cs4cM?riL%MF!JgmE+90;1Wpi4#AiWjEvNc`o5^aibo91q_+-hCob~BPLaYtH6 z??~5ocPiShwCqgFu5_8ZJ1x7@#V&CV0`{oxO$*l^4BDs2`>?0bCGIySy2Jx%;o1+= zL1j7!Q=v;dWK1;m!)f6<1k({^Is#LnOFU{!w6kMr;W`S_ab-FVQ=v;dVN5iHlWE~P z0n;gEIt5dqOFV5%)YO@@aGi$ftTLU2sn8{!BgcyLyjIPHw46`N1*+y^S|DAda4)6h zl2y%R6~2t{8(JW5xK|9Hsm7~@!4q-K2fMC)*p0MYPsMKa964Jh8f{%kYVw12BI{|i^_=z9iaq<=;RWZrTIW(3keR1H!a24`eY zMh0WUkc=Qa1j5ja3^f~uWdsd2AbR`--gk?4P$&8#;U4u z85x_Aai|)f5lG`vRi%Up8L7(11PBu|g78ELlQJ^NY?z!8G>pQADH-9Kj15zjC{v3z zOfws3(bIh!X81PD^lg}xq3@ZUky#m;O*zcT2&6fvnyWU<%gEe}%)^HH89{hHgasK{ zU^Xnw2pXni!=j9EEyRY!N|eQ(4fdcc(aK($ktG>fiu5uR%d$+N?@8Jr4sZtDP)Tq)>WBW^Q~(Xe~sZ+>&4dE?b3^_%LwUp znfmT}wQEC0)@Nixrp(=#k&WKYMz&aS69U$YZO#bSCT?wuB5&c&3cc7?W1<(^mJzP4 zFl|?+?JyO3u^q<51FD@;piBo~D)eFpjfpxxlo76jFdbH=!!T(tR>x@(bdMO*QpS-P;W`4-F=aXi(^6w< z!@PqPNaUtE{vJy-ijSZUdoh zR@xeRJ4J5?`d9Pl?S1qPD%&wD9kS99*$N-MQ&vcK0;EzoI%lOaE1lu!k`;uzK#i_Jv%FK z&W122D{~BcZdQPsnyqx_Wrb^QmTeuBDDzQhj`7#r1*VW5W1+8bk*{#EC1_wvvO;8h-7twiZ+CCX}F>8tJpdD zSGwL;x*^LmvoR|hva%6Xo3a9F6RI|=4O_CZIV)QrY|RS7TOn-A$~LoMdsfh}78`bC zg=;%D>{O!c^lkX6yUT2#gWK)fu*bJyuW!RXeX{mvWnWhIQ^Nm>f`;ALa4aiaN3r3!66LsW!oPW6Ria$= zZFt4KW;W10U-xae;oET2x8asPrMI(kD=W7thdWt;bO%)pbf3M3IcboShB>;eoFLpN zN4J%e#yRV@a)O5I*w8d5TupKnZZjoHGmgHsM);!JJg2Rm-oFJ28yB{;1f5tbOV9{g z=XjRe7bn|WKp5uw{k(2H@>46PBa{{R+s(Psny>rqlC%v(u zPfif-1EFtD`kD>>a)O2~*w8;GT>Y?NfD&bZXM?@72Igq=gK{!3Cxeh4jA9v_D-2E8 zwv9euh~^Hl+-d`gp=KllieWh+JuFw>9j<62axy$8BXVW#$efJK6+eqcAz)q2=$vqk z!k{sVJO+CT1B$W6ME5W*CtPD;8m~;_VJZwLs*H)pc|uOOs$iO^OcP-$3@9cU6VKb^ zoN!HoX^JvUfvGT{m}*Qs5YuwPH5I1m$}}CO!hm9iG0|dY=7ehoOtX|}7EFZ!#cX4u zNzKU#*KC;PD$`t;3ImFH#zdXZ&k5H&m=-A00+7(z;(e3Td$*!F2rkU^Y(f8(r^j<*rDf<4L?90i1&=2GU;R6s3=H#HE zA5!!~pg);MKkTC)QQ4z8Ig*p3$R6|2kLQH+aX?Ne$H|vQKaod2>!Y8`(N&$#$+?`I$My?8`o)}(z6i)AMZcVrOF6j=`jwm@d;myRIeDr9`@-s#}Rb>V~TBYD13_>0Tl|AoMH|gnL5hRU*C2hTbKD zhECYfr$o4VV?$phN?+fGC*6K#1D!;F--ZFc4Fi1}2I)cRgG*#ki3~1bP*)<5hM;Pw z+Ayp{hL*@MY#3f52oHxaqC`fR4I@hg4gIlUREcnn#D>vIl+nHoPq<^uhG*TeB|>s6 zEaOT%pXc}z;Tnf{mGRI|O)#ry5fd#z1x>O96*O7RnNlK?OJoY>Of3;eQ!!_n5~i2P zv=W&PVMd7{JOjea5}9ds&MFZ!OhD1>65*PK5p$F%b9_4=bLW~3b=`R-LUJA~^YeBt zC=ssth%YoAy2?dn6?QJR1a>a51a>Yh;fYyRB1=nT8RfaWL?A84oE2*4$`V;oA}g_T zRf!()%$zyX&YU@O3KiYeZ2a8`5_c=n?k?lm5$pn~fUo1&1e^jlaji;YlUh zlVu#*!&8m}g#PI=4$qWvc(#ngbIok-&o|q1&GtMvywGeUy+Bnj3WvGP_F}Wm1&5cK zjlwUH@N%=g>^QvAY}D{HIK0|y{JjDWuPM=9i*Sezq*^?0G~4UV_6DWjq+)xsxw^Ug z&Hr2a`j&s~v$?G3<|f!d(L5AmKAh(8ORY?90^%aUzBp?aW$j{MUy?O)UP8j9S-aF>UzRn%&CX&yk~RJ=W8AJ#qFq6SeqgY0 zrB}$zy{cT{-^&%w@gI!J)mh{B)xf?+m0p{*YqEANm0p)Ma$iTn^;x^#E4?9WfV_%I zZ_FBhH&E$KO0=8Gm9~YOy;2LeWR0Jx{^ka$Fi_DB`aM;!+Xk7bRYkCEkZ|I!+s$QnPN;LDT#r6oL-HGV$Dm#5VhbO@fw z8h=ky#j~D=Mg1HN^mbV;-*6?=L`1v+j-iiDC-K_EV z4#nT|Jae$@aIEO_5Bvvse&|2I^CO}2an?S{+Q*>tN!CdE1av-C!e?3gG;5!c@OjoK z{5c6XwLYX4iYnzXfw)qwuZwT2m0#pG7d+SaX7M!!%;al zHz8asXqV*d;+$QQD}_sQc4@A<8DB;LCy$rs zjK9l3=n6r;0(>f)@s*xQBrRwBT}h_DE7RY}RN0K@cqYip)j8vD4wn1aWV&9Nt|wFFqDVj|p_GyZNM(@n~B6PYTT@y(uzk-8;k{M}5ZTb1cn zGF3L?+dLDS@$EU|?=~{sp-gv>sj?a0>6zG!@5&i}carIDWxAV8mCg7bzWCtWt3kdm zXZPmpJ_h;zoRM@t!}LJT9`HeaP=z0)FmbI9a`tG> z9s}ItIV1PuBs`I`Cmh_90{0}~{G^u;Px0;}_OwHTq&!mw`)rO4?YW#io3rNt@w{Na zkhAA=_5!e9%o#afBw=pO<~r<`at64knU62$jK7y?`zuPcSE$f8v`l!_D`fOvD_8h> zxxzR62Q7OuXZ(H>*l(%Qw{!MZ&fccdcXCGVcSv|QXYYEY@8t}TuTkmyIpgm=D*Zr- z_CdMQeE85S&4iC~#?Oz)@^MVGKFJw>A5;8O&%=!S%+a7HKKCCGtuOosh)u~e`*+XV zl)UYpM+%rXlJ+3Z#-4fb+$(Q;=4~$$_RbrH_aj8P=Z(4pvIMDMj=@0T50iFl@5AZz1e}L!o zJe$>_d7GZML-W|T<&C5npmUh;JUnlQgk@8%ZZn)rm?tDQ_p{?IaRT z&KreKCgGI4o#Hs0nm20rD>$5%H~vlqhtrj4r6ArWUc3$3QgTwiGqwx78T#&a59ES_@Mh$0z!$o=H??Q06 zSc!IV8Haqh#BqQkTw2EAvN8^rmvOiv&n9za-mb{omEdqy-blKNs{Sq<=H%_~d7A?c zSLcnwSCeo}-mY;RuFV@YTnY}?<&D2x2Ha&nEMbBgrQ7aNhX+aDGB~ zM9?11+aq~2)$yHkmg(6I1HVyz%!2nch;Sx5!l4WZw2n zjQKlxB>c5te{~#=D;PD*0EgoX z#@}(^FjI*(vx>tk$AQ^(LK%k>%Q&1=#^K}w)cll!om{X}3Oj~V3r5nZRCStgIK5z} z73_3yIHO<`K7)ia3wEaCa8|*n;RJ9vyI}mC1rFyZ(ax#j@HfYS$$M@Yhx5uf%r4__ zzN)&QVCNU?0;;;OU?g2gRTnAY;(}dNu!~8!q+k@jgoH~AcB$iVS;45`TyVI&VEkPM z4p%7AuBhU0rQ^WbxT=i9-^)16DdTW;0cw6t!LBaYHT1)^1taNNs=7`%Twk#33U)m> z+)ywI-$25R1-sF4xT#>&a1}V*TrmD_0*70aXtz{xxYcoB>D^Yw;r22Pca(9svj8=} zt6+B)>@IM)yI>^UO;z^@hkFZlPr>d5hx-af;rmFqzhL(}4i6NJ8g2uJ2MfmE1K{wG z678WX4i7sHtn5e1I6PX$;juCfj~AfkPZaF&f;|BaPZo@%C#mWw;qY|9o+{YW;P6br zDEtfw&lc=i$KknxQNttP@O;7edk!34P@=sM;ot=0MNRs-1$(hzb1D52728XN3N>%g z-Q3Ii_%a{+1uuKWaeRn--h%P_)xw1Ent;7tu-6LqdZ85FDA*eXC*~}3?t2T04EC0Q zy+u`T7wqjqct`Dcw_tA;>|NUNUcufe*n1?uU$FPR9Upi-ucFXbP_(m;3ie^aJ|f4* zo&exa1mja^Pr*I~#%Bd1=`(VCUNHVXC^wg^UkJk~i`W;Cu|+WQSOjEtU!)R&N^#!y z(6>EE+;b7zbCI^1riQcEySJ7&c;EcrFO4bpEnv-C`}|S)s$cYL-u(Zb@4NjUX~+D% z|L4U2-L}o&+W#A0`meD6?W^qn!TCk3&cR)8)`TH8*oO3k25V@mu?DLdmE4gBv8=Y| zK~$Q_JP4n#4G$dTZ^;8c#+&oN#o}f>aG%85j;F+DP%3nzDJoHWe~NEEteS^@+z}&C|KUuF&ClCqPB=FT2io1 z?Ukf%PsC1#KU9yg1nT6m4S_lrx7HoQ62$9Vq8OHB&s)ltw556p(7BjdF$C%xX2WKO z;TCMT_-!xUMion2n=M@o%Ye-?VB=A~qAHdpwcVDDf^|07aWehEcYfjVgxk+4tI!n2aW24I6E1^oBKU6#PiGT# zv%!8wF($0aZJ}}#!j`s$Z8?MJn_Fd84O`pRQ^U_CA=)TxL$J+lwj%WAw(E!Oy!G3G z)z+s4!f%GjsCsuz;h#T*U)nFjSODO%CL_9)Zju%q?ZjvIuXz@M<2_M1}ptylWnxWMG_JAnQ!20A&EBG^0I&JN{2 z>_4p36MAiD>m5a9QbqUS+{JeB47*Z#*9uC%2gyI!@9huDEB5n`B>!<#azuFzjUeu( zm;aOfNy}q5`%l|#LijW2{g?gO{;Q-IoAFZGQh_$fJRMiNw$47k4di$ZAD07w zk@wy)3c1;yoQY|hSKb*2y6JH@N0D85ItacQel&&?^~Fw1G}qLGlZ1RZ2xlpr5}|lX75!5cic_UdQ_gZQ&Qdr-kvJL1c)FY! zBZCXEv&c@9&Q92wUM~SS&*4Ws!8p67q!oyh%%t*zzrQ7#>j+aPq|YlO-5zFp)^cpl zZenv%`GtzkX%{9+;Udtqi>gQxSo2~>@)G5{G-3Dxy_9^HDc@zv7Y%be;W>o^u17Cd zV9svhbJAs3snp*UrqljTsW}SM8Ln2@In_F@iCcJW!mdrMkU}VPT|y+cJrI+V=SU)Q z+BM$d8xwXTKQiGa58z2YvXFXHqPe{$+^i~ZN!ZN^yCpF$+^SHV)P{S71aUdR%o~D{-mE+m+NVkRO)Wqjl5>Oug^iPDx^Ippf z341yTXaGfQ>byDsnbq&4wvVgt}P%G0R3$J+9o#9o5+!QH#&BJfL#`1k# zpx%fhcb3AN3fdXdq)vtKd@JfQLU?+QyrV9A*8_FFOP9T;u%7lFZ6SCk87vU8b8sbO zXD=Z;$xnpNj}nCFx}C z^Z(tGWm;xo&m@QweP&NZ;>7<|l4kD>%VZHP6E>Y;ABEg(Po9KEOVan6YCO&f#Nz}4 zp*V@lxj!NOrY4;vO(m>fyg^S><;3A6B+mgrKB>AR9GJ8NBe=xm)E-ui%h{v2oTMM( zCA2S07i!aa?ZaIin(V3%1Pwb>K{h9Ze!)3Q3eI_iM;G))9GUDQ;LuSD(n)Mi#C*Wh zAReQLenh)FM&UVeC#|rZMCZh6L!mWA<_O9O5sZU!jt{fc;1iNIO944?eno?c##w3Z zNnQ_eIf?%l$K~{TPE|d`7(7)WHBs$TxK09bavhwsGrS%`a5|=EDHLZ!@!~J%C>p1b z{agIu+$b7nr=oE-u8_JU1mb9(=}^vB{7o&Y3+U6df^Y(taGw0&4*(P)^99M~;WfT6 z#)ga3B0_Rrq`;hbgP{_;L_O`3pt6Bqs(!dk@j8jsIg0&9!*aPYU(Rc5g!~l>(&=;M z%JP_Al_Y2IGwu^u2Y?Nk0N&3J;{xT)k$51=Db${I!naq1oQjLn74)pk{H(!s`CLw>%)yWm5`kqC}d}%60);I$WH2bvRcPeF$m&z^7Cmx zJQIT;Y9~LRrIViXFP#e5$=`E6N>Mcg?xebr3f0Na7s)%9FE-baR8lKpI;rp_Rmix$ ztkjoD?X%ooiJ`x$u$@i-6~>b|oe)6b{)UI`e1raZQ-L{S0yv3ColO0=JzVG8$*Qd( z;X4;j)g%+ic*lQ7!8v{26Ri`B#uB&_GWfniciQ``nGXc#Lj~@%4|)B_!+L&1M|>P3 zMx4%1fB=(2d`^e(nII6QlaQUCQ{)Rln35t?r%g#g7gGx4xjO;t_HY(xOGW3T+%}5M z>E+9zId>c&G$(oE(41r)Nn}o7PfZb=lc<_ls3~HnO#?O|ImytefSd=We0md+lP|5r zB4jEr$yPV#T5 zu$(-%2`9$oPx9cLClP4$WECxk;p`<0Cm}ltzsW6zXB|lxPBNSk$Ic||aLPzIlMH8h zhR$%d0&sfIoa0|w6^4`AMk@#>O_=2|I!WX6xv9)w5*3<6=*{z@o|)|>#uAy6c5xAS zzJhXcpP{Y3a9ORFMjde7XMB77)uJ{4w@G(O*%%Iq6)&tt<~ zDb^!#HSbChSQB=RLPWtVlXRa}t>In=H8R}iK{M|qA3-(oRz*HPFhbYj${tj(O=4`K z*X&<96=?I}2(d>zmgYm0CekLKAEmf&^6}(-%u8&qn42IzS&=q*Zlge(Jhu!_`E%p& zbjrv|E;5kD=ciMdy<(p08O7byq2bw7*Y4HOn-Z zb8bp!lb6&hFDnEm5jRT;y!i?NGHYCR@oEa;#jCX9HOHqrysoi%BMz>K@okD2oc1Oe zh_LwGn3_|G zsYwO|8;2^eCUG;j3NsW%bA94zI`ep#ns7+^G)2`sJROcmv)p4D$B~Mr$rpV5r4>^X zuYQR1baPDy(^Ckp$v8|7$1B1n(K9y)Gt>0? zthCKku*?#{G9954%7rH@awb0g%GFF({7fIplNBt}fu7=#GfztQC~_vBPbG67G015O znCTf$7pT+ApgM`6Ni)t&6GoG0nJx~AWeIs=Xp(exn&6p)%%nAEl@ZD)a;CT8T#ul6 zE)hP@Q(R2);ma=_h?$wF#LO%aGn3L6luLI;kuzPEa8cCMiz?HHSeO@sC?~y3gy!(?8a)_T20$X^==)WkJlgyMBo^siTFO_jPqId4>WO+srDbuLX<&8jTn z<`|h<6i?HebgQCes$PO=-o}sma68jKO;Alm(Ik~0{N0|`8T3veePj4=GQqq z&DXpuUst|2(!|>&)+SaW`cA0L%Amg$BTIbEw<*93BiJUhrJhim(A;vEO?>|;04G5< z@%~uZN%}M|QQc4u5U>Lkjgxqr__;XOCiX zGA{XWv|;}$zRKuqzT3u74S%$#N*si!8n}|%u>iq$MJ+( z#m_u}(kIq(=sL+mZ=O`UE8#db{Rzc+vO;lgq)?oRN+`|}p*X?(^fKmY0&;TbI@1Gh zo(ZtCgvwb$B|3Da6_k^zGYZAY&vVH0H~%u3NSp-ZBm(CK;XKtb+XHgWrgzR)9p_i; zxF7~`p$FHz5D**g_=lX>Lq(_OXjLU)0{-HseYQSlu;<|dIhQJbkHGAD62;V~6fQ*{t#6K{gG zuusu|brXA&3LaAQ&2rdH+@aEx_>zjNzDLwKj{t>8nvd2>UE|T@k_)6Y@FhAD!)roa z*N8C4>TFO?AnJv#4>8Hr^&z&ix<15MO4o-NIqCWkYb0GCVm2f}9j@kWFhj*6#RaqB zJ3a3LLlX1BoshN$c1>&S4s!6duq|Zx#c8r89gfMA;T|y`-6QV8Jz~9Owab#w!DS+k z#vm0xzdq~@i&)OkR9Vy(U7qf94BEIn^ty(UZE@}j7w_ffa4~Bwa&x$ZwTw=poh@9J zq;|hRECw~iKvW4WA?T3_!)%y^Vi-=^aN6UNpQeWQ>PrjMxnFkSKX0ec``*9Yys7iP zFL-X1ocH>^f9XDNJ_Y8~^qB)(Bl|qS243@EG!N#%NFL0C5j>a&nj_2u=7{c_;(1`z zdC*p#2W`-yr0b+|~*85*-vr$RN$$G(;O8HmM?}CYz387=X6juUI8nT&u@;q!^+?} z!dA8srLc_K5)hRg2R<}_-;d}fXZQrxez1$tIYHJj^J6=~(ZLF=| z9merKcKFS><6|{Z`hbC=8cQo z8UIjqZ9-j}V4hLIbJGaUW|Z|i;~wselhK`VZ`j;6watsVFIL%~QI;FyOx(gPqLN#Z zeJk72w(8}+cnjOQ7=CU)SN3hlzD;ac(h|5ho*lM}&Sbx^?d%tag~?LNt>?y=MzoZLYS^jY@R8k_+9FWdt%1Fn7cD0S!}w#f3yPn%f(^|t6}I6=O4M4Lim zSd3vB$~G{xm(|~5ix=4xS~WA4AomjSXf=i<+5DG`=XD1J0T7K4ghWITdcrWk3}<5) z-U~HY%G!$1fTaay8Ne(O~P|Ll2g>ju~M^O~Tb9 zQZPeGB)05yr~&!f!YX>?!>Uxd8tZ$tUTDB7P6Jr~BP#pYD6spUjk50*p$7Ffy0VY0 zq4F6K1jhKh=;L*Z1GI$z{1iv%v8bb`H@t&a-b)-haGo}2q5$y{G!f+i243%n* zU}WjtnVs+rIm^yq!^lr#yJ$A7-I*(fKJcOu;1-QSXS7?)V44iIMW-`O0M!_29UaOv z;jJ|+2@A303?_!Z8B@S!FgJqXWoDQ@wrI1M#^m64J}eF3&Q2!B(zeWuu&ga>ZPS?) zq-DZ#N}I!^Sk9K8p-Exw)0q~eHHH!h{TV)2CMgHb9 zV+J#0qz#)MRtILyI&2VZ5i_J*)YNd#qO+3Kh5i5k`u}_2+w=gdIMFpT8IqPTZpu=Y zf+I}nWWYr+a@S*%A#F$-jK$8SwXgOGVGyK=b!-G091LL{%*p6pq$WeUt~@Rs8oEAP z7`?(vPfxRyS=d_6nVOo0t_*8BW%y5IO|zgKYBOwP)-sm0W?j|umLm_Eg^kWsy5u(> zW&JYELdq;gnZ*!ol*`n!)*ZZ`6DGhACL(^Y#6o8qNGNqPR=dOR#}_UY^MyLLwE@~S z49ACMfZ(iPDIm_ac5NjNW4Q>%@(}YCApI-!vecKejv`BaMZs7}s)H+A+Ey-x5q^GL zg_l)|taB=_535noS-@U22v@b$i(2F=*pCYw5p#h`SPQDL*0?YRjJ^+x_x%#Q-`c{* z8?z4G+(~zI7DJbHiTks4ig17HtyohN#&)$tTwgCLgD4H|62=3i+s0e>&S8SBXA{<} zaX9s1B5*bUj#xgM1k1OfO)R1<_yfV&2sj(tMz(RUSU%f$m#_)V*wi+$O?M8P!4hr; z95hkYz#mb=kL^eH<01@S%6=jVR82#a+88z`^{2ME{j><@m$IKR@SaM~Z^8Q({U*Ye z(V#jbI3a9J(VyGa_VW^4;5Hgm?|^MVd^?J6R}8K-2#>dI5&rL&Li|@C{%di3y)b{< z+pl*CI{>9hoHWIK-!{{e_z zxV_#I%-t@PnXzjG;rBprwZC2z{&uxL7SZziPeJ$-5O%Xa*={aM_Q~|;sK|d&P<+^xh zCB~zzM`O{{J6pJfoW>9?r^B!w0Z$lBBecSvaub-nT7 zPL;UJmGbVQhPze6-5T9j5zpU~@Ga)vMAu18;l6}#GHBE@<4Lha79%p@)p#M-r7g^pGPhI~)omjlbQIIL(a7*uHUDbnP&kjdksM z(X}&DrcxH&x@le;dUgl!gDaH-liXY+0-AL-;b7OLb)=(Nhnn4Sq#v*J<4KSAH+Zg@`ZSZYSyHi+G~oQf|M_j0xPSLD!)rpK z%Ld>H=CF zgmH`SJc|Knu_BD816mwFZr9Qa;~Ckt*pdRYlr0sB9@;{XEV2}a0c2PVWH>;E7eiYF zWNCo-5wjQGv(1(*a>Q&GkmYPS0a;#Z49<0y;5s{Kk{n!?vJ${nD#Cn%Q6A8#DS)4l)9Jx`5r)A0^!YC10YBpY|UQS(9yP5 z5kr|7@G%()AA8|MC)f{)vRkq7aU0-Cz4#9){=*_tNUv*C%4~*+ zakE}zkDJ(!ig2SpwvFR5neY?9Z*D({M35=_DRU{>nOefnNZP`FW?K|7SxMQJ%&iLR znnxbVb)WeRoVJ zM*x2*spLkms)>kIErspr$?X9rc`9@g8shETf$}>P;aQ!|l|>9%`Y^3UXIi~L zi2|h}Y%2xwu&v36ZS93^-8qs;lF%4_PbI%+i&nOJc-P;-w*DbAjhzPU8(64+Btyi< zifHu?8HoO{rcg5ItNs;Iu4~~~yDd@t1MXgFWSBgIx)YZr;t~DaIBOhYj za#dwRG6#rZ#FWj5Yu9Lvs`SM4_XeuVOuyfabK3<6<4*$wnCOp$nlEjAS7N; zBj}SAGKVCF(rb&55M7ud7;VW+PYe|zhIo_(>GIKuVR2@Z)1*>Zf*G}hCa7mxvMUW; zs4)(#H2jh zI42`5wUL=464bUjwMD08$-^>7(hVaJl-AnlBG)EsXp$VW^2~If8Bx6|+YK9KS&{CR zC`;4ztNeRF$$1|*-#&eQ+i2m@_iNwZQ9Wf`zg?|S3+HXwyzdJRyV_$5UgjUI?c0|x z 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≀<;Q0jdBsopB>E;aDF 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⪻VlYp9o-Uo} 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 zΧ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

    QR*SaN^#F!8Tw1m5%m9YF=vO2Q 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�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