Code Monkey home page Code Monkey logo

flutter_soloud's Introduction

Hi_there2

  • ๐Ÿ“† Flutter enthusiast since 2018, I've been on an exciting journey of creating innovative solutions using the power of Dart and Flutter.
  • ๐Ÿงฐ Open Source Advocate: I'm all about giving back to the community. You'll find some cool open-source Flutter plugins in my repository.
  • ๐Ÿ’ก Problem Solver: I love tackling complex challenges, and I'm constantly learning to keep my skills sharp.

๐ŸŒŸ My GitHub Highlights:

  • flutter_soloud๐Ÿ‘‡๐Ÿผ: Flutter low level audio plugin using SoLoud C++ library and FFI.
  • flutter_opencv_dlib๐Ÿ‘‡๐Ÿผ: Realtime face detection and face recognition using OpenCV and dlib with Dart:ffi.
  • flutter_opengl๐Ÿ‘‡๐Ÿผ: A Flutter OpenGL ES plugin using a Texture() widget.
  • magnifying_glass๐Ÿ‘‡๐Ÿผ: Flutter real-time magnifying glass lens widget with Barrel/Pincushion distortion.
  • flutter_star_menu๐Ÿ‘‡๐Ÿผ: Attach a popup menu to any widget with any widget as menu entries.
  • finger_painter๐Ÿ‘‡๐Ÿผ: Finger paint with different brushes and different blend modes.
  • flutter_flow_chart๐Ÿ‘‡๐Ÿผ: Draw a flow chart diagram with different kind of customizable elements.

Feel free to explore my repositories, and if you have any questions, suggestions, or collaboration ideas, I'm living on Earth (๐Ÿ‡ฎ๐Ÿ‡น) and I'm just a message away. Let's code something amazing together! ๐Ÿš€

LinkedIn Badge Youtube Badge Twitter Badge

Happy coding! ๐Ÿš€


flutter_soloud

soloud6.mp4
soloud9-waveform-B.mp4
Flutter low level audio plugin using SoLoud C++ library and FFI
  • Player and capture audio from microphone
  • 3D audio with doppler effect
  • Faders, oscillators, audio effects like echo, freeverb, robotizer, equalizer, bassboost
  • retrieval of audio FFT and wave data

flutter_opencv_dlib

flutter_opencv_dlib-linux.mp4
Realtime face detection and face recognition using OpenCV and dlib with Dart:ffi

flutter_opengl

A Flutter OpenGL ES plugin using a Texture() widget. Supports Android, Linux and Windows.
A project born in 2019 to address the absence of native OpenGL.
  • use platform GLSL
  • shaders can be modified and compiled at ruun-time
  • use dart:ffi to bind c/c++ OpenGL calls
  • vertex and fragment shaders
  • Many shaders from ShaderToy.com can be copy/pasted


some packages

magnifying_glass flutter_star_menu finger_painter flutter_flow_chart

Flutter real-time magnifying glass lens widget with Barrel/Pincushion distortion.

A simple way to attach a popup menu to any widget with any widget as menu entries.

Painting package that let you finger paint with different brushes and different blend modes. The result can be read as a bitmap or list of Points to be used ie on a Map.

A package that let you draw a flow chart diagram with different kind of customizable elements. Dashboards can be saved for later use.

flutter_soloud's People

Contributors

alnitak avatar filiph avatar jemisgoti avatar mklimko-perpetio avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

flutter_soloud's Issues

fix: Crash when opening a malformed mp3 file

Description

When trying to open a bad mp3 file, the app crashes (no exception โ€” just immediate crash).

Steps To Reproduce

  1. Create a file that's not an mp3. For example, download this PNG and rename its extension to .mp3.
  2. Open the flutter_soloud example app
  3. Switch to the 'hello world!' tab
  4. Click 'pick audio'
  5. Use the file picker to select the invalid mp3 file.
  6. Witness the crash

Expected Behavior

An exception is thrown (or some kind of FlutterErrors thing is returned).

Screenshots

Screenshot 2024-03-07 at 20 49 19

Additional Context

Full crash info

