Code Monkey home page Code Monkey logo

sounds's Introduction

Sounds

Sounds is a Flutter package allowing you to play and record audio for both the android and ios platforms.

Sounds provides both a high level API and widgets for:

  • play audio
  • record audio

Sounds can be used to play a beep from an asset all the way up to implementing a complete media player.

The API is designed so you can use the supplied widgets or roll your own. The Sounds package supports playback from:

  • Assets
  • Files
  • URL

Documentation:

The primary documentation for Sounds is now hosted on gitbooks

pub version

Overview

The Sounds package is a Flutter package that provides audio recording and playback functionality for both the android and ios platforms.

Sounds provides both a high level api and widgets for recording and playback.

The api is designed so you can use the supplied widgets or roll your own.

The Sounds package supports playback from:

  • Assets
  • Files
  • URL
  • Native Streams (with sync).

Features

The Sounds package includes the following features

  • Play audio without any UI
  • Play audio using the built in SoundPlayerUI Widget.
  • Play audio using the OSs' Media Player
  • Roll your own UI utilising the Sounds api.
  • Record audio without any UI
  • Record audio using the builtin SoundRecorderUI Widget.
  • Roll your own Recording UI utilising the Sounds api.
  • Support for releasing/resuming resources when the app pauses/resumes.

The core classes are:

Class Usage
SoundPlayerUI A Flutter Widget Audio Player
SoundRecorderUI A Flutter Widget for recording
QuickPlay Plays an audio file without a UI.
SoudPlayer.noUI API to playback audio with fine grained control
SoundPlayer.withShadeUI API to playback audio using the OS's Shade (media player)
SoundRecorder API to record audio with fine grained control.
Track Container for audio used by all of the above classes.
MediaFormat Defines what MediaFormat is being used.
RecorderPlaybackController Flutter InheritedWidget used to co-ordinate Recording and Playback in a single UI.
Albums Play a sequence of Tracks via the OS's Shade (media player)

Help

Audio is a fundemental building block needed by almost every flutter project.

I'm looking to make Sounds the go to project for Flutter Audio with support for each of the Flutter supported platforms.

Sounds is a large and complex project which requires me to maintain multiple hardware platforms and test environments.

I greatly appreciate any contributions to the project which can be as simiple as providing feedback on the api or documentation.

See the Contributing section below for details.

Sponsorship

If you can't help out by directly contributing code maybe you could Sponsor me so I can spend more time improving Sounds.

Sounds is a large commitment and I'm maintaining several other dart related projects so any support would be greatly appreciated.

Key short term goals are:

  • Hire a graphics designer to improve the look of the widgets
  • Provide support for the web
  • Provide support for a wider range of Codecs
  • Provide support for streaming

If I can get enough sponsorship I intend hiring a grad to do a chunk of the dirty work so I can focus on some of the larger features such as Web Support.

You can find the purple heart Sponser button at the top of the page.

If you can't afford a coffee then show your support by 'liking' the Sounds project on the pub.dev site.

Documentation

Install

Wiki High level guide to using Sounds.

API Reference

Roadmap

See the Roadmap for details on the future of Sounds.

Contributing

See the Contributing guide for details on contributing to Sounds.

The key classes are:

Api classes

QuickPlay - instantly play an audio file (no ui). Perfect for the odd beep.

Track - Defines a track including the artist details and the audio media.

Album - play a collection of tracks via the OSs' audio UI.

SoundPlayer - provides an api for playing audio including pause/resume/seek.

SoundRecorder - api for recording audio.

Widgets

SoundPlayerUI - displays an HTML 5 style audio controller widget.

SoundRecorderUI - displays a recording widget.

RecorderPlaybackController - pairs a SoundPlayerUI and SoundRecorderUI to provide a co-ordinated recording/playback UI.

Note: there are some limitations on the supported MediaFormat. See the [MediaFormat] section below.

Demo

sounds's People

Contributors

ajmal-m-a avatar bensonwong avatar bsutton avatar coreycole avatar edman avatar ened avatar haideraltahan avatar hyochan avatar java-james avatar jonasfranz avatar jonids avatar justsoft avatar kltdwrds avatar magicaltux avatar mansya avatar matsu911 avatar mike-gallego avatar mrducnguyen avatar nachourpi avatar nicholas-vella avatar oliversd avatar phranck avatar relf108 avatar richardbushnell avatar tensunfree 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sounds's Issues

[HELP] play an audio stream in (near)realtime

Hi,

I have a project where I need to get in input the audio from the smartphone mic (or the headsets mic, if connected), and after applying some filtering to some frequency, I would like to play it in near-realtime in the headsets (if connected, or through the smartphone's speaker).

This can be achieved with your library? If yes, please could you give me some tip about the high level procedure? This great lib is quite big and I am getting a bit confused.

Thanks in advance!

[BUG] Error when closing and reopening app

Sounds Version :

1.0.0-beta.5


Severity

Error


Platforms you faced the error

Android Pixel 4a emulator running Android R+


Logs

I/flutter (10958): ══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
I/flutter (10958): The following NoSuchMethodError was thrown during a platform message callback:
I/flutter (10958): The getter 'name' was called on null.
I/flutter (10958): Receiver: null
I/flutter (10958): Tried calling: name
I/flutter (10958): 
I/flutter (10958): When the exception was thrown, this was the stack:
I/flutter (10958): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
I/flutter (10958): #1      Audio.toString (package:sounds_common/src/media_format/audio.dart:312:44)
I/flutter (10958): #2      _StringBase._interpolate (dart:core-patch/string_patch.dart:848:19)
I/flutter (10958): #3      Track.toString (package:sounds_common/src/track.dart:49:59)
I/flutter (10958): #4      _StringBase._interpolate (dart:core-patch/string_patch.dart:848:19)
I/flutter (10958): #5      SoundPlayer._onSystemAppResumed (package:sounds/src/sound_player.dart:549:14)
I/flutter (10958): #6      onSystemAppResumed (package:sounds/src/sound_player.dart:883:55)
I/flutter (10958): #7      PlayerBasePlugin.onSystemAppResumed.<anonymous closure> (package:sounds/src/plugins/player_base_plugin.dart:281:7)
I/flutter (10958): #8      BasePlugin.forEachSlot (package:sounds/src/plugins/base_plugin.dart:173:15)
I/flutter (10958): #9      PlayerBasePlugin.onSystemAppResumed (package:sounds/src/plugins/player_base_plugin.dart:277:5)
I/flutter (10958): #10     BasePlugin.didChangeAppLifecycleState (package:sounds/src/plugins/base_plugin.dart:69:9)
I/flutter (10958): #11     WidgetsBinding.handleAppLifecycleStateChanged (package:flutter/src/widgets/binding.dart:671:16)
I/flutter (10958): #12     ServicesBinding._handleLifecycleMessage (package:flutter/src/services/binding.dart:190:5)
I/flutter (10958): #13     BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:76:49)
I/flutter (10958): #14     _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:260:33)
I/flutter (10958): <asynchronous suspension>
I/flutter (10958): #15     _invoke3.<anonymous closure> (dart:ui/hooks.dart:282:15)
I/flutter (10958): #19     _invoke3 (dart:ui/hooks.dart:281:10)
I/flutter (10958): #20     _dispatchPlatformMessage (dart:ui/hooks.dart:156:5)
I/flutter (10958): (elided 3 frames from dart:async)
I/flutter (10958): ════════════════════════════════════════════════════════════════════════════════════════════════════


To Reproduce
Steps to reproduce the behavior:

  1. App is open and playing audio
  2. Press the home button
  3. Reopen app
  4. Error is thrown in the console immediately. but the audio plays normally.

PCM Support for Android and iOS

Is your feature request related to a problem? Please describe.
I would really like to switch from flutter sound to sounds, but I need support for recording and playing PCM (Wav). Is there a plan when this codec will be available in sounds? The Google Speech Api only supports wav and flac and for this reason I need one of these codecs. Sounds also only requires minSdk version 16 and not 24 like flutter sounds, which is one of the main reasons why I would like to switch to sounds.

Describe the solution you'd like
PCM / Flac support for Android und iOS (Recording and Playing)

Additional context
PCM / Flac support is already available in flutter sounds. Maybe there is a way to merge this into sounds?

[BUG] Player is not playing while seeking

Sounds Version :

^1.0.0-beta.7


Severity

  • Minor issue

Platforms you faced the error

Android pixel 3a emulator.


Logs

E/flutter (18016): [ERROR:flutter/lib/ui/ui_dart_state.cc(171)] Unhandled Exception: Player is not playing.
E/flutter (18016): #0      SoundPlayer.pause (package:sounds/src/sound_player.dart:394:7)
E/flutter (18016): #1      SoundPlayer._onSystemPaused (package:sounds/src/sound_player.dart:521:5)
E/flutter (18016): #2      onSystemPaused (package:sounds/src/sound_player.dart:874:51)
E/flutter (18016): #3      SoundPlayerShadePlugin.onMethodCallback (package:sounds/src/plugins/sound_player_shade_plugin.dart:73:11)
E/flutter (18016): #4      BasePlugin._onMethodCallback (package:sounds/src/plugins/base_plugin.dart:96:12)
E/flutter (18016): #5      MethodChannel._handleAsMethodCall (package:flutter/src/services/platform_channel.dart:431:55)
E/flutter (18016): #6      MethodChannel.setMethodCallHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:384:34)
E/flutter (18016): #7      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:283:33)
E/flutter (18016): #8      _invoke3.<anonymous closure> (dart:ui/hooks.dart:282:15)
E/flutter (18016): #9      _rootRun (dart:async/zone.dart:1190:13)
E/flutter (18016): #10     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (18016): #11     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (18016): #12     _invoke3 (dart:ui/hooks.dart:281:10)
E/flutter (18016): #13     _dispatchPlatformMessage (dart:ui/hooks.dart:156:5)

flutter doctor :

[√] Flutter (Channel master, 1.21.0-8.0.pre.122, on Microsoft Windows [Version 10.0.19041.388], locale en-US)

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.1)
[√] Chrome - develop for the web
[!] Android Studio (not installed)
[√] Connected device (4 available)

! Doctor found issues in 1 category.

(using android studio beta, weird bug in flutter doctor)

flutter pub deps :

Dart SDK 2.10.0-4.0.dev.flutter-0341576448
Flutter SDK 1.21.0-8.0.pre.122

