diff --git a/.clang-format b/.clang-format
new file mode 100644
index 000000000..6165b7078
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,4 @@
+# Defines the Chromium style for automatic reformatting.
+# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
+BasedOnStyle: Chromium
+Standard: c++17
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..ac7450edd
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,13 @@
+[{*.kt,*.kts}]
+max_line_length = 120
+insert_final_newline = true
+ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
+ij_kotlin_continuation_indent_size = 4
+ij_kotlin_allow_trailing_comma_on_call_site = true
+ij_kotlin_allow_trailing_comma = true
+ij_kotlin_name_count_to_use_star_import = 999
+ij_kotlin_name_count_to_use_star_import_for_members = 999
+
+[*.swift]
+indent_style = space
+indent_size = 2
\ No newline at end of file
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..e6edbca3d
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+open_collective: blue-fire
+github: bluefireteam
+patreon: bluefireoss
diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
deleted file mode 100644
index d01143f12..000000000
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-name: Bug Report
-about: If you found a bug, please use this template to report it.
-title: ''
-labels: bug
-assignees: ''
-
----
-
-["one liner" - concisely describe your bug with one very brief paragraph, preferably between 1-3 lines, in clear, correct and acceptable English]
-
-**Full Description**
-Describe in what the bug is, exactly how, what and when it happens. In particular specifying what you thought should happen and what did happen, and how they differ, in detail. Unless the bug is abundantly clear by the "one liner" (rarely is), this is mandatory. Try to be concise but it's better to write too much than too little.
-
-**Code to Reproduce**
-A [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example), i.e., code that allows us to replicate the bug. This is **mandatory**. It can be one line, if it already is enough to reproduce (rarely is), or a bigger example with all your relevant code. You **must** use code blocks to put your code in. Don't send your whole project repo, please read the article linked and extract a **minimal** example, but feel free to link a newly created sample repo reproducing the issue instead of pasting code if necessary (rarely is). If you do link a repo, you must put in at least a little bit of the relevant code and where to find it in the repo.
-
-**Log Errors**
-If your problem involves log errors or messages, please put them here, in full, but feel free to highlight the parts that are relevant. You **must** use code blocks (or gists) to paste in log lines. An absolutely outstanding example would be to add a code block with 2-3 relevant log lines, followed by a link to a gist with the whole log from which the relevant lines were extracted.
-
-**Files/URLs/Sources**
-If your issue or bug involves specific files, you must provide them. If they are URLs they should already be somewhere in the code provided but please replicate those here. If they are private URLs or actual files, please upload them somewhere accessible and add them here. If your issue is with a stream, for example, provide the stream link or if the stream is private, create a similar stream that also causes the problem and is public, and add that. If you don't know if your issue involves specific resources, please download a few of the [mp3 sample files](https://github.com/luanpotter/audioplayers/tree/master/example/assets) present in the `example` app and test with those instead of whatever you are doing currently. If the issue persists, it does not involve specific files. Otherwise, this section is **mandatory**.
-
-**Screenshots**
-If applicable, add screenshots or video recordings to help explain your problem. This is totally optional.
-
-**Platforms**
-List in detail here **all** the platforms that you have tested, indicating which platforms the error occurs on. Please try to test on as many different platforms as possible to make our lives easier (this is optional). You must add at least one platform in which the problem occurs (evidently). For each platform listed, you must specify:
-
-* OS: web, android, ios, macos, etc. if web, which browser was used.
-* OS version: the android version, ios/macos versions or browser version used.
-* Device: whether it was a physical device or emulator/simulator. If running on a physical device, what brand/model/kind of device was used. If running on an emulator, what host desktop was used. For web/desktop, what desktop OS and version was used.
-* flutter version: what exact flutter version you used. If you think it might be a configuration/setup issue, feel free to add a link to a gist with the output of `flutter doctor -v` (this is optional).
-* audioplayers version: what version on pub you used, or if you built it yourself what branch and was the latest commit hash
-* release or not release: specify if you ran the app in release, profile or debug modes. Also specify here any additional flags or conditions that might be relevant (for example, if you ran flutter web with the skia use canvas flag set to true, please mention that here).
-* does the error occur and does it have any peculiarities: of course if you only tested in one platform, clearly the error occurred there. But if you happened to test on several platforms, please include all of your tests, even the ones that succeeded here, as that info is super valuable. Add details of what was the result in each platform to the extent to which they differed.
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
new file mode 100644
index 000000000..cfde6aff4
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -0,0 +1,186 @@
+name: Bug Report
+description: File a bug report
+labels: ["bug", "triage"]
+body:
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I read the [troubleshooting guide](https://github.com/bluefireteam/audioplayers/blob/main/troubleshooting.md) before raising this issue
+ required: true
+ - label: I made sure that the issue I am raising doesn't already exist
+ required: true
+ - type: textarea
+ id: current-bug
+ attributes:
+ label: Current bug behaviour
+ placeholder: Tell us what you see!
+ validations:
+ required: true
+ - type: textarea
+ id: expected-bug
+ attributes:
+ label: Expected behaviour
+ placeholder: Tell us, what did you expect to happen?
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction-steps
+ attributes:
+ label: Steps to reproduce
+ value: |
+ 1. Execute `flutter run` on the code sample
+ 2. ...
+ 3. ...
+ validations:
+ required: false
+ - type: textarea
+ id: code-sample
+ attributes:
+ label: Code sample
+ description: |
+ Provide a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example), i.e., code that allows us to replicate the bug. You have the following options:
+ * "One liner", if it already is enough to reproduce (rarely is).
+ * A bigger example with all your relevant code. You **must** use code blocks to put your code in.
+ * Link a newly created sample repo reproducing the issue:
+ * Either use a newly created sample, e.g. via `flutter create my_bug`
+ * Or use the existing [example](https://github.com/bluefireteam/audioplayers/tree/main/packages/audioplayers/example)
+ value: |
+
+ Code sample
+
+ ```dart
+ void main() {
+ }
+ ```
+
+
+ validations:
+ required: false
+ - type: dropdown
+ id: platforms
+ attributes:
+ label: Affected platforms
+ description: What platforms are you seeing the problem on?
+ multiple: true
+ options:
+ - Android
+ - iOS
+ - web
+ - Windows
+ - Linux
+ - macOS
+ - other
+ validations:
+ required: true
+ - type: textarea
+ id: platform-details
+ attributes:
+ label: Platform details
+ description: If relevant, what exact device(s) or operating system do you use?
+ placeholder: |
+ * Platform 1: iOS 16.3, Apple iPhone 12
+ * Platform 2: Windows 11, Microsoft Surface Laptop 4
+ * Platform 3: Android 12 (API 32), Android Emulator
+ * Platform 4: Chrome `109.0.5414.121`, MacBook Pro 13" 2022 M2
+ validations:
+ required: false
+ - type: input
+ id: ap-version
+ attributes:
+ label: AudioPlayers Version
+ description: In which AudioPlayers version does the issue occur?
+ placeholder: main, 1.0.2, 3.0.1
+ validations:
+ required: true
+ - type: dropdown
+ id: build-mode
+ attributes:
+ label: Build mode
+ multiple: true
+ options:
+ - debug
+ - profile
+ - release
+ validations:
+ required: false
+ - type: textarea
+ id: sources
+ attributes:
+ label: Audio Files/URLs/Sources
+ description: |
+ * Provide the files or URLs which may affect the issue.
+ * Test your code with some of the [sample files](https://github.com/luanpotter/audioplayers/tree/master/example/assets). If the problem persists you don't need to provide your own source, otherwise, this section is **mandatory**.
+ * Rewrite URLs here which are already somewhere in your sample code.
+ * Make private URLs or actual files accessible, by uploading them (e.g. wrap them in a `zip` file for GitHub).
+ placeholder: |
+ Drag and drop your source files here or provide a link!
+
+ * Sample Url: https://luan.xyz/files/audio/coins.wav
+ * Sample Stream: https://example.com/my_stream.m3u8
+ validations:
+ required: false
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots
+ description: |
+ If applicable, add screenshots or video recordings to help explain your problem. This is totally optional.
+ You can upload them directly on GitHub. Beware that video file size is limited to 10MB.
+ placeholder: Drag and drop your screenshots here!
+ validations:
+ required: false
+ - type: textarea
+ id: logs
+ attributes:
+ label: Logs
+ description: |
+ * Relevant logs
+ * Full logs
+ * Flutter doctor
+ value: |
+
+ ```
+ my relevant logs
+ ```
+
+
+ Full Logs
+
+
+
+ ```
+ my full logs or a link to a gist
+ ```
+
+ Flutter doctor:
+ ```
+ Output of: flutter doctor -v
+ ```
+
+ validations:
+ required: false
+ - type: textarea
+ id: more-info
+ attributes:
+ label: Related issues / more information
+ description: |
+ Do you have any other useful information about this bug report?
+ References to other issues / sites / repositories?
+ placeholder: |
+ Related: #123, #456
+ validations:
+ required: false
+ - type: dropdown
+ id: working-pull-request
+ attributes:
+ label: Working on PR
+ description: Are you interested in working on a PR for this?
+ multiple: false
+ # For some reason GH forms does not allow "yes" as option.
+ options:
+ - no way
+ - yeah
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
deleted file mode 100644
index b387d5b2d..000000000
--- a/.github/ISSUE_TEMPLATE/feature-request.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-name: Feature Request
-about: If you have a suggestion for some change or new feature, please use this template
- to report it.
-title: ''
-labels: feature-request
-assignees: ''
-
----
-
-*First of all, make sure that the feature you are proposing doesn't already exist. Delete this line only once you did that.*
-
-["one liner" - concisely describe your feature request with one very brief paragraph, preferably between 1-3 lines, in clear, correct and acceptable English]
-
-**Full Description**
-Describe thoroughly what the feature you desire is, why it's useful and why it fits in this package (and not a standalone package for example). Mention what your use case is (what you want to use it for) and how it should be included (what API changes that are necessary, if they are breaking changes, etc). This is mandatory. Please include how it should be implemented as well (is it a new flag to pass through to android/ios, is it just a new method using some build in functions, etc). This last part is optional but highly encouraged. It's super valuable to do some research to help us make sure your idea is doable. This section is mandatory.
-
-**Example Code**
-Unless your feature requires no API changes whatsoever, provide a very concise code example of how it would be used in a Flutter app. This is **mandatory** if your feature requires any API changes. You **must** use code blocks to put your code in. You can link an example repo (unnecessary) but you must add a simple version on the issue.
-
-**Platforms**
-Make sure to identify for which platforms this must be implemented. By platforms here I mean: android, ios, web, macos, etc. This section is mandatory.
-
-First, assess if this already exists or not on some platforms but not on others. Some stuff we currently only support on Android or only on iOS because Open Source projects are made with the help of the community and we not always have time to do everything. If, for example, you want an iOS feature to be added to android, that is totally fine but specify that here. In this case, provide in the sections above a clear explanation of how it already works on all platforms its present on (e.g. the Code section must include code for how to use it on platform X and what changes (if any, probably none) are necessary on the api level to add it to platform Y).
-
-Secondly, asses in which platforms this make sense to be added. Especially web/macos. There are some features that just don't make sense outside of the mobile world, for example. Not everything needs to be present on all platforms. Please think about which platforms this should be added for, ideally. That doesn't mean we will end up doing all of them to start, but just as the goal.
-
-This is also a perfect section to include, if your prior research already revealed it, if there are minimum OS versions that are absolutely required to add this feature. For example, if it's only possible to do it after Android 23, add that detail here.
-
-**Sample Files/URLs/Sources**
-If your feature request involves a new type of file, a different URL, stream type, etc, please provide here any resources that would be required to test or develop your feature. For example, if you wanted to play a different kind of file, please provide such file. This section is optional (only add it if it makes sense).
-
-**Mockups**
-If applicable, add mockup screenshots or videos to help to explain what this feature would look like. This is totally optional. It can also be screenshots/screen recordings of existing apps, built using other libraries (like native libraries), to do what you want, or of how it works on other platforms if it already exists on audioplayers on some platforms.
-
-**Research Resources**
-During your research for your use case, you might have encountered some existing apps using this feature through other (maybe native) libraries, tutorials explaining how to do it on the native side, articles explaining why this is useful for end users, etc. Add here any links or references that you have to help to make your case for this feature. This is optional but highly encouraged if your feature is anything bigger or more complex.
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
new file mode 100644
index 000000000..8e841b9ee
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -0,0 +1,125 @@
+name: Feature Request
+description: File a suggestion or feature request
+labels: ["feature-request", "triage"]
+body:
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I made sure that the issue I am raising doesn't already exist
+ required: true
+ - type: textarea
+ id: use-case
+ attributes:
+ label: Use case / Problem
+ description: |
+ Which problem would be solved with this feature?
+ Why it fits in this package (and not a standalone package for example)
+ placeholder: Tell us your use case!
+ validations:
+ required: true
+ - type: textarea
+ id: proposal
+ attributes:
+ label: Proposal / Solution
+ description: |
+ What do you propose as a solution? Add as much information as you can!
+ What API changes that are necessary? Are there any breaking changes expected?
+ placeholder: Tell us, how to solve the problem?
+ validations:
+ required: true
+ - type: textarea
+ id: code-example
+ attributes:
+ label: Example Code
+ description: |
+ If your feature requires an API change, provide a very concise code example of how it would be used in a Flutter app.
+ You can also link an example repo (if wanted) but keep it simple. Or use the [example project](https://github.com/bluefireteam/audioplayers/tree/main/packages/audioplayers/example).
+ value: |
+
+ Example Code
+
+ ```dart
+ void main() {
+ }
+ ```
+
+
+ validations:
+ required: false
+ - type: dropdown
+ id: platforms
+ attributes:
+ label: Affected platforms
+ description: What platforms are you seeing the problem on?
+ multiple: true
+ options:
+ - Android
+ - iOS
+ - web
+ - Windows
+ - Linux
+ - macOS
+ - other
+ validations:
+ required: true
+ - type: textarea
+ id: platform-details
+ attributes:
+ label: Platform details
+ description: |
+ * It's ok to not implement the feature for every platform. On some it doesn't even make sense (e.g. Mobile vs. Desktop). Write down your thoughts!
+ * What needs to be changed to port an existing feature to other platforms?
+ * Will the feature require a specific API level or package to work?
+ validations:
+ required: false
+ - type: textarea
+ id: sources
+ attributes:
+ label: Audio Files/URLs/Sources
+ description: |
+ * Provide the files or URLs which are involved in your feature request, e.g. support a new file type.
+ * Make private URLs or actual files accessible, by uploading them (e.g. wrap them in a `zip` file for GitHub).
+ placeholder: |
+ Drag and drop your source files here or provide a link!
+
+ * Sample Url: https://luan.xyz/files/audio/coins.wav
+ * Sample Stream: https://example.com/my_stream.m3u8
+ validations:
+ required: false
+ - type: textarea
+ id: mockups
+ attributes:
+ label: Mockups
+ description: |
+ If applicable, add mockup screenshots or videos to help to explain what this feature would look like.
+ It can also be screenshots/screen recordings of existing apps, built using other libraries (like native libraries).
+ placeholder: Drag and drop your screenshots here!
+ validations:
+ required: false
+ - type: textarea
+ id: more-info
+ attributes:
+ label: Related issues / more information
+ description: |
+ Do you have any other useful information about this feature report?
+ References to other issues / sites / repositories / apps / tutorials with similar functionality?
+ placeholder: |
+ App xyz already provides this feature.
+ See abc repository for inspiration.
+ Related: #123, #456
+ validations:
+ required: false
+ - type: dropdown
+ id: working-pull-request
+ attributes:
+ label: Working on PR
+ description: Are you interested in working on a PR for this?
+ multiple: false
+ # For some reason GH forms does not allow "yes" as option.
+ options:
+ - no way
+ - yeah
+ validations:
+ required: true
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 000000000..f1043b021
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,54 @@
+# Description
+
+
+
+## Checklist
+
+
+
+- [ ] The title of my PR starts with a [Conventional Commit] prefix (`fix:`, `feat:`, `refactor:`,
+ `docs:`, `chore:`, `test:`, `ci:` etc).
+- [ ] I have read the [Contributor Guide] and followed the process outlined for submitting PRs.
+- [ ] I have updated/added tests for ALL new/updated/fixed functionality.
+- [ ] I have updated/added relevant documentation and added dartdoc comments with `///`, where necessary.
+- [ ] I have updated/added relevant examples in [example].
+
+## Breaking Change
+
+
+
+- [ ] Yes, this is a breaking change.
+- [ ] No, this is *not* a breaking change.
+
+
+
+
+
+## Related Issues
+
+
+
+
+[issue database]: https://github.com/bluefireteam/audioplayers/issues
+[Contributor Guide]: https://github.com/bluefireteam/audioplayers/blob/main/contributing.md#feature-requests--prs
+[Conventional Commit]: https://conventionalcommits.org
+[example]: https://github.com/bluefireteam/audioplayers/tree/main/packages/audioplayers/example
diff --git a/.github/workflows/build-example.yml b/.github/workflows/build-example.yml
new file mode 100644
index 000000000..ce4ac3a33
--- /dev/null
+++ b/.github/workflows/build-example.yml
@@ -0,0 +1,211 @@
+name: build example
+on:
+ workflow_dispatch:
+ inputs:
+ flutter_version:
+ description: 'Flutter Version'
+ required: false
+ default: 'any'
+ type: choice
+ options:
+ - 'any'
+ - '3.35.x'
+ - '3.32.x'
+ flutter_channel:
+ description: 'Flutter Channel'
+ required: false
+ default: 'stable'
+ type: choice
+ options:
+ - 'stable'
+ - 'beta'
+ - 'dev'
+ - 'master'
+ enable_android:
+ description: 'Build Android'
+ required: false
+ default: true
+ type: boolean
+ enable_web:
+ description: 'Build Web'
+ required: false
+ default: true
+ type: boolean
+ enable_ios:
+ description: 'Build IOS'
+ required: false
+ default: true
+ type: boolean
+ enable_windows:
+ description: 'Build Windows'
+ required: false
+ default: true
+ type: boolean
+ enable_linux:
+ description: 'Build Linux'
+ required: false
+ default: true
+ type: boolean
+ enable_macos:
+ description: 'Build MacOS'
+ required: false
+ default: true
+ type: boolean
+ upload_pages_artifact:
+ description: 'Upload build artifact for GH pages'
+ required: false
+ default: false
+ type: boolean
+ workflow_call:
+ inputs:
+ flutter_version:
+ required: false
+ default: '3.35.7'
+ type: string
+ flutter_channel:
+ required: false
+ default: 'stable'
+ type: string
+ enable_android:
+ required: false
+ default: true
+ type: boolean
+ enable_web:
+ required: false
+ default: true
+ type: boolean
+ enable_ios:
+ required: false
+ default: true
+ type: boolean
+ enable_windows:
+ required: false
+ default: true
+ type: boolean
+ enable_linux:
+ required: false
+ default: true
+ type: boolean
+ enable_macos:
+ required: false
+ default: true
+ type: boolean
+ upload_pages_artifact:
+ required: false
+ default: false
+ type: boolean
+
+jobs:
+ web:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ if: inputs.enable_web
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build Web app
+ working-directory: ./packages/audioplayers/example
+ run: flutter build web --base-href "/audioplayers/"
+ - name: Example app - Build Web app in WASM
+ working-directory: ./packages/audioplayers/example
+ run: flutter build web --base-href "/audioplayers/" --wasm
+ - name: Upload pages artifact
+ if: inputs.upload_pages_artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./packages/audioplayers/example/build/web
+
+ android:
+ runs-on: ubuntu-latest
+ timeout-minutes: 60
+ if: inputs.enable_android
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example App - Build Android APK
+ working-directory: ./packages/audioplayers/example
+ run: flutter build apk --release
+
+ ios:
+ runs-on: macos-latest
+ timeout-minutes: 30
+ if: inputs.enable_ios
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build iOS
+ working-directory: ./packages/audioplayers/example
+ run: flutter build ios --release --no-codesign
+
+ macos:
+ runs-on: macos-latest
+ timeout-minutes: 30
+ if: inputs.enable_macos
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build macOS
+ working-directory: ./packages/audioplayers/example
+ run: flutter build macos --release
+
+ windows:
+ runs-on: windows-latest
+ timeout-minutes: 30
+ if: inputs.enable_windows
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build Windows app
+ working-directory: ./packages/audioplayers/example
+ run: flutter build windows --release
+
+ linux:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ if: inputs.enable_linux
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Install Flutter requirements for Linux
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
+ - name: Install GStreamer
+ # Install libunwind-dev, see https://github.com/actions/runner-images/issues/6399#issuecomment-1285011525
+ run: |
+ sudo apt install -y libunwind-dev
+ sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
+
+ - name: Example app - Build Linux app
+ working-directory: ./packages/audioplayers/example
+ run: flutter build linux --release
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
deleted file mode 100644
index a50783722..000000000
--- a/.github/workflows/build.yaml
+++ /dev/null
@@ -1,127 +0,0 @@
-name: build
-on:
- push:
- branches:
- - master
- pull_request:
- branches:
- - master
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v1
- - uses: subosito/flutter-action@v1
- with:
- channel: stable
-
- - name: Lint (analyze and format)
- run: ./scripts/lint.sh
-
- - name: Dartdoc
- run: ./scripts/dartdoc.sh
-
- - name: Run tests
- run: ./scripts/test.sh
-
- web:
- runs-on: ubuntu-latest
- steps:
- - uses: nanasess/setup-chromedriver@v1
- - uses: actions/checkout@v1
- - uses: subosito/flutter-action@v1
- with:
- channel: stable
-
- - name: Example App - Build web app
- working-directory: ./packages/audioplayers/example
- run: |
- flutter pub get
- flutter build web
-
- - name: web integration test
- working-directory: ./packages/audioplayers/example
- run: |
- export DISPLAY=:99
- chromedriver --port=4444 &
- sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional
-
- flutter drive \
- --driver=test_driver/integration_test.dart \
- --target=integration_test/app_test.dart \
- -d web-server
-
- android:
- runs-on: macOS-latest
-
- steps:
- - uses: malinskiy/action-android/install-sdk@release/0.1.2
- - uses: actions/checkout@v1
- - uses: subosito/flutter-action@v1
- with:
- channel: stable
-
- - name: Use specific Java version for sdkmanager to work
- uses: joschi/setup-jdk@v2
- with:
- java-version: 'openjdk8'
- architecture: 'x64'
-
- - name: Example App - Build android APK
- working-directory: ./packages/audioplayers/example
- run: |
- flutter pub get
- flutter build apk --release
-
- - name: Run android unit tests
- working-directory: ./packages/audioplayers/example/android
- run: |
- ./gradlew test
-
- - name: Download Android Emulator Image
- run: |
- echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-30;google_apis;x86"
- echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-30;google_apis;x86'
- $ANDROID_HOME/emulator/emulator -list-avds
- - name: "Start Android Emulator"
- timeout-minutes: 10
- run: |
- echo "Starting emulator"
- ls "$ANDROID_HOME/tools/bin/"
- $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" "platforms;android-30"
- echo "$ANDROID_HOME/platform-tools"
- ls "$ANDROID_HOME/"
- ls "$ANDROID_HOME/platform-tools"
- nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window &
- $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
- $ANDROID_HOME/platform-tools/adb devices
- echo "Emulator started"
- - name: "Run Flutter Driver tests"
- working-directory: ./packages/audioplayers/example
- run: "flutter test integration_test"
-
- ios:
- runs-on: macOS-latest
-
- steps:
- - name: List all simulators
- run: "xcrun instruments -s"
- - name: Start Simulator
- run: |
- UDID=$(xcrun instruments -s | grep "iPhone" | sed -n 1p | awk -F ' *[][]' '{ print $2 }')
- echo "Using simulator $UUID"
- xcrun simctl boot "${UDID:?No Simulator with this name iPhone found}"
- - uses: actions/checkout@v1
- - uses: subosito/flutter-action@v1
- with:
- channel: stable
- - name: Example App - Build iOS
- working-directory: ./packages/audioplayers/example
- run: |
- flutter pub get
- flutter build ios --release --no-codesign
- - name: Run Flutter Driver tests
- working-directory: ./packages/audioplayers/example
- run: "flutter test integration_test"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..535e9d10e
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,40 @@
+name: build
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ call-build-example:
+ uses: ./.github/workflows/build-example.yml
+ with:
+ upload_pages_artifact: true
+
+ call-test:
+ needs: call-build-example
+ uses: ./.github/workflows/test.yml
+ with:
+ enable_min_version: true
+
+ deploy-github-pages:
+ needs:
+ - call-build-example
+ - call-test
+ permissions:
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.github/workflows/changes-requested.yml b/.github/workflows/changes-requested.yml
index ad1fc3a8e..dd4714ebd 100644
--- a/.github/workflows/changes-requested.yml
+++ b/.github/workflows/changes-requested.yml
@@ -2,7 +2,7 @@ name: changes-requested
on:
schedule:
- - cron: "0 * * * *" # pick a cron here, this is every 1h
+ - cron: "0 0 * * *" # pick a cron here, this is every day
workflow_dispatch:
jobs:
@@ -13,8 +13,8 @@ jobs:
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# these are optional, if you want to configure:
- days-until-close: 5
+ days-until-close: 7
trigger-label: changes-requested
closing-comment: This issue was closed by the changes-requested bot due to inactivity.
dry-run: false
-
\ No newline at end of file
+
diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
new file mode 100644
index 000000000..3660a871d
--- /dev/null
+++ b/.github/workflows/pull-request.yml
@@ -0,0 +1,31 @@
+name: pull-request
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+ - synchronize
+ - ready_for_review
+
+jobs:
+ call-min-flutter-test:
+ uses: ./.github/workflows/test.yml
+ with:
+ flutter_version: '3.32.8'
+ fatal_warnings: false
+ enable_android: ${{ github.event.pull_request.draft == false }}
+ enable_web: ${{ github.event.pull_request.draft == false }}
+ enable_ios: ${{ github.event.pull_request.draft == false }}
+ enable_windows: ${{ github.event.pull_request.draft == false }}
+ enable_linux: ${{ github.event.pull_request.draft == false }}
+ enable_macos: ${{ github.event.pull_request.draft == false }}
+ call-test:
+ uses: ./.github/workflows/test.yml
+ with:
+ enable_android: ${{ github.event.pull_request.draft == false }}
+ enable_web: ${{ github.event.pull_request.draft == false }}
+ enable_ios: ${{ github.event.pull_request.draft == false }}
+ enable_windows: ${{ github.event.pull_request.draft == false }}
+ enable_linux: ${{ github.event.pull_request.draft == false }}
+ enable_macos: ${{ github.event.pull_request.draft == false }}
+ enable_min_version: true
diff --git a/.github/workflows/release-prepare.yml b/.github/workflows/release-prepare.yml
new file mode 100644
index 000000000..6cc8cdc74
--- /dev/null
+++ b/.github/workflows/release-prepare.yml
@@ -0,0 +1,28 @@
+name: Prepare release
+on:
+ workflow_dispatch:
+ inputs:
+ prerelease:
+ description: 'Version as prerelease'
+ required: false
+ default: false
+ type: boolean
+
+jobs:
+ prepare-release:
+ name: Prepare release
+ permissions:
+ contents: write
+ pull-requests: write
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: subosito/flutter-action@v2
+ - uses: bluefireteam/melos-action@v3
+ with:
+ run-versioning: ${{ inputs.prerelease == false }}
+ run-versioning-prerelease: ${{ inputs.prerelease == true }}
+ publish-dry-run: true
+ create-pr: true
diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml
new file mode 100644
index 000000000..5a1f0eecb
--- /dev/null
+++ b/.github/workflows/release-publish.yml
@@ -0,0 +1,19 @@
+name: Publish packages
+on:
+ workflow_dispatch:
+
+jobs:
+ publish-packages:
+ name: Publish packages
+ permissions:
+ contents: write
+ id-token: write # Required for authentication using OIDC
+ runs-on: [ ubuntu-latest ]
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: subosito/flutter-action@v2
+ - uses: bluefireteam/melos-action@v3
+ with:
+ publish: true
diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml
new file mode 100644
index 000000000..6ea095df8
--- /dev/null
+++ b/.github/workflows/release-tag.yml
@@ -0,0 +1,28 @@
+name: Tag and start release
+on:
+ push:
+ branches: [main]
+
+jobs:
+ publish-packages:
+ name: Create tags for release
+ permissions:
+ actions: write
+ contents: write
+ runs-on: [ ubuntu-latest ]
+ if: contains(github.event.head_commit.message, 'chore(release)')
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: subosito/flutter-action@v2
+ - uses: bluefireteam/melos-action@v3
+ with:
+ tag: true
+ - run: |
+ melos exec -c 1 --no-published --no-private --order-dependents -- \
+ gh workflow run release-publish.yml \
+ --ref \$MELOS_PACKAGE_NAME-v\$MELOS_PACKAGE_VERSION
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 000000000..f81f32767
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,20 @@
+name: stale
+
+on:
+ schedule:
+ - cron: "0 0 * * *" # pick a cron here, this is every day
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: luanpotter/changes-requested@master
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ # these are optional, if you want to configure:
+ days-until-close: 30
+ trigger-label: stale
+ closing-comment: This issue was closed by the stale bot due to inactivity.
+ dry-run: false
+
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 000000000..7de5a412c
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,468 @@
+name: test
+on:
+ workflow_dispatch:
+ inputs:
+ flutter_version:
+ description: 'Flutter Version'
+ required: false
+ default: 'any'
+ type: choice
+ options:
+ - 'any'
+ - '3.35.x'
+ - '3.32.x'
+ flutter_channel:
+ description: 'Flutter Channel'
+ required: false
+ default: 'stable'
+ type: choice
+ options:
+ - 'stable'
+ - 'beta'
+ - 'dev'
+ - 'master'
+ fatal_warnings:
+ description: 'Treat warnings as fatal'
+ required: false
+ default: true
+ type: boolean
+ enable_android:
+ description: 'Test Android'
+ required: false
+ default: true
+ type: boolean
+ enable_web:
+ description: 'Test Web'
+ required: false
+ default: true
+ type: boolean
+ enable_ios:
+ description: 'Test IOS'
+ required: false
+ default: true
+ type: boolean
+ enable_windows:
+ description: 'Test Windows'
+ required: false
+ default: true
+ type: boolean
+ enable_linux:
+ description: 'Test Linux'
+ required: false
+ default: true
+ type: boolean
+ enable_macos:
+ description: 'Test MacOS'
+ required: false
+ default: true
+ type: boolean
+ enable_min_version:
+ description: 'Test Platform min version'
+ required: false
+ default: false
+ type: boolean
+
+ workflow_call:
+ inputs:
+ flutter_version:
+ required: false
+ default: '3.35.7'
+ type: string
+ flutter_channel:
+ required: false
+ default: 'stable'
+ type: string
+ fatal_warnings:
+ required: false
+ default: true
+ type: boolean
+ enable_android:
+ required: false
+ default: true
+ type: boolean
+ enable_web:
+ required: false
+ default: true
+ type: boolean
+ enable_ios:
+ required: false
+ default: true
+ type: boolean
+ enable_windows:
+ required: false
+ default: true
+ type: boolean
+ enable_linux:
+ required: false
+ default: true
+ type: boolean
+ enable_macos:
+ required: false
+ default: true
+ type: boolean
+ enable_min_version:
+ required: false
+ default: false
+ type: boolean
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ # Full git history needed for `super-linter`
+ fetch-depth: 0
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - run: melos format --set-exit-if-changed
+ - run: flutter analyze ${{ inputs.fatal_warnings && '--fatal-infos' || '--no-fatal-warnings' }}
+ - run: melos run test
+
+ - name: Lint Code Base
+ uses: super-linter/super-linter/slim@v5
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ VALIDATE_ALL_CODEBASE: false
+ DEFAULT_BRANCH: main
+ VALIDATE_KOTLIN_ANDROID: true
+ VALIDATE_CLANG_FORMAT: true
+ - name: Lint Swift
+ # TODO: check if swift-format can be integrated in super-linter, as soon as Alpine is supported
+ # https://github.com/apple/swift-docker/issues/231
+ # https://github.com/super-linter/super-linter/pull/4568
+ run: |
+ docker run --rm --workdir=/work --volume=$PWD:/work mtgto/swift-format:5.8 \
+ lint --parallel --strict --recursive packages/audioplayers_darwin
+
+ web:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ if: inputs.enable_web
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+ - uses: nanasess/setup-chromedriver@v2
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ run: |
+ export DISPLAY=:99
+ sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
+
+ chromedriver --port=4444 &
+
+ ( cd server; dart run bin/server.dart ) &
+ flutter drive \
+ --driver=test_driver/integration_test.dart \
+ --target=integration_test/platform_test.dart \
+ -d web-server \
+ --web-browser-flag="--autoplay-policy=no-user-gesture-required" \
+ --web-browser-flag="--disable-web-security" \
+ --dart-define USE_LOCAL_SERVER=true
+
+ flutter drive \
+ --driver=test_driver/integration_test.dart \
+ --target=integration_test/lib_test.dart \
+ -d web-server \
+ --web-browser-flag="--autoplay-policy=no-user-gesture-required" \
+ --web-browser-flag="--disable-web-security" \
+ --dart-define USE_LOCAL_SERVER=true
+
+ flutter drive \
+ --driver=test_driver/integration_test.dart \
+ --target=integration_test/app_test.dart \
+ -d web-server \
+ --web-browser-flag="--autoplay-policy=no-user-gesture-required" \
+ --web-browser-flag="--disable-web-security" \
+ --dart-define USE_LOCAL_SERVER=true
+
+ android-min:
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ if: inputs.enable_min_version && inputs.enable_android
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+ - name: Setup Android Emulator
+ timeout-minutes: 10
+ run: bash ./scripts/ci/setup-android.sh 24 default
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false --dart-define TEST_FEATURE_BYTES_SOURCE=false --dart-define TEST_FEATURE_PLAYBACK_RATE=false --dart-define TEST_ANDROID_MEDIAPLAYER=true
+ flutter test integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false --dart-define TEST_FEATURE_BYTES_SOURCE=false --dart-define TEST_FEATURE_PLAYBACK_RATE=false --dart-define TEST_ANDROID_MEDIAPLAYER=true
+ flutter test integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false --dart-define TEST_FEATURE_BYTES_SOURCE=false --dart-define TEST_FEATURE_PLAYBACK_RATE=false --dart-define TEST_ANDROID_MEDIAPLAYER=true
+
+ android-exo:
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ if: inputs.enable_android
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - name: Override endorsed plugin with audioplayers_android_exo
+ run: |
+ dart pub add "audioplayers_android_exo:{path: ../../audioplayers_android_exo}"
+ working-directory: ./packages/audioplayers/example
+ - uses: bluefireteam/melos-action@v3
+ - name: Setup Android Emulator
+ timeout-minutes: 10
+ run: bash ./scripts/ci/setup-android.sh 35
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false
+ flutter test integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false
+ flutter test integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_FEATURE_LOW_LATENCY=false
+
+ android:
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ if: inputs.enable_android
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+ - name: Setup Android Emulator
+ timeout-minutes: 10
+ run: bash ./scripts/ci/setup-android.sh 35
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_ANDROID_MEDIAPLAYER=true
+ flutter test integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_ANDROID_MEDIAPLAYER=true
+ flutter test integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true --dart-define TEST_ANDROID_MEDIAPLAYER=true
+ - name: Run Android unit tests
+ working-directory: ./packages/audioplayers/example/android
+ # TODO: Use `./gradlew test`, when https://github.com/flutter/flutter/issues/169336 is fixed.
+ run: ./gradlew testDebugUnitTest
+
+ ios-min:
+ # Run lib tests only to ensure compatibility with iOS 16.
+ runs-on: macos-latest
+ timeout-minutes: 60
+ if: inputs.enable_min_version && inputs.enable_ios
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ run: |
+ xcodes runtimes install "iOS 16.4"
+ UDID=$(xcrun simctl create test-se-16-4 com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation com.apple.CoreSimulator.SimRuntime.iOS-16-4)
+ xcrun simctl list devices
+ echo "Using simulator $UDID"
+ xcrun simctl boot "${UDID:?No Simulator with this name iPhone found}"
+ ( cd server; dart run bin/server.dart ) &
+ flutter test -d $UDID integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+
+ ios:
+ runs-on: macos-26
+ timeout-minutes: 60
+ if: inputs.enable_ios
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - run: flutter config --enable-swift-package-manager
+ - uses: bluefireteam/melos-action@main
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ UDID=$(xcrun simctl create test-se-26-2 com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation com.apple.CoreSimulator.SimRuntime.iOS-26-2)
+ xcrun simctl list devices
+ echo "Using simulator $UDID"
+ xcrun simctl boot "${UDID:?No Simulator with this name iPhone found}"
+ ( cd server; dart run bin/server.dart ) &
+ flutter test -d $UDID integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d $UDID integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d $UDID integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
+
+ # Remove as soon as support for cocoapods is removed at Flutter
+ ios-pods:
+ runs-on: macos-latest
+ timeout-minutes: 30
+ if: inputs.enable_ios
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - run: flutter config --no-enable-swift-package-manager
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build iOS
+ working-directory: ./packages/audioplayers/example
+ run: flutter build ios --release --no-codesign
+
+ macos-min:
+ runs-on: macos-14
+ timeout-minutes: 30
+ if: inputs.enable_min_version && inputs.enable_macos
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@main
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test -d macos integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+
+ macos:
+ runs-on: macos-latest
+ timeout-minutes: 30
+ if: inputs.enable_macos
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - run: flutter config --enable-swift-package-manager
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test -d macos integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d macos integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d macos integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
+
+ # Remove as soon as support for cocoapods is removed at Flutter
+ macos-pods:
+ runs-on: macos-latest
+ timeout-minutes: 30
+ if: inputs.enable_macos
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - run: flutter config --no-enable-swift-package-manager
+ - uses: bluefireteam/melos-action@v3
+
+ - name: Example app - Build macOS
+ working-directory: ./packages/audioplayers/example
+ run: flutter build macos --release
+
+ windows:
+ runs-on: windows-latest
+ timeout-minutes: 30
+ if: inputs.enable_windows
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+ - name: Download virtual audio device
+ # Download has to be done before setting the system date time.
+ timeout-minutes: 1
+ run: |
+ Invoke-WebRequest https://github.com/duncanthrax/scream/releases/download/4.0/Scream4.0.zip -OutFile Scream.zip
+ Expand-Archive -Path Scream.zip -DestinationPath Scream
+ - name: Disable time sync with Hyper-V & setting system date time (#1573)
+ # TODO(gustl22): Remove workaround of setting the time when virtual audio device certificate is valid again (#1573)
+ run: |
+ Set-Service -Name vmictimesync -Status stopped -StartupType disabled
+ Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters -Name 'Type' -Value 'NoSync'
+ net stop w32time; Set-Date (Get-Date "2023-07-04 12:00:00")
+ - name: Install virtual audio device
+ timeout-minutes: 1
+ run: |
+ Import-Certificate -FilePath Scream\Install\driver\x64\Scream.cat -CertStoreLocation Cert:\LocalMachine\TrustedPublisher
+ Scream\Install\helpers\devcon-x64.exe install Scream\Install\driver\x64\Scream.inf *Scream
+ - name: Resetting system date time (#1573)
+ run: |
+ Set-Service -Name vmictimesync -Status running -StartupType automatic
+ Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters -Name 'Type' -Value 'NTP'
+ net start w32time; w32tm /resync /force; $currentDate = Get-Date; Write-Host "Current System Date: $currentDate";
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ shell: bash # Needed in order to fail fast, see: https://github.com/actions/runner-images/issues/6668
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ run: |
+ ( cd server; dart run bin/server.dart ) &
+ flutter test -d windows integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d windows integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d windows integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
+
+ linux:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ if: inputs.enable_linux
+ steps:
+ - uses: actions/checkout@v4
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ inputs.flutter_version }}
+ channel: ${{ inputs.flutter_channel }}
+ - uses: bluefireteam/melos-action@v3
+ - name: Install Flutter requirements for Linux
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
+ - name: Install GStreamer
+ # Install libunwind-dev, see https://github.com/actions/runner-images/issues/6399#issuecomment-1285011525
+ run: |
+ sudo apt install -y libunwind-dev
+ sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-bad
+
+ - name: Run Flutter integration tests
+ working-directory: ./packages/audioplayers/example
+ # Need to execute lib and app tests one by one, see: https://github.com/flutter/flutter/issues/101031
+ # TODO(gustl22): Linux tests are flaky with LIVE_MODE=false
+ run: |
+ export DISPLAY=:99
+ sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
+ ( cd server; LIVE_MODE=true dart run bin/server.dart ) &
+ flutter test -d linux integration_test/platform_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d linux integration_test/lib_test.dart --dart-define USE_LOCAL_SERVER=true
+ flutter test -d linux integration_test/app_test.dart --dart-define USE_LOCAL_SERVER=true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..5f831f935
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.idea/
+*.iml
+pubspec.lock
+.dart_tool/
+pubspec_overrides.yaml
+.flutter-plugins-dependencies
diff --git a/.swift-format b/.swift-format
new file mode 100644
index 000000000..5fccbe9ca
--- /dev/null
+++ b/.swift-format
@@ -0,0 +1,4 @@
+{
+ "_comment": "details can be found at: https://github.com/apple/swift-format/blob/main/Documentation/Configuration.md",
+ "version": 1
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..717796907
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,1454 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## 2025-09-03
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v6.5.1`](#audioplayers---v651)
+
+---
+
+#### `audioplayers` - `v6.5.1`
+
+ - **FIX**: Initialize audioplayer instances sequentially ([#1941](https://github.com/bluefireteam/audioplayers/issues/1941)). ([663fff2c](https://github.com/bluefireteam/audioplayers/commit/663fff2cb8482c81cb525c9d97bfb7f5d02dfdee))
+
+
+## 2025-06-15
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v6.5.0`](#audioplayers---v650)
+ - [`audioplayers_android` - `v5.2.1`](#audioplayers_android---v521)
+ - [`audioplayers_android_exo` - `v0.1.2+1`](#audioplayers_android_exo---v0121)
+ - [`audioplayers_darwin` - `v6.3.0`](#audioplayers_darwin---v630)
+ - [`audioplayers_linux` - `v4.2.1`](#audioplayers_linux---v421)
+ - [`audioplayers_platform_interface` - `v7.1.1`](#audioplayers_platform_interface---v711)
+ - [`audioplayers_web` - `v5.1.1`](#audioplayers_web---v511)
+ - [`audioplayers_windows` - `v4.2.1`](#audioplayers_windows---v421)
+
+---
+
+#### `audioplayers` - `v6.5.0`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+ - **FEAT**: Customizable preparation and seeking timeout ([#1921](https://github.com/bluefireteam/audioplayers/issues/1921)). ([d5a63f8b](https://github.com/bluefireteam/audioplayers/commit/d5a63f8b206554f6a6719653c5ce9b92b8d096b9))
+ - **FEAT**: Support for Swift Package Manager ([#1908](https://github.com/bluefireteam/audioplayers/issues/1908)). ([e8f86e7b](https://github.com/bluefireteam/audioplayers/commit/e8f86e7bf80ddb8b0955d35c53f08cbf5f2d141b))
+
+#### `audioplayers_android` - `v5.2.1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+#### `audioplayers_android_exo` - `v0.1.2+1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+#### `audioplayers_darwin` - `v6.3.0`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+ - **FEAT**: Support for Swift Package Manager ([#1908](https://github.com/bluefireteam/audioplayers/issues/1908)). ([e8f86e7b](https://github.com/bluefireteam/audioplayers/commit/e8f86e7bf80ddb8b0955d35c53f08cbf5f2d141b))
+
+#### `audioplayers_linux` - `v4.2.1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+#### `audioplayers_platform_interface` - `v7.1.1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+#### `audioplayers_web` - `v5.1.1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+#### `audioplayers_windows` - `v4.2.1`
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+
+
+## 2025-03-10
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v6.4.0`](#audioplayers---v640)
+ - [`audioplayers_android` - `v5.2.0`](#audioplayers_android---v520)
+ - [`audioplayers_android_exo` - `v0.1.2`](#audioplayers_android_exo---v012)
+ - [`audioplayers_darwin` - `v6.2.0`](#audioplayers_darwin---v620)
+ - [`audioplayers_linux` - `v4.2.0`](#audioplayers_linux---v420)
+ - [`audioplayers_platform_interface` - `v7.1.0`](#audioplayers_platform_interface---v710)
+ - [`audioplayers_web` - `v5.1.0`](#audioplayers_web---v510)
+ - [`audioplayers_windows` - `v4.2.0`](#audioplayers_windows---v420)
+
+---
+
+#### `audioplayers` - `v6.4.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_android` - `v5.2.0`
+
+ - **FIX**: Make FocusManager compatible with Android API <= 25 (closes [#1895](https://github.com/bluefireteam/audioplayers/issues/1895)) ([#1904](https://github.com/bluefireteam/audioplayers/issues/1904)). ([41238d48](https://github.com/bluefireteam/audioplayers/commit/41238d4837fb5c59b8aaf2e7e8087268a160ebe7))
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_android_exo` - `v0.1.2`
+
+ - **FIX**: Make FocusManager compatible with Android API <= 25 (closes [#1895](https://github.com/bluefireteam/audioplayers/issues/1895)) ([#1904](https://github.com/bluefireteam/audioplayers/issues/1904)). ([41238d48](https://github.com/bluefireteam/audioplayers/commit/41238d4837fb5c59b8aaf2e7e8087268a160ebe7))
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_darwin` - `v6.2.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_linux` - `v4.2.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_platform_interface` - `v7.1.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_web` - `v5.1.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+#### `audioplayers_windows` - `v4.2.0`
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+
+## 2025-03-06
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v6.3.0`](#audioplayers---v630)
+ - [`audioplayers_android` - `v5.1.0`](#audioplayers_android---v510)
+ - [`audioplayers_android_exo` - `v0.1.1`](#audioplayers_android_exo---v011)
+ - [`audioplayers_darwin` - `v6.1.1`](#audioplayers_darwin---v611)
+ - [`audioplayers_linux` - `v4.1.1`](#audioplayers_linux---v411)
+ - [`audioplayers_platform_interface` - `v7.0.1`](#audioplayers_platform_interface---v701)
+ - [`audioplayers_web` - `v5.0.2`](#audioplayers_web---v502)
+ - [`audioplayers_windows` - `v4.1.1`](#audioplayers_windows---v411)
+
+---
+
+#### `audioplayers` - `v6.3.0`
+
+ - **FEAT**(android): ExoPlayer for Android ([#1691](https://github.com/bluefireteam/audioplayers/issues/1691)). ([a91c5b18](https://github.com/bluefireteam/audioplayers/commit/a91c5b185054986a2390d41593b5ee502ef96bdd))\
+ You can enable the non-endorsed plugin implementation based on ExoPlayer (Media3) by calling: `flutter pub add audioplayers_android_exo` in your app package folder.
+ For more, see: https://github.com/bluefireteam/audioplayers/blob/main/feature_parity_table.md#media3-exoplayer
+ - **FEAT**: Raise to Flutter 3.29.0 ([#1891](https://github.com/bluefireteam/audioplayers/issues/1891)). ([26bd6d22](https://github.com/bluefireteam/audioplayers/commit/26bd6d228deacf7cb3454f2d1b972585cd8bb6ea))
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_android` - `v5.1.0`
+
+ - **FEAT**(android): ExoPlayer for Android ([#1691](https://github.com/bluefireteam/audioplayers/issues/1691)). ([a91c5b18](https://github.com/bluefireteam/audioplayers/commit/a91c5b185054986a2390d41593b5ee502ef96bdd))
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_android_exo` - `v0.1.1`
+
+ - **FEAT**(android): ExoPlayer for Android ([#1691](https://github.com/bluefireteam/audioplayers/issues/1691)). ([a91c5b18](https://github.com/bluefireteam/audioplayers/commit/a91c5b185054986a2390d41593b5ee502ef96bdd))
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_darwin` - `v6.1.1`
+
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_linux` - `v4.1.1`
+
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_platform_interface` - `v7.0.1`
+
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_web` - `v5.0.2`
+
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+#### `audioplayers_windows` - `v4.1.1`
+
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+
+## 2025-02-18
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v6.2.0`](#audioplayers---v620)
+ - [`audioplayers_android` - `v5.0.3`](#audioplayers_android---v503)
+ - [`audioplayers_darwin` - `v6.1.0`](#audioplayers_darwin---v610)
+ - [`audioplayers_linux` - `v4.1.0`](#audioplayers_linux---v410)
+ - [`audioplayers_windows` - `v4.1.0`](#audioplayers_windows---v410)
+
+---
+
+#### `audioplayers` - `v6.2.0`
+
+ - **FIX**: No-op on single player setAudioContext in desktop platforms ([#1888](https://github.com/bluefireteam/audioplayers/issues/1888)). ([50d7a8b8](https://github.com/bluefireteam/audioplayers/commit/50d7a8b89f47e3ef29e98cf2b74a582f78783d5e))
+ - **FEAT**: Support setting AudioContext in AudioPool ([#1890](https://github.com/bluefireteam/audioplayers/issues/1890)). ([2968c88b](https://github.com/bluefireteam/audioplayers/commit/2968c88b4e1492a29d4cd0e5f7735f159f995c1a))
+ - **FEAT**: ReleaseMode.release for ios, macos, windows, web, linux ([#1790](https://github.com/bluefireteam/audioplayers/issues/1790)). ([4ffc4029](https://github.com/bluefireteam/audioplayers/commit/4ffc4029d846d7c391c457b829c372c1763b7b50))
+
+#### `audioplayers_android` - `v5.0.3`
+
+ - **FIX**: Raise Android SDK versions ([#1885](https://github.com/bluefireteam/audioplayers/issues/1885)). ([7230bc84](https://github.com/bluefireteam/audioplayers/commit/7230bc84d9dfb0cccfbe5bacb971ef3698495176))
+
+#### `audioplayers_darwin` - `v6.1.0`
+
+ - **FIX**: No-op on single player setAudioContext in desktop platforms ([#1888](https://github.com/bluefireteam/audioplayers/issues/1888)). ([50d7a8b8](https://github.com/bluefireteam/audioplayers/commit/50d7a8b89f47e3ef29e98cf2b74a582f78783d5e))
+ - **FEAT**: ReleaseMode.release for ios, macos, windows, web, linux ([#1790](https://github.com/bluefireteam/audioplayers/issues/1790)). ([4ffc4029](https://github.com/bluefireteam/audioplayers/commit/4ffc4029d846d7c391c457b829c372c1763b7b50))
+
+#### `audioplayers_linux` - `v4.1.0`
+
+ - **FIX**: No-op on single player setAudioContext in desktop platforms ([#1888](https://github.com/bluefireteam/audioplayers/issues/1888)). ([50d7a8b8](https://github.com/bluefireteam/audioplayers/commit/50d7a8b89f47e3ef29e98cf2b74a582f78783d5e))
+ - **FEAT**: ReleaseMode.release for ios, macos, windows, web, linux ([#1790](https://github.com/bluefireteam/audioplayers/issues/1790)). ([4ffc4029](https://github.com/bluefireteam/audioplayers/commit/4ffc4029d846d7c391c457b829c372c1763b7b50))
+
+#### `audioplayers_windows` - `v4.1.0`
+
+ - **FIX**: No-op on single player setAudioContext in desktop platforms ([#1888](https://github.com/bluefireteam/audioplayers/issues/1888)). ([50d7a8b8](https://github.com/bluefireteam/audioplayers/commit/50d7a8b89f47e3ef29e98cf2b74a582f78783d5e))
+ - **FEAT**: ReleaseMode.release for ios, macos, windows, web, linux ([#1790](https://github.com/bluefireteam/audioplayers/issues/1790)). ([4ffc4029](https://github.com/bluefireteam/audioplayers/commit/4ffc4029d846d7c391c457b829c372c1763b7b50))
+
+
+## 2025-02-08
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_android` - `v5.0.2`](#audioplayers_android---v502)
+ - [`audioplayers` - `v6.1.2`](#audioplayers---v612)
+
+Packages with dependency updates only:
+
+> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
+
+ - `audioplayers` - `v6.1.2`
+
+---
+
+#### `audioplayers_android` - `v5.0.2`
+
+ - **FIX**: Change audioFocus dynamically ([#1877](https://github.com/bluefireteam/audioplayers/issues/1877)). ([14f16d9d](https://github.com/bluefireteam/audioplayers/commit/14f16d9dfc52e2eca989e0cc6a27decb8e96af83))
+
+
+## 2025-01-28
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_android` - `v5.0.1`](#audioplayers_android---v501)
+ - [`audioplayers_linux` - `v4.0.1`](#audioplayers_linux---v401)
+ - [`audioplayers` - `v6.1.1`](#audioplayers---v611)
+
+Packages with dependency updates only:
+
+> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
+
+ - `audioplayers` - `v6.1.1`
+
+---
+
+#### `audioplayers_android` - `v5.0.1`
+
+ - **FIX**: Avoid multiple audioFocusRequest instances for focus changes ([#1869](https://github.com/bluefireteam/audioplayers/issues/1869)). ([040dde9c](https://github.com/bluefireteam/audioplayers/commit/040dde9c2b1d4601a4c4790fa4a43a4cdd4e9a27))
+ - **FIX**(android): Avoid playing after gaining focus in paused state ([#1857](https://github.com/bluefireteam/audioplayers/issues/1857)). ([01726c13](https://github.com/bluefireteam/audioplayers/commit/01726c1362135a4c3595169dcb1adb311f25f683))
+
+#### `audioplayers_linux` - `v4.0.1`
+
+ - **DOCS**: Add Fedora/RHEL Dependency instructions ([#1851](https://github.com/bluefireteam/audioplayers/issues/1851)). ([b401a23c](https://github.com/bluefireteam/audioplayers/commit/b401a23c934c93a78893bb2def011cd10508c33b))
+
+
+## 2024-08-26
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_web` - `v5.0.1`](#audioplayers_web---v501)
+ - [`audioplayers` - `v6.1.0`](#audioplayers---v610)
+
+---
+
+#### `audioplayers_web` - `v5.0.1`
+
+ - **DEPS**: Consider web:1.0.0 ([#1828](https://github.com/bluefireteam/audioplayers/pull/1828)). ([9d25e78d](https://github.com/bluefireteam/audioplayers/commit/9d25e78d24a687c90ffa76f034c418d2bbe45251))
+
+#### `audioplayers` - `v6.1.0`
+
+ - **FEAT**: Upgrade to Flutter v3.22.x ([#1803](https://github.com/bluefireteam/audioplayers/issues/1803)). ([4d669e72](https://github.com/bluefireteam/audioplayers/commit/4d669e723dc5c2399073301ba9333f99bc623669))
+
+
+## 2024-03-19
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v6.0.0`](#audioplayers---v600)
+ - [`audioplayers_android` - `v5.0.0`](#audioplayers_android---v500)
+ - [`audioplayers_darwin` - `v6.0.0`](#audioplayers_darwin---v600)
+ - [`audioplayers_linux` - `v4.0.0`](#audioplayers_linux---v400)
+ - [`audioplayers_platform_interface` - `v7.0.0`](#audioplayers_platform_interface---v700)
+ - [`audioplayers_web` - `v5.0.0`](#audioplayers_web---v500)
+ - [`audioplayers_windows` - `v4.0.0`](#audioplayers_windows---v400)
+
+Packages with other changes:
+
+ - There are no other changes in this release.
+
+---
+
+#### `audioplayers` - `v6.0.0`
+
+ - **FIX**: Use unique tmp location for each AudioCache ([#1724](https://github.com/bluefireteam/audioplayers/issues/1724)). ([2333cb7f](https://github.com/bluefireteam/audioplayers/commit/2333cb7f5a9fcd84bdd477120d1f53f346c3b10d))
+ - **FIX**: Race condition when playing/pausing audio ([#1705](https://github.com/bluefireteam/audioplayers/issues/1705)). ([463b2a11](https://github.com/bluefireteam/audioplayers/commit/463b2a1149105a25f81d708533d13cc2dd277d6b))
+ - **FIX**: Seek not applied in `play` method ([#1695](https://github.com/bluefireteam/audioplayers/issues/1695)). ([f6138fef](https://github.com/bluefireteam/audioplayers/commit/f6138fef97ccd5b78b44dbe85f7d41e16b3662f6))
+ - **FIX**: Propagate Stream Errors through the same Future ([#1732](https://github.com/bluefireteam/audioplayers/issues/1732)). ([00d041df](https://github.com/bluefireteam/audioplayers/commit/00d041df11c26fd96f480782f2787f857c77daa0))
+ - **FIX**: Wait for seek to complete ([#1712](https://github.com/bluefireteam/audioplayers/issues/1712)). ([fd33b1d0](https://github.com/bluefireteam/audioplayers/commit/fd33b1d073280797cdd88fb6324cc1906bfd5957))
+ - **FEAT**: Support byte array and data URIs via mimeType ([#1763](https://github.com/bluefireteam/audioplayers/issues/1763)). ([eaf7ce86](https://github.com/bluefireteam/audioplayers/commit/eaf7ce86ad271097365fcf9e3a03fc341629ae47))
+ - **FEAT**(ios): Improved AudioContextConfig assertions, fix example ([#1619](https://github.com/bluefireteam/audioplayers/issues/1619)). ([df342c52](https://github.com/bluefireteam/audioplayers/commit/df342c529b0b13abd0515c5dc762987293ebc4c1))
+ - **FEAT**(web): Support compilation to Wasm ([#1766](https://github.com/bluefireteam/audioplayers/issues/1766)). ([1b1a0cf9](https://github.com/bluefireteam/audioplayers/commit/1b1a0cf92e950bc520598426d3f073c3bd5a6a28))
+ - **DOCS**: Improve Docs ([#1710](https://github.com/bluefireteam/audioplayers/issues/1710)). ([4208463a](https://github.com/bluefireteam/audioplayers/commit/4208463a4110ed117eebe28e170872817712ff53))
+ - **BREAKING** **REFACTOR**: Remove deprecated methods ([#1583](https://github.com/bluefireteam/audioplayers/issues/1583)). ([8d0cbeda](https://github.com/bluefireteam/audioplayers/commit/8d0cbeda6babea69b1753340f9cec3d246d7e29a))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **FEAT**: Extend `AudioContextConfig.duckAudio` to `AudioContextConfig.focus` ([#1720](https://github.com/bluefireteam/audioplayers/issues/1720)). ([87f3cb7e](https://github.com/bluefireteam/audioplayers/commit/87f3cb7e47e2103d2079a3dfe6aebe80c8a76c3d))
+ - **BREAKING** **FEAT**(ios): Improve AudioContextIOS ([#1591](https://github.com/bluefireteam/audioplayers/issues/1591)). ([25fbec05](https://github.com/bluefireteam/audioplayers/commit/25fbec051a4f521f73c473cdad20f88c7907d7b1))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+ - **BREAKING** **CHORE**: Upgrade to Flutter 3.13.0 ([#1612](https://github.com/bluefireteam/audioplayers/issues/1612)). ([1a3de1ac](https://github.com/bluefireteam/audioplayers/commit/1a3de1acd5a8b90b6d9c0d0f2a7141723c277c24))
+
+#### `audioplayers_android` - `v5.0.0`
+
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+
+#### `audioplayers_darwin` - `v6.0.0`
+
+ - **FIX**(ios): 'audioProcessing' deprecated in iOS 10 ([#1756](https://github.com/bluefireteam/audioplayers/issues/1756)). ([81e5ea54](https://github.com/bluefireteam/audioplayers/commit/81e5ea542578f27c558f9a049996ecd8cb95c002))
+ - **FEAT**: Support byte array and data URIs via mimeType ([#1763](https://github.com/bluefireteam/audioplayers/issues/1763)). ([eaf7ce86](https://github.com/bluefireteam/audioplayers/commit/eaf7ce86ad271097365fcf9e3a03fc341629ae47))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+
+#### `audioplayers_linux` - `v4.0.0`
+
+ - **FIX**(linux): Handle failures of OnMediaStateChange in OnMediaError ([#1731](https://github.com/bluefireteam/audioplayers/issues/1731)). ([3a5c6dca](https://github.com/bluefireteam/audioplayers/commit/3a5c6dca5dd9476765a976724e3ca89574794cb0))
+ - **FIX**: Wait for seek to complete ([#1712](https://github.com/bluefireteam/audioplayers/issues/1712)). ([fd33b1d0](https://github.com/bluefireteam/audioplayers/commit/fd33b1d073280797cdd88fb6324cc1906bfd5957))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+ - **BREAKING** **CHORE**: Upgrade to Flutter 3.13.0 ([#1612](https://github.com/bluefireteam/audioplayers/issues/1612)). ([1a3de1ac](https://github.com/bluefireteam/audioplayers/commit/1a3de1acd5a8b90b6d9c0d0f2a7141723c277c24))
+
+#### `audioplayers_platform_interface` - `v7.0.0`
+
+ - **FEAT**: Support byte array and data URIs via mimeType ([#1763](https://github.com/bluefireteam/audioplayers/issues/1763)). ([eaf7ce86](https://github.com/bluefireteam/audioplayers/commit/eaf7ce86ad271097365fcf9e3a03fc341629ae47))
+ - **FEAT**(ios): Improved AudioContextConfig assertions, fix example ([#1619](https://github.com/bluefireteam/audioplayers/issues/1619)). ([df342c52](https://github.com/bluefireteam/audioplayers/commit/df342c529b0b13abd0515c5dc762987293ebc4c1))
+ - **DOCS**: Improve Docs ([#1710](https://github.com/bluefireteam/audioplayers/issues/1710)). ([4208463a](https://github.com/bluefireteam/audioplayers/commit/4208463a4110ed117eebe28e170872817712ff53))
+ - **BREAKING** **FEAT**: Extend `AudioContextConfig.duckAudio` to `AudioContextConfig.focus` ([#1720](https://github.com/bluefireteam/audioplayers/issues/1720)). ([87f3cb7e](https://github.com/bluefireteam/audioplayers/commit/87f3cb7e47e2103d2079a3dfe6aebe80c8a76c3d))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **FEAT**(ios): Improve AudioContextIOS ([#1591](https://github.com/bluefireteam/audioplayers/issues/1591)). ([25fbec05](https://github.com/bluefireteam/audioplayers/commit/25fbec051a4f521f73c473cdad20f88c7907d7b1))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+
+#### `audioplayers_web` - `v5.0.0`
+
+ - **FEAT**: Support byte array and data URIs via mimeType ([#1763](https://github.com/bluefireteam/audioplayers/issues/1763)). ([eaf7ce86](https://github.com/bluefireteam/audioplayers/commit/eaf7ce86ad271097365fcf9e3a03fc341629ae47))
+ - **FEAT**(web): Support compilation to Wasm ([#1766](https://github.com/bluefireteam/audioplayers/issues/1766)). ([1b1a0cf9](https://github.com/bluefireteam/audioplayers/commit/1b1a0cf92e950bc520598426d3f073c3bd5a6a28))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+
+#### `audioplayers_windows` - `v4.0.0`
+
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+
+
+## 2023-11-14
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v5.2.1`](#audioplayers---v521)
+ - [`audioplayers_android` - `v4.0.3`](#audioplayers_android---v403)
+
+---
+
+#### `audioplayers` - `v5.2.1`
+
+ - **FIX**: Avoid decoding already encoded character in URI ([#1679](https://github.com/bluefireteam/audioplayers/issues/1679)). ([1923205c](https://github.com/bluefireteam/audioplayers/commit/1923205c4cde70e2915e6e6c6afeb2fec27a08e8))
+ - **FIX**(android): Released wrong source in LOW_LATENCY mode ([#1672](https://github.com/bluefireteam/audioplayers/issues/1672)). ([d9c5f693](https://github.com/bluefireteam/audioplayers/commit/d9c5f693cafab21b67b785de6244c3c371344a53))
+
+#### `audioplayers_android` - `v4.0.3`
+
+ - **FIX**(android): Released wrong source in LOW_LATENCY mode ([#1672](https://github.com/bluefireteam/audioplayers/issues/1672)). ([d9c5f693](https://github.com/bluefireteam/audioplayers/commit/d9c5f693cafab21b67b785de6244c3c371344a53))
+
+
+## 2023-10-02
+
+### Changes
+
+---
+
+Packages with other changes:
+
+ - [`audioplayers` - `v5.2.0`](#audioplayers---v520)
+ - [`audioplayers_android` - `v4.0.2`](#audioplayers_android---v402)
+ - [`audioplayers_darwin` - `v5.0.2`](#audioplayers_darwin---v502)
+ - [`audioplayers_linux` - `v3.1.0`](#audioplayers_linux---v310)
+ - [`audioplayers_platform_interface` - `v6.1.0`](#audioplayers_platform_interface---v610)
+ - [`audioplayers_web` - `v4.1.0`](#audioplayers_web---v410)
+ - [`audioplayers_windows` - `v3.1.0`](#audioplayers_windows---v310)
+
+---
+
+#### `audioplayers` - `v5.2.0`
+
+ - **REFACTOR**: Lint Swift ([#1613](https://github.com/bluefireteam/audioplayers/issues/1613)). ([737aa94f](https://github.com/bluefireteam/audioplayers/commit/737aa94f7edb076d622c34e498b90f17c9959e9c))
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Cancel `onPreparedSubscription` on error ([#1660](https://github.com/bluefireteam/audioplayers/issues/1660)). ([c11dbf30](https://github.com/bluefireteam/audioplayers/commit/c11dbf3094457799a3b89fd6f0b386799b2f943c))
+ - **FIX**: Set playback rate only when playing ([#1658](https://github.com/bluefireteam/audioplayers/issues/1658)). ([d73c7d5c](https://github.com/bluefireteam/audioplayers/commit/d73c7d5c2ef13e8eff2c438b96ade6e2483a2014))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+ - **FEAT**(windows): Support for BytesSource on Windows ([#1601](https://github.com/bluefireteam/audioplayers/issues/1601)). ([a9e14710](https://github.com/bluefireteam/audioplayers/commit/a9e147107aa31072d4bcc69a02b2ee287d4b366b))
+ - **FEAT**: Allow adding custom media sources to example ([#1637](https://github.com/bluefireteam/audioplayers/issues/1637)). ([1eabe619](https://github.com/bluefireteam/audioplayers/commit/1eabe61957caf969f132ce6fad7b99208887466b))
+ - **DOCS**: Deploy live example app to GH pages ([#1623](https://github.com/bluefireteam/audioplayers/issues/1623)). ([fe81f3b1](https://github.com/bluefireteam/audioplayers/commit/fe81f3b1e600fe005febbe7cd3da02735a3de004))
+
+#### `audioplayers_linux` - `v3.1.0`
+
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+ - **FEAT**: Release source for Web, Linux, Windows ([#1517](https://github.com/bluefireteam/audioplayers/issues/1517)). ([09496dcb](https://github.com/bluefireteam/audioplayers/commit/09496dcbf478af330e37be833184439b43b5ac44))
+ - **DOCS**: Manual Flutter installation on Linux setup ([#1631](https://github.com/bluefireteam/audioplayers/issues/1631)). ([9086e75a](https://github.com/bluefireteam/audioplayers/commit/9086e75a9503bdb84f372b5e09a4b225d3fae5f6))
+
+#### `audioplayers_platform_interface` - `v6.1.0`
+
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+ - **FEAT**: create, dispose & reuse event stream ([#1609](https://github.com/bluefireteam/audioplayers/issues/1609)). ([efbabf5c](https://github.com/bluefireteam/audioplayers/commit/efbabf5cb30de0013fe3b67cb7206de602f1dc84))
+
+#### `audioplayers_android` - `v4.0.2`
+
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Set playback rate only when playing ([#1658](https://github.com/bluefireteam/audioplayers/issues/1658)). ([d73c7d5c](https://github.com/bluefireteam/audioplayers/commit/d73c7d5c2ef13e8eff2c438b96ade6e2483a2014))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+
+#### `audioplayers_darwin` - `v5.0.2`
+
+ - **REFACTOR**: Lint Swift ([#1613](https://github.com/bluefireteam/audioplayers/issues/1613)). ([737aa94f](https://github.com/bluefireteam/audioplayers/commit/737aa94f7edb076d622c34e498b90f17c9959e9c))
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Set playback rate only when playing ([#1658](https://github.com/bluefireteam/audioplayers/issues/1658)). ([d73c7d5c](https://github.com/bluefireteam/audioplayers/commit/d73c7d5c2ef13e8eff2c438b96ade6e2483a2014))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**(darwin): Start observing `AVPlayerItem.status` before being assigned to `AVPlayer` ([#1549](https://github.com/bluefireteam/audioplayers/issues/1549)). ([8c3a2138](https://github.com/bluefireteam/audioplayers/commit/8c3a213841c063d4a45bdb96e339ac338c7c8758))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+
+#### `audioplayers_web` - `v4.1.0`
+
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FEAT**: Release source for Web, Linux, Windows ([#1517](https://github.com/bluefireteam/audioplayers/issues/1517)). ([09496dcb](https://github.com/bluefireteam/audioplayers/commit/09496dcbf478af330e37be833184439b43b5ac44))
+
+#### `audioplayers_windows` - `v3.1.0`
+
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+ - **FEAT**(windows): Support for BytesSource on Windows ([#1601](https://github.com/bluefireteam/audioplayers/issues/1601)). ([a9e14710](https://github.com/bluefireteam/audioplayers/commit/a9e147107aa31072d4bcc69a02b2ee287d4b366b))
+ - **FEAT**: Release source for Web, Linux, Windows ([#1517](https://github.com/bluefireteam/audioplayers/issues/1517)). ([09496dcb](https://github.com/bluefireteam/audioplayers/commit/09496dcbf478af330e37be833184439b43b5ac44))
+
+
+## 2023-08-09
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v5.1.0`](#audioplayers---v510)
+ - [`audioplayers_android` - `v4.0.1`](#audioplayers_android---v401)
+ - [`audioplayers_darwin` - `v5.0.1`](#audioplayers_darwin---v501)
+
+---
+
+#### `audioplayers` - `v5.1.0`
+
+ - **REFACTOR**(darwin): Rearrange code ([#1585](https://github.com/bluefireteam/audioplayers/issues/1585)). ([13639d1f](https://github.com/bluefireteam/audioplayers/commit/13639d1f2fe5afbc17f4e862e2da0f7551b8fc3e))
+ - **FEAT**: Get current volume, balance and playbackRate ([#1582](https://github.com/bluefireteam/audioplayers/issues/1582)). ([0c2ff7b1](https://github.com/bluefireteam/audioplayers/commit/0c2ff7b1289238150388e571396ac92b28a8ea5d))
+
+#### `audioplayers_android` - `v4.0.1`
+
+ - **REVERT**(android): Upgrade androidx.core:core-ktx, restore support for AGP7 ([#1590](https://github.com/bluefireteam/audioplayers/issues/1590)). ([f6bf1260](https://github.com/bluefireteam/audioplayers/commit/f6bf12609ec9e457451f1c786522bff28a1555f4))
+
+#### `audioplayers_darwin` - `v5.0.1`
+
+ - **REFACTOR**(darwin): Rearrange code ([#1585](https://github.com/bluefireteam/audioplayers/issues/1585)). ([13639d1f](https://github.com/bluefireteam/audioplayers/commit/13639d1f2fe5afbc17f4e862e2da0f7551b8fc3e))
+
+
+## 2023-07-23
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v5.0.0`](#audioplayers---v500)
+ - [`audioplayers_android` - `v4.0.0`](#audioplayers_android---v400)
+ - [`audioplayers_darwin` - `v5.0.0`](#audioplayers_darwin---v500)
+ - [`audioplayers_linux` - `v3.0.0`](#audioplayers_linux---v300)
+ - [`audioplayers_platform_interface` - `v6.0.0`](#audioplayers_platform_interface---v600)
+ - [`audioplayers_web` - `v4.0.0`](#audioplayers_web---v400)
+ - [`audioplayers_windows` - `v3.0.0`](#audioplayers_windows---v300)
+
+Packages with other changes:
+
+ - There are no other changes in this release.
+
+---
+
+#### `audioplayers` - `v5.0.0`
+
+ - **REFACTOR**(windows): simplify position and duration processing ([#1553](https://github.com/bluefireteam/audioplayers/issues/1553)). ([ca63c5a4](https://github.com/bluefireteam/audioplayers/commit/ca63c5a4b120e0d1ea421e6ab30f590c314a33f2))
+ - **FIX**(example): Use kotlin version compatible with AGP8 ([#1577](https://github.com/bluefireteam/audioplayers/issues/1577)). ([8f4b1bb0](https://github.com/bluefireteam/audioplayers/commit/8f4b1bb0bc93df095bff2a4d4c2f92a4c4a85d17))
+ - **FIX**(linux): allow reusing event channel with same name ([#1555](https://github.com/bluefireteam/audioplayers/issues/1555)). ([5471189f](https://github.com/bluefireteam/audioplayers/commit/5471189f9469e973f9262a120b02b321ca0dce24))
+ - **FEAT**(android): Add support for AGP 8 in example, add compileOptions to build.gradle ([#1503](https://github.com/bluefireteam/audioplayers/issues/1503)). ([7c08e4e1](https://github.com/bluefireteam/audioplayers/commit/7c08e4e1a524f53294f6967996fd31837e62cb81))
+ - **BREAKING** **FIX**: Default audio output to system preferences ([#1563](https://github.com/bluefireteam/audioplayers/issues/1563)). ([381c43e3](https://github.com/bluefireteam/audioplayers/commit/381c43e3725fbb0cb4fd35982893a3c92b188886))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_android` - `v4.0.0`
+
+ - **FIX**(android): Allow AudioFocus.none ([#1534](https://github.com/bluefireteam/audioplayers/issues/1534)). ([858d3f44](https://github.com/bluefireteam/audioplayers/commit/858d3f4410b1bc7b203090c20cf60b5136dad4fe))
+ - **FEAT**(android): Add support for AGP 8 in example, add compileOptions to build.gradle ([#1503](https://github.com/bluefireteam/audioplayers/issues/1503)). ([7c08e4e1](https://github.com/bluefireteam/audioplayers/commit/7c08e4e1a524f53294f6967996fd31837e62cb81))
+ - **BREAKING** **FIX**: Default audio output to system preferences ([#1563](https://github.com/bluefireteam/audioplayers/issues/1563)). ([381c43e3](https://github.com/bluefireteam/audioplayers/commit/381c43e3725fbb0cb4fd35982893a3c92b188886))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_darwin` - `v5.0.0`
+
+ - **BREAKING** **FIX**: Default audio output to system preferences ([#1563](https://github.com/bluefireteam/audioplayers/issues/1563)). ([381c43e3](https://github.com/bluefireteam/audioplayers/commit/381c43e3725fbb0cb4fd35982893a3c92b188886))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_linux` - `v3.0.0`
+
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_platform_interface` - `v6.0.0`
+
+ - **FIX**(android): Allow AudioFocus.none ([#1534](https://github.com/bluefireteam/audioplayers/issues/1534)). ([858d3f44](https://github.com/bluefireteam/audioplayers/commit/858d3f4410b1bc7b203090c20cf60b5136dad4fe))
+ - **BREAKING** **FIX**: Default audio output to system preferences ([#1563](https://github.com/bluefireteam/audioplayers/issues/1563)). ([381c43e3](https://github.com/bluefireteam/audioplayers/commit/381c43e3725fbb0cb4fd35982893a3c92b188886))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_web` - `v4.0.0`
+
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+#### `audioplayers_windows` - `v3.0.0`
+
+ - **REFACTOR**(windows): simplify position and duration processing ([#1553](https://github.com/bluefireteam/audioplayers/issues/1553)). ([ca63c5a4](https://github.com/bluefireteam/audioplayers/commit/ca63c5a4b120e0d1ea421e6ab30f590c314a33f2))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+
+## 2023-05-29
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v4.1.0`](#audioplayers---v410)
+ - [`audioplayers_android` - `v3.0.2`](#audioplayers_android---v302)
+ - [`audioplayers_darwin` - `v4.1.0`](#audioplayers_darwin---v410)
+ - [`audioplayers_linux` - `v2.1.0`](#audioplayers_linux---v210)
+ - [`audioplayers_platform_interface` - `v5.0.1`](#audioplayers_platform_interface---v501)
+ - [`audioplayers_web` - `v3.1.0`](#audioplayers_web---v310)
+ - [`audioplayers_windows` - `v2.0.2`](#audioplayers_windows---v202)
+
+---
+
+#### `audioplayers` - `v4.1.0`
+
+ - **REFACTOR**: Adapt to flame_lint v0.2.0+2 ([#1477](https://github.com/bluefireteam/audioplayers/issues/1477)). ([e1d7fb6a](https://github.com/bluefireteam/audioplayers/commit/e1d7fb6ab57c8a523c80dfc673bde3b7379b2add))
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **FEAT**: Adapt position update interval of darwin, linux, web ([#1492](https://github.com/bluefireteam/audioplayers/issues/1492)). ([ab5bdf6a](https://github.com/bluefireteam/audioplayers/commit/ab5bdf6a2bcbf7e984d4d897e43a67b3684c52d8))
+ - **DOCS**: Improve docs ([#1518](https://github.com/bluefireteam/audioplayers/issues/1518)). ([4c0d5546](https://github.com/bluefireteam/audioplayers/commit/4c0d55465a8e75c13987b970dee648657eba4384))
+
+#### `audioplayers_android` - `v3.0.2`
+
+ - **FIX**(android): `onComplete` is not called when audio has completed playing ([#1523](https://github.com/bluefireteam/audioplayers/issues/1523)). ([293d6c0e](https://github.com/bluefireteam/audioplayers/commit/293d6c0eec1d89ad200b2914cae0adf644b25013))
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**(android): Add AGP 8 support with namespace property ([#1514](https://github.com/bluefireteam/audioplayers/issues/1514)). ([8d7b322e](https://github.com/bluefireteam/audioplayers/commit/8d7b322e79fd802fb75ca72f5c8ac388754cd406))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+
+#### `audioplayers_darwin` - `v4.1.0`
+
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **FEAT**: Adapt position update interval of darwin, linux, web ([#1492](https://github.com/bluefireteam/audioplayers/issues/1492)). ([ab5bdf6a](https://github.com/bluefireteam/audioplayers/commit/ab5bdf6a2bcbf7e984d4d897e43a67b3684c52d8))
+
+#### `audioplayers_linux` - `v2.1.0`
+
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **FEAT**: Adapt position update interval of darwin, linux, web ([#1492](https://github.com/bluefireteam/audioplayers/issues/1492)). ([ab5bdf6a](https://github.com/bluefireteam/audioplayers/commit/ab5bdf6a2bcbf7e984d4d897e43a67b3684c52d8))
+
+#### `audioplayers_platform_interface` - `v5.0.1`
+
+ - **FIX**: AudioEvent missing `isPrepared` logic ([#1521](https://github.com/bluefireteam/audioplayers/issues/1521)). ([1fa46c2c](https://github.com/bluefireteam/audioplayers/commit/1fa46c2cd28a4640c4aae65deee91ffe46cc4425))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **DOCS**: Improve doc for 'AudioContextConfig.respectSilence' ([#1490](https://github.com/bluefireteam/audioplayers/issues/1490)) ([#1500](https://github.com/bluefireteam/audioplayers/issues/1500)). ([415dda3b](https://github.com/bluefireteam/audioplayers/commit/415dda3b1621c57ea4b0366187f27f6a189555bf))
+
+#### `audioplayers_web` - `v3.1.0`
+
+ - **REFACTOR**: Adapt to flame_lint v0.2.0+2 ([#1477](https://github.com/bluefireteam/audioplayers/issues/1477)). ([e1d7fb6a](https://github.com/bluefireteam/audioplayers/commit/e1d7fb6ab57c8a523c80dfc673bde3b7379b2add))
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: `AudioElement` is not getting released correctly ([#1516](https://github.com/bluefireteam/audioplayers/issues/1516)). ([32210f34](https://github.com/bluefireteam/audioplayers/commit/32210f34b186b44cc9c0484d7f67641162b325f6))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **FIX**(web): Avoid stutter when starting playback ([#1476](https://github.com/bluefireteam/audioplayers/issues/1476)). ([a28eed02](https://github.com/bluefireteam/audioplayers/commit/a28eed02f4e67e372d2b8f7c5bb271ffe6e09ec8))
+ - **FEAT**: Adapt position update interval of darwin, linux, web ([#1492](https://github.com/bluefireteam/audioplayers/issues/1492)). ([ab5bdf6a](https://github.com/bluefireteam/audioplayers/commit/ab5bdf6a2bcbf7e984d4d897e43a67b3684c52d8))
+
+#### `audioplayers_windows` - `v2.0.2`
+
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+
+
+## 2023-04-12
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v4.0.1`](#audioplayers---v401)
+ - [`audioplayers_android` - `v3.0.1`](#audioplayers_android---v301)
+ - [`audioplayers_darwin` - `v4.0.1`](#audioplayers_darwin---v401)
+ - [`audioplayers_linux` - `v2.0.1`](#audioplayers_linux---v201)
+ - [`audioplayers_web` - `v3.0.1`](#audioplayers_web---v301)
+ - [`audioplayers_windows` - `v2.0.1`](#audioplayers_windows---v201)
+
+---
+
+#### `audioplayers` - `v4.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+#### `audioplayers_android` - `v3.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+#### `audioplayers_darwin` - `v4.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+#### `audioplayers_linux` - `v2.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+#### `audioplayers_web` - `v3.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+#### `audioplayers_windows` - `v2.0.1`
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+
+## 2023-04-10
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v4.0.0`](#audioplayers---v400)
+ - [`audioplayers_android` - `v3.0.0`](#audioplayers_android---v300)
+ - [`audioplayers_darwin` - `v4.0.0`](#audioplayers_darwin---v400)
+ - [`audioplayers_linux` - `v2.0.0`](#audioplayers_linux---v200)
+ - [`audioplayers_platform_interface` - `v5.0.0`](#audioplayers_platform_interface---v500)
+ - [`audioplayers_web` - `v3.0.0`](#audioplayers_web---v300)
+ - [`audioplayers_windows` - `v2.0.0`](#audioplayers_windows---v200)
+
+Packages with other changes:
+
+ - There are no other changes in this release.
+
+---
+
+#### `audioplayers` - `v4.0.0`
+
+ - **FIX**(android): Avoid calling onDuration on position event (closes [#136](https://github.com/bluefireteam/audioplayers/issues/136)) ([#1460](https://github.com/bluefireteam/audioplayers/issues/1460)). ([6cfb3753](https://github.com/bluefireteam/audioplayers/commit/6cfb3753cd8003f341d97e0b2417d4512f452267))
+ - **FEAT**: replace `Platform.isX` with `defaultTargetPlatform` ([#1446](https://github.com/bluefireteam/audioplayers/issues/1446)). ([6cd5656c](https://github.com/bluefireteam/audioplayers/commit/6cd5656c0c5deaab1fb4af78a5b7632402c3a1d3))
+ - **FEAT**(example): add invalid asset, small refactor, colored source buttons ([#1445](https://github.com/bluefireteam/audioplayers/issues/1445)). ([92a20fad](https://github.com/bluefireteam/audioplayers/commit/92a20fadd6f549d44b7055b38a48fad2861a05c8))
+ - **FEAT**(android): add `setBalance` ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1444](https://github.com/bluefireteam/audioplayers/issues/1444)). ([3b5de50e](https://github.com/bluefireteam/audioplayers/commit/3b5de50ea7fa5248165616fc1ffd80da6c66583a))
+ - **FEAT**: extract AudioContext from audio_context_config ([#1440](https://github.com/bluefireteam/audioplayers/issues/1440)). ([e59c3b9f](https://github.com/bluefireteam/audioplayers/commit/e59c3b9f07c1a72f9bf4e424fa3b011645f191d2))
+ - **FEAT**(ios): set player context globally on `setAudioContext` for iOS only ([#1416](https://github.com/bluefireteam/audioplayers/issues/1416)). ([19af364b](https://github.com/bluefireteam/audioplayers/commit/19af364b7d0404ae436c54cdaa18d50f3a2aacd6))
+ - **FEAT**(example): update app icons ([#1417](https://github.com/bluefireteam/audioplayers/issues/1417)). ([ac35df89](https://github.com/bluefireteam/audioplayers/commit/ac35df895cefe3d69dac4c8b1cf07c7f7ed56ca7))
+ - **FEAT**: AudioPool (moved and improved from flame_audio) ([#1403](https://github.com/bluefireteam/audioplayers/issues/1403)). ([ab15cb02](https://github.com/bluefireteam/audioplayers/commit/ab15cb02cf939347772ac9fc961b5f01d7bad94b))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **DOCS**: update example app and screenshots ([#1419](https://github.com/bluefireteam/audioplayers/issues/1419)). ([c48eaf38](https://github.com/bluefireteam/audioplayers/commit/c48eaf389ab5b1cf1d51fadc814f473b8ea813cb))
+ - **BREAKING** **REFACTOR**: prevent from confusing and conflicting class names ([#1465](https://github.com/bluefireteam/audioplayers/issues/1465)). ([7cdb8586](https://github.com/bluefireteam/audioplayers/commit/7cdb858605f24f0abd1a225e04922830233f3e96))
+ - **BREAKING** **REFACTOR**: improve separation of global audioplayer interface ([#1443](https://github.com/bluefireteam/audioplayers/issues/1443)). ([c0b3f85c](https://github.com/bluefireteam/audioplayers/commit/c0b3f85c477f0313299cc2a2898840d6c7d8dcd9))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+ - **BREAKING** **FEAT**: expose classes of package `audioplayers_platform_interface` ([#1442](https://github.com/bluefireteam/audioplayers/issues/1442)). ([a6f89be1](https://github.com/bluefireteam/audioplayers/commit/a6f89be181b7bd664eaf96cb9509bbc5adf5dbb9))
+
+##### Migration instructions
+
+| Before | After |
+|---|---|
+| deprecated `AudioPlayer.global.changeLogLevel(LogLevel.info)` | `AudioLogger.logLevel = AudioLogLevel.info` |
+| deprecated `AudioPlayer.global.logLevel` | `AudioLogger.logLevel` |
+| deprecated `AudioPlayer.global.log()` | `AudioLogger.log()` or `AudioLogger.error()` |
+| deprecated `AudioPlayer.global.info()` | `AudioLogger.log()` |
+| deprecated `AudioPlayer.global.error()` | `AudioLogger.error()` |
+| `GlobalPlatformInterface` | `GlobalAudioScope` |
+| deprecated `AudioPlayer.global.setGlobalAudioContext()` | `AudioPlayer.global.setAudioContext()` |
+| `ForPlayer<>` | _removed_ |
+
+#### `audioplayers_android` - `v3.0.0`
+
+ - **FIX**(android): Avoid calling onDuration on position event (closes [#136](https://github.com/bluefireteam/audioplayers/issues/136)) ([#1460](https://github.com/bluefireteam/audioplayers/issues/1460)). ([6cfb3753](https://github.com/bluefireteam/audioplayers/commit/6cfb3753cd8003f341d97e0b2417d4512f452267))
+ - **FIX**(android): reset prepared state on player error ([#1425](https://github.com/bluefireteam/audioplayers/issues/1425)). ([6f24c8f5](https://github.com/bluefireteam/audioplayers/commit/6f24c8f57e4549edbf7d68a021d1d94371c23f3f))
+ - **FEAT**(android): add `setBalance` ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1444](https://github.com/bluefireteam/audioplayers/issues/1444)). ([3b5de50e](https://github.com/bluefireteam/audioplayers/commit/3b5de50ea7fa5248165616fc1ffd80da6c66583a))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+
+#### `audioplayers_darwin` - `v4.0.0`
+
+ - **FIX**(iOS): Default to speaker instead of earpiece on iOS ([#1408](https://github.com/bluefireteam/audioplayers/issues/1408)). ([4ea5907b](https://github.com/bluefireteam/audioplayers/commit/4ea5907bfe5ce83a0d1c100acfc0760d00c2b448))
+ - **FEAT**(ios): set player context globally on `setAudioContext` for iOS only ([#1416](https://github.com/bluefireteam/audioplayers/issues/1416)). ([19af364b](https://github.com/bluefireteam/audioplayers/commit/19af364b7d0404ae436c54cdaa18d50f3a2aacd6))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+
+#### `audioplayers_linux` - `v2.0.0`
+
+ - **FEAT**(windows): show nuget download info explicitely in verbose mode ([#1449](https://github.com/bluefireteam/audioplayers/issues/1449)). ([136028fa](https://github.com/bluefireteam/audioplayers/commit/136028fa1cbcf38f80e9cc7ad78b3bb89d2c6d30))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **DOCS**: Fix LICENSE files for windows and linux ([#1431](https://github.com/bluefireteam/audioplayers/issues/1431)). ([1f84e857](https://github.com/bluefireteam/audioplayers/commit/1f84e857a112e663fff73c4e7c6875ebb72c783d))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+
+#### `audioplayers_platform_interface` - `v5.0.0`
+
+ - **FEAT**: replace `Platform.isX` with `defaultTargetPlatform` ([#1446](https://github.com/bluefireteam/audioplayers/issues/1446)). ([6cd5656c](https://github.com/bluefireteam/audioplayers/commit/6cd5656c0c5deaab1fb4af78a5b7632402c3a1d3))
+ - **FEAT**: extract AudioContext from audio_context_config ([#1440](https://github.com/bluefireteam/audioplayers/issues/1440)). ([e59c3b9f](https://github.com/bluefireteam/audioplayers/commit/e59c3b9f07c1a72f9bf4e424fa3b011645f191d2))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **BREAKING** **REFACTOR**: prevent from confusing and conflicting class names ([#1465](https://github.com/bluefireteam/audioplayers/issues/1465)). ([7cdb8586](https://github.com/bluefireteam/audioplayers/commit/7cdb858605f24f0abd1a225e04922830233f3e96))
+ - **BREAKING** **REFACTOR**: improve separation of global audioplayer interface ([#1443](https://github.com/bluefireteam/audioplayers/issues/1443)). ([c0b3f85c](https://github.com/bluefireteam/audioplayers/commit/c0b3f85c477f0313299cc2a2898840d6c7d8dcd9))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+ - **BREAKING** **FEAT**: expose classes of package `audioplayers_platform_interface` ([#1442](https://github.com/bluefireteam/audioplayers/issues/1442)). ([a6f89be1](https://github.com/bluefireteam/audioplayers/commit/a6f89be181b7bd664eaf96cb9509bbc5adf5dbb9))
+
+
+##### Migration instructions
+
+**audioplayers_platform_interface**:
+| Before | After |
+|---|---|
+| `LogLevel` | _moved_ to `audioplayers` package as `AudioLogLevel` |
+| `AudioplayersPlatform` | `AudioplayersPlatformInterface` |
+| `MethodChannelAudioplayersPlatform` | `AudioplayersPlatform` |
+| `GlobalPlatformInterface` | `GlobalAudioplayersPlatformInterface` |
+| `MethodChannelGlobalPlatform` | `GlobalAudioplayersPlatform` |
+| `StreamsInterface` | _removed_ |
+| `ForPlayer<>` | _removed_ |
+
+
+#### `audioplayers_web` - `v3.0.0`
+
+ - **FIX**(web): make start and resume async ([#1436](https://github.com/bluefireteam/audioplayers/issues/1436)). ([b95bc8fa](https://github.com/bluefireteam/audioplayers/commit/b95bc8fa176e0d28a4d3d5ba6d26cafe699f1540))
+ - **FEAT**: extract AudioContext from audio_context_config ([#1440](https://github.com/bluefireteam/audioplayers/issues/1440)). ([e59c3b9f](https://github.com/bluefireteam/audioplayers/commit/e59c3b9f07c1a72f9bf4e424fa3b011645f191d2))
+ - **FEAT**(web): make setUrl async, make properties of `WrappedPlayer` private ([#1439](https://github.com/bluefireteam/audioplayers/issues/1439)). ([a051c335](https://github.com/bluefireteam/audioplayers/commit/a051c335a6cc0d1f6314f3f0c9f637920c3d6360))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **BREAKING** **REFACTOR**: prevent from confusing and conflicting class names ([#1465](https://github.com/bluefireteam/audioplayers/issues/1465)). ([7cdb8586](https://github.com/bluefireteam/audioplayers/commit/7cdb858605f24f0abd1a225e04922830233f3e96))
+ - **BREAKING** **REFACTOR**: improve separation of global audioplayer interface ([#1443](https://github.com/bluefireteam/audioplayers/issues/1443)). ([c0b3f85c](https://github.com/bluefireteam/audioplayers/commit/c0b3f85c477f0313299cc2a2898840d6c7d8dcd9))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+ - **BREAKING** **FEAT**: expose classes of package `audioplayers_platform_interface` ([#1442](https://github.com/bluefireteam/audioplayers/issues/1442)). ([a6f89be1](https://github.com/bluefireteam/audioplayers/commit/a6f89be181b7bd664eaf96cb9509bbc5adf5dbb9))
+
+##### Migration instructions
+
+**audioplayers_web**:
+| Before | After |
+|---|---|
+| `AudioplayersPlugin` | `AudioplayersPlugin`, `WebAudioplayersPlatform` and `WebGlobalAudioplayersPlatform` |
+
+#### `audioplayers_windows` - `v2.0.0`
+
+ - **FEAT**(windows): show nuget download info explicitely in verbose mode ([#1449](https://github.com/bluefireteam/audioplayers/issues/1449)). ([136028fa](https://github.com/bluefireteam/audioplayers/commit/136028fa1cbcf38f80e9cc7ad78b3bb89d2c6d30))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **DOCS**: Fix LICENSE files for windows and linux ([#1431](https://github.com/bluefireteam/audioplayers/issues/1431)). ([1f84e857](https://github.com/bluefireteam/audioplayers/commit/1f84e857a112e663fff73c4e7c6875ebb72c783d))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+
+
+## 2023-01-28
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_darwin` - `v3.0.1`](#audioplayers_darwin---v301)
+ - [`audioplayers` - `v3.0.1`](#audioplayers---v301)
+
+Packages with dependency updates only:
+
+> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
+
+ - `audioplayers` - `v3.0.1`
+
+---
+
+#### `audioplayers_darwin` - `v3.0.1`
+
+ - Fix duplicated path_providers plugins
+
+
+## 2023-01-24
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v3.0.0`](#audioplayers---v300)
+ - [`audioplayers_android` - `v2.0.0`](#audioplayers_android---v200)
+ - [`audioplayers_platform_interface` - `v4.0.0`](#audioplayers_platform_interface---v400)
+
+Packages with other changes:
+
+ - [`audioplayers_web` - `v2.2.0`](#audioplayers_web---v220)
+
+---
+
+#### `audioplayers` - `v3.0.0`
+
+ - **FEAT**: add and remove player actions ([#1394](https://github.com/bluefireteam/audioplayers/issues/1394)). ([f06cab91](https://github.com/bluefireteam/audioplayers/commit/f06cab91fbae65d7fdc9e3fbd75171b391ac0b96))
+ - **FEAT**: example improvements ([#1392](https://github.com/bluefireteam/audioplayers/issues/1392)). ([002e2fc9](https://github.com/bluefireteam/audioplayers/commit/002e2fc950145e3231ab79a5ef399024d62f6fb1))
+ - **BREAKING** **REFACTOR**: rename logger_platform_interface.dart to global_platform_interface.dart ([#1385](https://github.com/bluefireteam/audioplayers/issues/1385)). ([6e837c1c](https://github.com/bluefireteam/audioplayers/commit/6e837c1ccd93b95d10843a403674128cf303c0ab))
+ - **BREAKING** **FEAT**: configurable SoundPool and `AudioManager.mode` ([#1388](https://github.com/bluefireteam/audioplayers/issues/1388)). ([5697f187](https://github.com/bluefireteam/audioplayers/commit/5697f187bcca64de2e519f8f49aaf4817fcf6398))
+
+#### `audioplayers_android` - `v2.0.0`
+
+ - **FIX**: playing at playback rate `1.0` in android API level < 23 (fixes [#1344](https://github.com/bluefireteam/audioplayers/issues/1344)) ([#1390](https://github.com/bluefireteam/audioplayers/issues/1390)). ([b248e71d](https://github.com/bluefireteam/audioplayers/commit/b248e71dabf923072f1fd14355b4e0230c9a6593))
+ - **BREAKING** **FEAT**: configurable SoundPool and `AudioManager.mode` ([#1388](https://github.com/bluefireteam/audioplayers/issues/1388)). ([5697f187](https://github.com/bluefireteam/audioplayers/commit/5697f187bcca64de2e519f8f49aaf4817fcf6398))
+
+#### `audioplayers_platform_interface` - `v4.0.0`
+
+ - **BREAKING** **REFACTOR**: rename logger_platform_interface.dart to global_platform_interface.dart ([#1385](https://github.com/bluefireteam/audioplayers/issues/1385)). ([6e837c1c](https://github.com/bluefireteam/audioplayers/commit/6e837c1ccd93b95d10843a403674128cf303c0ab))
+ - **BREAKING** **FEAT**: configurable SoundPool and `AudioManager.mode` ([#1388](https://github.com/bluefireteam/audioplayers/issues/1388)). ([5697f187](https://github.com/bluefireteam/audioplayers/commit/5697f187bcca64de2e519f8f49aaf4817fcf6398))
+
+#### `audioplayers_web` - `v2.2.0`
+
+ - **FIX**: use external factory for classes tagged with "@staticInterop" ([#1379](https://github.com/bluefireteam/audioplayers/issues/1379)). ([21d70504](https://github.com/bluefireteam/audioplayers/commit/21d7050455351b0c4ead9a3e2efbc8857115f247))
+
+
+## 2023-01-10
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v2.0.0`](#audioplayers---v200)
+ - [`audioplayers_darwin` - `v2.0.0`](#audioplayers_darwin---v200)
+ - [`audioplayers_platform_interface` - `v3.0.0`](#audioplayers_platform_interface---v300)
+
+Packages with other changes:
+
+ - [`audioplayers_android` - `v1.1.4`](#audioplayers_android---v114)
+ - [`audioplayers_windows` - `v1.1.2`](#audioplayers_windows---v112)
+ - [`audioplayers_linux` - `v1.0.3`](#audioplayers_linux---v103)
+ - [`audioplayers_web` - `v2.1.1`](#audioplayers_web---v211)
+
+Packages with dependency updates only:
+
+> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
+
+ - `audioplayers_android` - `v1.1.4`
+ - `audioplayers_windows` - `v1.1.2`
+ - `audioplayers_linux` - `v1.0.3`
+ - `audioplayers_web` - `v2.1.1`
+
+---
+
+#### `audioplayers` - `v2.0.0`
+
+ - **BREAKING** **FIX**: remove unused `defaultToSpeaker` in `AudioContextIOS` and replace with `AVAudioSessionOptions.defaultToSpeaker` ([#1374](https://github.com/bluefireteam/audioplayers/issues/1374)). ([d844ef9d](https://github.com/bluefireteam/audioplayers/commit/d844ef9def06fd5047076d9f4c371ad3be4c8dd5))
+
+#### `audioplayers_darwin` - `v2.0.0`
+
+ - **BREAKING** **FIX**: remove unused `defaultToSpeaker` in `AudioContextIOS` and replace with `AVAudioSessionOptions.defaultToSpeaker` ([#1374](https://github.com/bluefireteam/audioplayers/issues/1374)). ([d844ef9d](https://github.com/bluefireteam/audioplayers/commit/d844ef9def06fd5047076d9f4c371ad3be4c8dd5))
+
+#### `audioplayers_platform_interface` - `v3.0.0`
+
+ - **BREAKING** **FIX**: remove unused `defaultToSpeaker` in `AudioContextIOS` and replace with `AVAudioSessionOptions.defaultToSpeaker` ([#1374](https://github.com/bluefireteam/audioplayers/issues/1374)). ([d844ef9d](https://github.com/bluefireteam/audioplayers/commit/d844ef9def06fd5047076d9f4c371ad3be4c8dd5))
+
+
+## 2023-01-01
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers` - `v1.2.0`](#audioplayers---v120)
+ - [`audioplayers_platform_interface` - `v2.1.0`](#audioplayers_platform_interface---v210)
+
+Packages with other changes:
+
+ - [`audioplayers_android` - `v1.1.3`](#audioplayers_android---v113)
+ - [`audioplayers_darwin` - `v1.0.4`](#audioplayers_darwin---v104)
+ - [`audioplayers_linux` - `v1.0.2`](#audioplayers_linux---v102)
+ - [`audioplayers_web` - `v2.1.0`](#audioplayers_web---v210)
+ - [`audioplayers_windows` - `v1.1.1`](#audioplayers_windows---v111)
+
+---
+
+#### `audioplayers` - `v1.2.0`
+
+ - **FIX**: Duration precision on Windows ([#1342](https://github.com/bluefireteam/audioplayers/issues/1342)). ([3cda1a65](https://github.com/bluefireteam/audioplayers/commit/3cda1a65dc0425c332ed2eb3619cd88531f0ea49))
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+ - **FEAT**: upgrade flutter to v3.0.0 and dart 2.17 to support "Super initializers" ([#1355](https://github.com/bluefireteam/audioplayers/issues/1355)). ([4af417b4](https://github.com/bluefireteam/audioplayers/commit/4af417b4c91ed5c22d6c48e05080c3018ccaee42))
+ - **FEAT**: local test server ([#1354](https://github.com/bluefireteam/audioplayers/issues/1354)). ([06be429a](https://github.com/bluefireteam/audioplayers/commit/06be429a0078456a989b9afc3abc68164c4abaab))
+ - **FEAT**: get current source ([#1350](https://github.com/bluefireteam/audioplayers/issues/1350)). ([7a10be38](https://github.com/bluefireteam/audioplayers/commit/7a10be38ec6613c8ef45bb33d1e81f11bb5988f9))
+ - **FEAT**: log path and url of sources ([#1334](https://github.com/bluefireteam/audioplayers/issues/1334)). ([8a13f96d](https://github.com/bluefireteam/audioplayers/commit/8a13f96dbb14be0d1d80577816246109c42b7983))
+ - **FEAT**: add setBalance ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1282](https://github.com/bluefireteam/audioplayers/issues/1282)). ([782fc9df](https://github.com/bluefireteam/audioplayers/commit/782fc9dff24a2ab9681496fd7c4c8fed451eac35))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+ - **BREAKING** **FIX**: Cache should take key to be properly cleared ([#1347](https://github.com/bluefireteam/audioplayers/issues/1347)). ([1a410bba](https://github.com/bluefireteam/audioplayers/commit/1a410bba578af506637b026bb2c4ace03a161a69))
+
+#### `audioplayers_platform_interface` - `v2.1.0`
+
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+ - **BREAKING** **FIX**: Change the default value of iOS audio context to force speakers ([#1363](https://github.com/bluefireteam/audioplayers/issues/1363)). ([cb16c12d](https://github.com/bluefireteam/audioplayers/commit/cb16c12d35655bbde5cd94ae1d6f2a03fd6eba1e))
+
+#### `audioplayers_android` - `v1.1.3`
+
+ - **FIX**: Avoid ConcurrentModificationException ([#1297](https://github.com/bluefireteam/audioplayers/issues/1297)). ([d15ef5ab](https://github.com/bluefireteam/audioplayers/commit/d15ef5ab93f11e2f19089af08f1533fcdc1397e6))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+
+#### `audioplayers_darwin` - `v1.0.4`
+
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+
+#### `audioplayers_linux` - `v1.0.2`
+
+ - **FIX**: play sound, when initialized ([#1332](https://github.com/bluefireteam/audioplayers/issues/1332)). ([2ed91fee](https://github.com/bluefireteam/audioplayers/commit/2ed91feec4d3528a4edff635331bd3aad938afd7))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+
+#### `audioplayers_web` - `v2.1.0`
+
+ - **FIX**: handle infinite value on getDuration for live streams ([#1287](https://github.com/bluefireteam/audioplayers/issues/1287)). ([15f2c78f](https://github.com/bluefireteam/audioplayers/commit/15f2c78f79a68349fe33ac1a26ffc67cfaaf1211))
+ - **FEAT**: add setBalance ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1282](https://github.com/bluefireteam/audioplayers/issues/1282)). ([782fc9df](https://github.com/bluefireteam/audioplayers/commit/782fc9dff24a2ab9681496fd7c4c8fed451eac35))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+
+#### `audioplayers_windows` - `v1.1.1`
+
+ - **FIX**: Duration precision on Windows ([#1342](https://github.com/bluefireteam/audioplayers/issues/1342)). ([3cda1a65](https://github.com/bluefireteam/audioplayers/commit/3cda1a65dc0425c332ed2eb3619cd88531f0ea49))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+
+
+## 2022-10-08
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.1.1`](#audioplayers---v111)
+ - [`audioplayers_android` - `v1.1.1`](#audioplayers_android---v111)
+ - [`audioplayers_darwin` - `v1.0.3`](#audioplayers_darwin---v103)
+ - [`audioplayers_web` - `v2.0.1`](#audioplayers_web---v201)
+
+---
+
+#### `audioplayers` - `v1.1.1`
+
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+
+#### `audioplayers_android` - `v1.1.1`
+
+ - **FIX**: Avoid ConcurrentModificationException ([#1297](https://github.com/bluefireteam/audioplayers/issues/1297)). ([d15ef5ab](https://github.com/bluefireteam/audioplayers/commit/d15ef5ab93f11e2f19089af08f1533fcdc1397e6))
+
+#### `audioplayers_darwin` - `v1.0.3`
+
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+
+#### `audioplayers_web` - `v2.0.1`
+
+ - **FIX**: handle infinite value on getDuration for live streams ([#1287](https://github.com/bluefireteam/audioplayers/issues/1287)). ([15f2c78f](https://github.com/bluefireteam/audioplayers/commit/15f2c78f79a68349fe33ac1a26ffc67cfaaf1211))
+
+
+## 2022-09-26
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - [`audioplayers_platform_interface` - `v2.0.0`](#audioplayers_platform_interface---v200)
+ - [`audioplayers_web` - `v2.0.0`](#audioplayers_web---v200)
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.1.0`](#audioplayers---v110)
+ - [`audioplayers_android` - `v1.1.0`](#audioplayers_android---v110)
+ - [`audioplayers_darwin` - `v1.0.2`](#audioplayers_darwin---v102)
+ - [`audioplayers_linux` - `v1.0.1`](#audioplayers_linux---v101)
+ - [`audioplayers_windows` - `v1.1.0`](#audioplayers_windows---v110)
+
+---
+
+#### `audioplayers_platform_interface` - `v2.0.0`
+
+ - **FIX**: handle platform exception via logger (#1254). ([56df6edf](https://github.com/bluefireteam/audioplayers/commit/56df6edfa1475e471c322c1180fd6f47d99c6610))
+ - **BREAKING** **REFACTOR**: remove unused playerStateStream (#1280). ([27f9de22](https://github.com/bluefireteam/audioplayers/commit/27f9de224c7bc1f948356e917bf8b9c411fe9742))
+
+#### `audioplayers_web` - `v2.0.0`
+
+ - **FIX**: bugs from integration tests (#1268). ([d849c67f](https://github.com/bluefireteam/audioplayers/commit/d849c67f6916fb3800998d7d3f1c2752a5b9b9e7))
+ - **FIX**: reset position, when stop or playing ended (#1246). ([d56f40fb](https://github.com/bluefireteam/audioplayers/commit/d56f40fbe89d2a5399f8cd0041b15150d6f72e01))
+ - **FIX**: handle infinite duration (#1192). ([1d1600ba](https://github.com/bluefireteam/audioplayers/commit/1d1600bae372b1e07bd12966cd36571b6809d96a))
+ - **BREAKING** **REFACTOR**: remove unused playerStateStream (#1280). ([27f9de22](https://github.com/bluefireteam/audioplayers/commit/27f9de224c7bc1f948356e917bf8b9c411fe9742))
+
+#### `audioplayers` - `v1.1.0`
+
+ - **FIX**: player state not being updated to completed (#1257). ([70a37afb](https://github.com/bluefireteam/audioplayers/commit/70a37afb6ce4fbb8b8c680ca9b6804b005012446))
+ - **FIX**: lowLatency bugs (closes #1176, closes #1193, closes #1165) (#1272). ([541578cc](https://github.com/bluefireteam/audioplayers/commit/541578cc50f3856c23c393faa1a71380b3b49222))
+ - **FIX**: ios/macos no longer start audio when calling only setSourceUrl (#1206). ([c0e97f04](https://github.com/bluefireteam/audioplayers/commit/c0e97f04fb05fb109830d6363f5c44dccbd327b4))
+ - **FEAT**: improve example (#1267). ([a8154da1](https://github.com/bluefireteam/audioplayers/commit/a8154da1cc6fdec80d80fa538d65cb491a33db78))
+ - **FEAT**: Platform integration tests 🤖 (#1128). ([b0c84aab](https://github.com/bluefireteam/audioplayers/commit/b0c84aabea8af28f693941c1b3bf2b1fa1048833))
+ - **DOCS**: Remove 11-month old outdated doc file (#1180). ([bae43cb1](https://github.com/bluefireteam/audioplayers/commit/bae43cb10a27eff23ebaf2a6ac796fd61039f359))
+
+#### `audioplayers_android` - `v1.1.0`
+
+ - **FIX**: lowLatency bugs (closes #1176, closes #1193, closes #1165) (#1272). ([541578cc](https://github.com/bluefireteam/audioplayers/commit/541578cc50f3856c23c393faa1a71380b3b49222))
+ - **FIX**: revert compileSdkVersion to be compatible with flutter.compileSdkVersion (#1273). ([0b9fed43](https://github.com/bluefireteam/audioplayers/commit/0b9fed43d9dfa90870826dc9a34d1a0d730bd78d))
+ - **FIX**: emit onPositionChanged when seek is completed (closes #1259) (#1265). ([be7ac6a9](https://github.com/bluefireteam/audioplayers/commit/be7ac6a957fccadf5bcecf0f1fbea197d32bda21))
+ - **FIX**: bugs from integration tests (#1247). ([6fad1cc4](https://github.com/bluefireteam/audioplayers/commit/6fad1cc4443e623e5c94519f130b4004b2dc3857))
+ - **FIX**: Fix lowLatency mode for Android (#1193) (#1224). ([a25ca284](https://github.com/bluefireteam/audioplayers/commit/a25ca284835252147c85944575c7e71a3ef6abc4))
+ - **FEAT**: wait for source to be prepared (#1191). ([5eeca894](https://github.com/bluefireteam/audioplayers/commit/5eeca8940e764546023567fa2f6b1bc3802f97d3))
+
+#### `audioplayers_darwin` - `v1.0.2`
+
+ - **FIX**: update platform to 9.0 in podspec. (#1171). ([f8cbd972](https://github.com/bluefireteam/audioplayers/commit/f8cbd972b56b75c8cf204af38f953f322dc98ab1))
+ - **FIX**: ios/macos no longer start audio when calling only setSourceUrl (#1206). ([c0e97f04](https://github.com/bluefireteam/audioplayers/commit/c0e97f04fb05fb109830d6363f5c44dccbd327b4))
+
+#### `audioplayers_linux` - `v1.0.1`
+
+ - **FIX**: emit position event immediately when resume (#1222). ([94c73482](https://github.com/bluefireteam/audioplayers/commit/94c73482b0141d5f6c202219948fc79bac40b288))
+ - **DOCS**: update README, Linux: replace with symlink, update Requirements (#1190). ([72e3d500](https://github.com/bluefireteam/audioplayers/commit/72e3d50067e274a8efb6b646a3318ae5fa097a77))
+
+#### `audioplayers_windows` - `v1.1.0`
+
+ - **FIX**: send onDuration event when play/resume (#1245). ([8108ff42](https://github.com/bluefireteam/audioplayers/commit/8108ff42d05c7f995d8289345302c6ac6d298f67))
+ - **FEAT**: select decoder automatically on windows (#1221). ([ff78a42f](https://github.com/bluefireteam/audioplayers/commit/ff78a42f842e146df7dc98d6d00ae27821355653))
+
+
+## 2022-06-18
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.0.1`](#audioplayers---v101)
+ - [`audioplayers_android` - `v1.0.1`](#audioplayers_android---v101)
+ - [`audioplayers_darwin` - `v1.0.1`](#audioplayers_darwin---v101)
+
+---
+
+#### `audioplayers` - `v1.0.1`
+
+ - **FIX**: Make sure onComplete resets the position even when not looping (#1175). ([6e6005ac](https://github.com/bluefireteam/audioplayers/commit/6e6005ac98765aeeea62208b58a6cc6d0cb4b084))
+
+#### `audioplayers_android` - `v1.0.1`
+
+ - **FIX**: getDuration, getPosition causes MEDIA_ERROR_UNKNOWN (#1172). ([51b4c73e](https://github.com/bluefireteam/audioplayers/commit/51b4c73eaff5c60d1c3c3e42ae783df07d34be09))
+
+#### `audioplayers_darwin` - `v1.0.1`
+
+ - **FIX**: Make sure onComplete resets the position even when not looping (#1175). ([6e6005ac](https://github.com/bluefireteam/audioplayers/commit/6e6005ac98765aeeea62208b58a6cc6d0cb4b084))
+
+
+## 2022-06-12
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.0.0`](#audioplayers---v100)
+ - [`audioplayers_android` - `v1.0.0`](#audioplayers_android---v100)
+ - [`audioplayers_darwin` - `v1.0.0`](#audioplayers_darwin---v100)
+ - [`audioplayers_linux` - `v1.0.0`](#audioplayers_linux---v100)
+ - [`audioplayers_platform_interface` - `v1.0.0`](#audioplayers_platform_interface---v100)
+ - [`audioplayers_web` - `v1.0.0`](#audioplayers_web---v100)
+ - [`audioplayers_windows` - `v1.0.0`](#audioplayers_windows---v100)
+
+---
+
+#### `audioplayers` - `v1.0.0`
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_android` - `v1.0.0`
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_darwin` - `v1.0.0`
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_linux` - `v1.0.0`
+
+ - **FIX**: missing onDuration event, free previous source when set url on Linux (#1129). ([b523a39e](https://github.com/bluefireteam/audioplayers/commit/b523a39e253dd461b07c360d7547eef9bb54cd65))
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_platform_interface` - `v1.0.0`
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_web` - `v1.0.0`
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+#### `audioplayers_windows` - `v1.0.0`
+
+ - **FIX**: Windows Failed to seekTo longer than 3:30s (#1125). ([8db4dcaa](https://github.com/bluefireteam/audioplayers/commit/8db4dcaa1446e1442c63134df80b95af852c078f))
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+
+## 2022-05-08
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_darwin` - `v1.0.0-rc.4`](#audioplayers_darwin---v100-rc4)
+ - [`audioplayers_web` - `v1.0.0-rc.3`](#audioplayers_web---v100-rc3)
+ - [`audioplayers` - `v1.0.0-rc.4`](#audioplayers---v100-rc4)
+
+Packages with dependency updates only:
+
+> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
+
+ - `audioplayers` - `v1.0.0-rc.4`
+
+---
+
+#### `audioplayers_darwin` - `v1.0.0-rc.4`
+
+ - **FIX**: Fix iOS code that was missing from previous push (melos vs pub get issue) (#1122). ([fe737849](https://github.com/bluefireteam/audioplayers/commit/fe737849811d0de02cac56b73a613e4ceb78c218))
+
+#### `audioplayers_web` - `v1.0.0-rc.3`
+
+ - **FEAT**: Add onPlayerCompletion, onPlayerStateChanged and onDurationChanged for web (#1123). ([760e0c94](https://github.com/bluefireteam/audioplayers/commit/760e0c9443f4c63aadf4c5498767aeac6cd79346))
+
+
+## 2022-05-08
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_linux` - `v1.0.0-rc.3`](#audioplayers_linux---v100-rc3)
+ - [`audioplayers` - `v1.0.0-rc.3`](#audioplayers---v100-rc3)
+ - [`audioplayers_darwin` - `v1.0.0-rc.3`](#audioplayers_darwin---v100-rc3)
+ - [`audioplayers_windows` - `v1.0.0-rc.3`](#audioplayers_windows---v100-rc3)
+
+---
+
+#### `audioplayers_linux` - `v1.0.0-rc.3`
+
+ - **FEAT**: Linux platform support (closes #798) (#1110). ([74616c54](https://github.com/bluefireteam/audioplayers/commit/74616c5471fb942d8f08c41de50c93d4387f8916))
+
+#### `audioplayers` - `v1.0.0-rc.3`
+
+ - **FIX**: Volume and rate can be set before audio playing on iOS (#1113). ([eca1dd0e](https://github.com/bluefireteam/audioplayers/commit/eca1dd0e85abd72dc6c17bd2b7a24912664b98a5))
+ - **FEAT**: Linux platform support (closes #798) (#1110). ([74616c54](https://github.com/bluefireteam/audioplayers/commit/74616c5471fb942d8f08c41de50c93d4387f8916))
+
+#### `audioplayers_darwin` - `v1.0.0-rc.3`
+
+ - **FIX**: Volume and rate can be set before audio playing on iOS (#1113). ([eca1dd0e](https://github.com/bluefireteam/audioplayers/commit/eca1dd0e85abd72dc6c17bd2b7a24912664b98a5))
+
+#### `audioplayers_windows` - `v1.0.0-rc.3`
+
+ - **FEAT**: Linux platform support (closes #798) (#1110). ([74616c54](https://github.com/bluefireteam/audioplayers/commit/74616c5471fb942d8f08c41de50c93d4387f8916))
+
+
+## 2022-04-28
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.0.0-rc.2`](#audioplayers---v100-rc2)
+ - [`audioplayers_windows` - `v1.0.0-rc.2`](#audioplayers_windows---v100-rc2)
+ - [`audioplayers_darwin` - `v1.0.0-rc.2`](#audioplayers_darwin---v100-rc2)
+ - [`audioplayers_android` - `v1.0.0-rc.2`](#audioplayers_android---v100-rc2)
+ - [`audioplayers_platform_interface` - `v1.0.0-rc.2`](#audioplayers_platform_interface---v100-rc2)
+ - [`audioplayers_web` - `v1.0.0-rc.2`](#audioplayers_web---v100-rc2)
+
+---
+
+#### `audioplayers` - `v1.0.0-rc.2`
+
+ - Bump "audioplayers" to `1.0.0-rc.2`.
+
+#### `audioplayers_windows` - `v1.0.0-rc.2`
+
+#### `audioplayers_darwin` - `v1.0.0-rc.2`
+
+#### `audioplayers_android` - `v1.0.0-rc.2`
+
+#### `audioplayers_platform_interface` - `v1.0.0-rc.2`
+
+#### `audioplayers_web` - `v1.0.0-rc.2`
+
+
+## 2022-04-01
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers` - `v1.0.0-rc.1`](#audioplayers---v100-rc1)
+
+---
+
+#### `audioplayers` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+
+## 2022-04-01
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_windows` - `v1.0.0-rc.1`](#audioplayers_windows---v100-rc1)
+ - [`audioplayers_android` - `v1.0.0-rc.1`](#audioplayers_android---v100-rc1)
+ - [`audioplayers_darwin` - `v1.0.0-rc.1`](#audioplayers_darwin---v100-rc1)
+
+---
+
+#### `audioplayers_windows` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+#### `audioplayers_android` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+#### `audioplayers_darwin` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+
+## 2022-04-01
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_web` - `v1.0.0-rc.1`](#audioplayers_web---v100-rc1)
+
+---
+
+#### `audioplayers_web` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+
+## 2022-03-31
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_web` - `v1.0.0-rc.1`](#audioplayers_web---v100-rc1)
+
+---
+
+#### `audioplayers_web` - `v1.0.0-rc.1`
+
+ - First release after federation
+
+
+## 2022-03-30
+
+### Changes
+
+---
+
+Packages with breaking changes:
+
+ - There are no breaking changes in this release.
+
+Packages with other changes:
+
+ - [`audioplayers_platform_interface` - `v1.0.0-rc.1`](#audioplayers_platform_interface---v100-rc1)
+
+---
+
+#### `audioplayers_platform_interface` - `v1.0.0-rc.1`
+
+ - First release after federation
+
diff --git a/LICENSE b/LICENSE
index 382de332d..1a581b05c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2017 Luan Nico
+Copyright (c) 2017 Blue Fire
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
+SOFTWARE.
diff --git a/README.md b/README.md
deleted file mode 100644
index 8e1b49d6d..000000000
--- a/README.md
+++ /dev/null
@@ -1,321 +0,0 @@
-# AudioPlayers
-
-[](https://pub.dartlang.org/packages/audioplayers) [](https://github.com/luanpotter/audioplayers/actions?query=workflow%3A"build"+branch%3Amaster) [](https://discord.gg/pxrBmy4)
-
-A Flutter plugin to play multiple simultaneously audio files, works for Android, iOS, macOS and web.
-
-  
-
-## Contributing
-
-We now have new rules for contributing!
-
-All help is appreciated but if you have questions, bug reports, issues, feature requests, pull requests, etc, please first refer to our [Contributing Guide](contributing.md).
-
-Also, as always, please give us a star to help!
-
-## Support us
-
-You can support us by becoming a patron on Patreon, any support is much appreciated.
-
-[](https://www.patreon.com/fireslime)
-
-## Feature Parity Table
-
-Not all features are available on all platforms. [Click here](feature_parity_table.md) to see a table relating what features can be used on each target.
-
-Feel free to use it for ideas for possible PRs and contributions you can help with on our roadmap! If you are submiting a PR, don't forget to update the table.
-
-## Usage
-
-An `AudioPlayer` instance can play a single audio at a time. To create it, simply call the constructor:
-
-```dart
- AudioPlayer audioPlayer = AudioPlayer();
-```
-
-To use the low latency API, better for gaming sounds, use:
-
-```dart
- AudioPlayer audioPlayer = AudioPlayer(mode: PlayerMode.LOW_LATENCY);
-```
-
-In this mode the backend won't fire any duration or position updates.
-Also, it is not possible to use the seek method to set the audio a specific position.
-This mode is also not available on web.
-
-You can create multiple instances to play audio simultaneously.
-
-For all methods that return a `Future`: that's the status of the operation. If `1`, the operation was successful. Otherwise, it's the platform native error code.
-
-Logs are disable by default! To debug, run:
-
-```dart
- AudioPlayer.logEnabled = true;
-```
-
-### Playing Audio
-
-There are four possible sources of audio:
-
-- Remote file on the Internet
-- Local file on the user's device
-- Local asset from your Flutter project
-- Audio in the form of a byte array (in Flutter, Uint8List)
-
-Both for Remote Files or Local Files, use the `play` method, just setting appropriately the flag `isLocal`.
-
-For Local Assets, you have to use the `AudioCache` class (see below).
-
-To play a Remote File, just call `play` with the url (the `isLocal` parameter is false by default):
-
-If you want to play audio for a long period of time, you need to set appropriately the flag `stayAwake`,
-If you pass `stayAwake` as true you need to add this permission to your app manifest:
-``.
-
-```dart
- play() async {
- int result = await audioPlayer.play(url);
- if (result == 1) {
- // success
- }
- }
-```
-
-For a Local File, add the `isLocal` parameter:
-
-```dart
- playLocal() async {
- int result = await audioPlayer.play(localPath, isLocal: true);
- }
-```
-
-To play a file in the form of a data buffer (Uint8List), use the method `playBytes`.
-This currently only works for Android (requiring API >= 23, be sure to handle that if you use this method on your code).
-
-```dart
- playLocal() async {
- Uint8List byteData = .. // Load audio as a byte array here.
- int result = await audioPlayer.playBytes(byteData);
- }
-```
-
-The `isLocal` flag is required only because iOS and macOS make a difference about it (Android doesn't care either way).
-
-There is also an optional named `double volume` parameter, that defaults to `1.0`. It can go from `0.0` (mute) to `1.0` (max), varying linearly.
-
-The volume can also be changed at any time using the `setVolume` method.
-
-### Controlling
-
-Note: these features are not implemented in web yet.
-
-After playing, you can control the audio with pause, stop and seek commands.
-
-Pause will pause the audio but keep the cursor where it was. Subsequently calling play will resume from this point.
-
-```dart
- int result = await audioPlayer.pause();
-```
-
-Stop will stop the audio and reset the cursor. Subsequently calling play will resume from the beginning.
-
-```dart
- int result = await audioPlayer.stop();
-```
-
-Finally, use seek to jump through your audio:
-
-```dart
- int result = await audioPlayer.seek(Duration(milliseconds: 1200));
-```
-
-Also, you can resume (like play, but without new parameters):
-
-```dart
- int result = await audioPlayer.resume();
-```
-
-### Finer Control
-
-By default, the player will be release once the playback is finished or the stop method is called.
-
-This is because on Android, a MediaPlayer instance can be quite resource-heavy, and keep it unreleased would cause performance issues if you play lots of different audios.
-
-On iOS and macOS this doesn't apply, so release does nothing.
-
-You can change the Release Mode to determine the actual behavior of the MediaPlayer once finished/stopped. There are three options:
-
-- RELEASE: default mode, will release after stop/completed.
-- STOP: will never release; calling play should be faster.
-- LOOP: will never release; after completed, it will start playing again on loop.
-
-If you are not on RELEASE mode, you should call the release method yourself; for example:
-
-```dart
- await audioPlayer.setUrl('clicking.mp3'); // prepare the player with this audio but do not start playing
- await audioPlayer.setReleaseMode(ReleaseMode.STOP); // set release mode so that it never releases
-
- // on button click
- await audioPlayer.resume(); // quickly plays the sound, will not release
-
- // on exiting screen
- await audioPlayer.release(); // manually release when no longer needed
-```
-
-Despite the complex state diagram of Android's MediaPlayer, an AudioPlayer instance should never have an invalid state. Even if it's released, if resume is called, the data will be fetch again.
-
-#### Stream routing
-You can choose between speakers and earpiece. By default using speakers.
-Toggle between speakers and earpiece.
-```
-int result = await player.earpieceOrSpeakersToggle();
-```
-
-### Streams
-
-Note: streams are not available on web yet.
-
-The AudioPlayer supports subscribing to events like so:
-
-#### Duration Event
-
-This event returns the duration of the file, when it's available (it might take a while because it's being downloaded or buffered).
-
-```dart
- player.onDurationChanged.listen((Duration d) {
- print('Max duration: $d');
- setState(() => duration = d);
- });
-```
-
-#### Position Event
-
-This Event updates the current position of the audio. You can use it to make a progress bar, for instance.
-
-```dart
- player.onAudioPositionChanged.listen((Duration p) => {
- print('Current position: $p');
- setState(() => position = p);
- });
-```
-
-#### State Event
-
-This Event returns the current player state. You can use it to show if player playing, or stopped, or paused.
-
-```dart
- player.onPlayerStateChanged.listen((PlayerState s) => {
- print('Current player state: $s');
- setState(() => playerState = s);
- });
-```
-
-#### Completion Event
-
-This Event is called when the audio finishes playing; it's used in the loop method, for instance.
-
-It does not fire when you interrupt the audio with pause or stop.
-
-```dart
- player.onPlayerCompletion.listen((event) {
- onComplete();
- setState(() {
- position = duration;
- });
- });
-```
-
-#### Error Event
-
-This is called when an unexpected error is thrown in the native code.
-
-```dart
- player.onPlayerError.listen((msg) {
- print('audioPlayer error : $msg');
- setState(() {
- playerState = PlayerState.stopped;
- duration = Duration(seconds: 0);
- position = Duration(seconds: 0);
- });
- });
-```
-
-### AudioCache
-
-In order to play Local Assets, you must use the `AudioCache` class. AudioCache is not available for Flutter Web.
-
-Flutter does not provide an easy way to play audio on your assets, but this class helps a lot. It actually copies the asset to a temporary folder in the device, where it is then played as a Local File.
-
-It works as a cache because it keeps track of the copied files so that you can replay them without delay.
-
-You can find the full documentation for this class [here](https://github.com/luanpotter/audioplayers/blob/master/packages/audioplayers/doc/audio_cache.md).
-
-### playerId
-
-By default, each time you initialize a new instance of AudioPlayer a unique playerId is generated and assigned using [uuid package](https://pub.dev/packages/uuid), this is designed this way to play multiple audio files simultaneously, if you want to play using the same instance that was created before simply pass your playerId when creating a new AudioPlayer instance.
-
-```dart
-final audioPlayer = AudioPlayer(playerId: 'my_unique_playerId');
-```
-
-## Supported Formats
-
-You can check a list of supported formats below:
-
-- [Android](https://developer.android.com/guide/topics/media/media-formats.html)
-- [iOS and macOS](https://www.techotopia.com/index.php/Playing_Audio_on_iOS_8_using_AVAudioPlayer#Supported_Audio_Formats)
-- web: audio formats supported by the browser you are using ([more details](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API))
-
-## :warning: iOS & macOS App Transport Security
-
-By default iOS and macOS forbid loading from non-https url. To cancel this restriction on iOS or macOS you must edit your `.plist` and add:
-
-```xml
-NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
-
-```
-## :warning: macOS Outgoing Connections
-
-By default, Flutter macOS apps don't allow outgoing connections, so playing audio files/streams from the internet won't work. To fix this, add the following to the `.entitlements` files for your app:
-
-```xml
-com.apple.security.network.client
-
-```
-
-**Note:** On Android by default, there is a restriction not allowing traffic from HTTP resources. There is a fix for this and it requires
-adding `android:usesCleartextTraffic="true"` within your AndroidManifest.xml file located in `android/app/src/main/AndroidManifest.xml`.
-
-Here is an example of how it should look like:
-```xml
-
-
-
-
- ...
-
-
-```
-
-## Android Support
-
-Giving support to old Android devices is very hard, on this plugin we set the minSdk as 16, but we only ensure support >= 23 as that is the minimum version that the team has devices available to test changes and new features.
-
-This mean that, Audioplayer should work on older devices, but we can't give any guarantees, we will not be able to look after issues regarding API < 23. But we would glady take any pull requests from the community that fixes or improve support on those old versions.
-
-## Background playing
-
-To control playback from lock screen on iOS and Android you can use [audio_service](https://pub.dev/packages/audio_service). [Example](https://denis-korovitskii.medium.com/flutter-demo-audioplayers-on-background-via-audio-service-c95d65c90ae1) how to implement all AudioPlayers features with and audio_service.
-
-## Credits
-
-This was originally a fork of [rxlabz's audioplayer](https://github.com/rxlabz/audioplayer), but since we have diverged and added more features.
-
-Thanks for @rxlabz for the amazing work!
diff --git a/README.md b/README.md
new file mode 120000
index 000000000..b4ae14ea9
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+packages/audioplayers/README.md
\ No newline at end of file
diff --git a/contributing.md b/contributing.md
index 1b4bea4a4..eb4aa6f37 100644
--- a/contributing.md
+++ b/contributing.md
@@ -4,17 +4,86 @@ Thanks for using audioplayers and especially for your interest in contributing t
Please read this document carefully before doing anything else!
+## Environment Setup
+
+Audioplayers is set up to run with the most recent `stable` version of Flutter, so make sure your version
+matches that:
+
+```bash
+flutter channel stable
+```
+
+Also, audioplayers uses [Melos](https://github.com/invertase/melos) to manage the project and dependencies.
+
+To install Melos, run the following command from your terminal:
+
+```bash
+flutter pub global activate melos
+```
+
+Next, at the root of your locally cloned repository bootstrap the projects dependencies:
+
+```bash
+melos bootstrap
+```
+
+The bootstrap command locally links all dependencies within the project without having to
+provide manual [`dependency_overrides`](https://dart.dev/tools/pub/pubspec).
+This allows all plugins, examples and tests to build from the local clone project.
+You should only need to run this command once.
+
+> You do not need to run `flutter pub get` once bootstrap has been completed.
+
+### Current Development
+
+If you want to use the most recent changes in your own project add following dependencies to your `pubspec.yaml` or `pubspec_overrrides.yaml`:
+
+```yaml
+dependency_overrides:
+ audioplayers:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers'
+ audioplayers_platform_interface:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_platform_interface'
+ audioplayers_web:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_web'
+ audioplayers_linux:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_linux'
+ audioplayers_android:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_android'
+ audioplayers_darwin:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_darwin'
+ audioplayers_windows:
+ git:
+ url: https://github.com/bluefireteam/audioplayers.git
+ path: 'packages/audioplayers_windows'
+```
+
## Old Issues/PRs
-We have many existing open issues and a few open PRs that were created before this doc was created. We will try to respect their innocence of this file existence by doing our best effort to answer/address/fix/merge them as we normally would up to this point (i.e. as time permits). However, if an existing issue or PR is too blatant of an outlier from these rules, we reserve the right of asking, in the issue/PR for the author (or someone) to fix it so that it falls under the new rules (i.e. apply the templates, etc). If we need to do that, we will give two weeks for the issue/PR to be updated to follow the rules, otherwise it will be closed.
+We have many existing open issues and a few open PRs that were created before this doc was created. We will try to respect their ignorance of this file's existence by doing our best effort to answer/address/fix/merge them as we normally would up to this point (i.e. as time permits).
+However, if an existing issue or PR is too blatant of an outlier from these rules, we reserve the right of asking, in the issue/PR for the author (or someone) to fix it so that it falls under the new rules (i.e. apply the templates, etc).
+If we need to do that, we will give two weeks for the issue/PR to be updated to follow the rules, otherwise it will be closed.
Of course, anyone is free to open a similar followup at any time, as long as the new one follows the rules.
-With that particular comment in mind, consider the following rules to apply to new issues only.
+With that particular comment in mind, consider the following rules to apply to all new issues only.
## General Rules
-This document is divided in sections for each kind of contribution you have, but for any of them, basically for any form of communication between members of the community, you must follow these rules. I am adding them here at the top because they apply to all sections but also because they are the uttermost important thing for us.
+This document is divided in sections for each kind of contribution you have, but for any of them, basically for any form of communication between members of the community, you must follow these rules.
+I am adding them here at the top because they apply to all sections but also because they are the uttermost important thing for us.
* Read this doc, the readme and everything else required carefully
* Use clear, correct and acceptable English
@@ -31,7 +100,7 @@ After you read and accepted the rules above, you need to decide what kind of inq
Questions are not bugs! Do not open issues for questions. Here are the channels to ask for help.
-First of all, make sure you read *at least* the [Readme Document](README.md) in full. That is the basis of how this library work and its very well written with care and love by us. If you haven't read even the readme, don't expect us to answer a question that is already solved there.
+First of all, make sure you read *at least* the [Readme Document](README.md) and the [Getting Started tutorial](getting_started.md) in full. That is the basis of how this library work and its very well written with care and love by us. If you haven't read even the basics, don't expect us to answer a question that is already solved there.
Second, make sure you went through our FAQ, [Troubleshooting](troubleshooting.md). There are many questions we get asked all the time that we have put the time and effort to answer on that doc. So make sure your question is not already there.
@@ -43,7 +112,7 @@ If you still have a question, then you might have a legit question! However issu
* [Our discord channel](https://discord.gg/ny7eThk): This is [Fire Slime Games](https://fireslime.xyz/) discord server, the people that are also behind Flame/audioplayers. We have a channel on the server dedicated for audioplayers questions. There you will be able to find many people, often knowing much more than we do, eager to help you out (as long as you followed all the steps). This is the quicker way to get help!
- * The `flame` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/flame): Since audioplayers is part of the flame project, feel free to use the [flame] tag on Stack Overflow to get people from the community to help. This might be a bit more involved than discord but if you make a properly acceptable Stack Overflow question, people will be much more willing to help you with hard problems. Also, you are leaving some documentation for future generations!
+ * The `flutter-audioplayers` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/flutter-audioplayers): Feel free to use the [flutter-audioplayers] tag on Stack Overflow to get people from the community to help. This might be a bit more involved than discord but if you make a properly acceptable Stack Overflow question, people will be much more willing to help you with hard problems. Also, you are leaving some documentation for future generations!
### Bugs / Issue Reports
@@ -51,7 +120,11 @@ If you found a bug or issue, please report it to us! If you are unsure if it's a
But the first step is, again, to search for an existing issue. Maybe your issue was already reported, and we don't want duplicates. In fact, if it was already reported, the existing issues might have tips and tricks to circumvent the issue until we fix it.
-Once you are certain your bug is brand new, you can create an issue and select the `Bug Report` type. You **must** follow the template provided, read it carefully.
+Also, if it's about a specific feature not being implemented on a specific platform, we already track that on the [Feature Parity Table](feature_parity_table.md). PRs are welcome, but no need to report what we already know. We are progressing under our best effort to fulfill the most requested gaps.
+
+Once you are certain your bug is legit and brand new, you can create an issue and select the `Bug Report` type. You **must** follow the template provided, read it carefully.
+
+**Note**: read the template and *replace* the sections with your content. Do not *keep* the instructions on the final text of your PR. PRs that contains copied excerpts from the template (other than the titles, etc), will be closed without notice.
### Feature Requests / PRs
@@ -61,12 +134,16 @@ In order to open a Feature Request issue, just select the correct template under
Once your feature got approved to start developing, feel free to send your PRs! However, we have a few important PR rules:
+ * Start your PR title with a [conventional commit](https://www.conventionalcommits.org) type (feat:, fix: etc).
* Your build must pass. Please make sure everything is green!
- * Follow guidelines. We don't have a code analyzer for the native side (yet!), but please follow the code around you to make it properly formatted and linted. For Java, please follow an acceptable standard [like this one](https://google.github.io/styleguide/javaguide.html). There is nothing worse than badly formatted code!
- * Write clean, beautiful and easy to understand code, with comments if necessary and docs if possible.
- * Update our README/docs accordingly to your change, making it clear which platforms are supported.
+ * Follow guidelines. For the Dart side, follow [Flame's official style guide](https://github.com/flame-engine/flame/blob/main/doc/development/style_guide.md).
+ We also provide code linting and formatting for the native side, where we take the [Flutter's formatting](https://github.com/flutter/packages/blob/main/script/tool/lib/src/format_command.dart) as reference:
+ * C/C++: [Chromium coding style](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/styleguide/c++/c++.md) via [clang-format](https://clang.llvm.org/docs/ClangFormatStyleOptions.html), available for [CLion](https://www.jetbrains.com/help/clion/clangformat-as-alternative-formatter.html) and [VSCode](https://code.visualstudio.com/docs/cpp/cpp-ide#_code-formatting)
+ * Kotlin: [Kotlin style guide](https://developer.android.com/kotlin/style-guide) via [ktlint](https://github.com/pinterest/ktlint) and [EditorConfig](https://editorconfig.org/), available for [IntelliJ](https://www.jetbrains.com/help/idea/editorconfig.html) and [VSCode](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig)
+ * Swift: [Google Swift Style Guide](https://google.github.io/swift/) via [swift-format](https://github.com/apple/swift-format), available for [VSCode](https://marketplace.visualstudio.com/items?itemName=vknabel.vscode-apple-swift-format) or CLI with [native installation](https://github.com/apple/swift-format#getting-swift-format) or [Docker](https://github.com/mtgto/docker-swift-format/tree/main)
+ * Write clean, beautiful and easy to understand code, with comments if necessary and docs if applicable.
+ * Update our README/getting started/feature parity table/any other docs accordingly to your change, making it clear which platforms are supported.
* Try to support all platforms where it makes sense. This is a hard thing to ask, and we understand and we will merge PRs that only work on one platform as well. But if you have the time, please help us with feature parity.
- * Make sure your change is testable on the `example` app. If necessary, add it. This is **mandatory**. We need to be able to at least manually try your feature. Tests are even better of course (see below).
- * Try to add tests. We (sadly) have very little test coverage. If any new feature had some tests, it would help us a great deal. But this is also a hard ask because we don't have the easiest infrastructure to test, in fact, audio is hard to test.
- * Add your change to the CHANGELOG under the `[next]` section.
- * Do not add a new version to the changelog, bump versions or anything like that. We will deal with the release process and decide the next version after things are merged.
+ * Make sure your change is testable on the `example` app. If necessary, add to it. This is **mandatory**. We need to be able to at least manually try your feature. Tests are even better of course (see below).
+ * Try to add tests, if possible. We don't strive for 100% coverage, but we have very basic driver tests and unit tests where it makes sense (not all places can be tested for an audio player app).
+ * Do not add a new version to the changelog, bump versions or anything like that. We will deal with the release process using `melos` whenever there is something to release.
diff --git a/feature_parity_table.md b/feature_parity_table.md
index 643e8f9c6..ea3e773a3 100644
--- a/feature_parity_table.md
+++ b/feature_parity_table.md
@@ -1,11 +1,39 @@
# Feature Parity Table
-Not every feature is available on every platform yet. Use this table to keep track of our work and progress, and please help if you want :)
+Not every feature is available on every platform yet. Use this table to keep track of our work and progress, and please help out if you want to. :)
+
+If you would like to assist us implement a missing feature, please browse the [issue tracker](https://github.com/bluefireteam/audioplayers/issues) and reach out to us on our [Discord](https://discord.gg/pxrBmy4) server so we can coordinate efforts.
+
+## Note on Android
+
+### Media3 ExoPlayer
+
+We are going to switch from the internal [Android MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer) to the recommended [Media3 ExoPlayer](https://developer.android.com/media/media3).
+We still endorse the old media player until we are sure, the Media3 implementation fulfills all the needs.
+
+You already can try the Media3 implementation by adding `audioplayers_android_exo` to your apps `pubspec.yaml`.
+This [overrides](https://docs.flutter.dev/packages-and-plugins/developing-packages#non-endorsed-federated-plugin) our endorsed Android plugin implementation `audioplayers_android`:
+
+```yaml
+dependencies:
+ # ...
+ audioplayers: any
+ audioplayers_android_exo: any
+```
+
+For more, see the [audioplayers_android_exo](https://github.com/bluefireteam/audioplayers/blob/main/packages/audioplayers_android_exo/README.md) package.
+
+### Support for old SDKs
+
+Giving support to old Android devices is very hard, on this plugin we set the minSdk as 19, but we only ensure support >= 23 as that is the minimum version that the team has devices available to test changes and new features.
+
+This mean that, audioplayers should work on older devices, but we can't give any guarantees, we will not be able to look after issues regarding API < 23. But we would gladly take any pull requests from the community that fixes or improve support on those old versions.
-Note: LLM means Low Latency Mode.
## Main Features
+Note: LLM means Low Latency Mode.
+
Feature/Platform
@@ -13,63 +41,57 @@ Note: LLM means Low Latency Mode.
iOS
macOS
web
+
Windows
+
Linux
-
Audio Source
-
local file on device
yes
yes
yes
no
-
local asset
yes
yes
yes
yes
-
external URL file
yes
yes
yes
yes
-
external URL stream
yes
yes
yes
yes
-
byte array
SDK >=23
not yet
not yet
not yet
-
Audio Config
-
set url
yes
yes
yes
yes
-
audio cache (pre-load)
yes
yes
yes
yes
-
low latency mode
SDK >=21
no
no
no
-
Audio Control Commands
-
resume / pause / stop
yes
yes
yes
yes
-
release / release mode
yes
yes
yes
not yet
-
volume
yes
yes
yes
yes
-
seek
yes
yes
yes
not yet
-
Advanced Audio Control Commands
-
playback rate
SDK >= 23
yes
yes
yes
-
duck audio
yes (except LLM)
no
no
no
-
respect silence
yes (except LLM)
yes
no
no
-
stay awake
yes (except LLM)
yes
no
no
-
recording active
not yet
yes
no
no
-
playing route
yes (except LLM)
yes
no
no
-
Streams
-
duration event
yes
yes
yes
not yet
-
position event
yes
yes
yes
yes
-
state event
yes
yes
yes
not yet
-
completion event
yes
yes
yes
not yet
-
error event
yes
yes
yes
not yet
+
Audio Source
+
local file on device
yes
yes
yes
no
yes
yes
+
local asset
yes
yes
yes
yes
yes
yes
+
external URL file
yes
yes
yes
yes
yes
yes
+
external URL stream
yes
yes
yes
yes
yes
yes
+
byte array
SDK >=23
via conversion
via conversion
via conversion
yes
via conversion
+
Audio Config
+
set url
yes
yes
yes
yes
yes
yes
+
audio cache (pre-load)
yes
yes
yes
yes
yes
yes
+
low latency mode
SDK >=21 (except `audioplayers_android_exo`)
no
no
no
no
no
+
Audio Control Commands
+
resume / pause / stop
yes
yes
yes
yes
yes
yes
+
release
yes
yes
yes
yes
yes
yes
+
loop
yes
yes
yes
yes
yes
yes
+
volume
yes
yes
yes
yes
yes
yes
+
seek
yes
yes
yes
yes
yes
yes
+
Advanced Audio Control Commands
+
playback rate
SDK >= 23
yes
yes
yes
yes
yes
+
duck audio
yes (except LLM)
no
no
no
no
no
+
respect silence
yes (except LLM)
yes
no
no
no
no
+
stay awake
yes (except LLM)
yes
no
no
no
no
+
recording active
not yet
yes
no
no
no
no
+
playing route
yes (except LLM)
yes
no
no
no
no
+
balance
yes
not yet
not yet
yes
yes
yes
+
Streams
+
duration event
yes
yes
yes
yes
yes
yes
+
position event
yes
yes
yes
yes
yes
yes
+
state event
yes
yes
yes
yes
yes
yes
+
completion event
yes
yes
yes
yes
yes
yes
+
log event
yes
yes
yes
yes
yes
yes
-## Notifications
-
-Apart from the main features for playing audio, some unrelated features to notification and lock screen management were added to audioplayers.
-
-This is not the best home for them though. We are working with @ryanheise to eventually extract the existing notification related code from audioplayers and either:
-
- * create a new package, audioplayers_notifications for it
- * merge this code into the existing audio_service package
-
-audio_service is already a package that provides much more advanced notification/lock screen controls. Please follow this [example](https://denis-korovitskii.medium.com/flutter-demo-audioplayers-on-background-via-audio-service-c95d65c90ae1) to implement all AudioPlayers features with and audio_service.
+## Lock Screen Controls
-So please do not send any PRs or additions to the notifications/lock screen for now, unless it's part of our separation effort.
+To control playback from lock screen on iOS and Android, you can use @ryanheise's excellent [audio_service](https://pub.dev/packages/audio_service) package. [This article](https://denis-korovitskii.medium.com/flutter-demo-audioplayers-on-background-via-audio-service-c95d65c90ae1) showcases how to integrate audioplayers features with and audio_service.
-I will update this file as we move forward with this.
+Do not send any PRs or additions regarding notifications/lock screen support, unless it is a generic change on our infrastructure/wiring to support better integrating with `audio_service`.
-## Other Features
+## Other Out-of-Scope Features
-Some features are totally out of scope for the `audioplayers` package. The goal of this library is to provide a unified place to play audio media, be it songs, background musics, sound effects, etc, from different sources, and providing an array of advanced controls and listeners to control it via code.
+Some features are also out of scope for the `audioplayers` package. The goal of this library is to provide a unified place to play audio media, be it songs, background musics, sound effects, etc, from different sources, and providing an array of advanced controls and listeners to control it via code.
Non-goals: if the existing solutions proposed below are not good or do not work well with audioplayers, I am happy to collaborate to create an `audioplayers_x` separated package (eg `audioplayers_recorder`).
- * notifications/locks screen: see section above, use this for now or audio_service;
* interfaces: nothing related to interface building concerns audioplayers; you can use Flutter to build your interfaces;
* audio recording: recording audio from the microphone into audio files and streams; there is already a package for this called [audio_recorder](https://github.com/ZaraclaJ/audio_recorder).
* playlist: you can implement playlists as you wish by playing multiple audios or songs in sequence. Doesn't make sense for this package to have any builtin playlist mechanism.
diff --git a/getting_started.md b/getting_started.md
new file mode 100644
index 000000000..73cef6de1
--- /dev/null
+++ b/getting_started.md
@@ -0,0 +1,383 @@
+# Getting Started
+
+This tutorial should help you get started with the audioplayers library, covering the basics but guiding you all the way through advanced features.
+You can also play around with our [official example app](https://bluefireteam.github.io/audioplayers/) and [explore the code](https://github.com/bluefireteam/audioplayers/tree/main/packages/audioplayers/example), that showcases every feature the library has to offer.
+
+In order to install this package, add the [latest version](pub.dev/packages/audioplayers) of `audioplayers` to your `pubspec.yaml` file.
+This package uses [the Federated Plugin](https://docs.flutter.dev/development/packages-and-plugins/developing-packages) guidelines to support multiple platforms, so it should just work on all supported platforms your app is built for without any extra configuration.
+You do not need to add the `audioplayers_*` packages directly.
+
+## Setup Platforms
+
+For building and running for certain platforms you need pay attention to additional steps:
+
+* [Linux Setup](packages/audioplayers_linux/README.md#setup-for-linux) (`audioplayers_linux`).
+* [Windows Setup](packages/audioplayers_windows/README.md#setup-for-windows) (`audioplayers_windows`).
+
+## AudioPlayer
+
+An `AudioPlayer` instance can play a single audio at a time (think of it as a single boombox). To create it, simply call the constructor:
+
+```dart
+ final player = AudioPlayer();
+```
+
+You can create as many instances as you wish to play multiple audios simultaneously, or just to more easily control separate sources.
+
+## Sources
+
+Each AudioPlayer is created empty and has to be configured with an audio source (and it can only have one; changing it will replace the previous source).
+
+The source (cf. packages/audioplayers/lib/src/source.dart) is basically what audio you are playing (a song, sound effect, radio stream, etc), and it can have one of 4 types:
+
+1. **UrlSource**: get the audio from a remote URL from the Internet. This can be a direct link to a supported file to be downloaded, or a radio stream.
+1. **DeviceFileSource**: access a file in the user's device, probably selected by a file picker.
+1. **AssetSource**: play an asset bundled with your app, by default within the `assets` directory.
+ To customize the prefix, see [AudioCache](#audiocache).
+1. **BytesSource** (only some platforms): pass in the bytes of your audio directly (read it from anywhere).
+
+In order to set the source on your player instance, call `setSource` with the appropriate source object:
+
+```dart
+ await player.setSource(AssetSource('sounds/coin.wav'));
+```
+
+Alternatively, call the shortcut method:
+
+```dart
+ await player.setSourceUrl(url); // equivalent to setSource(UrlSource(url));
+```
+
+Or, if you want to set the url and start playing, using the `play` shortcut:
+
+```dart
+ await player.play(DeviceFileSource(localFile)); // will immediately start playing
+```
+
+## Controls
+
+After the URL is set, you can use the following methods to control the player:
+
+### resume
+
+Starts playback from current position (by default, from the start).
+
+```dart
+ await player.resume();
+```
+
+### seek
+
+Changes the current position (note: this does not affect the "playing" status).
+
+```dart
+ await player.seek(Duration(milliseconds: 1200));
+```
+
+### pause
+
+Stops the playback but keeps the current position.
+
+```dart
+ await player.pause();
+```
+
+### stop
+
+Stops the playback and also resets the current position.
+
+```dart
+ await player.stop();
+```
+
+### release
+
+Equivalent to calling `stop` and then releasing of any resources associated with this player.
+
+This means that memory might be de-allocated, etc.
+
+Note that the player is also in a ready-to-use state; if you call `resume` again any necessary resources will be re-fetch.
+
+Particularly on Android, the media player is quite resource-intensive, and this will let it go. Data will be buffered again when needed (if it's a remote file, it will be downloaded again.
+
+### dispose
+
+Disposes the player. It is calling `release` and also closes all open streams. This player instance must not be used anymore!
+
+```dart
+ await player.dispose();
+```
+
+### play
+
+Play is just a shortcut method that allows you to:
+
+ * set a source
+ * configure some player parameters (volume)
+ * configure audio attributes
+ * resume (start playing immediately)
+
+All in a single function call. For most simple use cases, it might be the only method you need.
+
+## Player Parameters
+
+You can also change the following parameters:
+
+### Volume
+
+Changes the audio volume. Defaults to `1.0`. It can go from `0.0` (mute) to `1.0` (max; some platforms allow bigger than 1), varying linearly.
+
+```dart
+ await player.setVolume(0.5);
+```
+
+### Balance
+
+Changes stereo balance. Defaults to `0.0` (both channels). `1.0` - right channel only, `-1.0` - left channel only.
+
+```dart
+ await player.setBalance(1.0); // right channel only
+```
+
+### Playback Rate
+
+Changes the playback rate (i.e. the "speed" of playback). Defaults to `1.0` (normal speed). `2.0` would be 2x speed, etc.
+
+```dart
+ await player.setPlaybackRate(0.5); // half speed
+```
+
+### Release Mode
+
+The release mode is controlling what happens when the playback ends. There are 3 options:
+
+1. `.stop`: just stops the playback but keep all associated resources.
+1. `.release` (default): releases all resources associated with this player, equivalent to calling the `release` method.
+1. `.loop`: starts over after completion, looping over and over again.
+
+```dart
+ await player.setReleaseMode(ReleaseMode.loop);
+```
+
+**Note**: you can control exactly what happens when the playback ends using the `onPlayerComplete` stream (see Streams below).
+
+**Note**: there are caveats when looping audio without gaps. Depending on the file format and platform, when audioplayers uses the native implementation of the "looping" feature, there will be gaps between plays, which might not be noticeable for non-continuous SFX but will definitely be noticeable for looping songs. Please check out the Gapless Loop section on our [Troubleshooting Guide](https://github.com/bluefireteam/audioplayers/blob/main/troubleshooting.md) for more details.
+
+
+### Player Mode
+
+The Player Mode represents what kind of native SDK is used to playback audio, when multiple options are available (currently only relevant for Android). There are 2 options:
+
+1. `.mediaPlayer` (default): for long media files or streams.
+1. `.lowLatency`: for short audio files, since it reduces the impacts on visuals or UI performance.
+
+**Note**: on low latency mode, these features are NOT available:
+- get duration & duration event
+- get position & position event
+- playback completion event (this means you are responsible for stopping the player)
+- seeking & seek completion event
+
+Normally you want to use `.mediaPlayer` unless you care about performance and your audios are short (i.e. for sound effects in games).
+
+## Logs
+
+You can globally control the amount of log messages that are emitted by this package:
+
+```dart
+ AudioLogger.logLevel = AudioLogLevel.info;
+```
+
+You can pick one of 3 options:
+
+1. `.info`: show any log messages, include info/debug messages
+1. `.error` (default): show only error messages
+1. `.none`: show no messages at all (not recommended)
+
+**Note**: before opening any issue, always try changing the log level to `.info` to gather any information that might assist you with solving the problem.
+
+**Note**: despite our best efforts, some native SDK implementations that we use spam a lot of log messages that we currently haven't figured out how to conform to this configuration (specially noticeable on Android). If you would like to contribute with a PR, they are more than welcome!
+
+You can also listen for [Log events](#Log event).
+
+## Audio Context
+
+An Audio Context is a (mostly mobile-specific) set of secondary, platform-specific aspects of audio playback, typically related to how the act of playing audio interacts with other features of the device. In most cases, you do not need to change this.
+
+The Audio Context configuration can be set globally for all players via:
+
+```dart
+ AudioPlayer.global.setAudioContext(AudioContextConfig(/*...*/).build());
+```
+
+To configure a player specific Audio Context (if desired), use:
+
+```dart
+ player.setAudioContext(AudioContextConfig(/*...*/).build());
+```
+
+**Note:** As the iOS platform can not handle contexts for each player individually, for convenience this would also set the Audio Context globally.
+
+While each platform has its own set of configurations, they are somewhat related, and you can create them using a unified interface call [`AudioContextConfig`](https://pub.dev/documentation/audioplayers/latest/audioplayers/AudioContextConfig-class.html).
+It provides generic abstractions that convey intent, that are then converted to platform specific configurations.
+
+Note that if this process is not perfect, you can create your configuration from scratch by providing exact details for each platform via
+[AudioContextAndroid](https://pub.dev/documentation/audioplayers_platform_interface/latest/audioplayers_platform_interface/AudioContextAndroid-class.html) and
+[AudioContextIOS](https://pub.dev/documentation/audioplayers_platform_interface/latest/audioplayers_platform_interface/AudioContextIOS-class.html).
+
+```dart
+ player.setAudioContext(AudioContext(
+ android: AudioContextAndroid(/*...*/),
+ iOS: AudioContextIOS(/*...*/),
+ ));
+```
+
+## Streams
+
+Each player has a variety of streams that can be used to listen to events, state changes, and other useful information coming from the player.
+All streams also emit the same native platform errors via the `onError` callback.
+
+#### Duration Event
+
+This event returns the duration of the file, when it's available (it might take a while because it's being downloaded or buffered).
+
+```dart
+ player.onDurationChanged.listen((Duration d) {
+ print('Max duration: $d');
+ setState(() => duration = d);
+ });
+```
+
+#### Position Event
+
+This Event updates the current position of the audio. You can use it to make a progress bar, for instance.
+
+```dart
+ player.onPositionChanged.listen((Duration p) => {
+ print('Current position: $p');
+ setState(() => position = p);
+ });
+```
+
+#### State Event
+
+This Event returns the current player state. You can use it to show if player playing, or stopped, or paused.
+
+```dart
+ player.onPlayerStateChanged.listen((PlayerState s) => {
+ print('Current player state: $s');
+ setState(() => playerState = s);
+ });
+```
+
+#### Completion Event
+
+This Event is called when the audio finishes playing; it's used in the loop method, for instance.
+
+It does not fire when you interrupt the audio with pause or stop.
+
+```dart
+ player.onPlayerComplete.listen((_) {
+ onComplete();
+ setState(() {
+ position = duration;
+ });
+ });
+```
+
+### Log event
+
+This event returns the log messages from the native platform.
+The logs are handled by default via `Logger.log()`, and errors via `Logger.error()`, see [Logs](#Logs).
+
+```dart
+ player.onLog.listen(
+ (String message) => Logger.log(message),
+ onError: (Object e, [StackTrace? stackTrace]) => Logger.error(e, stackTrace),
+ );
+```
+
+Or to handle global logs:
+
+```dart
+ AudioPlayer.global.onLog.listen(
+ (String message) => Logger.log(message),
+ onError: (Object e, [StackTrace? stackTrace]) => Logger.error(e, stackTrace),
+ );
+```
+
+### Event Stream
+
+All mentioned events can also be obtained by a combined event stream.
+
+```dart
+ player.eventStream.listen((AudioEvent event) {
+ print(event.eventType);
+ });
+```
+
+Or to handle global events:
+
+```dart
+ AudioPlayer.global.eventStream.listen((GlobalAudioEvent event) {
+ print(event.eventType);
+ });
+```
+
+## Advanced Concepts
+
+### AudioCache
+
+Flutter does not provide an easy way to play audio on your local assets, but that's where the `AudioCache` class comes into play.
+It actually copies the asset to a temporary folder in the device, where it is then played as a Local File.
+It works as a cache because it keeps track of the copied files so that you can replay them without delay.
+
+If desired, you can change the `AudioCache` per player via the `AudioPlayer().audioCache` property or for all players via `AudioCache.instance`.
+
+#### Local Assets
+
+When playing local assets, by default every instance of AudioPlayers uses a [shared global instance of AudioCache](https://pub.dev/documentation/audioplayers/latest/audioplayers/AudioPlayer/audioCache.html), that will have a [default prefix "/assets"](https://pub.dev/documentation/audioplayers/latest/audioplayers/AudioCache/prefix.html) configured, as per Flutter conventions.
+However, you can easily change that by specifying your own instance of AudioCache with any other (or no) prefix.
+
+Default behavior, presuming that your audio is stored in `/assets/audio/my-audio.wav`:
+```dart
+final player = AudioPlayer();
+await player.play(AssetSource('audio/my-audio.wav'));
+```
+
+Remove the asset prefix for all players:
+```dart
+AudioCache.instance = AudioCache(prefix: '')
+final player = AudioPlayer();
+await player.play(AssetSource('assets/audio/my-audio.wav'));
+```
+
+Set a different prefix for only one player (e.g. when using assets from another package):
+```dart
+final player = AudioPlayer();
+player.audioCache = AudioCache(prefix: 'packages/OTHER_PACKAGE/assets/')
+await player.play(AssetSource('other-package-audio.wav'));
+```
+
+### playerId
+
+By default, each time you initialize a new instance of AudioPlayer, a unique playerId is generated and assigned to it using the [uuid package](https://pub.dev/packages/uuid).
+This is used internally to route messages between multiple players, and it allows you to control multiple audios at the same time.
+If you want to specify the playerId, you can do so when creating the playing:
+
+```dart
+ final player = AudioPlayer(playerId: 'my_unique_playerId');
+```
+
+Two players with the same id will point to the same media player on the native side.
+
+### PositionUpdater
+
+By default, the position stream is updated on every new frame. You can change this behavior to e.g. update on a certain
+interval with the `TimerPositionUpdater` or implement your own `PositionUpdater`:
+
+```dart
+ player.positionUpdater = TimerPositionUpdater(
+ interval: const Duration(milliseconds: 100),
+ getPosition: player.getCurrentPosition,
+ );
+```
diff --git a/images/icon_ap.svg b/images/icon_ap.svg
new file mode 100644
index 000000000..28b2cf71b
--- /dev/null
+++ b/images/icon_ap.svg
@@ -0,0 +1,53 @@
+
+
diff --git a/images/logo_ap_compact.svg b/images/logo_ap_compact.svg
new file mode 100644
index 000000000..05e8413f1
--- /dev/null
+++ b/images/logo_ap_compact.svg
@@ -0,0 +1,65 @@
+
+
diff --git a/images/logo_ap_horizontal.svg b/images/logo_ap_horizontal.svg
new file mode 100644
index 000000000..fca068db0
--- /dev/null
+++ b/images/logo_ap_horizontal.svg
@@ -0,0 +1,75 @@
+
+
diff --git a/images/screenshot_ctrl.png b/images/screenshot_ctrl.png
new file mode 100644
index 000000000..18c1992be
Binary files /dev/null and b/images/screenshot_ctrl.png differ
diff --git a/images/screenshot_ctx.png b/images/screenshot_ctx.png
new file mode 100644
index 000000000..4f98e195e
Binary files /dev/null and b/images/screenshot_ctx.png differ
diff --git a/images/screenshot_src.png b/images/screenshot_src.png
new file mode 100644
index 000000000..f4569bed6
Binary files /dev/null and b/images/screenshot_src.png differ
diff --git a/images/screenshot_stream.png b/images/screenshot_stream.png
new file mode 100644
index 000000000..c02dec705
Binary files /dev/null and b/images/screenshot_stream.png differ
diff --git a/images/tab1.jpg b/images/tab1.jpg
deleted file mode 100644
index fadef9d3b..000000000
Binary files a/images/tab1.jpg and /dev/null differ
diff --git a/images/tab1s.jpg b/images/tab1s.jpg
deleted file mode 100644
index d415c568b..000000000
Binary files a/images/tab1s.jpg and /dev/null differ
diff --git a/images/tab2.jpg b/images/tab2.jpg
deleted file mode 100644
index 4fe8037a6..000000000
Binary files a/images/tab2.jpg and /dev/null differ
diff --git a/images/tab2s.jpg b/images/tab2s.jpg
deleted file mode 100644
index 4cb97918c..000000000
Binary files a/images/tab2s.jpg and /dev/null differ
diff --git a/images/tab3.jpg b/images/tab3.jpg
deleted file mode 100644
index 83ce17765..000000000
Binary files a/images/tab3.jpg and /dev/null differ
diff --git a/images/tab3s.jpg b/images/tab3s.jpg
deleted file mode 100644
index 5215aefff..000000000
Binary files a/images/tab3s.jpg and /dev/null differ
diff --git a/migration_guide.md b/migration_guide.md
new file mode 100644
index 000000000..c8d29b272
--- /dev/null
+++ b/migration_guide.md
@@ -0,0 +1,71 @@
+# Migration Guide
+
+## Migrate from v1 to higher versions
+
+We recommend following the migration instructions for the breaking changes in the [changelog](CHANGELOG.md).
+
+## Migrate from v0 to v1
+
+Despite several major infrastructural changes in v1.0.0, it should be very easy to migrate for end users, as things overall just got simpler.
+
+This document contains the list of major changes to be aware of.
+
+First step is to add the latest version (see [pub.dev](https://pub.dev/packages/audioplayers) for the latest version) to your `pubspec.yaml`:
+
+```yaml
+ dependencies:
+ audioplayers: ^2.0.0
+```
+
+### Federation, simplified platform interface
+
+This change is here as an introduction but should require no change whatsoever on users side. But we split the package using the official [Federation](https://docs.flutter.dev/development/packages-and-plugins/developing-packages) process from Flutter. You still only need to import the final package `audioplayers` into your project, but know that that will fetch the relevant implementations for each platform you support as `audioplayers_x` packages.
+
+In order to support this, we also created a vastly simplified `audioplayers_platform_interface` that is allowing us to add support for other platforms (eg desktop) much easier but removing any shortcuts or duplicated methods and leaving everything that can, to be implemented on the Dart side. Platforms have to deal with only the most basic building blocks they have to implement, and nothing else.
+
+### AudioCache is dead, long live Sources
+
+One of the main changes was my desire to "kill" the AudioCache API due to the vast confusion that it caused with users (despite our best efforts documenting everything).
+
+We still have the AudioCache class but its APIs are _exclusively_ dedicated to transforming asset files into local files, cache them, and provide the path. It however doesn't normally need be used by end users because the AudioPlayer itself is now capable of playing audio from any Source.
+
+What is a Source? It's a sealed class that can be one of:
+
+1. **UrlSource**: get the audio from a remote URL from the Internet
+1. **DeviceFileSource**: access a file in the user's device, probably selected by a file picker
+1. **AssetSource**: play an asset bundled with your app, normally within the `assets` directory
+1. **BytesSource** (only some platforms): pass in the bytes of your audio directly (read it from anywhere).
+
+If you use **AssetSource**, the AudioPlayer will use its instance of AudioCache (which defaults to the global cache if unchanged) automatically. This unifies all playing APIs under AudioPlayer and entirely removes the AudioCache detail for most users.
+
+### Simplified APIs, one method per task
+
+We removed multiple overrides and used the concept of Sources to unify methods under AP. Now we have base, separated methods for:
+
+1. `setSource` (taking a Source object; we also provide `setSourceX` as shortcuts)
+1. `setVolume`
+1. `setAudioContext` (though consider using `AudioPlayer.global.setGlobalAudioContext` instead)
+1. `resume` (actually starts playing)
+
+We still have (other than the handy `setSourceX` methods) one shortcut left: the `play` method. I think it's important to keep that as it might be easiest way for the most simple operation; it does:
+
+1. set the source via a Source object
+1. optionally sets the volume
+1. optionally sets the audio context
+1. optionally sets the position to seek
+1. optionally sets the player mode
+1. resumes (starts playing)
+
+All in one go. We might decide whether to keep this shortcut or what parameters exactly to have on a next refactor. But for now we are very happy that we no longer have `play` and `playBytes` being essentially clones with different sources on `AudioPlayer` and then `AudioCache` having its own versions + looping versions (it was chaotic before).
+
+### Enum name consolidation, some files were shuffled around
+
+As per Dart's new best practices, all enums on the Dart side now have lowercase constants.
+
+Also, some files might have been shuffled around (even between packages), but nothing that your IDE won't be able to quickly sort out.
+
+### AudioContext
+
+For some people, this will be irrelevant. For others, this might be the biggest change. Basically we collected all the random flags and parameters that were related to audio context/session configuration spread through the codebase on different methods, at different stages, into a single, unified configuration object called AudioContext, that can be set globally or per player (only for Android).
+
+For more details, check the Audio Context section on the [Getting Started tutorial](getting_started.md), or the [class documentation itself](https://github.com/bluefireteam/audioplayers/blob/main/packages/audioplayers_platform_interface/lib/api/audio_context_config.dart) (which is very comprehensive).
diff --git a/packages/audioplayers/CHANGELOG.md b/packages/audioplayers/CHANGELOG.md
index 97ca08bda..62e3cf729 100644
--- a/packages/audioplayers/CHANGELOG.md
+++ b/packages/audioplayers/CHANGELOG.md
@@ -1,3 +1,213 @@
+## 6.5.1
+
+ - **FIX**: Initialize audioplayer instances sequentially ([#1941](https://github.com/bluefireteam/audioplayers/issues/1941)). ([663fff2c](https://github.com/bluefireteam/audioplayers/commit/663fff2cb8482c81cb525c9d97bfb7f5d02dfdee))
+
+## 6.5.0
+
+ - **FIX**: Migrate to Melos v7 and Pub Workspaces ([#1929](https://github.com/bluefireteam/audioplayers/issues/1929)). ([9d0bfe0b](https://github.com/bluefireteam/audioplayers/commit/9d0bfe0be5cba0ce4fb3a75912b41117a8996bfe))
+ - **FEAT**: Customizable preparation and seeking timeout ([#1921](https://github.com/bluefireteam/audioplayers/issues/1921)). ([d5a63f8b](https://github.com/bluefireteam/audioplayers/commit/d5a63f8b206554f6a6719653c5ce9b92b8d096b9))
+ - **FEAT**: Support for Swift Package Manager ([#1908](https://github.com/bluefireteam/audioplayers/issues/1908)). ([e8f86e7b](https://github.com/bluefireteam/audioplayers/commit/e8f86e7bf80ddb8b0955d35c53f08cbf5f2d141b))
+
+## 6.4.0
+
+ - **FEAT**: Dispose players on Hot restart (closes [#1120](https://github.com/bluefireteam/audioplayers/issues/1120)) ([#1905](https://github.com/bluefireteam/audioplayers/issues/1905)). ([92bcb19e](https://github.com/bluefireteam/audioplayers/commit/92bcb19e10c462cb749e1209c5e066efc5581728))
+
+## 6.3.0
+
+ - **FEAT**(android): ExoPlayer for Android ([#1691](https://github.com/bluefireteam/audioplayers/issues/1691)). ([a91c5b18](https://github.com/bluefireteam/audioplayers/commit/a91c5b185054986a2390d41593b5ee502ef96bdd))\
+ You can enable the non-endorsed plugin implementation based on ExoPlayer (Media3) by calling: `flutter pub add audioplayers_android_exo` in your app package folder.
+ For more, see: https://github.com/bluefireteam/audioplayers/blob/main/feature_parity_table.md#media3-exoplayer
+ - **FEAT**: Raise to Flutter 3.29.0 ([#1891](https://github.com/bluefireteam/audioplayers/issues/1891)). ([26bd6d22](https://github.com/bluefireteam/audioplayers/commit/26bd6d228deacf7cb3454f2d1b972585cd8bb6ea))
+ - **DOCS**: Fix status badge ([#1899](https://github.com/bluefireteam/audioplayers/issues/1899)). ([a0c6c4fa](https://github.com/bluefireteam/audioplayers/commit/a0c6c4fabff19e943dced1070c1be3541668dce9))
+
+## 6.2.0
+
+ - **FIX**: No-op on single player setAudioContext in desktop platforms ([#1888](https://github.com/bluefireteam/audioplayers/issues/1888)). ([50d7a8b8](https://github.com/bluefireteam/audioplayers/commit/50d7a8b89f47e3ef29e98cf2b74a582f78783d5e))
+ - **FEAT**: Support setting AudioContext in AudioPool ([#1890](https://github.com/bluefireteam/audioplayers/issues/1890)). ([2968c88b](https://github.com/bluefireteam/audioplayers/commit/2968c88b4e1492a29d4cd0e5f7735f159f995c1a))
+ - **FEAT**: ReleaseMode.release for ios, macos, windows, web, linux ([#1790](https://github.com/bluefireteam/audioplayers/issues/1790)). ([4ffc4029](https://github.com/bluefireteam/audioplayers/commit/4ffc4029d846d7c391c457b829c372c1763b7b50))
+
+## 6.1.2
+
+ - Update a dependency to the latest release.
+
+## 6.1.1
+
+ - Update a dependency to the latest release.
+
+## 6.1.0
+
+ - **FEAT**: Upgrade to Flutter v3.22.x ([#1803](https://github.com/bluefireteam/audioplayers/issues/1803)). ([4d669e72](https://github.com/bluefireteam/audioplayers/commit/4d669e723dc5c2399073301ba9333f99bc623669))
+
+## 6.0.0
+
+> Note: This release has breaking changes.
+
+ - **FIX**: Use unique tmp location for each AudioCache ([#1724](https://github.com/bluefireteam/audioplayers/issues/1724)). ([2333cb7f](https://github.com/bluefireteam/audioplayers/commit/2333cb7f5a9fcd84bdd477120d1f53f346c3b10d))
+ - **FIX**: Race condition when playing/pausing audio ([#1705](https://github.com/bluefireteam/audioplayers/issues/1705)). ([463b2a11](https://github.com/bluefireteam/audioplayers/commit/463b2a1149105a25f81d708533d13cc2dd277d6b))
+ - **FIX**: Seek not applied in `play` method ([#1695](https://github.com/bluefireteam/audioplayers/issues/1695)). ([f6138fef](https://github.com/bluefireteam/audioplayers/commit/f6138fef97ccd5b78b44dbe85f7d41e16b3662f6))
+ - **FIX**: Propagate Stream Errors through the same Future ([#1732](https://github.com/bluefireteam/audioplayers/issues/1732)). ([00d041df](https://github.com/bluefireteam/audioplayers/commit/00d041df11c26fd96f480782f2787f857c77daa0))
+ - **FIX**: Wait for seek to complete ([#1712](https://github.com/bluefireteam/audioplayers/issues/1712)). ([fd33b1d0](https://github.com/bluefireteam/audioplayers/commit/fd33b1d073280797cdd88fb6324cc1906bfd5957))
+ - **FEAT**: Support byte array and data URIs via mimeType ([#1763](https://github.com/bluefireteam/audioplayers/issues/1763)). ([eaf7ce86](https://github.com/bluefireteam/audioplayers/commit/eaf7ce86ad271097365fcf9e3a03fc341629ae47))
+ - **FEAT**(ios): Improved AudioContextConfig assertions, fix example ([#1619](https://github.com/bluefireteam/audioplayers/issues/1619)). ([df342c52](https://github.com/bluefireteam/audioplayers/commit/df342c529b0b13abd0515c5dc762987293ebc4c1))
+ - **FEAT**(web): Support compilation to Wasm ([#1766](https://github.com/bluefireteam/audioplayers/issues/1766)). ([1b1a0cf9](https://github.com/bluefireteam/audioplayers/commit/1b1a0cf92e950bc520598426d3f073c3bd5a6a28))
+ - **DOCS**: Improve Docs ([#1710](https://github.com/bluefireteam/audioplayers/issues/1710)). ([4208463a](https://github.com/bluefireteam/audioplayers/commit/4208463a4110ed117eebe28e170872817712ff53))
+ - **BREAKING** **REFACTOR**: Remove deprecated methods ([#1583](https://github.com/bluefireteam/audioplayers/issues/1583)). ([8d0cbeda](https://github.com/bluefireteam/audioplayers/commit/8d0cbeda6babea69b1753340f9cec3d246d7e29a))
+ - **BREAKING** **FEAT**: FramePositionUpdater & TimerPositionUpdater ([#1664](https://github.com/bluefireteam/audioplayers/issues/1664)). ([1ea93536](https://github.com/bluefireteam/audioplayers/commit/1ea93536b448fa5d43281cbc0a7b67445fc1a9a8))
+ - **BREAKING** **FEAT**: Extend `AudioContextConfig.duckAudio` to `AudioContextConfig.focus` ([#1720](https://github.com/bluefireteam/audioplayers/issues/1720)). ([87f3cb7e](https://github.com/bluefireteam/audioplayers/commit/87f3cb7e47e2103d2079a3dfe6aebe80c8a76c3d))
+ - **BREAKING** **FEAT**(ios): Improve AudioContextIOS ([#1591](https://github.com/bluefireteam/audioplayers/issues/1591)). ([25fbec05](https://github.com/bluefireteam/audioplayers/commit/25fbec051a4f521f73c473cdad20f88c7907d7b1))
+ - **BREAKING** **DEPS**: Update min Flutter to v3.13.0, compatibility with v3.16.8 ([#1715](https://github.com/bluefireteam/audioplayers/issues/1715)). ([e4262f4c](https://github.com/bluefireteam/audioplayers/commit/e4262f4c0d6582c35738ace603583c81bd5a3b4b))
+ - **BREAKING** **CHORE**: Upgrade to Flutter 3.13.0 ([#1612](https://github.com/bluefireteam/audioplayers/issues/1612)). ([1a3de1ac](https://github.com/bluefireteam/audioplayers/commit/1a3de1acd5a8b90b6d9c0d0f2a7141723c277c24))
+
+## 5.2.1
+
+ - **FIX**: Avoid decoding already encoded character in URI ([#1679](https://github.com/bluefireteam/audioplayers/issues/1679)). ([1923205c](https://github.com/bluefireteam/audioplayers/commit/1923205c4cde70e2915e6e6c6afeb2fec27a08e8))
+ - **FIX**(android): Released wrong source in LOW_LATENCY mode ([#1672](https://github.com/bluefireteam/audioplayers/issues/1672)). ([d9c5f693](https://github.com/bluefireteam/audioplayers/commit/d9c5f693cafab21b67b785de6244c3c371344a53))
+
+## 5.2.0
+
+ - **REFACTOR**: Lint Swift ([#1613](https://github.com/bluefireteam/audioplayers/issues/1613)). ([737aa94f](https://github.com/bluefireteam/audioplayers/commit/737aa94f7edb076d622c34e498b90f17c9959e9c))
+ - **REFACTOR**: Lint Kotlin, C and C++ code ([#1610](https://github.com/bluefireteam/audioplayers/issues/1610)). ([05394668](https://github.com/bluefireteam/audioplayers/commit/0539466850aaa49a0bde9448939c6c3d536dd6e2))
+ - **FIX**: Cancel `onPreparedSubscription` on error ([#1660](https://github.com/bluefireteam/audioplayers/issues/1660)). ([c11dbf30](https://github.com/bluefireteam/audioplayers/commit/c11dbf3094457799a3b89fd6f0b386799b2f943c))
+ - **FIX**: Set playback rate only when playing ([#1658](https://github.com/bluefireteam/audioplayers/issues/1658)). ([d73c7d5c](https://github.com/bluefireteam/audioplayers/commit/d73c7d5c2ef13e8eff2c438b96ade6e2483a2014))
+ - **FIX**: Improve Error handling for Unsupported Sources ([#1625](https://github.com/bluefireteam/audioplayers/issues/1625)). ([a4d84422](https://github.com/bluefireteam/audioplayers/commit/a4d84422f1421755b05aa7eff38b4d2ed0cf7482))
+ - **FIX**: Return null for duration and position, if not available ([#1606](https://github.com/bluefireteam/audioplayers/issues/1606)). ([2a79644a](https://github.com/bluefireteam/audioplayers/commit/2a79644a2064ccc5d8e9a31aaf888b0b60ee321d))
+ - **FEAT**(windows): Support for BytesSource on Windows ([#1601](https://github.com/bluefireteam/audioplayers/issues/1601)). ([a9e14710](https://github.com/bluefireteam/audioplayers/commit/a9e147107aa31072d4bcc69a02b2ee287d4b366b))
+ - **FEAT**: Allow adding custom media sources to example ([#1637](https://github.com/bluefireteam/audioplayers/issues/1637)). ([1eabe619](https://github.com/bluefireteam/audioplayers/commit/1eabe61957caf969f132ce6fad7b99208887466b))
+ - **DOCS**: Deploy live example app to GH pages ([#1623](https://github.com/bluefireteam/audioplayers/issues/1623)). ([fe81f3b1](https://github.com/bluefireteam/audioplayers/commit/fe81f3b1e600fe005febbe7cd3da02735a3de004))
+
+## 5.1.0
+
+ - **REFACTOR**(darwin): Rearrange code ([#1585](https://github.com/bluefireteam/audioplayers/issues/1585)). ([13639d1f](https://github.com/bluefireteam/audioplayers/commit/13639d1f2fe5afbc17f4e862e2da0f7551b8fc3e))
+ - **FEAT**: Get current volume, balance and playbackRate ([#1582](https://github.com/bluefireteam/audioplayers/issues/1582)). ([0c2ff7b1](https://github.com/bluefireteam/audioplayers/commit/0c2ff7b1289238150388e571396ac92b28a8ea5d))
+
+## 5.0.0
+
+> Note: This release has breaking changes.
+
+ - **REFACTOR**(windows): simplify position and duration processing ([#1553](https://github.com/bluefireteam/audioplayers/issues/1553)). ([ca63c5a4](https://github.com/bluefireteam/audioplayers/commit/ca63c5a4b120e0d1ea421e6ab30f590c314a33f2))
+ - **FIX**(example): Use kotlin version compatible with AGP8 ([#1577](https://github.com/bluefireteam/audioplayers/issues/1577)). ([8f4b1bb0](https://github.com/bluefireteam/audioplayers/commit/8f4b1bb0bc93df095bff2a4d4c2f92a4c4a85d17))
+ - **FIX**(linux): allow reusing event channel with same name ([#1555](https://github.com/bluefireteam/audioplayers/issues/1555)). ([5471189f](https://github.com/bluefireteam/audioplayers/commit/5471189f9469e973f9262a120b02b321ca0dce24))
+ - **FEAT**(android): Add support for AGP 8 in example, add compileOptions to build.gradle ([#1503](https://github.com/bluefireteam/audioplayers/issues/1503)). ([7c08e4e1](https://github.com/bluefireteam/audioplayers/commit/7c08e4e1a524f53294f6967996fd31837e62cb81))
+ - **BREAKING** **FIX**: Default audio output to system preferences ([#1563](https://github.com/bluefireteam/audioplayers/issues/1563)). ([381c43e3](https://github.com/bluefireteam/audioplayers/commit/381c43e3725fbb0cb4fd35982893a3c92b188886))
+ - **BREAKING** **CHORE**: Bump Flutter to version 3.10.x ([#1529](https://github.com/bluefireteam/audioplayers/issues/1529)). ([c1296c9b](https://github.com/bluefireteam/audioplayers/commit/c1296c9ba0cc43284b31d78f2f484454fbf6b773))
+
+## 4.1.0
+
+ - **REFACTOR**: Adapt to flame_lint v0.2.0+2 ([#1477](https://github.com/bluefireteam/audioplayers/issues/1477)). ([e1d7fb6a](https://github.com/bluefireteam/audioplayers/commit/e1d7fb6ab57c8a523c80dfc673bde3b7379b2add))
+ - **FIX**: Timeout on setting same source twice ([#1520](https://github.com/bluefireteam/audioplayers/issues/1520)). ([5d164d1f](https://github.com/bluefireteam/audioplayers/commit/5d164d1f20463a8a31a228cd1d85252d47ae256e))
+ - **FIX**: test and fix compatibility with min flutter version ([#1510](https://github.com/bluefireteam/audioplayers/issues/1510)). ([9f39e95f](https://github.com/bluefireteam/audioplayers/commit/9f39e95ff7913d8fc30fff27fef7aefc32de26fb))
+ - **FIX**: onPrepared event to wait until player is ready / finished loading the source ([#1469](https://github.com/bluefireteam/audioplayers/issues/1469)). ([50f56365](https://github.com/bluefireteam/audioplayers/commit/50f56365f8e512df0fc5bdb7222614389cbd4ea0))
+ - **FIX**: rework dispose ([#1480](https://github.com/bluefireteam/audioplayers/issues/1480)). ([c64ef6d9](https://github.com/bluefireteam/audioplayers/commit/c64ef6d914a52743128c717b90c4da0abbd7538d))
+ - **FEAT**: Adapt position update interval of darwin, linux, web ([#1492](https://github.com/bluefireteam/audioplayers/issues/1492)). ([ab5bdf6a](https://github.com/bluefireteam/audioplayers/commit/ab5bdf6a2bcbf7e984d4d897e43a67b3684c52d8))
+ - **DOCS**: Improve docs ([#1518](https://github.com/bluefireteam/audioplayers/issues/1518)). ([4c0d5546](https://github.com/bluefireteam/audioplayers/commit/4c0d55465a8e75c13987b970dee648657eba4384))
+
+## 4.0.1
+
+ - **FIX**: dispose player implementation ([#1470](https://github.com/bluefireteam/audioplayers/issues/1470)). ([d9026c15](https://github.com/bluefireteam/audioplayers/commit/d9026c1538cc83dfba5745771ad71c307b6da852))
+
+## 4.0.0
+
+> Note: This release has breaking changes.
+
+ - **FIX**(android): Avoid calling onDuration on position event (closes [#136](https://github.com/bluefireteam/audioplayers/issues/136)) ([#1460](https://github.com/bluefireteam/audioplayers/issues/1460)). ([6cfb3753](https://github.com/bluefireteam/audioplayers/commit/6cfb3753cd8003f341d97e0b2417d4512f452267))
+ - **FEAT**: replace `Platform.isX` with `defaultTargetPlatform` ([#1446](https://github.com/bluefireteam/audioplayers/issues/1446)). ([6cd5656c](https://github.com/bluefireteam/audioplayers/commit/6cd5656c0c5deaab1fb4af78a5b7632402c3a1d3))
+ - **FEAT**(example): add invalid asset, small refactor, colored source buttons ([#1445](https://github.com/bluefireteam/audioplayers/issues/1445)). ([92a20fad](https://github.com/bluefireteam/audioplayers/commit/92a20fadd6f549d44b7055b38a48fad2861a05c8))
+ - **FEAT**(android): add `setBalance` ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1444](https://github.com/bluefireteam/audioplayers/issues/1444)). ([3b5de50e](https://github.com/bluefireteam/audioplayers/commit/3b5de50ea7fa5248165616fc1ffd80da6c66583a))
+ - **FEAT**: extract AudioContext from audio_context_config ([#1440](https://github.com/bluefireteam/audioplayers/issues/1440)). ([e59c3b9f](https://github.com/bluefireteam/audioplayers/commit/e59c3b9f07c1a72f9bf4e424fa3b011645f191d2))
+ - **FEAT**(ios): set player context globally on `setAudioContext` for iOS only ([#1416](https://github.com/bluefireteam/audioplayers/issues/1416)). ([19af364b](https://github.com/bluefireteam/audioplayers/commit/19af364b7d0404ae436c54cdaa18d50f3a2aacd6))
+ - **FEAT**(example): update app icons ([#1417](https://github.com/bluefireteam/audioplayers/issues/1417)). ([ac35df89](https://github.com/bluefireteam/audioplayers/commit/ac35df895cefe3d69dac4c8b1cf07c7f7ed56ca7))
+ - **FEAT**: AudioPool (moved and improved from flame_audio) ([#1403](https://github.com/bluefireteam/audioplayers/issues/1403)). ([ab15cb02](https://github.com/bluefireteam/audioplayers/commit/ab15cb02cf939347772ac9fc961b5f01d7bad94b))
+ - **DOCS**: update AudioCache explanation, migration guide, replace package READMEs ([#1457](https://github.com/bluefireteam/audioplayers/issues/1457)). ([b8eb1974](https://github.com/bluefireteam/audioplayers/commit/b8eb197435631fafeaa9a26eb76aca8e43e86420))
+ - **DOCS**: update example app and screenshots ([#1419](https://github.com/bluefireteam/audioplayers/issues/1419)). ([c48eaf38](https://github.com/bluefireteam/audioplayers/commit/c48eaf389ab5b1cf1d51fadc814f473b8ea813cb))
+ - **BREAKING** **REFACTOR**: prevent from confusing and conflicting class names ([#1465](https://github.com/bluefireteam/audioplayers/issues/1465)). ([7cdb8586](https://github.com/bluefireteam/audioplayers/commit/7cdb858605f24f0abd1a225e04922830233f3e96))
+ - **BREAKING** **REFACTOR**: improve separation of global audioplayer interface ([#1443](https://github.com/bluefireteam/audioplayers/issues/1443)). ([c0b3f85c](https://github.com/bluefireteam/audioplayers/commit/c0b3f85c477f0313299cc2a2898840d6c7d8dcd9))
+ - **BREAKING** **FEAT**: event channel ([#1352](https://github.com/bluefireteam/audioplayers/issues/1352)). ([c9fd6a76](https://github.com/bluefireteam/audioplayers/commit/c9fd6a762c8c346d8d5598e3550c5571a5e460f0))
+ - **BREAKING** **FEAT**: expose classes of package `audioplayers_platform_interface` ([#1442](https://github.com/bluefireteam/audioplayers/issues/1442)). ([a6f89be1](https://github.com/bluefireteam/audioplayers/commit/a6f89be181b7bd664eaf96cb9509bbc5adf5dbb9))
+
+### Migration instructions
+
+| Before | After |
+|---|---|
+| deprecated `AudioPlayer.global.changeLogLevel(LogLevel.info)` | `AudioLogger.logLevel = AudioLogLevel.info` |
+| deprecated `AudioPlayer.global.logLevel` | `AudioLogger.logLevel` |
+| deprecated `AudioPlayer.global.log()` | `AudioLogger.log()` or `AudioLogger.error()` |
+| deprecated `AudioPlayer.global.info()` | `AudioLogger.log()` |
+| deprecated `AudioPlayer.global.error()` | `AudioLogger.error()` |
+| `GlobalPlatformInterface` | `GlobalAudioScope` |
+| deprecated `AudioPlayer.global.setGlobalAudioContext()` | `AudioPlayer.global.setAudioContext()` |
+| `ForPlayer<>` | _removed_ |
+
+## 3.0.1
+
+ - Update a dependency to the latest release.
+
+## 3.0.0
+
+> Note: This release has breaking changes.
+
+ - **FEAT**: add and remove player actions ([#1394](https://github.com/bluefireteam/audioplayers/issues/1394)). ([f06cab91](https://github.com/bluefireteam/audioplayers/commit/f06cab91fbae65d7fdc9e3fbd75171b391ac0b96))
+ - **FEAT**: example improvements ([#1392](https://github.com/bluefireteam/audioplayers/issues/1392)). ([002e2fc9](https://github.com/bluefireteam/audioplayers/commit/002e2fc950145e3231ab79a5ef399024d62f6fb1))
+ - **BREAKING** **REFACTOR**: rename logger_platform_interface.dart to global_platform_interface.dart ([#1385](https://github.com/bluefireteam/audioplayers/issues/1385)). ([6e837c1c](https://github.com/bluefireteam/audioplayers/commit/6e837c1ccd93b95d10843a403674128cf303c0ab))
+ - **BREAKING** **FEAT**: configurable SoundPool and `AudioManager.mode` ([#1388](https://github.com/bluefireteam/audioplayers/issues/1388)). ([5697f187](https://github.com/bluefireteam/audioplayers/commit/5697f187bcca64de2e519f8f49aaf4817fcf6398))
+
+## 2.0.0
+
+> Note: This release has breaking changes.
+
+ - **BREAKING** **FIX**: remove unused `defaultToSpeaker` in `AudioContextIOS` and replace with `AVAudioSessionOptions.defaultToSpeaker` ([#1374](https://github.com/bluefireteam/audioplayers/issues/1374)). ([d844ef9d](https://github.com/bluefireteam/audioplayers/commit/d844ef9def06fd5047076d9f4c371ad3be4c8dd5))
+
+## 1.2.0
+
+> Note: This release has breaking changes.
+
+ - **FIX**: Duration precision on Windows ([#1342](https://github.com/bluefireteam/audioplayers/issues/1342)). ([3cda1a65](https://github.com/bluefireteam/audioplayers/commit/3cda1a65dc0425c332ed2eb3619cd88531f0ea49))
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+ - **FEAT**: upgrade flutter to v3.0.0 and dart 2.17 to support "Super initializers" ([#1355](https://github.com/bluefireteam/audioplayers/issues/1355)). ([4af417b4](https://github.com/bluefireteam/audioplayers/commit/4af417b4c91ed5c22d6c48e05080c3018ccaee42))
+ - **FEAT**: local test server ([#1354](https://github.com/bluefireteam/audioplayers/issues/1354)). ([06be429a](https://github.com/bluefireteam/audioplayers/commit/06be429a0078456a989b9afc3abc68164c4abaab))
+ - **FEAT**: get current source ([#1350](https://github.com/bluefireteam/audioplayers/issues/1350)). ([7a10be38](https://github.com/bluefireteam/audioplayers/commit/7a10be38ec6613c8ef45bb33d1e81f11bb5988f9))
+ - **FEAT**: log path and url of sources ([#1334](https://github.com/bluefireteam/audioplayers/issues/1334)). ([8a13f96d](https://github.com/bluefireteam/audioplayers/commit/8a13f96dbb14be0d1d80577816246109c42b7983))
+ - **FEAT**: add setBalance ([#58](https://github.com/bluefireteam/audioplayers/issues/58)) ([#1282](https://github.com/bluefireteam/audioplayers/issues/1282)). ([782fc9df](https://github.com/bluefireteam/audioplayers/commit/782fc9dff24a2ab9681496fd7c4c8fed451eac35))
+ - **DOCS**: Fix repos and homepages on pubspecs ([#1349](https://github.com/bluefireteam/audioplayers/issues/1349)). ([0bdde4d9](https://github.com/bluefireteam/audioplayers/commit/0bdde4d9f8f62487cdcfe96221216eba03b31060))
+ - **BREAKING** **FIX**: Cache should take key to be properly cleared ([#1347](https://github.com/bluefireteam/audioplayers/issues/1347)). ([1a410bba](https://github.com/bluefireteam/audioplayers/commit/1a410bba578af506637b026bb2c4ace03a161a69))
+
+## 1.1.1
+
+ - **FIX**: infinity / nan on getDuration ([#1298](https://github.com/bluefireteam/audioplayers/issues/1298)). ([a4474dcf](https://github.com/bluefireteam/audioplayers/commit/a4474dcf5e14fbd74db8b4f19223b9bfa40ed5f5))
+
+## 1.1.0
+
+ - **FIX**: player state not being updated to completed (#1257). ([70a37afb](https://github.com/bluefireteam/audioplayers/commit/70a37afb6ce4fbb8b8c680ca9b6804b005012446))
+ - **FIX**: lowLatency bugs (closes #1176, closes #1193, closes #1165) (#1272). ([541578cc](https://github.com/bluefireteam/audioplayers/commit/541578cc50f3856c23c393faa1a71380b3b49222))
+ - **FIX**: ios/macos no longer start audio when calling only setSourceUrl (#1206). ([c0e97f04](https://github.com/bluefireteam/audioplayers/commit/c0e97f04fb05fb109830d6363f5c44dccbd327b4))
+ - **FEAT**: improve example (#1267). ([a8154da1](https://github.com/bluefireteam/audioplayers/commit/a8154da1cc6fdec80d80fa538d65cb491a33db78))
+ - **FEAT**: Platform integration tests 🤖 (#1128). ([b0c84aab](https://github.com/bluefireteam/audioplayers/commit/b0c84aabea8af28f693941c1b3bf2b1fa1048833))
+ - **DOCS**: Remove 11-month old outdated doc file (#1180). ([bae43cb1](https://github.com/bluefireteam/audioplayers/commit/bae43cb10a27eff23ebaf2a6ac796fd61039f359))
+
+## 1.0.1
+
+ - **FIX**: Make sure onComplete resets the position even when not looping (#1175). ([6e6005ac](https://github.com/bluefireteam/audioplayers/commit/6e6005ac98765aeeea62208b58a6cc6d0cb4b084))
+
+## 1.0.0
+
+ - **FEAT**: Upgrade flame lint dependency (#1132). ([0d6dae3e](https://github.com/bluefireteam/audioplayers/commit/0d6dae3efc4a73abeb554fd0862d64fda0269066))
+
+## 1.0.0-rc.4
+
+ - Update a dependency to the latest release.
+
+## 1.0.0-rc.3
+
+ - **FIX**: Volume and rate can be set before audio playing on iOS (#1113). ([eca1dd0e](https://github.com/bluefireteam/audioplayers/commit/eca1dd0e85abd72dc6c17bd2b7a24912664b98a5))
+ - **FEAT**: Linux platform support (closes #798) (#1110). ([74616c54](https://github.com/bluefireteam/audioplayers/commit/74616c5471fb942d8f08c41de50c93d4387f8916))
+
+## 1.0.0-rc.2
+
+ - Bump "audioplayers" to `1.0.0-rc.2`.
+
+## 1.0.0-rc.1
+
+ - First release after federation
+
# Changelog
## 0.20.2
diff --git a/packages/audioplayers/LICENSE b/packages/audioplayers/LICENSE
deleted file mode 120000
index 30cff7403..000000000
--- a/packages/audioplayers/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-../../LICENSE
\ No newline at end of file
diff --git a/packages/audioplayers/LICENSE b/packages/audioplayers/LICENSE
new file mode 100644
index 000000000..1a581b05c
--- /dev/null
+++ b/packages/audioplayers/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Blue Fire
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/audioplayers/README.md b/packages/audioplayers/README.md
deleted file mode 120000
index fe8400541..000000000
--- a/packages/audioplayers/README.md
+++ /dev/null
@@ -1 +0,0 @@
-../../README.md
\ No newline at end of file
diff --git a/packages/audioplayers/README.md b/packages/audioplayers/README.md
new file mode 100644
index 000000000..5442eb511
--- /dev/null
+++ b/packages/audioplayers/README.md
@@ -0,0 +1,105 @@
+