-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Process:               flutter_soloud_example [27308]
Path:                  /Users/USER/*/flutter_soloud_example.app/Contents/MacOS/flutter_soloud_example
Identifier:            com.example.flutterSoloudExample
Version:               0.1.0 (1)
Code Type:             ARM-64 (Native)
Parent Process:        dart [26964]
Responsible:           idea [96357]
User ID:               501

Date/Time:             2024-03-07 20:47:29.3176 +0100
OS Version:            macOS 14.3.1 (23D60)
Report Version:        12
Anonymous UUID:        12B4D141-C435-0024-14C4-F80661B33388

Sleep/Wake UUID:       C3A493C0-0EA1-4D0F-ACFF-74EBF4F9AC8C

Time Awake Since Boot: 280000 seconds
Time Since Wake:       236 seconds

System Integrity Protection: enabled

Crashed Thread:        1  io.flutter.ui

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000000000000040
Exception Codes:       0x0000000000000001, 0x0000000000000040

Termination Reason:    Namespace SIGNAL, Code 11 Segmentation fault: 11
Terminating Process:   exc handler [27308]

VM Region Info: 0x40 is not in any region.  Bytes before following region: 4309827520
      REGION TYPE                    START - END         [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
      UNUSED SPACE AT START
--->  
      __TEXT                      100e2c000-100e34000    [   32K] r-x/r-x SM=COW  ...oloud_example

Thread 0::  Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	       0x18a7e1874 mach_msg2_trap + 8
1   libsystem_kernel.dylib        	       0x18a7f3cf0 mach_msg2_internal + 80
2   libsystem_kernel.dylib        	       0x18a7ea4b0 mach_msg_overwrite + 476
3   libsystem_kernel.dylib        	       0x18a7e1bf8 mach_msg + 24
4   CoreFoundation                	       0x18a8ffb84 __CFRunLoopServiceMachPort + 160
5   CoreFoundation                	       0x18a8fe44c __CFRunLoopRun + 1208
6   CoreFoundation                	       0x18a8fd93c CFRunLoopRunSpecific + 608
7   HIToolbox                     	       0x194ec6448 RunCurrentEventLoopInMode + 292
8   HIToolbox                     	       0x194ec6284 ReceiveNextEventCommon + 648
9   HIToolbox                     	       0x194ec5fdc _BlockUntilNextEventMatchingListInModeWithFilter + 76
10  AppKit                        	       0x18e0dced0 _DPSNextEvent + 660
11  AppKit                        	       0x18e8c7eec -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 716
12  AppKit                        	       0x18e0d037c -[NSApplication run] + 476
13  AppKit                        	       0x18e0a7640 NSApplicationMain + 880
14  flutter_soloud_example        	       0x100e2f920 main + 12 (AppDelegate.swift:5)
15  dyld                          	       0x18a4a10e0 start + 2360

Thread 1 Crashed:: io.flutter.ui
0   flutter_soloud                	       0x101578c9c Player::setWaveformFreq(unsigned int, float)::$_4::operator()(std::__1::unique_ptr<ActiveSound, std::__1::default_delete<ActiveSound>> const&) const + 40 (player.cpp:190)
1   flutter_soloud                	       0x10152b29c std::__1::__wrap_iter<std::__1::unique_ptr<ActiveSound, std::__1::default_delete<ActiveSound>>*> std::__1::find_if[abi:v160006]<std::__1::__wrap_iter<std::__1::unique_ptr<ActiveSound, std::__1::default_delete<ActiveSound>>*>, Player::setWaveformFreq(unsigned int, float)::$_4>(std::__1::__wrap_iter<std::__1::unique_ptr<ActiveSound, std::__1::default_delete<ActiveSound>>*>, std::__1::__wrap_iter<std::__1::unique_ptr<ActiveSound, std::__1::default_delete<ActiveSound>>*>, Player::setWaveformFreq(unsigned int, float)::$_4) + 68 (find_if.h:25)
2   flutter_soloud                	       0x1015261b0 Player::setWaveformFreq(unsigned int, float) + 88 (player.cpp:188)
3   flutter_soloud                	       0x101526148 setWaveformFreq + 64 (bindings.cpp:148)
4   ???                           	       0x112b07a28 ???
5   ???                           	       0x126bc1a88 ???
6   ???                           	       0x126bc14ac ???
7   ???                           	       0x1469d2378 ???
8   ???                           	       0x1469d12e4 ???
9   ???                           	       0x125148df0 ???
10  ???                           	       0x125142eec ???
11  ???                           	       0x125142a44 ???
12  ???                           	       0x12514264c ???
13  ???                           	       0x10fae8f90 ???
14  ???                           	       0x10fae7848 ???
15  ???                           	       0x10fadc4b8 ???
16  ???                           	       0x112b0ce10 ???
17  ???                           	       0x125148df0 ???
18  ???                           	       0x125142eec ???
19  ???                           	       0x125142a44 ???
20  ???                           	       0x12514264c ???
21  ???                           	       0x10fae8f90 ???
22  ???                           	       0x10fae7848 ???
23  ???                           	       0x125141f44 ???
24  ???                           	       0x116222844 ???
25  ???                           	       0x1162223d4 ???
26  ???                           	       0x1162222cc ???
27  ???                           	       0x112b03404 ???
28  FlutterMacOS                  	       0x1051b3d68 dart::DartEntry::InvokeFunction(dart::Function const&, dart::Array const&, dart::Array const&) + 404
29  FlutterMacOS                  	       0x1051b4488 dart::DartEntry::InvokeCallable(dart::Thread*, dart::Function const&, dart::Array const&, dart::Array const&) + 328
30  FlutterMacOS                  	       0x1055c7420 Dart_InvokeClosure + 992
31  FlutterMacOS                  	       0x105084590 tonic::DartMicrotaskQueue::RunMicrotasks() + 164
32  FlutterMacOS                  	       0x10493c4a8 fml::MessageLoopImpl::FlushTasks(fml::FlushType) + 296
33  FlutterMacOS                  	       0x104945724 fml::MessageLoopDarwin::OnTimerFire(__CFRunLoopTimer*, fml::MessageLoopDarwin*) + 52
34  CoreFoundation                	       0x18a91b9b0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 32
35  CoreFoundation                	       0x18a91b658 __CFRunLoopDoTimer + 972
36  CoreFoundation                	       0x18a91b190 __CFRunLoopDoTimers + 356
37  CoreFoundation                	       0x18a8fe6d4 __CFRunLoopRun + 1856
38  CoreFoundation                	       0x18a8fd93c CFRunLoopRunSpecific + 608
39  FlutterMacOS                  	       0x1049459c0 fml::MessageLoopDarwin::Run() + 188
40  FlutterMacOS                  	       0x10493c278 fml::MessageLoopImpl::DoRun() + 60
41  FlutterMacOS                  	       0x1049436a0 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::Thread::Thread(std::_fl::function<void (fml::Thread::ThreadConfig const&)> const&, fml::Thread::ThreadConfig const&)::$_0>>(void*) + 220
42  libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
43  libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 2:: io.flutter.raster
0   libsystem_kernel.dylib        	       0x18a7e1874 mach_msg2_trap + 8
1   libsystem_kernel.dylib        	       0x18a7f3cf0 mach_msg2_internal + 80
2   libsystem_kernel.dylib        	       0x18a7ea4b0 mach_msg_overwrite + 476
3   libsystem_kernel.dylib        	       0x18a7e1bf8 mach_msg + 24
4   CoreFoundation                	       0x18a8ffb84 __CFRunLoopServiceMachPort + 160
5   CoreFoundation                	       0x18a8fe44c __CFRunLoopRun + 1208
6   CoreFoundation                	       0x18a8fd93c CFRunLoopRunSpecific + 608
7   FlutterMacOS                  	       0x1049459c0 fml::MessageLoopDarwin::Run() + 188
8   FlutterMacOS                  	       0x10493c278 fml::MessageLoopImpl::DoRun() + 60
9   FlutterMacOS                  	       0x1049436a0 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::Thread::Thread(std::_fl::function<void (fml::Thread::ThreadConfig const&)> const&, fml::Thread::ThreadConfig const&)::$_0>>(void*) + 220
10  libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
11  libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 3:: io.flutter.io
0   libsystem_kernel.dylib        	       0x18a7e1874 mach_msg2_trap + 8
1   libsystem_kernel.dylib        	       0x18a7f3cf0 mach_msg2_internal + 80
2   libsystem_kernel.dylib        	       0x18a7ea4b0 mach_msg_overwrite + 476
3   libsystem_kernel.dylib        	       0x18a7e1bf8 mach_msg + 24
4   CoreFoundation                	       0x18a8ffb84 __CFRunLoopServiceMachPort + 160
5   CoreFoundation                	       0x18a8fe44c __CFRunLoopRun + 1208
6   CoreFoundation                	       0x18a8fd93c CFRunLoopRunSpecific + 608
7   FlutterMacOS                  	       0x1049459c0 fml::MessageLoopDarwin::Run() + 188
8   FlutterMacOS                  	       0x10493c278 fml::MessageLoopImpl::DoRun() + 60
9   FlutterMacOS                  	       0x1049436a0 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::Thread::Thread(std::_fl::function<void (fml::Thread::ThreadConfig const&)> const&, fml::Thread::ThreadConfig const&)::$_0>>(void*) + 220
10  libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
11  libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 4:: io.worker.1
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 5:: io.worker.2
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 6:: io.worker.3
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 7:: io.worker.4
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 8:: io.worker.5
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 9:: io.worker.6
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 10:: io.worker.7
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 11:: io.worker.8
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x104905448 std::_fl::condition_variable::wait(std::_fl::unique_lock<std::_fl::mutex>&) + 44
3   FlutterMacOS                  	       0x104936d6c fml::ConcurrentMessageLoop::WorkerMain() + 148
4   FlutterMacOS                  	       0x104937a38 void* std::_fl::__thread_proxy[abi:v15000]<std::_fl::tuple<std::_fl::unique_ptr<std::_fl::__thread_struct, std::_fl::default_delete<std::_fl::__thread_struct>>, fml::ConcurrentMessageLoop::ConcurrentMessageLoop(unsigned long)::$_0>>(void*) + 176
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 12:: dart:io EventHandler
0   libsystem_kernel.dylib        	       0x18a7e79c0 kevent + 8
1   FlutterMacOS                  	       0x1050e07f8 dart::bin::EventHandlerImplementation::EventHandlerEntry(unsigned long) + 300
2   FlutterMacOS                  	       0x105107eac dart::bin::ThreadStart(void*) + 88
3   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
4   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 13:: Dart Profiler ThreadInterrupter
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x10534271c dart::ThreadInterrupter::ThreadMain(unsigned long) + 364
4   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 14:: Dart Profiler SampleBlockProcessor
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1052c6428 dart::SampleBlockProcessor::ThreadMain(unsigned long) + 284
4   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 15:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1051d4af8 dart::MutatorThreadPool::OnEnterIdleLocked(dart::MonitorLocker*) + 156
4   FlutterMacOS                  	       0x10534367c dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 152
5   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
6   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
7   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
8   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 16:: com.apple.NSEventThread
0   libsystem_kernel.dylib        	       0x18a7e1874 mach_msg2_trap + 8
1   libsystem_kernel.dylib        	       0x18a7f3cf0 mach_msg2_internal + 80
2   libsystem_kernel.dylib        	       0x18a7ea4b0 mach_msg_overwrite + 476
3   libsystem_kernel.dylib        	       0x18a7e1bf8 mach_msg + 24
4   CoreFoundation                	       0x18a8ffb84 __CFRunLoopServiceMachPort + 160
5   CoreFoundation                	       0x18a8fe44c __CFRunLoopRun + 1208
6   CoreFoundation                	       0x18a8fd93c CFRunLoopRunSpecific + 608
7   AppKit                        	       0x18e206160 _NSEventThread + 144
8   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
9   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 17:: caulk.messenger.shared:17
0   libsystem_kernel.dylib        	       0x18a7e17f0 semaphore_wait_trap + 8
1   caulk                         	       0x194bc2690 caulk::semaphore::timed_wait(double) + 212
2   caulk                         	       0x194bc2544 caulk::concurrent::details::worker_thread::run() + 36
3   caulk                         	       0x194bc2244 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96
4   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
5   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 18:: caulk.messenger.shared:high
0   libsystem_kernel.dylib        	       0x18a7e17f0 semaphore_wait_trap + 8
1   caulk                         	       0x194bc2690 caulk::semaphore::timed_wait(double) + 212
2   caulk                         	       0x194bc2544 caulk::concurrent::details::worker_thread::run() + 36
3   caulk                         	       0x194bc2244 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96
4   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
5   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 19:: caulk::deferred_logger
0   libsystem_kernel.dylib        	       0x18a7e17f0 semaphore_wait_trap + 8
1   caulk                         	       0x194bc2690 caulk::semaphore::timed_wait(double) + 212
2   caulk                         	       0x194bc2544 caulk::concurrent::details::worker_thread::run() + 36
3   caulk                         	       0x194bc2244 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96
4   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
5   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 20:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1051d4af8 dart::MutatorThreadPool::OnEnterIdleLocked(dart::MonitorLocker*) + 156
4   FlutterMacOS                  	       0x10534367c dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 152
5   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
6   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
7   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
8   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 21:: dart:io Process.start
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a8225fc _pthread_cond_wait + 1228
2   FlutterMacOS                  	       0x105108658 dart::bin::Monitor::WaitMicros(long long) + 152
3   FlutterMacOS                  	       0x1050e9130 dart::bin::ExitCodeHandler::ExitCodeHandlerEntry(unsigned long) + 132
4   FlutterMacOS                  	       0x105107eac dart::bin::ThreadStart(void*) + 88
5   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
6   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 22:
0   libsystem_pthread.dylib       	       0x18a81ce28 start_wqthread + 0

Thread 23:
0   libsystem_pthread.dylib       	       0x18a81ce28 start_wqthread + 0

Thread 24:
0   libsystem_pthread.dylib       	       0x18a81ce28 start_wqthread + 0

Thread 25:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1053437dc dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 504
4   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
5   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
6   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
7   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 26:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1053437dc dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 504
4   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
5   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
6   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
7   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 27:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1051d4af8 dart::MutatorThreadPool::OnEnterIdleLocked(dart::MonitorLocker*) + 156
4   FlutterMacOS                  	       0x10534367c dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 152
5   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
6   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
7   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
8   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 28:: DartWorker
0   libsystem_kernel.dylib        	       0x18a7e506c __psynch_cvwait + 8
1   libsystem_pthread.dylib       	       0x18a822628 _pthread_cond_wait + 1272
2   FlutterMacOS                  	       0x1052c0e80 dart::Monitor::WaitMicros(long long) + 128
3   FlutterMacOS                  	       0x1051d4af8 dart::MutatorThreadPool::OnEnterIdleLocked(dart::MonitorLocker*) + 156
4   FlutterMacOS                  	       0x10534367c dart::ThreadPool::WorkerLoop(dart::ThreadPool::Worker*) + 152
5   FlutterMacOS                  	       0x1053439c0 dart::ThreadPool::Worker::Main(unsigned long) + 136
6   FlutterMacOS                  	       0x1052c0280 dart::ThreadStart(void*) + 204
7   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
8   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8

Thread 29:: com.apple.audio.IOThread.client
0   libsystem_kernel.dylib        	       0x18a7e1874 mach_msg2_trap + 8
1   libsystem_kernel.dylib        	       0x18a7f3cf0 mach_msg2_internal + 80
2   libsystem_kernel.dylib        	       0x18a7ea4b0 mach_msg_overwrite + 476
3   libsystem_kernel.dylib        	       0x18a7e1bf8 mach_msg + 24
4   CoreAudio                     	       0x18d16d860 HALB_MachPort::SendSimpleMessageWithSimpleReply(unsigned int, unsigned int, int, int&, bool, unsigned int) + 96
5   CoreAudio                     	       0x18d0443c4 HALC_ProxyIOContext::IOWorkLoop() + 4260
6   CoreAudio                     	       0x18d042bf0 invocation function for block in HALC_ProxyIOContext::HALC_ProxyIOContext(unsigned int, unsigned int) + 108
7   CoreAudio                     	       0x18d1c1f2c HALC_IOThread::Entry(void*) + 88
8   libsystem_pthread.dylib       	       0x18a822034 _pthread_start + 136
9   libsystem_pthread.dylib       	       0x18a81ce3c thread_start + 8


Thread 1 crashed with ARM Thread State (64-bit):
    x0: 0x0000000000000000   x1: 0x0000600000455308   x2: 0x000000016f315474   x3: 0x000000005ad3bab5
    x4: 0x0000000112a8b7e1   x5: 0x0000000000000000   x6: 0x00000001215153c1   x7: 0x0000000000000001
    x8: 0x000000016f3153f0   x9: 0x000000016f3153f0  x10: 0x0000000000000005  x11: 0x00001b0000001b02
   x12: 0x0000000000001c00  x13: 0x0000070000000700  x14: 0x0000000000000000  x15: 0x000000016f3154b0
   x16: 0x0000000000000000  x17: 0x000000017c80d760  x18: 0x0000000000000000  x19: 0x0000000126bc1a94
   x20: 0x00000001428690b8  x21: 0x000000017c80d000  x22: 0x0000000112a88081  x23: 0x0000000106df20c8
   x24: 0x0000000112a88081  x25: 0x000000016f2b3000  x26: 0x000000017c80d000  x27: 0x0000000124c18680
   x28: 0x0000000800000000   fp: 0x000000016f3153e0   lr: 0x0000000101578c98
    sp: 0x000000016f3153c0   pc: 0x0000000101578c9c cpsr: 0x80001000
   far: 0x0000000000000040  esr: 0x92000006 (Data Abort) byte read Translation fault

...

feat: WASM support

Description

Creating this issue to discuss and track work on WASM support.

Requirements

  • WASM compiled
  • flutter_soloud can successfully be called from other WASM-compiled Dart projects
  • verify pkg:flutter_soloud works on all major browsers

docs: Capture

Description
Thank you for your hard work on this awesome project.

I would like to create some documentation for how to use the capture interface to get raw WAV audio.
I see the miniaudio callback function in capture.cpp copies the wav data to a float buffer of length 1024.
I would like to access that raw capture data and pass in my own data_callback to handle the data, if something like this does not already exist.
I believe the getCaptureAudioTexture2d function is the only interface exposed currently that allows something like this.
It's not clear to me how to use it for a case other than visualization as the ticker in the demo project seems to be synchronized to screen render rather than new data available from the capture device.

I think a C++ extension ability to overload that callback method or some other way to add logic in that callback would really help.

I can contribute code and documentation if you can help me understand how this might be possible.

Thank you.

chore: Address C++ compilation warnings

Description

Currently, every new build of a Flutter project that depends on flutter_soloud will generate a large number of warnings (full listing below).

Screenshot 2024-03-14 at 15 51 56

This does not have any effect on functionality, it seems, but it would still be a much better experience if there were no warnings.

Log output

In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:31:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/core/soloud_thread.cpp:225:30: warning: implicit conversion loses integer precision: '__darwin_time_t' (aka 'long') to 'int' [-Wshorten-64-to-32]
                        return spec.tv_sec * 1000 + (int)(spec.tv_nsec / 1.0e6);
                        ~~~~~~ ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:38:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:35:96: warning: implicit conversion loses integer precision: 'long long' to 'unsigned int' [-Wshorten-64-to-32]
        unsigned end_chip_tick = ((passed_clk_ticks + (long long)clk_ticks) * chip_clock_rate) / system_clock_rate;
                 ~~~~~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:48:29: warning: possible misuse of comma operator here [-Wcomma]
      if (++ta >= fa) ta = 0, bitA ^= -1;
                            ^
      if (++ta >= fa) ta = 0, bitA ^= -1;
                      ^~~~~~
                      static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:49:29: warning: possible misuse of comma operator here [-Wcomma]
      if (++tb >= fb) tb = 0, bitB ^= -1;
                            ^
      if (++tb >= fb) tb = 0, bitB ^= -1;
                      ^~~~~~
                      static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:50:29: warning: possible misuse of comma operator here [-Wcomma]
      if (++tc >= fc) tc = 0, bitC ^= -1;
                            ^
      if (++tc >= fc) tc = 0, bitC ^= -1;
                      ^~~~~~
                      static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:52:16: warning: possible misuse of comma operator here [-Wcomma]
         tn = 0,
               ^
         tn = 0,
         ^~~~~~
         static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:53:51: warning: possible misuse of comma operator here [-Wcomma]
         ns = (ns*2+1) ^ (((ns>>16)^(ns>>13)) & 1),
                                                  ^
         ns = (ns*2+1) ^ (((ns>>16)^(ns>>13)) & 1),
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         static_cast<void>(                       )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:56:16: warning: possible misuse of comma operator here [-Wcomma]
         te = 0, env += denv;
               ^
         te = 0, env += denv;
         ^~~~~~
         static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:64:33: warning: possible misuse of comma operator here [-Wcomma]
               denv = -(int)denv, env = env + denv;
                                ^
               denv = -(int)denv, env = env + denv;
               ^~~~~~~~~~~~~~~~~
               static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:65:26: warning: possible misuse of comma operator here [-Wcomma]
            else env = 31, denv = 0; //11,13
                         ^
            else env = 31, denv = 0; //11,13
                 ^~~~~~~~
                 static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:148:32: warning: possible misuse of comma operator here [-Wcomma]
         if (r.env & 4) env = 0, denv = 1; // attack
                               ^
         if (r.env & 4) env = 0, denv = 1; // attack
                        ^~~~~~~
                        static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndchip.cpp:149:23: warning: possible misuse of comma operator here [-Wcomma]
         else env = 31, denv = -1; // decay
                      ^
         else env = 31, denv = -1; // decay
              ^~~~~~~~
              static_cast<void>( )
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:39:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndrender.cpp:38:18: warning: possible misuse of comma operator here [-Wcomma]
        mix_l = l, mix_r = r;
                 ^
        mix_l = l, mix_r = r;
        ^~~~~~~~~
        static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndrender.cpp:45:103: warning: implicit conversion loses integer precision: 'long long' to 'unsigned int' [-Wshorten-64-to-32]
        unsigned endtick = ((passed_sys_ticks + endframe_sys_tick) * (long long)sample_rate * TICK_F) / sys_clock_rate;
                 ~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/sndrender.cpp:120:45: warning: possible misuse of comma operator here [-Wcomma]
                                s2_l = val_l, s2_r = val_r; // s2=s1, s1=0;
                                            ^
                                s2_l = val_l, s2_r = val_r; // s2=s1, s1=0;
                                ^~~~~~~~~~~~
                                static_cast<void>( )
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:40:
In file included from /Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/ay/soloud_ay.cpp:35:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/include/zx7decompress.h:70:23: warning: '&' within '|' [-Wbitwise-op-parentheses]
        return (value & 127 | i << 7) + 128;
                ~~~~~~^~~~~ ~
        return (value & 127 | i << 7) + 128;
                      ^
                (          )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/include/zx7decompress.h:81:30: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
        i = io->output_index - offset;
          ~ ~~~~~~~~~~~~~~~~~^~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/include/zx7decompress.h:104:27: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
                return io.input_index;
                ~~~~~~ ~~~^~~~~~~~~~~
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:54:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:762:33: warning: left operand of comma operator has no effect [-Wunused-value]
                                int stressdur = StressDur(p,stress);
                                                            ^~~~~~
#define StressDur(e,s) (s,((e->mDU + e->mUD)/2))
                        ^
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:60:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/tedsid/sid.cpp:37:23: warning: implicit conversion loses integer precision: 'long' to 'unsigned int' [-Wshorten-64-to-32]
        unsigned int bit22 = bit(shiftReg,22);
                     ~~~~~   ^~~~~~~~~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/tedsid/sid.cpp:38:23: warning: implicit conversion loses integer precision: 'long' to 'unsigned int' [-Wshorten-64-to-32]
        unsigned int bit17 = bit(shiftReg,17);
                     ~~~~~   ^~~~~~~~~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/tedsid/sid.cpp:58:27: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
                (bit(shiftReg, 4) << 5) |
                ~~~~~~~~~~~~~~~~~~~~~~~~^
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:68:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:1394:20: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
      fseek(z->f, x+n, SEEK_SET);
      ~~~~~       ~^~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:3099:20: warning: possible misuse of comma operator here [-Wcomma]
            lx = hx, ly = hy;
                   ^
            lx = hx, ly = hy;
            ^~~~~~~
            static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:3340:25: warning: possible misuse of comma operator here [-Wcomma]
               m2 = m[j], a2 = m[j] - a[j];
                        ^
               m2 = m[j], a2 = m[j] - a[j];
               ^~~~~~~~~
               static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:3342:25: warning: possible misuse of comma operator here [-Wcomma]
               a2 = m[j], m2 = m[j] + a[j];
                        ^
               a2 = m[j], m2 = m[j] + a[j];
               ^~~~~~~~~
               static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:3345:25: warning: possible misuse of comma operator here [-Wcomma]
               m2 = m[j], a2 = m[j] + a[j];
                        ^
               m2 = m[j], a2 = m[j] + a[j];
               ^~~~~~~~~
               static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:3347:25: warning: possible misuse of comma operator here [-Wcomma]
               a2 = m[j], m2 = m[j] - a[j];
                        ^
               a2 = m[j], m2 = m[j] - a[j];
               ^~~~~~~~~
               static_cast<void>( )
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:5092:24: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
   f = fopen(filename, "rb");
                       ^
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:89:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/filter/soloud_fftfilter.cpp:175:10: warning: unused variable 'mag' [-Wunused-variable]
                        float mag = aFFTBuffer[i * 2];
                              ^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/soloud/src/filter/soloud_fftfilter.cpp:210:10: warning: unused variable 'mag' [-Wunused-variable]
                        float mag = aFFTBuffer[i * 2];
                              ^
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:103:
In file included from /Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/bindings.cpp:1:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:51:16: warning: empty paragraph passed to '@return' command [-Wdocumentation]
    /// @return
        ~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:51:10: warning: '@return' command used in a comment that is attached to a function returning void [-Wdocumentation]
    /// @return
        ~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:57:15: warning: empty paragraph passed to '@brief' command [-Wdocumentation]
    /// @brief
        ~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:58:25: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param aErrorCode
        ~~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:79:23: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param waveform 
        ~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:80:24: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param superWave 
        ~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:81:20: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param scale 
        ~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:82:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param detune 
        ~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:83:19: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param hash 
        ~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:128:24: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param soundHash
        ~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:147:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param handle
        ~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:151:24: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param soundHash
        ~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:155:24: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param soundHash
        ~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:155:16: warning: parameter 'soundHash' not found in the function declaration [-Wdocumentation]
    /// @param soundHash
               ^~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:163:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param handle
        ~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:164:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param enable
        ~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:172:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param handle 
        ~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:177:27: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param textToSpeech
        ~~~~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:184:22: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param enabled
        ~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:185:16: warning: empty paragraph passed to '@return' command [-Wdocumentation]
    /// @return
        ~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:185:10: warning: '@return' command used in a comment that is attached to a function returning void [-Wdocumentation]
    /// @return
        ~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:199:24: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param soundHash
        ~~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.h:240:21: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param handle
        ~~~~~~~~~~~~^
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:103:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/bindings.cpp:702:31: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'int' [-Wshorten-64-to-32]
        *paramsCount = pNames.size();
                     ~ ~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/bindings.cpp:721:57: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
        if (player.mFilters.addGlobalFilter(filterType) == -1)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/bindings.cpp:735:60: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
        if (player.mFilters.removeGlobalFilter(filterType) == -1)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:104:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.cpp:63:13: warning: enumeration values 'nullPointer', 'soundHashNotFound', and 'visualizationNotEnabled' not handled in switch [-Wswitch]
    switch (aErrorCode)
            ^~~~~~~~~~
    switch (aErrorCode)
            ^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/player.cpp:150:57: warning: implicit conversion from 'long long' to 'result_type' (aka 'unsigned int') changes value from 9223372036854775807 to 4294967295 [-Wconstant-conversion]
    std::uniform_int_distribution<unsigned int> dist(0, INT64_MAX);
                                                ~~~~    ^~~~~~~~~
In file included from <built-in>:1:
In file included from /Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Pods/Target Support Files/flutter_soloud/flutter_soloud-prefix.pch:2:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:18:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/sys/types.h:81:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/machine/endian.h:37:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/arm/endian.h:77:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/sys/_endian.h:131:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/libkern/_OSByteOrder.h:80:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/libkern/arm/OSByteOrder.h:8:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/include/c++/v1/stdint.h:124:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/15.0.0/include/stdint.h:52:
#define INT64_MAX        9223372036854775807LL
                         ^~~~~~~~~~~~~~~~~~~~~
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:106:
In file included from /Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/capture.cpp:1:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/capture.h:31:23: warning: empty paragraph passed to '@param' command [-Wdocumentation]
    /// @param deviceID 
        ~~~~~~~~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/capture.h:32:16: warning: empty paragraph passed to '@return' command [-Wdocumentation]
    /// @return 
        ~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/capture.h:36:16: warning: empty paragraph passed to '@return' command [-Wdocumentation]
    /// @return 
        ~~~~~~~^
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/capture.h:36:10: warning: '@return' command used in a comment that is attached to a function returning void [-Wdocumentation]
    /// @return 
        ~^~~~~~
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/flutter_soloud.mm:3:
In file included from /Users/filiph/.pub-cache/hosted/pub.dev/flutter_soloud-2.0.0-pre.2/macos/Classes/../../src/flutter_soloud.cpp:109:
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:21:24: warning: implicit conversion loses integer precision: 'decltype(__x.base() - __y.base())' (aka 'long') to 'int' [-Wshorten-64-to-32]
        int index = it - filters.begin();
            ~~~~~   ~~~^~~~~~~~~~~~~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:139:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mBiquadResonantFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:145:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mEqFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:151:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mEchoFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:157:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mLofiFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:163:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mFlangerFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:169:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mBassboostFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:175:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mWaveShaperFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:181:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mRobotizeFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
/Users/filiph/dev/flutter-codelabs/audio_soloud/soloud_game/macos/Flutter/ephemeral/.symlinks/plugins/flutter_soloud/src/filters/filters.cpp:187:42: warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'unsigned int' [-Wshorten-64-to-32]
        mSoloud->setGlobalFilter(filters.size(), mFreeverbFilter.get());
                 ~~~~~~~~~~~~~~~ ~~~~~~~~^~~~~~
73 warnings generated.
warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'Flutter Assemble' from project 'Runner')

Requirements

  • No functional changes to the code

fix: App asks for microphone permission even though it's not using it

Description

An app that calls SoLoud.init() (or maybe just imports flutter_soloud?) will give a warning to the user about microphone permission.

NOTE: I need to look at this more thoroughly but I wanted to file the issue so that I don't forget, or in case it's an easy fix.

Steps To Reproduce

  1. Create an app
  2. Import flutter_soloud
  3. (possibly not needed?) Call Soloud.instance.init() at app start
  4. Run on macOS

Expected Behavior

App runs immediately

Screenshots

TODO - this doesn't happen on subsequent runs of the app, so I can't easily reproduce right now

Additional Context

This, to me, is a major issue. Most game devs don't need microphone input, and yet their games will ask for microphone permissions on startup. This looks shady ("why does this game need to hear my mic input?"). I'd go as far as to say that, if this cannot be worked around, let's just drop the Capture functionality altogether (e.g. move it to a fork of flutter_soloud) โ€” it's a very niche functionality and it's not worth the churn of developers who understandably avoid an audio engine that makes it look like they're spying on their players.

perf: Ability to play precise sound sequences

Description

When I tried to play sharp short sounds very quickly I noticed that the distance between the sounds are not constant, they get messy. A quick way to test this is with the example project, is to replace 'assets/audio/explosion.mp3' to this Rimshot1.wav.zip and play them every 100ms.

  Future<void> playTenTimes() async {
    for (int i = 0; i < 20; ++i) {
      await Future.delayed(const Duration(milliseconds: 100));
      await playAnotherInstance();
    }
  }

I know this package is not a music sequencer, but it would be awesome, if we could use it for that as well. In the SoLoud documentation I found that Soloud.playClocked() addresses something similar, but I am not sure it is the same issue.

feat: Make it possible to "instance" SoLoud?

Description

SoLoud is currently always a singleton. There's a single SoLoud underlying engine, and the Dart API exposes it via SoLoud(). We could go that way but I wonder if it's possible (even easy?) to make SoLoud instanced.

This would mean that every time you call SoLoud(), you'd get a new instance of the engine. You could have multiple running at the same time.

PROs:

  • Idiomatic way of configuring the engine. For example, we could have final engine = SoLoud(sampleRate: 44100);.
  • Idiomatic way of passing the engine around. You create an instance, and then you provide it. This is in contrast with the current state, in which you can access the singleton instance via SoLoud() from anywhere. There is no way a controller/facade can "hide" SoLoud() from you via encapsulation.
  • More robust testing. (One test cannot influence another.)
  • Easier to avoid bugs such as #31 (comment), where one part of the app "forgets" to do something and there's a crash in another part of the app.

CONs:

  • More work.
  • A breaking change (even the example uses SoLoud() to access the same instance).

Requirements

  • Verify that this is even something that the underlying (C++) engine supports
  • Calls to SoLoud() create an instance that is independent from all other SoLoud() instances

proposal: Another set of renames

Description

I have another set of renames that I'd like to run by you (when you have time!). Basically, I'm reading the SoLoud page now (e.g. https://solhsa.com/soloud/concepts.html) and I think we might want to stick to their terminology.

For example, SoundProps might become AudioSource. Possibly SoLoud.initialize() to SoLoud.init(), and shutdown() to deinit(), although here I'm uncertain since those are against Dart style. But looking at the C# wrapper, for example, I can see that they also break C# conventions (https://solhsa.com/soloud/cs_api.html). Or maybe deinit() should be a synchronous "kill switch" for when there's no time at the very end of the app/game's lifecycle โ€” and we keep shutdown() for a softer, more thorough exit.

Apart from renaming, I'd love to move the documentation as close to the original (C++) library as possible.

fix: building on linux fails

I'm on debian. do I need to install an apt package?

Launching lib/main.dart on Linux in debug mode...
**************** SOLOUD CONFIGURE.CMAKE
[+] Build dynamic library enabled
[-] Build static library disabled
[-] Build C API disabled
[-] Build MiniAudio disabled
[-] Build demos disabled
[+] NULL backend enabled
[-] SDL2 backend disabled
[+] ALSA backend enabled
[-] CoreAudio backend disabled
[-] OpenSLES backend disabled
[-] XAudio2 backend disabled
[-] WINMM backend disabled
[-] WASAPI backend disabled
[-] Generate Glue disabled
**************** SOLOUD SRC.CMAKE 1
**************** SOLOUD SRC.CMAKE 2 soloud
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/core/soloud_queue.cpp:180:3: warning: misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/ay/chipplayer.cpp:9:32: warning: field 'chip2' will be initialized after field 'mInstance' [-Wreorder-ctor]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/linux/../src/soloud/include/zx7decompress.h:70:23: warning: '&' within '|' [-Wbitwise-op-parentheses]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/tts.cpp:613:20: warning: unused variable 'Ordinals' [-Wunused-variable]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/tts.cpp:622:20: warning: unused variable 'Ord_twenties' [-Wunused-variable]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/linux/../src/soloud/include/zx7decompress.h:70:23: warning: '&' within '|' [-Wbitwise-op-parentheses]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/tedsid/soloud_tedsid.cpp:78:3: warning: misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/filter/soloud_dcremovalfilter.cpp:62:7: warning: variable 'prevofs' set but not used [-Wunused-but-set-variable]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:113:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:113:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:113:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:113:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:113:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:114:11: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:114:24: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:114:30: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:114:43: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:114:11: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:116:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:116:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:116:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:116:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:116:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:117:11: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:117:24: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:117:30: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:117:43: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:117:11: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:118:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:118:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:118:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:118:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:118:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:120:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:120:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:120:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:120:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:120:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:121:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:121:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:121:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:121:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:121:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:122:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:122:23: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:122:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:122:42: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:122:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:131:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:135:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:139:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:143:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:147:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:151:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:157:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:161:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:165:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:171:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:175:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:179:2: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/vizsn/soloud_vizsn.cpp:417:28: warning: array subscript is of type 'char' [-Wchar-subscripts]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/backend/alsa/soloud_alsa.cpp:41:10: fatal error: 'alsa/asoundlib.h' file not found
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:117:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:117:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:118:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:118:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:119:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:119:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:120:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:120:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:121:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:121:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:122:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:122:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:123:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:123:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:124:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:124:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:125:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:125:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:126:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:126:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:127:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:127:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:128:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:128:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:129:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:129:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:130:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:130:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:131:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:131:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:132:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:132:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:133:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:133:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:134:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:134:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:135:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:135:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:136:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:136:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:137:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:137:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:138:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:138:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:139:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:139:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:140:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:140:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:141:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:141:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:142:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:142:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:143:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:143:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:144:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:144:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:145:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:145:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:146:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:146:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:147:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:147:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:148:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:148:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:149:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:149:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:150:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:150:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:151:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:151:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:152:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:152:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:153:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:153:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:154:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:154:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:155:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:155:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:156:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:156:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:157:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:157:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:158:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:158:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:159:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:159:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:160:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:160:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:161:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:161:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:162:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:162:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:163:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:163:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:164:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:164:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:165:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:165:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:166:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:166:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:167:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:167:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:168:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:168:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:169:18: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:169:10: warning: suggest braces around initialization of subobject [-Wmissing-braces]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/speech/klatt.cpp:762:33: warning: left operand of comma operator has no effect [-Wunused-value]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/filter/soloud_fftfilter.cpp:175:10: warning: unused variable 'mag' [-Wunused-variable]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/filter/soloud_fftfilter.cpp:210:10: warning: unused variable 'mag' [-Wunused-variable]
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/soloud/src/audiosource/wav/stb_vorbis.c:5092:24: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/bindings.cpp:646:57: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/bindings.cpp:660:60: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
/home/steve/expr/flutter_soloud/example/linux/flutter/ephemeral/.plugin_symlinks/flutter_soloud/src/player.cpp:135:57: warning: implicit conversion from 'long' to 'unsigned int' changes value from 9223372036854775807 to 4294967295 [-Wconstant-conversion]
Exception: Build process failed

Exited (1).

feat: Add custom source data for capturing

Description

For some scenario, like live iOS live broadcast, I've got raw audio data

I want to render data from broadcast stream.

now Capture function only work with builtin micophone

I, trying to add custom source input for capture function

but data can not be render properly

Requirements

  • Checklist of requirements to be fulfilled

Additional Context
capture.h

#ifndef CAPTURE_H
#define CAPTURE_H

#include "enums.h"
#ifndef COMMON_H
#include "common.h"
#endif

#include <vector>
#include <string>

#include "soloud/src/backend/miniaudio/miniaudio.h"

struct CaptureDevice
{
    char *name;
    unsigned int isDefault;
};

class Capture
{
public:
    Capture();
    ~Capture();

    /// returns a list of available capture devices
    /// detected by miniaudio
    std::vector<CaptureDevice> listCaptureDevices();

    /// @brief initialize the capture with a [deviceID]. A list of devices
    ///     can be acquired with [listCaptureDevices].
    ///     If [deviceID] is -1, the default will be used
    /// @param deviceID
    /// @return
    CaptureErrors init(int deviceID);

    CaptureErrors updateCustomSourceData(const void *pInput, ma_uint32 frameCount);

    /// @brief Must be called when there is no more need of the capture or when closing the app
    /// @return
    void dispose();

    bool isInited();
    bool isStarted();
    CaptureErrors startCapture();
    CaptureErrors stopCapture();

    float *getWave();

private:
    ma_context context;
    ma_device_info *pPlaybackInfos;
    ma_uint32 playbackCount;
    ma_device_info *pCaptureInfos;
    ma_uint32 captureCount;
    ma_result result;
    // ma_encoder_config encoderConfig;
    // ma_encoder encoder;
    ma_device_config deviceConfig;
    ma_device device;

    /// true when the capture is initialized
    bool mInited;
    bool mIsCustomSourceDeviceEnabled;
};

#endif // CAPTURE_H

capture.cpp

#include "capture.h"
#include "soloud.h"

#include <cstdarg>
#include <memory.h>

#define CAPTURE_BUFFER_SIZE 1024

#define CAPTURE_CUSTOM_SOURCE_DEVICE_ID 9999

float capturedBuffer[CAPTURE_BUFFER_SIZE];
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount)
{
    // Process the captured audio data as needed
    // For example, you can copy it to a buffer for later use.
    float *captured = (float *)(pInput); // Assuming float format
    // Do something with the captured audio data...
    // printf("framecount: %d\n", frameCount);

    memcpy(capturedBuffer, captured, sizeof(float) * CAPTURE_BUFFER_SIZE);
}

Capture::Capture() : mInited(false){};
Capture::~Capture()
{
    dispose();
}

std::vector<CaptureDevice> Capture::listCaptureDevices()
{
    printf("***************** LIST DEVICES START\n");
    std::vector<CaptureDevice> ret;
    if ((result = ma_context_init(NULL, 0, NULL, &context)) != MA_SUCCESS)
    {
        printf("Failed to initialize context %d\n", result);
        return ret;
    }

    if ((result = ma_context_get_devices(
             &context,
             &pPlaybackInfos,
             &playbackCount,
             &pCaptureInfos,
             &captureCount)) != MA_SUCCESS)
    {
        printf("Failed to get devices %d\n", result);
        return ret;
    }

    // Loop over each device info and do something with it. Here we just print
    // the name with their index. You may want
    // to give the user the opportunity to choose which device they'd prefer.
    for (ma_uint32 i = 0; i < playbackCount; i++)
    {
        printf("######%s %d - %s\n",
               pCaptureInfos[i].isDefault ? " X" : "-",
               i,
               pCaptureInfos[i].name);
        CaptureDevice cd;
        cd.name = strdup(pCaptureInfos[i].name);
        cd.isDefault = pCaptureInfos[i].isDefault;
        ret.push_back(cd);
    }
    printf("***************** LIST DEVICES END\n");
    return ret;
}

CaptureErrors Capture::init(int deviceID)
{
    if (mInited)
        return capture_init_failed;

    if (deviceID == CAPTURE_CUSTOM_SOURCE_DEVICE_ID)
    {
        mInited = true;
        mIsCustomSourceDeviceEnabled = true;
        return capture_noError;
    }

    deviceConfig = ma_device_config_init(ma_device_type_capture);
    deviceConfig.periodSizeInFrames = CAPTURE_BUFFER_SIZE;
    if (deviceID != -1)
        deviceConfig.capture.pDeviceID = &pPlaybackInfos[deviceID].id;
    deviceConfig.capture.format = ma_format_f32;
    deviceConfig.capture.channels = 2;
    deviceConfig.sampleRate = 44100;
    deviceConfig.dataCallback = data_callback;
    deviceConfig.pUserData = nullptr;

    result = ma_device_init(NULL, &deviceConfig, &device);
    if (result != MA_SUCCESS)
    {
        printf("Failed to initialize capture device.\n");
        return capture_init_failed;
    }
    mInited = true;
    return capture_noError;
}

CaptureErrors Capture::updateCustomSourceData(const void *pInput, ma_uint32 frameCount)
{
    if (!mInited || !mIsCustomSourceDeviceEnabled)
        return capture_not_inited;

    // Process the captured audio data as needed
    // For example, you can copy it to a buffer for later use.
    float *captured = (float *)(pInput); // Assuming float format
    // Do something with the captured audio data...
    // printf("framecount: %d\n", frameCount);

    memcpy(capturedBuffer, captured, sizeof(float) * CAPTURE_BUFFER_SIZE);
    return capture_noError;
}

void Capture::dispose()
{
    mInited = false;
    mIsCustomSourceDeviceEnabled = false;
    ma_device_uninit(&device);
}

bool Capture::isInited()
{
    return mInited;
}

bool Capture::isStarted()
{
    if (mIsCustomSourceDeviceEnabled)
        return true;

    ma_device_state result = ma_device_get_state(&device);
    return result == ma_device_state_started;
}

CaptureErrors Capture::startCapture()
{
    if (!mInited)
        return capture_not_inited;

    if (mIsCustomSourceDeviceEnabled)
        return capture_noError;

    result = ma_device_start(&device);
    if (result != MA_SUCCESS)
    {
        ma_device_uninit(&device);
        printf("Failed to start device.\n");
        return failed_to_start_device;
    }
    return capture_noError;
}

CaptureErrors Capture::stopCapture()
{
    if (!mInited)
        return capture_not_inited;

    if (mIsCustomSourceDeviceEnabled)
    {
        mIsCustomSourceDeviceEnabled = false;
        mInited = false;
        return capture_noError;
    }

    ma_device_uninit(&device);
    mInited = false;
    return capture_noError;
}

float waveData[256];
float *Capture::getWave()
{
    int n = CAPTURE_BUFFER_SIZE >> 8;
    for (int i = 0; i < 256; i++)
    {
        waveData[i] = (capturedBuffer[i * n] +
                       capturedBuffer[i * n + 1] +
                       capturedBuffer[i * n + 2] +
                       capturedBuffer[i * n + 3]) /
                      n;
    }
    return waveData;
}

bindings_capture.cpp:

...

    FFI_PLUGIN_EXPORT enum CaptureErrors initCapture(int deviceID)
    {
        CaptureErrors res = capture.init(deviceID);
        return res;
    }

    FFI_PLUGIN_EXPORT enum CaptureErrors updateCustomCaptureData(const void *pInput, int frameCount)
    {
        return capture.updateCustomSourceData(pInput, frameCount);
    }

    FFI_PLUGIN_EXPORT void disposeCapture()
    {
        capture.dispose();
    }
 ...

bindings_capture_ffi:

...
  ///
  CaptureErrors initCapture(int deviceID) {
    final e = _initCapture(deviceID);
    return CaptureErrors.values[e];
  }

  late final _initCapturePtr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int)>>('initCapture');
  late final _initCapture = _initCapturePtr.asFunction<int Function(int)>();

  ///
  CaptureErrors updateCustomCaptureData(ffi.Pointer<ffi.Float> data, int size) {
    final e = _updateCustomCaptureData(data, size);
    return CaptureErrors.values[e];
  }

  late final _updateCustomCaptureDataPtr = _lookup<
          ffi
          .NativeFunction<ffi.Int32 Function(ffi.Pointer<ffi.Float>, ffi.Int)>>(
      'updateCustomCaptureData');
  late final _updateCustomCaptureData = _updateCustomCaptureDataPtr
      .asFunction<int Function(ffi.Pointer<ffi.Float>, int)>();

  void disposeCapture() {
    return _disposeCapture();
  }

  late final _disposeCapturePtr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>('disposeCapture');
  late final _disposeCapture = _disposeCapturePtr.asFunction<void Function()>();
 ...

usage

 final samples = event.asbd.sampleCount;
        // debugPrint('samples : $samples');
// event.data is signed 16 bit pcm ,big endian, 2 channel,44100 format 
        final single = Uint8List.fromList(event.data);
        ByteData byteData = ByteData.view(single.buffer);
        final length = single.length ~/ 2;
        Float32List float32List = Float32List(length);
        for (var i = 0; i < length; i++) {
          int sample = byteData.getInt16(i * 2, Endian.big);
          final value = sample / (pow(2, 15) - 1);

          float32List[i] = value;
        }

        final blob = calloc<Float>(length);
        final blobBytes = blob.asTypedList(length);
        blobBytes.setAll(0, float32List);
        SoLoud().updateCustomCaptureData(blob.cast(), samples);
        calloc.free(blob);

need some transform for the raw data?
@alnitak plz help

Play and seek multiple sounds at the same time.

Hello,

I was very excited when I saw your library. Thank you very much for your improvements.

I have read your documentation and tried to understand it.

If I can, I have a question for you.

My application is an MP3 splitter, (splitting music into vocal, drum, bass, piano etc.)

All my media are the same length. I choose vocal.mp3 as the main sound and play the other sounds over this mp3 file (I use just_audio now).

My general problem here is that if I want to fast forward the song with the slider, there is a synchronization problem. Can I rewind the songs to the same seconds simultaneously with your library or is your library compatible for my project?

I am very sorry for taking your time but I have been trying to solve this synchronization problem for the last 3 days.

Ekran Resmi 2023-08-29 01 04 53

fix: Wrong error reported when trying to add a filter twice

Description

When accidentally trying to add a filter that has already been added, the exception thrown is SoLoudFilterNotFoundException.

This is because SoLoudController().soLoudFFI.addGlobalFilter(filterType.index) returns PlayerErrors.filterNotFound (12).

This could lead developers on a wild goose chase ("why is that filter not found?").

Steps To Reproduce

  1. Make a button that runs something like SoLoud.instance.addGlobalFilter(FilterType.freeverbFilter);
  2. Click it twice
  3. See error

Expected Behavior

A SoLoudFilterAlreadyAddedException is thrown. Or something similar.

Additional Context

This is not a high priority and not urgent.

fix: Init error on hot restart

Description

I'm instantiating the SoLoud.instance in a singleton class and calling init() when the singleton's constructor. When I hot reload the application, it throws a SoLoudPlayerAlreadyInitializedException (logs below). However, when I try to load assets, it throws the exception SoLoudNotInitializedException. This is preventing me from using the library.

Steps To Reproduce

  1. Create a singleton class and call SoLoud.instance.init()
  2. Hot restart the app

Expected Behavior

The previous instance should be refreshed and no init() error should occur

Logs

flutter: FINEST: 2024-04-27 12:22:15.502315: initialize() called
flutter: INFO: 2024-04-27 12:22:15.526642: Temporary directory initialized at /var/mobile/Containers/Data/Application/843B8881-FF5A-4429-AE75-B41CF54866E8/Library/Caches/SoLoudLoader-Temp-Files
flutter: FINEST: 2024-04-27 12:22:15.694999: _initEngine() called
flutter: FINEST: 2024-04-27 12:22:15.704450: main isolate received: {event: MessageEvents.initEngine, args: (), return: PlayerErrors.playerAlreadyInited (The player has already been inited!)}
flutter: SEVERE: 2024-04-27 12:22:15.706821: _initEngine() result: PlayerErrors.playerAlreadyInited (The player has already been inited!)
flutter: SEVERE: 2024-04-27 12:22:15.709483: _initEngine() failed with error: PlayerErrors.playerAlreadyInited (The player has already been inited!)
SoLoudNotInitializedException: SoLoud has not been initialized yet. Call `SoLoud.initialize()` first and await it, or await the `SoLoud.initialized` Future elsewhere. Alternately, you can check the synchronous `SoLoud.isInitialized` bool just before calling any SoLoud method

Code

// on app initialization
GetIt.instance.registerSingleton<SoLoudImpl>(SoLoudImpl());
import 'package:flutter/foundation.dart';
import 'package:flutter_soloud/flutter_soloud.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

class SoLoudImpl {
  final player = SoLoud.instance;

  SoLoudImpl() {
    try {
      player.init();
    } catch (e) {
      debugPrint(e.toString());
      Sentry.captureException(e);
    }
  }

  AudioSource? beep;

  /// Load assets
  Future<void> init() async {
    try {
      beep = await player.loadAsset(Audios.normalBeep);
    } catch (e) {
      debugPrint(e.toString());
    }
  }

  void dispose() {
    player.disposeAllSources();
  }

  void _play(AudioSource? source) {
    assert(source != null, 'AudioSource not initialized');
    if (source != null) {
      player.play(source);
    }
  }

  @override
  void playBeep() {
    _play(beep);
  }
}

feat: Simplified Recording Mechanism

Description

I try to record the input from the Microphone and pass it to a library to detect the pitch. ( https://github.com/techpotatoes/pitch_detector_dart`)
And to be honest. i am not able to do it. Its only a Pointer: address=0x7fa925708ce0
I am not able to get the values out of a ffi.Pointer<ffi.Pointer<ffi.Float>> and i have no idea what to do or even if its recording or not. Maybe i am doing something wrong in the initialization or something...
It would be great to have a method where i can recieve a list like:
[-0.012298583984375, -0.011810302734375, -0.011444091796875, -0.010650634765625, -0.011383056640625, ....

Maybe some kind of

    SoLoudCapture.instance.startCapture(
        listener: (List<double> values) => print(values),
        onError: (e) => print(e),
    );

Thanks

Windows compilation

Hello,

I'm looking forward to using this library, but I can't get the Windows module to compile. I am running into a number of errors.

Launching lib\main.dart on Windows in debug mode...
Building Windows application...
**************** SOLOUD CONFIGURE.CMAKE
[+] Build dynamic library enabled
[-] Build static library disabled
[-] Build C API disabled
[-] Build MiniAudio disabled
[-] Build demos disabled
[+] NULL backend enabled
[-] SDL2 backend disabled
[-] ALSA backend disabled
[-] CoreAudio backend disabled
[-] OpenSLES backend disabled
[-] XAudio2 backend disabled
[+] WINMM backend enabled
[-] WASAPI backend disabled
[-] Generate Glue disabled
**************** SOLOUD SRC.CMAKE 1
**************** SOLOUD SRC.CMAKE 2  soloud
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,22): error C2039: 'string': is not a member of 'std' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,28): error C2065: 'string': undeclared identifier [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,10): error C2923: 'std::vector': 'string' is not a valid template type argument for parameter '_Ty' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,10): error C2976: 'std::vector': too few template arguments [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,72): error C2955: 'std::vector': use of class template requires template argument list [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(272,22): warning C4245: 'return': conversion from 'int' to 'unsigned int', signed/unsigned mismatch [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(626,41): error C2440: 'initializing': cannot convert from 'std::vector' to 'std::vector<std::string,std::allocator<std::string>>' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(627,37): warning C4267: '=': conversion from 'size_t' to 'int', possible loss of data [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(631,24): warning C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup. See online help for details. [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(646,61): warning C4806: '==': unsafe operation: no value of type 'bool' promoted to type 'int' can equal the given constant [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\bindings.cpp(660,64): warning C4806: '==': unsafe operation: no value of type 'bool' promoted to type 'int' can equal the given constant [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,22): error C2039: 'string': is not a member of 'std' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,28): error C2065: 'string': undeclared identifier [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,10): error C2923: 'std::vector': 'string' is not a valid template type argument for parameter '_Ty' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,10): error C2976: 'std::vector': too few template arguments [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\filters/filters.h(51,72): error C2955: 'std::vector': use of class template requires template argument list [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\player.cpp(55,25): warning C4267: 'return': conversion from 'size_t' to 'int', possible loss of data [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\player.cpp(135,66): warning C4305: 'argument': truncation from '__int64' to '_Ty' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\player.cpp(135,57): warning C4309: 'argument': truncation of constant value [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
********\windows\flutter\ephemeral\.plugin_symlinks\flutter_soloud\src\player.cpp(229,35): warning C4305: '=': truncation from 'double' to 'float' [********\build\windows\plugins\flutter_soloud\flutter_soloud_plugin.vcxproj]
Exception: Build process failed.

Do you perhaps have any advice for me? Thank you

fix: Building project using Linux does not build the app

Description

When building a project importing the library it doesn't build the app so it can't be executed or even debuged :(

Steps To Reproduce

  1. Create a project using Ubuntu
  2. Import the flutter_soloud library
  3. Run the project
  4. here it is my log

Launching lib/main.dart on SM P613 in debug mode...

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':flutter_soloud:buildCMakeDebug[arm64-v8a]'.

com.android.ide.common.process.ProcessException: ninja: Entering directory `/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/android/.cxx/Debug/333x3t5f/arm64-v8a'
[1/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/common.cpp.o
[2/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/synth/basic_wave.cpp.o
[3/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/analyzer.cpp.o
[4/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_audiosource.cpp.o
[5/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_bus.cpp.o
[6/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_3d.cpp.o
[7/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_basicops.cpp.o
[8/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_filterops.cpp.o
[9/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_faderops.cpp.o
[10/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud.cpp.o
[11/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_getters.cpp.o
[12/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_voicegroup.cpp.o
[13/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_fader.cpp.o
[14/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp.o
FAILED: CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp.o
/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DFLUTTER_PLUGIN_IMPL -DWITH_MINIAUDIO -DWITH_NULL -Dflutter_soloud_plugin_EXPORTS -I../../../../../src/soloud/include -I../../../../../src/soloud/src -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -fvisibility=hidden -Wall -Wno-error -fPIC -std=gnu++14 -MD -MT CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp.o -MF CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp.o.d -o CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp.o -c /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp:1:
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.h:10:
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.h:21:
/snap/flutter/current/usr/include/c++/9/memory:121:25: error: cast from pointer to smaller type 'uintptr_t' (aka 'unsigned int') loses information
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp:646:57: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
if (player.mFilters.addGlobalFilter(filterType) == -1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~
/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings.cpp:660:60: warning: result of comparison of constant -1 with expression of type 'bool' is always false [-Wtautological-constant-out-of-range-compare]
if (player.mFilters.removeGlobalFilter(filterType) == -1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~
2 warnings and 1 error generated.
[15/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_setters.cpp.o
[16/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_fft_lut.cpp.o
[17/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_core_voiceops.cpp.o
[18/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp.o
FAILED: CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp.o
/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DFLUTTER_PLUGIN_IMPL -DWITH_MINIAUDIO -DWITH_NULL -Dflutter_soloud_plugin_EXPORTS -I../../../../../src/soloud/include -I../../../../../src/soloud/src -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -fvisibility=hidden -Wall -Wno-error -fPIC -std=gnu++14 -MD -MT CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp.o -MF CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp.o.d -o CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp.o -c /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/bindings_capture.cpp:11:
/snap/flutter/current/usr/include/c++/9/memory:121:25: error: cast from pointer to smaller type 'uintptr_t' (aka 'unsigned int') loses information
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[19/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/capture.cpp.o
[20/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_file.cpp.o
[21/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp.o
FAILED: CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp.o
/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DFLUTTER_PLUGIN_IMPL -DWITH_MINIAUDIO -DWITH_NULL -Dflutter_soloud_plugin_EXPORTS -I../../../../../src/soloud/include -I../../../../../src/soloud/src -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -fvisibility=hidden -Wall -Wno-error -fPIC -std=gnu++14 -MD -MT CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp.o -MF CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp.o.d -o CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp.o -c /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.cpp:1:
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.h:21:
/snap/flutter/current/usr/include/c++/9/memory:121:25: error: cast from pointer to smaller type 'uintptr_t' (aka 'unsigned int') loses information
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[22/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/soloud/src/core/soloud_fft.cpp.o
[23/63] Building CXX object CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp.o
FAILED: CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp.o
/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/hto/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DFLUTTER_PLUGIN_IMPL -DWITH_MINIAUDIO -DWITH_NULL -Dflutter_soloud_plugin_EXPORTS -I../../../../../src/soloud/include -I../../../../../src/soloud/src -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -fvisibility=hidden -Wall -Wno-error -fPIC -std=gnu++14 -MD -MT CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp.o -MF CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp.o.d -o CMakeFiles/flutter_soloud_plugin.dir/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp.o -c /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp:2:
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.h:10:
In file included from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/filters/filters.h:21:
/snap/flutter/current/usr/include/c++/9/memory:121:25: error: cast from pointer to smaller type 'uintptr_t' (aka 'unsigned int') loses information
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/src/player.cpp:135:57: warning: implicit conversion from 'long long' to 'unsigned int' changes value from 9223372036854775807 to 4294967295 [-Wconstant-conversion]
std::uniform_int_distribution dist(0, INT64_MAX);
~~~~ ^~~~~~~~~
/snap/flutter/current/usr/include/stdint.h:124:22: note: expanded from macro 'INT64_MAX'

define INT64_MAX (__INT64_C(9223372036854775807))

                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/snap/flutter/current/usr/include/stdint.h:109:24: note: expanded from macro '__INT64_C'

define __INT64_C(c) c ## LL

                      ^~~~~~~

:348:1: note: expanded from here
9223372036854775807LL
^~~~~~~~~~~~~~~~~~~~~
1 warning and 1 error generated.
ninja: build stopped: subcommand failed.

C++ build system [build] failed while executing:
/home/hto/Android/Sdk/cmake/3.18.1/bin/ninja
-C
/home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/android/.cxx/Debug/333x3t5f/arm64-v8a
flutter_soloud_plugin
from /home/hto/.pub-cache/hosted/pub.dev/flutter_soloud-1.2.4/android

  • Try:

Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.

BUILD FAILED in 28s
Exception: Gradle task assembleDebug failed with exit code 1

Exited (1).

Expected Behavior

Run the app in the android device connected to the computer.

Additional Context

I ask and maybe it's the NDK, I don't know what that is actually...

fix: same audio gets repeat again while playing from URL

Description

  • while playing a audio the normal behaviour of SoLoud is to check if there is cache for it or not and then play it, for some reason it is not working as expected

Steps To Reproduce

  • runs the basic example app and replace load from file to load from url

Expected Behavior

  • plays different sound on different url

docs: How to get getAudioTexture in specific time?

Hello.
Please suppose I have a wav file with duration of 6 seconds.
1.
I want to get frequencies and wave data at a specific time (for example 2.5 second after start). in fact I want to find maximum amplitude and its frequency at a specific time.
2.
I want to get frequencies and wave for a time duration (for example between 2.5 and 3.5 seconds).

How can I do it?

fix: A lot of RAM is needed

Description

I load a bunch of audiofiles.
Round about 35 mp3 files with round about 5MB per file a complete size of 180mb.
On Linux i can see, that the RAM usage goes ob from ~450MB to 3,1GB
On Android this leads to a shutdown of the app by the system

Steps To Reproduce

Load a lot of big files.

Expected Behavior

The RAM usage should not go up this high.

fix: Missing audio on playing a loaded url

Description

A clear and concise description of what the bug is.

Steps To Reproduce

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected Behavior

A clear and concise description of what you expected to happen.

Screenshots
image

If applicable, add screenshots to help explain your problem.

Additional Context

Add any other context about the problem here.
I am loading a url from firebase(printed in the above screenshot then calling play on the fetched url but there is no sound. Here is the exception.

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 'package:flutter_soloud/src/soloud.dart': Failed assertion: line 579 pos 11: '_activeSounds
E/flutter ( 5630): .where((sound) => sound.soundHash == ret.sound!.soundHash)
E/flutter ( 5630): .length ==
E/flutter ( 5630): 1': Sound is already loaded but missing from _activeSounds. This is probably a bug in flutter_soloud, please file.

docs: How to get value of frequencies?

Hello.
I want to plot a Line chart from frequency domain of a wav file (x-axis: Frequencies, y-axis: decibel values).
How can I get value of frequencies?

App getting crashed without throwing any error

main.dart

void main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await _getPermission();
    final audioPlayerService = AudioPlayerService();
    audioPlayerService.initialize();
    ....

audio_player_service.dart

class NewAudioPlayerService {
  static final NewAudioPlayerService _instance =
      NewAudioPlayerService._internal();
  factory NewAudioPlayerService() {
    return _instance;
  }
  NewAudioPlayerService._internal();

  final SoLoud _soLoud = SoLoud();
  SoundProps? _currentSound;

  Future<void> initialize() async {
    if (!_soLoud.isIsolateRunning()) {
      final result = await _soLoud.startIsolate();
      if (result != PlayerErrors.noError) {
        print('Error starting SoLoud isolate: $result');
        // Handle error accordingly
      }
    }
  }

  Future<void> play(String url) async {
    if (_currentSound != null) {
      final disposeResult = await _soLoud.disposeSound(_currentSound!);
      if (disposeResult != PlayerErrors.noError) {
        print('Error disposing current sound: $disposeResult');
        // Handle error accordingly
      }
    }

    final newSound = await SoloudTools.loadFromUrl(url);
    if (newSound == null) return;
    _currentSound = newSound;

    final playResult = await _soLoud.play(_currentSound!);
    if (playResult.error != PlayerErrors.noError) {
      print('Error playing sound: ${playResult.error}');
      // Handle error accordingly
    }
    _currentSound = playResult.sound;
  }

  void stop() {
    if (_currentSound != null) {
      _soLoud.stop(0);
      _currentSound = null;
    }
  }

  void dispose() {
    _soLoud.stopIsolate();
    _soLoud.stopCapture();
  }
}

the app is getting crashed when the audio player service being initialized with initialize function

logs while crashing

lost connection to device

docs: What does disposeSound actually do?

Description

I'm trying to understand (and hopefully document) the function of disposeSound. It seems that C++ SoLoud has no direct dispose() equivalent. The closest I could find is the destructor (AudioSource::~AudioSource()) in soloud_audiosource.cpp:208, which just calls stop(), which in turn calls Soloud::stopAudioSource(), which calls stopVoice_internal(). I'm not sure if we're calling this from Dart via FFI at all.

My question is: when my game plays 10 songs in a row, do all these songs just stay in (C++) memory forever? I'm assuming their data is not in memory (because LoadMode.disk) but still.

From what I can understand, our disposeSound() only removes the AudioSource from activeSounds (on the Dart side) and from sounds (on the Player / player.cpp) side. No SoLoud API is called. (Or is the destructor called because the ActiveSound is erased from the sounds vector?)

feat: Find a better mechanism than the `audioEvent` stream for listening to changes in the engine

Description

From #31 (comment):

Find a better way to expose SoLoud().audioEvent stream. Now it is set as a broadcast inside a singleton class. Is it worth considering moving the event stream flow to a dedicated class? Now the developer can subscribe to it (like I did wrongly) and then he needs to remove that subscription, which is not possible IIRC with a broadcast.

One relatively simple solution ("A") would be to use ValueNotifier or ChangeNotifier or Listenable. These are synchronous and don't have the issues that broadcast streams have. There's less language support for those, though. The code would look like this:

final soloud = SoLoud();

soloud.captureRunning.addListener(_handleCaptureChange);

...

soloud.captureRunning.removeListener(_handleCaptureChange);

Another (half-) solution ("B") is already in the API changes propsals: "Expose a Future<void> or Future<bool> that notifies when SoLoud is initialized". This would make it easier to await engine initialization, and so audioEvent would not be needed for the vast majority of use cases.

    final soloud = SoLoud();
    await soloud.initialize();
    
    // Elsewhere:
    await soloud.ready;
    ... do stuff ...

Yet another solution ("C") would be to allow registering callbacks upon SoLoud construction. This solution is closely related to #35. Something like:

final engine = SoLoud(
  onCaptureStarted: () {
    ...
  },
);

And the last solution ("D") that comes to mind is to change audioEvents to a normal (single-subscriber, non-broadcast) stream. These are much easier to reason about, and throw when more than one subscriber wants to subscribe. Normal streams also automatically close when the (single) subscriber stops listening, and they "keep" all events (you can't miss any event).

This option could either have the same or similar API (except there would be a big warning that only one subscriber can subscribe), or it could be something similar as option "C", where only the caller of the constructor or the initialize() method can get a hold of the stream.

    final soloud = SoLoud();
    try {
      final result = await soloud.initialize();
      _lifecycleSubscription = result.lifecycleStream.listen(_handleLifecycleEvent);
    } on SoLoudInitializationError catch (e) {
      // ...
    }

    ...

    // In dispose.
    _lifecycleSubscription.cancel();

My current position is to start with option "B". Let people listen to all audio engine events if they want to, but remove the most important reason by making it much easier to just check whether the engine is ready.

fix: A constant stream of messages in console

Description

I replaced in my App "audioplayers" with SoLoud and it works realy great.
But on Android there is a permanent Stream of Messages in the console and the performance is bad so i think i did something wromg or there is a problem.
The message is

V/AudioTrack(28092): processAudioBuffer(5684): obtainBuffer(30) returned 882 = 30 + 852 err 0
V/AudioTrack(28092): processAudioBuffer(5684): obtainBuffer(882) returned 852 = 852 + 0 err 0
V/AudioTrack(28092): processAudioBuffer(5684): obtainBuffer(882) returned 852 = 852 + 0 err 0
V/AudioTrack(28092): processAudioBuffer(5684): obtainBuffer(30) returned 0 = 0 + 0 err -11

Steps To Reproduce

  1. add SoLoud to my Project
  2. Init in main
void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SoLoud().startIsolate().then((PlayerErrors value) {
    if (value != PlayerErrors.noError) {
      return;
    }
  });
[...]

  1. See Massage in console.

Expected Behavior

Expect no messages

Screenshots

grafik

Additional Context

Developing under Linux for Android.

feat: Fail-fast more often

NOTE: This is meant as a discussion thread, at least at first. How far do we want to go on the "keep on trucking" โ†โ†’ "fail fast" scale?

Description

In general, I think it would be best if flutter_soloud started to Fail Fast more. Right now, the plugin is very forgiving, and "keeps on trucking" even when there's a severe problem.

Although I agree that an audio plugin can be a bit more lenient (after all, for most apps and games, not hearing one of the sounds is preferable to experiencing a crash), I think a nudge towards more fail-fast approach would be helpful.

For example, the AssetsManager.getAssetFile() method keeps on trucking when there's any error during asset loading, and merely returns a null (and logs a severe warning). Here. This makes it really hard to debug โ€” the developer might not notice the warning (or it might not even get printed to the console). And a problem when loading an asset seems like something the developer would want to address ASAP.

More tenuously, I'd say that some PlayerErrors should not be returned normally, but should be thrown. The developer can always use the standard try / catch / finally block, instead of reimplementing it manually (with if / else).

// Proposed API usage.

try {
  setState(() => _playerReady = false);
  final sound = await soloud.loadFile('...');
  await soloud.play(sound);
} on SoloudFileException {
  setState(() => _error = "File couldn't be loaded!");
} on SoloudException catch (e) {
  setState(() => _error = "Couldn't play: $e");
} finally {
  setState(() => _playerReady = true);
}

This kind of approach also means that the returns from various methods can be much simpler. For example, SoLoud.loadFile() can "just" return SoundProps? (or even non-nullable SoundProps). The various exceptions are thrown instead of being returned as part of a record.

bug: crash on deinit()

Description

Calling init() and immediately after deinit() causes a random crash on some Android versions.

Steps To Reproduce

  1. Run something similar to this:
for (var i = 0; i < 100; i++) {
  await SoLoud.instance.init();
  SoLoud.instance.deinit();
}
  1. expect a crash

Additional Context

Test passed on:
emulator - Android 14 API 34
emulator - Android 13 API 33
emulator - Android 12L API 32
emulator - Android 12 API 31
emulator - Android 11 API 30
Samsung Galaxy Note20 Ultra - Android 13 API 33
Samsung Galaxy Note10+ - Android 12 API 31,32
Samsung Galaxy S9+ - Android 10 API 29

Test NOT passed on:
emulator - Android 10 API 29
Xiaomi Mi Max 3 - Android 10 API 29
Huawei P smart Z - Android 10 API 29
Xiaomi Mi 6 - Android 9 SDK 28

Here the error log

I/flutter (10278): [FINEST] flutter_soloud.SoLoud: init() called
I/flutter (10278): [FINEST] flutter_soloud.SoLoudLoader: initialize() called
I/flutter (10278): [FINE] flutter_soloud.SoLoudLoader: Loader has already been initialized. Not
I/flutter (10278): initializing again.
I/flutter (10278): [FINEST] flutter_soloud.SoLoud: _initEngine() called
D/miniaudio(10278): DEBUG: WASAPI backend is disabled.
D/miniaudio(10278): DEBUG: DirectSound backend is disabled.
D/miniaudio(10278): DEBUG: WinMM backend is disabled.
D/miniaudio(10278): DEBUG: Core Audio backend is disabled.
D/miniaudio(10278): DEBUG: sndio backend is disabled.
D/miniaudio(10278): DEBUG: audio(4) backend is disabled.
D/miniaudio(10278): DEBUG: OSS backend is disabled.
D/miniaudio(10278): DEBUG: PulseAudio backend is disabled.
D/miniaudio(10278): DEBUG: ALSA backend is disabled.
D/miniaudio(10278): DEBUG: JACK backend is disabled.
D/miniaudio(10278): DEBUG: Attempting to initialize AAudio backend...
D/miniaudio(10278): DEBUG: Loading library: libaaudio.so
D/miniaudio(10278): DEBUG: Loading symbol: AAudio_createStreamBuilder
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_delete
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setDeviceId
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setDirection
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setSharingMode
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setFormat
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setChannelCount
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setSampleRate
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setBufferCapacityInFrames
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setFramesPerDataCallback
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setDataCallback
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setErrorCallback
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setPerformanceMode
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setUsage
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setContentType
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setInputPreset
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_setAllowedCapturePolicy
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStreamBuilder_openStream
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_close
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getState
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_waitForStateChange
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getFormat
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getChannelCount
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getSampleRate
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getBufferCapacityInFrames
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getFramesPerDataCallback
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_getFramesPerBurst
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_requestStart
D/miniaudio(10278): DEBUG: Loading symbol: AAudioStream_requestStop
D/miniaudio(10278): DEBUG: System Architecture:
D/miniaudio(10278): DEBUG:   Endian: LE
D/miniaudio(10278): DEBUG:   SSE2:   NO
D/miniaudio(10278): DEBUG:   AVX2:   NO
D/miniaudio(10278): DEBUG:   NEON:   YES
I/AAudio  (10278): AAudioStreamBuilder_openStream() called ----------------------------------------
I/AudioStreamBuilder(10278): rate   =  44100, channels  = 2, format   = 5, sharing = SH, dir = OUTPUT
I/AudioStreamBuilder(10278): device =      0, sessionId = -1, perfMode = 12, callback: ON with frames = 2048
I/AudioStreamBuilder(10278): usage  =      0, contentType = 0, inputPreset = 0, allowedCapturePolicy = 0
D/        (10278): PlayerBase::PlayerBase()
D/AudioStreamTrack(10278): open(), request notificationFrames = 2048, frameCount = 6144
W/AudioTrack(10278): createTrack_l(111): AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount 6144 -> 6144
W/AudioStreamTrack(10278): open() flags changed from 0x00000104 to 0x00000000
W/AudioStreamTrack(10278): open() perfMode changed from 12 to 10
I/AAudio  (10278): AAudioStreamBuilder_openStream() returns 0 = AAUDIO_OK for s#9 ----------------
D/miniaudio(10278): INFO: [AAudio]
D/miniaudio(10278): INFO:    (Playback)
D/miniaudio(10278): INFO:     Format:      32-bit IEEE Floating Point -> 32-bit IEEE Floating Point
D/miniaudio(10278): INFO:     Channels:    2 -> 2
D/miniaudio(10278): INFO:     Sample Rate: 44100 -> 44100
D/miniaudio(10278): INFO:     Buffer Size: 2048*3 (6144)
D/miniaudio(10278): INFO:     Conversion:
D/miniaudio(10278): INFO:       Pre Format Conversion:  NO
D/miniaudio(10278): INFO:       Post Format Conversion: NO
D/miniaudio(10278): INFO:       Channel Routing:        NO
D/miniaudio(10278): INFO:       Resampling:             NO
D/miniaudio(10278): INFO:       Passthrough:            YES
D/miniaudio(10278): INFO:       Channel Map In:         {CHANNEL_FRONT_LEFT CHANNEL_FRONT_RIGHT}
D/miniaudio(10278): INFO:       Channel Map Out:        {CHANNEL_FRONT_LEFT CHANNEL_FRONT_RIGHT}
D/AAudio  (10278): AAudioStream_requestStart(s#9) called --------------
D/        (10278): PlayerBase::start() from IPlayer
D/AAudio  (10278): AAudioStream_requestStart(s#9) returned 0 ---------
D/AudioStreamLegacy(10278): onAudioDeviceUpdate() devId 3 => 3
I/flutter (10278): [FINEST] flutter_soloud.SoLoud: main isolate received: {event:
I/flutter (10278): MessageEvents.initEngine, args: (), return: PlayerErrors.noError (No error)}
I/flutter (10278): [FINEST] flutter_soloud.SoLoud: _startLoop() called
I/flutter (10278): [FINEST] flutter_soloud.SoLoud: main isolate received: {event:
I/flutter (10278): MessageEvents.startLoop, args: (), return: ()}

/************* deinit ***************/
I/flutter (10278): [FINEST] flutter_soloud.SoLoud: deinit() called
D/AAudio  (10278): AAudioStream_close(s#9) called ---------------
F/libc    (10278): /home/deimos/FLUTTER/libs/flutter_soloud/src/soloud/src/backend/miniaudio/miniaudio.h:18849: void ma_device__read_frames_from_client(ma_device *, ma_uint32, void *): assertion "frameCount > 0" failed
F/libc    (10278): Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 10346 (AudioTrack), pid 10278 (.soloud.example)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Xiaomi/nitrogen/nitrogen:10/QKQ1.190910.002/V12.0.1.0.QEDMIXM:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2024-03-24 10:35:31+0100
pid: 10278, tid: 10346, name: AudioTrack  >>> flutter.soloud.example <<<
uid: 10978
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: '/home/deimos/FLUTTER/libs/flutter_soloud/src/soloud/src/backend/miniaudio/miniaudio.h:18849: void ma_device__read_frames_from_client(ma_device *, ma_uint32, void *): assertion "frameCount > 0" failed'
    x0  0000000000000000  x1  000000000000286a  x2  0000000000000006  x3  0000007043a3d760
    x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  0000000000000040
    x8  00000000000000f0  x9  93f4f948f118562d  x10 0000000000000001  x11 0000000000000000
    x12 fffffff0fffffbdf  x13 0000000065fff3e3  x14 001f80693de3fd37  x15 00006a70bd14a6f1
    x16 000000714e6b88c0  x17 000000714e694900  x18 00000070433a8000  x19 0000000000002826
    x20 000000000000286a  x21 00000000ffffffff  x22 0000007044c95310  x23 0100804010040101
    x24 00000070c3328520  x25 00000070c33284a0  x26 00000070c3328748  x27 0000000000000421
    x28 0000000000000009  x29 0000007043a3d800
    sp  0000007043a3d740  lr  000000714e6460c4  pc  000000714e6460f0
backtrace:
      #00 pc 00000000000830f0  /apex/com.android.runtime/lib64/bionic/libc.so (abort+160) (BuildId: 328a3518945f3e056fc055f1eea1cc35)
      #01 pc 000000000008348c  /apex/com.android.runtime/lib64/bionic/libc.so (__assert2+36) (BuildId: 328a3518945f3e056fc055f1eea1cc35)
      #02 pc 0000000000112fd8  /data/app/flutter.soloud.example-k-p97bVufhg8O0OMd1yCmA==/lib/arm64/libflutter_soloud_plugin.so (BuildId: 9c9a1df707a88fba36fd15ccb91011402568062a)
      #03 pc 0000000000112554  /data/app/flutter.soloud.example-k-p97bVufhg8O0OMd1yCmA==/lib/arm64/libflutter_soloud_plugin.so (BuildId: 9c9a1df707a88fba36fd15ccb91011402568062a)
      #04 pc 0000000000155370  /data/app/flutter.soloud.example-k-p97bVufhg8O0OMd1yCmA==/lib/arm64/libflutter_soloud_plugin.so (BuildId: 9c9a1df707a88fba36fd15ccb91011402568062a)
      #05 pc 000000000001db30  /system/lib64/libaaudio.so (aaudio::AudioStream::maybeCallDataCallback(void*, int)+208) (BuildId: 3b3e2eff2488e0adaa1ff63da687463b)
      #06 pc 0000000000024714  /system/lib64/libaaudio.so (aaudio::AudioStreamLegacy::callDataCallbackFrames(unsigned char*, int)+320) (BuildId: 3b3e2eff2488e0adaa1ff63da687463b)
      #07 pc 000000000002c3cc  /system/lib64/libaaudio.so (FixedBlockReader::processVariableBlock(unsigned char*, int)+200) (BuildId: 3b3e2eff2488e0adaa1ff63da687463b)
      #08 pc 0000000000024ef4  /system/lib64/libaaudio.so (aaudio::AudioStreamLegacy::processCallbackCommon(int, void*)+1168) (BuildId: 3b3e2eff2488e0adaa1ff63da687463b)
      #09 pc 000000000007d034  /system/lib64/libaudioclient.so (android::AudioTrack::processAudioBuffer()+3044) (BuildId: 36a8c3e1296b171698432326efcd874d)
      #10 pc 000000000007c220  /system/lib64/libaudioclient.so (android::AudioTrack::AudioTrackThread::threadLoop()+484) (BuildId: 36a8c3e1296b171698432326efcd874d)
      #11 pc 00000000000135bc  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+224) (BuildId: f52e94e6224d7e15faba92ee0326b191)
      #12 pc 00000000000c4cb8  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+140) (BuildId: 58119cd499c9126f89ff7f6888912397)
      #13 pc 00000000000e6890  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: 328a3518945f3e056fc055f1eea1cc35)
      #14 pc 0000000000084b6c  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 328a3518945f3e056fc055f1eea1cc35)
Lost connection to device.

Exited.

It seems that miniaudio doesn't wait for a buffer to be freed and AAudio gets closed before that.

add tools to make basic functionalities available inside the plugin

Maybe create a tools directory where different useful and repetitive functionalities are needed:
playFromFile
playFromAssets
playFromUrl #2

Also add methods to help the image compose from audio sample, the one used in visualizer.dart which is used to feed shader texture.

And we could also think to a spinAround method. Something like
void spinAround(DateTime timeStamp, double centerX, double centerY, double centerZ, double radius, Duration turnDuration)

Cannot find how to play recorded sound

Description

Even after reading the docs for a few hours. I can't find how to play recorded sound from microphone. There is no mention about how to play such recording in the docs.

Best I can find is this following excerpt: With the audio data it will be simple to do something like in the 1st example: but it's far from helpful.

flutter_localizations version conflict

Error msg:

Because no versions of flutter_soloud match >1.1.1 <2.0.0 and flutter_soloud 1.1.1 depends on intl ^0.18.1, flutter_soloud ^1.1.1 requires intl ^0.18.1.
And because every version of flutter_localizations from sdk depends on intl 0.18.0, flutter_soloud ^1.1.1 is incompatible with flutter_localizations from sdk.
So, because audio depends on both flutter_localizations from sdk and flutter_soloud ^1.1.1, version solving failed.

feat: WaveForm for complete Audiofile

Description

Its currently not possible to create a waveform of a complete audiofile.
This is an example of Audacity:
grafik

To create something like this, there has to be a method to get all values from the file.
At the moment there is only a way to get small parts of the currently playing audiopart.

Thanks

feat: Implement setProtectVoice()

Description

Up till now, I didn't realize that, in case there are more voices than available channels, the oldest playing sound will be stopped by SoLoud.

This could be a big problem in games, where the oldest playing sound is the background music, and where there are many sounds being played over each other all the time. It's easy to imagine that the player comes into a busy area, and suddenly music stops and never returns.

SoLoud's solution is Soloud.getProtectVoice(), Soloud.setProtectVoice().

Requirements

  • Introduce bool getProtectVoice(SoundHandle h) to SoLoud
  • Introduce void setProtectVoice(SoundHandle h, bool value) to SoLoud

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.