|-- animations 1.1.2
|   '-- flutter...
|-- async 2.5.0-nullsafety
|   '-- collection...
|-- bloc 6.0.1
|   '-- meta...
|-- blurhash 0.2.0
|   '-- flutter...
|-- blurhash_dart 0.2.3
|-- build_runner 1.10.2
|   |-- args 1.6.0
|   |-- async...
|   |-- build...
|   |-- build_config 0.4.2
|   |   |-- checked_yaml 1.0.2
|   |   |   |-- json_annotation...
|   |   |   |-- source_span...
|   |   |   '-- yaml...
|   |   |-- json_annotation...
|   |   |-- meta...
|   |   |-- path...
|   |   |-- pubspec_parse...
|   |   '-- yaml...
|   |-- build_daemon 2.1.4
|   |   |-- built_collection 4.3.2
|   |   |   |-- collection...
|   |   |   '-- quiver...
|   |   |-- built_value 7.1.0
|   |   |   |-- built_collection...
|   |   |   |-- collection...
|   |   |   |-- fixnum 0.10.11
|   |   |   '-- quiver...
|   |   |-- http_multi_server...
|   |   |-- logging...
|   |   |-- path...
|   |   |-- pedantic...
|   |   |-- pool...
|   |   |-- shelf...
|   |   |-- shelf_web_socket...
|   |   |-- stream_transform...
|   |   |-- watcher...
|   |   '-- web_socket_channel...
|   |-- build_resolvers 1.3.11
|   |   |-- analyzer...
|   |   |-- build...
|   |   |-- crypto...
|   |   |-- graphs...
|   |   |-- logging...
|   |   |-- package_config...
|   |   |-- path...
|   |   '-- pub_semver...
|   |-- build_runner_core 6.0.1
|   |   |-- async...
|   |   |-- build...
|   |   |-- build_config...
|   |   |-- build_resolvers...
|   |   |-- collection...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- graphs...
|   |   |-- json_annotation...
|   |   |-- logging...
|   |   |-- meta...
|   |   |-- package_config...
|   |   |-- path...
|   |   |-- pedantic...
|   |   |-- pool...
|   |   |-- timing...
|   |   |-- watcher...
|   |   '-- yaml...
|   |-- code_builder 3.4.0
|   |   |-- built_collection...
|   |   |-- built_value...
|   |   |-- collection...
|   |   |-- matcher...
|   |   '-- meta...
|   |-- collection...
|   |-- crypto...
|   |-- dart_style 1.3.6
|   |   |-- analyzer...
|   |   |-- args...
|   |   |-- path...
|   |   '-- source_span...
|   |-- glob 1.2.0
|   |   |-- async...
|   |   |-- collection...
|   |   |-- node_io 1.1.1
|   |   |   |-- node_interop 1.1.1
|   |   |   |   '-- js...
|   |   |   '-- path...
|   |   |-- path...
|   |   |-- pedantic...
|   |   '-- string_scanner...
|   |-- graphs 0.2.0
|   |-- http_multi_server 2.2.0
|   |   '-- async...
|   |-- io 0.3.4
|   |   |-- charcode...
|   |   |-- meta...
|   |   |-- path...
|   |   '-- string_scanner...
|   |-- js 0.6.2
|   |-- logging 0.11.4
|   |-- meta...
|   |-- mime 0.9.7
|   |-- path...
|   |-- pedantic...
|   |-- pool 1.4.0
|   |   |-- async...
|   |   '-- stack_trace...
|   |-- pub_semver 1.4.4
|   |   '-- collection...
|   |-- pubspec_parse 0.1.5
|   |   |-- checked_yaml...
|   |   |-- json_annotation...
|   |   |-- pub_semver...
|   |   '-- yaml...
|   |-- shelf 0.7.7
|   |   |-- async...
|   |   |-- collection...
|   |   |-- http_parser...
|   |   |-- path...
|   |   |-- stack_trace...
|   |   '-- stream_channel...
|   |-- shelf_web_socket 0.2.3
|   |   |-- shelf...
|   |   |-- stream_channel...
|   |   '-- web_socket_channel...
|   |-- stack_trace...
|   |-- stream_transform 1.2.0
|   |-- timing 0.1.1+2
|   |   '-- json_annotation...
|   |-- watcher...
|   |-- web_socket_channel 1.1.0
|   |   |-- async...
|   |   |-- crypto...
|   |   '-- stream_channel...
|   '-- yaml 2.2.1
|       |-- charcode...
|       |-- collection...
|       |-- source_span...
|       '-- string_scanner...
|-- cloud_firestore 0.13.7
|   |-- cloud_firestore_platform_interface 1.1.2
|   |   |-- collection...
|   |   |-- firebase_core...
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- cloud_firestore_web 0.1.1+2
|   |   |-- cloud_firestore_platform_interface...
|   |   |-- firebase 7.3.0
|   |   |   |-- http...
|   |   |   |-- http_parser...
|   |   |   '-- js...
|   |   |-- firebase_core...
|   |   |-- flutter...
|   |   |-- flutter_web_plugins 0.0.0
|   |   |   |-- characters...
|   |   |   |-- collection...
|   |   |   |-- flutter...
|   |   |   |-- meta...
|   |   |   |-- typed_data...
|   |   |   '-- vector_math...
|   |   |-- http_parser...
|   |   |-- js...
|   |   '-- meta...
|   |-- firebase_core 0.4.5
|   |   |-- firebase_core_platform_interface 1.0.4
|   |   |   |-- flutter...
|   |   |   |-- meta...
|   |   |   |-- plugin_platform_interface...
|   |   |   '-- quiver...
|   |   |-- firebase_core_web 0.1.1+2
|   |   |   |-- firebase...
|   |   |   |-- firebase_core_platform_interface...
|   |   |   |-- flutter...
|   |   |   |-- flutter_web_plugins...
|   |   |   |-- js...
|   |   |   '-- meta...
|   |   |-- flutter...
|   |   '-- meta...
|   |-- flutter...
|   '-- meta...
|-- connectivity 0.4.9
|   |-- connectivity_for_web 0.3.1
|   |   |-- connectivity_platform_interface...
|   |   |-- flutter...
|   |   '-- flutter_web_plugins...
|   |-- connectivity_macos 0.1.0+3
|   |   '-- flutter...
|   |-- connectivity_platform_interface 1.0.6
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- flutter...
|   '-- meta...
|-- data_connection_checker 0.3.4
|-- dio 3.0.10
|   |-- http_parser 3.1.4
|   |   |-- charcode...
|   |   |-- collection...
|   |   |-- source_span...
|   |   |-- string_scanner...
|   |   '-- typed_data...
|   '-- path 1.8.0-nullsafety
|-- dotted_border 1.0.6
|   |-- flutter...
|   '-- path_drawing 0.4.1
|       |-- flutter...
|       |-- meta...
|       |-- path_parsing 0.1.4
|       |   |-- meta...
|       |   '-- vector_math...
|       '-- vector_math...
|-- equatable 1.2.3
|   |-- collection...
|   '-- meta...
|-- firebase_auth 0.16.1
|   |-- firebase_auth_platform_interface 1.1.8
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- firebase_auth_web 0.1.3+1
|   |   |-- firebase...
|   |   |-- firebase_auth_platform_interface...
|   |   |-- flutter...
|   |   |-- flutter_web_plugins...
|   |   |-- http_parser...
|   |   |-- js...
|   |   '-- meta...
|   |-- firebase_core...
|   |-- flutter...
|   '-- meta...
|-- firebase_crashlytics 0.1.4+1
|   |-- flutter...
|   '-- stack_trace 1.10.0-nullsafety
|       '-- path...
|-- firebase_dynamic_links 0.5.3
|   '-- flutter...
|-- flutter 0.0.0
|   |-- characters 1.1.0-nullsafety.2
|   |-- collection 1.15.0-nullsafety.2
|   |-- meta...
|   |-- sky_engine 0.0.99
|   |-- typed_data 1.3.0-nullsafety.2
|   |   '-- collection...
|   '-- vector_math 2.1.0-nullsafety.2
|-- flutter_bloc 6.0.1
|   |-- bloc...
|   |-- flutter...
|   '-- provider...
|-- flutter_blurhash 0.5.0
|   |-- flutter...
|   '-- meta...
|-- flutter_downloader 1.5.0
|   '-- flutter...
|-- flutter_test 0.0.0
|   |-- async...
|   |-- boolean_selector 2.1.0-nullsafety
|   |   |-- source_span...
|   |   '-- string_scanner...
|   |-- characters...
|   |-- charcode 1.2.0-nullsafety
|   |-- clock 1.1.0-nullsafety
|   |-- collection...
|   |-- fake_async 1.1.0-nullsafety
|   |   |-- clock...
|   |   '-- collection...
|   |-- flutter...
|   |-- matcher 0.12.10-nullsafety
|   |   '-- stack_trace...
|   |-- meta...
|   |-- path...
|   |-- source_span 1.8.0-nullsafety
|   |   |-- charcode...
|   |   |-- collection...
|   |   |-- path...
|   |   '-- term_glyph...
|   |-- stack_trace...
|   |-- stream_channel 2.1.0-nullsafety
|   |   '-- async...
|   |-- string_scanner 1.1.0-nullsafety
|   |   |-- charcode...
|   |   '-- source_span...
|   |-- term_glyph 1.2.0-nullsafety
|   |-- test_api 0.2.19-nullsafety
|   |   |-- async...
|   |   |-- boolean_selector...
|   |   |-- collection...
|   |   |-- matcher...
|   |   |-- meta...
|   |   |-- path...
|   |   |-- source_span...
|   |   |-- stack_trace...
|   |   |-- stream_channel...
|   |   |-- string_scanner...
|   |   '-- term_glyph...
|   |-- typed_data...
|   '-- vector_math...
|-- flutter_widgets 0.1.12
|   |-- collection...
|   |-- flutter...
|   |-- html 0.14.0+3
|   |   |-- csslib 0.16.2
|   |   |   '-- source_span...
|   |   '-- source_span...
|   |-- meta...
|   '-- quiver 2.1.3
|       |-- matcher...
|       '-- meta...
|-- google_fonts 1.1.0
|   |-- crypto...
|   |-- flutter...
|   |-- http 0.12.2
|   |   |-- http_parser...
|   |   |-- path...
|   |   '-- pedantic...
|   |-- path_provider...
|   '-- pedantic...
|-- google_sign_in 4.5.1
|   |-- flutter...
|   |-- google_sign_in_platform_interface 1.1.2
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- quiver...
|   |-- google_sign_in_web 0.9.1+1
|   |   |-- flutter...
|   |   |-- flutter_web_plugins...
|   |   |-- google_sign_in_platform_interface...
|   |   |-- js...
|   |   '-- meta...
|   '-- meta...
|-- hive 1.4.3
|   |-- crypto...
|   '-- meta...
|-- hive_flutter 0.3.1
|   |-- flutter...
|   |-- hive...
|   |-- path...
|   '-- path_provider...
|-- hive_generator 0.7.1
|   |-- analyzer 0.39.17
|   |   |-- _fe_analyzer_shared 7.0.0
|   |   |   '-- meta...
|   |   |-- args...
|   |   |-- charcode...
|   |   |-- cli_util 0.2.0
|   |   |   '-- path...
|   |   |-- collection...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- html...
|   |   |-- meta...
|   |   |-- package_config 1.9.3
|   |   |   |-- charcode...
|   |   |   '-- path...
|   |   |-- path...
|   |   |-- pub_semver...
|   |   |-- source_span...
|   |   |-- watcher...
|   |   '-- yaml...
|   |-- build 1.3.0
|   |   |-- analyzer...
|   |   |-- async...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- logging...
|   |   |-- meta...
|   |   '-- path...
|   |-- dartx 0.5.0
|   |   |-- characters...
|   |   |-- collection...
|   |   |-- crypto...
|   |   |-- meta...
|   |   |-- path...
|   |   '-- time 1.3.0
|   |-- hive...
|   '-- source_gen 0.9.6
|       |-- analyzer...
|       |-- async...
|       |-- build...
|       |-- dart_style...
|       |-- glob...
|       |-- meta...
|       |-- path...
|       |-- pedantic...
|       '-- source_span...
|-- howler 1.1.2
|   '-- swiss_knife 2.5.8
|       |-- intl...
|       '-- resource_portable 2.1.7
|           '-- typed_data...
|-- html_unescape 1.0.1+3
|-- meta 1.3.0-nullsafety.2
|-- network_image_to_byte 0.0.1
|   '-- flutter...
|-- path_provider 1.6.11
|   |-- flutter...
|   |-- path_provider_linux 0.0.1+2
|   |   |-- flutter...
|   |   |-- path...
|   |   |-- path_provider_platform_interface...
|   |   '-- xdg_directories 0.1.0
|   |       |-- flutter...
|   |       |-- path...
|   |       '-- process 3.0.13
|   |           |-- file 5.2.1
|   |           |   |-- intl...
|   |           |   |-- meta...
|   |           |   '-- path...
|   |           |-- intl...
|   |           |-- meta...
|   |           |-- path...
|   |           '-- platform...
|   |-- path_provider_macos 0.0.4+3
|   |   '-- flutter...
|   '-- path_provider_platform_interface 1.0.2
|       |-- flutter...
|       |-- meta...
|       |-- platform 2.2.1
|       '-- plugin_platform_interface 1.0.2
|           '-- meta...
|-- pedantic 1.9.2
|   '-- meta...
|-- preload_page_view 0.1.4
|   '-- flutter...
|-- provider 4.3.2
|   |-- collection...
|   |-- flutter...
|   '-- nested 0.0.4
|       '-- flutter...
|-- salsa_entities 0.0.0
|   |-- json_annotation 3.0.1
|   '-- meta...
|-- sounds 1.0.0-beta.7
|   |-- device_info 0.4.2+4
|   |   '-- flutter...
|   |-- flutter...
|   |-- flutter_spinkit 4.1.2+1
|   |   '-- flutter...
|   |-- meta...
|   |-- path...
|   |-- path_provider...
|   |-- provider...
|   |-- sounds_common 1.0.7
|   |   |-- flutter...
|   |   |-- intl 0.16.1
|   |   |   '-- path...
|   |   |-- logger 0.9.2
|   |   |-- meta...
|   |   |-- path...
|   |   |-- pedantic...
|   |   '-- uuid...
|   '-- uuid...
|-- string_validator 0.1.4
|-- transparent_image 1.0.0
|-- uni_links 0.4.0
|   '-- flutter...
|-- url_launcher 5.5.0
|   |-- flutter...
|   |-- url_launcher_linux 0.0.1+1
|   |   '-- flutter...
|   |-- url_launcher_macos 0.0.1+7
|   |   '-- flutter...
|   |-- url_launcher_platform_interface 1.0.7
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   '-- url_launcher_web 0.1.2
|       |-- flutter...
|       |-- flutter_web_plugins...
|       |-- meta...
|       |-- platform_detect 1.4.0
|       |   |-- meta...
|       |   '-- pub_semver...
|       '-- url_launcher_platform_interface...
|-- uuid 2.2.0
|   |-- convert 2.1.1
|   |   |-- charcode...
|   |   '-- typed_data...
|   '-- crypto 2.1.5
|       |-- collection...
|       |-- convert...
|       '-- typed_data...
'-- watcher 0.9.7+15
    |-- async...
    |-- path...
    '-- pedantic...


Describe the bug
For every Slider widget update, i seek the player. It happened to throw this error with no reference to my code.

SoundRecorder Documentation wrong

The sample code is handwritten and has not been actually verified.
When I actually ran it, I found two spelling errors that caused it to fail to compile.

In addition, this example cannot actually stop recording. I have to delete recorder.onStopped to recorder.stop().

Can you try to improve the source code of this document and example, thank you.

[pigeon] improve documentation

I'm trying to convert an existing project to pigeon using a federated model and I'm find the documentation a little sparse.

https://pub.dev/packages?q=sounds

Googling pigeon and dart shows links like:
https://www.reddit.com/r/WTF/comments/86n6w2/so_a_pigeon_with_a_dart_in_the_head_just_landed/

:D

I've posted a question on stackoverflow but suspect that @ gaaclarke is the only authority on pigeon at the moment.
https://stackoverflow.com/questions/64037971/using-dart-pigeon-in-a-federated-model

It would be good to see documentation that directly speaks to the federated model.

The documentation mentions:

Api's should be defined as an abstract class with either HostApi() or FlutterApi() as metadata. The former being for procedures that are defined on the host platform and the latter for procedures that are defined in Dart.

However this statement leaves you guessing as to exactly what this are meant for.

I'm guessing that:
HostApi defines the set of calls the dart code makes into the platform specific code.
FlutterApi defines the set of calls the platform code can make back into the dart code.

(I now see that the api doco does provide more info on these but they are important enough that I think they should be documented on the readme).

It would be useful to see a discussion around migrating an existing channel based project to pigeon.

I note there is a PR for supporting async. This suggests that async calls are not currently supported.
It also suggests that more detailed documentation around calls into the platform needs to be created to explain what a sync vs async call into the platform should look like on both sides of the interface.

It may be a little early in the dev process but I would also like to see a section listing and discussing each of the generated files and their specific use.

Develop Unit tests

We need to develop unit tests for several layers:

  • Platform channel calls
  • Dart API
  • Sounds Widgets.

[BUG] AppData\Local\Pub\Cache\hosted\pub.dartlang.org\sounds-0.9.2\.packages does not exist.

Sounds Version :

0.9.2


Severity

  • Cannot build my App

Platforms you faced the error

  • Android

Logs

C:\...\AppData\Local\Pub\Cache\hosted\pub.dartlang.org\sounds-0.9.2\.packages does not exist.
Did you run "flutter pub get" in this directory?


FAILURE: Build failed with an exception.

* Where:
Script 'C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 896

* What went wrong:
Execution failed for task ':sounds:compileFlutterBuildDebug'.
> Process 'command 'C:\flutter\bin\flutter.bat'' finished with non-zero exit value 1

* 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.

* Get more help at https://help.gradle.org

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

When I go to the C:\...\AppData\Local\Pub\Cache\hosted\pub.dartlang.org\sounds-0.9.2\ directory and run flutter pub get I get:

Cannot open file, path = 'C:\...\AppData\Local\Pub\Cache\global_packages\sounds\pubspec.lock' (OS Error: The system cannot find the path specified.
, errno = 3)

flutter doctor :

[√] Flutter (Channel beta, 1.20.0-7.2.pre, on Microsoft Windows [Version 10.0.19041.388], locale en-US)
    • Flutter version 1.20.0-7.2.pre at C:\flutter
    • Framework revision a2bde82fbd (7 days ago), 2020-07-18 15:16:35 -0700
    • Engine revision 60b269d898
    • Dart version 2.9.0 (build 2.9.0-21.2.beta)

 
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at C:\Users\marti\AppData\Local\Android\sdk
    • Platform android-29, build-tools 29.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 4.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] VS Code (version 1.47.2)
    • VS Code at C:\Users\marti\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.12.2

[√] Connected device (4 available)
    • SM N960U1 (mobile) • 276ade38b4217ece • android-arm64  • Android 10 (API 29)
    • Web Server (web)   • web-server       • web-javascript • Flutter Tools
    • Chrome (web)       • chrome           • web-javascript • Google Chrome 84.0.4147.89
    • Edge (web)         • edge             • web-javascript • Microsoft Edge 83.0.478.56


flutter pub deps :

Dart SDK 2.9.0-21.2.beta   
Flutter SDK 1.20.0-7.2.pre 
record_bloc_example 1.0.0+1
|-- bloc 6.0.1
|   '-- meta...
|-- equatable 1.2.2        
|   |-- collection...      
|   '-- meta...
|-- flutter 0.0.0
|   |-- characters 1.0.0   
|   |-- collection 1.14.13 
|   |-- meta 1.1.8
|   |-- sky_engine 0.0.99  
|   |-- typed_data 1.2.0   
|   |   '-- collection...  
|   '-- vector_math 2.0.8  
|-- flutter_bloc 6.0.1     
|   |-- bloc...
|   |-- flutter...
|   '-- provider 4.3.1     
|       |-- collection...  
|       |-- flutter...     
|       '-- nested 0.0.4   
|           '-- flutter... 
|-- flutter_test 0.0.0     
|   |-- async 2.4.2        
|   |   '-- collection...
|   |-- boolean_selector 2.0.0
|   |   |-- source_span...
|   |   '-- string_scanner...
|   |-- characters...
|   |-- charcode 1.1.3
|   |-- clock 1.0.1
|   |   '-- meta...
|   |-- collection...
|   |-- fake_async 1.1.0
|   |   |-- clock...
|   |   '-- collection...
|   |-- flutter...
|   |-- matcher 0.12.8
|   |   '-- stack_trace...
|   |-- meta...
|   |-- path...
|   |-- source_span 1.7.0
|   |   |-- charcode...
|   |   |-- collection...
|   |   |-- meta...
|   |   |-- path...
|   |   '-- term_glyph...
|   |-- stack_trace 1.9.5
|   |   '-- path...
|   |-- stream_channel 2.0.0
|   |   '-- async...
|   |-- string_scanner 1.0.5
|   |   |-- charcode...
|   |   |-- meta...
|   |   '-- source_span...
|   |-- term_glyph 1.1.0
|   |-- test_api 0.2.17
|   |   |-- async...
|   |   |-- boolean_selector...
|   |   |-- collection...
|   |   |-- matcher...
|   |   |-- meta...
|   |   |-- path...
|   |   |-- source_span...
|   |   |-- stack_trace...
|   |   |-- stream_channel...
|   |   |-- string_scanner...
|   |   '-- term_glyph...
|   |-- typed_data...
|   '-- vector_math...
|-- path_provider 1.6.11
|   |-- flutter...
|   |-- path_provider_linux 0.0.1+2
|   |   |-- flutter...
|   |   |-- path...
|   |   |-- path_provider_platform_interface...
|   |   '-- xdg_directories 0.1.0
|   |       |-- flutter...
|   |       |-- path...
|   |       '-- process 3.0.13
|   |           |-- file 5.2.1
|   |           |   |-- intl...
|   |           |   |-- meta...
|   |           |   '-- path...
|   |           |-- intl...
|   |           |-- meta...
|   |           |-- path...
|   |           '-- platform...
|   |-- path_provider_macos 0.0.4+3
|   |   '-- flutter...
|   '-- path_provider_platform_interface 1.0.2
|       |-- flutter...
|       |-- meta...
|       |-- platform 2.2.1
|       '-- plugin_platform_interface 1.0.2
|           '-- meta...
|-- permission_handler 5.0.1+1
|   |-- flutter...
|   |-- meta...
|   '-- permission_handler_platform_interface 2.0.1
|       |-- flutter...
|       |-- meta...
|       '-- plugin_platform_interface...
'-- sounds 0.9.2
    |-- device_info 0.4.2+4
    |   '-- flutter...
    |-- flutter...
    |-- flutter_spinkit 4.1.2+1
    |   '-- flutter...
    |-- meta...
    |-- path 1.7.0
    |-- path_provider...
    |-- provider...
    |-- sounds_common 1.0.6
    |   |-- flutter...
    |   |-- intl 0.16.1
    |   |   '-- path...
    |   |-- logger 0.7.0+2
    |   |-- meta...
    |   |-- path...
    |   |-- pedantic 1.9.0
    |   '-- uuid...
    '-- uuid 2.2.0
        |-- convert 2.1.1
        |   |-- charcode...
        |   '-- typed_data...
        '-- crypto 2.1.5
            |-- collection...
            |-- convert...
            '-- typed_data...

Screenshots

(If applicable, add screenshots to help explain your problem).


Describe the bug
In a new project, I can't deploy because of this. Just build and try to run.

Expected behavior
My App to build


Additional context**

Windows 10, VSCode. Tried changing flutter versions but not

[HELP] BackgroundAudioService causing problems with another package

I am using the Sounds package primarily for the recorder. I am not using the SoundPlayer (since it requires the file to be completely downloaded before playing, which isn't viable for a podcast app when the download delay could take 10+minutes), but am instead using a different audio player (audioplayers) and audio_service for the notification state. This appears to all be working fine, except for the media buttons in the notification state don't work because both audio_service (correctly) and sounds (incorrectly since I'm not using the player or shade player) are registering to the same media buttons which is causing errors.

Does anyone know how to prevent sounds from registering the background audio service/notification area so I can handle this with the audio_service package?

[HELP] - Unable to Start recording due to not getting permissions

I need Help for :

  • Debugging my App ?

I keep getting this error when trying to start recording:
Unhandled Exception: PlatformException(SoundRecorder, Permissions, Error setting the AudioSource. Check that you have permission to use the microphone.)

I've checked in the the _initializeAndRun() portion of the record method and it looks like its succeeding as hasPermissions is true, but then I get this error return and the recording does not begin. I haven't been able to figure out where this is sending from or what is triggering this (or how to get this to trigger and ask for permissions). I have added the necessary permissions to the AndroidManifest files.

Setting audio recording quality

I'm having some trouble changing the sampleRate and bitRate of recordings from their default values of 16000. If anyone has done this and could help me out I'd really appreciate it.

Here's my startRecording function, in which I set the mediaFormat including sampleRate/bitRate as shown in the SoundRecorder documentation:

Future<void> startRecording() async {
    try {
      String file = Track.tempFile(WellKnownMediaFormats.adtsAac);
      track = Track.fromFile(file,
          mediaFormat: AdtsAacMediaFormat(
            sampleRate: 48000,
            numChannels: 1,
            bitRate: 48000,
          ));
      await recorder.record(track);
      print('startRecorder: $track');

      setState(() => isRecording = true);
    } on RecorderException catch (err) {
      print('startRecorder error: $err');

      var error = SnackBar(
          backgroundColor: Colors.red,
          content: Text('Failed to start recording: $err'));
      Scaffold.of(context).showSnackBar(error);

      stopRecording();
      setState(() => isRecording = false);
    }
  }

Here's the relevant output:

I/flutter (21449): startRecorder:   audio: MediaFormat: adts/aacstorage: /data/user/0/com.example.mobile_prototype/code_cache/62b29fcf-987b-4cb7-912a-516a46965d40.aac path: /data/user/0/com.example.mobile_prototype/code_cache/62b29fcf-987b-4cb7-912a-516a46965d40.aac
D/SoundRecorder(21449): startRecorder: /data/user/0/com.example.mobile_prototype/code_cache/62b29fcf-987b-4cb7-912a-516a46965d40.aac
E/SensorManager(21449): registerListenerImpl sensorName:LSM6DS3 Accelerometer,isWakeUpSensor:false,callingApp: com.example.mobile_prototype,callingPid:21449,callingUid:10371
I/flutter (21449): 11 16:34:34.762 Debug base_plugin.dart : BasePlugin.invokeMethod : 114 ::: invokeMethod returned for startRecorder slot: 0
V/MediaRecorder(21449): constructor
V/MediaRecorder(21449): doCleanUp
V/MediaRecorder(21449): setListener
V/MediaRecorder(21449): setClientName
V/MediaRecorder(21449): reset
V/MediaRecorder(21449): doCleanUp
V/MediaRecorder(21449): setAudioSource(1)
V/MediaRecorder(21449): Call init() since the media recorder is not initialized yet
V/MediaRecorder(21449): init
V/MediaRecorder(21449): setOutputFormat(6)
V/MediaRecorder(21449): setAudioEncoder(3)
V/MediaRecorder(21449): setParameters(audio-param-number-of-channels=1)
V/MediaRecorder(21449): setParameters(audio-param-sampling-rate=16000)
V/MediaRecorder(21449): setParameters(audio-param-encoding-bitrate=16000)
V/MediaRecorder(21449): setOutputFile(78)
V/MediaRecorder(21449): prepare
E/MediaRecorder(21449): start 0 m_rotation
V/MediaRecorder(21449): start
E/SensorManager(21449): unregisterListenerImpl callingApp: com.example.mobile_prototype,callingPid:21449,callingUid:10371
V/MediaRecorder(21449): getMaxAmplitude
D/OnePlusJankManager(21449):  Chor uploadMDM JANK_TYPE_ONCE mViewTitle = com.example.mobile_prototype/com.example.mobile_prototype.MainActivity--- jank level = 1
V/MediaRecorder(21449): getMaxAmplitude

Gitbook seems not to be Free

Sounds uses Gitbook for its documentation.
The result is a documentation which is really clean and very usable.
I did not know this tool but I am now impressed by it.

But Gitbook does not seem to be free nor Open Source. This is really bad. Very bad for documenting a Free Software.
For me this is a crippling drawback and I suggest to look to others Free and Open Source alternatives.

Convert objective-c code to swift

sounds_swift.tar.gz

The current ios implementation is written in objective-c.

This is a language that the current dev team is not familiar with which makes maintenance difficult.

The dev team is also not familiar with swift however it is much closer to java and dart which the developers are familiar with.

The belief is that converting the code to swift will make long term maintenance simpler.

An initial conversion has been down using swiftify (converted files attache).

The converted files however need a fair bit of work (primarily around type conversions).

The sounds team have two related objectives:

Move to using Pigeon to provide a type safe implementation.

Move to a federated model to allow for the implementation of platform specific implementation by third party developers.

The swift migration should be done in the context of the above two objectives.

The aim is to do the android version first is this is in an environment that the development team is comfortable.
Once complete the swift migration would follow.

Works has been started to complete the conversion process (see master) (based on the attached swift files) but this conversion is likely to have broken the code base as the developer is not familiar with swift.

Can't play recorded track

i keep getting the Failed assertion: line 309 pos 12: 'track != null': is not true. error whenever i try to play my recorded track using Quickplay.fromTrack().
Here's a snippet of my code

String recording;
Track track;
Future<void> startRecording() async {
    recording = Track.tempFile(WellKnownMediaFormats.adtsAac);
    track =
        Track.fromFile(recording, mediaFormat: WellKnownMediaFormats.adtsAac);

    recorder.onRequestPermissions = (_) => requestPermissions();
    try { 
      await recorder.record(track);
      print(recorder.isRecording);
} catch(e)
 {
print(e);     
    }
}

After recording with the above method then i call the method below

Future<void> stopRecording() async {
    try {
      print(recorder.isRecording);
    
      await recorder.stop();
      print(track);
    } catch (error) {
      print(error);
    } finally { 
      QuickPlay.fromTrack(track);    
    }
  }

Note: All methods are in the same class.

Design an event model for app life cycle change and focus change

One of the key problems with flutter sound is that it isn't a good citizen in that it doesn't play well (no pun intended) with other media players nor with app life cycle.

Particularly on android the mediaplayer is considered heavy weight as it locks down hardware acceleration for audio. If I've understood correctly then if we don't release the media player then other players won't get the benefit of hardware acceleration and possibly won't be able to play at all.

With the TrackPlayer plugin we are essentially sharing the playback 'shade' (what I've referred to as the OSs' UI) with other apps.
If another app takes the focus we need to (or will be forced to) release the players UI.

So there are a number questions and design implications for this.

So I think there are four different use cases:

  1. play audio only when app is active, no OS ui
  2. play audio only when app is active, with OS ui
  3. play audio in background, no OS ui
  4. play audio in background, with OS ui.

I'm not certain I've got the terminology correct (input on this would be appreciated).

Active/InActive the application is active (in the foreground) or inactive (in the background).

Attached - We are attached (using) the OS ui. If we are attached AND focus then our audio is controllable via the OSs' ui. If we don't have focus we are still 'attached', our audio will continue to play (if it was playing before being detached) but will not be controllable via the OSs ui.

Focus - if we have focus then our audio is considered the primary audio.

Hush Others - if set and we have the focus other audio will be playing at a reduce volume. If hush others isn't set then even if we have focus other audio may be louder than ours.

Hush on call - If a call is received (or perhaps when started) we need to hush our audio. Do we completely pause the audio or just reduce the volume? Pause seems to be a better idea.
Should this be an option or enforced?

To implement the above controls we need to receive events from the OS level plugins including:

onActive
onInactive
onFocus
onDefocus
onCall

Lets look at each in turn:

If we are just playing audio onlywithout using the OS's ui then we

Possible api changes.

SoundPlayer.withUI({bool playInBackground = false})
SoundPlayer.noUI({bool playInBackground = false});

The SoundPlayer will monitor app activate/deactive lifecycle changes.

playInBackground = false;
If the app is deactivate then we will call 'stop' and release all resources and mark the seek position.
If the app is re-activated we will seek to the marked position, rewind 1 second and resume playing.

playInBackground = true;
We will ignore activation/deactivation events and the music will continue playing.

We could provide some convenience methods for our uses if they wanted some more specific control:

// BAD IDEA see below.
var player = SoundPlayer.withUI()
player.onDeactivated() => player.pause();
player.onActivated() => player.resume();

If we expose the onActivated/onDeactivated we need to consider resource management.
i.e. do we still call stop and free resources.
This feels like a bad idea as users will just forget to release the resources.
I think we just take control and automate the stop/resume logic.
Having said that the events may be a nice convenience but they can get them themselves and if we provide them we are likely to just increase confusion.

Attach/Detach - I don't think any action is required. I assume we can continue playing whilst detached and that we will simply loose the focus.
So should we provide an option to 'pause/resume' the audio on attached detach or just provide events.

I'm thinking we just provide events as below.

var player = SoundPlayer.withUI()
player.onDetached() => player.pause();
player.onAttach() => player.resume();

To handle incoming calls we could use the same callback model:

var player = SoundPlayer.withUI()
player.onCallCommenced() => player.pause();
player.onCallCompleted() { player.rewind(Duration); player.resume(); }

Add a rewind option to make it easy for a user to reposition the playback point

player.rewind(Duration)

[HELP] Play raw Opus frames from websocket stream

Hey, thanks for the great library, I'm really pleased with it!
I would like to ask for help related to these questions:

I'm streaming from my server raw Opus frames, without OGG or CAF container. Since iOS uses CAF instead of the standard OGG container, I'm trying to play the raw frames, so maybe somehow both of them can play my stream. But if necessary I can encapsulate it in a container.
Is it possible to play raw Opus? Or somehow play CAF/Opus on Android maybe?

My app receives audio data periodically through the websocket. I would like to redirect this audio stream to the player so it can play it continously. Is it somehow possible?

Thank you very much in advance!

Many irrelevant log messages (in 1.0.0.beta.11) and potential fix [BUG]

Sounds Version :

  • 1.0.0-beta.11
  • iOS emulator

Despite the recent fixes here: #27 sounds is still issuing loads of polluting debug messages:

entered updateProgress
sending updateProgress: {"duration": "418", "current_position": "83.33333333333333"}
entered updateProgress
sending updateProgress: {"duration": "418", "current_position": "182.6303854875283"}
entered updateProgress
audioPlayerDidFinishPlaying
stopping ProgressTimer

Attempts to fix

  • I use Log.loggingLevel = Level.nothing; in main().
  • I updated to sounds_common 1.0.8

(Note that beta.11 still uses sounds_common 1.0.6)

Source of messages

I've tracked the messages down to Soundplayer.m.

It has loads of NSLog statements.

These are synchronous calls (so may slow things down), and NSLog has no provision for logging levels.

Apple's docs suggest hiding them behind a DEBUG preprocessor macro.

Possible solutions

  • remove them all
  • try and hide them all behind a DEBUG preprocessor macro

[BUG] Can't run flutter pub get on this project

After cloning:

Because sounds_demo depends on sounds_common from path which doesn't exist (could not find package sounds_common at "..\..\sounds_common"), version solving failed.
Running "flutter pub get" in example...
pub get failed (66; Because sounds_demo depends on sounds_common from path which doesn't exist (could not find package sounds_common at "..\..\sounds_common"), version solving failed.)

What's going on here? Can't see anything wrong with pubspec myself

[BUG] - Unable to Build on iOS due to FFmpegPlugin

Sounds Version : latest (0.8.2)

  • FULL or LITE flavor ? Full version

Severity - High

  • Crash ? Prevents building app for iOS

  • Cannot build my App for iOS


Primary error: error: no visible @interface for 'FFmpegPlugin' declares the selector 'alloc' FFmpegPlugin* FFmpegPlugin = [[FFmpegPlugin alloc] init]; // The singleton

Logs

(This is very important. Most of the time we cannot do anything if we do not have information on your bug):

Running Xcode build...
Xcode build done.                                           82.0s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **


Xcode's output:
↳
    In file included from /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:24:
    In file included from /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.h:22:
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: note: insert '_Nullable' if the pointer may be null
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
                                                                 _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: note: insert '_Nonnull' if the pointer should never be null
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
                                                                 _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: note: insert '_Nullable' if the block pointer may be null
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
                                                                         _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: note: insert '_Nonnull' if the block pointer should never be null
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
                                                                         _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: note: insert '_Nullable' if the block pointer may be null
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
                                                                            _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
                                                                            _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: note: insert '_Nullable' if the block pointer may be null
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
                                                             _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
                                                             _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: note: insert '_Nullable' if the pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
                                   _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: note: insert '_Nonnull' if the pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
                                   _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: note: insert '_Nullable' if the pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
                                                         _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: note: insert '_Nonnull' if the pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
                                                         _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: note: insert '_Nullable' if the block pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
                                                                                                          _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
                                                                                                          _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: note: insert '_Nullable' if the block pointer may be null
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
                                                          _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
                                                          _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: note: insert '_Nullable' if the pointer may be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
                                                      _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: note: insert '_Nonnull' if the pointer should never be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
                                                      _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: note: insert '_Nullable' if the block pointer may be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
                                                                                   _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: note: insert '_Nonnull' if the block pointer should never be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
                                                                                   _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: note: insert '_Nullable' if the pointer may be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
                                                   _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: note: insert '_Nonnull' if the pointer should never be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
                                                   _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: note: insert '_Nullable' if the block pointer may be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
                                                                                _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: note: insert '_Nonnull' if the block pointer should never be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
                                                                                _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:276:55: warning: block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior [-Wimplicit-retain-self]
                                                          audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:nil];
                                                          ^
                                                          self->
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:277:55: warning: block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior [-Wimplicit-retain-self]
                                                          audioPlayer.delegate = self;
                                                          ^
                                                          self->
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:283:56: warning: block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior [-Wimplicit-retain-self]
                                                          [audioPlayer play];
                                                           ^
                                                           self->
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:439:39: warning: unused variable 'result' [-Wunused-variable]
                            FlutterResult result;
                                          ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:440:35: warning: block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior [-Wimplicit-retain-self]
                            bool b = [audioPlayer isPlaying];
                                      ^
                                      self->
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:127:17: warning: method definition for 'freeSlot:' not found [-Wincomplete-implementation]
    @implementation TrackPlayer
                    ^
    In file included from /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.m:24:
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/TrackPlayer.h:44:1: note: method 'freeSlot:' declared here
    - (void)freeSlot: (int)slotNo;
    ^
    18 warnings generated.
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/Track.m:61:19: warning: unused variable 'albumArtFileString' [-Wunused-variable]
            NSString *albumArtFileString = [responseObj objectForKey:@"albumArtFile"];
                      ^
    1 warning generated.
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/Sounds.m:24:9: warning: non-portable path to file '"FFmpegPlugin.h"'; specified path differs in case from file name on disk [-Wnonportable-include-path]
    #import "FfmpegPlugin.h"
            ^~~~~~~~~~~~~~~~
            "FFmpegPlugin.h"
    In file included from /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/Sounds.m:27:
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: note: insert '_Nullable' if the pointer may be null
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
                                                                 _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:33:60: note: insert '_Nonnull' if the pointer should never be null
    extern void SoundPlayerReg(NSObject<FlutterPluginRegistrar>* registrar);
                                                               ^
                                                                 _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: note: insert '_Nullable' if the block pointer may be null
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
                                                                         _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:70:56: note: insert '_Nonnull' if the block pointer should never be null
    - (void)seekToPlayer:(nonnull NSNumber*) time result: (FlutterResult)result;
                                                           ^
                                                                         _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: note: insert '_Nullable' if the block pointer may be null
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
                                                                            _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:71:59: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setSubscriptionDuration:(double)duration result: (FlutterResult)result;
                                                              ^
                                                                            _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: note: insert '_Nullable' if the block pointer may be null
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
                                                             _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:72:44: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setVolume:(double) volume result: (FlutterResult)result;
                                               ^
                                                             _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: note: insert '_Nullable' if the pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
                                   _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:31: note: insert '_Nonnull' if the pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                  ^
                                   _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: note: insert '_Nullable' if the pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
                                                         _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:53: note: insert '_Nonnull' if the pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                        ^
                                                         _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: note: insert '_Nullable' if the block pointer may be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
                                                                                                          _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:73:89: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setCategory: (NSString*)categ mode:(NSString*)mode options:(int)options result:(FlutterResult)result;
                                                                                            ^
                                                                                                          _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: note: insert '_Nullable' if the block pointer may be null
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
                                                          _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:74:41: note: insert '_Nonnull' if the block pointer should never be null
    - (void)setActive:(BOOL)enabled result:(FlutterResult)result;
                                            ^
                                                          _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: note: insert '_Nullable' if the pointer may be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
                                                      _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:50: note: insert '_Nonnull' if the pointer should never be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                     ^
                                                      _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: note: insert '_Nullable' if the block pointer may be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
                                                                                   _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:75:66: note: insert '_Nonnull' if the block pointer should never be null
    - (void)initializeSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                     ^
                                                                                   _Nonnull 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: note: insert '_Nullable' if the pointer may be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
                                                   _Nullable
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:47: note: insert '_Nonnull' if the pointer should never be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                  ^
                                                   _Nonnull
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: warning: block pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: note: insert '_Nullable' if the block pointer may be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
                                                                                _Nullable 
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/SoundPlayer.h:76:63: note: insert '_Nonnull' if the block pointer should never be null
    - (void)releaseSoundPlayer: (FlutterMethodCall*)call result: (FlutterResult)result;
                                                                  ^
                                                                                _Nonnull 
    13 warnings generated.
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/FfmpegPlugin.m:80:49: error: no visible @interface for 'FFmpegPlugin' declares the selector 'alloc'
        FFmpegPlugin* FFmpegPlugin = [[FFmpegPlugin alloc] init]; // The singleton
                                       ~~~~~~~~~~~~ ^~~~~
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/FfmpegPlugin.m:93:15: warning: unused variable 'command' [-Wunused-variable]
        NSString* command = call.arguments[@"command"];
                  ^
    /Users/mbpro/Downloads/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.8.2/ios/Classes/FfmpegPlugin.m:94:15: warning: unused variable 'delimiter' [-Wunused-variable]
        NSString* delimiter = call.arguments[@"delimiter"];
                  ^
    2 warnings and 1 error generated.
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description
    warning: Mapping architecture armv7 to i386. Ensure that this target's Architectures and Valid Architectures build settings are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')
    warning: Mapping architecture arm64 to x86_64. Ensure that this target's Architectures and Valid Architectures build settings are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')

Could not build the application for the simulator.
Error launching application on iPhone SE (2nd generation).

flutter doctor :

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.3, on Mac OS X 10.15.5 19F101, locale en-US)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
[✓] Android Studio (version 3.5)
[✓] Connected device (2 available)

• No issues found!

flutter pub deps :

cloud_firestore:
firebase_auth:
firebase_core:
firebase_database:
firebase_storage:
firebase_messaging:
google_sign_in:
image_picker:
image_cropper:
intl:
# flutter_sound: ^5.0.0
sounds:
flutter_launcher_icons:
flushbar:
file_picker:
path_provider:
audioplayers:
provider:
sliding_up_panel:
font_awesome_flutter:
marquee:


Describe the bug
I'm unable to get my app to build for iOS (seems to work for Android) due to the above error when building. I am trying to switch over from using Flutter Sound since I've updated my flutter version. I'm excited about this fork and having a cleaner API for the sound system! Would love to help contribute any way I can (I'll admit, I know very little about iOS development, however).

There is no documentation for wasUser and no documentation for when a track naturally ends

For every wasUser parameter for the soundPlayer events, wasUser always always returns false.
It's unclear what it does. I tried triggering the events both from in the app and from the shade UI.

There's also no documentation for when a player naturally ends. Like a bolean for onStopped() that dictates if the player was stopped because the track ended or because something else stopped it. Or perhaps add a "complete" enum to the DispositionState enum class. "Stop" is too general and limits things like auto playing

"sounds_lite" package does not exist

The documentation provides instructions for installing "sounds_lite" from pub.dev.
This does not work, however, as no such package has been published.

How to prevent sounds if phone is on mute/silent?

I'm using the Sounds beta version: 1.0.0.beta13

I guess that many app that plays sound may sometimes want to ensure the app doesn't play sound if the phone is silenced.

I can't find any documentation on this, but digging around some of the platform specific methods, and Apple documentation, I did try this:

      await _soundPlayer.iosSetCategory(
          IOSSessionCategory.soloAambient, IOSSessionMode.defaultMode, 2);

It unfortunately didn't work. The Apple documentation for soloAmbient leads me to believe it's the correct category.

Has anyone managed to ensure sounds stop when on Silent/Mute?

Thanks. If someone can point me in the right direction, I'll document what I find.

[HELP] The Sounds logo

Here is my question :

The Sounds logo is really nice.
Which tool did you use to add the shadow to the Flutter Sound logo ?

[HELP] Unable to play remote file due to AudioPlayer initialisation timeout

I need Help for :

  • Debugging my App ?

Here is my question:

I'm trying to play play() a track from a remote url using Track.fromURL(). When I feed this track to my SoundPlayer().play(track), I'm getting an error due to AudioPlayer initialisation timeout from the SoundPlayer's _initializeAndRun method. I'm not sure why it's failing. It appears to be happening on both an iOS simulator and an Android device. If I don't provide a coded or provide a Codec.fromExtension, I get a uri error: The uri's extension does not match any of the supported extensions. You must pass in a codec.. I'm trying to play files from Firebase Storage, so the links don't have a file extension in the url.

Web Support

Web support (and eventually desktop support later on) would bring this plugin to a feature complete state.

Please Help!!!

I need Help for :

In Track.fromFile() constructor whatever path i specify it says that the given path does not exist. I need to know how to specify the path of the track file. Please Help me with this @bsutton.

Does Sounds support streaming of recordings?

What I'm trying to do is an app in flutter that will get from the microphone of a mobile device, the sound which will be reproduced at the same time on the client devices. For that purpose, I found your plugin interesting. However, I don't really know how could i get the chunks of the audio and send them via socket to a server and work with them in the server. There is any way to do that using this plugin?

Good luck

Hi Brett,

I sent you 5$ for you to have a coffee via Paypal.
(Unfortunately the link "Buy me a coffee" is dead link).

I wish you a success with your fork.
Of course it would be great if you do "Pull Request" on Flutter Sound master branch when you implement some great features.

Have a nice day.
/Larpoux

[HELP] stopping .withUI creates a bad state and spams "This is BAD !!!" message

I need Help for:

  • Debugging issue

Using Sounds 0.8.9
Tested on Android Emulator (debug mode)

Not sure if I'm doing this incorrectly, or if there is an issue with the library.

I initialize with:
SoundPlayer.withUI(canSkipForward: true, canSkipBackward: true);

Upon clicking the "forward/backward" buttons in the OS shade the event propagates to the onSkipForward/onSkipBackward listeners which then call .stop() and move to the next item in the playlist array and call .play() (I'm not using the Album part of the API as each "track" actually consists of sequentially playing through more than one sound clip with silent delays between each clip).
The above works fine until I dispose/release at which point the error message "E/SoundPlayer(13652): MediaPlayerOnPreparedListener timer: mMediaBrowserHelper.mediaControllerCompat is NULL. This is BAD !!!" starts spamming the console.

If I just call release() after every stop() then the error never happens, however that means that the OS shade slides out for a second and then back in everytime the forward/back buttons are pressed by the user.

If the sounds are allowed to stop on their own (e.g., naturally reach the end of their duration) then the next playlist item plays fine and no errors propagate. It only happens if I manually call stop() without calling release(). I believe my only option right now would be to get the sound duration and seekTo near the end and let it stop itself, but that doesn't seem like the right way to handle this.

To simplify, I'm looking to do the following:

  • Start playing an audio clip > play()
  • User taps Next in the OS shade > await stop()
  • Audio stops immediately and plays next clip > play()
  • Leave route/screen > release()

Just let me know if you all need any more details or if I'm just not handling this scenario correctly.

Here's a small sample that triggers the error when you play the sound, skip to next sound, release sound.

import 'package:flutter/material.dart';
import 'package:sounds/sounds.dart';
import 'dart:io';

import '../widgets/texttospeech/device_voices.dart';
import '../models/caching/texttospeech_model.dart';

class TestSounds extends StatefulWidget {
  static const routeName = "/testSound";
  @override
  State<StatefulWidget> createState() => _TestSounds();
}

class _TestSounds extends State<TestSounds> {
  SoundPlayer flutterSound;
  int _activeTrack = 0;

  List<TextToSpeechParameters> _testSpeech = [
    TextToSpeechParameters(
        word: "Hello, what's up this is a sound test",
        voiceName: "en-AU-Wavenet-B",
        speakingRate: "1",
        languageCode: "en-US"),
    TextToSpeechParameters(
        word: "This is a test of sound again",
        voiceName: "en-AU-Wavenet-B",
        speakingRate: "1",
        languageCode: "en-US")
  ];

  @override
  void initState() {
    super.initState();
    flutterSound =
        SoundPlayer.withUI(canSkipForward: true, canSkipBackward: false);
    _setupSubscriptions();
  }

  _setupSubscriptions() {
    flutterSound.onSkipBackward = () async {
      //_gotoPrevPlaylistItem();
    };
    flutterSound.onSkipForward = () {
      _gotoNextPlaylistItem();
    };
  }

  @override
  void dispose() {
    _releaseSounds();
    super.dispose();
  }

  void _releaseSounds() async {
    if (!flutterSound.isStopped) {
      await flutterSound.stop();
    }
    await flutterSound.release();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: Column(
            children: [
              MaterialButton(
                child: Text("PLAY"),
                onPressed: () {
                  if (flutterSound.isStopped) {
                    _activeTrack = 0;
                    _playTrack(_activeTrack);
                  }
                },
              ),
              MaterialButton(
                child: Text("RELEASE"),
                onPressed: () {
                  _releaseSounds();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  _gotoNextPlaylistItem() async {
    if (!flutterSound.isStopped) {
      await flutterSound.stop();
    }
    _playTrack(_incrementTrack);
  }

  int get _incrementTrack {
    if (_activeTrack >= _testSpeech.length - 1) {
      _activeTrack = 0;
    } else {
      _activeTrack++;
    }
    return _activeTrack;
  }

  _playTrack(int activeTrack) async {
    File soundClip = await synthesizeLocalSound(_testSpeech[_activeTrack]);
    Track track = Track.fromFile(soundClip.path);
    flutterSound.play(track);
  }

  Future<File> synthesizeLocalSound(TextToSpeechParameters speechParams) async {
    File tts = await LocalTextSpeech.synthesizeToFile(speechParams);

    return tts;
  }
}

[BUG] Application crashes while changing duration using seekto

Sounds Version :

  • Prerelease version

  • 1.0.0-beta13

  • FULL


Severity

  • Crash

Platforms you faced the error

  • iOS

Logs

  • can't capture logs

flutter doctor :

[✓] Flutter (Channel stable, 1.20.2, on Mac OS X 10.15.5 19F101, locale en-ID)
    • Flutter version 1.20.2 at /Users/do4mother/Development/flutter
    • Framework revision bbfbf1770c (5 weeks ago), 2020-08-13 08:33:09 -0700
    • Engine revision 9d5b21729f
    • Dart version 2.9.1

 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/do4mother/Development/Android
    • Platform android-30, build-tools 29.0.2
    • ANDROID_HOME = /Users/do4mother/Development/Android
    • Java binary at:
      /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/bin/java
    • Java version Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.4.1, Build version 11E503a
    • CocoaPods version 1.9.3

[!] Android Studio (not installed)
    • Android Studio not found; download from
      https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup
      for detailed instructions).

[✓] VS Code (version 1.49.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.14.1

[✓] Connected device (1 available)
    • iPhone 8 (mobile) • 9DBE5509-EE12-4DAB-A66E-8713CB80D798 • ios •
      com.apple.CoreSimulator.SimRuntime.iOS-13-4 (simulator)

! Doctor found issues in 1 category.

Describe the bug
I tried implementing code from the documentation where it refers to https://bsutton.gitbook.io/sounds/monitoring, but after I try to move the slider the app always crashes. it only happens on iOS.

To Reproduce
Steps to reproduce the behavior:

  1. create new project
  2. copy paste the code
  3. run the project
  4. move the slider
  5. the application is crashed and no logs can be retrieved

Additional context**

Add any other context about the problem here.

Looking for contributors

I've recently forked the Sounds project from Flutter Sounds essentially over a failure to agree on the direction of the api and core architectual issues.

I have now almost completely rewritten the dart api as well as adding a no. of widgets to provide an simple 'out of the box' experience.

I now need help from the community.

Sounds is by its nature a fairly complex project that provides essential services to the Flutter community.

To deliver the high quality project required, Sounds needs your help.

I'm reaching out to prior contributors to see if you are interesting in getting involved again.

I believe in a community driven project that involves open discussion with an aim to reach consensus on the best path forward. I only forked the Sounds project after three months of trying to reach consensus on resolving a number of fundamental issues with in the flutter sound architecture.

I'm currently working through improving the documentation and have written a Contribution Guide and a Roadmap.

Overview
Contributing
Roadmap

One of the key task is a review of the API, so even if you could take a few minutes to stop a read the api docs and provide feed back that would be greatly appreciated.

I hope you will join me in what I think can be one of the most successful flutter projects within the flutter ecosystem.

Brett

@JoniDS
@ened
@mikeyyg96
@mansya
@haideraltahan
@Ajmal-M-A
@phranck
@oliversd
@nicholas-vella
@nachourpi
@matsu911
@kltdwrds
@justsoft
@jonasfranz
@java-james
@edman
@bensonwong
@MagicalTux
@CoreyCole
@JayTam
@tgram
@greymag
@salvatore373

[BUG] player.onStopped is never called. Disposition position is never equal to duration either

Sounds Version :

^1.0.0-beta.7


Severity

Major


Platforms you faced the error

Android Emulator


Given the following code:

    player = SoundPlayer.withShadeUI(
        playInBackground: true, canPause: true, canSkipBackward: true, canSkipForward: true);

    player.onStarted = ({wasUser}) {
      _playerEventController.add(PlayerEventPlay(activeTrack));
    };
    player.onResumed = ({wasUser}) {
      _playerEventController.add(PlayerEventResumed());
    };
    player.onPaused = ({wasUser}) {
      _playerEventController.add(PlayerEventPaused());
    };
    player.onStopped = ({wasUser}) {
      player.dispositionStream().last.then((disposition) {
        if (disposition.duration == disposition.position) {
          _playerEventController.add(PlayerEventStoppedNaturally());
        } else {
          _playerEventController.add(PlayerEventStopped());
        }
      });
    };
    player.onSkipBackward = () => _playerEventController.add(PlayerEventPlayPrevious());
    player.onSkipForward = () => _playerEventController.add(PlayerEventPlayNext());

and

  @override
  Stream<int> positionStream() => player.dispositionStream();

onStopped is never called when the track ends. It fires when the player is stopped manually, but never naturally.

There is not a single event that fires when the track ends naturally.

This is my log when a track reaches its end:

I/flutter (26537): PositionCubit Change { currentState: 162497, nextState: 162502 }
I/flutter (26537): �[38;5;249m13 21:18:52.711 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): PositionCubit Change { currentState: 162502, nextState: 162506 }
I/flutter (26537): �[38;5;249m13 21:18:52.717 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): PositionCubit Change { currentState: 162506, nextState: 162507 }
I/flutter (26537): �[38;5;249m13 21:18:52.732 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): PositionCubit Change { currentState: 162507, nextState: 162512 }
I/flutter (26537): �[38;5;249m13 21:18:52.734 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): PositionCubit Change { currentState: 162512, nextState: 162514 }
I/flutter (26537): �[38;5;249m13 21:18:52.738 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): PositionCubit Change { currentState: 162514, nextState: 162524 }
D/SoundPlayer(26537): Plays completed.
I/flutter (26537): �[38;5;249m13 21:18:52.761 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback audioPlayerFinishedPlaying�[0m
I/flutter (26537): PositionCubit Change { currentState: 162524, nextState: 162664 }
V/MediaPlayer(26537): resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer(26537): cleanDrmObj: mDrmObj=null mDrmSessionId=null
I/flutter (26537): �[38;5;249m13 21:18:52.834 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.836 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.849 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.859 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.865 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.871 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.875 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.884 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (26537): �[38;5;249m13 21:18:52.890 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m

You can immediately see that my position that's listening to the disposition listener is NOT ending with position = duration; it cuts short.
Print statements also never print in the onStopped event.
There is no way to tell if a track ended naturally.

isPlayer returns false but there's no event to allow us to check if it's done or not because disposition stream ends before isPlayer can return false.

Wrap Codec in a MediaFormat

I've been looking into the issues around #344 (re-architect codec support) and have come to the realisation that we have a number of problems with how we are using the Codec class.

Reference material:
https://developer.android.com/guide/topics/media/media-formats

The Codec class has morphed into an object that attempts to describe both the Codec and the media container.

This appears problematic as the Codec is not able to fully describe a media's format and the class name is misleading as it describes more than just a Codec.

I'm proposing that we create a new class MediaFormat.

class MediaFormat
{
 Codec codec;
 MediaContainer container;
int sampleRate = 16000,
int numChannels = 1,
int bitRate = 16000,
Quality quality = Quality.low,
}

Note: I'm uncertain whether quality belongs here, its taken from the SoundRecorder.record method.

The MediaFormat would replace Codec in the public api so when creating a Track you would now use something like:

var format = MediaFormat.default;
var track = Track.fromPath(path, format);

var format = MediaFormat(Codecs.byName('mpeg'), MediaContainer.byName('mpeg'));
format.sampleRate = 1000;
format.numChannels = 2;

track  = Track.fromBuffer(buffer, format);

I believe this method has a number of advantages:

  1. we are now accurately describing the users requested media format.
  2. when doing codec conversions we would use the MediaFormat rather than just the Codec. This allows conversions to fully describe the desired target format. (e.g. stereo to mono, down sampling etc).
  3. We change the SoundRecorder.record method to take a MediaFormat which makes the api consistent.
  4. we future proof the api as MediaFormat accurately describes the format which means we are less likely to have to change the api. With the current implementation this is highly likely as the current Codec is a enum which means we can't add additional properties.

The down side is that it probably makes our life harder as we need to deal with users passing formats that are not supported or inconsistent.
Inconsistency is perhaps a problem with the SoundPlayer as it would essentially ignore the properties. The flip side is that I can't think of why this would be an actual problem.
We also make the users life slightly harder as it takes more lines of code to describe a MediaFormat than a Codec. Having a number of default MediaFormats would mitigate this problem.

Thoughts?

AudioFocus does not seem to work

Version of sounds

sounds: ^1.0.0-beta.1

flutter doctor

--

Platforms you faced the error (IOS or Android or both?)

Android (not tested on IOS)

Expected behavior

If spotify is currently playing, my expectation is that AudioFocus.focusAndHushOthers should lower spotify's volume while playing the sounds audio.

Actual behavior

AudioFocus.focusAndHushOther and AudioFocus.focusAndKeepOthers both stop spotify playback without resuming it post playback.
I have tried this with headless playback and with the shade UI.

Tested environment (Emulator? Real Device?)

Real Device (Galaxy 8+), can't imagine it'd be any different on the emulator.

Steps to reproduce the behavior

static void playSound(){
var track = Track.fromAsset('assets/sounds/english/finish.mp3');
var player = SoundPlayer.noUI();
player.onStopped = ({wasUser}) => player.release();
player.audioFocus(AudioFocus.focusAndHushOthers);
player.play(track);
}

[Feature Request] Ability to change OS shade's play/pause/stopped state at any time

Is your feature request related to a problem? Please describe.
My use case as an example is playing a playlist, with each "track" consisting of several files with blank space between each file and the user can pause the "playlist" at any point (when the files are actively playing or when the files have naturally stopped and they are in the blank/delay between sound files playing).
The shade can't accurately show that the user paused the playlist unless the user happened to hit pause in the midst of an actual sound playing. Everything seems to work really well as far as functionality of the player/events propagating from the shade/etc. it's just the visual state of the shade needs to be able to be updated to accurately show what the user would expect in a scenario like this.

Describe the solution you'd like
Ability to change state of play/pause/stopped OS shade's UI separately from the actual state of sound files.

Describe alternatives you've considered
The only alternative I've found is triggering a small/blank sound to play if no sound is playing when they hit pause, so it triggers "play" and then immediately triggers "pause" which makes the shade show the correct state.

Unable to instantiate unique MediaFormat with parameters [BUG]

Sounds Version :

sounds: 1.0.0-beta.5 & sounds: 0.9.3


Severity

  • Result is not what expected

Platforms you faced the error

  • iOS & Android
  • Real device

var mediaFormat = AdtsAacMediaFormat(
      sampleRate: 44100,
      numChannels: 1,
      bitRate: 192000,
    );

print("mediaFormat: ${mediaFormat.bitRate}, ${mediaFormat.sampleRate}");

-Prints-

mediaFormat: 16000, 16000

Maybe I'm missing something?

[HELP]Unable to run my app after add this plugin (I was using flutter_sounds).

I need Help for :

  • Debugging my App ?

Here is my question :

I was using flutter_sound plugin to record and play audio but after a lot of problem with it, I decided to move forward and use this plugin but after remove flutter_sound and add sounds: ^0.9.2 to dependencies I got the following error:

C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sounds-0.9.2.packages does not exist.
Did you run "flutter pub get" in this directory?

FAILURE: Build failed with an exception.

  • Where:
    Script 'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 896

  • What went wrong:
    Execution failed for task ':sounds:compileFlutterBuildDebug'.

Process 'command 'C:\src\flutter\bin\flutter.bat'' finished with non-zero exit value 1

  • 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.

  • Get more help at https://help.gradle.org

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


actually I run flutter pub get and try all those possible solutions:

  • flutter clean
  • flutter pub cache repair
  • flutter upgrade to flutter 1.20.1
  • flutter doctor:
    [✓] Flutter (Channel stable, 1.20.1, on Microsoft Windows [Version 10.0.18362.959], locale en-GB)

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.47.3)
[✓] Connected device (1 available)


  • flutter run -v:

[ +146 ms] executing: [C:\src\flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +78 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[ ] 2ae34518b87dd891355ed6c6ea8cb68c4d52bb9d
[ ] executing: [C:\src\flutter/] git tag --contains HEAD
[ +335 ms] Exit code 0 from: git tag --contains HEAD
[ ] 1.20.1
[ +10 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref --symbolic @{u}
[ +47 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[ ] origin/stable
[ ] executing: [C:\src\flutter/] git ls-remote --get-url origin
[ +39 ms] Exit code 0 from: git ls-remote --get-url origin
[ ] https://github.com/flutter/flutter.git
[ +101 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref HEAD
[ +51 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[ ] stable
[ +81 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ +7 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +44 ms] executing: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe devices -l
[ +79 ms] List of devices attached
2deaa8e47d27 device product:cereus model:Redmi_6 device:cereus transport_id:2
[ +11 ms] C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe -s 2deaa8e47d27 shell getprop
[ +122 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ +8 ms] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ +4 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ +1 ms] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +183 ms] Found plugin cloud_firestore at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.13.5
[ +10 ms] Found plugin cloud_firestore_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore_web-0.1.1+2
[ +11 ms] Found plugin device_info at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\device_info-0.4.2+4
[ +12 ms] Found plugin firebase_auth at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_auth-0.16.0
[ +7 ms] Found plugin firebase_auth_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_auth_web-0.1.2
[ +8 ms] Found plugin firebase_core at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_core-0.4.4+3
[ +8 ms] Found plugin firebase_core_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_core_web-0.1.1+2
[ +9 ms] Found plugin firebase_storage at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_storage-3.1.5
[ +6 ms] Found plugin flutter_plugin_android_lifecycle at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\flutter_plugin_android_lifecycle-1.0.7
[ +7 ms] Found plugin google_sign_in at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\google_sign_in-4.5.1
[ +7 ms] Found plugin google_sign_in_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\google_sign_in_web-0.9.1
[ +13 ms] Found plugin image_crop at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\image_crop-0.3.2
[ +3 ms] Found plugin image_picker at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\image_picker-0.6.6+1
[ +13 ms] Found plugin path_provider at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\path_provider-1.6.8
[ +2 ms] Found plugin path_provider_macos at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\path_provider_macos-0.0.4+1
[ +8 ms] Found plugin permission_handler at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\permission_handler-5.0.0+hotfix.6
[ +17 ms] Found plugin share at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\share-0.6.4+3
[ +7 ms] Found plugin sounds at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sounds-0.9.2
[ +8 ms] Found plugin sqflite at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sqflite-1.3.1
[ +111 ms] Found plugin cloud_firestore at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.13.5
[ +4 ms] Found plugin cloud_firestore_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore_web-0.1.1+2
[ +6 ms] Found plugin device_info at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\device_info-0.4.2+4
[ +6 ms] Found plugin firebase_auth at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_auth-0.16.0
[ +4 ms] Found plugin firebase_auth_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_auth_web-0.1.2
[ +2 ms] Found plugin firebase_core at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_core-0.4.4+3
[ +3 ms] Found plugin firebase_core_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_core_web-0.1.1+2
[ +3 ms] Found plugin firebase_storage at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\firebase_storage-3.1.5
[ +5 ms] Found plugin flutter_plugin_android_lifecycle at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\flutter_plugin_android_lifecycle-1.0.7
[ +4 ms] Found plugin google_sign_in at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\google_sign_in-4.5.1
[ +4 ms] Found plugin google_sign_in_web at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\google_sign_in_web-0.9.1
[ +7 ms] Found plugin image_crop at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\image_crop-0.3.2
[ +1 ms] Found plugin image_picker at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\image_picker-0.6.6+1
[ +8 ms] Found plugin path_provider at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\path_provider-1.6.8
[ +2 ms] Found plugin path_provider_macos at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\path_provider_macos-0.0.4+1
[ +6 ms] Found plugin permission_handler at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\permission_handler-5.0.0+hotfix.6
[ +8 ms] Found plugin share at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\share-0.6.4+3
[ +4 ms] Found plugin sounds at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sounds-0.9.2
[ +5 ms] Found plugin sqflite at C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sqflite-1.3.1
[ +99 ms] Generating C:\src\MOPILE_APPS\voycid\android\app\src\main\java\io\flutter\plugins\GeneratedPluginRegistrant.java
[ +41 ms] ro.hardware = mt6765
[ +1 ms] ro.build.characteristics = default
[ +78 ms] Starting incremental build...
[ +4 ms] Initializing file store
[ +14 ms] Skipping target: gen_localizations
[ +9 ms] complete
[ +8 ms] Launching lib\main.dart on Redmi 6 in debug mode...
[ +9 ms] C:\src\flutter\bin\cache\dart-sdk\bin\dart.exe --disable-dart-dev C:\src\flutter\bin\cache\artifacts\engine\windows-x64\frontend_server.dart.snapshot
--sdk-root C:\src\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk/ --incremental --target=flutter --debugger-module-names
-Ddart.developer.causal_async_stacks=true --output-dill C:\Users\HP\AppData\Local\Temp\flutter_tools.61b681c1\flutter_tool.32485005\app.dill --packages
.packages -Ddart.vm.profile=false -Ddart.vm.product=false
--bytecode-options=source-positions,local-var-info,debugger-stops,instance-field-initializers,keep-unreachable-code,avoid-closure-call-instructions
--enable-asserts --track-widget-creation --filesystem-scheme org-dartlang-root --initialize-from-dill build\cache.dill.track.dill
[ +32 ms] executing: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe -s 2deaa8e47d27 shell -x logcat -v time -t 1
[ +163 ms] Exit code 0 from: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe -s 2deaa8e47d27 shell -x logcat -v time -t 1
[ +1 ms] --------- beginning of main
08-08 10:02:51.985 D/connsyslogger( 567): SD_LOG_ROOT is /mnt/sdcard/mtklog/connsyslog/fw.
[ +1 ms] executing: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe -s 2deaa8e47d27 shell -x logcat -v time -t 1
[ +123 ms] Exit code 0 from: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe -s 2deaa8e47d27 shell -x logcat -v time -t 1
[ +1 ms] --------- beginning of main
08-08 10:02:52.133 I/ADB_SERVICES( 1906): post waitpid (pid=5659) status=0000
[ +17 ms] <- compile package:voycid/main.dart
[ +20 ms] executing: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe version
[ +76 ms] Android Debug Bridge version 1.0.41
Version 30.0.3-6597393
Installed as C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe
[ +4 ms] executing: C:\Users\HP\AppData\Local\Android\sdk\platform-tools\adb.exe start-server
[ +58 ms] Building APK
[ +33 ms] Running Gradle task 'assembleDebug'...
[ +5 ms] gradle.properties already sets android.enableR8
[ +10 ms] Using gradle from C:\src\MOPILE_APPS\voycid\android\gradlew.bat.
[ +1 ms] C:\src\MOPILE_APPS\voycid\android\gradlew.bat mode: 33279 rwxrwxrwx.
[ +16 ms] executing: C:\Program Files\Android\Android Studio\jre\bin\java -version
[ +164 ms] Exit code 0 from: C:\Program Files\Android\Android Studio\jre\bin\java -version
[ +1 ms] openjdk version "1.8.0_242-release"
OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
OpenJDK 64-Bit Server VM (build 25.242-b01, mixed mode)
[ +4 ms] executing: [C:\src\MOPILE_APPS\voycid\android/] C:\src\MOPILE_APPS\voycid\android\gradlew.bat -Pverbose=true -Ptarget-platform=android-arm
-Ptarget=C:\src\MOPILE_APPS\voycid\lib\main.dart -Ptrack-widget-creation=true -Pfilesystem-scheme=org-dartlang-root assembleDebug
[+8163 ms] > Task :app:compileFlutterBuildDebug
[ +1 ms] [ +237 ms] executing: [C:\src\flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +1 ms] [ +121 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +1 ms] [ ] 2ae34518b87dd891355ed6c6ea8cb68c4d52bb9d
[ +1 ms] [ +1 ms] executing: [C:\src\flutter/] git tag --contains HEAD
[ +180 ms] [ +598 ms] Exit code 0 from: git tag --contains HEAD
[ +2 ms] [ ] 1.20.1
[ +1 ms] [ +18 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref --symbolic @{u}
[ +97 ms] [ +63 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[ +1 ms] [ ] origin/stable
[ +1 ms] [ ] executing: [C:\src\flutter/] git ls-remote --get-url origin
[ +1 ms] [ +70 ms] Exit code 0 from: git ls-remote --get-url origin
[ +1 ms] [ ] https://github.com/flutter/flutter.git
[ +211 ms] [ +151 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref HEAD
[ +3 ms] [ +62 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[ +1 ms] [ ] stable
[ +77 ms] [ +65 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ ] [ +5 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +1 ms] [ +25 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
[ +2 ms] [ ] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ +2 ms] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
[ +160 ms] [ +198 ms] Initializing file store
[ +98 ms] [ +29 ms] Skipping target: gen_localizations
[ +1 ms] [ +17 ms] kernel_snapshot: Starting due to {}
[ +109 ms] [ +82 ms] C:\src\flutter\bin\cache\dart-sdk\bin\dart.exe --disable-dart-dev
C:\src\flutter\bin\cache\artifacts\engine\windows-x64\frontend_server.dart.snapshot --sdk-root
C:\src\flutter\bin\cache\artifacts\engine\common\flutter_patched_sdk/ --target=flutter -Ddart.developer.causal_async_stacks=true -Ddart.vm.profile=false
-Ddart.vm.product=false
--bytecode-options=source-positions,local-var-info,debugger-stops,instance-field-initializers,keep-unreachable-code,avoid-closure-call-instructions
--enable-asserts --track-widget-creation --no-link-platform --packages C:\src\MOPILE_APPS\voycid.packages --output-dill
C:\src\MOPILE_APPS\voycid.dart_tool\flutter_build\795d7797ced5b1ceed69c7eefc30813d\app.dill --depfile
C:\src\MOPILE_APPS\voycid.dart_tool\flutter_build\795d7797ced5b1ceed69c7eefc30813d\kernel_snapshot.d package:voycid/main.dart
[+13789 ms] [+13862 ms] kernel_snapshot: Complete
[+1197 ms] [+1207 ms] debug_android_application: Starting due to {}
[ +399 ms] [ +352 ms] Manifest contained wildcard assets. Inserting missing file into build graph to force rerun. for more information see #56466.
[ +99 ms] [ +70 ms] debug_android_application: Complete
[+1000 ms] [ +983 ms] Persisting file store
[ +1 ms] [ +30 ms] Done persisting file store
[ +1 ms] [ +21 ms] build succeeded.
[ +1 ms] [ +27 ms] "flutter assemble" took 16,944ms.
[ ] [ +4 ms] ensureAnalyticsSent: 0ms
[ +1 ms] [ +1 ms] Running shutdown hooks
[ ] [ ] Shutdown hooks complete
[ ] [ ] exiting with code 0
[ +338 ms] > Task :app:packLibsflutterBuildDebug UP-TO-DATE
[ +156 ms] > Task :app:preBuild UP-TO-DATE
[ +35 ms] > Task :app:preDebugBuild UP-TO-DATE
[ +11 ms] > Task :cloud_firestore:preBuild UP-TO-DATE
[ +13 ms] > Task :cloud_firestore:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :cloud_firestore_web:preBuild UP-TO-DATE
[ +1 ms] > Task :cloud_firestore_web:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :firebase_core:preBuild UP-TO-DATE
[ +9 ms] > Task :firebase_core:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :firebase_core_web:preBuild UP-TO-DATE
[ +1 ms] > Task :firebase_core_web:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :firebase_core_web:compileDebugAidl NO-SOURCE
[ +1 ms] > Task :device_info:preBuild UP-TO-DATE
[ +1 ms] > Task :device_info:preDebugBuild UP-TO-DATE
[ +22 ms] > Task :device_info:compileDebugAidl NO-SOURCE
[ +1 ms] > Task :firebase_auth:preBuild UP-TO-DATE
[ +6 ms] > Task :firebase_auth:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :firebase_auth_web:preBuild UP-TO-DATE
[ +1 ms] > Task :firebase_auth_web:preDebugBuild UP-TO-DATE
[ +5 ms] > Task :firebase_auth_web:compileDebugAidl NO-SOURCE
[ +2 ms] > Task :firebase_core:compileDebugAidl NO-SOURCE
[ +4 ms] > Task :cloud_firestore_web:compileDebugAidl NO-SOURCE
[ +1 ms] > Task :cloud_firestore:compileDebugAidl NO-SOURCE
[ +1 ms] > Task :firebase_auth:compileDebugAidl NO-SOURCE
[ ] > Task :firebase_storage:preBuild UP-TO-DATE
[ ] > Task :firebase_storage:preDebugBuild UP-TO-DATE
[ ] > Task :flutter_plugin_android_lifecycle:preBuild UP-TO-DATE
[ +3 ms] > Task :flutter_plugin_android_lifecycle:preDebugBuild UP-TO-DATE
[ +3 ms] > Task :flutter_plugin_android_lifecycle:compileDebugAidl NO-SOURCE
[ +5 ms] > Task :firebase_storage:compileDebugAidl NO-SOURCE
[ +3 ms] > Task :google_sign_in:preBuild UP-TO-DATE
[ ] > Task :google_sign_in:preDebugBuild UP-TO-DATE
[ ] > Task :google_sign_in_web:preBuild UP-TO-DATE
[ ] > Task :google_sign_in_web:preDebugBuild UP-TO-DATE
[ ] > Task :google_sign_in_web:compileDebugAidl NO-SOURCE
[ ] > Task :image_crop:preBuild UP-TO-DATE
[ +1 ms] > Task :image_crop:preDebugBuild UP-TO-DATE
[ ] > Task :image_crop:compileDebugAidl NO-SOURCE
[ ] > Task :image_picker:preBuild UP-TO-DATE
[ ] > Task :image_picker:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :image_picker:compileDebugAidl NO-SOURCE
[ +1 ms] > Task :path_provider:preBuild UP-TO-DATE
[ ] > Task :path_provider:preDebugBuild UP-TO-DATE
[ ] > Task :path_provider_macos:preBuild UP-TO-DATE
[ ] > Task :path_provider_macos:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :path_provider_macos:compileDebugAidl NO-SOURCE
[ ] > Task :path_provider:compileDebugAidl NO-SOURCE
[ ] > Task :google_sign_in:compileDebugAidl NO-SOURCE
[ ] > Task :permission_handler:preBuild UP-TO-DATE
[ +2 ms] > Task :permission_handler:preDebugBuild UP-TO-DATE
[ +1 ms] > Task :permission_handler:compileDebugAidl NO-SOURCE
[ ] > Task :share:preBuild UP-TO-DATE
[ ] > Task :share:preDebugBuild UP-TO-DATE
[ +2 ms] > Task :share:compileDebugAidl NO-SOURCE
[+1927 ms] > Task :sounds:compileFlutterBuildDebug FAILED
[ +4 ms] [ +132 ms] executing: [C:\src\flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +1 ms] [ +75 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +1 ms] [ ] 2ae34518b87dd891355ed6c6ea8cb68c4d52bb9d
[ +1 ms] [ ] executing: [C:\src\flutter/] git tag --contains HEAD
[ +1 ms] [ +347 ms] Exit code 0 from: git tag --contains HEAD
[ ] [ ] 1.20.1
[ ] [ +10 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref --symbolic @{u}
[ +5 ms] [ +46 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[ +1 ms] [ ] origin/stable
[ ] [ ] executing: [C:\src\flutter/] git ls-remote --get-url origin
[ ] [ +41 ms] Exit code 0 from: git ls-remote --get-url origin
[ +1 ms] [ ] https://github.com/flutter/flutter.git
[ +1 ms] [ +101 ms] executing: [C:\src\flutter/] git rev-parse --abbrev-ref HEAD
[ +1 ms] [ +55 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[ ] [ ] stable
[ +1 ms] [ +40 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ ] [ +4 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +6 ms] [ +18 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
[ +3 ms] [ ] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ ] [ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
[ ] [ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] [ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ +1 ms] [ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
[ ] [ +137 ms] Initializing file store
[ ] [ +21 ms] Skipping target: gen_localizations
[ ] [ +9 ms] kernel_snapshot: Starting due to {}
[ ] [ +21 ms] Invalid argument (file): File cannot be read: "file:///C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/sounds-0.9.2/.packages"
[ ] [ +4 ms] Persisting file store
[ ] [ +4 ms] Done persisting file store
[ +1 ms] [ +1 ms] C:\src\flutter.pub-cache\hosted\pub.dartlang.org\sounds-0.9.2.packages does not exist.
[ +2 ms] Did you run "flutter pub get" in this directory?
[ +1 ms] [ +12 ms] Target kernel_snapshot failed: Exception: null
[ +1 ms] #0 throwToolExit (package:flutter_tools/src/base/common.dart:14:3)
[ ] #1 loadPackageConfigWithLogging (package:flutter_tools/src/dart/package_map.dart:65:5)
[ +1 ms]
[ ] #2 KernelSnapshot.build (package:flutter_tools/src/build_system/targets/common.dart:235:47)
[ ]
[ +1 ms] #3 _BuildInstance._invokeInternal (package:flutter_tools/src/build_system/build_system.dart:795:27)
[ +2 ms] #4 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +1 ms] #5 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ ] #6 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ ] #7 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ ] #8 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] [ +11 ms] "flutter assemble" took 263ms.
[ +1 ms] #9 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ +1 ms] #10 Future._asyncCompleteWithValue. (dart:async/future_impl.dart:567:7)
[ +1 ms] #11 _rootRun (dart:async/zone.dart:1190:13)
[ ] #12 _CustomZone.run (dart:async/zone.dart:1093:19)
[ ] #13 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
[ ] #14 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037:23)
[ ] #15 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
[ ] #16 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
[ ] #17 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
[ ] #18 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:169:5)
[ ] [ +6 ms]
[ ] #0 throwToolExit (package:flutter_tools/src/base/common.dart:14:3)
[ ] #1 AssembleCommand.runCommand (package:flutter_tools/src/commands/assemble.dart:238:7)
[ +1 ms] #2 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +2 ms] #3 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ +1 ms] #4 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ ] #5 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +1 ms] #6 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] #7 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ +1 ms] #8 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
[ ] #9 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
[ ] #10 FlutterBuildSystem.build (package:flutter_tools/src/build_system/build_system.dart)
[ +1 ms] #11 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +1 ms] #12 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ +1 ms] #13 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ ] #14 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +1 ms] #15 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] #16 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ +1 ms] #17 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
[ +1 ms] #18 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
[ +1 ms] #19 _BuildInstance.invokeTarget (package:flutter_tools/src/build_system/build_system.dart)
[ +2 ms] #20 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +1 ms] #21 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ ] #22 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ ] #23 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +2 ms] #24 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] #25 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ ] #26 Future.wait. (dart:async/future.dart:410:22)
[ ] #27 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +1 ms] #28 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ +2 ms] #29 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ +1 ms] #30 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +1 ms] #31 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ ] #32 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ +1 ms] #33 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
[ +1 ms] #34 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
[ +1 ms] #35 _BuildInstance._invokeInternal (package:flutter_tools/src/build_system/build_system.dart)
[ +1 ms] #36 _asyncErrorWrapperHelper.errorCallback (dart:async-patch/async_patch.dart:91:64)
[ +1 ms] #37 _rootRunBinary (dart:async/zone.dart:1214:47)
[ ] #38 _CustomZone.runBinary (dart:async/zone.dart:1107:19)
[ ] #39 _FutureListener.handleError (dart:async/future_impl.dart:157:20)
[ +1 ms] #40 Future._propagateToListeners.handleError (dart:async/future_impl.dart:708:47)
[ +1 ms] #41 Future._propagateToListeners (dart:async/future_impl.dart:729:24)
[ +1 ms] #42 Future._completeError (dart:async/future_impl.dart:537:5)
[ ] #43 _AsyncAwaitCompleter.completeError (dart:async-patch/async_patch.dart:47:15)
[ ] #44 KernelSnapshot.build (package:flutter_tools/src/build_system/targets/common.dart)
[ ] #45 _asyncErrorWrapperHelper.errorCallback (dart:async-patch/async_patch.dart:91:64)
[ +2 ms] #46 _rootRunBinary (dart:async/zone.dart:1214:47)
[ ] #47 _CustomZone.runBinary (dart:async/zone.dart:1107:19)
[ +2 ms] #48 _FutureListener.handleError (dart:async/future_impl.dart:157:20)
[ +1 ms] #49 Future._propagateToListeners.handleError (dart:async/future_impl.dart:708:47)
[ +1 ms] #50 Future._propagateToListeners (dart:async/future_impl.dart:729:24)
[ +1 ms] #51 Future._completeError (dart:async/future_impl.dart:537:5)
[ +2 ms] #52 _AsyncAwaitCompleter.completeError (dart:async-patch/async_patch.dart:47:15)
[ +2 ms] #53 loadPackageConfigWithLogging (package:flutter_tools/src/dart/package_map.dart)
[ +1 ms] #54 _rootRunUnary (dart:async/zone.dart:1198:47)
[ ] #55 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ ] #56 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ +1 ms] #57 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +1 ms] #58 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] #59 Future._completeWithValue (dart:async/future_impl.dart:529:5)
[ ] #60 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
[ ] #61 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
[ ] #62 readAnyConfigFileUri (package:package_config/src/package_config_io.dart)
[ ] #63 _rootRunUnary (dart:async/zone.dart:1198:47)
[ +1 ms] #64 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
[ +10 ms] #65 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
[ +1 ms] #66 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
[ +1 ms] #67 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
[ +1 ms] #68 Future._addListener. (dart:async/future_impl.dart:393:9)
[ +1 ms] #69 _rootRun (dart:async/zone.dart:1190:13)
[ ] #70 _CustomZone.run (dart:async/zone.dart:1093:19)
[ +1 ms] #71 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
[ +2 ms] #72 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037:23)
[ +1 ms] #73 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
[ +1 ms] #74 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
[ ] #75 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
[ +1 ms] #76 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:169:5)
[ +2 ms] FAILURE: Build failed with an exception.
[ +2 ms] * Where:
[ +1 ms] Script 'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 896
[ ] * What went wrong:
[ ] Execution failed for task ':sounds:compileFlutterBuildDebug'.
[ ] > Process 'command 'C:\src\flutter\bin\flutter.bat'' finished with non-zero exit value 1
[ +1 ms] * 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.
[ +1 ms] * Get more help at https://help.gradle.org
[ +2 ms] BUILD FAILED in 28s
[ +3 ms] [ +3 ms] ensureAnalyticsSent: 1ms
[ +1 ms] [ +2 ms] Running shutdown hooks
[ +1 ms] [ ] Shutdown hooks complete
[ +3 ms] [ +10 ms] exiting with code 1
[ ] 3 actionable tasks: 2 executed, 1 up-to-date
[ +344 ms] Running Gradle task 'assembleDebug'... (completed in 29.0s)
[ +8 ms] Exception: Gradle task assembleDebug failed with exit code 1
[ +3 ms] "flutter run" took 30,707ms.
[ +5 ms]
#0 throwToolExit (package:flutter_tools/src/base/common.dart:14:3)
#1 RunCommand.runCommand (package:flutter_tools/src/commands/run.dart:591:7)

#2 FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:860:18)
#3 _rootRunUnary (dart:async/zone.dart:1198:47)
#4 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#5 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#6 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#7 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#8 Future._completeWithValue (dart:async/future_impl.dart:529:5)
#9 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
#10 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
#11 RunCommand.usageValues (package:flutter_tools/src/commands/run.dart)
#12 _rootRunUnary (dart:async/zone.dart:1198:47)
#13 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#14 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#15 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#16 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#17 Future._completeWithValue (dart:async/future_impl.dart:529:5)
#18 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:40:15)
#19 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:311:13)
#20 AndroidDevice.isLocalEmulator (package:flutter_tools/src/android/android_device.dart)
#21 _rootRunUnary (dart:async/zone.dart:1198:47)
#22 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#23 _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#24 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#25 Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#26 Future._completeWithValue (dart:async/future_impl.dart:529:5)
#27 Future._asyncCompleteWithValue. (dart:async/future_impl.dart:567:7)
#28 _rootRun (dart:async/zone.dart:1190:13)
#29 _CustomZone.run (dart:async/zone.dart:1093:19)
#30 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
#31 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037:23)
#32 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#33 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#34 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
#35 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:169:5)

[ +255 ms] ensureAnalyticsSent: 252ms
[ +2 ms] Running shutdown hooks
[ +1 ms] Shutdown hook priority 4
[ +6 ms] Shutdown hooks complete
[ ] exiting with code 1


remove ffmpeg from package.

The ffmpeg package provides media utilites for doing codec conversions and getting the duration of an audio file.

The downside is that ffmpeg bloats the Sounds package to the point there is a LITE and a FULL flavor of Sounds and even the LITE version is fat.

An issue has already been raised to move all codec conversions into separate packages in which case ffmpeg would also be moved into a separate package.

The other use of ffmpeg is to obtain a duration of a audio file, however it appears that android at least provides support for obtaining the duration of a audio file without using a third party package.

https://stackoverflow.com/questions/15394640/get-duration-of-audio-file

https://stackoverflow.com/questions/5219379/how-to-get-the-duration-of-an-audio-file-in-ios

This issue needs to completely remove FFMpeg from the Sounds and re-implement the dart library CodecHelper.getDuration using native ios and android methods as described by the above two links.

The dart library ffmpeg_util.dart currently implements the duration method which calls into the java/objective-c code using the plugin method: getMediaInformation.

The getMediaInformation method should be replaced with a duration method that returns (via a callback) the audio files duration as a long in milliseconds.
The 'getDuration' method will receive a three arguments:
slotNo:
path:
uuid:
Which will be a path to the audio file on the local file system.

The callback method name should be 'duration' and pass two values in a map:
slotNo - the plugin slot number passed by the dart code when calling getDuration

arg: - a json map contain the duration

The json map should contain a single key value pair:
{
"uuid" : ,
"milliseconds":
}

No obvious way to stop debug messages

Sounds Version :

^1.0.0-beta.7


Severity

  • Minor issue

Platforms you faced the error

Android pixel 3a emulator.


Logs

I/flutter (21969): �[38;5;249m13 17:19:37.245 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.348 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.448 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.549 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.648 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.751 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.856 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:37.953 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.63 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.165 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.258 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.359 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.457 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.564 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.663 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.761 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.863 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:38.965 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.65 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.166 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.276 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.366 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.467 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.569 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.668 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.769 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.874 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:39.982 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.81 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.177 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.280 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.380 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.478 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.580 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.683 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.784 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.885 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:40.996 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.89 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.193 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.291 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.393 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.499 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.605 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.696 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.796 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.897 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:41.998 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:42.100 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:42.201 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:42.301 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:42.403 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m
I/flutter (21969): �[38;5;249m13 17:19:42.509 Debug player_base_plugin.dart : PlayerBasePlugin.onMethodCallback : 194 ::: OS callback updateProgress�[0m

flutter doctor :

[√] Flutter (Channel master, 1.21.0-8.0.pre.122, on Microsoft Windows [Version 10.0.19041.388], locale en-US)

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.1)
[√] Chrome - develop for the web
[!] Android Studio (not installed)
[√] Connected device (4 available)

! Doctor found issues in 1 category.

(using android studio beta, weird bug in flutter doctor)

flutter pub deps :

Dart SDK 2.10.0-4.0.dev.flutter-0341576448
Flutter SDK 1.21.0-8.0.pre.122

|-- animations 1.1.2
|   '-- flutter...
|-- async 2.5.0-nullsafety
|   '-- collection...
|-- bloc 6.0.1
|   '-- meta...
|-- blurhash 0.2.0
|   '-- flutter...
|-- blurhash_dart 0.2.3
|-- build_runner 1.10.2
|   |-- args 1.6.0
|   |-- async...
|   |-- build...
|   |-- build_config 0.4.2
|   |   |-- checked_yaml 1.0.2
|   |   |   |-- json_annotation...
|   |   |   |-- source_span...
|   |   |   '-- yaml...
|   |   |-- json_annotation...
|   |   |-- meta...
|   |   |-- path...
|   |   |-- pubspec_parse...
|   |   '-- yaml...
|   |-- build_daemon 2.1.4
|   |   |-- built_collection 4.3.2
|   |   |   |-- collection...
|   |   |   '-- quiver...
|   |   |-- built_value 7.1.0
|   |   |   |-- built_collection...
|   |   |   |-- collection...
|   |   |   |-- fixnum 0.10.11
|   |   |   '-- quiver...
|   |   |-- http_multi_server...
|   |   |-- logging...
|   |   |-- path...
|   |   |-- pedantic...
|   |   |-- pool...
|   |   |-- shelf...
|   |   |-- shelf_web_socket...
|   |   |-- stream_transform...
|   |   |-- watcher...
|   |   '-- web_socket_channel...
|   |-- build_resolvers 1.3.11
|   |   |-- analyzer...
|   |   |-- build...
|   |   |-- crypto...
|   |   |-- graphs...
|   |   |-- logging...
|   |   |-- package_config...
|   |   |-- path...
|   |   '-- pub_semver...
|   |-- build_runner_core 6.0.1
|   |   |-- async...
|   |   |-- build...
|   |   |-- build_config...
|   |   |-- build_resolvers...
|   |   |-- collection...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- graphs...
|   |   |-- json_annotation...
|   |   |-- logging...
|   |   |-- meta...
|   |   |-- package_config...
|   |   |-- path...
|   |   |-- pedantic...
|   |   |-- pool...
|   |   |-- timing...
|   |   |-- watcher...
|   |   '-- yaml...
|   |-- code_builder 3.4.0
|   |   |-- built_collection...
|   |   |-- built_value...
|   |   |-- collection...
|   |   |-- matcher...
|   |   '-- meta...
|   |-- collection...
|   |-- crypto...
|   |-- dart_style 1.3.6
|   |   |-- analyzer...
|   |   |-- args...
|   |   |-- path...
|   |   '-- source_span...
|   |-- glob 1.2.0
|   |   |-- async...
|   |   |-- collection...
|   |   |-- node_io 1.1.1
|   |   |   |-- node_interop 1.1.1
|   |   |   |   '-- js...
|   |   |   '-- path...
|   |   |-- path...
|   |   |-- pedantic...
|   |   '-- string_scanner...
|   |-- graphs 0.2.0
|   |-- http_multi_server 2.2.0
|   |   '-- async...
|   |-- io 0.3.4
|   |   |-- charcode...
|   |   |-- meta...
|   |   |-- path...
|   |   '-- string_scanner...
|   |-- js 0.6.2
|   |-- logging 0.11.4
|   |-- meta...
|   |-- mime 0.9.7
|   |-- path...
|   |-- pedantic...
|   |-- pool 1.4.0
|   |   |-- async...
|   |   '-- stack_trace...
|   |-- pub_semver 1.4.4
|   |   '-- collection...
|   |-- pubspec_parse 0.1.5
|   |   |-- checked_yaml...
|   |   |-- json_annotation...
|   |   |-- pub_semver...
|   |   '-- yaml...
|   |-- shelf 0.7.7
|   |   |-- async...
|   |   |-- collection...
|   |   |-- http_parser...
|   |   |-- path...
|   |   |-- stack_trace...
|   |   '-- stream_channel...
|   |-- shelf_web_socket 0.2.3
|   |   |-- shelf...
|   |   |-- stream_channel...
|   |   '-- web_socket_channel...
|   |-- stack_trace...
|   |-- stream_transform 1.2.0
|   |-- timing 0.1.1+2
|   |   '-- json_annotation...
|   |-- watcher...
|   |-- web_socket_channel 1.1.0
|   |   |-- async...
|   |   |-- crypto...
|   |   '-- stream_channel...
|   '-- yaml 2.2.1
|       |-- charcode...
|       |-- collection...
|       |-- source_span...
|       '-- string_scanner...
|-- cloud_firestore 0.13.7
|   |-- cloud_firestore_platform_interface 1.1.2
|   |   |-- collection...
|   |   |-- firebase_core...
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- cloud_firestore_web 0.1.1+2
|   |   |-- cloud_firestore_platform_interface...
|   |   |-- firebase 7.3.0
|   |   |   |-- http...
|   |   |   |-- http_parser...
|   |   |   '-- js...
|   |   |-- firebase_core...
|   |   |-- flutter...
|   |   |-- flutter_web_plugins 0.0.0
|   |   |   |-- characters...
|   |   |   |-- collection...
|   |   |   |-- flutter...
|   |   |   |-- meta...
|   |   |   |-- typed_data...
|   |   |   '-- vector_math...
|   |   |-- http_parser...
|   |   |-- js...
|   |   '-- meta...
|   |-- firebase_core 0.4.5
|   |   |-- firebase_core_platform_interface 1.0.4
|   |   |   |-- flutter...
|   |   |   |-- meta...
|   |   |   |-- plugin_platform_interface...
|   |   |   '-- quiver...
|   |   |-- firebase_core_web 0.1.1+2
|   |   |   |-- firebase...
|   |   |   |-- firebase_core_platform_interface...
|   |   |   |-- flutter...
|   |   |   |-- flutter_web_plugins...
|   |   |   |-- js...
|   |   |   '-- meta...
|   |   |-- flutter...
|   |   '-- meta...
|   |-- flutter...
|   '-- meta...
|-- connectivity 0.4.9
|   |-- connectivity_for_web 0.3.1
|   |   |-- connectivity_platform_interface...
|   |   |-- flutter...
|   |   '-- flutter_web_plugins...
|   |-- connectivity_macos 0.1.0+3
|   |   '-- flutter...
|   |-- connectivity_platform_interface 1.0.6
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- flutter...
|   '-- meta...
|-- data_connection_checker 0.3.4
|-- dio 3.0.10
|   |-- http_parser 3.1.4
|   |   |-- charcode...
|   |   |-- collection...
|   |   |-- source_span...
|   |   |-- string_scanner...
|   |   '-- typed_data...
|   '-- path 1.8.0-nullsafety
|-- dotted_border 1.0.6
|   |-- flutter...
|   '-- path_drawing 0.4.1
|       |-- flutter...
|       |-- meta...
|       |-- path_parsing 0.1.4
|       |   |-- meta...
|       |   '-- vector_math...
|       '-- vector_math...
|-- equatable 1.2.3
|   |-- collection...
|   '-- meta...
|-- firebase_auth 0.16.1
|   |-- firebase_auth_platform_interface 1.1.8
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   |-- firebase_auth_web 0.1.3+1
|   |   |-- firebase...
|   |   |-- firebase_auth_platform_interface...
|   |   |-- flutter...
|   |   |-- flutter_web_plugins...
|   |   |-- http_parser...
|   |   |-- js...
|   |   '-- meta...
|   |-- firebase_core...
|   |-- flutter...
|   '-- meta...
|-- firebase_crashlytics 0.1.4+1
|   |-- flutter...
|   '-- stack_trace 1.10.0-nullsafety
|       '-- path...
|-- firebase_dynamic_links 0.5.3
|   '-- flutter...
|-- flutter 0.0.0
|   |-- characters 1.1.0-nullsafety.2
|   |-- collection 1.15.0-nullsafety.2
|   |-- meta...
|   |-- sky_engine 0.0.99
|   |-- typed_data 1.3.0-nullsafety.2
|   |   '-- collection...
|   '-- vector_math 2.1.0-nullsafety.2
|-- flutter_bloc 6.0.1
|   |-- bloc...
|   |-- flutter...
|   '-- provider...
|-- flutter_blurhash 0.5.0
|   |-- flutter...
|   '-- meta...
|-- flutter_downloader 1.5.0
|   '-- flutter...
|-- flutter_test 0.0.0
|   |-- async...
|   |-- boolean_selector 2.1.0-nullsafety
|   |   |-- source_span...
|   |   '-- string_scanner...
|   |-- characters...
|   |-- charcode 1.2.0-nullsafety
|   |-- clock 1.1.0-nullsafety
|   |-- collection...
|   |-- fake_async 1.1.0-nullsafety
|   |   |-- clock...
|   |   '-- collection...
|   |-- flutter...
|   |-- matcher 0.12.10-nullsafety
|   |   '-- stack_trace...
|   |-- meta...
|   |-- path...
|   |-- source_span 1.8.0-nullsafety
|   |   |-- charcode...
|   |   |-- collection...
|   |   |-- path...
|   |   '-- term_glyph...
|   |-- stack_trace...
|   |-- stream_channel 2.1.0-nullsafety
|   |   '-- async...
|   |-- string_scanner 1.1.0-nullsafety
|   |   |-- charcode...
|   |   '-- source_span...
|   |-- term_glyph 1.2.0-nullsafety
|   |-- test_api 0.2.19-nullsafety
|   |   |-- async...
|   |   |-- boolean_selector...
|   |   |-- collection...
|   |   |-- matcher...
|   |   |-- meta...
|   |   |-- path...
|   |   |-- source_span...
|   |   |-- stack_trace...
|   |   |-- stream_channel...
|   |   |-- string_scanner...
|   |   '-- term_glyph...
|   |-- typed_data...
|   '-- vector_math...
|-- flutter_widgets 0.1.12
|   |-- collection...
|   |-- flutter...
|   |-- html 0.14.0+3
|   |   |-- csslib 0.16.2
|   |   |   '-- source_span...
|   |   '-- source_span...
|   |-- meta...
|   '-- quiver 2.1.3
|       |-- matcher...
|       '-- meta...
|-- google_fonts 1.1.0
|   |-- crypto...
|   |-- flutter...
|   |-- http 0.12.2
|   |   |-- http_parser...
|   |   |-- path...
|   |   '-- pedantic...
|   |-- path_provider...
|   '-- pedantic...
|-- google_sign_in 4.5.1
|   |-- flutter...
|   |-- google_sign_in_platform_interface 1.1.2
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- quiver...
|   |-- google_sign_in_web 0.9.1+1
|   |   |-- flutter...
|   |   |-- flutter_web_plugins...
|   |   |-- google_sign_in_platform_interface...
|   |   |-- js...
|   |   '-- meta...
|   '-- meta...
|-- hive 1.4.3
|   |-- crypto...
|   '-- meta...
|-- hive_flutter 0.3.1
|   |-- flutter...
|   |-- hive...
|   |-- path...
|   '-- path_provider...
|-- hive_generator 0.7.1
|   |-- analyzer 0.39.17
|   |   |-- _fe_analyzer_shared 7.0.0
|   |   |   '-- meta...
|   |   |-- args...
|   |   |-- charcode...
|   |   |-- cli_util 0.2.0
|   |   |   '-- path...
|   |   |-- collection...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- html...
|   |   |-- meta...
|   |   |-- package_config 1.9.3
|   |   |   |-- charcode...
|   |   |   '-- path...
|   |   |-- path...
|   |   |-- pub_semver...
|   |   |-- source_span...
|   |   |-- watcher...
|   |   '-- yaml...
|   |-- build 1.3.0
|   |   |-- analyzer...
|   |   |-- async...
|   |   |-- convert...
|   |   |-- crypto...
|   |   |-- glob...
|   |   |-- logging...
|   |   |-- meta...
|   |   '-- path...
|   |-- dartx 0.5.0
|   |   |-- characters...
|   |   |-- collection...
|   |   |-- crypto...
|   |   |-- meta...
|   |   |-- path...
|   |   '-- time 1.3.0
|   |-- hive...
|   '-- source_gen 0.9.6
|       |-- analyzer...
|       |-- async...
|       |-- build...
|       |-- dart_style...
|       |-- glob...
|       |-- meta...
|       |-- path...
|       |-- pedantic...
|       '-- source_span...
|-- howler 1.1.2
|   '-- swiss_knife 2.5.8
|       |-- intl...
|       '-- resource_portable 2.1.7
|           '-- typed_data...
|-- html_unescape 1.0.1+3
|-- meta 1.3.0-nullsafety.2
|-- network_image_to_byte 0.0.1
|   '-- flutter...
|-- path_provider 1.6.11
|   |-- flutter...
|   |-- path_provider_linux 0.0.1+2
|   |   |-- flutter...
|   |   |-- path...
|   |   |-- path_provider_platform_interface...
|   |   '-- xdg_directories 0.1.0
|   |       |-- flutter...
|   |       |-- path...
|   |       '-- process 3.0.13
|   |           |-- file 5.2.1
|   |           |   |-- intl...
|   |           |   |-- meta...
|   |           |   '-- path...
|   |           |-- intl...
|   |           |-- meta...
|   |           |-- path...
|   |           '-- platform...
|   |-- path_provider_macos 0.0.4+3
|   |   '-- flutter...
|   '-- path_provider_platform_interface 1.0.2
|       |-- flutter...
|       |-- meta...
|       |-- platform 2.2.1
|       '-- plugin_platform_interface 1.0.2
|           '-- meta...
|-- pedantic 1.9.2
|   '-- meta...
|-- preload_page_view 0.1.4
|   '-- flutter...
|-- provider 4.3.2
|   |-- collection...
|   |-- flutter...
|   '-- nested 0.0.4
|       '-- flutter...
|-- salsa_entities 0.0.0
|   |-- json_annotation 3.0.1
|   '-- meta...
|-- sounds 1.0.0-beta.7
|   |-- device_info 0.4.2+4
|   |   '-- flutter...
|   |-- flutter...
|   |-- flutter_spinkit 4.1.2+1
|   |   '-- flutter...
|   |-- meta...
|   |-- path...
|   |-- path_provider...
|   |-- provider...
|   |-- sounds_common 1.0.7
|   |   |-- flutter...
|   |   |-- intl 0.16.1
|   |   |   '-- path...
|   |   |-- logger 0.9.2
|   |   |-- meta...
|   |   |-- path...
|   |   |-- pedantic...
|   |   '-- uuid...
|   '-- uuid...
|-- string_validator 0.1.4
|-- transparent_image 1.0.0
|-- uni_links 0.4.0
|   '-- flutter...
|-- url_launcher 5.5.0
|   |-- flutter...
|   |-- url_launcher_linux 0.0.1+1
|   |   '-- flutter...
|   |-- url_launcher_macos 0.0.1+7
|   |   '-- flutter...
|   |-- url_launcher_platform_interface 1.0.7
|   |   |-- flutter...
|   |   |-- meta...
|   |   '-- plugin_platform_interface...
|   '-- url_launcher_web 0.1.2
|       |-- flutter...
|       |-- flutter_web_plugins...
|       |-- meta...
|       |-- platform_detect 1.4.0
|       |   |-- meta...
|       |   '-- pub_semver...
|       '-- url_launcher_platform_interface...
|-- uuid 2.2.0
|   |-- convert 2.1.1
|   |   |-- charcode...
|   |   '-- typed_data...
|   '-- crypto 2.1.5
|       |-- collection...
|       |-- convert...
|       '-- typed_data...
'-- watcher 0.9.7+15
    |-- async...
    |-- path...
    '-- pedantic...


Describe the bug

The latest beta update produces an annoying amount of console spam as seen in the logs section. There's no clear way to disable this, and this spams the console even when the player is paused.
A way to turn off debug log messages would be great

[HELP] -- Why is iOS ObjectiveC code released and not the Swift code?

I need Help for :

Understanding why there is a difference between the master branch and pub.dev release?


Here is my question :

In the SoundPlayer.m file line 44 there is an

assert (soundPlayerManager == nil);

which fails.

Similar in the SoundRecorder.m.

And, I wanted to fix this (by simply removing these assert statements).

HOWEVER - when trying to clone and make a pull request of the Sounds github, the implementation on iOS is now done in Swift files.....

Why is the Swift version not released to pub.dev and available?

...or, the ObjectiveC version available for a PR?

Thanks.

Re-architect codec support into separate packages

The codec support in flutter sound is fairly limited.

Users are looking for an expanded set of codecs.

Adding codecs to the core flutter sound package is causing bloat (ffmepg as case in point).

Many users will only want a small no. of codecs and some will be happy with the native codecs provided by each platform.

This proposal aims to:

  1. keep the core flutter sound package small.
  2. provide only native codec support in the core package
  3. create an architecture that allows users to choose which non-native codecs they want to include.
  4. provide a mechanism for third parties to develop support for additional codes without needing to (git) commit to the flutter sound project.
  5. Provide a mechanism so the codec conversion happen in an isolate to avoid jank.
    -- note: currently isolates can't communicate with an plugins (unless you set up a mechanism to
    send the comms via the main isolate).

To achieve this I'm proposing the following.

  • Remove all non-native codec support out of flutter sound.
  • Development of a api that allows codec support to be 'registered' with the core flutter sound package.
  • Move all existing (non-native) codecs into separate packages that are able to register themselves with the above api.
  • Put each codec into its own package so users can pick and choose which codecs they want to support in their app.

So a pubspec.yaml might look like this:

flutter_sound: 5.x
flutter_sound_mpeg: 1.0
flutter_sound_pcm: 1.2
third_party_wav: 1.0

The end user can now pick and choose their preferred codecs.

So I see the api working something like:

Each codec package would implement:

abstract class CodeConverter
{
  Track convertTrack(Track from);
}

The Track contains the codec and the audio information so it seems like a convenient (existing) method of passing the data.
I considered using some other mechanism (raw paths or buffers) but that doesn't appear to add any benefit. Some codecs also support meta data which the Track class includes so that may also be useful.

Each codec package would implement one or more class that 'implement' the CodeConverter interface.

When the app starts the CodecConverter(s) would need to be registered.

class CodecConverters
{
   
   /// throws an exception if the conversion is already registered.
   static  void register({CodecConverter converter, Codec from, Codec to});

   static CodecConverter getConverter({Codec from, Codec to});

   static List<CodecConverter>  get converters();

}

A single package may register any number of codec conversions.

This mechanism would also allow a package to 'chain' multiple conversions.
The package would register their own converter:

CodecConverters.register(from: a, to: c)

void convertTrack({Track a, Track c})
{
   var phase1 = CodecConverters.getConverter(from: a, to: b);
   var phase2 = CodecConverter.getConverter(from: b, to c);
   Track tb = phase1.convertTrack(from: a);
   Track tc = phase2.convertTrack(from: b);
  return tc;
}

We would need to change the Codec enum to using registered names.

class Codecs
{
   /// throws an exception if the name already exists
   static Codec register({String name, String extension});
  /// perhaps
  static Codec getOrRegister({String name, String extension});

 /// method to use a codec
 static Codec getByName(String name);
 static Codec getByExtension(String extension);

 /// returns a list of the native codecs supported by the current platform.
  static List<Codec> get nativeCodecs;
}

With the 5.0 api we use Track for both recording and playback.
The above mechanism can be done without changing the 5.x api.

For playback:
The AudioPlayer will convert the track before it starts playing.
This will mean that for URL's we are going to have to pre-cache the data.

  • the pre-cache should be done in an isolate

This might not be a bad thing because at some point we probably want to add streaming and do realtime codec translation. This will require and more advanced converter that takes a segment of the audio in a buffer and converts one segment at a time. We possibly need to do this in an isolate. Perhaps we have an isolate dedicated to codec conversions.
I'm not proposing that we do this at the moment but the above architecture would allow us to do this with no changes to the core flutter sound api.

For recording the conversion would occur once the recording has finished.
The above noted streaming concept could also be applied to recording at a later date.

Isolates/Jank
Converting large files will cause UI frames to be dropped (jank).
To avoid this we need to create a mechanism which pushes the conversions into an isolate.
Moving data between isolates is limited and expensive. For some operations the cost of the transfer is higher than the gain by pushing the logic into an isolate.
We essentially have two data types to worry about. File based audio and buffer based audio.
The file based audio is easy to deal with as we just pass the path across the isolate and wait for the conversion to complete.
Buffer based audio will be more problematic. For large files it is likely that just the act of sending/receiving the data across the isolate boundary will cause jank.
We have to possible paths to solving this.
Implement a 'packet' based protocol where we send the buffer across the isolate boundary in small packets. Sending of these packets would need to be queued and sent with something like a sequence of Future.delayed calls.
By using the Future.delayed mechanism we are essentially yielding to the flutter message queue allowing it to have time to draw frames between each transmission.
Alternatively we could write the buffer to a file and send the path to the isolate. In either case we would also need to queue the writes to the file to avoid jank.

Thoughts/comments?

Review system state change messages.

The SoundPlayer emits events when a state changes:

onStarted
onStopped
onPaused
onResume

It looks like there may be some inconsistency in how these are generated and from where.

It looks like the SoundPlayer will generate these events (in some situations) and the plugin code (java/object-c) will generate them in some cases.

It would seem more appropriate that these events are generated via the plugin in all cases as it really is the primary source and there are some situations where the plugin will generate these events without action in the dart code.

It also looks like we don't have a 'resume' event coming up from the plugin.

So I think the correct action.

The java/object plugin logic should generate the events.
The only circumstances where the dart code should generate the events is if we find some scenario where a state change needs to be reflected by the plugin can't possibly know about it. At this point I can't think of any valid circumstances.

Cache URL audio

It should be noted that we already have the Downloader class that can download a file with progress information.

A number of users have requested the ability to cache URL audio data so that subsequent playbacks are not delayed.

Currently the Track class has been designed to avoid the user having to manage any resources Sounds needs to internally allocate for a Track (e.g. cached for url data).

If a Track where to auotmatically cache the URL data then we would have to exposes a 'release' method on the Track class to allow users to indicate when we should clear the cache.

Whilst an out of the box caching experience sounds nice it does raise questions about exactly how it should be implemented and what the UI should look like when pre-caching audio.

QuickPlay is a good example as it doesn't have a UI so the user will simply not see/hear anything as the audio gets cached.
The ShadePlayer is also an issue because again we have no way to indicate via the UI that we are caching the data (this might not be true potentially the shades do have a method of playing directly from a URL).

Our own widget SoundPlayerUI already supports loading the URL data and reflecting the download progress in the UI (vai a percentage spinning progress indicator).

It feels like it might be better if we gave the user an explicit caching mechanism and they then build the UI to suite their purposes.

Internally we use Track._prepareStream to download URL data.
We could just expose this externally and then also expose Track._release. I'm not a big fan of this as the release method will suggest to users that they need to call release all of the time which isn't the case.

So what about a caching class

class TrackCache
{
      Stream<Progress> cacheTrack(track);
      release(track);
     releaseAll();
}

When you call cacheTrack it returns a stream which could be passed to a StreamBuilder to allow a user to build a widget that reflects the caching progress.

It should be noted that we already have the Downloader class that can download a file with progress information.

Thoughts?

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.