[
  {
    "path": ".firebaserc",
    "content": "{\n  \"projects\": {\n    \"default\": \"mightier-amp\"\n  },\n  \"targets\": {\n    \"mightieramp\": {\n      \"hosting\": {\n        \"mightieramp\": [\n          \"mightieramp\"\n        ]\n      }\n    },\n    \"mightier-amp\": {\n      \"hosting\": {\n        \"mightieramp\": [\n          \"mightieramp\"\n        ]\n      }\n    }\n  },\n  \"etags\": {}\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: tuntori\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: [\"https://www.paypal.com/donate?hosted_button_id=FZWWAM4NUFRPC\"]\n"
  },
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\njust_audio/\n\n#ignore sign key\n/android/key.properties\n\n#ignore api keys and similar\n/lib/configKeys.dart\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Web related\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n.firebase/\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled.\n\nversion:\n  revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n  channel: stable\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n      base_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n    - platform: linux\n      create_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n      base_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Mightier Amp\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"program\": \"lib/main.dart\"\n        },\n        {\n            \"name\": \"Mightier Amp Profile\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"program\": \"lib/main.dart\",\n            \"flutterMode\": \"profile\"\n        }\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"cmake.configureOnOpen\": false,\n}   "
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2020-2021 Dian Iliev (Tuntorius)\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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."
  },
  {
    "path": "PRIVACY_POLICY.md",
    "content": "# Privacy Policy\n\nI (Diyan Iliev) built the Mightier Amp app as an Open Source app. This SERVICE is provided by me at no cost and is intended for use as is.\n\nThis page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.\n\nIf you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.\n\nThe terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Mightier Amp unless otherwise defined in this Privacy Policy.\n## Data Collection\nMightier Amp app does not collect any personal data from its users. \n## Third-Party Services\nMightier Amp does not use third-party data collection services. \n## Contact Us\nIf you have any questions or concerns about our privacy practices, please contact us at mightieramp@gmail.com.\n## Changes to This Policy\nI may update this Privacy Policy from time to time. If I make any material changes to how the data is collected, used, or shared, I will reflect the changes on this page.\n"
  },
  {
    "path": "README.md",
    "content": "# Mightier Amp\nAlternative app for controlling NUX Mighty amps series.\n\n## Features\nThis app aims to cover all the functionality of the original app plus many enhancements:\n- Ability to save presets locally on your mobile device and export them to share with others.\n- Remote control using a MIDI controller or a HID device. Both USB and Bluetooth MIDI controllers are supported.\n- Landscape mode.\n- Improved Jam Tracks functionality. Select any audio file in your device, add events like loop points, preset changes and others at any point and play along.\n- The app unlocks 8 secret amp models in Mighty Plug Pro and Mighty Space: Twin Rvb, Class A15, Vibro King, Budda, Brit Blues, Match D30, Brit 2000 and Uber HiGain\n- Tempo/Beat Trainer\n- Various other enhancements.\n\n## Supported Amps\n\n1.Mighty Plug / Mighty Air  \n2.Mighty Plug Pro / Mighty Space  \n3.Mighty Lite BT MKII  \n4.Mighty 8 BT\\*\\*  \n5.Mighty 20 BT \\*\\* / Mighty 40 BT \\*\\*\n6.Mighty BT Lite / AirBorne Go\\*\\* / GUO AN\\*\\*  \n\n\\*\\* These amps are not tested and might not work.  \n\n## Helpful Resources\nCheck out the great video tutorial series created by Diego Zuccotti, where he walks through the features and functionality of the app, and the usage of the NUX amps in general.  \n[Click here to watch!](https://www.youtube.com/@TutoJam)\n\nFacebook groups for presets sharing and amps discussion:  \n[Mighty Plug/Mighty Air](https://www.facebook.com/groups/nuxmightyplugairgroup/)  \n[Mighty Plug Pro/Mighty Space](https://www.facebook.com/groups/mightyplugpro/)  \n\n## Download\n\n[<img src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\"\n     alt=\"Get it on Google Play\"\n     height=\"80\">](https://play.google.com/store/apps/details?id=com.tuntori.mightieramp)\n[<img src=\"docs/ios_web_generic.png\"\n     alt=\"Get it on Google Play\"\n     height=\"82\">](https://apps.apple.com/us/app/mightier-amp/id6447451371)\n[<img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\"\n     alt=\"Get it on F-Droid\"\n     height=\"80\">](https://f-droid.org/packages/com.tuntori.mightieramp/)\n\n## Donation\nMightier Amp is an open-source project that I am developing in my free time. If you find the app useful and would like to support its development, please consider making a donation. Your contribution will help me invest more time into the development of the app. Thank you for your support!\n\n<a href='https://ko-fi.com/tuntori' target='_blank'><img height='35' style='border:0px;height:46px;' src='https://az743702.vo.msecnd.net/cdn/kofi3.png?v=0' border='0' alt='Buy Me a Coffee at ko-fi.com' />\n&nbsp;&nbsp;[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate?hosted_button_id=FZWWAM4NUFRPC)  \n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    compileSdkVersion 34\n    \n    namespace 'com.tuntori.mightieramp'\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        applicationId \"com.tuntori.mightieramp\"\n        minSdkVersion flutter.minSdkVersion\n        targetSdkVersion 34\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        multiDexEnabled true\n    }\n    signingConfigs {\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n    buildTypes {\n        \n        debug {\n            defaultConfig.minSdkVersion 19\n            applicationIdSuffix \".debug\"\n        }\n        profile {\n            defaultConfig.minSdkVersion 19\n            applicationIdSuffix \".debug\"\n        }\n        release {\n            signingConfig signingConfigs.release\n            minifyEnabled true\n            shrinkResources true\n            ndk {\n                abiFilters 'armeabi-v7a', 'x86_64', 'arm64-v8a'\n            }\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.multidex:multidex:2.0.1'\n}\n"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "content": "-keep class androidx.lifecycle.** { *; }\n-keep class com.boskokg.flutter_blue_plus.** { *; }"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.tuntori.mightieramp\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/debug/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">Mightier Amp Debug</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.tuntori.mightieramp\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- FlutterActivity is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    \n    <uses-feature android:name=\"android.hardware.bluetooth_le\" android:required=\"true\"/>\n\n    <uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" android:usesPermissionFlags=\"neverForLocation\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \n      android:maxSdkVersion=\"30\"/>\n    <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\"\n      android:minSdkVersion=\"33\"/>\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <application\n        android:label=\"@string/app_name\"\n        android:icon=\"@mipmap/launcher_icon\"\n        android:allowBackup=\"true\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:usesCleartextTraffic=\"true\"\n            android:exported=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <!-- Displays an Android View that continues showing the launch screen\n                 Drawable until Flutter paints its first frame, then this splash\n                 screen fades out. A splash screen is useful to avoid any visual\n                 gap between the end of Android's launch screen and the painting of\n                 Flutter's first frame. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.SplashScreenDrawable\"\n              android:resource=\"@drawable/launch_background\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n\n        \n    </application>\n    <queries>\n      <!-- If your app opens https URLs -->\n      <intent>\n        <action android:name=\"android.intent.action.VIEW\" />\n        <data android:scheme=\"https\" />\n      </intent>\n      <intent>\n        <action android:name=\"android.intent.action.VIEW\" />\n        <data android:scheme=\"http\" />\n      </intent>\n    </queries>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/com/tuntori/mightieramp/MainActivity.kt",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\npackage com.tuntori.mightieramp\n\nimport androidx.annotation.NonNull\nimport io.flutter.embedding.android.FlutterActivity\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugins.GeneratedPluginRegistrant\nimport io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry\n\nimport io.flutter.view.FlutterMain\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler\nimport io.flutter.plugin.common.MethodChannel.Result\n\nimport android.content.Intent\nimport android.app.Activity\nimport android.net.Uri\n\nimport java.io.BufferedWriter\nimport java.io.OutputStream\nimport java.io.OutputStreamWriter\n\nimport java.io.BufferedReader\nimport java.io.InputStream\nimport java.io.InputStreamReader\nimport java.io.DataOutputStream\n\nimport java.nio.ShortBuffer\n\nclass MainActivity: FlutterActivity() {\n    \n    internal var WRITE_REQUEST_CODE = 77777 //unique request code\n    internal var OPEN_REQUEST_CODE = 22222\n    internal var OPEN_REQUEST_CODE_BYTEARRAY = 33333\n    internal var _result: Result? = null\n    internal var _data: String = \"\"\n    internal var _dataBa: ByteArray? = null\n    internal var saveByteArray:Boolean = false \n\n    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {\n        GeneratedPluginRegistrant.registerWith(flutterEngine);\n\n        configureFileSaveAPI(flutterEngine);\n    }\n\n\n    fun configureFileSaveAPI(@NonNull flutterEngine: FlutterEngine)\n    {\n        MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), \"com.msvcode.filesaver/files\")\n        .setMethodCallHandler { call, result ->\n            // Note: this method is invoked on the main thread.\n            if (call.method == \"saveFile\") {\n                _result = result\n                saveByteArray = call.argument<Boolean?>(\"byteArray\") ?: false;\n                if (saveByteArray)\n                    _dataBa =call.argument<ByteArray>(\"data\")\n                else\n                    _data = call.argument<String>(\"data\") ?: \"\";\n                var mime:String? = call.argument<String?>(\"mime\");\n                var name:String? = call.argument<String?>(\"name\");\n                if (mime!=null && name!=null)\n                    createFile(mime, name)\n            } else if (call.method == \"openFile\") {\n                _result = result\n                var mime:String? = call.argument<String?>(\"mime\");\n                var byteArray:Boolean? = call.argument<Boolean?>(\"byte_array\");\n                if (mime!=null)\n                    openFile(mime, byteArray)\n            } else {\n                result.notImplemented()\n            }\n        }\n    }\n\n    private fun createFile(mimeType: String, fileName: String) {\n        val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {\n            // Filter to only show results that can be \"opened\", such as\n            // a file (as opposed to a list of contacts or timezones).\n            addCategory(Intent.CATEGORY_OPENABLE)\n\n            // Create a file with the requested MIME type.\n            type = mimeType\n            putExtra(Intent.EXTRA_TITLE, fileName)\n        }\n\n        startActivityForResult(intent, WRITE_REQUEST_CODE)\n    }\n\n    //replace with ACTION_GET_CONTENT for just a temporary access\n    //the other is ACTION_OPEN_DOCUMENT\n    private fun openFile(mimeType: String, byteArray: Boolean?) {\n        val intent = Intent(Intent.ACTION_GET_CONTENT).apply {\n            // Filter to only show results that can be \"opened\", such as\n            // a file (as opposed to a list of contacts or timezones).\n            addCategory(Intent.CATEGORY_OPENABLE)\n\n            // Create a file with the requested MIME type.\n            type = mimeType\n        }\n        if (byteArray != null && byteArray == true)\n            startActivityForResult(intent, OPEN_REQUEST_CODE_BYTEARRAY)\n        else\n            startActivityForResult(intent, OPEN_REQUEST_CODE)\n    }\n\n  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    \n    // Check which request we're responding to\n    if (requestCode == WRITE_REQUEST_CODE) {\n        // Make sure the request was successful\n        if (resultCode == Activity.RESULT_OK) {\n          if (data != null && data.getData() != null) {\n            //now write the data\n            writeInFile(data.getData() as Uri) //data.getData() is Uri\n          } else {\n            _result?.error(\"NO DATA\", \"No data\", null)\n          }\n        } else {\n          _result?.error(\"CANCELED\", \"User cancelled\", null)\n        }\n    }\n    else if (requestCode == OPEN_REQUEST_CODE || \n        requestCode == OPEN_REQUEST_CODE_BYTEARRAY) {\n        if (resultCode == Activity.RESULT_OK) {\n            if (data != null && data.getData() != null) {\n                //now write the data\n                if (requestCode == OPEN_REQUEST_CODE)\n                    readFile(data.getData() as Uri, false)\n                else\n                    readFile(data.getData() as Uri, true)\n            }else {\n                _result?.error(\"NO DATA\", \"No data\", null)\n            }\n        } else {\n            _result?.error(\"CANCELED\", \"User cancelled\", null)\n        }\n    }\n  }\n\n  private fun writeInFile(uri: Uri) {\n    val outputStream: OutputStream?\n    try {\n      outputStream = getContentResolver().openOutputStream(uri);\n      if (outputStream!=null) {\n        if (saveByteArray && _dataBa!=null) {\n            outputStream.write(_dataBa);\n            outputStream.close();\n        }\n        else {\n            outputStream.write(_data.toByteArray(Charsets.UTF_8));\n            outputStream.close();\n        }\n            \n        _result?.success(\"SUCCESS\");\n        }\n        else\n            _result?.error(\"ERROR\", \"writeInFile: Output stream is null\", null)\n    } catch (e:Exception){\n        _result?.error(\"ERROR\", \"Unable to write. Exception: $e\", null)\n        e.printStackTrace()\n    }\n  }\n\n  private fun readFile(uri: Uri, dataArray: Boolean) {\n      val inputStream: InputStream?\n      val inputStreamReader: InputStreamReader\n      try {\n            inputStream = getContentResolver().openInputStream(uri)\n            inputStreamReader = InputStreamReader(inputStream)\n            if (!dataArray) {\n                val br = BufferedReader(inputStreamReader)\n                val fileContent = br.use { inputStreamReader.readText() }\n                br.close()\n                _result?.success(fileContent)\n            }\n            else {\n                if (inputStream!=null) {\n                    val array = inputStream.readBytes();\n                    inputStream.close();\n                    _result?.success(array)\n                }\n            }\n      } catch (e:Exception){\n      _result?.error(\"ERROR\", \"Unable to read\", null)\n    }\n  }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/black\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <background android:drawable=\"@color/ic_launcher_background\"/>\n  <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>\n"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#ffffff</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">Mightier Amp</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n         \n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">@android:color/white</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.tuntori.mightieramp\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.8.22'\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:8.0.2'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    gradle.projectsEvaluated {\n        tasks.withType(JavaCompile) {\n            options.compilerArgs << \"-Xlint:deprecation\"\n        }\n    }   \n}\n\nrootProject.buildDir = '../build'\n\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.enableR8=true\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.java.home=C:/AndroidSDK/jdk-17.0.9"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Properties()\n\nassert localPropertiesFile.exists()\nlocalPropertiesFile.withReader(\"UTF-8\") { reader -> properties.load(reader) }\n\ndef flutterSdkPath = properties.getProperty(\"flutter.sdk\")\nassert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\napply from: \"$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle\"\n"
  },
  {
    "path": "android/settings_aar.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "An alternative app for controlling NUX Mighty series guitar amplifiers\n\nThis app aims to cover all of the functionality the original app offers plus many enhancements:\n\n• All amps and effects are enabled for all channels.\n• Ability to save and recall hundreds of presets locally on your mobile device.\n• Improved Jam Tracks functionality. Select any audio file in your device, add preset change events at any point and play along.\n\nThe app is open-source. Full code available at https://github.com/tuntorius/mightier_amp\n\n\n\n\"NUX\" and the \"Mighty\" amps series are a trademark of CHERUB TECHNOLOGY COMPANY LIMITED.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "An alternative app for controlling NUX Mighty amps series.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "Mightier Amp"
  },
  {
    "path": "firebase.json",
    "content": "{\n  \"hosting\": {\n    \"public\": \"/build/web/\",\n    \"ignore\": [\n      \"firebase.json\",\n      \"**/.*\",\n      \"**/node_modules/**\"\n    ],\n    \"rewrites\": [\n      {\n        \"source\": \"**\",\n        \"destination\": \"/index.html\"\n      }\n    ],\n    \"domain\": \"mightieramp.web.app\",\n    \"site\":\"mightieramp\"\n  }\n}\n"
  },
  {
    "path": "ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>$(DEVELOPMENT_LANGUAGE)</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>11.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '12.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n\n    # Disable the NSMicrophoneUsageDescription requirement\n    target.build_configurations.each do |config|\n      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n        '$(inherited)',\n        'AUDIO_SESSION_MICROPHONE=0'\n      ]\n    end\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Icon_20x20@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon_20x20@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon_29x29@1x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon_29x29@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon_29x29@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon_40x40@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon_40x40@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon_60x60@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon_60x60@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon_20x20@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon_20x20@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon_29x29@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon_29x29@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon_40x40@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon_40x40@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon_76x76@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon_76x76@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon_83.5x83.5@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"filename\" : \"Icon_1024x1024.png\",\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>JSON Document</string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>public.json</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeExtensions</key>\n\t\t\t<array>\n\t\t\t\t<string>nuxpreset</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>NUX Preset</string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>com.tuntori.nuxpreset</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Mightier Amp</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>ITSAppUsesNonExemptEncryption</key>\n\t<false/>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>LSSupportsOpeningDocumentsInPlace</key>\n\t<true/>\n\t<key>NSAppleMusicUsageDescription</key>\n\t<string>The app uses music as backing tracks that are streamed to the connected guitar amplifier</string>\n\t<key>NSBluetoothAlwaysUsageDescription</key>\n\t<string>Bluetooth Low Energy is used to connect to a BLE enabled guitar amplifier</string>\n\t<key>NSBluetoothPeripheralUsageDescription</key>\n\t<string>Bluetooth Low Energy is used to connect to a BLE enabled guitar amplifier</string>\n\t<key>NSCameraUsageDescription</key>\n\t<string>This app uses camera to scan QR codes that contain preset data for the connected amplifier</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>This app lets you scan a photo containing QR code with amp preset data.</string>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UIBackgroundModes</key>\n\t<array>\n\t\t<string>audio</string>\n\t\t<string>bluetooth-central</string>\n\t</array>\n\t<key>UIFileSharingEnabled</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>UTImportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<array>\n\t\t\t\t<string>public.json</string>\n\t\t\t</array>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>NUX Preset</string>\n\t\t\t<key>UTTypeIconFiles</key>\n\t\t\t<array/>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>com.tuntori.nuxpreset</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>nuxpreset</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t84C82414292992D6001A7DDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCC37E5B2EA4022EAC7C519F /* Pods_Runner.framework */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t130F32F4717A7AF5D4F6585E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t97D11407EEF2CD9B9EB7F3BF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tCCC37E5B2EA4022EAC7C519F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF37F8A97064DC522B40DF3A2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t84C82414292992D6001A7DDC /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t07C65F7300B0E156A019970F /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t130F32F4717A7AF5D4F6585E /* Pods-Runner.debug.xcconfig */,\n\t\t\t\tF37F8A97064DC522B40DF3A2 /* Pods-Runner.release.xcconfig */,\n\t\t\t\t97D11407EEF2CD9B9EB7F3BF /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t65DA474ACEE31D5FA261D7E3 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCCC37E5B2EA4022EAC7C519F /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\t07C65F7300B0E156A019970F /* Pods */,\n\t\t\t\t65DA474ACEE31D5FA261D7E3 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t71EB3D73602EF3E01C2EC6E4 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\tC57858137186C0D10D48D7B8 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\",\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t71EB3D73602EF3E01C2EC6E4 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n\t\tC57858137186C0D10D48D7B8 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB31CF90195004384FC /* Generated.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 97D11407EEF2CD9B9EB7F3BF /* Pods-Runner.profile.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = BRTQKAVFDX;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Mightier Amp\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.music\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = \"$(FLUTTER_BUILD_NAME)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.tuntori.mightieramp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB31CF90195004384FC /* Generated.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB31CF90195004384FC /* Generated.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 130F32F4717A7AF5D4F6585E /* Pods-Runner.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = BRTQKAVFDX;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Mightier Amp\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.music\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = \"$(FLUTTER_BUILD_NAME)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.tuntori.mightieramp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = F37F8A97064DC522B40DF3A2 /* Pods-Runner.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = BRTQKAVFDX;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"Mightier Amp\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.music\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = \"$(FLUTTER_BUILD_NAME)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.tuntori.mightieramp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lib/UI/mainTabs.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:mighty_plug_manager/UI/pages/drumsPage.dart';\nimport 'package:mighty_plug_manager/UI/utils.dart';\nimport 'package:mighty_plug_manager/UI/widgets/NuxAppBar.dart';\n\nimport '../bluetooth/NuxDeviceControl.dart';\nimport '../bluetooth/bleMidiHandler.dart';\nimport '../bluetooth/ble_controllers/BLEController.dart';\nimport '../main.dart';\nimport '../midi/MidiControllerManager.dart';\nimport '../platform/platformUtils.dart';\nimport 'pages/jamTracks.dart';\nimport 'pages/presetEditor.dart';\nimport 'pages/settings.dart';\nimport 'popups/alertDialogs.dart';\nimport 'theme.dart';\nimport 'widgets/VolumeDrawer.dart';\nimport 'widgets/app_drawer.dart';\nimport 'widgets/bottomBar.dart';\nimport 'widgets/common/nestedWillPopScope.dart';\nimport 'widgets/presets/preset_list/presetList.dart';\n\nclass MainTabs extends StatefulWidget {\n  final MidiControllerManager midiMan = MidiControllerManager();\n\n  MainTabs({Key? key}) : super(key: key);\n\n  @override\n  State<MainTabs> createState() => MainTabsState();\n}\n\nclass MainTabsState extends State<MainTabs> with TickerProviderStateMixin {\n  int _currentIndex = 0;\n  late BuildContext dialogContext;\n  late TabController controller;\n  late TabVisibilityController _visibilityController;\n  late final List<Widget> _tabs;\n\n  bool isBottomDrawerOpen = false;\n\n  bool connectionFailed = false;\n  late Timer _timeout;\n  StateSetter? dialogSetState;\n\n  @override\n  void initState() {\n    if (!AppThemeConfig.allowRotation) {\n      SystemChrome.setPreferredOrientations(\n          [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);\n    } else {\n      SystemChrome.setPreferredOrientations([\n        DeviceOrientation.portraitUp,\n        DeviceOrientation.portraitDown,\n        DeviceOrientation.landscapeLeft,\n        DeviceOrientation.landscapeRight\n      ]);\n    }\n\n    super.initState();\n\n    _visibilityController = TabVisibilityController(5);\n\n    //add 5 pages widgets\n    _tabs = [\n      const PresetEditor(),\n      PresetList(\n          visibilityEventHandler: _visibilityController.getEventHandler(1)),\n      const DrumsPage(),\n      const JamTracks(),\n      const Settings(),\n    ];\n\n    controller =\n        TabController(initialIndex: 0, length: _tabs.length, vsync: this);\n\n    // controller.addListener(() {\n    //   setState(() {\n    //     _visibilityController.onTabChanged(_currentIndex, controller.index);\n    //     _currentIndex = controller.index;\n    //   });\n    // });\n\n    NuxDeviceControl.instance().connectStatus.listen(connectionStateListener);\n    NuxDeviceControl.instance().addListener(onDeviceChanged);\n\n    BLEMidiHandler.instance().initBle(bleErrorHandler);\n  }\n\n  void bleErrorHandler(BleError error, dynamic data) {\n    {\n      switch (error) {\n        case BleError.unavailable:\n          if (!PlatformUtils.isIOS) {\n            AlertDialogs.showInfoDialog(context,\n                title: \"Warning!\",\n                description: \"Your device does not support bluetooth!\",\n                confirmButton: \"OK\");\n          }\n          break;\n        case BleError.permissionDenied:\n          AlertDialogs.showLocationPrompt(context, false, null);\n          break;\n        case BleError.locationServiceOff:\n          AlertDialogs.showInfoDialog(context,\n              title: \"Location service is disabled!\",\n              description:\n                  \"Please, enable location service. It is required for Bluetooth connection to work.\",\n              confirmButton: \"OK\");\n          break;\n        case BleError.scanPermissionDenied:\n          AlertDialogs.showInfoDialog(context,\n              title: \"Bluetooth permissions required!\",\n              description:\n                  \"Please, grant bluetooth scan and connect permissions. They are required for Mightier Amp to work.\",\n              confirmButton: \"OK\");\n          break;\n      }\n    }\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    NuxDeviceControl.instance().removeListener(onDeviceChanged);\n  }\n\n  void onConnectionTimeout() async {\n    connectionFailed = true;\n    if (dialogSetState != null) {\n      dialogSetState?.call(() {});\n      await Future.delayed(const Duration(seconds: 3));\n      Navigator.pop(context);\n      dialogSetState = null;\n      BLEMidiHandler.instance().disconnectDevice();\n    }\n  }\n\n  void connectionStateListener(DeviceConnectionState event) {\n    switch (event) {\n      case DeviceConnectionState.connectionBegin:\n        if (dialogSetState != null) break;\n        connectionFailed = false;\n        showDialog(\n          context: context,\n          barrierDismissible: false,\n          builder: (BuildContext context) {\n            dialogContext = context;\n            return StatefulBuilder(\n              builder: (BuildContext context, StateSetter setState) {\n                dialogSetState = setState;\n                return NestedWillPopScope(\n                  onWillPop: () => Future.value(false),\n                  child: Dialog(\n                    backgroundColor: Colors.grey[700],\n                    child: Padding(\n                      padding: const EdgeInsets.all(16.0),\n                      child: Row(\n                        mainAxisSize: MainAxisSize.min,\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: [\n                          if (!connectionFailed)\n                            const CircularProgressIndicator.adaptive(),\n                          if (connectionFailed)\n                            const Icon(\n                              Icons.error,\n                              color: Colors.red,\n                            ),\n                          const SizedBox(\n                            width: 8,\n                          ),\n                          Text(connectionFailed\n                              ? \"Connection Failed!\"\n                              : \"Connecting\"),\n                        ],\n                      ),\n                    ),\n                  ),\n                );\n              },\n            );\n          },\n        );\n\n        //setup a timer in case something fails\n        _timeout = Timer(const Duration(seconds: 10), onConnectionTimeout);\n\n        break;\n      case DeviceConnectionState.presetsLoaded:\n        //if the device is connected in this step, then it's\n        //just a reset, not connect\n        if (NuxDeviceControl.instance().isConnectionComplete()) {\n          dialogSetState = null;\n          if (_timeout.isActive) {\n            _timeout.cancel();\n            Navigator.pop(context);\n          }\n        }\n        debugPrint(\"presets loaded\");\n        break;\n      case DeviceConnectionState.connectionComplete:\n        dialogSetState = null;\n        if (_timeout.isActive) {\n          _timeout.cancel();\n          Navigator.pop(context);\n        }\n        break;\n      case DeviceConnectionState.disconnected:\n        break;\n    }\n  }\n\n  Future<bool> _willPopCallback() async {\n    Completer<bool> confirmation = Completer<bool>();\n    AlertDialogs.showConfirmDialog(context,\n        title: \"Exit Mightier Amp?\",\n        cancelButton: \"No\",\n        confirmButton: \"Yes\",\n        confirmColor: Colors.red,\n        description: \"Are you sure?\", onConfirm: (val) {\n      if (val) {\n        //disconnect device if connected\n        BLEMidiHandler.instance().disconnectDevice();\n      }\n      confirmation.complete(val);\n    });\n    return confirmation.future;\n  }\n\n  void onDeviceChanged() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final mediaQuery = MediaQuery.of(context);\n    final screenWidth = mediaQuery.size.width;\n    final layoutMode = getLayoutMode(mediaQuery);\n\n    //WARNING: Workaround for a flutter bug - if the app is started with screen off,\n    //one of the widgets throws an exception and the app scaffold is empty\n    if (screenWidth < 10) return const SizedBox();\n    return PageStorage(\n      bucket: bucketGlobal,\n      child: FocusScope(\n        autofocus: true,\n        onKey: (node, event) {\n          if (event.runtimeType.toString() == 'RawKeyDownEvent' &&\n              event.logicalKey.keyId != 0x100001005) {\n            MidiControllerManager().onHIDData(event);\n          }\n          return KeyEventResult.skipRemainingHandlers;\n        },\n        child: NestedWillPopScope(\n          onWillPop: _willPopCallback,\n          child: Scaffold(\n            resizeToAvoidBottomInset: controller.index == 1,\n            appBar: layoutMode != LayoutMode.navBar ? null : const MAAppBar(),\n            body: Stack(\n              alignment: Alignment.bottomCenter,\n              children: [\n                Row(\n                  children: [\n                    if (layoutMode == LayoutMode.drawer)\n                      AppDrawer(\n                        onSwitchPageIndex: _onSwitchPageIndex,\n                        currentIndex: _currentIndex,\n                        totalTabs: _tabs.length,\n                      ),\n                    Expanded(\n                      child: layoutMode == LayoutMode.navBar\n                          ? TabBarView(\n                              physics: const NeverScrollableScrollPhysics(),\n                              controller: controller,\n                              children: _tabs,\n                            )\n                          : _tabs.elementAt(_currentIndex),\n                    ),\n                  ],\n                ),\n                if (layoutMode != LayoutMode.drawer && _currentIndex != 3)\n                  BottomDrawer(\n                    isBottomDrawerOpen: isBottomDrawerOpen,\n                    onExpandChange: (val) => setState(() {\n                      isBottomDrawerOpen = val;\n                    }),\n                    child: VolumeSlider(),\n                  ),\n              ],\n            ),\n            bottomNavigationBar: layoutMode == LayoutMode.navBar\n                ? GestureDetector(\n                    onVerticalDragUpdate: _onBottomBarSwipe,\n                    child: BottomBar(\n                      index: _currentIndex,\n                      onTap: _onSwitchPageIndex,\n                    ),\n                  )\n                : null,\n          ),\n        ),\n      ),\n    );\n  }\n\n  void _onBottomBarSwipe(DragUpdateDetails details) {\n    if (details.delta.dy < 0) {\n      //open\n      setState(() {\n        isBottomDrawerOpen = true;\n      });\n    } else {\n      //close\n      setState(() {\n        isBottomDrawerOpen = false;\n      });\n    }\n  }\n\n  void _onSwitchPageIndex(int index) {\n    setState(() {\n      _visibilityController.onTabChanged(_currentIndex, index);\n      _currentIndex = index;\n      controller.animateTo(_currentIndex);\n    });\n  }\n}\n\nclass TabVisibilityEventHandler {\n  void Function()? onTabSelected;\n  void Function()? onTabDeselected;\n}\n\nclass TabVisibilityController {\n  late List<TabVisibilityEventHandler> eventHandlers;\n  TabVisibilityController(int tabAmount) {\n    eventHandlers =\n        List.generate(tabAmount, (index) => TabVisibilityEventHandler());\n  }\n\n  TabVisibilityEventHandler getEventHandler(int tab) {\n    return eventHandlers[tab];\n  }\n\n  void onTabChanged(int oldTab, int newTab) {\n    eventHandlers[oldTab].onTabDeselected?.call();\n    eventHandlers[newTab].onTabSelected?.call();\n  }\n}\n"
  },
  {
    "path": "lib/UI/mightierIcons.dart",
    "content": "/// Flutter icons MightierIcons\n/// Copyright (C) 2021 by original authors @ fluttericon.com, fontello.com\n/// This font was generated by FlutterIcon.com, which is derived from Fontello.\n///\n/// To use this font, place it in your fonts/ directory and include the\n/// following in your pubspec.yaml\n///\n/// flutter:\n///   fonts:\n///    - family:  MightierIcons\n///      fonts:\n///       - asset: fonts/MightierIcons.ttf\n///\n///\n/// * Font Awesome 5, Copyright (C) 2016 by Dave Gandy\n///         Author:    Dave Gandy\n///         License:   SIL (https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt)\n///         Homepage:  http://fortawesome.github.com/Font-Awesome/\n///\nimport 'package:flutter/widgets.dart';\n\nclass MightierIcons {\n  MightierIcons._();\n\n  static const _kFontFam = 'MightierIcons';\n  static const String? _kFontPkg = null;\n\n  static const IconData tag =\n      IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData amp =\n      IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData cabinet =\n      IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData gate =\n      IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData pedal =\n      IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData sliders =\n      IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData compressor =\n      IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData sinewave =\n      IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData repeat =\n      IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData repeat_a =\n      IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData repeat_ab =\n      IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData tuner =\n      IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n  static const IconData drum =\n      IconData(0xf569, fontFamily: _kFontFam, fontPackage: _kFontPkg);\n}\n"
  },
  {
    "path": "lib/UI/pages/DebugConsolePage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass DebugConsole extends StatelessWidget {\n  static String output = \"\";\n\n  const DebugConsole({Key? key}) : super(key: key);\n\n  static void print(Object? value) {\n    output += \"$value\\n\";\n  }\n\n  static void printHex(List<int> array) {\n    output += '[ ';\n    output += array\n        .map((x) => '${x < 16 ? '0' : ''}${x.toRadixString(16)}')\n        .join(\" \");\n    output += ']\\n';\n  }\n\n  static void printString(Object? value) {\n    output += \"$value\\n\";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    TextEditingController c = TextEditingController(text: DebugConsole.output);\n    return Scaffold(\n      appBar: AppBar(title: const Text(\"Debug console\")),\n      body: SafeArea(\n        child: Column(\n          children: [\n            Expanded(\n              child: TextField(\n                maxLines: null,\n                readOnly: true,\n                controller: c,\n              ),\n            ),\n            Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                ElevatedButton(\n                    onPressed: () {\n                      Clipboard.setData(ClipboardData(text: output));\n                    },\n                    child: const Text(\"Copy to Clipboard\")),\n                const SizedBox(width: 8),\n                ElevatedButton(\n                    onPressed: () {\n                      output = \"\";\n                      c.clear();\n                    },\n                    child: const Text(\"Clear\")),\n              ],\n            )\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/calibration.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:just_audio/just_audio.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport '../../bluetooth/NuxDeviceControl.dart';\nimport '../../bluetooth/devices/presets/preset_constants.dart';\n\nclass Calibration extends StatefulWidget {\n  const Calibration({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _CalibrationState();\n}\n\nclass _CalibrationState extends State<Calibration> {\n  int delay = 0;\n  late AudioPlayer player;\n  int nuxMode = 0;\n  bool toggled = false;\n  Color presetColor = PresetConstants.channelColorsPlug[0];\n  NuxDeviceControl devControl = NuxDeviceControl.instance();\n  StreamSubscription? _playerSub;\n  @override\n  void initState() {\n    super.initState();\n    player = AudioPlayer();\n    player.setAsset(\"assets/audio/calibration.wav\");\n    player.setLoopMode(LoopMode.one);\n    player.play();\n    _playerSub = player\n        .createPositionStream(\n            steps: 99999999,\n            minPeriod: const Duration(milliseconds: 1),\n            maxPeriod: const Duration(milliseconds: 100))\n        .listen(onPositionUpdate);\n    delay = SharedPrefs().getInt(SettingsKeys.latency, 0);\n  }\n\n  void onPositionUpdate(Duration pos) {\n    int posMs = pos.inMilliseconds;\n    if (posMs >= 500 + delay) {\n      if (!toggled) {\n        nuxMode++;\n        if (nuxMode > 2) nuxMode = 0;\n        devControl.changeDeviceChannel(nuxMode);\n\n        setState(() {\n          presetColor = PresetConstants.channelColorsPlug[nuxMode];\n        });\n\n        toggled = true;\n      }\n    } else {\n      toggled = false;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () async {\n        await player.stop();\n        _playerSub?.cancel();\n        await player.dispose();\n\n        //reset to prevent device losing sync\n        NuxDeviceControl.instance().resetToChannelDefaults();\n        return true;\n      },\n      child: Scaffold(\n        appBar: AppBar(\n          title: const Text(\"Latency Calibration\"),\n        ),\n        body: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              const Text(\n                \"Make sure the NUX device is connected in both Audio and App mode!\",\n                textAlign: TextAlign.center,\n              ),\n              const SizedBox(\n                height: 20,\n              ),\n              const Text(\n                \"Adjust the slider so that the NUX light change and the audio clicks happen at the same time.\",\n                textAlign: TextAlign.center,\n              ),\n              // Text(\n              //   \"The app uses this value to apply extra latency to the commands sent to the device\",\n              //   textAlign: TextAlign.center,\n              // ),\n              Slider(\n                value: delay.toDouble(),\n                min: 0,\n                max: 400,\n                label: \"$delay\",\n                divisions: 400,\n                onChanged: (val) {\n                  setState(() {\n                    delay = val.round();\n                  });\n                },\n                onChangeEnd: (val) {\n                  SharedPrefs().setInt(SettingsKeys.latency, val.round());\n                },\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/developerPage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/numberPicker.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\n\nimport '../../bluetooth/devices/NuxConstants.dart';\n\nenum midiMessage { ccMessage, sysExMessage }\n\nclass DeveloperPage extends StatefulWidget {\n  const DeveloperPage({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _DeveloperPageState();\n}\n\nclass _DeveloperPageState extends State<DeveloperPage> {\n  TextEditingController controller = TextEditingController(text: \"\");\n\n  midiMessage msgType = midiMessage.ccMessage;\n  List<int> data = [0, 0, 0, 0];\n\n  bool sliderChanging = false;\n\n  @override\n  void initState() {\n    super.initState();\n    NuxDeviceControl.instance().onDataReceiveDebug = _onDataReceive;\n    NuxDeviceControl.instance().developer = true;\n  }\n\n  void _onDataReceive(List<int> data) {\n    setState(() {\n      controller.text += \"$data\\n\";\n    });\n  }\n\n  Widget _buildCCPage() {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 8.0),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          const Text(\n            \"CC Message\",\n            style: TextStyle(fontSize: 18),\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text(\"CC Number\"),\n              NumberPicker(\n                axis: Axis.horizontal,\n                minValue: 0,\n                maxValue: 127,\n                value: data[0],\n                //hex: true,\n                textStyle: TextStyle(color: Colors.grey[600]),\n                itemWidth: 60,\n                zeroPad: false,\n                onChanged: (val) {\n                  data[0] = val;\n                  setState(() {});\n                },\n              )\n            ],\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text(\"Value (numeric)\"),\n              NumberPicker(\n                axis: Axis.horizontal,\n                minValue: 0,\n                maxValue: 127,\n                value: data[1],\n                textStyle: TextStyle(color: Colors.grey[600]),\n                //hex: true,\n                itemWidth: 60,\n                zeroPad: false,\n                onChanged: (val) {\n                  if (sliderChanging) return;\n                  data[1] = val;\n                  setState(() {});\n                },\n              ),\n            ],\n          ),\n          Slider(\n              min: 0,\n              max: 127,\n              label: \"${data[1]}\",\n              value: data[1].toDouble(),\n              onChangeStart: (value) => sliderChanging = true,\n              onChangeEnd: (value) async {\n                await Future.delayed(const Duration(milliseconds: 800));\n                sliderChanging = false;\n              },\n              onChanged: (value) {\n                data[1] = value.round();\n                setState(() {});\n              }),\n          SwitchListTile(\n              contentPadding: EdgeInsets.zero,\n              title: const Text(\"Value (switch)\"),\n              value: data[1] != 0,\n              onChanged: (value) {\n                data[1] = value ? 127 : 0;\n                setState(() {});\n              }),\n          ElevatedButton(\n              onPressed: () {\n                if (!NuxDeviceControl.instance().isConnected) return;\n                var msg = NuxDeviceControl.instance()\n                    .createCCMessage(data[0], data[1]);\n                BLEMidiHandler.instance().sendData(msg);\n              },\n              child: const Text(\"Send\")),\n          ElevatedButton(\n              onPressed: () {\n                setState(() {\n                  controller.text = \"\";\n                });\n              },\n              child: const Text(\"Clear console\"))\n        ],\n      ),\n    );\n  }\n\n  Widget _buildSysExPage() {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 8.0),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          const Text(\n            \"SysEx Request\",\n            style: TextStyle(fontSize: 18),\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text(\"SysEx number\"),\n              NumberPicker(\n                axis: Axis.horizontal,\n                minValue: 0,\n                maxValue: 127,\n                value: data[2],\n                //hex: true,\n                textStyle: TextStyle(color: Colors.grey[600]),\n                itemWidth: 60,\n                zeroPad: false,\n                onChanged: (val) {\n                  data[2] = val;\n                  setState(() {});\n                },\n              )\n            ],\n          ),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text(\"Additional (-1 - no val)\"),\n              NumberPicker(\n                axis: Axis.horizontal,\n                minValue: -1,\n                maxValue: 127,\n                value: data[3],\n                textStyle: TextStyle(color: Colors.grey[600]),\n                //hex: true,\n                itemWidth: 60,\n                zeroPad: false,\n                onChanged: (val) {\n                  if (sliderChanging) return;\n                  data[3] = val;\n                  setState(() {});\n                },\n              ),\n            ],\n          ),\n          Slider(\n              min: -1,\n              max: 127,\n              label: \"${data[1]}\",\n              value: data[1].toDouble(),\n              onChangeStart: (value) => sliderChanging = true,\n              onChangeEnd: (value) async {\n                await Future.delayed(const Duration(milliseconds: 800));\n                sliderChanging = false;\n              },\n              onChanged: (value) {\n                data[3] = value.round();\n                setState(() {});\n              }),\n          SwitchListTile(\n              contentPadding: EdgeInsets.zero,\n              title: const Text(\"Value (switch)\"),\n              value: data[3] != 0,\n              onChanged: (value) {\n                data[3] = value ? 127 : 0;\n                setState(() {});\n              }),\n          ElevatedButton(\n              onPressed: () {\n                if (!NuxDeviceControl.instance().isConnected) return;\n\n                List<int> msg = [];\n                //create header\n                msg.addAll([\n                  0x80,\n                  0x80,\n                  MidiMessageValues.sysExStart,\n                  0x43,\n                  0x58,\n                  SysexPrivacy.kSYSEX_PRIVATE,\n                  data[2],\n                  SyxDir.kSYXDIR_REQ,\n                ]);\n\n                if (data[3] >= 0) msg.add(data[3]);\n                msg.addAll([0x80, MidiMessageValues.sysExEnd]);\n\n                BLEMidiHandler.instance().sendData(msg);\n              },\n              child: const Text(\"Send\")),\n          ElevatedButton(\n              onPressed: () {\n                setState(() {\n                  controller.text = \"\";\n                });\n              },\n              child: const Text(\"Clear console\"))\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // if (!NuxDeviceControl.instance().isConnected)\n    //   return Center(\n    //     child: Text(\"No device connected\"),\n    //   );\n    return NestedWillPopScope(\n      onWillPop: () {\n        NuxDeviceControl.instance().developer = false;\n        return Future.value(true);\n      },\n      child: Scaffold(\n        body: Column(mainAxisSize: MainAxisSize.min, children: [\n          Expanded(\n            flex: 4,\n            child: AbsorbPointer(\n              absorbing: !NuxDeviceControl.instance().developer,\n              child: Opacity(\n                opacity: NuxDeviceControl.instance().developer ? 1 : 0.5,\n                child: SingleChildScrollView(\n                  child: TextField(\n                    enabled: NuxDeviceControl.instance().developer,\n                    controller: controller,\n                    maxLines: null,\n                    readOnly: true,\n                  ),\n                ),\n              ),\n            ),\n          ),\n          SizedBox(\n              height: 350,\n              child: PageView(\n                children: [_buildCCPage(), _buildSysExPage()],\n              )),\n        ]),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/LiteMk2Settings.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../bluetooth/bleMidiHandler.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../popups/alertDialogs.dart';\nimport 'PlugProUsbSettings.dart';\n\nclass LiteMk2Settings extends StatefulWidget {\n  final NuxDevice device;\n  const LiteMk2Settings({Key? key, required this.device}) : super(key: key);\n\n  @override\n  State<LiteMk2Settings> createState() => _LiteMk2SettingsState();\n}\n\nclass _LiteMk2SettingsState extends State<LiteMk2Settings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.volume_up),\n          title: const Text(\"USB Audio Settings\"),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugProUsbSettings()));\n          },\n        ),\n        /*ListTile(\n          leading: const Icon(Icons.bluetooth_audio),\n          enabled: widget.device.deviceControl.isConnected,\n          title: const Text(\"Bluetooth Audio EQ\"),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugProEQSettings()));\n          },\n        ),*/\n        /*\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.mic),\n          title: const Text(\"Microphone Settings\"),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugProMicSettings()));\n          },\n        ),\n        */\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.restart_alt),\n          title: const Text(\"Reset Device Presets\"),\n          onTap: () {\n            if (BLEMidiHandler.instance().connectedDevice != null) {\n              AlertDialogs.showConfirmDialog(context,\n                  title: \"Reset device presets\",\n                  cancelButton: \"Cancel\",\n                  confirmButton: \"Reset\",\n                  confirmColor: Colors.red,\n                  description: \"Are you sure?\", onConfirm: (val) {\n                if (val) widget.device.resetNuxPresets();\n              });\n            }\n          },\n        ),\n        const Divider()\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/PlugAirSettings.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugAir.dart';\n\nimport '../../../bluetooth/bleMidiHandler.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../popups/alertDialogs.dart';\nimport 'PlugAirUsbSettings.dart';\n\nconst _eqOptions = [\n  \"Normal\",\n  \"Acoustic\",\n  \"Blues\",\n  \"Clean Bass\",\n  \"Guitar Cut\",\n  \"Metal\",\n  \"Pop\",\n  \"Rock\",\n  \"Solo Cut\"\n];\n\nclass PlugAirSettings extends StatefulWidget {\n  final NuxDevice device;\n  const PlugAirSettings({Key? key, required this.device}) : super(key: key);\n\n  @override\n  State<PlugAirSettings> createState() => _PlugAirSettingsState();\n\n  NuxMightyPlug get plugAirDevice => device as NuxMightyPlug;\n}\n\nclass _PlugAirSettingsState extends State<PlugAirSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          title: const Text(\"USB Audio Settings\"),\n          leading: const Icon(Icons.volume_up),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugAirUsbSettings()));\n          },\n        ),\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          title: const Text(\"Bluetooth Audio EQ\"),\n          subtitle: Text(_eqOptions[widget.plugAirDevice.btEq]),\n          leading: const Icon(Icons.bluetooth_audio),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            var oldValue = widget.plugAirDevice.btEq;\n            var dialog = AlertDialogs.showOptionDialog(context,\n                confirmButton: \"OK\",\n                cancelButton: \"Cancel\",\n                title: \"Bluetooth Audio EQ\",\n                confirmColor: Theme.of(context).hintColor,\n                value: widget.plugAirDevice.btEq,\n                options: _eqOptions, onConfirm: (changed, newValue) {\n              setState(() {\n                if (changed) {\n                  widget.plugAirDevice.setBtEq(newValue);\n                } else {\n                  widget.plugAirDevice.setBtEq(oldValue);\n                }\n              });\n            }, onSelectionChanged: (selected) {\n              widget.plugAirDevice.setBtEq(selected);\n            });\n            showDialog(\n              context: context,\n              builder: (BuildContext context) => dialog,\n            );\n          },\n        ),\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.restart_alt),\n          title: const Text(\"Reset Device Presets\"),\n          onTap: () {\n            if (BLEMidiHandler.instance().connectedDevice != null) {\n              AlertDialogs.showConfirmDialog(context,\n                  title: \"Reset device presets\",\n                  cancelButton: \"Cancel\",\n                  confirmButton: \"Reset\",\n                  confirmColor: Colors.red,\n                  description: \"Are you sure?\", onConfirm: (val) {\n                if (val) widget.device.resetNuxPresets();\n              });\n            }\n          },\n        ),\n        SwitchListTile(\n            secondary: const Icon(Icons.eco),\n            title: const Text(\"Eco Mode\"),\n            value: widget.device.ecoMode,\n            onChanged: widget.device.deviceControl.isConnected\n                ? (val) {\n                    setState(\n                      () {\n                        widget.device.setEcoMode(val);\n                      },\n                    );\n                  }\n                : null),\n        const Divider()\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/PlugAirUsbSettings.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/thickSlider.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugAir.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\n\nclass RouteModel {\n  final String name;\n  final int value;\n  final String schemeAsset;\n  const RouteModel(\n      {required this.name, required this.value, required this.schemeAsset});\n}\n\nclass PlugAirUsbSettings extends StatefulWidget {\n  static const List<RouteModel> routes = [\n    RouteModel(\n        name: \"Normal\",\n        value: 1,\n        schemeAsset: \"assets/images/route_normal_mp2.png\"),\n    RouteModel(\n        name: \"Reamp\", value: 0, schemeAsset: \"assets/images/route_reamp.png\"),\n    RouteModel(\n        name: \"Dry Out\",\n        value: 2,\n        schemeAsset: \"assets/images/route_dryout.png\"),\n  ];\n\n  const PlugAirUsbSettings({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _PlugAirUsbSettingsState();\n}\n\nclass _PlugAirUsbSettingsState extends State<PlugAirUsbSettings> {\n  final device = NuxDeviceControl.instance().device as NuxMightyPlug;\n  static const fontSize = TextStyle(fontSize: 20);\n\n  @override\n  void didChangeDependencies() {\n    // Adjust the provider based on the image type\n    for (var route in PlugAirUsbSettings.routes) {\n      precacheImage(AssetImage(route.schemeAsset), context);\n    }\n    super.didChangeDependencies();\n  }\n\n  Widget _modeButton(String mode) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 18),\n      child: Text(mode, style: fontSize),\n    );\n  }\n\n  void _setUsbInputValue(double value, bool skip) {\n    if (skip) {\n      device.config.inputVol = value.round();\n    } else {\n      device.setUsbInputVol(value.round());\n    }\n    setState(() {});\n  }\n\n  void _setUsbOutputValue(double value, bool skip) {\n    if (skip) {\n      device.config.outputVol = value.round();\n    } else {\n      device.setUsbOutputVol(value.round());\n    }\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    const routes = PlugAirUsbSettings.routes;\n    var routeMode = routes.firstWhere((r) => r.value == device.config.usbMode);\n    var arrayIndex = routes.indexOf(routeMode);\n\n    var selected = List<bool>.filled(routes.length, false);\n    selected[arrayIndex] = true;\n\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"USB Audio Settings\"),\n      ),\n      body: SingleChildScrollView(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              const Padding(\n                padding: EdgeInsets.all(16.0),\n                child: Text(\n                  \"Route Mode\",\n                  style: fontSize,\n                ),\n              ),\n              ToggleButtons(\n                fillColor: Colors.blue,\n                selectedBorderColor: Colors.blue,\n                color: Colors.grey,\n                isSelected: selected,\n                onPressed: (index) {\n                  var mode = routes[index];\n                  var value = mode.value;\n                  device.setUsbMode(value);\n                  setState(() {});\n                },\n                children: [\n                  for (var i = 0; i < routes.length; i++)\n                    _modeButton(routes[i].name)\n                ],\n              ),\n              const SizedBox(\n                height: 8,\n              ),\n              Padding(\n                padding: const EdgeInsets.symmetric(vertical: 16.0),\n                child: Image.asset(routeMode.schemeAsset),\n              ),\n              ThickSlider(\n                activeColor: Colors.blue,\n                label: \"Input Level\",\n                value: device.config.inputVol.toDouble(),\n                min: 0,\n                max: 100,\n                labelFormatter: (val) {\n                  return \"${val.round()}%\";\n                },\n                handleVerticalDrag: true,\n                onChanged: _setUsbInputValue,\n                onDragEnd: (value) => _setUsbInputValue(value, false),\n              ),\n              ThickSlider(\n                activeColor: Colors.blue,\n                label: \"Output Level\",\n                value: device.config.outputVol.toDouble(),\n                min: 0,\n                max: 100,\n                labelFormatter: (val) {\n                  return \"${val.round()}%\";\n                },\n                handleVerticalDrag: true,\n                onChanged: _setUsbOutputValue,\n                onDragEnd: (value) => _setUsbOutputValue(value, false),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/PlugProMicSettings.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugPro.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/communication/plugProCommunication.dart';\n\nclass PlugProMicSettings extends StatefulWidget {\n  const PlugProMicSettings({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _PlugProMicSettingsState();\n}\n\nclass _PlugProMicSettingsState extends State<PlugProMicSettings> {\n  final device = NuxDeviceControl.instance().device as NuxMightyPlugPro;\n  final communication =\n      NuxDeviceControl.instance().device.communication as PlugProCommunication;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Microphone Settings\"),\n      ),\n      body: ListTileTheme(\n        minLeadingWidth: 0,\n        iconColor: Colors.white,\n        child: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              SwitchListTile(\n                  title: const Text(\"Mute\"),\n                  onChanged: (value) {\n                    device.config.micMute = value;\n                    communication.setMicMute(device.config.micMute);\n                    setState(() {});\n                  },\n                  value: device.config.micMute),\n              ListTile(\n                title: const Text(\"Mic Level\"),\n                subtitle: Slider(\n                  min: 0,\n                  max: 100,\n                  label:\n                      \"${((device.config.micVolume - 50) / 50 * 12).toStringAsFixed(1)} db\",\n                  divisions: 100,\n                  value: device.config.micVolume.toDouble(),\n                  onChanged: (val) {\n                    device.config.micVolume = val.round();\n                    communication.setMicLevel(device.config.micVolume);\n                    setState(() {});\n                  },\n                ),\n              ),\n              SwitchListTile(\n                  title: const Text(\"Noise Gate\"),\n                  onChanged: (value) {\n                    device.config.micNoiseGate = value;\n                    communication.setMicNoiseGate(value);\n                    setState(() {});\n                  },\n                  value: device.config.micNoiseGate),\n              ListTile(\n                enabled: device.config.micNoiseGate,\n                title: const Text(\"Gate Sensitivity\"),\n                subtitle: Slider(\n                  min: 0,\n                  max: 100,\n                  label: device.config.micNGSensitivity.toString(),\n                  divisions: 100,\n                  value: device.config.micNGSensitivity.toDouble(),\n                  onChanged: device.config.micNoiseGate == false\n                      ? null\n                      : (val) {\n                          device.config.micNGSensitivity = val.round();\n                          communication.setMicNoiseGateSens(\n                              device.config.micNGSensitivity);\n                          setState(() {});\n                        },\n                ),\n              ),\n              ListTile(\n                enabled: device.config.micNoiseGate,\n                title: const Text(\"Gate Decay\"),\n                subtitle: Slider(\n                  min: 0,\n                  max: 100,\n                  label: device.config.micNGDecay.toString(),\n                  divisions: 100,\n                  value: device.config.micNGDecay.toDouble(),\n                  onChanged: device.config.micNoiseGate == false\n                      ? null\n                      : (val) {\n                          device.config.micNGDecay = val.round();\n                          communication\n                              .setMicNoiseGateDecay(device.config.micNGDecay);\n                          setState(() {});\n                        },\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/PlugProSettings.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/device_specific_settings/eq/MightySpaceSpeakerEQ.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightySpace.dart';\n\nimport '../../../bluetooth/bleMidiHandler.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../popups/alertDialogs.dart';\nimport 'PlugProMicSettings.dart';\nimport 'PlugProUsbSettings.dart';\nimport 'eq/PlugProEQSettings.dart';\n\nclass PlugProSettings extends StatefulWidget {\n  final NuxDevice device;\n  final bool mightySpace;\n  const PlugProSettings(\n      {Key? key, required this.device, required this.mightySpace})\n      : super(key: key);\n\n  @override\n  State<PlugProSettings> createState() => _PlugProSettingsState();\n}\n\nclass _PlugProSettingsState extends State<PlugProSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.volume_up),\n          title: const Text(\"USB Audio Settings\"),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugProUsbSettings()));\n          },\n        ),\n        ListTile(\n          leading: const Icon(Icons.bluetooth_audio),\n          enabled: widget.device.deviceControl.isConnected,\n          title: const Text(\"Bluetooth Audio EQ\"),\n          trailing: const Icon(Icons.keyboard_arrow_right),\n          onTap: () {\n            Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => const PlugProEQSettings()));\n          },\n        ),\n        if (widget.mightySpace &&\n            (!widget.device.deviceControl.isConnected ||\n                (widget.device as NuxMightySpace).speakerAvailable))\n          ListTile(\n            leading: const Icon(Icons.speaker),\n            enabled: widget.device.deviceControl.isConnected,\n            title: const Text(\"Speaker EQ\"),\n            trailing: const Icon(Icons.keyboard_arrow_right),\n            onTap: () {\n              Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => const SpaceSpeakerEQSettings()));\n            },\n          ),\n        if (!widget.mightySpace)\n          ListTile(\n            enabled: widget.device.deviceControl.isConnected,\n            leading: const Icon(Icons.mic),\n            title: const Text(\"Microphone Settings\"),\n            trailing: const Icon(Icons.keyboard_arrow_right),\n            onTap: () {\n              Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => const PlugProMicSettings()));\n            },\n          ),\n        ListTile(\n          enabled: widget.device.deviceControl.isConnected,\n          leading: const Icon(Icons.restart_alt),\n          title: const Text(\"Reset Device Presets\"),\n          onTap: () {\n            if (BLEMidiHandler.instance().connectedDevice != null) {\n              AlertDialogs.showConfirmDialog(context,\n                  title: \"Reset device presets\",\n                  cancelButton: \"Cancel\",\n                  confirmButton: \"Reset\",\n                  confirmColor: Colors.red,\n                  description: \"Are you sure?\", onConfirm: (val) {\n                if (val) widget.device.resetNuxPresets();\n              });\n            }\n          },\n        ),\n        const Divider()\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/PlugProUsbSettings.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/thickSlider.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugPro.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/features/proUsbSettings.dart';\nimport '../../widgets/common/modeControlRegular.dart';\n\nclass RouteModel {\n  final String name;\n  final int value;\n  final String schemeAsset;\n  final bool loopback;\n  final bool dryWet;\n  const RouteModel(\n      {required this.name,\n      required this.value,\n      required this.schemeAsset,\n      required this.loopback,\n      required this.dryWet});\n}\n\nclass PlugProUsbSettings extends StatefulWidget {\n  static const List<RouteModel> routes = [\n    RouteModel(\n        name: \"Normal\",\n        value: 1,\n        schemeAsset: \"assets/images/route_normal.png\",\n        loopback: true,\n        dryWet: true),\n    RouteModel(\n        name: \"Reamp\",\n        value: 2,\n        schemeAsset: \"assets/images/route_reamp.png\",\n        loopback: false,\n        dryWet: false),\n    RouteModel(\n        name: \"Dry Out\",\n        value: 0,\n        schemeAsset: \"assets/images/route_dryout.png\",\n        loopback: false,\n        dryWet: false),\n  ];\n\n  const PlugProUsbSettings({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _PlugProUsbSettingsState();\n}\n\nclass _PlugProUsbSettingsState extends State<PlugProUsbSettings> {\n  final loopbackMask = 0x10;\n  final modeMask = 0x07;\n  final config =\n      NuxDeviceControl.instance().device.config as NuxPlugProConfiguration;\n  final usbSettings = NuxDeviceControl.instance().device as ProUsbSettings;\n  static const fontSize = TextStyle(fontSize: 20);\n\n  @override\n  void didChangeDependencies() {\n    // Adjust the provider based on the image type\n    for (var route in PlugProUsbSettings.routes) {\n      precacheImage(AssetImage(route.schemeAsset), context);\n    }\n    super.didChangeDependencies();\n  }\n\n  void _setUsbDryWetValue(double value, bool skip) {\n    if (skip) {\n      config.usbDryWet = value.round();\n    } else {\n      usbSettings.setUsbDryWetVol(value.round());\n    }\n    setState(() {});\n  }\n\n  void _setUsbRecordingValue(double value, bool skip) {\n    if (skip) {\n      config.recLevel = value.round();\n    } else {\n      usbSettings.setUsbRecordingVol(value.round());\n    }\n    setState(() {});\n  }\n\n  void _setUsbPlaybackValue(double value, bool skip) {\n    if (skip) {\n      config.playbackLevel = value.round();\n    } else {\n      usbSettings.setUsbPlaybackVol(value.round());\n    }\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    const routes = PlugProUsbSettings.routes;\n    var routeModeInt = config.routingMode & modeMask;\n    var routeMode = routes.firstWhere((r) => r.value == routeModeInt);\n    var modeIndex = routes.indexOf(routeMode);\n    var loopback = config.routingMode & loopbackMask != 0;\n\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"USB Audio Settings\"),\n      ),\n      body: SingleChildScrollView(\n        child: Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              const Padding(\n                padding: EdgeInsets.all(16.0),\n                child: Text(\n                  \"Route Mode\",\n                  style: fontSize,\n                ),\n              ),\n              ModeControlRegular(\n                selected: modeIndex,\n                options: routes.map((e) => e.name).toList(),\n                onSelected: (index) {\n                  var mode = routes[index];\n                  var value = mode.value;\n                  if (mode.loopback && loopback) value |= loopbackMask;\n                  usbSettings.setUsbMode(value);\n                  setState(() {});\n                },\n                textStyle: fontSize,\n              ),\n              const SizedBox(\n                height: 8,\n              ),\n              SwitchListTile(\n                  title: const Text(\n                    \"Loopback\",\n                    style: fontSize,\n                  ),\n                  subtitle: const Text(\n                      \"Redirect Bluetooth and microphone audio to USB input\"),\n                  value: loopback,\n                  onChanged: !routeMode.loopback\n                      ? null\n                      : (value) {\n                          if (value) {\n                            routeModeInt |= loopbackMask;\n                          } else {\n                            routeModeInt &= modeMask;\n                          }\n                          usbSettings.setUsbMode(routeModeInt);\n                          setState(() {});\n                        }),\n              Padding(\n                padding: const EdgeInsets.symmetric(vertical: 16.0),\n                child: Image.asset(routeMode.schemeAsset),\n              ),\n              ThickSlider(\n                enabled: routeMode.dryWet,\n                activeColor: Colors.blue,\n                label: \"Dry/Wet\",\n                value: config.usbDryWet.toDouble(),\n                min: 0,\n                max: 100,\n                labelFormatter: (val) {\n                  return \"${config.usbDryWet}%\";\n                },\n                handleVerticalDrag: true,\n                onChanged: _setUsbDryWetValue,\n                onDragEnd: (value) => _setUsbDryWetValue(value, false),\n              ),\n              ThickSlider(\n                activeColor: Colors.blue,\n                label: \"Recording Level\",\n                value: config.recLevel.toDouble(),\n                min: 0,\n                max: 100,\n                labelFormatter: (val) {\n                  return \"${((val - 50) / 50 * 12).toStringAsFixed(2)} db\";\n                },\n                handleVerticalDrag: true,\n                onChanged: _setUsbRecordingValue,\n                onDragEnd: (value) => _setUsbRecordingValue(value, false),\n              ),\n              ThickSlider(\n                activeColor: Colors.blue,\n                label: \"Playback Level\",\n                value: config.playbackLevel.toDouble(),\n                min: 0,\n                max: 100,\n                labelFormatter: (val) {\n                  return \"${((val - 50) / 50 * 12).toStringAsFixed(2)} db\";\n                },\n                handleVerticalDrag: true,\n                onChanged: _setUsbPlaybackValue,\n                onDragEnd: (value) => _setUsbPlaybackValue(value, false),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/eq/MightySpaceSpeakerEQ.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/presets/effectEditors/EqualizerEditor.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightySpace.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/plugProCommunication.dart';\nimport '../../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../../bluetooth/devices/effects/plug_pro/EQ.dart';\nimport 'eq_group.dart';\n\nclass SpaceSpeakerEQSettings extends StatefulWidget {\n  const SpaceSpeakerEQSettings({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _SpaceSpeakerEQSettingsState();\n}\n\nclass _SpaceSpeakerEQSettingsState extends State<SpaceSpeakerEQSettings> {\n  final device = NuxDeviceControl.instance().device as NuxMightySpace;\n  final communication =\n      NuxDeviceControl.instance().device.communication as PlugProCommunication;\n  bool _requestInProgress = false;\n\n  static const List<int> defaultSpeakerEQ = [\n    0x32,\n    0x49,\n    0x4b,\n    0x40,\n    0x32,\n    0x43,\n    0x24,\n    0x32,\n    0x32,\n    0x22,\n    0x51\n  ];\n\n  @override\n  void initState() {\n    super.initState();\n    _requestEQData(device.config.speakerEQGroup);\n  }\n\n  void _requestEQData(int index) {\n    _requestInProgress = true;\n    (device.communication as PlugProCommunication).requestSpeakerEQData(index);\n  }\n\n  Widget _buildGroupWidget() {\n    return EQGroup(\n      eqGroup: device.config.speakerEQGroup,\n      onChanged: (int? value) {\n        if (value != null) {\n          //request another\n          device.config.speakerEQGroup = value;\n          communication.setSpeakerEq(value);\n          _requestEQData(device.config.speakerEQGroup);\n          setState(() {});\n        }\n      },\n    );\n  }\n\n  List<Widget> _buildButtons(EQTenBandSpeaker btEQ) {\n    return [\n      ElevatedButton(\n          child: const Text(\"Reset\"),\n          onPressed: () {\n            for (int i = 0; i < btEQ.parameters.length; i++) {\n              if (device.config.speakerEQGroup == 0) {\n                btEQ.parameters[i].midiValue = defaultSpeakerEQ[i];\n              } else {\n                btEQ.parameters[i].value = 0;\n              }\n\n              NuxDeviceControl.instance()\n                  .sendParameter(btEQ.parameters[i], false);\n            }\n            setState(() {});\n          }),\n      const SizedBox(width: 6),\n      ElevatedButton(\n          child: const Text(\"Save\"),\n          onPressed: () {\n            communication.saveSpeakerEQGroup(device.config.speakerEQGroup);\n          })\n    ];\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var btEQ = device.config.speakerEQ;\n    bool isPortrait =\n        MediaQuery.of(context).orientation == Orientation.portrait;\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Speaker EQ Settings\"),\n      ),\n      body: StreamBuilder(\n          stream:\n              (device.communication as PlugProCommunication).speakerEQStream,\n          builder: (context, AsyncSnapshot<List<int>> snapshot) {\n            if (snapshot.connectionState == ConnectionState.done &&\n                _requestInProgress) {\n              btEQ.setupFromNuxPayload(snapshot.data!);\n              _requestInProgress = false;\n            }\n            return ListTileTheme(\n                minLeadingWidth: 0,\n                iconColor: Colors.white,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  children: [\n                    if (isPortrait)\n                      ListTile(\n                        leading: const Icon(Icons.speaker),\n                        title: const Text(\"Speaker Settings\"),\n                        trailing: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: _buildButtons(btEQ)),\n                      ),\n                    if (isPortrait) _buildGroupWidget(),\n                    if (!isPortrait)\n                      Row(\n                        mainAxisSize: MainAxisSize.max,\n                        mainAxisAlignment: MainAxisAlignment.spaceAround,\n                        children: [\n                          _buildGroupWidget(),\n                          Row(children: _buildButtons(btEQ))\n                        ],\n                      ),\n                    Expanded(\n                      child: EqualizerEditor(\n                        eqEffect: btEQ,\n                        enabled: true,\n                        onChanged: _changeEQValue,\n                        onChangedFinal: (parameter, value, oldValue) =>\n                            _changeEQValue(parameter, value, false),\n                      ),\n                    )\n                  ],\n                ));\n          }),\n    );\n  }\n\n  void _changeEQValue(Parameter parameter, double value, bool skip) {\n    parameter.value = value;\n    setState(() {\n      if (!skip) NuxDeviceControl.instance().sendParameter(parameter, false);\n    });\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/eq/PlugProEQSettings.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/device_specific_settings/eq/bt_audio_options.dart';\nimport 'package:mighty_plug_manager/UI/widgets/presets/effectEditors/EqualizerEditor.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugPro.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/plugProCommunication.dart';\nimport '../../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../../bluetooth/devices/effects/plug_pro/EQ.dart';\nimport 'eq_group.dart';\n\nclass PlugProEQSettings extends StatefulWidget {\n  const PlugProEQSettings({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _PlugProEQSettingsState();\n}\n\nclass _PlugProEQSettingsState extends State<PlugProEQSettings> {\n  final device = NuxDeviceControl.instance().device as NuxMightyPlugPro;\n  final communication =\n      NuxDeviceControl.instance().device.communication as PlugProCommunication;\n  bool _requestInProgress = false;\n\n  @override\n  void initState() {\n    super.initState();\n    _requestEQData(device.config.bluetoothGroup);\n  }\n\n  void _requestEQData(int index) {\n    _requestInProgress = true;\n    (device.communication as PlugProCommunication).requestBTEQData(index);\n  }\n\n  List<Widget> _buildGroupWidget() {\n    return [\n      EQGroup(\n        eqGroup: device.config.bluetoothGroup,\n        onChanged: (int? value) {\n          if (value != null) {\n            //request another\n            device.config.bluetoothGroup = value;\n            communication.setBTEq(value);\n            _requestEQData(device.config.bluetoothGroup);\n            setState(() {});\n          }\n        },\n      ),\n      BTAudioOptions(\n          btInvertChannel: device.config.bluetoothInvertChannel,\n          btEQMute: device.config.bluetoothEQMute,\n          onInvert: (invert) {\n            device.config.bluetoothInvertChannel = invert;\n            communication.setBTInvert(device.config.bluetoothInvertChannel);\n            setState(() {});\n          },\n          onMute: (mute) {\n            device.config.bluetoothEQMute = mute;\n            communication.setBTMute(device.config.bluetoothEQMute);\n            setState(() {});\n          })\n    ];\n  }\n\n  List<Widget> _buildButtons(EQTenBandBT btEQ) {\n    return [\n      ElevatedButton(\n          child: const Text(\"Reset\"),\n          onPressed: () {\n            for (var param in btEQ.parameters) {\n              param.value = 0;\n              NuxDeviceControl.instance().sendParameter(param, false);\n            }\n            setState(() {});\n          }),\n      const SizedBox(width: 6),\n      ElevatedButton(\n          child: const Text(\"Save\"),\n          onPressed: () {\n            communication.saveBTEQGroup(device.config.bluetoothGroup);\n          })\n    ];\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var btEQ = device.config.bluetoothEQ;\n    bool isPortrait =\n        MediaQuery.of(context).orientation == Orientation.portrait;\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Bluetooth EQ Settings\"),\n      ),\n      body: StreamBuilder(\n          stream:\n              (device.communication as PlugProCommunication).bluetoothEQStream,\n          builder: (context, AsyncSnapshot<List<int>> snapshot) {\n            if (snapshot.connectionState == ConnectionState.done &&\n                _requestInProgress) {\n              btEQ.setupFromNuxPayload(snapshot.data!);\n              device.config.bluetoothInvertChannel = snapshot.data![12] > 0;\n              device.config.bluetoothEQMute = snapshot.data![13] > 0;\n              _requestInProgress = false;\n            }\n            return ListTileTheme(\n                minLeadingWidth: 0,\n                iconColor: Colors.white,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  children: [\n                    if (isPortrait)\n                      ListTile(\n                        leading: const Icon(Icons.bluetooth),\n                        title: const Text(\"Bluetooth Settings\"),\n                        trailing: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: _buildButtons(btEQ)),\n                      ),\n                    if (isPortrait)\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.spaceAround,\n                        children: _buildGroupWidget(),\n                      ),\n                    if (!isPortrait)\n                      Row(\n                        mainAxisSize: MainAxisSize.max,\n                        mainAxisAlignment: MainAxisAlignment.spaceAround,\n                        children: [\n                          ..._buildGroupWidget(),\n                          Row(children: _buildButtons(btEQ))\n                        ],\n                      ),\n                    Expanded(\n                      child: EqualizerEditor(\n                        eqEffect: btEQ,\n                        enabled: true,\n                        onChanged: _changeEQValue,\n                        onChangedFinal: (parameter, value, oldValue) =>\n                            _changeEQValue(parameter, value, false),\n                      ),\n                    )\n                  ],\n                ));\n          }),\n    );\n  }\n\n  void _changeEQValue(Parameter parameter, double value, bool skip) {\n    parameter.value = value;\n    setState(() {\n      if (!skip) NuxDeviceControl.instance().sendParameter(parameter, false);\n    });\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/eq/bt_audio_options.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../mightierIcons.dart';\n\nclass BTAudioOptions extends StatelessWidget {\n  final bool btInvertChannel;\n  final bool btEQMute;\n  final void Function(bool) onInvert;\n  final void Function(bool) onMute;\n  const BTAudioOptions(\n      {super.key,\n      required this.btInvertChannel,\n      required this.btEQMute,\n      required this.onInvert,\n      required this.onMute});\n\n  @override\n  Widget build(BuildContext context) {\n    return ToggleButtons(\n      fillColor: Colors.blue,\n      selectedBorderColor: Colors.blue,\n      color: Colors.grey,\n      isSelected: [btInvertChannel, btEQMute],\n      onPressed: (index) {\n        switch (index) {\n          case 0:\n            onInvert(!btInvertChannel);\n            break;\n          case 1:\n            onMute(!btEQMute);\n            break;\n        }\n      },\n      children: [\n        const Tooltip(\n          message: \"Invert the phase of Bluetooth Audio.\",\n          child: Padding(\n            padding: EdgeInsets.symmetric(horizontal: 15.0),\n            child: Icon(MightierIcons.sinewave, size: 40),\n          ),\n        ),\n        Tooltip(\n          message: \"Mute Bluetooth audio.\",\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 25.0),\n            child: Icon(btEQMute ? Icons.volume_off : Icons.volume_up),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/device_specific_settings/eq/eq_group.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass EQGroup extends StatelessWidget {\n  final int eqGroup;\n  final void Function(int?)? onChanged;\n  const EQGroup({super.key, required this.eqGroup, this.onChanged});\n\n  static const List<DropdownMenuItem<int>> eqGroups = [\n    DropdownMenuItem<int>(\n      value: 0,\n      child: Text(\"Group 1\"),\n    ),\n    DropdownMenuItem<int>(\n      value: 1,\n      child: Text(\"Group 2\"),\n    ),\n    DropdownMenuItem<int>(\n      value: 2,\n      child: Text(\"Group 3\"),\n    ),\n    DropdownMenuItem<int>(\n      value: 3,\n      child: Text(\"Group 4\"),\n    ),\n  ];\n\n  @override\n  Widget build(BuildContext context) {\n    return Row(\n      children: [\n        const Text(\n          \"EQ Group\",\n          style: TextStyle(fontSize: 16),\n        ),\n        const SizedBox(\n          width: 8,\n        ),\n        DropdownButton(\n          items: eqGroups,\n          onChanged: onChanged,\n          value: eqGroup,\n        )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/DrumStyleBottomSheet.dart",
    "content": "import 'package:flutter/material.dart';\nimport '../../widgets/scrollPicker.dart';\n\nenum DrumStyleMode { flat, categorized }\n\nclass DrumStyleBottomSheet extends StatefulWidget {\n  final dynamic styleMap;\n  final DrumStyleMode mode;\n  final int selected;\n  final Function(int) onChange;\n  const DrumStyleBottomSheet(\n      {Key? key,\n      required this.styleMap,\n      required this.selected,\n      required this.onChange,\n      required this.mode})\n      : super(key: key);\n\n  @override\n  State<DrumStyleBottomSheet> createState() => _DrumStyleBottomSheetState();\n}\n\nclass _DrumStyleBottomSheetState extends State<DrumStyleBottomSheet> {\n  List<String> categoriesList = [];\n  List<String> stylesList = [];\n  int categoriesIndex = 0;\n  int selectedStyle = 0;\n\n  @override\n  void initState() {\n    super.initState();\n    selectedStyle = widget.selected;\n    if (widget.mode == DrumStyleMode.categorized) {\n      categoriesList = widget.styleMap.keys.toList();\n\n      for (var key in widget.styleMap.keys) {\n        stylesList.addAll(widget.styleMap[key]!.keys as Iterable<String>);\n        for (var style in widget.styleMap[key]!.keys) {\n          if (widget.styleMap[key]![style] == widget.selected) {\n            categoriesIndex = categoriesList.indexOf(key);\n          }\n        }\n      }\n    } else {\n      stylesList = widget.styleMap;\n    }\n  }\n\n  void _onCategoryChanged(int value, bool userGenerated) {\n    categoriesIndex = value;\n\n    if (userGenerated) {\n      var key = categoriesList[categoriesIndex];\n      var firstKey = widget.styleMap[key]!.keys.first as String;\n\n      selectedStyle = widget.styleMap[key]![firstKey];\n      setState(() {});\n    }\n  }\n\n  void _onStyleChanged(int value, bool userGenerated, bool finalChange) {\n    selectedStyle = value;\n    if (userGenerated) {\n      //find category\n      for (var cat in widget.styleMap.keys) {\n        for (var style in widget.styleMap[cat]!.keys) {\n          if (widget.styleMap[cat]![style] == value) {\n            categoriesIndex = categoriesList.indexOf(cat);\n            setState(() {});\n            break;\n          }\n        }\n      }\n    }\n\n    if (finalChange) widget.onChange(selectedStyle);\n  }\n\n  void _onFlatStyleChanged(int value, bool finalChange) {\n    selectedStyle = value;\n    widget.onChange(selectedStyle);\n    if (!finalChange) setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      height: 400,\n      child: Column(\n        children: [\n          const SizedBox(\n            height: 40,\n            // ignore: unnecessary_const\n            child: Center(\n              child: Text(\n                \"Select Style\",\n                textAlign: TextAlign.center,\n                style: TextStyle(fontSize: 20),\n              ),\n            ),\n          ),\n          const Divider(\n            thickness: 1,\n          ),\n          Expanded(\n            child: widget.mode == DrumStyleMode.flat\n                ? ScrollPicker(\n                    initialValue: selectedStyle,\n                    items: stylesList,\n                    onChanged: (value) {\n                      _onFlatStyleChanged(value, false);\n                    },\n                    onChangedFinal: (value, user) =>\n                        _onFlatStyleChanged(value, true),\n                  )\n                : Row(\n                    children: [\n                      Expanded(\n                        child: ScrollPicker(\n                          initialValue: categoriesIndex,\n                          items: categoriesList,\n                          onChanged: (value) {\n                            _onCategoryChanged(value, true);\n                          },\n                          onChangedFinal: _onCategoryChanged,\n                        ),\n                      ),\n                      Expanded(\n                        child: ScrollPicker(\n                          initialValue: selectedStyle,\n                          items: stylesList,\n                          onChanged: (value) {\n                            _onStyleChanged(value, true, false);\n                          },\n                          onChangedFinal: (value, user) =>\n                              _onStyleChanged(value, user, true),\n                        ),\n                      )\n                    ],\n                  ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/drumEditor.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/drum_eq_bottom_sheet.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/drumstyle_scroll_picker.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/tap_buttons.dart';\nimport 'package:mighty_plug_manager/UI/widgets/circular_button.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/modeControlRegular.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/tempoTrainerSheet.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/features/drumsTone.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/features/looper.dart';\nimport '../../../modules/tempo_trainer.dart';\nimport '../../widgets/thickSlider.dart';\nimport 'looperPage.dart';\n\nenum DrumEditorLayout { standard, extendedToneControls }\n\nenum DrumEditorMode { regular, trainer, looper }\n\nclass DrumEditor extends StatefulWidget {\n  static const fontStyle = TextStyle(fontSize: 18);\n\n  const DrumEditor({Key? key}) : super(key: key);\n  @override\n  State createState() => _DrumEditorState();\n}\n\nclass _DrumEditorState extends State<DrumEditor>\n    with AutomaticKeepAliveClientMixin<DrumEditor> {\n  late dynamic _drumStyles;\n  DrumEditorLayout _layout = DrumEditorLayout.standard;\n  DrumEditorMode _mode = DrumEditorMode.regular;\n  int _selectedDrumPattern = 0;\n  late NuxDevice device;\n\n  @override\n  void initState() {\n    super.initState();\n    _drumStyles = NuxDeviceControl.instance().device.getDrumStyles();\n    NuxDeviceControl.instance().addListener(_onStateChanged);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    NuxDeviceControl.instance().removeListener(_onStateChanged);\n  }\n\n  Widget _createScrollPicker(\n      bool smallControls, bool showPlay, bool playEnabled) {\n    var picker = DrumStyleScrollPicker(\n        smallControls: smallControls,\n        selectedDrumPattern: _selectedDrumPattern,\n        layout: _layout,\n        device: device,\n        drumStyles: _drumStyles,\n        onChanged: _onScrollPickerChanged,\n        onChangedFinal: _onScrollPickerChangedFinal,\n        onComplete: () => setState(() {}));\n\n    if (!showPlay) return picker;\n    return Row(\n      children: [\n        Expanded(child: picker),\n        IconButton(\n            onPressed: !playEnabled || !NuxDeviceControl().isConnected\n                ? null\n                : () {\n                    device.setDrumsEnabled(!device.drumsEnabled);\n                    if (device.drumsEnabled == false) {\n                      TempoTrainer.instance().enable = false;\n                    }\n                    NuxDeviceControl.instance().forceNotifyListeners();\n                  },\n            padding: const EdgeInsets.only(left: 12, right: 4),\n            iconSize: smallControls ? 44 : 56,\n            color: device.drumsEnabled ? Colors.orange : Colors.green,\n            icon: Icon(device.drumsEnabled ? Icons.stop : Icons.play_arrow))\n      ],\n    );\n  }\n\n  Widget _landscapePlayControl(bool enabled) {\n    return CircularButton(\n        onPressed: TempoTrainer.instance().enable || !enabled\n            ? null\n            : () {\n                device.setDrumsEnabled(!device.drumsEnabled);\n                if (device.drumsEnabled == false) {\n                  TempoTrainer.instance().enable = false;\n                }\n                NuxDeviceControl.instance().forceNotifyListeners();\n              },\n        backgroundColor: device.drumsEnabled ? Colors.orange : Colors.green,\n        icon: device.drumsEnabled ? Icons.stop : Icons.play_arrow);\n  }\n\n  Widget _createModeControl(\n      {required bool looper,\n      required bool landscape,\n      required bool smallControls}) {\n    double height = smallControls ? 48 : 56;\n\n    if (landscape && !looper) {\n      return SizedBox(\n        height: height,\n        child: const Center(\n            child: Text(\n          \"Trainer\",\n          style: TextStyle(fontSize: 20),\n        )),\n      );\n    }\n\n    if (landscape) {\n      var controls = [\"Trainer\", \"Looper\"];\n      var mode = _mode;\n      if (mode == DrumEditorMode.regular) mode = DrumEditorMode.trainer;\n      return ConstrainedBox(\n        constraints: BoxConstraints(maxHeight: height),\n        child: ModeControlRegular(\n            options: controls,\n            textStyle: DrumEditor.fontStyle,\n            selected: mode.index - 1,\n            onSelected: (index) {\n              _mode = DrumEditorMode.values[index + 1];\n              setState(() {});\n            }),\n      );\n    }\n    var controls = [\"Regular\", \"Trainer\"];\n    if (looper) controls.add(\"Looper\");\n    return Padding(\n      padding: const EdgeInsets.symmetric(vertical: 8.0),\n      child: ConstrainedBox(\n        constraints: const BoxConstraints(maxHeight: 40),\n        child: ModeControlRegular(\n            options: controls,\n            textStyle: DrumEditor.fontStyle,\n            selected: _mode.index,\n            onSelected: (index) {\n              _mode = DrumEditorMode.values[index];\n              setState(() {});\n            }),\n      ),\n    );\n  }\n\n  Widget _drumLevelSlider(bool small) {\n    return ThickSlider(\n      min: 0,\n      max: 100,\n      maxHeight: small ? 40 : null,\n      activeColor: Colors.blue,\n      label: \"Drums Level\",\n      value: device.drumsVolume.toDouble(),\n      labelFormatter: (val) => \"${device.drumsVolume.round()} %\",\n      onChanged: (value, skip) {\n        setState(() {\n          device.setDrumsLevel(value, !skip);\n        });\n      },\n    );\n  }\n\n  bool _tempoControlsEnabled() {\n    return !TempoTrainer.instance().enable &&\n        (device is! Looper ||\n            (device is Looper && (device as Looper).loopState == 0));\n  }\n\n  Widget _tempoSlider(bool small, bool landscape) {\n    if (_mode != DrumEditorMode.trainer || landscape) {\n      return ThickSlider(\n        enabled: _tempoControlsEnabled(),\n        min: device.drumsMinTempo,\n        max: device.drumsMaxTempo,\n        maxHeight: small ? 40 : null,\n        skipEmitting: 5,\n        activeColor: Colors.blue,\n        label: \"Tempo\",\n        value: device.drumsTempo,\n        labelFormatter: (val) => \"${device.drumsTempo.toStringAsFixed(1)} BPM\",\n        onChanged: (val, skip) {\n          setState(() {\n            device.setDrumsTempo(val, !skip);\n          });\n        },\n      );\n    }\n    return const SizedBox.shrink();\n  }\n\n  List<Widget> _toneSliders(bool small) {\n    if (device is! DrumsTone) return [];\n    var dev = device as DrumsTone;\n    return [\n      ThickSlider(\n        min: 0,\n        max: 100,\n        maxHeight: small ? 40 : null,\n        skipEmitting: 5,\n        activeColor: Colors.blue,\n        label: \"Bass\",\n        value: dev.drumsBass,\n        labelFormatter: (val) => \"${dev.drumsBass.round()} %\",\n        onChanged: (val, skip) {\n          dev.setDrumsTone(val, DrumsToneControl.bass, !skip);\n          setState(() {});\n        },\n      ),\n      ThickSlider(\n        min: 0,\n        max: 100,\n        maxHeight: small ? 40 : null,\n        skipEmitting: 5,\n        activeColor: Colors.blue,\n        label: \"Middle\",\n        value: dev.drumsMiddle,\n        labelFormatter: (val) => \"${dev.drumsMiddle.round()} %\",\n        onChanged: (val, skip) {\n          dev.setDrumsTone(val, DrumsToneControl.middle, !skip);\n          setState(() {});\n        },\n      ),\n      ThickSlider(\n        min: 0,\n        max: 100,\n        maxHeight: small ? 40 : null,\n        skipEmitting: 5,\n        activeColor: Colors.blue,\n        label: \"Treble\",\n        value: dev.drumsTreble,\n        labelFormatter: (val) => \"${dev.drumsTreble.round()} %\",\n        onChanged: (val, skip) {\n          dev.setDrumsTone(val, DrumsToneControl.treble, !skip);\n          setState(() {});\n        },\n      )\n    ];\n  }\n\n  Widget _tapButton(bool smallControls) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(vertical: 8.0),\n      child: TapButtons(\n          smallControls: smallControls,\n          device: device,\n          onTempoModified: _modifyTempo,\n          onTempoChanged: _onTempoChanged,\n          enabled: _tempoControlsEnabled()),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final mediaQuery = MediaQuery.of(context);\n    final bool portrait = mediaQuery.orientation == Orientation.portrait;\n    final bool smallControls =\n        portrait ? mediaQuery.size.height < 690 : mediaQuery.size.height < 400;\n\n    device = NuxDeviceControl.instance().device;\n\n    final bool hasLooper = device is Looper;\n    final bool looperEnabled = hasLooper && (device as Looper).loopState != 0;\n    _layout = _drumStyles is List<String>\n        ? DrumEditorLayout.standard\n        : DrumEditorLayout.extendedToneControls;\n\n    _selectedDrumPattern = device.selectedDrumStyle;\n\n    if (portrait) {\n      return Column(\n        mainAxisSize: MainAxisSize.max,\n        //padding: const EdgeInsets.all(16.0),\n        children: [\n          Card(\n            color: Colors.grey[850],\n            child: Padding(\n              padding: const EdgeInsets.all(8.0),\n              child: Column(children: [\n                _createScrollPicker(smallControls, true, !looperEnabled),\n                const SizedBox(height: 6),\n                _drumLevelSlider(smallControls),\n              ]),\n            ),\n          ),\n          _createModeControl(\n              looper: hasLooper,\n              landscape: false,\n              smallControls: smallControls),\n          Card(\n            color: Colors.grey[850],\n            child: Padding(\n              padding: const EdgeInsets.all(8.0),\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: [\n                  _tempoSlider(smallControls, false),\n                  if (_mode == DrumEditorMode.regular)\n                    _tapButton(smallControls),\n                  if (_mode == DrumEditorMode.regular && device is DrumsTone)\n                    ..._toneSliders(smallControls),\n                  if (_mode == DrumEditorMode.trainer)\n                    TempoTrainerSheet(\n                        smallControls: smallControls,\n                        overtakeDrums: true,\n                        enabled: !looperEnabled),\n                  if (_mode == DrumEditorMode.looper)\n                    LooperControl(\n                      onStateChanged: _onStateChanged,\n                      smallControls: smallControls,\n                    ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n\n    var mode = _mode;\n    if (mode == DrumEditorMode.regular) mode = DrumEditorMode.trainer;\n    return Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Expanded(\n            flex: 1,\n            child: Card(\n              color: Colors.grey[850],\n              child: Padding(\n                padding: const EdgeInsets.all(6.0),\n                child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: [\n                      _createScrollPicker(smallControls, false, false),\n                      const SizedBox(height: 6),\n                      _drumLevelSlider(smallControls),\n                      _tempoSlider(smallControls, true),\n                      _tapButton(smallControls),\n                      Expanded(\n                          child: Row(\n                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                        children: [\n                          if (device is DrumsTone)\n                            CircularButton(\n                                icon: Icons.equalizer,\n                                backgroundColor: Colors.blue,\n                                onPressed: () {\n                                  showModalBottomSheet(\n                                      showDragHandle: true,\n                                      context: context,\n                                      builder: (context) {\n                                        return const DrumEQBottomSheet();\n                                      });\n                                }),\n                          _landscapePlayControl(!looperEnabled)\n                        ],\n                      )),\n                    ]),\n              ),\n            )),\n        const SizedBox(\n          width: 6,\n        ),\n        Expanded(\n            flex: 1,\n            child: Card(\n              color: Colors.grey[850],\n              child: Padding(\n                padding: const EdgeInsets.all(6.0),\n                child: Column(\n                  mainAxisAlignment: MainAxisAlignment.start,\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  children: [\n                    Center(\n                        child: _createModeControl(\n                            looper: hasLooper,\n                            landscape: true,\n                            smallControls: smallControls)),\n                    const SizedBox(height: 6),\n                    if (!hasLooper || mode == DrumEditorMode.trainer)\n                      TempoTrainerSheet(\n                        smallControls: smallControls,\n                        overtakeDrums: false,\n                        enabled: device.drumsEnabled ==\n                                TempoTrainer.instance().enable &&\n                            !looperEnabled,\n                      ),\n                    if (mode == DrumEditorMode.looper)\n                      LooperControl(\n                        onStateChanged: _onStateChanged,\n                        smallControls: smallControls,\n                      ),\n                  ],\n                ),\n              ),\n            ))\n      ],\n    );\n  }\n\n  void _onScrollPickerChanged(value) {\n    _selectedDrumPattern = value;\n    setState(() {});\n  }\n\n  void _onScrollPickerChangedFinal(\n      int value, bool userGenerated, NuxDevice? device) {\n    if (userGenerated) {\n      _selectedDrumPattern = value;\n      device?.setDrumsStyle(value);\n\n      //workaround for a bug in Mighty Plug\n      device?.setDrumsTempo(device.drumsTempo + 1, true);\n      device?.setDrumsTempo(device.drumsTempo - 1, true);\n    }\n  }\n\n  void _modifyTempo(double amount) {\n    setState(() {\n      double newTempo = device.drumsTempo + amount;\n      device.setDrumsTempo(newTempo, true);\n    });\n  }\n\n  void _onTempoChanged(double value) {\n    setState(() {\n      device.setDrumsTempo(value, true);\n    });\n  }\n\n  void _onStateChanged() {\n    _drumStyles = NuxDeviceControl.instance().device.getDrumStyles();\n    if (device.drumsEnabled == false &&\n        TempoTrainer.instance().enable == true) {\n      TempoTrainer.instance().enable = false;\n    }\n    setState(() {});\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/drum_eq_bottom_sheet.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/features/drumsTone.dart';\nimport '../../widgets/thickSlider.dart';\n\nclass DrumEQBottomSheet extends StatefulWidget {\n  const DrumEQBottomSheet({super.key});\n\n  @override\n  State<DrumEQBottomSheet> createState() => _DrumEQBottomSheetState();\n}\n\nclass _DrumEQBottomSheetState extends State<DrumEQBottomSheet> {\n  @override\n  Widget build(BuildContext context) {\n    var dev = NuxDeviceControl.instance().device as DrumsTone;\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        ThickSlider(\n          min: 0,\n          max: 100,\n          maxHeight: 45,\n          skipEmitting: 5,\n          activeColor: Colors.blue,\n          label: \"Bass\",\n          value: dev.drumsBass,\n          handleVerticalDrag: false,\n          labelFormatter: (val) => \"${dev.drumsBass.round()} %\",\n          onChanged: (val, skip) {\n            dev.setDrumsTone(val, DrumsToneControl.bass, !skip);\n            setState(() {});\n          },\n        ),\n        ThickSlider(\n          min: 0,\n          max: 100,\n          maxHeight: 45,\n          skipEmitting: 5,\n          activeColor: Colors.blue,\n          label: \"Middle\",\n          value: dev.drumsMiddle,\n          handleVerticalDrag: false,\n          labelFormatter: (val) => \"${dev.drumsMiddle.round()} %\",\n          onChanged: (val, skip) {\n            dev.setDrumsTone(val, DrumsToneControl.middle, !skip);\n            setState(() {});\n          },\n        ),\n        ThickSlider(\n          min: 0,\n          max: 100,\n          maxHeight: 45,\n          skipEmitting: 5,\n          activeColor: Colors.blue,\n          label: \"Treble\",\n          value: dev.drumsTreble,\n          handleVerticalDrag: false,\n          labelFormatter: (val) => \"${dev.drumsTreble.round()} %\",\n          onChanged: (val, skip) {\n            dev.setDrumsTone(val, DrumsToneControl.treble, !skip);\n            setState(() {});\n          },\n        ),\n        const SizedBox(\n          height: 15,\n        )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/drumstyle_scroll_picker.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport 'DrumStyleBottomSheet.dart';\nimport 'drumEditor.dart';\n\nclass DrumStyleScrollPicker extends StatelessWidget {\n  static const _fontStyle = TextStyle(fontSize: 20);\n\n  final int selectedDrumPattern;\n  final DrumEditorLayout layout;\n  final NuxDevice device;\n  final dynamic drumStyles;\n\n  // Events\n  final ValueChanged<int> onChanged;\n  final Function(int, bool, NuxDevice) onChangedFinal;\n  final Function() onComplete;\n  final bool smallControls;\n\n  const DrumStyleScrollPicker(\n      {super.key,\n      required this.selectedDrumPattern,\n      required this.layout,\n      required this.device,\n      required this.drumStyles,\n      required this.onChanged,\n      required this.onChangedFinal,\n      required this.onComplete,\n      required this.smallControls});\n\n  String _getComplexListStyle(Map<String, Map> list) {\n    for (String cat in list.keys) {\n      for (String style in list[cat]!.keys) {\n        if (list[cat]![style] == selectedDrumPattern) return \"$cat - $style\";\n      }\n    }\n    return \"\";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Semantics(\n      label: \"Drum style\",\n      child: ListTile(\n        dense: smallControls,\n        shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(5),\n            side: const BorderSide(width: 1, color: Colors.white)),\n        title: Text(\n          layout == DrumEditorLayout.extendedToneControls\n              ? _getComplexListStyle(drumStyles)\n              : drumStyles[selectedDrumPattern],\n          style: _fontStyle,\n          overflow: TextOverflow.ellipsis,\n        ),\n        trailing: const Icon(Icons.keyboard_arrow_right),\n        onTap: () {\n          showModalBottomSheet(\n              context: context,\n              builder: (context) {\n                return DrumStyleBottomSheet(\n                  styleMap: drumStyles,\n                  mode: layout == DrumEditorLayout.extendedToneControls\n                      ? DrumStyleMode.categorized\n                      : DrumStyleMode.flat,\n                  selected: selectedDrumPattern,\n                  onChange: (value) {\n                    onChangedFinal(value, true, device);\n                  },\n                );\n              }).whenComplete(() {\n            onComplete();\n          });\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/looperPage.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/thickSlider.dart';\n\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/features/looper.dart';\nimport '../../../modules/tempo_trainer.dart';\nimport '../../widgets/circular_button.dart';\nimport '../../widgets/common/modeControlRegular.dart';\n\nclass LooperControl extends StatefulWidget {\n  final VoidCallback onStateChanged;\n  final bool smallControls;\n  const LooperControl(\n      {super.key, required this.onStateChanged, required this.smallControls});\n\n  @override\n  State<LooperControl> createState() => _LooperControlState();\n}\n\nclass _LooperControlState extends State<LooperControl> {\n  static const fontSize = TextStyle(fontSize: 18);\n  late Looper _looper;\n  late LooperData _data = LooperData();\n  Timer? _blinkTimer;\n  StreamSubscription? _subscription;\n  bool _blinkOn = true;\n\n  @override\n  void initState() {\n    super.initState();\n    _looper = NuxDeviceControl().device as Looper;\n    _subscription = _looper.getLooperDataStream().listen(_onData);\n    _looper.requestLooperSettings();\n\n    _blinkTimer = Timer.periodic(const Duration(milliseconds: 400), _onBlink);\n  }\n\n  @override\n  void dispose() {\n    _subscription?.cancel();\n    _blinkTimer?.cancel();\n    super.dispose();\n  }\n\n  void _onData(LooperData data) {\n    _data = data;\n    widget.onStateChanged();\n    setState(() {});\n  }\n\n  void _onBlink(timer) {\n    _blinkOn = !_blinkOn;\n    setState(() {});\n  }\n\n  IconData getRecordButtonIcon() {\n    switch (_data.loopState) {\n      case 0:\n      case 1:\n        return Icons.fiber_manual_record;\n      case 2:\n      case 4:\n        return Icons.play_arrow;\n      case 3:\n        return Icons.fiber_smart_record;\n      case 9:\n        return Icons.pause;\n      default:\n        return Icons.fiber_manual_record;\n    }\n  }\n\n  Color _getRecordButtonColor() {\n    if (!_blinkOn && _data.loopState > 0 && _data.loopState < 4) {\n      return Colors.grey[700]!;\n    }\n    switch (_data.loopState) {\n      case 0:\n      case 1:\n        return Colors.red;\n      case 2:\n      case 4:\n        return Colors.green;\n      case 3:\n        return Colors.amber[700]!;\n      case 9:\n        return Colors.green;\n      default:\n        return Colors.red;\n    }\n  }\n\n  IconData getUndoButtonIcon() {\n    if (_data.loopUndoState == 2) return Icons.redo;\n    return Icons.undo;\n  }\n\n  Color _getUndoButtonColor() {\n    if (_data.loopUndoState == 2) return Colors.purple[700]!;\n    return Colors.blue;\n  }\n\n  bool getStopEnabled() {\n    switch (_data.loopState) {\n      case 2:\n      case 3:\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  bool getClearEnabled() {\n    if (_data.loopState > 0 && _data.loopState < 5) return true;\n    return false;\n  }\n\n  bool getUndoEnabled() {\n    return _data.loopUndoState > 0;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var looper = (NuxDeviceControl().device as Looper);\n    var connected = NuxDeviceControl().isConnected;\n\n    return Column(children: [\n      const SizedBox(\n        height: 8,\n      ),\n      Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 12.0),\n        child: LayoutBuilder(\n          builder: (content, constraints) {\n            double width = constraints.maxWidth;\n            double size = min((width - 28 * 4) / 8, 20);\n            return Row(\n                mainAxisSize: MainAxisSize.max,\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  CircularButton(\n                      icon: getRecordButtonIcon(),\n                      iconPadding: size,\n                      backgroundColor: _getRecordButtonColor(),\n                      onPressed: connected\n                          ? () {\n                              if (TempoTrainer.instance().enable == true) {\n                                TempoTrainer.instance().enable = false;\n                              }\n                              looper.looperRecordPlay();\n                            }\n                          : null),\n                  CircularButton(\n                      icon: Icons.stop,\n                      iconPadding: size,\n                      backgroundColor: Colors.amber,\n                      onPressed: getStopEnabled() ? looper.looperStop : null),\n                  CircularButton(\n                      icon: Icons.clear,\n                      iconPadding: size,\n                      backgroundColor: Colors.amber,\n                      onPressed: getClearEnabled() ? looper.looperClear : null),\n                  CircularButton(\n                      iconPadding: size,\n                      icon: getUndoButtonIcon(),\n                      backgroundColor: _getUndoButtonColor(),\n                      onPressed:\n                          getUndoEnabled() ? looper.looperUndoRedo : null),\n                ]);\n          },\n        ),\n      ),\n      const SizedBox(height: 8),\n      ListTile(\n        enabled: connected,\n        title: const Text(\"Recording\", style: fontSize),\n        trailing: ConstrainedBox(\n          constraints: const BoxConstraints(maxHeight: 40),\n          child: ModeControlRegular(\n            options: const [\"Normal\", \"Auto\"],\n            textStyle: fontSize,\n            selected: looper.loopRecordMode,\n            onSelected: connected\n                ? (index) {\n                    looper.looperNrAr(index == 1);\n                    setState(() {});\n                  }\n                : null,\n          ),\n        ),\n      ),\n      const SizedBox(\n        height: 8,\n      ),\n      ThickSlider(\n        enabled: connected,\n        min: 0,\n        max: 100,\n        maxHeight: widget.smallControls ? 40 : null,\n        activeColor: Colors.blue,\n        label: \"Looper Level\",\n        value: looper.loopLevel.toDouble(),\n        labelFormatter: (val) => val.toInt().toString(),\n        onChanged: (value, skip) {\n          looper.looperLevel(value.toInt());\n          setState(() {});\n        },\n        onDragEnd: (value) {\n          looper.looperLevel(value.toInt());\n          setState(() {});\n        },\n      )\n    ]);\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/tap_buttons.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../../utilities/DelayTapTimer.dart';\nimport 'drumEditor.dart';\n\nclass TapButtons extends StatelessWidget {\n  final NuxDevice device;\n  final Function(double) onTempoModified;\n  final Function(double) onTempoChanged;\n  final bool smallControls;\n  final bool enabled;\n\n  const TapButtons(\n      {super.key,\n      required this.device,\n      required this.onTempoModified,\n      required this.onTempoChanged,\n      required this.smallControls,\n      this.enabled = true});\n\n  void _onTapTempo() {\n    DelayTapTimer.addClickTime();\n    var bpm = DelayTapTimer.calculateBpm();\n    if (bpm != false) {\n      onTempoChanged(bpm);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ConstrainedBox(\n      constraints: BoxConstraints(maxHeight: smallControls ? 45 : 60),\n      child: Row(\n        mainAxisSize: MainAxisSize.max,\n        mainAxisAlignment: MainAxisAlignment.spaceAround,\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          SizedBox(\n            width: 48,\n            child: ElevatedButton(\n              style: ElevatedButton.styleFrom(padding: EdgeInsets.zero),\n              onPressed: enabled ? () => onTempoModified(-5) : null,\n              child:\n                  const Text(\"-5\", semanticsLabel: \"Tempo -5\", softWrap: false),\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 4.0),\n            child: SizedBox(\n              width: 48,\n              child: ElevatedButton(\n                style: ElevatedButton.styleFrom(padding: EdgeInsets.zero),\n                onPressed: enabled ? () => onTempoModified(-1) : null,\n                child: const Text(\"-1\",\n                    semanticsLabel: \"Tempo -1\", softWrap: false),\n              ),\n            ),\n          ),\n          Expanded(\n            child: ElevatedButton(\n              onPressed: enabled ? _onTapTempo : null,\n              style: ButtonStyle(\n                overlayColor: MaterialStateProperty.resolveWith(\n                  (states) {\n                    return states.contains(MaterialState.pressed)\n                        ? Colors.lightBlue[100]\n                        : null;\n                  },\n                ),\n              ),\n              child: const Text(\n                \"Tap Tempo\",\n                style: DrumEditor.fontStyle,\n                textAlign: TextAlign.center,\n              ),\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 4),\n            child: SizedBox(\n              width: 48,\n              child: ElevatedButton(\n                style: ElevatedButton.styleFrom(padding: EdgeInsets.zero),\n                onPressed: enabled ? () => onTempoModified(1) : null,\n                child: const Text(\n                  \"+1\",\n                  softWrap: false,\n                  semanticsLabel: \"Tempo +1\",\n                ),\n              ),\n            ),\n          ),\n          SizedBox(\n            width: 48,\n            child: ElevatedButton(\n              style: ElevatedButton.styleFrom(padding: EdgeInsets.zero),\n              onPressed: enabled ? () => onTempoModified(5) : null,\n              child: const Text(\n                \"+5\",\n                softWrap: false,\n                semanticsLabel: \"Tempo +5\",\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drum_editor/tempoTrainerSheet.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/drumEditor.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/modeControlRegular.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\n\nimport '../../../modules/tempo_trainer.dart';\nimport '../../widgets/thickRangeSlider.dart';\nimport '../../widgets/thickSlider.dart';\n\nclass TempoTrainerSheet extends StatefulWidget {\n  final bool smallControls;\n  final bool overtakeDrums;\n  final bool enabled;\n  const TempoTrainerSheet(\n      {Key? key,\n      required this.smallControls,\n      required this.overtakeDrums,\n      this.enabled = true})\n      : super(key: key);\n\n  @override\n  State<TempoTrainerSheet> createState() => _TempoTrainerSheetState();\n}\n\nclass _TempoTrainerSheetState extends State<TempoTrainerSheet>\n    with SingleTickerProviderStateMixin {\n  final _tempoTrainer = TempoTrainer.instance();\n\n  late AnimationController _animationController;\n  late Animation<double> _animation;\n  @override\n  void initState() {\n    super.initState();\n    _animationController = AnimationController(\n      duration: const Duration(milliseconds: 16),\n      vsync: this,\n    )..repeat();\n    _animation = Tween(begin: 0.0, end: 1.0).animate(_animationController);\n    NuxDeviceControl.instance().addListener(_updateBpm);\n  }\n\n  @override\n  void dispose() {\n    NuxDeviceControl.instance().removeListener(_updateBpm);\n    _animationController.dispose();\n    super.dispose();\n  }\n\n  static const List<String> _dropDownValues = ['Beats', 'Seconds'];\n\n  void _updateBpm() {\n    if (widget.overtakeDrums &&\n        NuxDeviceControl.instance().device.drumsEnabled !=\n            _tempoTrainer.enable) {\n      _tempoTrainer.enable = NuxDeviceControl.instance().device.drumsEnabled;\n    }\n    setState(() {});\n  }\n\n  Widget _progressPlayPauseButton(bool small) {\n    double size = small ? 60 : 80;\n    return Padding(\n      padding: const EdgeInsets.all(8.0),\n      child: Stack(\n        alignment: Alignment.center,\n        children: [\n          SizedBox(\n            width: size,\n            height: size,\n            child: AnimatedBuilder(\n              animation: _animation,\n              builder: (BuildContext context, Widget? child) {\n                double fill = _tempoTrainer.getTimerCountdown();\n                return CircularProgressIndicator(\n                  value: fill,\n                  strokeWidth: 10,\n                  //backgroundColor: Colors.grey[300],\n                  valueColor: const AlwaysStoppedAnimation<Color>(\n                    Colors.green,\n                  ),\n                );\n              },\n            ),\n          ),\n          ElevatedButton(\n            onPressed: !widget.enabled || !NuxDeviceControl().isConnected\n                ? null\n                : () async {\n                    NuxDeviceControl.instance().device.setDrumsEnabled(false);\n                    await Future.delayed(const Duration(milliseconds: 50));\n                    setState(() {\n                      _tempoTrainer.enable = !_tempoTrainer.enable;\n                    });\n                  },\n            style: ElevatedButton.styleFrom(\n              backgroundColor:\n                  _tempoTrainer.enable ? Colors.orange : Colors.green,\n              shape: const CircleBorder(),\n              padding: EdgeInsets.all(small ? 14 : 20),\n            ),\n            child: Icon(_tempoTrainer.enable ? Icons.stop : Icons.play_arrow),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var device = NuxDeviceControl.instance().device;\n    return Column(children: [\n      ThickRangeSlider(\n          maxHeight: widget.smallControls ? 40 : null,\n          min: device.drumsMinTempo,\n          max: device.drumsMaxTempo,\n          enabled: widget.enabled,\n          activeColor: Colors.blue,\n          values: _tempoTrainer.tempoRange,\n          onChanged: (range, skip) {\n            _tempoTrainer.tempoRange = range;\n            setState(() {});\n          },\n          onDragEnd: (value) {\n            _tempoTrainer.saveConfig();\n          },\n          label: 'Tempo Range',\n          labelFormatter: (ranges) =>\n              \"${ranges.start.round()} - ${ranges.end.round()}\"),\n      ListTile(\n        enabled: widget.enabled,\n        contentPadding: const EdgeInsets.symmetric(horizontal: 8),\n        title: const FittedBox(\n          alignment: Alignment.centerLeft,\n          fit: BoxFit.none,\n          child: Text(\n            \"Mode\",\n            style: TextStyle(fontSize: 20),\n          ),\n        ),\n        trailing: ConstrainedBox(\n          constraints: const BoxConstraints(maxHeight: 40),\n          child: ModeControlRegular(\n              options: _dropDownValues,\n              textStyle: DrumEditor.fontStyle,\n              selected: _tempoTrainer.changeMode.index,\n              onSelected: !widget.enabled\n                  ? null\n                  : (index) {\n                      setState(() {\n                        _tempoTrainer.changeMode =\n                            TempoChangeMode.values[index];\n                        _tempoTrainer.saveConfig();\n                      });\n                    }),\n        ),\n      ),\n      ThickSlider(\n          min: 2,\n          max: 100,\n          enabled: widget.enabled,\n          maxHeight: widget.smallControls ? 40 : null,\n          activeColor: Colors.blue,\n          label: \"Increase every\",\n          labelFormatter: (val) {\n            return \"${val.round()} ${_tempoTrainer.changeMode == TempoChangeMode.beat ? \"beats\" : \"seconds\"}\";\n          },\n          value: _tempoTrainer.changeUnits.toDouble(),\n          onChanged: (value, skip) {\n            _tempoTrainer.changeUnits = value.round();\n            setState(() {});\n          },\n          onDragEnd: (value) {\n            _tempoTrainer.saveConfig();\n          }),\n      ThickSlider(\n          min: 1,\n          max: 20,\n          enabled: widget.enabled,\n          maxHeight: widget.smallControls ? 40 : null,\n          activeColor: Colors.blue,\n          label: \"Increase by\",\n          labelFormatter: (val) {\n            return \"${val.round()} bpm\";\n          },\n          value: _tempoTrainer.tempoStep.toDouble(),\n          onChanged: (value, skip) {\n            _tempoTrainer.tempoStep = value.round();\n            setState(() {});\n          },\n          onDragEnd: (value) {\n            _tempoTrainer.saveConfig();\n          }),\n      Row(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: [\n          const Expanded(child: SizedBox.shrink()),\n          _progressPlayPauseButton(widget.smallControls),\n          Expanded(\n            child: Padding(\n              padding: const EdgeInsets.only(left: 8.0),\n              child: Text(\n                _tempoTrainer.enable ? \"${device.drumsTempo.round()} bpm\" : \"\",\n                style: DrumEditor.fontStyle.copyWith(\n                    color: widget.enabled ? Colors.white : Colors.grey[600]),\n              ),\n            ),\n          )\n        ],\n      ),\n    ]);\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/drumsPage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/drum_editor/drumEditor.dart';\n\nclass DrumsPage extends StatelessWidget {\n  const DrumsPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return const SafeArea(\n      child: DrumEditor(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/hotkeysMainPage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/hotkeysSetup.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/features/tuner.dart';\nimport 'package:mighty_plug_manager/midi/ControllerConstants.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nimport '../../bluetooth/devices/features/looper.dart';\n\nclass HotkeysMainPage extends StatelessWidget {\n  final MidiController controller;\n  const HotkeysMainPage({Key? key, required this.controller}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Setup\"),\n      ),\n      body: ListView(\n        children: [\n          ListTile(\n            title: const Text(\"Channel/Preset Hotkeys\"),\n            trailing: const Icon(Icons.keyboard_arrow_right),\n            onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => HotkeysSetup(\n                      controller: controller,\n                      category: HotkeyCategory.Channels,\n                    ))),\n          ),\n          ListTile(\n            title: const Text(\"Effect Hotkeys\"),\n            trailing: const Icon(Icons.keyboard_arrow_right),\n            onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                builder: (context) => HotkeysSetup(\n                      controller: controller,\n                      category: HotkeyCategory.EffectSlots,\n                    ))),\n          ),\n          ListTile(\n              title: const Text(\"Parameter Hotkeys\"),\n              trailing: const Icon(Icons.keyboard_arrow_right),\n              onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => HotkeysSetup(\n                        controller: controller,\n                        category: HotkeyCategory.EffectParameters,\n                      )))),\n          ListTile(\n              title: const Text(\"Drums Hotkeys\"),\n              trailing: const Icon(Icons.keyboard_arrow_right),\n              onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => HotkeysSetup(\n                        controller: controller,\n                        category: HotkeyCategory.Drums,\n                      )))),\n          if (NuxDeviceControl.instance().device is Looper)\n            ListTile(\n                title: const Text(\"Looper Hotkeys\"),\n                trailing: const Icon(Icons.keyboard_arrow_right),\n                onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                    builder: (context) => HotkeysSetup(\n                          controller: controller,\n                          category: HotkeyCategory.Looper,\n                        )))),\n          ListTile(\n              title: const Text(\"JamTracks Hotkeys\"),\n              trailing: const Icon(Icons.keyboard_arrow_right),\n              onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => HotkeysSetup(\n                        controller: controller,\n                        category: HotkeyCategory.JamTracks,\n                      )))),\n          if (NuxDeviceControl.instance().device is Tuner)\n            ListTile(\n                title: const Text(\"Misc Hotkeys\"),\n                trailing: const Icon(Icons.keyboard_arrow_right),\n                onTap: () => Navigator.of(context).push(MaterialPageRoute(\n                    builder: (context) => HotkeysSetup(\n                          controller: controller,\n                          category: HotkeyCategory.Misc,\n                        )))),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/hotkeysSetup.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/hotkeyInput.dart';\nimport 'package:mighty_plug_manager/UI/popups/midiControlInfo.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/MidiControllerHandles.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\nimport 'package:mighty_plug_manager/midi/ControllerConstants.dart';\nimport 'package:mighty_plug_manager/midi/MidiControllerManager.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nclass HotkeysSetup extends StatefulWidget {\n  final MidiController controller;\n  final HotkeyCategory category;\n  const HotkeysSetup(\n      {Key? key, required this.controller, required this.category})\n      : super(key: key);\n\n  @override\n  State createState() => _HotkeysSetupState();\n}\n\nclass _HotkeysSetupState extends State<HotkeysSetup> {\n  Widget buildWidget(String name, IconData? icon, Color? color,\n      HotkeyControl ctrl, int ctrlIndex, int ctrlSubIndex, bool sliderMode,\n      {Function()? infoButton}) {\n    //sliders are not enabled in hid mode\n    bool enabled =\n        !(sliderMode && widget.controller.type == ControllerType.Hid);\n    Widget trailing;\n    var hk =\n        widget.controller.getHotkeyByFunction(ctrl, ctrlIndex, ctrlSubIndex);\n    String key = hk == null ? \"None\" : hk.hotkeyName;\n    if (infoButton == null) {\n      trailing = Text(key);\n    } else {\n      trailing = Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          IconButton(\n              onPressed: infoButton, icon: const Icon(Icons.info_outline)),\n          Text(key)\n        ],\n      );\n    }\n\n    return ListTile(\n        enabled: enabled,\n        leading: Icon(\n          icon,\n          color: color,\n        ),\n        minLeadingWidth: 0,\n        onTap: () {\n          showDialog(\n            context: context,\n            builder: (BuildContext context) => HotkeyInputDialog().buildDialog(\n                context,\n                hotkeyName: name,\n                midiController: widget.controller,\n                ctrl: ctrl,\n                ctrlIndex: ctrlIndex,\n                ctrlSubIndex: ctrlSubIndex,\n                sliderMode: sliderMode),\n          ).then((value) {\n            MidiControllerManager().cancelOnDataOverride();\n            setState(() {});\n          });\n        },\n        title: Text(name),\n        subtitle: enabled ? null : const Text(\"Not supported in HID mode\"),\n        trailing: trailing);\n  }\n\n  List<Widget> _buildChannelWidgets() {\n    List<Widget> widgets = [];\n    widgets.add(buildWidget(\"Previous Channel\", Icons.keyboard_arrow_left, null,\n        HotkeyControl.PreviousChannel, 0, 0, false));\n    widgets.add(buildWidget(\"Next Channel\", Icons.keyboard_arrow_right, null,\n        HotkeyControl.NextChannel, 0, 0, false));\n\n    var colors =\n        NuxDeviceControl.instance().device.presets[0].channelColorsList;\n    for (int i = 0; i < NuxDeviceControl.instance().device.channelsCount; i++) {\n      widgets.add(buildWidget(\"Channel ${i + 1}\", Icons.circle, colors[i],\n          HotkeyControl.ChannelByIndex, i, 0, false));\n    }\n\n    widgets.add(buildWidget(\"Previous Preset\", Icons.keyboard_double_arrow_up,\n        null, HotkeyControl.PreviousPresetGlobal, 0, 0, false));\n    widgets.add(buildWidget(\"Next Preset\", Icons.keyboard_double_arrow_down,\n        null, HotkeyControl.NextPresetGlobal, 0, 0, false));\n    widgets.add(buildWidget(\n        \"Previous Preset in Category\",\n        Icons.keyboard_arrow_up,\n        null,\n        HotkeyControl.PreviousPresetCategory,\n        0,\n        0,\n        false));\n    widgets.add(buildWidget(\n        \"Next Preset in Category\",\n        Icons.keyboard_arrow_down,\n        null,\n        HotkeyControl.NextPresetCategory,\n        0,\n        0,\n        false));\n    return widgets;\n  }\n\n  List<Widget> _buildEffectsWidgets() {\n    List<Widget> widgets = [];\n    var dev = NuxDeviceControl.instance().device;\n    for (int i = 0; i < dev.processorList.length; i++) {\n      var fxid = dev.processorList[i].nuxFXID;\n      var slot = dev.getPreset(dev.selectedChannel).getSlotFromFXID(fxid)!;\n      //var count =\n      //    dev.getPreset(dev.selectedChannel).getEffectsForSlot(prc).length;\n      //var index = fxid.toInt();\n\n      var name = dev.processorList[i].longName;\n      var icon = dev.processorList[i].icon;\n      var color = dev.processorList[i].color;\n\n      var switchable = dev.getPreset(dev.selectedChannel).slotSwitchable(slot);\n      var effects = dev.getPreset(dev.selectedChannel).getEffectsForSlot(slot);\n      var fx = effects[0];\n      if (switchable) {\n        widgets.add(buildWidget(\n            \"Switch $name on\",\n            icon,\n            color,\n            HotkeyControl.EffectSlotEnable,\n            fx.midiControlOn!.id.index,\n            0,\n            false));\n        widgets.add(buildWidget(\n            \"Switch $name off\",\n            icon,\n            color,\n            HotkeyControl.EffectSlotDisable,\n            fx.midiControlOff!.id.index,\n            0,\n            false));\n        widgets.add(buildWidget(\n            \"Toggle $name\",\n            icon,\n            color,\n            HotkeyControl.EffectSlotToggle,\n            fx.midiControlToggle!.id.index,\n            0,\n            false));\n      }\n      if (effects.length > 1) {\n        widgets.add(buildWidget(\n            \"Previous $name\",\n            icon,\n            color,\n            HotkeyControl.EffectDecrement,\n            fx.midiControlPrev!.id.index,\n            0,\n            false));\n        widgets.add(buildWidget(\n            \"Next $name\",\n            icon,\n            color,\n            HotkeyControl.EffectIncrement,\n            fx.midiControlNext!.id.index,\n            0,\n            false));\n      }\n    }\n\n    return widgets;\n  }\n\n  List<Widget> _buildParametersWidgets() {\n    List<Widget> widgets = [];\n    var dev = NuxDeviceControl.instance().device;\n\n    //add master volume\n    widgets.add(buildWidget(\"Volume\", Icons.volume_up, Colors.white,\n        HotkeyControl.MasterVolumeSet, 0, 0, true,\n        infoButton: null));\n\n    List<MidiControllerHandle> effectHandles = [];\n    //enumerate all the slots in the signal chain\n    for (int i = 0; i < dev.processorList.length; i++) {\n      effectHandles.clear();\n      var fxid = dev.processorList[i].nuxFXID;\n      var prc = dev.getPreset(dev.selectedChannel).getSlotFromFXID(fxid)!;\n      var effects = dev.getPreset(dev.selectedChannel).getEffectsForSlot(prc);\n      for (int p = 0; p < effects.length; p++) {\n        for (var param in effects[p].parameters) {\n          if (param.midiControllerHandle != null &&\n              !effectHandles.contains(param.midiControllerHandle)) {\n            effectHandles.add(param.midiControllerHandle!);\n          }\n        }\n      }\n\n      var name = dev.processorList[i].longName;\n      var icon = dev.processorList[i].icon;\n      var color = dev.processorList[i].color;\n      for (var handle in effectHandles) {\n        var title = \"$name ${handle.label}\";\n\n        widgets.add(buildWidget(title, icon, color, HotkeyControl.ParameterSet,\n            handle.id.index, 0, true,\n            infoButton: () => _displayParameterInfo(effects, handle.id)));\n\n        if (handle.id == ControllerHandleId.delayTime) {\n          widgets.add(buildWidget(\"$name Tap Tempo\", icon, color,\n              HotkeyControl.DelayTapTempo, handle.id.index, 0, false,\n              infoButton: null));\n        }\n      }\n    }\n\n    return widgets;\n  }\n\n  List<Widget> _buildWidgetsRange(HotkeyControl from, HotkeyControl to) {\n    List<Widget> widgets = [];\n    for (int i = from.index; i <= to.index; i++) {\n      HotkeyControl cat = HotkeyControl.values[i];\n      widgets.add(\n          buildWidget(cat.label!, cat.icon, null, cat, 0, 0, cat.sliderMode));\n    }\n\n    return widgets;\n  }\n\n  _displayParameterInfo(List<Processor> effects, ControllerHandleId handleId) {\n    showDialog(\n      context: context,\n      builder: (BuildContext context) => MidiControlInfoDialog()\n          .buildDialog(context, effects: effects, handleId: handleId),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<Widget> widgetList = [];\n    String title = \"\";\n\n    switch (widget.category) {\n      case HotkeyCategory.Channels:\n        widgetList = _buildChannelWidgets();\n        title = \"Channel Hotkeys\";\n        break;\n      case HotkeyCategory.EffectSlots:\n        widgetList = _buildEffectsWidgets();\n        title = \"Effect Hotkeys\";\n        break;\n      case HotkeyCategory.EffectParameters:\n        widgetList = _buildParametersWidgets();\n        title = \"Parameter Hotkeys\";\n        break;\n      case HotkeyCategory.Drums:\n        title = \"Drums Hotkeys\";\n        widgetList = _buildWidgetsRange(\n            HotkeyControl.DrumsStartStop, HotkeyControl.DrumsNextStyle);\n        break;\n      case HotkeyCategory.Looper:\n        title = \"Looper Hotkeys\";\n        widgetList = _buildWidgetsRange(\n            HotkeyControl.LooperRecord, HotkeyControl.LooperLevel);\n        break;\n      case HotkeyCategory.JamTracks:\n        title = \"JamTracks Hotkeys\";\n        widgetList = _buildWidgetsRange(\n            HotkeyControl.JamTracksPlayPause, HotkeyControl.JamTracksABRepeat);\n        break;\n      case HotkeyCategory.Misc:\n        title = \"Misc Hotkeys\";\n        widgetList = _buildWidgetsRange(\n            HotkeyControl.ToggleTuner, HotkeyControl.ToggleTuner);\n    }\n\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(title),\n      ),\n      body: ListView(\n        children: widgetList,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/jamTracks.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\n//import 'package:audio_picker/audio_picker.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/setlistPage.dart';\nimport 'package:mighty_plug_manager/audio/setlistsPage.dart';\nimport 'package:mighty_plug_manager/audio/trackdata/trackData.dart';\nimport 'package:mighty_plug_manager/audio/tracksPage.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:permission_handler/permission_handler.dart';\n\nimport '../../audio/models/setlist.dart';\nimport '../../audio/setlist_player/setlistPlayerState.dart';\nimport '../../audio/widgets/jamtracksView.dart';\nimport '../../platform/platformUtils.dart';\nimport '../widgets/common/nestedWillPopScope.dart';\n\nclass JamTracks extends StatefulWidget {\n  const JamTracks({Key? key}) : super(key: key);\n\n  static final GlobalKey<NavigatorState> jamtracksNavigator = GlobalKey();\n\n  @override\n  State createState() => _JamTracksState();\n}\n\nclass _JamTracksState extends State<JamTracks>\n    with TickerProviderStateMixin, AutomaticKeepAliveClientMixin<JamTracks> {\n  late TabController cntrl;\n\n  final SetlistPlayerState playerState = SetlistPlayerState.instance();\n  Permission? _mediaPermission;\n  @override\n  void initState() {\n    super.initState();\n\n    DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();\n    if (PlatformUtils.isAndroid) {\n      deviceInfoPlugin.androidInfo.then((androidInfo) {\n        int sdk = androidInfo.version.sdkInt;\n        if (sdk < 33) {\n          _mediaPermission = Permission.storage;\n        } else {\n          _mediaPermission = Permission.audio;\n        }\n        setState(() {});\n      });\n    } else if (PlatformUtils.isIOS) {\n      _mediaPermission = Permission.storage;\n    }\n\n    cntrl = TabController(length: 2, vsync: this);\n\n    cntrl.addListener(() {\n      if (cntrl.index == 0) setState(() {});\n    });\n\n    PresetsStorage().waitLoading().then((value) {\n      TrackData().waitLoading().then((value) {\n        if (mounted) setState(() {});\n      });\n    });\n\n    playerState.addListener(onPlayerStateChange);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    cntrl.dispose();\n    playerState.removeListener(onPlayerStateChange);\n  }\n\n  void onPlayerStateChange() {\n    setState(() {});\n  }\n\n  Widget showSetlists() {\n    var innerContext = JamTracks.jamtracksNavigator.currentContext!;\n\n    return Setlists(\n      onAllTracksSelect: () {\n        Navigator.pushNamed(innerContext, '/setlist',\n            arguments: SetlistArguments(TrackData().allTracks, true));\n      },\n      onSetlistSelect: (setlist) {\n        Navigator.pushNamed(innerContext, '/setlist',\n                arguments: SetlistArguments(setlist, false))\n            .then((value) => onPlayerStateChange());\n      },\n    );\n  }\n\n  Widget mainView() {\n    return Navigator(\n      key: JamTracks.jamtracksNavigator,\n      onGenerateRoute: (settings) {\n        if (settings.name == '/') {\n          return MaterialPageRoute(\n            builder: (context) {\n              return Column(\n                children: [\n                  TabBar(\n                    tabs: const [Tab(text: \"Setlists\"), Tab(text: \"Tracks\")],\n                    controller: cntrl,\n                  ),\n                  Expanded(\n                    child: TabBarView(\n                      controller: cntrl,\n                      children: [\n                        showSetlists(),\n                        const TracksPage(),\n                      ],\n                    ),\n                  ),\n                ],\n              );\n            },\n          );\n        } else if (settings.name == \"/setlist\") {\n          return MaterialPageRoute(\n            builder: (context) {\n              final SetlistArguments arguments =\n                  settings.arguments as SetlistArguments;\n              return SetlistPage(\n                setlist: arguments.setlist,\n                readOnly: arguments.readOnly,\n              );\n            },\n          );\n        }\n        return null;\n      },\n    );\n  }\n\n  Widget _permissionInfo() {\n    return Center(\n      child: Padding(\n        padding: const EdgeInsets.all(20.0),\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const Text(\n                textAlign: TextAlign.center,\n                \"To access your music files and play along to your favorite songs, the app requires permission to access your device's media library.\"),\n            const SizedBox(\n              height: 30,\n            ),\n            SizedBox(\n              height: 60,\n              child: ElevatedButton(\n                child: const Text(\"Grant access to Media Library \"),\n                onPressed: () async {\n                  Stopwatch stopwatch = Stopwatch()..start();\n                  var status = await _mediaPermission!.request();\n                  stopwatch.stop();\n\n                  if (status == PermissionStatus.permanentlyDenied &&\n                      stopwatch.elapsedMilliseconds < 500) {\n                    await openAppSettings();\n                  }\n                  setState(() {});\n                },\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _jamtracksWidget() {\n    return NestedWillPopScope(\n        onWillPop: () {\n          if (playerState.expanded) {\n            playerState.toggleExpanded();\n            return Future.value(false);\n          } else if (JamTracks.jamtracksNavigator.currentState?.canPop() ??\n              false) {\n            JamTracks.jamtracksNavigator.currentState?.pop();\n            return Future.value(false);\n          }\n\n          return Future.value(true);\n        },\n        child: JamtracksView(child: mainView()));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return SafeArea(\n      child: FutureBuilder<PermissionStatus>(\n        future: _mediaPermission?.status,\n        builder:\n            (BuildContext context, AsyncSnapshot<PermissionStatus> snapshot) {\n          if (snapshot.hasData) {\n            switch (snapshot.data) {\n              case PermissionStatus.denied:\n                return _permissionInfo();\n              case PermissionStatus.granted:\n                return _jamtracksWidget();\n              default:\n                return const Text(\"Permission declined\");\n            }\n          }\n          return const SizedBox();\n        },\n      ),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n\nclass SetlistArguments {\n  final Setlist setlist;\n  final bool readOnly;\n\n  SetlistArguments(this.setlist, this.readOnly);\n}\n"
  },
  {
    "path": "lib/UI/pages/midiControllers.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/hotkeysMainPage.dart';\nimport 'package:mighty_plug_manager/UI/theme.dart';\nimport 'package:mighty_plug_manager/UI/widgets/MidiDeviceTile.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\nimport 'package:mighty_plug_manager/midi/MidiControllerManager.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nimport '../../bluetooth/ble_controllers/BLEController.dart';\n\nclass MidiControllers extends StatefulWidget {\n  const MidiControllers({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _MidiControllersState();\n}\n\nclass _MidiControllersState extends State<MidiControllers> {\n  final ctrl = MidiControllerManager();\n  final midiHandler = BLEMidiHandler.instance();\n  @override\n  void initState() {\n    super.initState();\n    MidiControllerManager().addListener(onControllersUpdate);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    MidiControllerManager().removeListener(onControllersUpdate);\n  }\n\n  onControllersUpdate() {\n    setState(() {});\n  }\n\n  _onControllerSettings(MidiController controller) {\n    Navigator.of(context).push(MaterialPageRoute(\n        builder: (context) => HotkeysMainPage(\n              controller: controller,\n            )));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"MIDI/HID Remote Control\"),\n      ),\n      body: StreamBuilder<MidiSetupStatus>(\n          stream: midiHandler.status,\n          builder: (context, snapshot) {\n            return Column(\n              crossAxisAlignment: CrossAxisAlignment.center,\n              children: [\n                ListTile(\n                  title: Text(\"Available Devices\",\n                      style: AppThemeConfig.ListTileHeaderStyle),\n                  dense: true,\n                  trailing: !ctrl.isScanning\n                      ? null\n                      : const SizedBox(\n                          width: 15,\n                          height: 15,\n                          child: CircularProgressIndicator.adaptive()),\n                ),\n                Flexible(\n                  child: ConstrainedBox(\n                    constraints: const BoxConstraints(maxHeight: 250),\n                    child: ListView.builder(\n                      itemBuilder: (context, index) {\n                        var dev = ctrl.controllers[index];\n                        return MidiControllerTile(\n                          controller: dev,\n                          onTap: () async {\n                            if (!dev.connected) {\n                              await dev.connect();\n                              setState(() {});\n                            } else {\n                              _onControllerSettings(dev);\n                            }\n                          },\n                          onSettings: () => _onControllerSettings(dev),\n                        );\n                      },\n                      itemCount: ctrl.controllers.length,\n                    ),\n                  ),\n                ),\n                ElevatedButton(\n                    onPressed: ctrl.isScanning ? ctrl.stopScan : ctrl.startScan,\n                    child: !ctrl.isScanning\n                        ? const Text(\"Start Scanning\")\n                        : const Text(\"Stop Scanning\")),\n                if (midiHandler.bleState == BleState.off)\n                  const Text(\"Enable Bluetooth to discover BLE MIDI devices\"),\n                const Divider(),\n              ],\n            );\n          }),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/mighty_patches_importer.dart",
    "content": "// import the necessary packages\n/*\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/savePreset.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:webview_flutter/webview_flutter.dart';\nimport 'package:http/http.dart' as http;\nimport 'package:qr_utils/qr_utils.dart';\n\n// create a stateful widget for the page\nclass MightyPatchesPage extends StatefulWidget {\n  const MightyPatchesPage({super.key});\n\n  @override\n  _MightyPatchesPageState createState() => _MightyPatchesPageState();\n}\n\n// create the state class for the widget\nclass _MightyPatchesPageState extends State<MightyPatchesPage> {\n// create a web view controller\n  late WebViewController _controller;\n  bool _fromAppBar = false;\n\n  @override\n  void initState() {\n    super.initState();\n\n    _fromAppBar = false;\n\n    _controller = WebViewController()\n      ..setJavaScriptMode(JavaScriptMode.unrestricted)\n      ..enableZoom(false)\n      ..setNavigationDelegate(NavigationDelegate(\n        onPageFinished: (url) {\n          _registerDOMChanged();\n        },\n        onProgress: (progress) {\n          _addImportButtons();\n        },\n      ))\n      ..addJavaScriptChannel(\n        \"flutter_inappwebview\",\n        onMessageReceived: (message) {\n          // Handle the message received from JavaScript\n          String jsonMessage = message.message;\n          Map<String, dynamic> data = json.decode(jsonMessage);\n          // Extract title and URL from the JSON data\n          String title = data['title'];\n          String imageUrl = data['imageUrl'];\n\n          // Call your Flutter method with the title and image URL\n          _importImage(imageUrl, title);\n        },\n      )\n      ..addJavaScriptChannel(\"flutter_domchange\", onMessageReceived: (message) {\n        print(\"DOM Changed\");\n        _addImportButtons();\n      });\n    _home();\n  }\n\n  void _home() {\n    _controller.loadRequest(Uri.parse('https://www.mightypatches.com/'));\n  }\n\n  void _registerDOMChanged() {\n    const String script = '''\n    var observeDOM = (function(){\n        var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n        return function( obj, callback ) {\n          if( !obj || obj.nodeType !== 1 ) return; \n\n          if( MutationObserver ){\n            // define a new observer\n            var mutationObserver = new MutationObserver(callback)\n\n            // have the observer observe for changes in children\n            mutationObserver.observe( obj, { childList:true, subtree:true })\n            return mutationObserver\n          }\n          \n          // browser support fallback\n          else if( window.addEventListener ){\n            obj.addEventListener('DOMNodeInserted', callback, false)\n            obj.addEventListener('DOMNodeRemoved', callback, false)\n          }\n        }\n      })()\n\n      var observed = document.querySelector(\".page-content, [data-elementor-type=single-post]\");\n\n      observeDOM(observed, function(m){\n        flutter_domchange.postMessage(\"\");\n      });\n    ''';\n\n    _controller.runJavaScript(script);\n  }\n\n  void _addImportButtons() async {\n    // Evaluate JavaScript to find elements and add import buttons\n    const String script = '''\n\n      function getSmallestSizeImageUrl(srcset) {\n        // Split the srcset into individual URL-width pairs\n        const pairs = srcset.split(',').map(pair => pair.trim().split(' '));\n\n        // Find the pair with the smallest width\n        const smallestPair = pairs.reduce((smallest, current) => {\n          const currentWidth = parseInt(current[1], 10);\n          const smallestWidth = parseInt(smallest[1], 10);\n          return currentWidth < smallestWidth ? current : smallest;\n        }, pairs[0]);\n\n        // Return the URL from the smallest pair\n        return smallestPair[0];\n      }\n\n      var elements = document.querySelectorAll(\".page-content [data-elementor-type=jet-listing-items]:not(:has(.import-button)), [data-elementor-type=single-post]:not(:has(.import-button))\");\n      elements.forEach(function(element) {\n        var imageWidget = element.querySelector(\".elementor-widget-image\");\n        var imgElement = imageWidget.querySelector(\"img\");\n        //var imageUrl = imgElement.src;\n        const srcset = imgElement.getAttribute('srcset');\n        const imageUrl = getSmallestSizeImageUrl(srcset);\n\n        var titleElement = element.querySelector(\".elementor-page-title .elementor-heading-title,.page-content .elementor-heading-title\");\n        var title = titleElement.textContent;\n        \n        var importButton = document.createElement(\"a\");\n        importButton.href = \"javascript:void(0);\"; // Placeholder href, you can change this\n        importButton.className = \"import-button\";\n        importButton.style.position = \"absolute\";\n        importButton.style.bottom = \"0\";\n        importButton.style.right = \"0\";\n        importButton.style.width = \"50%\";\n        importButton.style.height = \"50px\";\n        importButton.style.backgroundColor = \"blue\";\n        importButton.style.color = \"white\";\n        importButton.style.display = \"flex\";\n        importButton.style.alignItems = \"center\";\n        importButton.style.justifyContent = \"center\";\n        importButton.innerHTML = \"Import\";\n        \n        importButton.onclick = function() {\n          // Send title and image URL to Flutter using the JavascriptChannel\n          var data = {\n            \"title\": title,\n            \"imageUrl\": imageUrl\n          };\n          flutter_inappwebview.postMessage(JSON.stringify(data));\n        };\n        \n        imageWidget.appendChild(importButton);\n      });\n    ''';\n\n    _controller.runJavaScript(script);\n  }\n\n// create a method to handle the import button click\n  void _importImage(String imageUrl, String imageName) async {\n// get the image data from the url using http stream\n    print(\"opening stream\");\n    http.StreamedResponse response =\n        await http.Client().send(http.Request('GET', Uri.parse(imageUrl)));\n    print(\"Reading stream\");\n// get the byte data from the response stream\n    List<int> byteData = await response.stream.toBytes();\n\n    print(\"decoding QR\");\n// scan the image data using qr utils\n    String? qrData = await QrUtils.scanImageFromData(byteData);\n\n    print(\"Showing data\");\n// do something with the qr data, such as showing a dialog\n\n    if (qrData != null) {\n      var device = NuxDeviceControl.instance().device;\n\n      var preset = device.setupDetachedPresetFromQRData(qrData);\n      var saveDialog = SavePresetDialog(\n          customName: imageName,\n          customPreset: preset,\n          device: device,\n          confirmColor: Theme.of(context).hintColor);\n      showDialog(\n        context: context,\n        builder: (BuildContext context) =>\n            saveDialog.buildDialog(device, context),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () async {\n        if (_fromAppBar) return true;\n        if (await _controller.canGoBack()) {\n          _controller.goBack();\n          return false;\n        }\n        return true;\n      },\n      child: SafeArea(\n        child: Scaffold(\n            appBar: AppBar(\n              title: const Text('Mighty Patches'),\n              leading: IconButton(\n                icon: Icon(Icons.adaptive.arrow_back),\n                onPressed: () {\n                  // Set the flag to true before popping the navigation\n                  _fromAppBar = true;\n\n                  Navigator.of(context).pop();\n                },\n              ),\n              actions: [\n                IconButton(onPressed: _home, icon: const Icon(Icons.home))\n              ],\n            ),\n            body: WebViewWidget(controller: _controller)),\n      ),\n    );\n  }\n}\n*/"
  },
  {
    "path": "lib/UI/pages/presetEditor.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport '../popups/savePreset.dart';\nimport '../utils.dart';\nimport '../widgets/presets/channelSelector.dart';\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../widgets/presets/trackEventsBlockInfo.dart';\nimport '../widgets/rounded_icon_button.dart';\n\nclass PresetEditor extends StatefulWidget {\n  const PresetEditor({super.key});\n  @override\n  _PresetEditorState createState() => _PresetEditorState();\n}\n\nclass _PresetEditorState extends State<PresetEditor> {\n  late NuxDevice device;\n\n  @override\n  void initState() {\n    super.initState();\n    device = NuxDeviceControl.instance().device;\n    device.addListener(onDeviceDataChanged);\n    NuxDeviceControl.instance().addListener(onDeviceChanged);\n    SetlistPlayerState.instance().addListener(onJamTracksStateChange);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    device.removeListener(onDeviceDataChanged);\n    NuxDeviceControl.instance().removeListener(onDeviceChanged);\n    SetlistPlayerState.instance().removeListener(onJamTracksStateChange);\n  }\n\n  void onDeviceChanged() {\n    if (device != NuxDeviceControl.instance().device) {\n      device.removeListener(onDeviceDataChanged);\n      device = NuxDeviceControl.instance().device;\n      device.addListener(onDeviceDataChanged);\n    }\n    setState(() {});\n  }\n\n  void onJamTracksStateChange() {\n    setState(() {});\n  }\n\n  void savePresetToDevice() {\n    if (device.deviceControl.isConnected) {\n      AlertDialogs.showConfirmDialog(context,\n          title: \"Save preset to device\",\n          cancelButton: \"Cancel\",\n          confirmButton: \"Save\",\n          confirmColor: Colors.red,\n          description: \"Are you sure?\", onConfirm: (val) {\n        if (val) device.saveNuxPreset();\n      });\n    }\n  }\n\n  void onDeviceDataChanged() {\n    setState(() {});\n  }\n\n  Widget wrapContainer(bool isExpanded, List<Widget> children) {\n    if (isExpanded) {\n      return ConstrainedBox(\n        constraints: const BoxConstraints(minHeight: 592),\n        child: Column(children: children),\n      );\n    } else {\n      return ListView(children: children);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var layout = getEditorLayoutMode(MediaQuery.of(context));\n\n    bool uploadPresetEnabled =\n        device.deviceControl.isConnected && device.presetSaveSupport;\n\n    Widget ui = SafeArea(\n      child: wrapContainer(\n        layout == EditorLayoutMode.expand,\n        [\n          Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 8.0),\n            child: ButtonTheme(\n              minWidth: 55,\n              height: 45,\n              buttonColor: Colors.blue,\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  Row(\n                    children: [\n                      RoundedIconButton(\n                        onPressed: NuxDeviceControl.instance().changes.canUndo\n                            ? () {\n                                var changes =\n                                    NuxDeviceControl.instance().changes;\n                                if (changes.canUndo) changes.undo();\n                                setState(() {});\n                              }\n                            : null,\n                        tooltip: \"Undo\",\n                        icon: const Icon(Icons.undo),\n                      ),\n                      const SizedBox(\n                        width: 2,\n                      ),\n                      RoundedIconButton(\n                        onPressed: NuxDeviceControl.instance().changes.canRedo\n                            ? () {\n                                var changes =\n                                    NuxDeviceControl.instance().changes;\n                                if (changes.canRedo) changes.redo();\n                                setState(() {});\n                              }\n                            : null,\n                        icon: const Icon(Icons.redo),\n                        tooltip: \"Redo\",\n                        //padding: EdgeInsets.zero,\n                      ),\n                    ],\n                  ),\n                  Row(\n                    children: [\n                      ToggleButtons(\n                        constraints: const BoxConstraints(\n                            minWidth: 55,\n                            maxWidth: 55,\n                            minHeight: 45,\n                            maxHeight: 45),\n                        isSelected: [\n                          !NuxDeviceControl.instance().changes.canUndo\n                        ],\n                        selectedBorderColor: Colors.transparent,\n                        borderColor: Colors.blue,\n                        borderRadius: BorderRadius.circular(3),\n                        color: Colors.white,\n                        fillColor: Colors.blue,\n                        disabledColor: Colors.grey,\n                        onPressed:\n                            NuxDeviceControl.instance().changes.canUndo ||\n                                    NuxDeviceControl.instance().changes.canRedo\n                                ? (val) {\n                                    var changes =\n                                        NuxDeviceControl.instance().changes;\n                                    if (changes.canUndo) {\n                                      //we can go back (that's bad though)\n                                      while (changes.canUndo) {\n                                        changes.undo();\n                                      }\n                                    } else {\n                                      while (changes.canRedo) {\n                                        changes.redo();\n                                      }\n                                    }\n                                    setState(() {});\n                                  }\n                                : null,\n                        children: const [\n                          Tooltip(\n                              message: \"Switch before/after\",\n                              child: Icon(Icons.compare))\n                        ],\n                      )\n                    ],\n                  ),\n                  Row(\n                    children: [\n                      Row(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          RoundedIconButton(\n                            tooltip: \"Save to device\",\n                            onPressed: !uploadPresetEnabled\n                                ? null\n                                : savePresetToDevice,\n                            icon: const Icon(Icons.save_alt),\n                          ),\n                          const SizedBox(\n                            width: 2,\n                          ),\n                          RoundedIconButton(\n                            tooltip: \"Save as preset\",\n                            icon: const Icon(Icons.playlist_add),\n                            onPressed: () {\n                              var saveDialog = SavePresetDialog(\n                                  device: device,\n                                  confirmColor: Theme.of(context).hintColor);\n                              showDialog(\n                                context: context,\n                                builder: (BuildContext context) =>\n                                    saveDialog.buildDialog(device, context),\n                              );\n                            },\n                          )\n                        ],\n                      ),\n                    ],\n                  )\n                ],\n              ),\n            ),\n          ),\n          if (layout == EditorLayoutMode.expand)\n            Flexible(child: ChannelSelector(device: device))\n          else\n            ChannelSelector(device: device)\n        ],\n      ),\n    );\n\n    var sps = SetlistPlayerState.instance();\n    if (sps.state != PlayerState.play ||\n        (sps.automation?.presetChangeEventsAvailable == false)) {\n      return ui;\n    } else {\n      return TrackEventsBlockInfo(\n        onBypass: () {\n          setState(() {});\n        },\n        child: ui,\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/settings.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\nimport 'package:wakelock_plus/wakelock_plus.dart';\n\nimport '../../bluetooth/NuxDeviceControl.dart';\nimport '../../bluetooth/bleMidiHandler.dart';\nimport '../../bluetooth/ble_controllers/BLEController.dart';\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../../bluetooth/devices/features/tuner.dart';\nimport '../../platform/simpleSharedPrefs.dart';\nimport '../mightierIcons.dart';\nimport '../widgets/deviceList.dart';\nimport 'DebugConsolePage.dart';\nimport 'developerPage.dart';\nimport 'midiControllers.dart';\nimport 'settings_advanced.dart';\nimport 'tunerPage.dart';\n\nenum TimeUnit { BPM, Seconds }\n\nconst _timeUnit = [\"BPM\", \"Seconds\"];\n\nclass Settings extends StatefulWidget {\n  static bool devMode = false;\n  static String output = \"\";\n\n  const Settings({Key? key}) : super(key: key);\n\n  static void print(String value) {\n    if (output.isNotEmpty) output += \"\\n\";\n    output += value;\n  }\n\n  @override\n  State<Settings> createState() => _SettingsState();\n}\n\nclass _SettingsState extends State<Settings> {\n  late final BLEMidiHandler midiHandler;\n  String _version = \"\";\n  int devCounter = 0;\n\n  @override\n  void initState() {\n    super.initState();\n    NuxDeviceControl.instance().addListener(_deviceChanged);\n    midiHandler = BLEMidiHandler.instance();\n\n    PackageInfo.fromPlatform().then((PackageInfo packageInfo) {\n      setState(() {\n        _version = packageInfo.version;\n      });\n    });\n  }\n\n  @override\n  void dispose() {\n    NuxDeviceControl.instance().removeListener(_deviceChanged);\n    super.dispose();\n  }\n\n  void _deviceChanged() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final NuxDevice device = NuxDeviceControl.instance().device;\n    List<String> items = Settings.output.split('\\n');\n    return SafeArea(\n      child: ListView(\n        children: [\n          if (kDebugMode)\n            ConstrainedBox(\n              constraints: const BoxConstraints(maxHeight: 200),\n              child: ListView.builder(\n                shrinkWrap: true,\n                itemBuilder: (context, index) {\n                  return Text(items[index]);\n                },\n                itemCount: items.length,\n              ),\n            ),\n          ListTileTheme(\n            minLeadingWidth: 0,\n            iconColor: Colors.white,\n            child: Column(\n              children: [\n                SwitchListTile(\n                  title: const Text(\"Keep Screen On\"),\n                  value: SharedPrefs()\n                      .getValue(SettingsKeys.screenAlwaysOn, false),\n                  onChanged: (val) {\n                    setState(() {\n                      WakelockPlus.toggle(enable: val);\n                      SharedPrefs().setValue(SettingsKeys.screenAlwaysOn, val);\n                    });\n                  },\n                ),\n                ListTile(\n                  title: const Text(\"Delay Time Unit\"),\n                  subtitle: Text(_timeUnit[SharedPrefs()\n                      .getValue(SettingsKeys.timeUnit, TimeUnit.BPM.index)]),\n                  trailing: const Icon(Icons.keyboard_arrow_right),\n                  onTap: () {\n                    var dialog = AlertDialogs.showOptionDialog(context,\n                        confirmButton: \"OK\",\n                        cancelButton: \"Cancel\",\n                        title: \"Delay Time Unit\",\n                        confirmColor: Theme.of(context).hintColor,\n                        value: SharedPrefs().getValue(\n                            SettingsKeys.timeUnit, TimeUnit.BPM.index),\n                        options: _timeUnit, onConfirm: (changed, newValue) {\n                      if (changed) {\n                        setState(() {\n                          SharedPrefs()\n                              .setValue(SettingsKeys.timeUnit, newValue);\n                        });\n                      }\n                    });\n                    showDialog(\n                      context: context,\n                      builder: (BuildContext context) => dialog,\n                    );\n                  },\n                ),\n                ListTile(\n                  enabled: !device.deviceControl.isConnected,\n                  title: const Text(\"Device\"),\n                  subtitle: Text(device.productName),\n                  trailing: const Icon(Icons.keyboard_arrow_right),\n                  onTap: () {\n                    var dialog = AlertDialogs.showOptionDialog(context,\n                        confirmButton: \"OK\",\n                        cancelButton: \"Cancel\",\n                        title: \"Select Device\",\n                        confirmColor: Theme.of(context).hintColor,\n                        value: NuxDeviceControl.instance().deviceIndex,\n                        options: NuxDeviceControl.instance().deviceNameList,\n                        onConfirm: (changed, newValue) {\n                      if (changed) {\n                        NuxDeviceControl.instance().deviceIndex = newValue;\n                        setState(() {});\n                      }\n                    });\n                    showDialog(\n                      context: context,\n                      builder: (BuildContext context) => dialog,\n                    );\n                  },\n                ),\n                if (device.getAvailableVersions() > 1)\n                  ListTile(\n                    enabled: !device.deviceControl.isConnected,\n                    title: const Text(\"Firmware Version\"),\n                    subtitle: Text(\n                        device.getProductNameVersion(device.productVersion)),\n                    trailing: const Icon(Icons.keyboard_arrow_right),\n                    onTap: () {\n                      var dialog = AlertDialogs.showOptionDialog(context,\n                          confirmButton: \"OK\",\n                          cancelButton: \"Cancel\",\n                          title: \"Select Version\",\n                          confirmColor: Theme.of(context).hintColor,\n                          value:\n                              NuxDeviceControl.instance().deviceFirmwareVersion,\n                          options:\n                              NuxDeviceControl.instance().deviceVersionsList,\n                          onConfirm: (changed, newValue) {\n                        if (changed) {\n                          NuxDeviceControl.instance().deviceFirmwareVersion =\n                              newValue;\n                          setState(() {});\n                        }\n                      });\n                      showDialog(\n                        context: context,\n                        builder: (BuildContext context) => dialog,\n                      );\n                    },\n                  ),\n                //Automatically set matching cabinet when changing an amp\n                CheckboxListTile(\n                    title: const Text(\"Set matching cabinets automatically\"),\n                    value:\n                        SharedPrefs().getInt(SettingsKeys.changeCabs, 1) != 0,\n                    onChanged: (value) {\n                      setState(() {\n                        if (value != null) {\n                          SharedPrefs()\n                              .setInt(SettingsKeys.changeCabs, value ? 1 : 0);\n                        }\n                      });\n                    }),\n                const Divider(),\n                if (device.deviceControl.isConnected &&\n                    device is Tuner &&\n                    (device as Tuner).tunerAvailable)\n                  ListTile(\n                    leading: const Icon(MightierIcons.tuner),\n                    title: const Text(\"Tuner\"),\n                    trailing: const Icon(Icons.keyboard_arrow_right),\n                    onTap: () {\n                      Navigator.of(context).push(MaterialPageRoute(\n                          builder: (context) => TunerPage(\n                                device: device,\n                              )));\n                    },\n                  ),\n                device.getSettingsWidget(),\n                ListTile(\n                  title: const Text(\"Remote Control\"),\n                  subtitle:\n                      const Text(\"Use a MIDI/HID device to control the amp\"),\n                  trailing: const Icon(Icons.keyboard_arrow_right),\n                  onTap: () {\n                    Navigator.of(context).push(MaterialPageRoute(\n                        builder: (context) => const MidiControllers()));\n                  },\n                ),\n              ],\n            ),\n          ),\n          if (midiHandler.permissionGranted)\n            StreamBuilder<MidiSetupStatus>(\n                stream: midiHandler.status,\n                builder: (BuildContext context, snapshot) {\n                  return StreamBuilder<bool>(\n                      builder: (BuildContext context, snapshot) {\n                        var btOn = midiHandler.bleState == BleState.on;\n                        if (!btOn) {\n                          return const ListTile(\n                            title: Text(\"Please, turn Bluetooth on!\"),\n                          );\n                        }\n                        bool scanning = midiHandler.isScanning;\n                        bool connected =\n                            NuxDeviceControl.instance().isConnected;\n\n                        return Column(\n                          children: [\n                            Padding(\n                              padding: const EdgeInsets.all(8.0),\n                              child: Container(\n                                decoration: BoxDecoration(\n                                    border: Border.all(color: Colors.grey)),\n                                height: 150,\n                                child: DeviceList(),\n                              ),\n                            ),\n                            Row(\n                              mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                              children: [\n                                ElevatedButton(\n                                  onPressed: connected || scanning\n                                      ? null\n                                      : () {\n                                          midiHandler.startScanning(true);\n                                        },\n                                  child: const Text(\"Scan\"),\n                                ),\n                                ElevatedButton(\n                                  onPressed: connected || !scanning\n                                      ? null\n                                      : () {\n                                          midiHandler.stopScanning();\n                                        },\n                                  child: const Text(\"Stop Scanning\"),\n                                ),\n                                ElevatedButton(\n                                  onPressed: !connected\n                                      ? null\n                                      : () {\n                                          midiHandler.disconnectDevice();\n                                          setState(() {});\n                                        },\n                                  child: const Text(\"Disconnect\"),\n                                ),\n                              ],\n                            )\n                          ],\n                        );\n                      },\n                      stream: midiHandler.isScanningStream);\n                }),\n          if (!midiHandler.permissionGranted)\n            ListTile(\n              title: const Text(\n                \"Please, grant location permission\",\n                style: TextStyle(color: Colors.orange),\n              ),\n              onTap: () async {\n                AlertDialogs.showLocationPrompt(context, true, () async {\n                  await Future.delayed(const Duration(milliseconds: 1000));\n                  setState(() {});\n                });\n              },\n            ),\n          const Divider(),\n          ListTile(\n            title: const Text(\"Advanced Settings\"),\n            trailing: const Icon(Icons.keyboard_arrow_right),\n            onTap: () {\n              Navigator.of(context).push(MaterialPageRoute(\n                  builder: (context) => const AdvancedSettings()));\n            },\n          ),\n          ListTile(\n            title: const Text(\"App Version\"),\n            trailing: Text(_version),\n            onTap: () {\n              devCounter++;\n              if (devCounter == 7) {\n                Settings.devMode = true;\n                SharedPrefs().setInt(SettingsKeys.hiddenSources, 1);\n                setState(() {});\n              }\n            },\n          ),\n          if (Settings.devMode)\n            ElevatedButton(\n                onPressed: () => device.communication.fillTestData(),\n                child: const Text(\"Fill test data\")),\n          if (Settings.devMode)\n            ListTile(\n                title: const Text(\"Debug Console\"),\n                trailing: const Icon(Icons.keyboard_arrow_right),\n                onTap: () {\n                  Navigator.of(context).push(MaterialPageRoute(\n                      builder: (context) => const DebugConsole()));\n                }),\n          if (Settings.devMode)\n            ListTile(\n                title: const Text(\"MIDI Commands Utility\"),\n                trailing: const Icon(Icons.keyboard_arrow_right),\n                onTap: () {\n                  Navigator.of(context).push(MaterialPageRoute(\n                      builder: (context) => const DeveloperPage()));\n                }),\n          // ListTile(\n          //   title: Text(\"More Info\"),\n          //   onTap: () {\n          //     showAboutDialog(\n          //       context: context,\n          //       applicationIcon:\n          //           Icon(MightierIcons.amp, color: Colors.blue, size: 30),\n          //       applicationVersion: _version,\n          //       applicationLegalese: \"© 2021 Dian Iliev (Tuntori)\",\n          //     );\n          //   },\n          // ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/settings_advanced.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../bluetooth/NuxDeviceControl.dart';\nimport '../../platform/platformUtils.dart';\nimport '../../platform/simpleSharedPrefs.dart';\nimport 'calibration.dart';\n\nclass AdvancedSettings extends StatefulWidget {\n  const AdvancedSettings({super.key});\n\n  @override\n  State<AdvancedSettings> createState() => _AdvancedSettingsState();\n}\n\nclass _AdvancedSettingsState extends State<AdvancedSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n        appBar: AppBar(\n          title: const Text(\"Advanced Settings\"),\n        ),\n        body: ListView(\n          children: [\n            ListTile(\n              enabled: NuxDeviceControl().isConnected,\n              title: const Text(\"Calibrate BT Audio Latency\"),\n              trailing: const Icon(Icons.keyboard_arrow_right),\n              onTap: () {\n                Navigator.of(context).push(MaterialPageRoute(\n                    builder: (context) => const Calibration()));\n              },\n            ),\n            if (PlatformUtils.isAndroid)\n              CheckboxListTile(\n                  title: const Text(\"Use legacy waveform decoder\"),\n                  subtitle: const Text(\n                      \"Enable this if you experience crashes when editing tracks\"),\n                  value:\n                      SharedPrefs().getInt(SettingsKeys.legacyDecoder, 0) != 0,\n                  onChanged: (value) {\n                    setState(() {\n                      if (value != null) {\n                        SharedPrefs()\n                            .setInt(SettingsKeys.legacyDecoder, value ? 1 : 0);\n                      }\n                    });\n                  }),\n            CheckboxListTile(\n                title: const Text(\"Hide non-applicable presets\"),\n                value: SharedPrefs()\n                        .getInt(SettingsKeys.hideNotApplicablePresets, 0) !=\n                    0,\n                onChanged: (value) {\n                  if (value != null) {\n                    SharedPrefs().setInt(\n                        SettingsKeys.hideNotApplicablePresets, value ? 1 : 0);\n                  }\n                  setState(() {});\n                  NuxDeviceControl().forceNotifyListeners();\n                }),\n          ],\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/UI/pages/tunerPage.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'dart:math' as math;\n\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../../bluetooth/devices/features/tuner.dart';\nimport '../../midi/ControllerConstants.dart';\nimport '../../midi/MidiControllerManager.dart';\n\nclass TunerPage extends StatefulWidget {\n  final NuxDevice device;\n  const TunerPage({super.key, required this.device}) : assert(device is Tuner);\n\n  static const indicatorsAmount = 21;\n\n  //how many cents is half of the scale\n  static const scaleSize = 50;\n\n  static const colors = [\n    Colors.white,\n    Color.fromARGB(255, 119, 202, 29),\n    Colors.yellow,\n    Colors.red\n  ];\n\n  static const colorsInactive = [\n    Color(0x32FFFFFF),\n    Color.fromARGB(50, 119, 202, 29),\n    Color(0x32FFEB3B),\n    Color(0x32F44336)\n  ];\n\n  static List<String> notes = [\n    \"A \",\n    \"A♯\",\n    \"B \",\n    \"C \",\n    \"C♯\",\n    \"D \",\n    \"D♯\",\n    \"E \",\n    \"F \",\n    \"F♯\",\n    \"G \",\n    \"G♯\"\n  ];\n\n  @override\n  State<TunerPage> createState() => _TunerPageState();\n}\n\nclass _TunerPageState extends State<TunerPage> {\n  late Tuner _tuner;\n  late TunerData data = TunerData();\n  StreamSubscription? _subscription;\n  StreamSubscription? _hotkeySub;\n\n  bool _tunerEnabled = false;\n  bool _validDetection = false;\n  Timer? _timeout;\n\n  final List<DropdownMenuItem<TunerMode>> _modeItems = [];\n  final List<DropdownMenuItem<int>> _referenceItems = [];\n\n  @override\n  void initState() {\n    super.initState();\n\n    _tunerEnabled = false;\n    _tuner = widget.device as Tuner;\n    _subscription = _tuner.getTunerDataStream().listen(onData);\n    _hotkeySub = MidiControllerManager()\n        .controllerStream\n        .listen(_onMidiControllerMessage);\n\n    //if not requesting 2 times, the device does not answer\n    _tuner.tunerRequestSettings();\n    _tuner.tunerRequestSettings();\n\n    for (var mode in TunerMode.values) {\n      _modeItems.add(DropdownMenuItem(\n          value: mode, child: Text(Tuner.modesString[mode.index])));\n    }\n\n    for (int i = 0; i < 21; i++) {\n      _referenceItems\n          .add(DropdownMenuItem(value: i, child: Text(\"${430 + i} Hz\")));\n    }\n  }\n\n  @override\n  void dispose() {\n    _timeout?.cancel();\n    _subscription?.cancel();\n    _hotkeySub?.cancel();\n    _tuner.tunerEnable(false);\n    super.dispose();\n  }\n\n  void _onMidiControllerMessage(HotkeyControl event) {\n    if (event == HotkeyControl.ToggleTuner) {\n      Navigator.maybePop(context);\n    }\n  }\n\n  void onData(TunerData event) {\n    if (!_tunerEnabled) {\n      _tuner.tunerEnable(true);\n      _tunerEnabled = true;\n    } else {\n      _validDetection = true;\n    }\n\n    data = event;\n    setState(() {});\n    _timeout?.cancel();\n    _timeout = Timer(const Duration(seconds: 1), _onTimeout);\n  }\n\n  void _onTimeout() {\n    if (data.mode == TunerMode.chromatic &&\n        data.note == 0 &&\n        data.cents == 50) {\n      setState(\n        () {\n          _validDetection = false;\n        },\n      );\n    }\n  }\n\n  Widget _indicator() {\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        var width = (constraints.maxWidth / TunerPage.indicatorsAmount) * 0.7;\n        var height = constraints.maxHeight;\n        int centralIndex = (TunerPage.indicatorsAmount / 2).floor();\n\n        int activeIndex = (math.max(\n                        math.min((data.cents - 50), TunerPage.scaleSize),\n                        -TunerPage.scaleSize) *\n                    centralIndex /\n                    TunerPage.scaleSize)\n                .round() +\n            centralIndex;\n        List<Widget> indicators = [];\n        for (int i = 0; i < TunerPage.indicatorsAmount; i++) {\n          int distance = (centralIndex - i).abs();\n          bool central = i == centralIndex;\n          int colorIndex = 3;\n          if (distance == 0) {\n            colorIndex = 0;\n          } else if (distance < centralIndex / 10 || distance == 1) {\n            colorIndex = 1;\n          } else if (distance < centralIndex / 2) {\n            colorIndex = 2;\n          }\n\n          bool active = _validDetection &&\n              (data.note != 0 || data.stringNumber != 0 || data.cents != 0);\n          Color color = active && i == activeIndex\n              ? TunerPage.colors[colorIndex]\n              : TunerPage.colorsInactive[colorIndex];\n\n          indicators.add(Container(\n            width: central ? width * 1.5 : width,\n            height: central ? height : height * 0.7, // - distance * 2,\n            color: color,\n          ));\n        }\n        return Row(\n          mainAxisSize: MainAxisSize.max,\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: indicators,\n        );\n      },\n    );\n  }\n\n  Widget _noteDisplay() {\n    String wholeNote = TunerPage.notes[data.note].characters.first;\n    String sharp = TunerPage.notes[data.note].characters.last;\n    String stringNumber = \"\";\n\n    if (!_validDetection ||\n        (data.note == 0 && data.stringNumber == 0 && data.cents == 0)) {\n      wholeNote = \"-\";\n      sharp = \" \";\n    } else if (data.mode == TunerMode.bass && data.stringNumber == 5) {\n      stringNumber = \"L\";\n    } else if (data.stringNumber > 0 && data.mode != TunerMode.chromatic) {\n      stringNumber = data.stringNumber.toString();\n    }\n\n    return Stack(\n      alignment: Alignment.topCenter,\n      children: [\n        Transform.translate(\n          offset: const Offset(-47, 42),\n          child: Text(\n            stringNumber,\n            style: const TextStyle(fontSize: 55, fontWeight: FontWeight.bold),\n          ),\n        ),\n        Text(\n          wholeNote,\n          style: const TextStyle(fontSize: 100),\n        ),\n        Transform.translate(\n          offset: const Offset(44, -14),\n          child: Text(\n            sharp,\n            style: const TextStyle(fontSize: 50),\n          ),\n        ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    bool isPortrait =\n        MediaQuery.of(context).orientation == Orientation.portrait;\n\n    late List<Widget> tunerWidgets;\n    if (isPortrait) {\n      tunerWidgets = [\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 16.0),\n          child: SizedBox(height: 100, child: _indicator()),\n        ),\n        _noteDisplay(),\n      ];\n    } else {\n      tunerWidgets = [\n        Row(\n          children: [\n            Expanded(\n              flex: 2,\n              child: Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 16.0),\n                child: SizedBox(height: 100, child: _indicator()),\n              ),\n            ),\n            Expanded(flex: 1, child: _noteDisplay()),\n            IconButton(\n                onPressed: () {\n                  _tuner.tunerMute(!data.muted);\n                },\n                iconSize: 56,\n                icon: Icon(data.muted ? Icons.volume_off : Icons.volume_up))\n          ],\n        )\n      ];\n    }\n    return Scaffold(\n      appBar: AppBar(title: const Text(\"Tuner\")),\n      body: Padding(\n        padding: const EdgeInsets.all(8.0),\n        child: Column(children: [\n          ...tunerWidgets,\n          ListTile(\n            title: const Text(\"Mode\"),\n            trailing: DropdownButton<TunerMode>(\n                value: data.mode,\n                items: _modeItems,\n                onChanged: (index) {\n                  setState(() {\n                    data.clear();\n                    _tuner.tunerSetMode(index!);\n                  });\n                }),\n          ),\n          ListTile(\n            title: const Text(\"Reference\"),\n            trailing: DropdownButton<int>(\n                value: data.referencePitch,\n                items: _referenceItems,\n                onChanged: (index) {\n                  setState(() {\n                    _tuner.tunerSetReferencePitch(index!);\n                  });\n                }),\n          ),\n          if (isPortrait)\n            IconButton(\n                onPressed: () {\n                  _tuner.tunerMute(!data.muted);\n                },\n                iconSize: 56,\n                icon: Icon(data.muted ? Icons.volume_off : Icons.volume_up))\n        ]),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/alertDialogs.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:permission_handler/permission_handler.dart';\n\nclass AlertDialogs {\n  static TextEditingController? nameCtrl;\n\n  static final _inputFormKey = GlobalKey<FormState>();\n\n  static showInfoDialog(BuildContext context,\n      {required String title,\n      required String description,\n      required String confirmButton,\n      Function()? onConfirm,\n      Color? confirmColor}) {\n    // set up the buttons\n    Widget continueButton = TextButton(\n      child: Text(\n        confirmButton,\n        style: TextStyle(color: confirmColor),\n      ),\n      onPressed: () {\n        Navigator.of(context).pop();\n        onConfirm?.call();\n      },\n    );\n    // set up the AlertDialog\n    AlertDialog alert = AlertDialog(\n      title: Text(title),\n      content: Text(description),\n      actions: [\n        continueButton,\n      ],\n    );\n    // show the dialog\n    showDialog(\n      context: context,\n      builder: (BuildContext context) {\n        return alert;\n      },\n    );\n  }\n\n  static showConfirmDialog(BuildContext context,\n      {required String title,\n      required String description,\n      required String confirmButton,\n      required String cancelButton,\n      Function(bool)? onConfirm,\n      Color? confirmColor}) {\n    // set up the buttons\n    Widget cancel = TextButton(\n      child: Text(cancelButton),\n      onPressed: () {\n        Navigator.of(context, rootNavigator: true).pop();\n        onConfirm?.call(false);\n      },\n    );\n    Widget continueButton = TextButton(\n      child: Text(\n        confirmButton,\n        style: TextStyle(color: confirmColor),\n      ),\n      onPressed: () {\n        Navigator.of(context, rootNavigator: true).pop();\n        onConfirm?.call(true);\n      },\n    );\n    // set up the AlertDialog\n    AlertDialog alert = AlertDialog(\n      title: Text(title),\n      content: Text(description),\n      actions: [\n        cancel,\n        continueButton,\n      ],\n    );\n    // show the dialog\n    showDialog(\n      context: context,\n      builder: (BuildContext context) {\n        return alert;\n      },\n    );\n  }\n\n  static showInputDialog(BuildContext context,\n      {required String title,\n      required String description,\n      String confirmButton = \"OK\",\n      String cancelButton = \"Cancel\",\n      required String value,\n      bool selectAll = false,\n      Function(String)? onConfirm,\n      bool Function(String)? validation,\n      TextInputType? keyboardType,\n      String validationErrorMessage = \"\",\n      Color? confirmColor}) {\n    final nameCtrl = TextEditingController(text: value);\n\n    if (selectAll) {\n      nameCtrl.selection =\n          TextSelection(baseOffset: 0, extentOffset: value.length);\n    }\n    // set up the buttons\n    Widget cancel = TextButton(\n      child: Text(cancelButton),\n      onPressed: () {\n        Navigator.of(context, rootNavigator: true).pop();\n      },\n    );\n    Widget continueButton = TextButton(\n      child: Text(\n        confirmButton,\n        style: TextStyle(color: confirmColor),\n      ),\n      onPressed: () {\n        if (_inputFormKey.currentState!.validate()) {\n          Navigator.of(context, rootNavigator: true).pop();\n          onConfirm?.call(nameCtrl.text);\n        } else {\n          //error\n        }\n      },\n    );\n    // set up the AlertDialog\n    AlertDialog alert = AlertDialog(\n      title: Text(title),\n      content: Form(\n        autovalidateMode: AutovalidateMode.onUserInteraction,\n        key: _inputFormKey,\n        child: TextFormField(\n          decoration: InputDecoration(labelText: description),\n          controller: nameCtrl,\n          autofocus: true,\n          keyboardType: keyboardType,\n          //style: TextStyle(color: Colors.black),\n          validator: (value) {\n            if (value == null || value.isEmpty) {\n              return 'Please enter name';\n            }\n            if (validation != null && !validation(value)) {\n              return validationErrorMessage;\n            }\n            return null;\n          },\n        ),\n      ),\n      actions: [\n        cancel,\n        continueButton,\n      ],\n    );\n    // show the dialog\n    showDialog(\n      context: context,\n      builder: (BuildContext context) {\n        return alert;\n      },\n    );\n  }\n\n  static showOptionDialog(BuildContext context,\n      {required String title,\n      required String confirmButton,\n      required String cancelButton,\n      required List<String> options,\n      required int value,\n      required Function(bool, int) onConfirm,\n      Function(int)? onSelectionChanged,\n      Color? confirmColor}) {\n    int selected = value;\n    // set up the buttons\n    return StatefulBuilder(builder: (context, setState) {\n      Widget continueButton = TextButton(\n        child: Text(\n          confirmButton,\n          style: TextStyle(color: confirmColor),\n        ),\n        onPressed: () {\n          Navigator.of(context).pop();\n          onConfirm.call(true, selected);\n        },\n      );\n      Widget closeButton = TextButton(\n        child: Text(cancelButton),\n        onPressed: () {\n          Navigator.of(context).pop();\n          onConfirm.call(false, 0);\n        },\n      );\n      var widgets = <RadioListTile>[];\n      for (int i = 0; i < options.length; i++) {\n        widgets.add(\n          RadioListTile(\n            value: i,\n            groupValue: selected,\n            title: Text(options[i]),\n            onChanged: (currentUser) {\n              setState(() {\n                selected = i;\n                onSelectionChanged?.call(selected);\n              });\n            },\n            selected: selected == i,\n            activeColor: Theme.of(context).hintColor,\n          ),\n        );\n      }\n\n      // set up the AlertDialog\n      AlertDialog alert = AlertDialog(\n        title: Text(title),\n        content: SizedBox(\n          width: double.maxFinite,\n          child: ListTileTheme(\n            iconColor: Colors.white,\n            child: ListView(\n              shrinkWrap: true,\n              children: widgets,\n            ),\n          ),\n        ),\n        actions: [\n          closeButton,\n          continueButton,\n        ],\n      );\n\n      return alert;\n    });\n  }\n\n  static showLocationPrompt(\n      BuildContext context, bool skipPrompt, Function? onPromptFinished) {\n    if (skipPrompt) {\n      _askLocation(onPromptFinished);\n      return;\n    }\n    AlertDialogs.showConfirmDialog(context,\n        title: \"Location is required for Bluetooth\",\n        description:\n            \"Please, consider granting location permission. It is required for Bluetooth connection to work.\",\n        confirmButton: \"Grant\",\n        cancelButton: \"Keep denying\", onConfirm: (val) {\n      if (val) _askLocation(onPromptFinished);\n    });\n  }\n\n  static _askLocation(Function? onPromptFinished) async {\n    var status = await Permission.location.request();\n    if (status.isPermanentlyDenied) await openAppSettings();\n    onPromptFinished?.call();\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/changeCategory.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport '../widgets/scrollParent.dart';\nimport '../../platform/presetsStorage.dart';\n\nclass ChangeCategoryDialog {\n  static final _formKey = GlobalKey<FormState>();\n  final categoryCtrl = TextEditingController();\n  final parentScroll = ScrollController();\n  String category;\n  String name;\n  final Color? confirmColor;\n\n  Function(String) onCategoryChange;\n\n  ChangeCategoryDialog(\n      {required this.category,\n      required this.name,\n      required this.onCategoryChange,\n      this.confirmColor}) {\n    categoryCtrl.text = category;\n  }\n\n  Widget buildDialog(BuildContext context) {\n    List<String> categories = PresetsStorage().getCategories();\n\n    final height = MediaQuery.of(context).size.height * 0.25;\n    final node = FocusScope.of(context);\n\n    return StatefulBuilder(\n      builder: (context, setState) {\n        return AlertDialog(\n          title: const Text('Change Preset Category'),\n          content: SizedBox(\n            width: double.maxFinite,\n            child: SingleChildScrollView(\n              reverse: true,\n              controller: parentScroll,\n              child: Form(\n                autovalidateMode: AutovalidateMode.onUserInteraction,\n                key: _formKey,\n                child: Column(\n                  children: [\n                    Text(\"Categories\",\n                        style: TextStyle(color: Theme.of(context).hintColor)),\n                    const SizedBox(\n                      height: 10,\n                    ),\n                    Container(\n                      height: height,\n                      decoration: BoxDecoration(\n                        border: Border.all(color: Colors.grey[300]!),\n                      ),\n                      child: ScrollParent(\n                        controller: parentScroll,\n                        child: ListTileTheme(\n                          child: ListView.builder(\n                            physics: const ClampingScrollPhysics(),\n                            itemBuilder: (context, index) {\n                              return ListTile(\n                                title: Text(categories[index]),\n                                onTap: () {\n                                  setState(() {\n                                    categoryCtrl.text = categories[index];\n                                  });\n                                },\n                              );\n                            },\n                            itemCount: categories.length,\n                          ),\n                        ),\n                      ),\n                    ),\n                    TextFormField(\n                      decoration: const InputDecoration(labelText: \"Category\"),\n                      controller: categoryCtrl,\n                      validator: (value) {\n                        if (value == null || value.isEmpty) {\n                          return 'Please enter preset category';\n                        }\n                        if (PresetsStorage().findPreset(name, value) != null) {\n                          return 'The category already contains a preset with this name!';\n                        }\n                        return null;\n                      },\n                      onEditingComplete: () => node.unfocus(),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          actions: <Widget>[\n            TextButton(\n              child: const Text(\"Cancel\"),\n              onPressed: () {\n                Navigator.of(context).pop();\n              },\n            ),\n            TextButton(\n              onPressed: () {\n                if (_formKey.currentState!.validate()) {\n                  //call change success\n                  onCategoryChange(categoryCtrl.value.text);\n                  Navigator.of(context).pop();\n                }\n              },\n              child: Text(\n                'Change',\n                style: TextStyle(color: confirmColor),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/exportQRCode.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/platform/fileSaver.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:screenshot/screenshot.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:share_plus/share_plus.dart';\n\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../../platform/platformUtils.dart';\n\nclass QRExportDialog {\n  final Image qrImage;\n  final String presetName;\n  final NuxDevice device;\n  QRExportDialog(this.qrImage, this.presetName, this.device);\n\n  Widget buildDialog(BuildContext context) {\n    ScreenshotController screenshotController = ScreenshotController();\n    return AlertDialog(\n        title: Row(\n          mainAxisAlignment: MainAxisAlignment.start,\n          children: [\n            IconButton(\n                icon: Icon(\n                  Icons.adaptive.arrow_back,\n                  color: Colors.white,\n                ),\n                onPressed: () => Navigator.of(context).pop()),\n            const Text(\"Share QR Code\", style: TextStyle(color: Colors.white)),\n          ],\n        ),\n        insetPadding: EdgeInsets.zero,\n        contentPadding:\n            const EdgeInsets.symmetric(vertical: 20, horizontal: 10),\n        content: FittedBox(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Screenshot(\n                controller: screenshotController,\n                child: ColoredBox(\n                  color: Colors.white,\n                  child: Padding(\n                    padding: const EdgeInsets.symmetric(vertical: 10.0),\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Text(\n                          device.getProductNameForQR(device.productVersion),\n                          style: const TextStyle(\n                              color: Colors.black, fontWeight: FontWeight.bold),\n                        ),\n                        qrImage,\n                        Text(presetName,\n                            style: const TextStyle(\n                                color: Colors.black,\n                                fontWeight: FontWeight.bold))\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n              const SizedBox(height: 10),\n              Row(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  if (!PlatformUtils.isIOS)\n                    ElevatedButton.icon(\n                        onPressed: () async {\n                          //var path = '$directory';\n                          //fileSave\n                          var data = await screenshotController.capture();\n                          if (data != null) {\n                            saveFile(\"image/png\", presetName, data);\n                          }\n                        },\n                        icon: const Icon(\n                          Icons.save_alt,\n                          color: Colors.white,\n                        ),\n                        label: const Text(\"Save\")),\n                  const SizedBox(\n                    width: 10,\n                  ),\n                  ElevatedButton.icon(\n                      onPressed: () async {\n                        Directory? storageDirectory;\n                        if (PlatformUtils.isAndroid) {\n                          storageDirectory =\n                              await getExternalStorageDirectory();\n                        } else if (PlatformUtils.isIOS) {\n                          storageDirectory =\n                              await getApplicationDocumentsDirectory();\n                        }\n                        var tracksPath =\n                            path.join(storageDirectory?.path ?? \"\", \"\");\n\n                        //var path = '$directory';\n\n                        await screenshotController.captureAndSave(tracksPath,\n                            fileName: \"preset.png\");\n\n                        Share.shareXFiles([XFile('$tracksPath/preset.png')],\n                            text: 'QR Code',\n                            sharePositionOrigin: Rect.fromCenter(\n                                center: const Offset(100, 100),\n                                width: 100,\n                                height: 100));\n                      },\n                      icon: Icon(\n                        Icons.adaptive.share,\n                        color: Colors.white,\n                      ),\n                      label: const Text(\"Share\"))\n                ],\n              ),\n            ],\n          ),\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/hotkeyInput.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/midi/ControllerConstants.dart';\nimport 'package:mighty_plug_manager/midi/MidiControllerManager.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nclass HotkeyInputDialog {\n  late BuildContext _context;\n  late TextEditingController controller;\n\n  static const None = \"None\";\n  int? _hotkeyCode;\n  late final MidiController _midiController;\n  late HotkeyControl _control;\n  late int _index;\n  late int _subindex;\n  bool _sliderMode = false;\n\n  //slider mode vars\n  int _previousCode = -1;\n  int? previousSliderValue;\n  bool _invert = false;\n\n  _applyHotkey() {\n    if (_hotkeyCode != null) {\n      do {\n        bool ignoreLowByte = _control == HotkeyControl.ParameterSet;\n        var hk = _midiController.getHotkeyByCode(_hotkeyCode!, ignoreLowByte);\n        if (hk != null) {\n          _midiController.removeHotkey(hk);\n        } else {\n          break;\n        }\n      } while (_control == HotkeyControl.ParameterSet);\n      _midiController.assignHotkey(\n          _control, _index, _subindex, _hotkeyCode!, controller.text, _invert);\n      MidiControllerManager().saveConfig();\n    } else {\n      _midiController.removeHotkeyByFunction(_control, _index, _subindex);\n      MidiControllerManager().saveConfig();\n    }\n\n    Navigator.of(_context).pop();\n  }\n\n  _onControllerData(\n      MidiController ctrl, int code, int? sliderValue, String name) {\n    if (_midiController.id != ctrl.id) return;\n    if (_sliderMode) {\n      if (sliderValue == null) return;\n      if (_invert) sliderValue = 127 - sliderValue;\n      code &= 0xffffff00;\n      if (code == _previousCode && previousSliderValue != sliderValue) {\n        //valid adjustment\n        name = name.substring(0, name.length - 2);\n        name += sliderValue.toRadixString(16).padLeft(2, '0');\n        controller.text = name;\n        _hotkeyCode = code;\n      }\n      _previousCode = code;\n      previousSliderValue = sliderValue;\n    } else {\n      controller.text = name;\n      _hotkeyCode = code;\n    }\n  }\n\n  Widget buildDialog(BuildContext context,\n      {required MidiController midiController,\n      required HotkeyControl ctrl,\n      required int ctrlIndex,\n      required int ctrlSubIndex,\n      required String hotkeyName,\n      required bool sliderMode}) {\n    _midiController = midiController;\n    _context = context;\n    _control = ctrl;\n    _index = ctrlIndex;\n    _subindex = ctrlSubIndex;\n    _sliderMode = sliderMode;\n\n    var hk = _midiController.getHotkeyByFunction(ctrl, ctrlIndex, ctrlSubIndex);\n\n    controller = TextEditingController(text: hk == null ? None : hk.hotkeyName);\n    _invert = hk?.invertSlider ?? false;\n\n    MidiControllerManager().overrideOnData(_onControllerData);\n\n    return FocusScope(\n      autofocus: true,\n      onKey: (node, event) {\n        if (event.runtimeType.toString() == 'RawKeyDownEvent' &&\n            event.logicalKey.keyId != 0x100001005) {\n          MidiControllerManager().onHIDData(event);\n        }\n        return KeyEventResult.skipRemainingHandlers;\n      },\n      child: StatefulBuilder(builder: (context, setState) {\n        return AlertDialog(\n          contentPadding:\n              const EdgeInsets.symmetric(horizontal: 20, vertical: 20),\n          title: Row(\n            mainAxisAlignment: MainAxisAlignment.start,\n            children: [\n              IconButton(\n                  icon: Icon(\n                    Icons.adaptive.arrow_back,\n                    color: Colors.white,\n                  ),\n                  onPressed: () => Navigator.of(context).pop()),\n              const Text('Set hotkey'),\n            ],\n          ),\n          content: Column(mainAxisSize: MainAxisSize.min, children: [\n            if (sliderMode)\n              Text(\n                  \"Adjust the pedal/knob/slider you wish to assign to $hotkeyName\")\n            else\n              Text(\"Press the control you wish to assign to $hotkeyName\"),\n            if (sliderMode)\n              CheckboxListTile(\n                  title: const Text(\"Invert\"),\n                  value: _invert,\n                  onChanged: (value) {\n                    setState(() {\n                      _invert = value!;\n                    });\n                  }),\n            AbsorbPointer(\n              child: TextField(\n                controller: controller,\n                readOnly: true,\n                autofocus: false,\n              ),\n            )\n          ]),\n          actions: [\n            TextButton(\n                onPressed: () {\n                  controller.text = None;\n                  _hotkeyCode = null;\n                },\n                child: const Text(\"Clear\")),\n            TextButton(\n                onPressed: () => Navigator.of(context).pop(),\n                child: const Text(\"Cancel\")),\n            TextButton(\n                onPressed: _applyHotkey,\n                child: Text(\n                  \"OK\",\n                  style: TextStyle(color: Theme.of(context).hintColor),\n                ))\n          ],\n          actionsAlignment: MainAxisAlignment.spaceBetween,\n        );\n      }),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/midiControlInfo.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\n\nimport '../../bluetooth/devices/effects/MidiControllerHandles.dart';\n\nclass MidiControlInfoDialog {\n  Widget buildDialog(BuildContext context,\n      {required List<Processor> effects,\n      required ControllerHandleId handleId}) {\n    return AlertDialog(\n      contentPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),\n      title: Row(\n        mainAxisAlignment: MainAxisAlignment.start,\n        children: [\n          IconButton(\n              icon: Icon(\n                Icons.adaptive.arrow_back,\n                color: Colors.white,\n              ),\n              onPressed: () => Navigator.of(context).pop()),\n          const Text('Control Info'),\n        ],\n      ),\n      content: Container(\n        height: 400,\n        width: 300,\n        decoration: BoxDecoration(\n          border: Border.all(color: Colors.grey[300]!),\n        ),\n        child: ListView.builder(\n          itemBuilder: (context, index) {\n            String paramName = \"N/A\";\n            for (var param in effects[index].parameters) {\n              if (param.midiControllerHandle != null &&\n                  param.midiControllerHandle!.id == handleId) {\n                paramName = param.name;\n              }\n            }\n\n            return ListTile(\n              title: Text(effects[index].name),\n              trailing: Text(paramName),\n            );\n          },\n          itemCount: effects.length,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/savePreset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport '../../bluetooth/devices/presets/Preset.dart';\nimport '../widgets/scrollParent.dart';\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../../platform/presetsStorage.dart';\nimport 'alertDialogs.dart';\n\nclass SavePresetDialog {\n  static final _formKey = GlobalKey<FormState>();\n  final categoryCtrl = TextEditingController();\n  final nameCtrl = TextEditingController();\n  final parentScroll = ScrollController();\n  final String? customName;\n  final Preset? customPreset;\n  final NuxDevice device;\n  final Color? confirmColor;\n  late NuxDeviceControl deviceControl;\n\n  SavePresetDialog(\n      {required this.device,\n      this.confirmColor,\n      this.customName,\n      this.customPreset}) {\n    deviceControl = device.deviceControl;\n    categoryCtrl.text = deviceControl.presetCategory;\n    if (customName != null) {\n      nameCtrl.text = customName!;\n    } else {\n      nameCtrl.text = deviceControl.presetName;\n    }\n  }\n\n  Widget buildDialog(NuxDevice device, BuildContext context) {\n    List<String> categories = PresetsStorage().getCategories();\n\n    var isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;\n\n    final height = MediaQuery.of(context).size.height * 0.25;\n    final node = FocusScope.of(context);\n\n    return StatefulBuilder(\n      builder: (context, setState) {\n        var dialog = AlertDialog(\n          title: const Text('Save preset'),\n          content: SizedBox(\n            width: double.maxFinite,\n            child: SingleChildScrollView(\n              reverse: true,\n              controller: parentScroll,\n              child: Form(\n                autovalidateMode: AutovalidateMode.onUserInteraction,\n                key: _formKey,\n                child: Column(\n                  children: [\n                    Text(\"Categories\",\n                        style: TextStyle(color: Theme.of(context).hintColor)),\n                    const SizedBox(\n                      height: 10,\n                    ),\n                    Container(\n                      height: height,\n                      decoration: BoxDecoration(\n                        border: Border.all(color: Colors.grey[300]!),\n                      ),\n                      child: ScrollParent(\n                        controller: parentScroll,\n                        child: ListTileTheme(\n                          child: ListView.builder(\n                            physics: const ClampingScrollPhysics(),\n                            itemBuilder: (context, index) {\n                              return ListTile(\n                                title: Text(categories[index]),\n                                onTap: () {\n                                  setState(() {\n                                    categoryCtrl.text = categories[index];\n                                  });\n                                },\n                              );\n                            },\n                            itemCount: categories.length,\n                          ),\n                        ),\n                      ),\n                    ),\n                    TextFormField(\n                      decoration: const InputDecoration(labelText: \"Category\"),\n                      controller: categoryCtrl,\n                      validator: (value) {\n                        if (value == null || value.isEmpty) {\n                          return 'Please enter preset category';\n                        }\n                        return null;\n                      },\n                      onEditingComplete: () => node.nextFocus(),\n                    ),\n                    TextFormField(\n                      decoration: const InputDecoration(labelText: \"Name\"),\n                      controller: nameCtrl,\n                      validator: (value) {\n                        if (value == null || value.isEmpty) {\n                          return 'Please enter preset name';\n                        }\n                        return null;\n                      },\n                      onEditingComplete: () => node.unfocus(),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          actions: [\n            TextButton(\n              child: const Text(\"Cancel\"),\n              onPressed: () {\n                Navigator.of(context).pop();\n              },\n            ),\n            TextButton(\n              onPressed: () {\n                if (_formKey.currentState!.validate()) {\n                  //save and pop\n\n                  if (PresetsStorage().presetExists(\n                      nameCtrl.value.text, categoryCtrl.value.text)) {\n                    //overwriting preset\n                    AlertDialogs.showConfirmDialog(context,\n                        title: \"Confirm\",\n                        description: \"Overwrite existing preset?\",\n                        cancelButton: \"Cancel\",\n                        confirmButton: \"Overwrite\",\n                        confirmColor: Colors.red, onConfirm: (overwrite) {\n                      if (overwrite) {\n                        savePreset(context);\n                        Navigator.of(context).pop();\n                      }\n                    });\n                  } else {\n                    savePreset(context);\n                    Navigator.of(context).pop();\n                  }\n                }\n              },\n              child: Text(\n                'Save',\n                style: TextStyle(color: confirmColor),\n              ),\n            ),\n          ],\n        );\n\n        if (isPortrait) {\n          return dialog;\n        } else {\n          return SingleChildScrollView(\n            child: dialog,\n          );\n        }\n      },\n    );\n  }\n\n  savePreset(context) {\n    var preset = device.presetToJson(customPreset: customPreset);\n    if (customPreset == null) {\n      deviceControl.presetName = nameCtrl.value.text;\n      deviceControl.presetCategory = categoryCtrl.value.text;\n    }\n\n    String uuid = PresetsStorage()\n        .savePreset(preset, nameCtrl.value.text, categoryCtrl.value.text);\n\n    if (customPreset == null) {\n      deviceControl.presetUUID = uuid;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/selectPreset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport '../widgets/presets/preset_list/presetList.dart';\n\nclass SelectPresetDialog {\n  Widget buildDialog(BuildContext context, {required bool noneOption}) {\n    return AlertDialog(\n      contentPadding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20),\n      title: Row(\n        mainAxisAlignment: MainAxisAlignment.start,\n        children: [\n          IconButton(\n              icon: Icon(\n                Icons.adaptive.arrow_back,\n                color: Colors.white,\n              ),\n              onPressed: () =>\n                  Navigator.of(context, rootNavigator: true).pop()),\n          const Text('Select preset'),\n        ],\n      ),\n      actions: [],\n      content: Scaffold(\n        body: ListView(\n            shrinkWrap: true,\n            scrollDirection: Axis.vertical,\n            children: [\n              if (noneOption)\n                ListTile(\n                  title: const Center(child: Text(\"None\")),\n                  onTap: () =>\n                      Navigator.of(context, rootNavigator: true).pop(false),\n                ),\n              PresetList(\n                  simplified: true,\n                  onTap: (preset) {\n                    Navigator.of(context, rootNavigator: true).pop(preset);\n                  }),\n            ]),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/popups/selectTrack.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/models/jamTrack.dart';\nimport 'package:mighty_plug_manager/audio/trackdata/trackData.dart';\nimport 'package:mighty_plug_manager/audio/tracksPage.dart';\n\nclass SelectTrackDialog {\n  bool _multiselect = false;\n  Map<int, bool> _selected = {};\n\n  Widget buildDialog(BuildContext context) {\n    return StatefulBuilder(builder: (context, setState) {\n      return AlertDialog(\n        contentPadding: const EdgeInsets.only(bottom: 20),\n        title: Row(\n          mainAxisAlignment: MainAxisAlignment.start,\n          children: [\n            IconButton(\n                icon: Icon(\n                  Icons.adaptive.arrow_back,\n                  color: Colors.white,\n                ),\n                onPressed: () => Navigator.of(context).pop()),\n            Expanded(\n                child: _multiselect\n                    ? Text(\"${_selected.length} selected\")\n                    : const Text('Select Track')),\n            if (_multiselect)\n              ElevatedButton(\n                child: const Text(\"Add\"),\n                onPressed: () {\n                  List<JamTrack> tracks = [];\n                  for (int i = 0; i < _selected.length; i++) {\n                    tracks.add(TrackData().tracks[_selected.keys.elementAt(i)]);\n                  }\n                  Navigator.of(context).pop(tracks);\n                },\n              )\n          ],\n        ),\n        content: TracksPage(\n          selectorOnly: true,\n          onSelectedTrack: (track) {\n            Navigator.of(context).pop(track);\n          },\n          multiSelectState: (bool state, Map<int, bool> selected) {\n            _multiselect = state;\n            _selected = selected;\n            setState(() {});\n          },\n        ),\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "lib/UI/theme.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\nimport 'package:flutter/material.dart';\n\nclass AppThemeConfig {\n  static double dragHandlesWidth = 56;\n  static Color contextMenuIconColor = Colors.white;\n  static bool allowRotation = true;\n\n  static TextStyle ListTileHeaderStyle =\n      const TextStyle(color: Colors.lightBlue, fontWeight: FontWeight.bold);\n  static double toggleButtonHeight(bool hasLongNames) {\n    if (hasLongNames) return 48;\n    return 40;\n  }\n}\n\nThemeData getTheme() {\n  return ThemeData(\n    brightness: Brightness.dark,\n    colorScheme: ColorScheme(\n      brightness: Brightness.dark,\n      primary: Colors.blue, //buttons\n      onPrimary: Colors.white, //text on buttons\n      secondary: Colors.white,\n      onSecondary: Colors.grey,\n      error: Colors.red,\n      onError: Colors.white,\n      background: Colors.grey,\n      onBackground: Colors.grey,\n      surface: Colors.grey[700]!, //appbar\n      onSurface: Colors.white, //titlebar text\n    ),\n    //canvasColor: Colors.white,\n    scaffoldBackgroundColor: Colors.grey[900],\n\n    //primary color is AppBar bg color\n    primaryColor: Colors.grey[800],\n    //accentColor: Colors.white,\n\n    //unselected labels\n    hintColor: Colors.blue[300],\n\n    disabledColor: Colors.grey[700],\n    unselectedWidgetColor: Colors.white,\n    inputDecorationTheme: InputDecorationTheme(\n        labelStyle: const TextStyle(color: Colors.white),\n        focusedBorder: const UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.white)),\n        enabledBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.grey[600]!))),\n    checkboxTheme:\n        CheckboxThemeData(fillColor: MaterialStateColor.resolveWith((states) {\n      return Colors.white;\n    }), checkColor: MaterialStateColor.resolveWith((states) {\n      return Colors.black;\n    })),\n    bottomNavigationBarTheme: BottomNavigationBarThemeData(\n      type: BottomNavigationBarType.fixed,\n      backgroundColor: Colors.grey[800],\n      selectedItemColor: Colors.white,\n      unselectedItemColor: Colors.grey[500],\n      selectedIconTheme: const IconThemeData(\n        size: 40,\n      ),\n      unselectedIconTheme: const IconThemeData(\n        size: 30,\n      ),\n    ),\n    textButtonTheme: TextButtonThemeData(style:\n        ButtonStyle(foregroundColor: MaterialStateColor.resolveWith((states) {\n      if (states.contains(MaterialState.disabled)) return Colors.grey[700]!;\n      return Colors.grey[300]!;\n    }))),\n\n    elevatedButtonTheme: ElevatedButtonThemeData(\n        style: ButtonStyle(\n      backgroundColor: MaterialStateColor.resolveWith((states) {\n        if (states.contains(MaterialState.disabled)) return Colors.grey[700]!;\n        return Colors.blue;\n      }),\n      foregroundColor: MaterialStateColor.resolveWith((states) {\n        if (states.contains(MaterialState.disabled)) return Colors.grey;\n        return Colors.white;\n      }),\n    )),\n\n    dialogTheme: DialogTheme(\n      contentTextStyle: const TextStyle(color: Colors.white),\n      backgroundColor: Colors.grey[800],\n      //shape: RoundedRectangleBorder(\n      //    borderRadius: BorderRadius.all(Radius.circular(10))),\n    ),\n    toggleButtonsTheme: ToggleButtonsThemeData(\n      color: Colors.grey[600],\n      selectedColor: Colors.white,\n      borderColor: Colors.grey[800],\n      selectedBorderColor: Colors.grey[800],\n      fillColor: Colors.transparent,\n      borderWidth: 2,\n      borderRadius: const BorderRadius.all(Radius.circular(12)),\n    ),\n    popupMenuTheme: PopupMenuThemeData(color: Colors.grey[700]),\n    dividerTheme:\n        const DividerThemeData(color: Colors.grey, indent: 15, endIndent: 15),\n  );\n}\n"
  },
  {
    "path": "lib/UI/toneshare/cloud_authentication.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/toneshare/cloud_login.dart';\nimport 'package:mighty_plug_manager/UI/toneshare/cloud_signup.dart';\n\nenum AuthPage { signIn, signUp }\n\nclass CloudAuthentication extends StatefulWidget {\n  const CloudAuthentication({super.key});\n\n  @override\n  State<CloudAuthentication> createState() => _CloudAuthenticationState();\n}\n\nclass _CloudAuthenticationState extends State<CloudAuthentication> {\n  AuthPage _pageMode = AuthPage.signIn;\n\n  void _showSignup() {\n    setState(() {\n      _pageMode = AuthPage.signUp;\n    });\n  }\n\n  void _showSignIn() {\n    setState(() {\n      _pageMode = AuthPage.signIn;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_pageMode == AuthPage.signIn) {\n      return SignInForm(onSignUpTap: _showSignup);\n    } else {\n      return SignUpForm(onSignInTap: _showSignIn);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/toneshare/cloud_login.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/modules/cloud/cloudManager.dart';\nimport 'package:pocketbase/pocketbase.dart';\n\nimport 'toneshare_main.dart';\n\nclass SignInForm extends StatefulWidget {\n  final void Function() onSignUpTap;\n  const SignInForm({super.key, required this.onSignUpTap});\n\n  @override\n  _SignInFormState createState() => _SignInFormState();\n}\n\nclass _SignInFormState extends State<SignInForm> {\n  final _formKey = GlobalKey<FormState>();\n  final _emailController = TextEditingController();\n  final _passwordController = TextEditingController();\n\n  String _errorMessage = '';\n\n  bool _validateAndSaveForm() {\n    final form = _formKey.currentState;\n    if (form?.validate() ?? false) {\n      form?.save();\n      return true;\n    }\n    return false;\n  }\n\n  void _signInWithEmailAndPassword() async {\n    if (_validateAndSaveForm()) {\n      setState(() {\n        _errorMessage = \"\";\n      });\n\n      try {\n        ToneShare.startLoading(context);\n        var result = await CloudManager.instance.signIn(\n            email: _emailController.text.trim(),\n            password: _passwordController.text.trim());\n        print(result);\n      } on ClientException catch (e) {\n        if (e.isAbort) {\n          _errorMessage = \"No internet connection\";\n        } else {\n          _errorMessage = e.response[\"message\"];\n          //\"Wrong credentials or account not verified\";\n        }\n        setState(() {});\n      } finally {\n        ToneShare.stopLoading(context);\n      }\n    }\n  }\n\n  void _signInWithGoogle() async {\n    // try {\n    //   // Trigger the authentication flow\n    //   final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();\n\n    //   // Obtain the auth details from the request\n    //   final GoogleSignInAuthentication? googleAuth =\n    //       await googleUser?.authentication;\n\n    //   // Create a new credential\n    //   final AuthCredential credential = GoogleAuthProvider.credential(\n    //     idToken: googleAuth?.idToken,\n    //     accessToken: googleAuth?.accessToken,\n    //   );\n    //   await FirebaseAuth.instance.signInWithCredential(credential);\n    // } on FirebaseAuthException catch (e) {\n    //   setState(() {\n    //     _errorMessage = e.message ?? \"Unknown Error\";\n    //   });\n    // }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Form(\n      key: _formKey,\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: <Widget>[\n          TextFormField(\n            controller: _emailController,\n            keyboardType: TextInputType.emailAddress,\n            decoration: const InputDecoration(\n              labelText: 'Email',\n            ),\n            validator: (value) {\n              if (value?.isEmpty ?? true) {\n                return 'Please enter your email';\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 16),\n          TextFormField(\n            controller: _passwordController,\n            obscureText: true,\n            decoration: const InputDecoration(\n              labelText: 'Password',\n            ),\n            validator: (value) {\n              if (value?.isEmpty ?? true) {\n                return 'Please enter your password';\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 16),\n          Text(\n            _errorMessage,\n            style: const TextStyle(color: Colors.red),\n          ),\n          const SizedBox(height: 16),\n          ElevatedButton(\n            onPressed: _signInWithEmailAndPassword,\n            child: const Text('Sign In'),\n          ),\n          const SizedBox(height: 16),\n          ElevatedButton(\n            onPressed: _signInWithGoogle,\n            child: const Text('Sign in with Google'),\n          ),\n          const SizedBox(height: 16),\n          GestureDetector(\n            onTap: widget.onSignUpTap,\n            child: const Text('Don\\'t have an account? Sign up'),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/toneshare/cloud_signup.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:pocketbase/pocketbase.dart';\n\nimport '../../modules/cloud/cloudManager.dart';\nimport 'toneshare_main.dart';\n\nclass SignUpForm extends StatefulWidget {\n  final void Function() onSignInTap;\n  const SignUpForm({super.key, required this.onSignInTap});\n\n  @override\n  _SignUpFormState createState() => _SignUpFormState();\n}\n\nclass _SignUpFormState extends State<SignUpForm> {\n  final _formKey = GlobalKey<FormState>();\n  final _emailController = TextEditingController();\n  final _passwordController = TextEditingController();\n\n  String _errorMessage = '';\n\n  bool _validateAndSaveForm() {\n    final form = _formKey.currentState;\n    if (form?.validate() ?? false) {\n      form?.save();\n      return true;\n    }\n    return false;\n  }\n\n  void _signUpWithEmailAndPassword() async {\n    if (_validateAndSaveForm()) {\n      setState(() {\n        _errorMessage = \"\";\n      });\n\n      try {\n        ToneShare.startLoading(context);\n        var result = await CloudManager.instance.register(\n            email: _emailController.text.trim(),\n            password: _passwordController.text.trim());\n        print(result);\n      } on ClientException catch (e) {\n        if (e.isAbort) {\n          _errorMessage = \"No internet connection\";\n        } else {\n          Map data = e.response[\"data\"];\n          if (data.containsKey(\"email\") &&\n              data[\"email\"][\"code\"] == \"validation_invalid_email\") {\n            _errorMessage = data[\"email\"][\"message\"];\n          } else {\n            _errorMessage = e.response[\"message\"];\n          }\n          //\"Wrong credentials or account not verified\";\n        }\n        setState(() {});\n      } finally {\n        ToneShare.stopLoading(context);\n      }\n    }\n  }\n\n  void _signUpWithGoogle() async {\n    // try {\n    //   // Trigger the authentication flow\n    //   final GoogleSignUpAccount? googleUser = await GoogleSignUp().SignUp();\n\n    //   // Obtain the auth details from the request\n    //   final GoogleSignUpAuthentication? googleAuth =\n    //       await googleUser?.authentication;\n\n    //   // Create a new credential\n    //   final AuthCredential credential = GoogleAuthProvider.credential(\n    //     idToken: googleAuth?.idToken,\n    //     accessToken: googleAuth?.accessToken,\n    //   );\n    //   await FirebaseAuth.instance.SignUpWithCredential(credential);\n    // } on FirebaseAuthException catch (e) {\n    //   setState(() {\n    //     _errorMessage = e.message ?? \"Unknown Error\";\n    //   });\n    // }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Form(\n      key: _formKey,\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: <Widget>[\n          TextFormField(\n            controller: _emailController,\n            keyboardType: TextInputType.emailAddress,\n            decoration: const InputDecoration(\n              labelText: 'Email',\n            ),\n            validator: (value) {\n              if (value?.isEmpty ?? true) {\n                return 'Please enter your email';\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 16),\n          TextFormField(\n            controller: _passwordController,\n            obscureText: true,\n            decoration: const InputDecoration(\n              labelText: 'Password',\n            ),\n            validator: (value) {\n              if (value?.isEmpty ?? true) {\n                return 'Please enter your password';\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 16),\n          Text(\n            _errorMessage,\n            style: const TextStyle(color: Colors.red),\n          ),\n          const SizedBox(height: 16),\n          ElevatedButton(\n            onPressed: _signUpWithEmailAndPassword,\n            child: const Text('Sign Up'),\n          ),\n          ElevatedButton(\n            onPressed: _signUpWithGoogle,\n            child: const Text('Sign in with Google'),\n          ),\n          ElevatedButton(\n            onPressed: () => CloudManager.instance\n                .requestValidation(_emailController.text.trim()),\n            child: const Text('Validado'),\n          ),\n          const SizedBox(height: 16),\n          GestureDetector(\n            onTap: widget.onSignInTap,\n            child: const Text('Already have an account? Sign in'),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/toneshare/share_preset.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass PresetForm extends StatefulWidget {\n  @override\n  _PresetFormState createState() => _PresetFormState();\n}\n\nclass _PresetFormState extends State<PresetForm> {\n  final _formKey = GlobalKey<FormState>();\n  final List<String> _instrumentOptions = [\n    \"Electric guitar\",\n    \"Bass guitar\",\n    \"Acoustic guitar\",\n  ];\n  final List<String> _genreOptions = [\n    \"Rock\",\n    \"Blues\",\n    \"Pop\",\n    \"Other\",\n  ];\n  String _name = \"\";\n  String _description = \"\";\n  String? _instrument;\n  String? _genre;\n\n  void _submitForm() {\n    if (_formKey.currentState?.validate() ?? false) {\n      // TODO: handle form submission\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Create Preset\"),\n      ),\n      body: Padding(\n        padding: const EdgeInsets.all(16.0),\n        child: Form(\n          key: _formKey,\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              TextFormField(\n                initialValue: _name,\n                decoration: const InputDecoration(\n                  labelText: \"Name\",\n                  hintText: \"Enter preset name\",\n                ),\n                validator: (value) {\n                  if (value?.isEmpty ?? true) {\n                    return \"Please enter a name\";\n                  }\n                  return null;\n                },\n                onChanged: (value) => _name = value,\n              ),\n              const SizedBox(height: 16.0),\n              TextFormField(\n                initialValue: _description,\n                decoration: const InputDecoration(\n                  labelText: \"Description\",\n                  hintText: \"Enter preset description\",\n                ),\n                maxLines: 3,\n                onChanged: (value) => _description = value,\n              ),\n              const SizedBox(height: 16.0),\n              DropdownButtonFormField<String>(\n                decoration: const InputDecoration(\n                  labelText: \"Instrument\",\n                ),\n                value: _instrument,\n                items: _instrumentOptions\n                    .map((instrument) => DropdownMenuItem(\n                          value: instrument,\n                          child: Text(instrument),\n                        ))\n                    .toList(),\n                onChanged: (value) => setState(() => _instrument = value ?? \"\"),\n              ),\n              const SizedBox(height: 16.0),\n              DropdownButtonFormField<String>(\n                decoration: const InputDecoration(\n                  labelText: \"Genre\",\n                ),\n                value: _genre,\n                items: _genreOptions\n                    .map((genre) => DropdownMenuItem(\n                          value: genre,\n                          child: Text(genre),\n                        ))\n                    .toList(),\n                onChanged: (value) => setState(() => _genre = value ?? \"\"),\n              ),\n              const SizedBox(height: 32.0),\n              Center(\n                child: ElevatedButton(\n                  onPressed: _submitForm,\n                  child: const Text(\"Upload\"),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/toneshare/toneshare_home.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/modules/cloud/cloudManager.dart';\n\nimport '../widgets/common/searchTextField.dart';\n\nclass ToneShareHome extends StatefulWidget {\n  ToneShareHome({super.key});\n\n  @override\n  State<ToneShareHome> createState() => _ToneShareHomeState();\n}\n\nclass _ToneShareHomeState extends State<ToneShareHome> {\n  final TextEditingController searchCtrl = TextEditingController(text: \"\");\n\n  List? data;\n  @override\n  void initState() {\n    super.initState();\n    //searchCtrl.addListener(_search);\n  }\n\n  void _search(String? query) async {\n    if (query == null || query.isEmpty) return;\n\n    final response = null;\n    /*await Supabase.instance.client\n        .from(\"presets\")\n        .select(\"*\")\n        .textSearch(\"name\", query, type: TextSearchType.websearch);*/\n\n    if (response != null) {\n      // Process results\n      //final results = response.data;\n      // Do something with the results\n      data = response;\n    }\n    setState(() {});\n  }\n\n  @override\n  void dispose() {\n    // TODO: implement dispose\n    super.dispose();\n    //searchCtrl.removeListener(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.max,\n      crossAxisAlignment: CrossAxisAlignment.stretch,\n      children: [\n        ElevatedButton(\n            child: const Text(\"Sync\"),\n            onPressed: CloudManager.instance.syncPresets),\n        SearchTextField(controller: searchCtrl, onSearch: _search),\n        Expanded(\n            child: ListView.builder(\n          itemCount: data?.length ?? 0,\n          itemBuilder: (context, index) {\n            return ListTile(\n              title: Text(data![index][\"name\"]),\n            );\n          },\n        )),\n        ElevatedButton(\n            child: const Text(\"Sign Out\"),\n            onPressed: CloudManager.instance.signOut)\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/toneshare/toneshare_main.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../modules/cloud/cloudManager.dart';\nimport 'cloud_authentication.dart';\nimport 'toneshare_home.dart';\n\nclass ToneShare extends StatefulWidget {\n  const ToneShare({super.key});\n\n  @override\n  State<ToneShare> createState() => _ToneShareState();\n\n  static Future<void> startLoading(BuildContext context) async {\n    return await showDialog<void>(\n      context: context,\n      barrierDismissible: false,\n      builder: (BuildContext context) {\n        return const SimpleDialog(\n          elevation: 0.0,\n          backgroundColor:\n              Colors.black45, // can change this to your prefered color\n          children: <Widget>[\n            Center(\n              child: CircularProgressIndicator.adaptive(),\n            )\n          ],\n        );\n      },\n    );\n  }\n\n  static Future<void> stopLoading(BuildContext context) async {\n    Navigator.of(context).pop();\n  }\n}\n\nclass _ToneShareState extends State<ToneShare> {\n  @override\n  void initState() {\n    super.initState();\n    CloudManager.instance.addListener(_onAuthChange);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    CloudManager.instance.removeListener(_onAuthChange);\n  }\n\n  void _onAuthChange() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget page;\n    if (CloudManager.instance.signedIn) {\n      page = ToneShareHome();\n    } else {\n      page = const CloudAuthentication();\n    }\n\n    return SafeArea(\n        child: Scaffold(\n      body: page,\n    ));\n  }\n}\n"
  },
  {
    "path": "lib/UI/utils.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nenum LayoutMode { navBar, drawer }\n\nenum EditorLayoutMode { scroll, expand }\n\nLayoutMode getLayoutMode(MediaQueryData mediaQuery) {\n  final screenWidth = mediaQuery.size.width;\n  final screenHeight = mediaQuery.size.height;\n  if (screenHeight > 650) return LayoutMode.navBar;\n  if (screenWidth >= 500) return LayoutMode.drawer;\n  return LayoutMode.navBar;\n}\n\nEditorLayoutMode getEditorLayoutMode(MediaQueryData mediaQuery) {\n  final screenHeight = mediaQuery.size.height;\n  if (screenHeight <= 580) return EditorLayoutMode.scroll;\n  return EditorLayoutMode.expand;\n}\n"
  },
  {
    "path": "lib/UI/widgets/MidiDeviceTile.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nclass MidiControllerTile extends StatelessWidget {\n  final MidiController controller;\n  final Function() onTap;\n  final Function() onSettings;\n  const MidiControllerTile(\n      {Key? key,\n      required this.controller,\n      required this.onTap,\n      required this.onSettings})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    IconData icon;\n    switch (controller.type) {\n      case ControllerType.Hid:\n        icon = Icons.keyboard_alt_outlined;\n        break;\n      case ControllerType.MidiUsb:\n        icon = Icons.usb;\n        break;\n      case ControllerType.MidiBle:\n        icon = Icons.bluetooth;\n        break;\n    }\n\n    return ListTile(\n      title: Text(controller.name),\n      onTap: onTap,\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          if (controller.connected)\n            IconButton(\n              icon: const Icon(Icons.settings),\n              onPressed: onSettings,\n            ),\n          Icon(\n            icon,\n            color: controller.connected ? Colors.blue : Colors.grey,\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/ModeControl.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\n\nimport '../../bluetooth/devices/value_formatters/SwitchFormatters.dart';\n\nclass ModeControl extends StatelessWidget {\n  final bool enabled;\n  final double value;\n  final Parameter parameter;\n  final Color effectColor;\n  final ValueChanged<double>? onChanged;\n  const ModeControl(\n      {Key? key,\n      required this.parameter,\n      required this.value,\n      required this.enabled,\n      required this.effectColor,\n      required this.onChanged})\n      : super(key: key);\n\n  String getText() {\n    return (parameter.formatter as SwitchFormatter).labelTitle;\n  }\n\n  List<String> getElementsCount() {\n    return (parameter.formatter as SwitchFormatter).labelValues;\n  }\n\n  List<int> getElementValues() {\n    return (parameter.formatter as SwitchFormatter).midiValues;\n  }\n\n  int getIndexByValue(int midiValue) {\n    //find element that is closest to the value\n    var list = (parameter.formatter as SwitchFormatter).midiValues;\n    int closestValue = 255;\n    int selected = -1;\n    for (int i = 0; i < list.length; i++) {\n      int diff = (list[i] - midiValue).abs();\n      if (diff < closestValue) {\n        closestValue = diff;\n        selected = i;\n      }\n    }\n    return selected;\n  }\n\n  Widget getButtonItem(String text) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 12.0),\n      child: Text(\n        text,\n        style: const TextStyle(fontSize: 20),\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ConstrainedBox(\n        constraints: const BoxConstraints(maxHeight: 45),\n        child: LayoutBuilder(\n            builder: (BuildContext context, BoxConstraints constraints) {\n          //width = constraints.maxWidth - 1;\n          var color = enabled\n              ? effectColor\n              : TinyColor.fromColor(effectColor).desaturate(80).color;\n\n          var elements = getElementsCount();\n          var active = List<bool>.filled(elements.length, false);\n          var index = getIndexByValue(value.round());\n          active[index] = true;\n          return ListTile(\n            contentPadding: const EdgeInsets.symmetric(horizontal: 5),\n            dense: true,\n            title: Text(getText(),\n                style: const TextStyle(color: Colors.white, fontSize: 20)),\n            trailing: ToggleButtons(\n              isSelected: active,\n              fillColor: TinyColor.fromColor(color).darken(15).color,\n              borderColor: color,\n              selectedBorderColor: color,\n              color: color,\n              selectedColor: Colors.white,\n              onPressed: (int newIndex) {\n                var val = getElementValues()[newIndex];\n                onChanged?.call(val.toDouble());\n              },\n              children: [\n                for (var i = 0; i < elements.length; i++)\n                  getButtonItem(elements[i]),\n              ],\n            ),\n          );\n        }));\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/NuxAppBar.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\nimport 'package:mighty_plug_manager/midi/MidiControllerManager.dart';\n\nimport '../../bluetooth/ble_controllers/BLEController.dart';\nimport '../../bluetooth/devices/features/tuner.dart';\nimport '../../midi/ControllerConstants.dart';\nimport '../mightierIcons.dart';\nimport '../pages/tunerPage.dart';\nimport 'common/blinkWidget.dart';\n\nclass MAAppBar extends StatefulWidget implements PreferredSizeWidget {\n  final double? elevation;\n  final bool showExpandButton;\n  final bool expanded;\n  final Function(bool)? onExpandStateChanged;\n\n  const MAAppBar({\n    this.elevation,\n    this.showExpandButton = false,\n    this.onExpandStateChanged,\n    this.expanded = true,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Size get preferredSize => const Size.fromHeight(46);\n\n  @override\n  State<MAAppBar> createState() => _NuxAppBarState();\n}\n\nclass _NuxAppBarState extends State<MAAppBar> {\n  static const batteryKey = \"batteryValue\";\n\n  int? batteryValue;\n  StreamSubscription? _hotkeySub;\n\n  @override\n  void initState() {\n    super.initState();\n    batteryValue = PageStorage.of(context)\n        .readState(context, identifier: batteryKey) as int?;\n\n    _hotkeySub = MidiControllerManager()\n        .controllerStream\n        .listen(_onMidiControllerMessage);\n  }\n\n  @override\n  void dispose() {\n    // TODO: implement dispose\n    super.dispose();\n    _hotkeySub?.cancel();\n  }\n\n  void _onMidiControllerMessage(HotkeyControl event) {\n    if (ModalRoute.of(context)?.isCurrent == false) {\n      return;\n    }\n    if (event == HotkeyControl.ToggleTuner) {\n      var dev = NuxDeviceControl().device;\n      if (dev is Tuner) {\n        var tuner = dev as Tuner;\n        if (tuner.tunerAvailable) {\n          Navigator.of(context).push(MaterialPageRoute(\n              builder: (context) => TunerPage(\n                    device: dev,\n                  )));\n        }\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var devControl = NuxDeviceControl.instance();\n    return Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        if (widget.showExpandButton)\n          Container(\n            height: kToolbarHeight,\n            width: kToolbarHeight,\n            color: Theme.of(context).primaryColor,\n            child: IconButton(\n              icon: Icon(\n                widget.expanded ? Icons.arrow_left : Icons.arrow_right,\n                size: 32,\n              ),\n              onPressed: () {\n                widget.onExpandStateChanged?.call(!widget.expanded);\n              },\n            ),\n          ),\n        if (widget.expanded)\n          Expanded(\n            child: AppBar(\n              elevation: widget.elevation,\n              title: const AppBarTitle(),\n              titleSpacing: widget.showExpandButton ? 0 : null,\n              centerTitle: widget.showExpandButton ? false : null,\n              actions: [\n                //battery percentage\n                StreamBuilder<int>(\n                  stream: devControl.batteryPercentage,\n                  builder: (context, batteryPercentage) {\n                    if (devControl.isConnected &&\n                        (batteryPercentage.data != 0 || batteryValue != null) &&\n                        devControl.device.batterySupport) {\n                      if (batteryPercentage.hasData) {\n                        batteryValue = batteryPercentage.data;\n                      }\n                      if (batteryValue != null) {\n                        PageStorage.of(context).writeState(\n                            context, batteryValue,\n                            identifier: batteryKey);\n                      }\n                      return Stack(\n                        alignment: Alignment.center,\n                        children: [\n                          Transform.rotate(\n                              angle: pi / 2,\n                              child: const Icon(\n                                Icons.battery_full,\n                                size: 40,\n                              )),\n                          Text(\n                            \"$batteryValue%\",\n                            style: const TextStyle(\n                                color: Colors.black,\n                                fontSize: 12,\n                                fontWeight: FontWeight.bold),\n                          )\n                        ],\n                      );\n                    }\n                    return const SizedBox();\n                  },\n                ),\n                const SizedBox(width: 8),\n                if (!widget.showExpandButton)\n                  StreamBuilder(\n                    stream: devControl.connectStatus,\n                    builder: (context,\n                        AsyncSnapshot<DeviceConnectionState> snapshot) {\n                      if (snapshot.data != DeviceConnectionState.disconnected &&\n                          devControl.device is Tuner &&\n                          (devControl.device as Tuner).tunerAvailable) {\n                        return IconButton(\n                            icon: const Icon(MightierIcons.tuner),\n                            onPressed: () {\n                              Navigator.of(context).push(MaterialPageRoute(\n                                  builder: (context) => TunerPage(\n                                        device: devControl.device,\n                                      )));\n                            });\n                      }\n                      return const SizedBox();\n                    },\n                  ),\n                StreamBuilder<MidiSetupStatus>(\n                  stream: BLEMidiHandler.instance().status,\n                  builder: (context, snapshot) {\n                    IconData icon = Icons.bluetooth_disabled;\n                    Color color = Colors.grey;\n                    var status = BLEMidiHandler.instance().currentStatus;\n                    switch (status) {\n                      case MidiSetupStatus.bluetoothOff:\n                        icon = Icons.bluetooth_disabled;\n                        break;\n                      case MidiSetupStatus.deviceIdle:\n                      case MidiSetupStatus.deviceConnecting:\n                        icon = Icons.bluetooth;\n                        break;\n                      case MidiSetupStatus\n                            .deviceFound: //note device found is issued\n                      //during search only, but here it means nothing\n                      //so keep search status\n                      case MidiSetupStatus.deviceSearching:\n                        icon = Icons.bluetooth_searching;\n                        return const BlinkWidget(\n                          interval: 500,\n                          children: [\n                            Icon(\n                              Icons.bluetooth_searching,\n                              color: Colors.grey,\n                            ),\n                            Icon(Icons.bluetooth_searching)\n                          ],\n                        );\n\n                      case MidiSetupStatus.deviceConnected:\n                        icon = Icons.bluetooth_connected;\n                        color = Colors.white;\n                        batteryValue = null;\n                        break;\n                      case MidiSetupStatus.deviceDisconnected:\n                        icon = Icons.bluetooth;\n                        break;\n                      case MidiSetupStatus.unknown:\n                        icon = Icons.bluetooth_disabled;\n                        break;\n                    }\n                    return Icon(icon, color: color);\n                  },\n                ),\n                const SizedBox(\n                  width: 15,\n                )\n              ],\n            ),\n          )\n      ],\n    );\n  }\n}\n\nclass AppBarTitle extends StatelessWidget {\n  const AppBarTitle({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return ValueListenableBuilder(\n      builder: (BuildContext context, value, Widget? child) {\n        if (value is String && value.trim() != \"\") {\n          return Text(\"$value - Mightier Amp\");\n        }\n        return const Text(\"Mightier Amp\");\n      },\n      valueListenable: NuxDeviceControl.instance().presetNameNotifier,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/VolumeDrawer.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/value_formatters/ValueFormatter.dart';\n\nimport '../../bluetooth/NuxDeviceControl.dart';\nimport '../../platform/simpleSharedPrefs.dart';\nimport 'thickSlider.dart';\n\nconst _kBottomDrawerPickHeight = 50.0;\nconst _kBottomDrawerHiddenHeight = 60.0;\nconst _kBottomDrawerHiddenPadding = 8.0;\n\nclass BottomDrawer extends StatelessWidget {\n  final bool isBottomDrawerOpen;\n  final Function(bool) onExpandChange;\n  final Widget child;\n\n  const BottomDrawer({\n    Key? key,\n    required this.isBottomDrawerOpen,\n    required this.onExpandChange,\n    required this.child,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      onTap: () {\n        onExpandChange(!isBottomDrawerOpen);\n      },\n      onVerticalDragUpdate: (details) {\n        if (details.delta.dy < -5) {\n          //open\n          onExpandChange(true);\n        } else if (details.delta.dy > 5) {\n          //close\n          onExpandChange(false);\n        }\n      },\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Container(\n            width: _kBottomDrawerPickHeight,\n            decoration: BoxDecoration(\n              color: Theme.of(context).bottomNavigationBarTheme.backgroundColor,\n              borderRadius:\n                  const BorderRadius.vertical(top: Radius.circular(15)),\n            ),\n            child: Icon(\n              isBottomDrawerOpen\n                  ? Icons.keyboard_arrow_down\n                  : Icons.keyboard_arrow_up,\n              size: 24,\n              color: Colors.grey,\n            ),\n          ),\n          AnimatedContainer(\n            padding: const EdgeInsets.all(_kBottomDrawerHiddenPadding),\n            color: Theme.of(context).bottomNavigationBarTheme.backgroundColor,\n            duration: const Duration(milliseconds: 100),\n            height: isBottomDrawerOpen ? _kBottomDrawerHiddenHeight : 0,\n            child: child,\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass VolumeSlider extends StatelessWidget {\n  final String label;\n  const VolumeSlider({Key? key, this.label = \"Volume\"}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ValueListenableBuilder(\n      valueListenable: NuxDeviceControl.instance().masterVolumeNotifier,\n      builder: (context, value, child) {\n        final device = NuxDeviceControl.instance().device;\n        final volumeFormatter = device.fakeMasterVolume\n            ? ValueFormatters.percentage\n            : device.decibelFormatter!;\n        return ThickSlider(\n          activeColor: Colors.blue,\n          value: NuxDeviceControl.instance().masterVolume,\n          skipEmitting: 3,\n          label: label,\n          labelFormatter: volumeFormatter.toLabel,\n          min: volumeFormatter.min.toDouble(),\n          max: volumeFormatter.max.toDouble(),\n          handleVerticalDrag: false,\n          onChanged: _onVolumeChanged,\n          onDragEnd: _onVolumeDragEnd,\n        );\n      },\n    );\n  }\n\n  void _onVolumeDragEnd(value) {\n    NuxDeviceControl.instance().masterVolume = value;\n    if (NuxDeviceControl.instance().device.fakeMasterVolume) {\n      SharedPrefs().setValue(\n        SettingsKeys.masterVolume,\n        NuxDeviceControl.instance().masterVolume,\n      );\n    }\n  }\n\n  void _onVolumeChanged(value, bool skip) {\n    if (!skip) {\n      NuxDeviceControl.instance().masterVolume = value;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/app_drawer.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/mightierIcons.dart';\nimport 'package:mighty_plug_manager/UI/widgets/NuxAppBar.dart';\nimport 'package:mighty_plug_manager/UI/widgets/VolumeDrawer.dart';\n\nfinal _tiles = <TileModel>[\n  const TileModel(0, 'Editor', MightierIcons.sliders),\n  const TileModel(1, 'Presets', Icons.list),\n  const TileModel(2, 'Drums', MightierIcons.drum),\n  const TileModel(3, 'Jam Tracks', Icons.queue_music),\n  const TileModel(4, 'Settings', Icons.settings),\n];\n\nclass AppDrawer extends StatefulWidget {\n  final void Function(int) onSwitchPageIndex;\n  final int currentIndex;\n  final int totalTabs;\n\n  const AppDrawer({\n    required this.onSwitchPageIndex,\n    required this.currentIndex,\n    required this.totalTabs,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  State<AppDrawer> createState() => _AppDrawerState();\n}\n\nclass _AppDrawerState extends State<AppDrawer> {\n  static const expandedState = \"expandedState\";\n\n  bool isExpanded = false;\n  bool isBottomDrawerOpen = false;\n  bool expandChildren = false;\n\n  @override\n  void initState() {\n    super.initState();\n    isExpanded = PageStorage.of(context)\n            .readState(context, identifier: expandedState) as bool? ??\n        false;\n    expandChildren = isExpanded;\n  }\n\n  void _onExpandChange(bool expand) {\n    isExpanded = expand;\n    PageStorage.of(context)\n        .writeState(context, isExpanded, identifier: expandedState);\n    if (isExpanded == false) expandChildren = false;\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      onHorizontalDragUpdate: (details) {\n        if (details.delta.dx > 5) {\n          //open\n          _onExpandChange(true);\n        } else if (details.delta.dx < -5) {\n          //close\n          _onExpandChange(false);\n        }\n      },\n      child: AnimatedContainer(\n        color: Colors.grey[850],\n        onEnd: () {\n          if (isExpanded) expandChildren = true;\n          setState(() {});\n        },\n        duration: const Duration(milliseconds: 200),\n        width: isExpanded ? 230 : 56,\n        child: SafeArea(\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              MAAppBar(\n                elevation: 0,\n                expanded: expandChildren,\n                showExpandButton: true,\n                onExpandStateChanged: _onExpandChange,\n              ),\n              Expanded(\n                child: SingleChildScrollView(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      _DrawerTile(\n                        tileIndex: 0,\n                        onSwitchPageIndex: widget.onSwitchPageIndex,\n                        currentIndex: widget.currentIndex,\n                        expanded: expandChildren,\n                      ),\n                      _DrawerTile(\n                        tileIndex: 1,\n                        onSwitchPageIndex: widget.onSwitchPageIndex,\n                        currentIndex: widget.currentIndex,\n                        expanded: expandChildren,\n                      ),\n                      _DrawerTile(\n                        tileIndex: 2,\n                        onSwitchPageIndex: widget.onSwitchPageIndex,\n                        currentIndex: widget.currentIndex,\n                        expanded: expandChildren,\n                      ),\n                      _DrawerTile(\n                        tileIndex: 3,\n                        onSwitchPageIndex: widget.onSwitchPageIndex,\n                        currentIndex: widget.currentIndex,\n                        expanded: expandChildren,\n                      ),\n                      _DrawerTile(\n                        tileIndex: 4,\n                        onSwitchPageIndex: widget.onSwitchPageIndex,\n                        currentIndex: widget.currentIndex,\n                        expanded: expandChildren,\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              if (isExpanded)\n                BottomDrawer(\n                  isBottomDrawerOpen: isBottomDrawerOpen,\n                  onExpandChange: (val) => setState(() {\n                    isBottomDrawerOpen = val;\n                  }),\n                  child: const VolumeSlider(),\n                ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _DrawerTile extends StatelessWidget {\n  final int tileIndex;\n  final int currentIndex;\n  final bool expanded;\n  final void Function(int p1) onSwitchPageIndex;\n\n  const _DrawerTile(\n      {Key? key,\n      required this.onSwitchPageIndex,\n      required this.currentIndex,\n      required this.tileIndex,\n      required this.expanded})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final color =\n        tileIndex == currentIndex ? colorScheme.primary : colorScheme.secondary;\n    if (expanded) {\n      return ListTile(\n        selected: tileIndex == currentIndex,\n        title: Text(\n          _tiles.elementAt(tileIndex).title,\n          // textAlign: TextAlign.right,\n        ),\n        leading: Icon(\n          _tiles.elementAt(tileIndex).icon,\n        ),\n        minLeadingWidth: 10,\n        onTap: () => onSwitchPageIndex(tileIndex),\n      );\n    } else {\n      return Padding(\n        padding: const EdgeInsets.all(4),\n        child: IconButton(\n            onPressed: () => onSwitchPageIndex(tileIndex),\n            icon: Icon(\n              _tiles.elementAt(tileIndex).icon,\n              color: color,\n            )),\n      );\n    }\n  }\n}\n\n@immutable\nclass TileModel {\n  final int index;\n  final String title;\n  final IconData icon;\n\n  const TileModel(this.index, this.title, this.icon);\n}\n"
  },
  {
    "path": "lib/UI/widgets/bottomBar.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/mightierIcons.dart';\n\nclass BottomBar extends StatefulWidget {\n  final void Function(int) onTap;\n  final int index;\n\n  const BottomBar({\n    Key? key,\n    required this.index,\n    required this.onTap,\n  }) : super(key: key);\n\n  @override\n  State<BottomBar> createState() => _BottomBarState();\n}\n\nclass _BottomBarState extends State<BottomBar> {\n  @override\n  Widget build(BuildContext context) {\n    return BottomNavigationBar(\n      currentIndex: widget.index,\n      onTap: widget.onTap,\n      items: const [\n        BottomNavigationBarItem(\n          icon: Icon(MightierIcons.sliders),\n          label: \"Editor\",\n        ),\n        BottomNavigationBarItem(\n          icon: Icon(Icons.list),\n          label: \"Presets\",\n        ),\n        BottomNavigationBarItem(\n          icon: Icon(MightierIcons.drum),\n          label: \"Drums\",\n        ),\n        BottomNavigationBarItem(\n          icon: Icon(Icons.queue_music),\n          label: \"JamTracks\",\n        ),\n        BottomNavigationBarItem(\n          icon: Icon(Icons.settings),\n          label: \"Settings\",\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/circular_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass CircularButton extends StatelessWidget {\n  final IconData icon;\n  final Color backgroundColor;\n  final void Function()? onPressed;\n  final double iconSize;\n  final double iconPadding;\n  const CircularButton(\n      {super.key,\n      required this.icon,\n      required this.backgroundColor,\n      this.onPressed,\n      this.iconPadding = 20,\n      this.iconSize = 28});\n\n  @override\n  Widget build(BuildContext context) {\n    return ElevatedButton(\n      onPressed: onPressed,\n      style: ElevatedButton.styleFrom(\n        shape: const CircleBorder(),\n        padding: EdgeInsets.all(iconPadding),\n        backgroundColor: backgroundColor,\n        foregroundColor: Colors.white,\n      ),\n      child: Icon(\n        icon,\n        size: iconSize,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/blinkWidget.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\n\nclass BlinkWidget extends StatefulWidget {\n  final List<Widget> children;\n  final int interval;\n\n  const BlinkWidget({required this.children, this.interval = 500, Key? key})\n      : super(key: key);\n\n  @override\n  State createState() => _BlinkWidgetState();\n}\n\nclass _BlinkWidgetState extends State<BlinkWidget>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n  int _currentWidget = 0;\n\n  @override\n  initState() {\n    super.initState();\n\n    _controller = AnimationController(\n        duration: Duration(milliseconds: widget.interval), vsync: this);\n\n    _controller.addStatusListener((status) {\n      if (status == AnimationStatus.completed) {\n        setState(() {\n          if (++_currentWidget == widget.children.length) {\n            _currentWidget = 0;\n          }\n        });\n\n        _controller.forward(from: 0.0);\n      }\n    });\n\n    _controller.forward();\n  }\n\n  @override\n  dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      child: widget.children[_currentWidget],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/customPopupMenu.dart",
    "content": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\n\n// Examples can assume:\n// enum Commands { heroAndScholar, hurricaneCame }\n// dynamic _heroAndScholar;\n// dynamic _selection;\n// BuildContext context;\n// void setState(VoidCallback fn) { }\n\nconst Duration _kMenuDuration = Duration(milliseconds: 300);\nconst double _kBaselineOffsetFromBottom = 20.0;\nconst double _kMenuCloseIntervalEnd = 2.0 / 3.0;\nconst double _kMenuHorizontalPadding = 0.0; //16.0;\nconst double _kMenuItemHeight = 48.0;\nconst double _kMenuDividerHeight = 16.0;\nconst double _kMenuMaxWidth = 5.0 * _kMenuWidthStep;\nconst double _kMenuMinWidth = 2.0 * _kMenuWidthStep;\nconst double _kMenuVerticalPadding = 0.0; //8.0;\nconst double _kMenuWidthStep = 56.0;\nconst double _kMenuScreenPadding = 8.0;\n\n/// A base class for entries in a material design popup menu.\n///\n/// The popup menu widget uses this interface to interact with the menu items.\n/// To show a popup menu, use the [showMenu] function. To create a button that\n/// shows a popup menu, consider using [PopupMenuButton].\n///\n/// The type `T` is the type of the value(s) the entry represents. All the\n/// entries in a given menu must represent values with consistent types.\n///\n/// A [PopupMenuEntry] may represent multiple values, for example a row with\n/// several icons, or a single entry, for example a menu item with an icon (see\n/// [PopupMenuItem]), or no value at all (for example, [PopupMenuDivider]).\n///\n/// See also:\n///\n///  * [PopupMenuItem], a popup menu entry for a single value.\n///  * [PopupMenuDivider], a popup menu entry that is just a horizontal line.\n///  * [CheckedPopupMenuItem], a popup menu item with a checkmark.\n///  * [showMenu], a method to dynamically show a popup menu at a given location.\n///  * [PopupMenuButton], an [IconButton] that automatically shows a menu when\n///    it is tapped.\nabstract class PopupMenuEntry<T> extends StatefulWidget {\n  /// Abstract const constructor. This constructor enables subclasses to provide\n  /// const constructors so that they can be used in const expressions.\n  const PopupMenuEntry({Key? key}) : super(key: key);\n\n  /// The amount of vertical space occupied by this entry.\n  ///\n  /// This value is used at the time the [showMenu] method is called, if the\n  /// `initialValue` argument is provided, to determine the position of this\n  /// entry when aligning the selected entry over the given `position`. It is\n  /// otherwise ignored.\n  double get height;\n\n  /// Whether this entry represents a particular value.\n  ///\n  /// This method is used by [showMenu], when it is called, to align the entry\n  /// representing the `initialValue`, if any, to the given `position`, and then\n  /// later is called on each entry to determine if it should be highlighted (if\n  /// the method returns true, the entry will have its background color set to\n  /// the ambient [ThemeData.highlightColor]). If `initialValue` is null, then\n  /// this method is not called.\n  ///\n  /// If the [PopupMenuEntry] represents a single value, this should return true\n  /// if the argument matches that value. If it represents multiple values, it\n  /// should return true if the argument matches any of them.\n  bool represents(T value);\n}\n\n/// A thin horizontal line, with padding on either side.\n///\n/// In the material design language, this represents a divider. Dividers can be\n/// used in lists, [Drawer]s, and elsewhere to separate content.\n///\n/// To create a divider between [ListTile] items, consider using\n/// [ListTile.divideTiles], which is optimized for this case.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=_liUC641Nmk}\n///\n/// The box's total height is controlled by [height]. The appropriate\n/// padding is automatically computed from the height.\n///\n/// {@tool dartpad --template=stateless_widget_scaffold}\n///\n/// This sample shows how to display a Divider between an orange and blue box\n/// inside a column. The Divider is 20 logical pixels in height and contains a\n/// vertically centered black line that is 5 logical pixels thick. The black\n/// line is indented by 20 logical pixels.\n///\n/// ![](https://flutter.github.io/assets-for-api-docs/assets/material/divider.png)\n///\n/// ```dart\n/// Widget build(BuildContext context) {\n///   return Center(\n///     child: Column(\n///       children: <Widget>[\n///         Expanded(\n///           child: Container(\n///             color: Colors.amber,\n///             child: const Center(\n///               child: Text('Above'),\n///             ),\n///           ),\n///         ),\n///         const Divider(\n///           color: Colors.black,\n///           height: 20,\n///           thickness: 5,\n///           indent: 20,\n///           endIndent: 0,\n///         ),\n///         Expanded(\n///           child: Container(\n///             color: Colors.blue,\n///             child: const Center(\n///               child: Text('Below'),\n///             ),\n///           ),\n///         ),\n///       ],\n///     ),\n///   );\n/// }\n/// ```\n/// {@end-tool}\n/// See also:\n///\n///  * [PopupMenuDivider], which is the equivalent but for popup menus.\n///  * [ListTile.divideTiles], another approach to dividing widgets in a list.\n///  * <https://material.io/design/components/dividers.html>\nclass LabeledDivider extends StatelessWidget {\n  /// Creates a material design divider.\n  ///\n  /// The [height], [thickness], [indent], and [endIndent] must be null or\n  /// non-negative.\n  const LabeledDivider(\n      {Key? key,\n      this.height,\n      this.thickness,\n      this.indent,\n      this.insideIndent,\n      this.color,\n      required this.text})\n      : assert(height == null || height >= 0.0),\n        assert(thickness == null || thickness >= 0.0),\n        assert(indent == null || indent >= 0.0),\n        assert(insideIndent == null || insideIndent >= 0.0),\n        super(key: key);\n\n  /// The divider's height extent.\n  ///\n  /// The divider itself is always drawn as a horizontal line that is centered\n  /// within the height specified by this value.\n  ///\n  /// If this is null, then the [DividerThemeData.space] is used. If that is\n  /// also null, then this defaults to 16.0.\n  final double? height;\n\n  /// The thickness of the line drawn within the divider.\n  ///\n  /// A divider with a [thickness] of 0.0 is always drawn as a line with a\n  /// height of exactly one device pixel.\n  ///\n  /// If this is null, then the [DividerThemeData.thickness] is used. If\n  /// that is also null, then this defaults to 0.0.\n  final double? thickness;\n\n  /// The amount of empty space to the leading edge of the divider.\n  ///\n  /// If this is null, then the [DividerThemeData.indent] is used. If that is\n  /// also null, then this defaults to 0.0.\n  final double? indent;\n\n  /// The amount of empty space to the trailing edge of the divider.\n  ///\n  /// If this is null, then the [DividerThemeData.endIndent] is used. If that is\n  /// also null, then this defaults to 0.0.\n  final double? insideIndent;\n\n  /// The color to use when painting the line.\n  ///\n  /// If this is null, then the [DividerThemeData.color] is used. If that is\n  /// also null, then [ThemeData.dividerColor] is used.\n  ///\n  /// {@tool snippet}\n  ///\n  /// ```dart\n  /// Divider(\n  ///   color: Colors.deepOrange,\n  /// )\n  /// ```\n  /// {@end-tool}\n  final Color? color;\n\n  final String text;\n\n  @override\n  Widget build(BuildContext context) {\n    final DividerThemeData dividerTheme = DividerTheme.of(context);\n    final double height = this.height ?? dividerTheme.space ?? 16.0;\n    final double thickness = this.thickness ?? dividerTheme.thickness ?? 1.0;\n    final double indent = this.indent ?? dividerTheme.indent ?? 6.0;\n    final double insideIndent =\n        this.insideIndent ?? dividerTheme.endIndent ?? 4.0;\n\n    return Container(\n      color: Theme.of(context).popupMenuTheme.color,\n      height: height,\n      child: Row(\n        mainAxisSize: MainAxisSize.max,\n        crossAxisAlignment: CrossAxisAlignment.center,\n        children: [\n          Expanded(\n            child: Container(\n              margin:\n                  EdgeInsetsDirectional.only(start: indent, end: insideIndent),\n              height: thickness,\n              color: color,\n            ),\n          ),\n          Text(text, style: TextStyle(color: color)),\n          Expanded(\n            child: Container(\n              margin:\n                  EdgeInsetsDirectional.only(start: insideIndent, end: indent),\n              height: thickness,\n              color: color,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\n/// A horizontal divider in a material design popup menu.\n///\n/// This widget adapts the [Divider] for use in popup menus.\n///\n/// See also:\n///\n///  * [PopupMenuItem], for the kinds of items that this widget divides.\n///  * [showMenu], a method to dynamically show a popup menu at a given location.\n///  * [PopupMenuButton], an [IconButton] that automatically shows a menu when\n///    it is tapped.\n// ignore: prefer_void_to_null, https://github.com/dart-lang/sdk/issues/34416\nclass PopupMenuDivider extends PopupMenuEntry<Null> {\n  /// Creates a horizontal divider for a popup menu.\n  ///\n  /// By default, the divider has a height of 16 logical pixels.\n  const PopupMenuDivider(\n      {Key? key,\n      this.height = _kMenuDividerHeight,\n      required this.text,\n      this.color})\n      : super(key: key);\n\n  /// The height of the divider entry.\n  ///\n  /// Defaults to 16 pixels.\n  @override\n  final double height;\n  final String text;\n  final Color? color;\n\n  @override\n  bool represents(void value) => false;\n\n  @override\n  State createState() => _PopupMenuDividerState();\n}\n\nclass _PopupMenuDividerState extends State<PopupMenuDivider> {\n  @override\n  Widget build(BuildContext context) => LabeledDivider(\n        color: widget.color,\n        height: widget.height,\n        text: widget.text,\n      );\n}\n\n/// An item in a material design popup menu.\n///\n/// To show a popup menu, use the [showMenu] function. To create a button that\n/// shows a popup menu, consider using [PopupMenuButton].\n///\n/// To show a checkmark next to a popup menu item, consider using\n/// [CheckedPopupMenuItem].\n///\n/// Typically the [child] of a [PopupMenuItem] is a [Text] widget. More\n/// elaborate menus with icons can use a [ListTile]. By default, a\n/// [PopupMenuItem] is 48 pixels high. If you use a widget with a different\n/// height, it must be specified in the [height] property.\n///\n/// {@tool sample}\n///\n/// Here, a [Text] widget is used with a popup menu item. The `WhyFarther` type\n/// is an enum, not shown here.\n///\n/// ```dart\n/// const PopupMenuItem<WhyFarther>(\n///   value: WhyFarther.harder,\n///   child: Text('Working a lot harder'),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// See the example at [PopupMenuButton] for how this example could be used in a\n/// complete menu, and see the example at [CheckedPopupMenuItem] for one way to\n/// keep the text of [PopupMenuItem]s that use [Text] widgets in their [child]\n/// slot aligned with the text of [CheckedPopupMenuItem]s or of [PopupMenuItem]\n/// that use a [ListTile] in their [child] slot.\n///\n/// See also:\n///\n///  * [PopupMenuDivider], which can be used to divide items from each other.\n///  * [CheckedPopupMenuItem], a variant of [PopupMenuItem] with a checkmark.\n///  * [showMenu], a method to dynamically show a popup menu at a given location.\n///  * [PopupMenuButton], an [IconButton] that automatically shows a menu when\n///    it is tapped.\nclass PopupMenuItem<T> extends PopupMenuEntry<T> {\n  /// Creates an item for a popup menu.\n  ///\n  /// By default, the item is [enabled].\n  ///\n  /// The `height` and `enabled` arguments must not be null.\n  const PopupMenuItem({\n    Key? key,\n    required this.value,\n    this.enabled = true,\n    this.height = _kMenuItemHeight,\n    this.backgroundColor,\n    required this.child,\n  }) : super(key: key);\n\n  /// The value that will be returned by [showMenu] if this entry is selected.\n  final T value;\n\n  /// Whether the user is permitted to select this entry.\n  ///\n  /// Defaults to true. If this is false, then the item will not react to\n  /// touches.\n  final bool enabled;\n\n  /// The height of the entry.\n  ///\n  /// Defaults to 48 pixels.\n  @override\n  final double height;\n\n  /// The widget background color\n  ///\n  /// Defaults to white.\n  final Color? backgroundColor;\n\n  /// The widget below this widget in the tree.\n  ///\n  /// Typically a single-line [ListTile] (for menus with icons) or a [Text]. An\n  /// appropriate [DefaultTextStyle] is put in scope for the child. In either\n  /// case, the text should be short enough that it won't wrap.\n  final Widget child;\n\n  @override\n  bool represents(T value) => value == this.value;\n\n  @override\n  PopupMenuItemState<T, PopupMenuItem<T>> createState() =>\n      PopupMenuItemState<T, PopupMenuItem<T>>();\n}\n\n/// The [State] for [PopupMenuItem] subclasses.\n///\n/// By default this implements the basic styling and layout of Material Design\n/// popup menu items.\n///\n/// The [buildChild] method can be overridden to adjust exactly what gets placed\n/// in the menu. By default it returns [PopupMenuItem.child].\n///\n/// The [handleTap] method can be overridden to adjust exactly what happens when\n/// the item is tapped. By default, it uses [Navigator.pop] to return the\n/// [PopupMenuItem.value] from the menu route.\n///\n/// This class takes two type arguments. The second, `W`, is the exact type of\n/// the [Widget] that is using this [State]. It must be a subclass of\n/// [PopupMenuItem]. The first, `T`, must match the type argument of that widget\n/// class, and is the type of values returned from this menu.\nclass PopupMenuItemState<T, W extends PopupMenuItem<T>> extends State<W> {\n  /// The menu item contents.\n  ///\n  /// Used by the [build] method.\n  ///\n  /// By default, this returns [PopupMenuItem.child]. Override this to put\n  /// something else in the menu entry.\n  @protected\n  Widget buildChild() => widget.child;\n\n  /// The handler for when the user selects the menu item.\n  ///\n  /// Used by the [InkWell] inserted by the [build] method.\n  ///\n  /// By default, uses [Navigator.pop] to return the [PopupMenuItem.value] from\n  /// the menu route.\n  @protected\n  void handleTap() {\n    Navigator.pop<T>(context, widget.value);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    TextStyle style = theme.textTheme.titleMedium!;\n    if (!widget.enabled) style = style.copyWith(color: theme.disabledColor);\n\n    Widget item = AnimatedDefaultTextStyle(\n      style: style,\n      duration: kThemeChangeDuration,\n      child: Baseline(\n        baseline: widget.height - _kBaselineOffsetFromBottom,\n        baselineType: style.textBaseline!,\n        child: buildChild(),\n      ),\n    );\n    if (!widget.enabled) {\n      final bool isDark = theme.brightness == Brightness.dark;\n      item = IconTheme.merge(\n        data: IconThemeData(opacity: isDark ? 0.5 : 0.38),\n        child: item,\n      );\n    }\n\n    return InkWell(\n      onTap: widget.enabled ? handleTap : null,\n      child: Container(\n        color: widget.backgroundColor ?? Theme.of(context).popupMenuTheme.color,\n        height: widget.height,\n        padding:\n            const EdgeInsets.symmetric(horizontal: _kMenuHorizontalPadding),\n        child: item,\n      ),\n    );\n  }\n}\n\n/// An item with a checkmark in a material design popup menu.\n///\n/// To show a popup menu, use the [showMenu] function. To create a button that\n/// shows a popup menu, consider using [PopupMenuButton].\n///\n/// A [CheckedPopupMenuItem] is 48 pixels high, which matches the default height\n/// of a [PopupMenuItem]. The horizontal layout uses a [ListTile]; the checkmark\n/// is an [Icons.done] icon, shown in the [ListTile.leading] position.\n///\n/// {@tool sample}\n///\n/// Suppose a `Commands` enum exists that lists the possible commands from a\n/// particular popup menu, including `Commands.heroAndScholar` and\n/// `Commands.hurricaneCame`, and further suppose that there is a\n/// `_heroAndScholar` member field which is a boolean. The example below shows a\n/// menu with one menu item with a checkmark that can toggle the boolean, and\n/// one menu item without a checkmark for selecting the second option. (It also\n/// shows a divider placed between the two menu items.)\n///\n/// ```dart\n/// PopupMenuButton<Commands>(\n///   onSelected: (Commands result) {\n///     switch (result) {\n///       case Commands.heroAndScholar:\n///         setState(() { _heroAndScholar = !_heroAndScholar; });\n///         break;\n///       case Commands.hurricaneCame:\n///         // ...handle hurricane option\n///         break;\n///       // ...other items handled here\n///     }\n///   },\n///   itemBuilder: (BuildContext context) => <PopupMenuEntry<Commands>>[\n///     CheckedPopupMenuItem<Commands>(\n///       checked: _heroAndScholar,\n///       value: Commands.heroAndScholar,\n///       child: const Text('Hero and scholar'),\n///     ),\n///     const PopupMenuDivider(),\n///     const PopupMenuItem<Commands>(\n///       value: Commands.hurricaneCame,\n///       child: ListTile(leading: Icon(null), title: Text('Bring hurricane')),\n///     ),\n///     // ...other items listed here\n///   ],\n/// )\n/// ```\n/// {@end-tool}\n///\n/// In particular, observe how the second menu item uses a [ListTile] with a\n/// blank [Icon] in the [ListTile.leading] position to get the same alignment as\n/// the item with the checkmark.\n///\n/// See also:\n///\n///  * [PopupMenuItem], a popup menu entry for picking a command (as opposed to\n///    toggling a value).\n///  * [PopupMenuDivider], a popup menu entry that is just a horizontal line.\n///  * [showMenu], a method to dynamically show a popup menu at a given location.\n///  * [PopupMenuButton], an [IconButton] that automatically shows a menu when\n///    it is tapped.\nclass CheckedPopupMenuItem<T> extends PopupMenuItem<T> {\n  /// Creates a popup menu item with a checkmark.\n  ///\n  /// By default, the menu item is [enabled] but unchecked. To mark the item as\n  /// checked, set [checked] to true.\n  ///\n  /// The `checked` and `enabled` arguments must not be null.\n  const CheckedPopupMenuItem({\n    Key? key,\n    required T value,\n    this.checked = false,\n    bool enabled = true,\n    required Widget child,\n  }) : super(\n          key: key,\n          value: value,\n          enabled: enabled,\n          child: child,\n        );\n\n  /// Whether to display a checkmark next to the menu item.\n  ///\n  /// Defaults to false.\n  ///\n  /// When true, an [Icons.done] checkmark is displayed.\n  ///\n  /// When this popup menu item is selected, the checkmark will fade in or out\n  /// as appropriate to represent the implied new state.\n  final bool checked;\n\n  /// The widget below this widget in the tree.\n  ///\n  /// Typically a [Text]. An appropriate [DefaultTextStyle] is put in scope for\n  /// the child. The text should be short enough that it won't wrap.\n  ///\n  /// This widget is placed in the [ListTile.title] slot of a [ListTile] whose\n  /// [ListTile.leading] slot is an [Icons.done] icon.\n  @override\n  Widget get child => super.child;\n\n  @override\n  _CheckedPopupMenuItemState<T> createState() =>\n      _CheckedPopupMenuItemState<T>();\n}\n\nclass _CheckedPopupMenuItemState<T>\n    extends PopupMenuItemState<T, CheckedPopupMenuItem<T>>\n    with SingleTickerProviderStateMixin {\n  static const Duration _fadeDuration = Duration(milliseconds: 150);\n  late AnimationController _controller;\n  Animation<double> get _opacity => _controller.view;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(duration: _fadeDuration, vsync: this)\n      ..value = widget.checked ? 1.0 : 0.0\n      ..addListener(() => setState(() {/* animation changed */}));\n  }\n\n  @override\n  void handleTap() {\n    // This fades the checkmark in or out when tapped.\n    if (widget.checked) {\n      _controller.reverse();\n    } else {\n      _controller.forward();\n    }\n    super.handleTap();\n  }\n\n  @override\n  Widget buildChild() {\n    return ListTile(\n      enabled: widget.enabled,\n      leading: FadeTransition(\n        opacity: _opacity,\n        child: Icon(_controller.isDismissed ? null : Icons.done),\n      ),\n      title: widget.child,\n    );\n  }\n}\n\nclass _PopupMenu<T> extends StatelessWidget {\n  const _PopupMenu({\n    Key? key,\n    required this.route,\n    this.semanticLabel = \"\",\n    this.controller,\n  }) : super(key: key);\n\n  final _PopupMenuRoute<T> route;\n  final String semanticLabel;\n  final ScrollController? controller;\n  @override\n  Widget build(BuildContext context) {\n    final double unit = 1.0 /\n        (route.items.length +\n            1.5); // 1.0 for the width and 0.5 for the last item's fade.\n    final List<Widget> children = <Widget>[];\n\n    for (int i = 0; i < route.items.length; i += 1) {\n      final double start = (i + 1) * unit;\n      final double end = (start + 1.5 * unit).clamp(0.0, 1.0);\n      final CurvedAnimation opacity = CurvedAnimation(\n        parent: route.animation!,\n        curve: Interval(start, end),\n      );\n      Widget item = route.items[i];\n      if (route.initialValue != null &&\n          route.items[i].represents(route.initialValue)) {\n        item = ColoredBox(\n          color: Theme.of(context).highlightColor,\n          child: item,\n        );\n      }\n      children.add(FadeTransition(\n        opacity: opacity,\n        child: item,\n      ));\n    }\n\n    final CurveTween opacity =\n        CurveTween(curve: const Interval(0.0, 1.0 / 3.0));\n    final CurveTween width = CurveTween(curve: Interval(0.0, unit));\n    final CurveTween height =\n        CurveTween(curve: Interval(0.0, unit * route.items.length));\n\n    final Widget child = ConstrainedBox(\n      constraints: const BoxConstraints(\n        minWidth: _kMenuMinWidth,\n        maxWidth: _kMenuMaxWidth,\n      ),\n      child: IntrinsicWidth(\n        stepWidth: _kMenuWidthStep,\n        child: Semantics(\n          scopesRoute: true,\n          namesRoute: true,\n          explicitChildNodes: true,\n          label: semanticLabel,\n          child: SingleChildScrollView(\n            controller: controller,\n            padding:\n                const EdgeInsets.symmetric(vertical: _kMenuVerticalPadding),\n            child: ListBody(children: children),\n          ),\n        ),\n      ),\n    );\n\n    return AnimatedBuilder(\n      animation: route.animation!,\n      builder: (BuildContext context, Widget? child) {\n        return Opacity(\n          opacity: opacity.evaluate(route.animation!),\n          child: Material(\n            type: MaterialType.transparency,\n            elevation: route.elevation,\n            child: Align(\n              alignment: AlignmentDirectional.topEnd,\n              widthFactor: width.evaluate(route.animation!),\n              heightFactor: height.evaluate(route.animation!),\n              child: child,\n            ),\n          ),\n        );\n      },\n      child: child,\n    );\n  }\n}\n\n// Positioning of the menu on the screen.\nclass _PopupMenuRouteLayout extends SingleChildLayoutDelegate {\n  _PopupMenuRouteLayout(\n      this.position, this.selectedItemOffset, this.textDirection);\n\n  // Rectangle of underlying button, relative to the overlay's dimensions.\n  final RelativeRect position;\n\n  // The distance from the top of the menu to the middle of selected item.\n  //\n  // This will be null if there's no item to position in this way.\n  final double selectedItemOffset;\n\n  // Whether to prefer going to the left or to the right.\n  final TextDirection textDirection;\n\n  // We put the child wherever position specifies, so long as it will fit within\n  // the specified parent size padded (inset) by 8. If necessary, we adjust the\n  // child's position so that it fits.\n\n  @override\n  BoxConstraints getConstraintsForChild(BoxConstraints constraints) {\n    // The menu can be at most the size of the overlay minus 8.0 pixels in each\n    // direction.\n    return BoxConstraints.loose(constraints.biggest -\n            const Offset(_kMenuScreenPadding * 2.0, _kMenuScreenPadding * 2.0)\n        as Size);\n  }\n\n  @override\n  Offset getPositionForChild(Size size, Size childSize) {\n    // size: The size of the overlay.\n    // childSize: The size of the menu, when fully open, as determined by\n    // getConstraintsForChild.\n\n    // Find the ideal vertical position.\n    double y;\n\n    y = position.top +\n        (size.height - position.top - position.bottom) / 2.0 -\n        selectedItemOffset;\n\n    // Find the ideal horizontal position.\n    double x;\n    if (position.left > position.right) {\n      // Menu button is closer to the right edge, so grow to the left, aligned to the right edge.\n      x = size.width - position.right - childSize.width;\n    } else if (position.left < position.right) {\n      // Menu button is closer to the left edge, so grow to the right, aligned to the left edge.\n      x = position.left;\n    } else {\n      // Menu button is equidistant from both edges, so grow in reading direction.\n      switch (textDirection) {\n        case TextDirection.rtl:\n          x = size.width - position.right - childSize.width;\n          break;\n        case TextDirection.ltr:\n          x = position.left;\n          break;\n      }\n    }\n\n    // Avoid going outside an area defined as the rectangle 8.0 pixels from the\n    // edge of the screen in every direction.\n    if (x < _kMenuScreenPadding) {\n      x = _kMenuScreenPadding;\n    } else if (x + childSize.width > size.width - _kMenuScreenPadding) {\n      x = size.width - childSize.width - _kMenuScreenPadding;\n    }\n    if (y < _kMenuScreenPadding) {\n      y = _kMenuScreenPadding;\n    } else if (y + childSize.height > size.height - _kMenuScreenPadding) {\n      y = size.height - childSize.height - _kMenuScreenPadding;\n    }\n    return Offset(x, y);\n  }\n\n  @override\n  bool shouldRelayout(_PopupMenuRouteLayout oldDelegate) {\n    return position != oldDelegate.position;\n  }\n}\n\nclass _PopupMenuRoute<T> extends PopupRoute<T> {\n  _PopupMenuRoute({\n    required this.position,\n    required this.items,\n    this.initialValue,\n    this.elevation = 8,\n    required this.theme,\n    required this.barrierLabel,\n    required this.semanticLabel,\n  });\n\n  final RelativeRect position;\n  final List<PopupMenuEntry<T>> items;\n  final dynamic initialValue;\n  final double elevation;\n  final ThemeData theme;\n  final String semanticLabel;\n\n  @override\n  Animation<double> createAnimation() {\n    return CurvedAnimation(\n      parent: super.createAnimation(),\n      curve: Curves.linear,\n      reverseCurve: const Interval(0.0, _kMenuCloseIntervalEnd),\n    );\n  }\n\n  @override\n  Duration get transitionDuration => _kMenuDuration;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  Color? get barrierColor => null;\n\n  @override\n  final String barrierLabel;\n\n  ScrollController? scrollController;\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    double selectedItemOffset = 0;\n    double scrollItemOffset = 0;\n    if (initialValue != null) {\n      double y = _kMenuVerticalPadding;\n      for (PopupMenuEntry<T> entry in items) {\n        if (entry.represents(initialValue)) {\n          selectedItemOffset = y + entry.height / 2.0;\n          scrollItemOffset = y - entry.height / 2.0;\n          break;\n        }\n        y += entry.height;\n      }\n    }\n\n    scrollController = ScrollController(initialScrollOffset: scrollItemOffset);\n    Widget menu = _PopupMenu<T>(\n        route: this,\n        semanticLabel: semanticLabel,\n        controller: scrollController);\n    menu = Theme(data: theme, child: menu);\n\n    return SafeArea(\n      child: Builder(\n        builder: (BuildContext context) {\n          return CustomSingleChildLayout(\n            delegate: _PopupMenuRouteLayout(\n              position,\n              selectedItemOffset,\n              Directionality.of(context),\n            ),\n            child: menu,\n          );\n        },\n      ),\n    );\n  }\n}\n\n/// Show a popup menu that contains the `items` at `position`.\n///\n/// `items` should be non-null and not empty.\n///\n/// If `initialValue` is specified then the first item with a matching value\n/// will be highlighted and the value of `position` gives the rectangle whose\n/// vertical center will be aligned with the vertical center of the highlighted\n/// item (when possible).\n///\n/// If `initialValue` is not specified then the top of the menu will be aligned\n/// with the top of the `position` rectangle.\n///\n/// In both cases, the menu position will be adjusted if necessary to fit on the\n/// screen.\n///\n/// Horizontally, the menu is positioned so that it grows in the direction that\n/// has the most room. For example, if the `position` describes a rectangle on\n/// the left edge of the screen, then the left edge of the menu is aligned with\n/// the left edge of the `position`, and the menu grows to the right. If both\n/// edges of the `position` are equidistant from the opposite edge of the\n/// screen, then the ambient [Directionality] is used as a tie-breaker,\n/// preferring to grow in the reading direction.\n///\n/// The positioning of the `initialValue` at the `position` is implemented by\n/// iterating over the `items` to find the first whose\n/// [PopupMenuEntry.represents] method returns true for `initialValue`, and then\n/// summing the values of [PopupMenuEntry.height] for all the preceding widgets\n/// in the list.\n///\n/// The `elevation` argument specifies the z-coordinate at which to place the\n/// menu. The elevation defaults to 8, the appropriate elevation for popup\n/// menus.\n///\n/// The `context` argument is used to look up the [Navigator] and [Theme] for\n/// the menu. It is only used when the method is called. Its corresponding\n/// widget can be safely removed from the tree before the popup menu is closed.\n///\n/// The `semanticLabel` argument is used by accessibility frameworks to\n/// announce screen transitions when the menu is opened and closed. If this\n/// label is not provided, it will default to\n/// [MaterialLocalizations.popupMenuLabel].\n///\n/// See also:\n///\n///  * [PopupMenuItem], a popup menu entry for a single value.\n///  * [PopupMenuDivider], a popup menu entry that is just a horizontal line.\n///  * [CheckedPopupMenuItem], a popup menu item with a checkmark.\n///  * [PopupMenuButton], which provides an [IconButton] that shows a menu by\n///    calling this method automatically.\n///  * [SemanticsConfiguration.namesRoute], for a description of edge triggered\n///    semantics.\nFuture<T?> showMenu<T>({\n  required BuildContext context,\n  required RelativeRect position,\n  required List<PopupMenuEntry<T>> items,\n  T? initialValue,\n  double elevation = 8.0,\n  String semanticLabel = \"\",\n}) {\n  assert(items.isNotEmpty);\n  assert(debugCheckHasMaterialLocalizations(context));\n  String label = semanticLabel;\n  switch (defaultTargetPlatform) {\n    case TargetPlatform.iOS:\n      label = semanticLabel;\n      break;\n    case TargetPlatform.android:\n    case TargetPlatform.fuchsia:\n      label = semanticLabel.isNotEmpty\n          ? semanticLabel\n          : MaterialLocalizations.of(context).popupMenuLabel;\n      break;\n    default:\n      label = semanticLabel;\n  }\n\n  return Navigator.push(\n      context,\n      _PopupMenuRoute<T>(\n        position: position,\n        items: items,\n        initialValue: initialValue,\n        elevation: elevation,\n        semanticLabel: label,\n        theme: Theme.of(context),\n        barrierLabel:\n            MaterialLocalizations.of(context).modalBarrierDismissLabel,\n      ));\n}\n\n/// Signature for the callback invoked when a menu item is selected. The\n/// argument is the value of the [PopupMenuItem] that caused its menu to be\n/// dismissed.\n///\n/// Used by [PopupMenuButton.onSelected].\ntypedef PopupMenuItemSelected<T> = void Function(T value);\n\n/// Signature for the callback invoked when a [PopupMenuButton] is dismissed\n/// without selecting an item.\n///\n/// Used by [PopupMenuButton.onCanceled].\ntypedef PopupMenuCanceled = void Function();\n\n/// Signature used by [PopupMenuButton] to lazily construct the items shown when\n/// the button is pressed.\n///\n/// Used by [PopupMenuButton.itemBuilder].\ntypedef PopupMenuItemBuilder<T> = List<PopupMenuEntry<T>> Function(\n    BuildContext context);\n\n/// Displays a menu when pressed and calls [onSelected] when the menu is dismissed\n/// because an item was selected. The value passed to [onSelected] is the value of\n/// the selected menu item.\n///\n/// One of [child] or [icon] may be provided, but not both. If [icon] is provided,\n/// then [PopupMenuButton] behaves like an [IconButton].\n///\n/// If both are null, then a standard overflow icon is created (depending on the\n/// platform).\n///\n/// {@tool sample}\n///\n/// This example shows a menu with four items, selecting between an enum's\n/// values and setting a `_selection` field based on the selection.\n///\n/// ```dart\n/// // This is the type used by the popup menu below.\n/// enum WhyFarther { harder, smarter, selfStarter, tradingCharter }\n///\n/// // This menu button widget updates a _selection field (of type WhyFarther,\n/// // not shown here).\n/// PopupMenuButton<WhyFarther>(\n///   onSelected: (WhyFarther result) { setState(() { _selection = result; }); },\n///   itemBuilder: (BuildContext context) => <PopupMenuEntry<WhyFarther>>[\n///     const PopupMenuItem<WhyFarther>(\n///       value: WhyFarther.harder,\n///       child: Text('Working a lot harder'),\n///     ),\n///     const PopupMenuItem<WhyFarther>(\n///       value: WhyFarther.smarter,\n///       child: Text('Being a lot smarter'),\n///     ),\n///     const PopupMenuItem<WhyFarther>(\n///       value: WhyFarther.selfStarter,\n///       child: Text('Being a self-starter'),\n///     ),\n///     const PopupMenuItem<WhyFarther>(\n///       value: WhyFarther.tradingCharter,\n///       child: Text('Placed in charge of trading charter'),\n///     ),\n///   ],\n/// )\n/// ```\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [PopupMenuItem], a popup menu entry for a single value.\n///  * [PopupMenuDivider], a popup menu entry that is just a horizontal line.\n///  * [CheckedPopupMenuItem], a popup menu item with a checkmark.\n///  * [showMenu], a method to dynamically show a popup menu at a given location.\nclass PopupMenuButton<T> extends StatelessWidget {\n  /// Creates a button that shows a popup menu.\n  ///\n  /// The [itemBuilder] argument must not be null.\n  const PopupMenuButton({\n    Key? key,\n    required this.itemBuilder,\n    this.initialValue,\n    this.onSelected,\n    this.onCanceled,\n    this.tooltip,\n    this.elevation = 8.0,\n    this.padding = const EdgeInsets.all(8.0),\n    this.child,\n    this.icon,\n    this.offset = Offset.zero,\n    this.enabled = true,\n  })  : assert(!(child != null &&\n            icon != null)), // fails if passed both parameters\n        super(key: key);\n\n  /// Called when the button is pressed to create the items to show in the menu.\n  final PopupMenuItemBuilder<T> itemBuilder;\n\n  /// The value of the menu item, if any, that should be highlighted when the menu opens.\n  final T? initialValue;\n\n  /// Called when the user selects a value from the popup menu created by this button.\n  ///\n  /// If the popup menu is dismissed without selecting a value, [onCanceled] is\n  /// called instead.\n  final PopupMenuItemSelected<T>? onSelected;\n\n  /// Called when the user dismisses the popup menu without selecting an item.\n  ///\n  /// If the user selects a value, [onSelected] is called instead.\n  final PopupMenuCanceled? onCanceled;\n\n  /// Text that describes the action that will occur when the button is pressed.\n  ///\n  /// This text is displayed when the user long-presses on the button and is\n  /// used for accessibility.\n  final String? tooltip;\n\n  /// The z-coordinate at which to place the menu when open. This controls the\n  /// size of the shadow below the menu.\n  ///\n  /// Defaults to 8, the appropriate elevation for popup menus.\n  final double elevation;\n\n  /// Matches IconButton's 8 dps padding by default. In some cases, notably where\n  /// this button appears as the trailing element of a list item, it's useful to be able\n  /// to set the padding to zero.\n  final EdgeInsetsGeometry padding;\n\n  /// If provided, the widget used for this button.\n  final Widget? child;\n\n  /// If provided, the icon used for this button.\n  final Icon? icon;\n\n  /// The offset applied to the Popup Menu Button.\n  ///\n  /// When not set, the Popup Menu Button will be positioned directly next to\n  /// the button that was used to create it.\n  final Offset offset;\n\n  /// Whether this popup menu button is interactive.\n  ///\n  /// Must be non-null, defaults to `true`\n  ///\n  /// If `true` the button will respond to presses by displaying the menu.\n  ///\n  /// If `false`, the button is styled with the disabled color from the\n  /// current [Theme] and will not respond to presses or show the popup\n  /// menu and [onSelected], [onCanceled] and [itemBuilder] will not be called.\n  ///\n  /// This can be useful in situations where the app needs to show the button,\n  /// but doesn't currently have anything to show in the menu.\n  final bool enabled;\n\n  // @override\n  // _PopupMenuButtonState<T> createState() => _PopupMenuButtonState<T>();\n\n  void showButtonMenu(BuildContext context) {\n    final RenderBox button = context.findRenderObject() as RenderBox;\n    final RenderBox overlay =\n        Overlay.of(context).context.findRenderObject() as RenderBox;\n    final RelativeRect position = RelativeRect.fromRect(\n      Rect.fromPoints(\n        button.localToGlobal(offset, ancestor: overlay),\n        button.localToGlobal(button.size.bottomRight(Offset.zero),\n            ancestor: overlay),\n      ),\n      Offset.zero & overlay.size,\n    );\n    final List<PopupMenuEntry<T>> items = itemBuilder(context);\n    // Only show the menu if there is something to show\n    if (items.isNotEmpty) {\n      showMenu<T>(\n        context: context,\n        elevation: elevation,\n        items: items,\n        initialValue: initialValue,\n        position: position,\n      ).then<void>((T? newValue) {\n        //if (!mounted) return null;\n        if (newValue == null) {\n          onCanceled?.call();\n          return null;\n        }\n        onSelected?.call(newValue);\n      });\n    }\n  }\n\n  Icon _getIcon(TargetPlatform platform) {\n    switch (platform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        return const Icon(Icons.more_vert);\n      case TargetPlatform.iOS:\n        return const Icon(Icons.more_horiz);\n      default:\n        return const Icon(Icons.more_vert);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterialLocalizations(context));\n    return child != null\n        ? InkWell(\n            onTap: enabled ? () => showButtonMenu(context) : null,\n            child: child,\n          )\n        : IconButton(\n            icon: icon ?? _getIcon(Theme.of(context).platform),\n            padding: padding,\n            tooltip:\n                tooltip ?? MaterialLocalizations.of(context).showMenuTooltip,\n            onPressed: enabled ? () => showButtonMenu(context) : null,\n          );\n  }\n}\n\n// class _PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {\n\n// }\n"
  },
  {
    "path": "lib/UI/widgets/common/modeControlRegular.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ModeControlRegular extends StatelessWidget {\n  final List<String> options;\n  final int selected;\n  final void Function(int index)? onSelected;\n  final TextStyle? textStyle;\n  const ModeControlRegular(\n      {super.key,\n      required this.options,\n      required this.selected,\n      this.onSelected,\n      this.textStyle});\n\n  Widget _modeButton(String mode) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 14),\n      child: Text(mode, style: textStyle),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<bool> active =\n        List.generate(options.length, (i) => i == selected ? true : false);\n    return ToggleButtons(\n      fillColor: Colors.blue,\n      selectedBorderColor: Colors.blue,\n      borderColor: Colors.grey[600],\n      color: Colors.grey,\n      isSelected: active,\n      onPressed: onSelected,\n      children: [\n        for (var i = 0; i < options.length; i++) _modeButton(options[i])\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/nestedWillPopScope.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass NestedWillPopScope extends StatefulWidget {\n  const NestedWillPopScope({\n    Key? key,\n    required this.child,\n    required this.onWillPop,\n  }) : super(key: key);\n\n  final Widget child;\n  final WillPopCallback onWillPop;\n\n  @override\n  _NestedWillPopScopeState createState() => _NestedWillPopScopeState();\n\n  static _NestedWillPopScopeState? of(BuildContext context) {\n    return context.findAncestorStateOfType<_NestedWillPopScopeState>();\n  }\n}\n\nclass _NestedWillPopScopeState extends State<NestedWillPopScope> {\n  ModalRoute<dynamic>? _route;\n\n  _NestedWillPopScopeState? _descendant;\n  set descendant(state) {\n    _descendant = state;\n    updateRouteCallback();\n  }\n\n  Future<bool> onWillPop() async {\n    bool? willPop;\n    if (_descendant != null) {\n      willPop = await _descendant!.onWillPop();\n    }\n    if (willPop == null || willPop) {\n      willPop = await widget.onWillPop();\n    }\n    return willPop;\n  }\n\n  void updateRouteCallback() {\n    _route?.removeScopedWillPopCallback(onWillPop);\n    _route = ModalRoute.of(context);\n    _route?.addScopedWillPopCallback(onWillPop);\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    var parentGuard = NestedWillPopScope.of(context);\n    if (parentGuard != null) {\n      parentGuard.descendant = this;\n    }\n    updateRouteCallback();\n  }\n\n  @override\n  void dispose() {\n    _route?.removeScopedWillPopCallback(onWillPop);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) => widget.child;\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/numberPicker.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\ntypedef TextMapper = String Function(String numberText);\n\nclass NumberPicker extends StatefulWidget {\n  /// Min value user can pick\n  final int minValue;\n\n  /// Max value user can pick\n  final int maxValue;\n\n  /// Currently selected value\n  final int value;\n\n  /// Called when selected value changes\n  final ValueChanged<int>? onChanged;\n\n  /// Specifies how many items should be shown - defaults to 3\n  final int itemCount;\n\n  /// Step between elements. Only for integer datePicker\n  /// Examples:\n  /// if step is 100 the following elements may be 100, 200, 300...\n  /// if min=0, max=6, step=3, then items will be 0, 3 and 6\n  /// if min=0, max=5, step=3, then items will be 0 and 3.\n  final int step;\n\n  /// height of single item in pixels\n  final double itemHeight;\n\n  /// width of single item in pixels\n  final double itemWidth;\n\n  /// Direction of scrolling\n  final Axis axis;\n\n  /// Style of non-selected numbers. If null, it uses Theme's bodyText2\n  final TextStyle? textStyle;\n\n  /// Style of non-selected numbers. If null, it uses Theme's headline5 with accentColor\n  final TextStyle? selectedTextStyle;\n\n  /// Whether to trigger haptic pulses or not\n  final bool haptics;\n\n  /// Build the text of each item on the picker\n  final TextMapper? textMapper;\n\n  /// Pads displayed integer values up to the length of maxValue\n  final bool zeroPad;\n\n  /// display the number in hex format\n  final bool hex;\n\n  /// Symbol to display instead of zero\n  final String? zeroSymbol;\n\n  /// Decoration to apply to central box where the selected value is placed\n  final Decoration? decoration;\n\n  const NumberPicker({\n    Key? key,\n    required this.minValue,\n    required this.maxValue,\n    required this.value,\n    required this.onChanged,\n    this.itemCount = 3,\n    this.step = 1,\n    this.itemHeight = 50,\n    this.itemWidth = 100,\n    this.axis = Axis.vertical,\n    this.textStyle,\n    this.selectedTextStyle,\n    this.haptics = false,\n    this.decoration,\n    this.hex = false,\n    this.zeroSymbol,\n    this.zeroPad = false,\n    this.textMapper,\n  })  : assert(minValue <= value),\n        assert(value <= maxValue),\n        super(key: key);\n\n  @override\n  State createState() => _NumberPickerState();\n}\n\nclass _NumberPickerState extends State<NumberPicker> {\n  late ScrollController _scrollController;\n\n  @override\n  void initState() {\n    super.initState();\n    final initialOffset =\n        (widget.value - widget.minValue) ~/ widget.step * itemExtent;\n    _scrollController = ScrollController(initialScrollOffset: initialOffset)\n      ..addListener(_scrollListener);\n  }\n\n  void _scrollListener() {\n    final indexOfMiddleElement =\n        (_scrollController.offset / itemExtent).round().clamp(0, itemCount - 1);\n    final intValueInTheMiddle = _intValueFromIndex(indexOfMiddleElement + 1);\n\n    if (widget.value != intValueInTheMiddle) {\n      widget.onChanged?.call(intValueInTheMiddle);\n      if (widget.haptics) {\n        HapticFeedback.selectionClick();\n      }\n    }\n    Future.delayed(\n      const Duration(milliseconds: 100),\n      () => _maybeCenterValue(),\n    );\n  }\n\n  @override\n  void didUpdateWidget(NumberPicker oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.value != widget.value) {\n      _maybeCenterValue();\n    }\n  }\n\n  @override\n  void dispose() {\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  bool get isScrolling => _scrollController.position.isScrollingNotifier.value;\n\n  double get itemExtent =>\n      widget.axis == Axis.vertical ? widget.itemHeight : widget.itemWidth;\n\n  int get itemCount => (widget.maxValue - widget.minValue) ~/ widget.step + 1;\n\n  int get listItemsCount => itemCount + 2;\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      width: widget.axis == Axis.vertical\n          ? widget.itemWidth\n          : widget.itemCount * widget.itemWidth,\n      height: widget.axis == Axis.vertical\n          ? widget.itemCount * widget.itemHeight\n          : widget.itemHeight,\n      child: NotificationListener<ScrollEndNotification>(\n        onNotification: (not) {\n          if (not.dragDetails?.primaryVelocity == 0) {\n            Future.microtask(() => _maybeCenterValue());\n          }\n          return true;\n        },\n        child: Stack(\n          children: [\n            ListView.builder(\n              itemCount: listItemsCount,\n              scrollDirection: widget.axis,\n              controller: _scrollController,\n              itemExtent: itemExtent,\n              itemBuilder: _itemBuilder,\n            ),\n            _NumberPickerSelectedItemDecoration(\n              axis: widget.axis,\n              itemExtent: itemExtent,\n              decoration: widget.decoration,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _itemBuilder(BuildContext context, int index) {\n    final themeData = Theme.of(context);\n    final defaultStyle = widget.textStyle ?? themeData.textTheme.bodyMedium;\n    final selectedStyle = widget.selectedTextStyle ??\n        themeData.textTheme.headlineSmall\n            ?.copyWith(color: themeData.colorScheme.surface);\n\n    final value = _intValueFromIndex(index);\n    final isExtra = index == 0 || index == listItemsCount - 1;\n    final itemStyle = value == widget.value ? selectedStyle : defaultStyle;\n\n    final child = isExtra\n        ? const SizedBox.shrink()\n        : Text(\n            _getDisplayedValue(value),\n            style: itemStyle,\n          );\n\n    return Container(\n      width: widget.itemWidth,\n      height: widget.itemHeight,\n      alignment: Alignment.center,\n      child: child,\n    );\n  }\n\n  String _getDisplayedValue(int value) {\n    String text = \"\";\n    if (value == 0 && widget.zeroSymbol != null) return widget.zeroSymbol!;\n    if (widget.hex) {\n      text = value.toRadixString(16).padLeft(2, '0');\n      return text;\n    } else {\n      String strValue = value.toString();\n      text = widget.zeroPad\n          ? strValue.padLeft(widget.maxValue.toString().length, '0')\n          : strValue.toString();\n    }\n    if (widget.textMapper != null) {\n      return widget.textMapper!(text);\n    } else {\n      return text;\n    }\n  }\n\n  int _intValueFromIndex(int index) {\n    index--;\n    index %= itemCount;\n    return widget.minValue + index * widget.step;\n  }\n\n  void _maybeCenterValue() {\n    if (_scrollController.hasClients && !isScrolling) {\n      int diff = widget.value - widget.minValue;\n      int index = diff ~/ widget.step;\n      _scrollController.animateTo(\n        index * itemExtent,\n        duration: const Duration(milliseconds: 300),\n        curve: Curves.easeOutCubic,\n      );\n    }\n  }\n}\n\nclass _NumberPickerSelectedItemDecoration extends StatelessWidget {\n  final Axis axis;\n  final double itemExtent;\n  final Decoration? decoration;\n\n  const _NumberPickerSelectedItemDecoration({\n    Key? key,\n    required this.axis,\n    required this.itemExtent,\n    required this.decoration,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: IgnorePointer(\n        child: Container(\n          width: isVertical ? double.infinity : itemExtent,\n          height: isVertical ? itemExtent : double.infinity,\n          decoration: decoration,\n        ),\n      ),\n    );\n  }\n\n  bool get isVertical => axis == Axis.vertical;\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/rounded_icon_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass RoundedIconButton extends StatelessWidget {\n  final VoidCallback? onPressed;\n  final Widget icon;\n  final String? tooltip;\n  final double borderRadius;\n\n  const RoundedIconButton(\n      {Key? key,\n      this.onPressed,\n      required this.icon,\n      this.tooltip,\n      this.borderRadius = 6})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: ShapeDecoration(\n        color: onPressed != null ? Colors.blue : Colors.grey[800],\n        shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(borderRadius)),\n      ),\n      child: IconButton(\n        constraints: ButtonTheme.of(context).constraints,\n        icon: icon,\n        onPressed: onPressed,\n        tooltip: tooltip,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/common/searchTextField.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass SearchTextField extends StatelessWidget {\n  final TextEditingController controller;\n  final void Function(String?)? onSearch;\n\n  const SearchTextField({Key? key, required this.controller, this.onSearch})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return TextField(\n      controller: controller,\n      onSubmitted: onSearch,\n      decoration: InputDecoration(\n        hintText: \"Search\",\n        hintStyle: const TextStyle(color: Colors.grey),\n        prefixIcon: const Icon(\n          Icons.search,\n          color: Colors.grey,\n        ),\n        suffixIcon: IconButton(\n          onPressed: () {\n            controller.clear();\n            FocusScope.of(context).unfocus();\n          },\n          icon: const Icon(Icons.clear),\n          color: Colors.grey,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/deviceList.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\n\nimport '../../bluetooth/bleMidiHandler.dart';\n\nclass DeviceList extends StatelessWidget {\n  final BLEMidiHandler midiHandler = BLEMidiHandler.instance();\n\n  DeviceList({Key? key}) : super(key: key);\n\n  bool isConnected(String id) {\n    //check with nux device first\n    if (midiHandler.connectedDevice != null &&\n        id == midiHandler.connectedDevice?.id) return true;\n\n    for (var controller in midiHandler.controllerDevices) {\n      if (controller.id == id) return true;\n    }\n    return false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ListView.builder(\n      // Let the ListView know how many items it needs to build\n      itemCount: midiHandler.nuxDevices.length,\n      // Provide a builder function. This is where the magic happens! We'll\n      // convert each item into a Widget based on the type of item it is.\n      itemBuilder: (context, index) {\n        final result = midiHandler.nuxDevices[index];\n        return ListTile(\n          title: Text(result.name,\n              style: Theme.of(context).textTheme.titleLarge!.copyWith(\n                  color: isConnected(result.id) ? Colors.blue : Colors.white)),\n          trailing: const Icon(Icons.bluetooth, color: Colors.white),\n          onTap: () {\n            midiHandler.connectToDevice(result.device);\n          },\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/fabMenu.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\n\nimport 'common/nestedWillPopScope.dart';\n\nclass Bubble {\n  const Bubble(\n      {required this.title,\n      required this.titleStyle,\n      required this.iconColor,\n      required this.bubbleColor,\n      required this.icon,\n      required this.onPress});\n\n  final IconData icon;\n  final Color iconColor;\n  final Color bubbleColor;\n  final Function() onPress;\n  final String title;\n  final TextStyle titleStyle;\n}\n\nclass BubbleMenu extends StatelessWidget {\n  const BubbleMenu(this.item, {Key? key}) : super(key: key);\n\n  final Bubble item;\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialButton(\n      shape: const StadiumBorder(),\n      padding: const EdgeInsets.only(top: 11, bottom: 13, left: 32, right: 32),\n      color: item.bubbleColor,\n      splashColor: Colors.grey.withOpacity(0.1),\n      highlightColor: Colors.grey.withOpacity(0.1),\n      elevation: 2,\n      highlightElevation: 2,\n      disabledColor: item.bubbleColor,\n      onPressed: item.onPress,\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: <Widget>[\n          Icon(\n            item.icon,\n            color: item.iconColor,\n          ),\n          const SizedBox(\n            width: 10.0,\n          ),\n          Text(\n            item.title,\n            style: item.titleStyle,\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _DefaultHeroTag {\n  const _DefaultHeroTag();\n  @override\n  String toString() => '<default FloatingActionBubble tag>';\n}\n\nclass FloatingActionBubble extends AnimatedWidget {\n  const FloatingActionBubble({\n    Key? key,\n    required this.items,\n    required this.onPress,\n    required this.iconColor,\n    required this.backGroundColor,\n    required Animation animation,\n    this.herotag,\n    this.iconData,\n    this.animatedIconData,\n  })  : assert((iconData == null && animatedIconData != null) ||\n            (iconData != null && animatedIconData == null)),\n        super(key: key, listenable: animation);\n\n  final List<Bubble> items;\n  final Function() onPress;\n  final AnimatedIconData? animatedIconData;\n  final Object? herotag;\n  final IconData? iconData;\n  final Color iconColor;\n  final Color backGroundColor;\n\n  get _animation => listenable;\n\n  Widget buildItem(BuildContext context, int index) {\n    final transform = Matrix4.translationValues(\n      0,\n      -(_animation.value - 1) * 40 * (items.length - index),\n      0.0,\n    );\n\n    return Transform(\n      transform: transform,\n      child: Opacity(\n        opacity: _animation.value,\n        child: BubbleMenu(items[index]),\n      ),\n    );\n  }\n\n  List<Widget> buildItems(BuildContext context) {\n    var widgets = <Widget>[];\n    var sb = const SizedBox(height: 12.0);\n    for (int i = 0; i < items.length; i++) {\n      widgets.add(buildItem(context, i));\n      if (i < items.length - 1) widgets.add(sb);\n    }\n\n    return widgets;\n  }\n\n  Future<bool> _preventPopIfOpen() async {\n    if (_animation.value > 0.8) {\n      onPress();\n      return false;\n    }\n    return true;\n  }\n\n  buildBackgroundWidget() {\n    double val = _animation.value;\n    return IgnorePointer(\n      ignoring: val == 0,\n      child: InkWell(\n        onTap: onPress,\n        child: Opacity(\n          opacity: val,\n          child: const ColoredBox(\n            color: Colors.black54,\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: _preventPopIfOpen,\n      child: Stack(\n        alignment: Alignment.bottomRight,\n        children: [\n          buildBackgroundWidget(),\n          Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.end,\n            children: [\n              Flexible(\n                child: IgnorePointer(\n                  ignoring: _animation.value == 0,\n                  child: SingleChildScrollView(\n                      // physics: const NeverScrollableScrollPhysics(),\n                      padding: const EdgeInsets.symmetric(vertical: 12),\n                      child: Column(\n                        mainAxisSize: MainAxisSize.min,\n                        mainAxisAlignment: MainAxisAlignment.end,\n                        crossAxisAlignment: CrossAxisAlignment.end,\n                        children: buildItems(context),\n                      )),\n                ),\n              ),\n              Transform.rotate(\n                angle: _animation.value * pi * 3 / 4,\n                child: FloatingActionButton(\n                  heroTag: herotag ?? const _DefaultHeroTag(),\n                  backgroundColor: backGroundColor,\n                  onPressed: onPress,\n                  // iconData is mutually exclusive with animatedIconData\n                  // only 1 can be null at the time\n                  child: iconData == null\n                      ? AnimatedIcon(\n                          icon: animatedIconData!,\n                          progress: _animation,\n                          color: iconColor,\n                        )\n                      : Icon(\n                          iconData,\n                          color: iconColor,\n                        ),\n                ),\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/hold_to_repeat.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass HoldToRepeat extends StatefulWidget {\n  final Widget child;\n  final VoidCallback onPressed;\n  final Duration initialDelay;\n  final Duration repeatInterval;\n\n  const HoldToRepeat({\n    Key? key,\n    required this.child,\n    required this.onPressed,\n    this.initialDelay = const Duration(milliseconds: 800),\n    this.repeatInterval = const Duration(milliseconds: 200),\n  }) : super(key: key);\n\n  @override\n  _HoldToRepeatState createState() => _HoldToRepeatState();\n}\n\nclass _HoldToRepeatState extends State<HoldToRepeat> {\n  bool _isPressed = false;\n\n  void _doRepeatingAction() {\n    if (_isPressed) {\n      widget.onPressed();\n      Future.delayed(widget.repeatInterval, _doRepeatingAction);\n    }\n  }\n\n  void _onTapDown() {\n    widget.onPressed();\n    setState(() {\n      _isPressed = true;\n      Future.delayed(widget.initialDelay, () {\n        if (_isPressed) {\n          _doRepeatingAction();\n        }\n      });\n    });\n    Feedback.forTap(context);\n  }\n\n  void _onTapUp() {\n    setState(() {\n      _isPressed = false;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      onTapDown: (_) => _onTapDown(),\n      onTapUp: (_) => _onTapUp(),\n      onTapCancel: _onTapUp,\n      child: widget.child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/EffectChainBar.dart",
    "content": "import 'dart:math';\nimport 'dart:ui';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\n\nimport '../../../bluetooth/devices/presets/Preset.dart';\nimport 'EffectChainButton.dart';\n\nclass EffectChainBar extends StatelessWidget {\n  static const double effectsChainPadding = 6;\n\n  final double maxHeight;\n  final NuxDevice device;\n  final Preset preset;\n  final bool reorderable;\n  final void Function(int) onTap;\n  final void Function(int) onDoubleTap;\n  final ReorderCallback onReorder;\n\n  const EffectChainBar(\n      {Key? key,\n      required this.maxHeight,\n      required this.device,\n      required this.preset,\n      required this.onTap,\n      required this.onDoubleTap,\n      required this.onReorder,\n      required this.reorderable})\n      : super(key: key);\n\n  EffectChainButton buildItem(context, index) {\n    var proc = preset.getFXIDFromSlot(index);\n    var effect = device.getProcessorInfoByFXID(proc);\n    bool selected = index == device.selectedSlot;\n\n    return EffectChainButton(\n        index: index,\n        effectInfo: effect!,\n        color: preset.effectColor(index),\n        enabled: preset.slotEnabled(index),\n        selected: selected,\n        reorderable: reorderable,\n        key: Key(index.toString()),\n        onTap: () => onTap(index),\n        onDoubleTap: () => onDoubleTap(index));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    double constrainHeight = max(\n        min(\n            (MediaQuery.of(context).size.width - effectsChainPadding * 2) /\n                device.effectsChainLength /\n                0.8,\n            maxHeight),\n        10);\n\n    Widget list;\n    if (reorderable) {\n      list = ReorderableList(\n        padding: const EdgeInsets.symmetric(horizontal: effectsChainPadding),\n        shrinkWrap: true,\n        scrollDirection: Axis.horizontal,\n        physics: const NeverScrollableScrollPhysics(),\n        itemCount: device.effectsChainLength,\n        proxyDecorator: (widget, index, animation) {\n          return AnimatedBuilder(\n            animation: animation,\n            builder: (BuildContext context, Widget? child) {\n              final double animValue =\n                  Curves.easeInOut.transform(animation.value);\n              final double offset = lerpDouble(0, -15, animValue)!;\n              return Material(\n                color: Colors.transparent,\n                child: Transform.translate(\n                  offset: Offset(0, offset),\n                  child: widget,\n                ),\n              );\n            },\n          );\n        },\n        itemBuilder: buildItem,\n        onReorder: (a, b) {\n          if (b > a) b--;\n          onReorder(a, b);\n        },\n      );\n    } else {\n      list = ListView.builder(\n        padding: const EdgeInsets.symmetric(horizontal: effectsChainPadding),\n        shrinkWrap: true,\n        scrollDirection: Axis.horizontal,\n        physics: const NeverScrollableScrollPhysics(),\n        itemCount: device.effectsChainLength,\n        itemBuilder: buildItem,\n      );\n    }\n    return ConstrainedBox(\n      constraints: BoxConstraints(maxHeight: constrainHeight),\n      child: list,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/EffectChainButton.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../bluetooth/devices/effects/Processor.dart';\n\nclass EffectChainButton extends StatelessWidget {\n  final ProcessorInfo effectInfo;\n  final bool enabled;\n  final bool selected;\n  final bool reorderable;\n  final Color color;\n  final GestureTapCallback? onTap;\n  final GestureTapCallback? onDoubleTap;\n  final int index;\n\n  const EffectChainButton(\n      {Key? key,\n      required this.effectInfo,\n      required this.enabled,\n      required this.selected,\n      required this.color,\n      this.onTap,\n      this.onDoubleTap,\n      required this.index,\n      required this.reorderable})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    Color _color = enabled ? color : Theme.of(context).disabledColor;\n    return ReorderableDragStartListener(\n      index: index,\n      child: AspectRatio(\n        aspectRatio: 0.8,\n        child: FittedBox(\n          fit: BoxFit.fitHeight,\n          child: Semantics(\n            label: effectInfo.longName,\n            selected: selected,\n            child: GestureDetector(\n              onTap: onTap,\n              onHorizontalDragStart: reorderable ? null : (details) {},\n              onVerticalDragStart: (details) {\n                onDoubleTap?.call();\n              },\n              child: Transform.translate(\n                offset: Offset(0, selected ? -5 : 0),\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Container(\n                      margin: const EdgeInsets.symmetric(horizontal: 1),\n                      padding: const EdgeInsets.all(3),\n                      decoration: BoxDecoration(\n                          color: selected\n                              ? _color\n                              : Theme.of(context).scaffoldBackgroundColor,\n                          border: Border.all(\n                            color: _color,\n                          ),\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(3))),\n                      child: Icon(\n                        effectInfo.icon,\n                        //size: 30,\n                        color: selected ? Colors.black : _color,\n                      ),\n                    ),\n                    ExcludeSemantics(\n                      child: Text(\n                        effectInfo.shortName,\n                        style: TextStyle(\n                            fontSize: 10,\n                            color: enabled\n                                ? null\n                                : Theme.of(context).textTheme.bodySmall!.color),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/channelSelector.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n//\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/UI/popups/exportQRCode.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/platform/fileSaver.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport 'package:qr_utils/qr_utils.dart';\nimport '../../../bluetooth/devices/presets/Preset.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../../platform/platformUtils.dart';\nimport '../../theme.dart';\nimport '../../utils.dart';\nimport 'effectSelector.dart';\n\nclass ChannelSelector extends StatefulWidget {\n  final NuxDevice device;\n  const ChannelSelector({Key? key, required this.device}) : super(key: key);\n\n  @override\n  State createState() => _ChannelSelectorState();\n}\n\nclass _ChannelSelectorState extends State<ChannelSelector> {\n  late List<Preset> _presets;\n  EditorLayoutMode layout = EditorLayoutMode.expand;\n\n  var qrMenu = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: 1,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.qr_code_scanner,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Scan QR\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: 2,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.qr_code_2,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Import QR Image\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: 3,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.qr_code_2,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Share QR\"),\n        ],\n      ),\n    ),\n  ];\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  List<Widget> _createButtons(double _width) {\n    var disabledColor = Theme.of(context).disabledColor;\n    List<Widget> buttons = <Widget>[];\n\n    var tooltip = \"\";\n    _presets = widget.device.getPresetsList();\n    int row1 = _width < 330 && _presets.length > 4\n        ? (_presets.length / 2).ceil()\n        : _presets.length;\n\n    double width = (_width / row1).floorToDouble();\n    for (int i = 0; i < _presets.length; i++) {\n      var col = i == widget.device.selectedChannel\n          ? _presets[widget.device.selectedChannel].channelColor\n          : disabledColor;\n\n      Widget buttonBody;\n      if (widget.device.longChannelNames) {\n        tooltip = _presets[i].channelName;\n        buttonBody = Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            Icon(\n              widget.device.getChannelActive(i)\n                  ? Icons.circle\n                  : Icons.circle_outlined,\n              color: col,\n              size: 32,\n            ),\n            Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 6.0),\n              child: FittedBox(\n                  fit: BoxFit.fill, child: Text(_presets[i].channelName)),\n            ),\n          ],\n        );\n      } else {\n        tooltip = \"Channel ${i + 1}\";\n        buttonBody = Stack(\n          alignment: Alignment.center,\n          children: [\n            Icon(\n              widget.device.getChannelActive(i)\n                  ? Icons.circle\n                  : Icons.circle_outlined,\n              color: col,\n              size: 32,\n            ),\n            Text(\n              _presets[i].channelName,\n              style: const TextStyle(fontWeight: FontWeight.bold),\n            ),\n          ],\n        );\n      }\n\n      var button = GestureDetector(\n        onTap: () {\n          if (widget.device.selectedChannel == i) return;\n          widget.device.setSelectedChannel(i,\n              notifyBT: true, sendFullPreset: false, notifyUI: true);\n          widget.device\n              .getPreset(widget.device.selectedChannel)\n              .setupPresetFromNuxData();\n        },\n        onLongPress: () {\n          widget.device.toggleChannelActive(i);\n        },\n        child: Container(\n          //use container with color to expand hittest area for the gesture detector\n          //better to use the same as the background color to imitate transparency\n          //than to use translucent hittest (slow)\n          color: Theme.of(context).scaffoldBackgroundColor,\n          width: width,\n          height:\n              AppThemeConfig.toggleButtonHeight(widget.device.longChannelNames),\n          child: Semantics(\n            selected: widget.device.selectedChannel == i,\n            label: tooltip,\n            child: ExcludeSemantics(child: buttonBody),\n          ),\n        ),\n      );\n      buttons.add(button);\n    }\n\n    return buttons;\n  }\n\n  qrPopupSelection(pos) async {\n    switch (pos) {\n      case 1: //scan qr\n        var result = await Permission.camera.request();\n        if (result.isPermanentlyDenied) {\n          //TODO: Explain why camera is needed and open settings\n        }\n        final content = await QrUtils.scanQR;\n        if (content?.isNotEmpty ?? false) {\n          setupFromQRData(content!);\n          setState(() {});\n        }\n        break;\n      case 2:\n        if (PlatformUtils.isAndroid) {\n          openFile(\"image/*\").then((value) async {\n            final content = await QrUtils.scanImageFromData(value);\n            if (content != null) {\n              setupFromQRData(content);\n              setState(() {});\n            } else {\n              showQRError();\n            }\n          });\n        } else if (PlatformUtils.isIOS) {\n          final content = await QrUtils.scanImage();\n          if (content != null) {\n            setupFromQRData(content);\n            setState(() {});\n          } else {\n            showQRError();\n          }\n        }\n        break;\n      case 3:\n        var qr = widget.device.channelToQR(widget.device.selectedChannel);\n        var name = widget.device.deviceControl.presetName;\n        Image img = await QrUtils.generateQR(qr);\n        if (name.isEmpty) {\n          AlertDialogs.showInputDialog(context,\n              title: \"Enter preset name\",\n              description: \"It will be displayed below the QR code.\",\n              value: \"\",\n              onConfirm: (value) => {showQRExport(img, value)});\n        } else\n          showQRExport(img, name);\n    }\n  }\n\n  void showQRExport(Image img, String name) {\n    var qrExport =\n        QRExportDialog(img, name, NuxDeviceControl.instance().device);\n    showDialog(\n      context: context,\n      builder: (BuildContext context) => qrExport.buildDialog(context),\n    );\n  }\n\n  void showQRError() {\n    ScaffoldMessenger.of(context).showSnackBar(const SnackBar(\n        backgroundColor: Colors.red,\n        content: Text(\n          \"Error decoding QR code!\",\n          textAlign: TextAlign.center,\n          style: TextStyle(color: Colors.white, fontSize: 20),\n        )));\n  }\n\n  void setupFromQRData(String qrData) {\n    var result = widget.device.setupFromQRData(qrData);\n    bool success = result == PresetQRError.Ok;\n    NuxDeviceControl.instance().changes.clearHistory();\n    setState(() {});\n\n    var message = QrUtils.QRMessages[result.index];\n    ScaffoldMessenger.of(context).showSnackBar(SnackBar(\n        backgroundColor: success ? Colors.green : Colors.red,\n        content: Text(\n          message,\n          textAlign: TextAlign.center,\n          style: const TextStyle(color: Colors.white, fontSize: 20),\n        )));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    layout = getEditorLayoutMode(MediaQuery.of(context));\n\n    _presets = widget.device.getPresetsList();\n\n    return Column(\n      mainAxisSize: MainAxisSize.max,\n      mainAxisAlignment: MainAxisAlignment.start,\n      children: [\n        Padding(\n          padding: const EdgeInsets.all(8),\n          child: Container(\n            decoration: BoxDecoration(\n                color: Colors.grey[800],\n                border: Border.all(color: Theme.of(context).disabledColor),\n                borderRadius: BorderRadius.circular(6)),\n            child: Row(\n              mainAxisSize: MainAxisSize.max,\n              children: [\n                PopupMenuButton(\n                    itemBuilder: (context) {\n                      return qrMenu;\n                    },\n                    onSelected: qrPopupSelection,\n                    child: const SizedBox(\n                      width: 60,\n                      child: Column(\n                        children: [\n                          Icon(\n                            Icons.qr_code_2,\n                            size: 32,\n                          ),\n                          Text(\n                            \"QR Code\",\n                            textAlign: TextAlign.center,\n                          )\n                        ],\n                      ),\n                    )),\n                Expanded(\n                  child: Container(\n                    constraints: const BoxConstraints(minHeight: 60),\n                    color: Colors.grey[900],\n                    child: LayoutBuilder(\n                      builder: (context, constraints) {\n                        return Wrap(\n                          alignment: WrapAlignment.center,\n                          runAlignment: WrapAlignment.center,\n                          children: _createButtons(constraints.maxWidth),\n                        );\n                      },\n                    ),\n                  ),\n                ),\n                Semantics(\n                  checked: widget.device\n                      .getChannelActive(widget.device.selectedChannel),\n                  child: InkWell(\n                    onTap: () {\n                      widget.device\n                          .toggleChannelActive(widget.device.selectedChannel);\n                    },\n                    child: SizedBox(\n                      width: 60,\n                      child: Column(\n                        children: [\n                          Icon(\n                            widget.device.getChannelActive(\n                                    widget.device.selectedChannel)\n                                ? Icons.check_circle\n                                : Icons.circle_outlined,\n                            size: 30,\n                          ),\n                          const Text(\"Active\")\n                        ],\n                      ),\n                    ),\n                  ),\n                )\n              ],\n            ),\n          ),\n        ),\n        if (layout == EditorLayoutMode.expand)\n          Expanded(\n            child: EffectSelector(\n                device: widget.device,\n                preset: _presets[widget.device.selectedChannel]),\n          )\n        else\n          EffectSelector(\n              device: widget.device,\n              preset: _presets[widget.device.selectedChannel])\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/effectEditor.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:undo/undo.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../bluetooth/devices/presets/Preset.dart';\nimport 'effectEditors/EqualizerEditor.dart';\nimport 'effectEditors/SlidersEditor.dart';\n\nclass EffectEditor extends StatefulWidget {\n  final Preset preset;\n  final int slot;\n  const EffectEditor({Key? key, required this.preset, required this.slot})\n      : super(key: key);\n  @override\n  State createState() => _EffectEditorState();\n}\n\nclass _EffectEditorState extends State<EffectEditor> {\n  @override\n  Widget build(BuildContext context) {\n    var preset = widget.preset;\n    var slot = widget.slot;\n\n    //get all the parameters for the slot\n    List<Processor> prc = preset.getEffectsForSlot(slot);\n\n    //create the widgets to edit them\n    var selected = preset.getSelectedEffectForSlot(slot);\n\n    switch (prc[selected].editorUI) {\n      case EffectEditorUI.Sliders:\n        return SlidersEditor(preset: widget.preset, slot: widget.slot);\n      case EffectEditorUI.EQ:\n        return EqualizerEditor(\n          eqEffect: prc[selected],\n          enabled: widget.preset.slotEnabled(widget.slot),\n          onChanged: (parameter, value, skip) {\n            setState(() {\n              widget.preset.setParameterValue(parameter, value, notify: !skip);\n            });\n          },\n          onChangedFinal: _updateSliderValue,\n        );\n    }\n  }\n\n  void _updateSliderValue(\n      Parameter parameter, double newValue, double oldValue) {\n    var device = NuxDeviceControl().device;\n    var slot = device.selectedSlot;\n\n    NuxDeviceControl.instance().changes.add(\n            Change<({double value, int selectedSlot})>(\n                (value: oldValue, selectedSlot: slot), () {\n          var currentSlot = device.selectedSlot;\n          if (slot != currentSlot) {\n            device.selectedSlot = slot;\n          }\n          widget.preset.setParameterValue(parameter, newValue);\n        }, (oldVal) {\n          var currentSlot = device.selectedSlot;\n          if (oldVal.selectedSlot != currentSlot) {\n            device.selectedSlot = oldVal.selectedSlot;\n          }\n          widget.preset.setParameterValue(parameter, oldVal.value);\n        }));\n    NuxDeviceControl.instance().undoStackChanged();\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/effectEditors/EqualizerEditor.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/verticalThickSlider.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\nimport '../../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../utils.dart';\n\nclass EqualizerEditor extends StatefulWidget {\n  final Processor eqEffect;\n  final bool enabled;\n  final Function(Parameter, double value, bool skip)? onChanged;\n  final Function(Parameter, double, double)? onChangedFinal;\n  const EqualizerEditor(\n      {required this.eqEffect,\n      required this.enabled,\n      required this.onChanged,\n      required this.onChangedFinal,\n      Key? key})\n      : super(key: key);\n\n  @override\n  State<EqualizerEditor> createState() => _EqualizerEditorState();\n}\n\nclass _EqualizerEditorState extends State<EqualizerEditor> {\n  double _oldValue = 0;\n  final _sliderWidth = 47;\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n        builder: (BuildContext context, BoxConstraints constraints) {\n      var screenWidth = constraints.maxWidth;\n      var layout = getEditorLayoutMode(MediaQuery.of(context));\n\n      List<Parameter> params = widget.eqEffect.parameters;\n      List<Widget> sliders = [];\n      for (int i = 0; i < params.length; i++) {\n        var param = params[i];\n        Color color =\n            (i == 0 && params.length > 6) ? Colors.amber : Colors.blue;\n        if (!widget.enabled) {\n          color = TinyColor.fromColor(color).desaturate(80).color;\n        }\n        var slider = VerticalThickSlider(\n          min: param.formatter.min.toDouble(),\n          max: param.formatter.max.toDouble(),\n          width: _sliderWidth.toDouble(),\n          activeColor: color,\n          label: param.name,\n          handleHorizontalDrag: false,\n          labelFormatter: (double val) {\n            return val.toStringAsFixed(1);\n          },\n          value: param.value,\n          onChanged: (val, bool skip) {\n            widget.onChanged?.call(param, val, skip);\n          },\n          onDragStart: (val) {\n            _oldValue = val;\n          },\n          onDragEnd: (val) {\n            widget.onChangedFinal?.call(param, val, _oldValue);\n          },\n        );\n        sliders.add(slider);\n      }\n\n      Widget slidersContainer;\n      if (_sliderWidth * params.length < screenWidth) {\n        slidersContainer = Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: sliders,\n        );\n      } else {\n        slidersContainer = Scrollbar(\n          child: ListView(\n            primary: true,\n            scrollDirection: Axis.horizontal,\n            shrinkWrap: true,\n            children: sliders,\n          ),\n        );\n      }\n\n      if (layout == EditorLayoutMode.expand) {\n        return Column(\n          children: [\n            Expanded(child: slidersContainer),\n            const SizedBox(\n              height: 30,\n            )\n          ],\n        );\n      } else {\n        return SizedBox(\n          height: 200,\n          child: slidersContainer,\n        );\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/effectEditors/SlidersEditor.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\nimport 'package:undo/undo.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nimport '../../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../../bluetooth/devices/NuxConstants.dart';\nimport '../../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../../bluetooth/devices/presets/Preset.dart';\nimport '../../../../utilities/DelayTapTimer.dart';\nimport '../../../../bluetooth/devices/value_formatters/TempoFormatter.dart';\nimport '../../../../bluetooth/devices/value_formatters/ValueFormatter.dart';\nimport '../../../popups/alertDialogs.dart';\nimport '../../../utils.dart';\nimport '../../ModeControl.dart';\nimport '../../thickSlider.dart';\n\nclass SlidersEditor extends StatefulWidget {\n  final Preset preset;\n  final int slot;\n  const SlidersEditor({Key? key, required this.preset, required this.slot})\n      : super(key: key);\n\n  @override\n  State<SlidersEditor> createState() => _SlidersEditorState();\n}\n\nclass _SlidersEditorState extends State<SlidersEditor> {\n  double _oldValue = 0;\n\n  ThickSlider _createSlider(Parameter param, bool handleVerticalDrag) {\n    bool enabled = widget.preset.slotEnabled(widget.slot);\n    return ThickSlider(\n      value: param.value,\n      parameter: param,\n      min: param.formatter.min.toDouble(),\n      max: param.formatter.max.toDouble(),\n      label: param.name,\n      labelFormatter: (val) => param.label,\n      activeColor: enabled\n          ? widget.preset.effectColor(widget.slot)\n          : TinyColor.fromColor(widget.preset.effectColor(widget.slot))\n              .desaturate(80)\n              .color,\n      onChanged: (value, bool skip) {\n        setState(() {\n          widget.preset.setParameterValue(param, value, notify: !skip);\n        });\n      },\n      onDragStart: (val) {\n        _oldValue = val;\n      },\n      onDragEnd: (val) {\n        _updateParameterValue(param, val);\n      },\n      handleVerticalDrag: handleVerticalDrag,\n    );\n  }\n\n  void _updateParameterValue(Parameter param, double val) {\n    var device = NuxDeviceControl.instance().device;\n    var slot = device.selectedSlot;\n    NuxDeviceControl.instance().changes.add(\n            Change<({double parameter, int selectedSlot})>(\n                (parameter: _oldValue, selectedSlot: slot), () {\n          var currentSlot = device.selectedSlot;\n          if (slot != currentSlot) {\n            device.selectedSlot = slot;\n          }\n          widget.preset.setParameterValue(param, val);\n        }, (oldVal) {\n          var currentSlot = device.selectedSlot;\n          if (oldVal.selectedSlot != currentSlot) {\n            device.selectedSlot = oldVal.selectedSlot;\n          }\n          widget.preset.setParameterValue(param, oldVal.parameter);\n        }));\n    NuxDeviceControl.instance().undoStackChanged();\n  }\n\n  ModeControl _createModeControl(Parameter param) {\n    bool enabled = widget.preset.slotEnabled(widget.slot);\n    return ModeControl(\n      value: param.value,\n      parameter: param,\n      onChanged: (val) {\n        _oldValue = param.value;\n        _updateParameterValue(param, val);\n      },\n      effectColor: widget.preset.effectColor(widget.slot),\n      enabled: enabled,\n    );\n  }\n\n  Widget _createTapTempo(Parameter param) {\n    bool enabled = widget.preset.slotEnabled(widget.slot);\n    return RawMaterialButton(\n      onPressed: () {\n        DelayTapTimer.addClickTime();\n        var result = DelayTapTimer.calculate();\n        if (result != false) {\n          setState(() {\n            var newValue = (param.formatter as TempoFormatter)\n                .timeToPercentage(result / 1000);\n            widget.preset.setParameterValue(param, newValue);\n            _oldValue = param.value;\n            _updateParameterValue(param, newValue);\n          });\n        }\n      },\n      elevation: 2.0,\n      fillColor: enabled\n          ? TinyColor.fromColor(widget.preset.effectColor(widget.slot))\n              .darken(15)\n              .color\n          : TinyColor.fromColor(widget.preset.effectColor(widget.slot))\n              .desaturate(80)\n              .darken(15)\n              .color,\n      padding: const EdgeInsets.all(15.0),\n      shape: const CircleBorder(),\n      child: const Padding(\n        padding: EdgeInsets.all(10.0),\n        child: Text(\n          \"Tap\",\n          style: TextStyle(color: Colors.white, fontSize: 20),\n        ),\n      ),\n    );\n  }\n\n  Widget _createCabinetRename(Cabinet cab) {\n    return Column(\n      children: [\n        const SizedBox(height: 12),\n        Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: [\n            ElevatedButton.icon(\n                onPressed: () {\n                  var dev = NuxDeviceControl.instance().device;\n                  AlertDialogs.showInputDialog(context,\n                      title: \"Set cabinet name\",\n                      description: \"\",\n                      value: cab.name, onConfirm: (value) {\n                    dev.renameCabinet(cab.nuxIndex, value);\n                  });\n                },\n                icon: const Icon(Icons.drive_file_rename_outline),\n                label: const Text(\"Rename Cabinet\")),\n            ElevatedButton.icon(\n                onPressed: () {\n                  var dev = NuxDeviceControl.instance().device;\n                  dev.renameCabinet(cab.nuxIndex, cab.cabName);\n                },\n                icon: const Icon(Icons.restart_alt),\n                label: const Text(\"Reset Name\"))\n          ],\n        ),\n        InkWell(\n          onTap: () async {\n            var url = AppConstants.patcherUrl;\n            await canLaunchUrlString(url)\n                ? await launchUrlString(url,\n                    mode: LaunchMode.externalApplication)\n                : throw 'Could not launch $url';\n          },\n          child: SizedBox(\n            height: 50,\n            child: Center(\n              child: RichText(\n                  text: const TextSpan(\n                style: TextStyle(fontSize: 18, color: Colors.white),\n                children: [\n                  TextSpan(text: \"Use \"),\n                  TextSpan(\n                    text: \"NUX IR Patcher\",\n                    style: TextStyle(\n                        color: Colors.lightBlue,\n                        decoration: TextDecoration.underline),\n                  ),\n                  TextSpan(text: \" to import custom IRs\")\n                ],\n              )),\n            ),\n          ),\n        )\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var preset = widget.preset;\n    var slot = widget.slot;\n    var dev = NuxDeviceControl.instance().device;\n    var sliders = <Widget>[];\n\n    var isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;\n    var layout = getEditorLayoutMode(MediaQuery.of(context));\n\n    var handleVerticalDrag = isPortrait && layout != EditorLayoutMode.scroll;\n    //get all the parameters for the slot\n    List<Processor> prc = preset.getEffectsForSlot(slot);\n\n    //create the widgets to edit them\n    var selected = preset.getSelectedEffectForSlot(slot);\n    List<Parameter> params = prc[selected].parameters;\n\n    if (params.isNotEmpty) {\n      for (int i = 0; i < params.length; i++) {\n        Widget widget;\n        switch (params[i].formatter.inputType) {\n          case InputType.SliderInput:\n            widget = Flexible(\n                fit: FlexFit.loose,\n                child: _createSlider(params[i], handleVerticalDrag));\n            break;\n          case InputType.SwitchInput:\n            widget = _createModeControl(params[i]);\n            break;\n        }\n        sliders.add(widget);\n\n        //add tap tempo button\n        if (params[i].formatter is TempoFormatter) {\n          sliders.add(_createTapTempo(params[i]));\n        }\n\n        //add cabinet rename if supported\n        if (dev.cabinetSupport &&\n            dev.cabinetSlotIndex == slot &&\n            dev.hackableIRs) {\n          sliders.add(_createCabinetRename(prc[selected] as Cabinet));\n        }\n      }\n      sliders.add(const SizedBox(\n        height: 20,\n      ));\n    }\n\n    return Column(mainAxisSize: MainAxisSize.min, children: sliders);\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/effectSelector.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:core';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/presets/EffectChainBar.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport 'package:undo/undo.dart';\nimport '../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../bluetooth/devices/NuxDevice.dart';\nimport '../../../bluetooth/devices/NuxFXID.dart';\nimport '../../utils.dart';\nimport 'effectEditor.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\nimport '../../../bluetooth/devices/effects/Processor.dart';\nimport '../../../bluetooth/devices/presets/Preset.dart';\nimport '../common/customPopupMenu.dart' as custom;\n\nclass EffectSelector extends StatefulWidget {\n  final Preset preset;\n  final NuxDevice device;\n\n  const EffectSelector({Key? key, required this.preset, required this.device})\n      : super(key: key);\n  @override\n  State createState() => _EffectSelectorState();\n}\n\nclass _EffectSelectorState extends State<EffectSelector> {\n  int get _selectedSlot => widget.device.selectedSlot;\n  set _selectedSlot(val) => widget.device.selectedSlot = val;\n\n  late Preset _preset;\n  late List<custom.PopupMenuEntry<dynamic>> _effectItems;\n  String _selectedEffectName = \"\";\n\n  late Color _effectColor;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  void setSelectedEffect(dynamic index) {\n    //the index param is always int, it's dynamic because the menu widget requires that\n\n    setState(() {\n      var device = NuxDeviceControl.instance().device;\n      var effectSlot = _selectedSlot;\n      //put new effect in stack\n      var oldEffect = (\n        slot: _selectedSlot,\n        index: _preset.getSelectedEffectForSlot(_selectedSlot),\n      );\n      List<Change<({int slot, int index})>> totalChanges = [];\n\n      totalChanges.add(Change(oldEffect, () {\n        if (_selectedSlot != effectSlot) _selectedSlot = effectSlot;\n        _preset.setSelectedEffectForSlot(effectSlot, index, true);\n      }, (oldVal) {\n        if (_selectedSlot != oldVal.slot) _selectedSlot = oldVal.slot;\n        _preset.setSelectedEffectForSlot(oldVal.slot, oldVal.index, true);\n      }));\n\n      if (device.cabinetSupport &&\n          SharedPrefs().getInt(SettingsKeys.changeCabs, 1) == 1) {\n        if (_selectedSlot == device.amplifierSlotIndex) {\n          //get the cabinet for this amp and set it\n          Processor amp = _preset.getEffectsForSlot(_selectedSlot)[index];\n          if (amp is Amplifier) {\n            var proc = _preset.getFXIDFromSlot(device.cabinetSlotIndex);\n            var cabIndex =\n                _preset.getEffectArrayIndexFromNuxIndex(proc, amp.defaultCab);\n            var oldEffect = (\n              slot: device.cabinetSlotIndex,\n              index: _preset.getSelectedEffectForSlot(device.cabinetSlotIndex)\n            );\n            totalChanges.add(Change(\n                oldEffect,\n                () => _preset.setSelectedEffectForSlot(\n                    device.cabinetSlotIndex, cabIndex, true),\n                (oldVal) => _preset.setSelectedEffectForSlot(\n                    oldVal.slot, oldVal.index, true)));\n          }\n        }\n      }\n      if (totalChanges.length == 1) {\n        NuxDeviceControl.instance().changes.add(totalChanges[0]);\n      } else {\n        NuxDeviceControl.instance().changes.addGroup(totalChanges);\n      }\n      NuxDeviceControl.instance().undoStackChanged();\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var layout = getEditorLayoutMode(MediaQuery.of(context));\n    _preset = widget.preset;\n\n    _effectColor = _preset.effectColor(_selectedSlot);\n    var _effectColorBright =\n        TinyColor.fromColor(_effectColor).brighten(20).color;\n\n    var proc = _preset.getFXIDFromSlot(_selectedSlot);\n    var effectInfo = widget.device.getProcessorInfoByFXID(proc)!;\n\n    //create effect models dropdown list\n    List<Processor> effects = _preset.getEffectsForSlot(_selectedSlot);\n\n    //effect color for popup menu. Make sure it's contrasty to the text\n    var popupEffectColor = _effectColor;\n\n    //try to darken up to 2 times until the color is not light anymore\n    for (int i = 0; i < 2; i++) {\n      if (TinyColor.fromColor(popupEffectColor).isLight()) {\n        popupEffectColor =\n            TinyColor.fromColor(popupEffectColor).darken(15).color;\n      }\n    }\n\n    _selectedEffectName = _preset\n        .getEffectsForSlot(\n            _selectedSlot)[_preset.getSelectedEffectForSlot(_selectedSlot)]\n        .name;\n\n    //create popup menu\n    _effectItems = <custom.PopupMenuEntry<dynamic>>[];\n    for (int f = 0; f < effects.length; f++) {\n      if (effects[f].isSeparator == true) {\n        _effectItems.add(custom.PopupMenuDivider(\n          text: effects[f].category,\n          color: Colors.grey,\n        ));\n      }\n\n      _effectItems.add(custom.PopupMenuItem(\n        value: f,\n        backgroundColor: f == _preset.getSelectedEffectForSlot(_selectedSlot)\n            ? popupEffectColor\n            : null,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 8.0),\n          child: Text(\n            \"${f + 1}. ${effects[f].name}\",\n          ),\n        ),\n      ));\n    }\n\n    var effectSelectButton = Container(\n      decoration: BoxDecoration(\n          border: Border.all(\n            color: Colors.grey,\n            width: 1,\n          ),\n          borderRadius: BorderRadius.circular(8)),\n      child: Padding(\n        padding: const EdgeInsets.all(8.0),\n        child: Row(\n          children: [\n            Icon(\n              effectInfo.icon,\n              color: _effectColorBright,\n            ),\n            const SizedBox(\n              width: 5,\n            ),\n            Text(\n              effectInfo.longName,\n              style: TextStyle(\n                  color: _effectColorBright, fontWeight: FontWeight.bold),\n            ),\n            if (_effectItems.length > 1) const SizedBox(height: 1, width: 8),\n            if (_effectItems.length > 1) Text(_selectedEffectName)\n          ],\n        ),\n      ),\n    );\n\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      mainAxisAlignment: MainAxisAlignment.start,\n      children: [\n        EffectChainBar(\n            maxHeight: 60,\n            device: widget.device,\n            preset: _preset,\n            reorderable: widget.device.reorderableFXChain,\n            onTap: (i) {\n              setState(() {\n                _selectedSlot = i;\n              });\n            },\n            onDoubleTap: (int i) {\n              if (_preset.slotSwitchable(i)) {\n                bool state = _preset.slotEnabled(i);\n                _setSlotEnabledState(i, !state);\n              }\n            },\n            onReorder: (from, to) {\n              var old = from + to * 100;\n              setState(() {\n                NuxDeviceControl.instance().changes.add(Change<int>(old, () {\n                      //get type of old slot\n                      var selectedType = _preset.getFXIDFromSlot(_selectedSlot);\n                      _preset.swapProcessorSlots(from, to, true);\n                      _selectSlotByFXID(selectedType);\n                    }, (oldVal) {\n                      //get type of old slot\n                      var selectedType = _preset.getFXIDFromSlot(_selectedSlot);\n                      int from = oldVal % 100;\n                      int to = (oldVal / 100).floor();\n                      //positions are swapped on undo\n                      _preset.swapProcessorSlots(to, from, true);\n                      _selectSlotByFXID(selectedType);\n                    }));\n                NuxDeviceControl.instance().undoStackChanged();\n              });\n            }),\n        const SizedBox(\n          height: 8,\n        ),\n        Padding(\n          padding: const EdgeInsets.only(left: 8.0),\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (_effectItems.length > 1)\n                custom.PopupMenuButton(\n                  itemBuilder: (context) => _effectItems,\n                  onSelected: setSelectedEffect,\n                  initialValue: _preset.getSelectedEffectForSlot(_selectedSlot),\n                  child: effectSelectButton,\n                )\n              else\n                ExcludeSemantics(child: effectSelectButton),\n              const SizedBox(\n                  width: 1,\n                  height:\n                      48), //used to even out sizes when switch is not visible\n              Row(\n                children: [\n                  if (_effectItems.length > 1)\n                    IconButton(\n                      tooltip: \"Previous effect\",\n                      onPressed: () {\n                        var effect =\n                            _preset.getSelectedEffectForSlot(_selectedSlot) - 1;\n                        if (effect < 0) effect = effects.length - 1;\n                        setSelectedEffect(effect);\n                      },\n                      icon: Transform.rotate(\n                          angle: pi,\n                          child: Icon(Icons.play_arrow,\n                              color: _effectColorBright)),\n                      iconSize: 30,\n                    ),\n                  if (_effectItems.length > 1)\n                    IconButton(\n                      tooltip: \"Next effect\",\n                      onPressed: () {\n                        var effect =\n                            _preset.getSelectedEffectForSlot(_selectedSlot) + 1;\n                        if (effect > effects.length - 1) effect = 0;\n                        setSelectedEffect(effect);\n                      },\n                      icon: Icon(Icons.play_arrow, color: _effectColorBright),\n                      iconSize: 30,\n                    ),\n                  if (_preset.slotSwitchable(_selectedSlot))\n                    Tooltip(\n                      message: \"Toggle ${effectInfo.longName}\",\n                      child: Switch(\n                        value: _preset.slotEnabled(_selectedSlot),\n                        onChanged: (val) {\n                          _setSlotEnabledState(_selectedSlot, val);\n                        },\n                        activeColor: _effectColorBright,\n                        inactiveThumbColor: Colors.grey,\n                        inactiveTrackColor: Colors.grey[700],\n                      ),\n                    ),\n                ],\n              ),\n            ],\n          ),\n        ),\n        if (layout == EditorLayoutMode.expand)\n          Expanded(\n              child: EffectEditor(\n            preset: _preset,\n            slot: _selectedSlot,\n          ))\n        else\n          EffectEditor(\n            preset: _preset,\n            slot: _selectedSlot,\n          )\n      ],\n    );\n  }\n\n  void _setSlotEnabledState(int slot, bool value) {\n    setState(() {\n      NuxDeviceControl.instance().changes.add(Change<bool>(\n          !value,\n          () => _preset.setSlotEnabled(slot, value, true),\n          (oldVal) => _preset.setSlotEnabled(slot, oldVal, true)));\n      NuxDeviceControl.instance().undoStackChanged();\n    });\n  }\n\n  void _selectSlotByFXID(NuxFXID type) {\n    for (int i = 0; i < widget.device.effectsChainLength; i++) {\n      if (_preset.getFXIDFromSlot(i) == type) _selectedSlot = i;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/presetEffectPreview.dart",
    "content": "import 'package:flutter/material.dart';\nimport '../../../../bluetooth/devices/NuxDevice.dart';\nimport '../../../../bluetooth/devices/effects/Processor.dart';\n\nclass PresetEffectPreview extends StatelessWidget {\n  final Map<String, dynamic> preset;\n  final NuxDevice device;\n  final bool enabled;\n\n  static const TextStyle _ampActive =\n      TextStyle(color: Color.fromARGB(255, 158, 158, 158), fontSize: 14);\n  static const TextStyle _ampInactive =\n      TextStyle(color: Color.fromARGB(255, 90, 90, 90), fontSize: 14);\n  const PresetEffectPreview(\n      {super.key,\n      required this.preset,\n      required this.device,\n      required this.enabled});\n\n  List<Widget> _buildEffectsPreview(\n      Map<String, dynamic> preset, NuxDevice dev) {\n    var widgets = <Widget>[];\n    //int presetVersion = preset[\"version\"] ?? 0;\n\n    var pVersion = preset[\"version\"] ?? 0;\n    for (int i = 0; i < dev.processorList.length; i++) {\n      ProcessorInfo pi = dev.processorList[i];\n\n      Color color = pi.color;\n\n      if (!enabled) color = color.withAlpha(128);\n      var textStyle = enabled ? _ampActive : _ampInactive;\n\n      if (preset.containsKey(pi.keyName)) {\n        //special case for amp\n        if (pi.keyName == \"amp\") {\n          var name =\n              dev.getAmpNameByNuxIndex(preset[pi.keyName][\"fx_type\"], pVersion);\n          widgets.insert(\n              0,\n              Padding(\n                padding: const EdgeInsets.only(right: 8.0),\n                child: Text(name, style: textStyle),\n              ));\n        } else if (pi.keyName == \"cabinet\") {\n          continue;\n        } else {\n          bool fxEnabled = preset[pi.keyName][\"enabled\"];\n          widgets.add(Icon(\n            pi.icon,\n            color: fxEnabled ? color : Colors.grey,\n            size: 16,\n          ));\n        }\n      }\n    }\n    return widgets;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Row(\n      children: _buildEffectsPreview(preset, device),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/presetItem.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/presets/preset_list/presetEffectPreview.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\nimport '/bluetooth/NuxDeviceControl.dart';\nimport '/bluetooth/devices/NuxDevice.dart';\nimport '/UI/toneshare/share_preset.dart';\nimport 'presets_popup_menus.dart';\n\nclass PresetItem extends StatelessWidget {\n  final Map<String, dynamic> item;\n  final NuxDevice device;\n  final bool simplified;\n  final bool hideNotApplicable;\n  final void Function()? onTap;\n  final void Function(PresetItemActions, Map<String, dynamic>)? onPopupMenuTap;\n\n  const PresetItem(\n      {Key? key,\n      required this.item,\n      required this.device,\n      required this.simplified,\n      this.onTap,\n      this.onPopupMenuTap,\n      required this.hideNotApplicable})\n      : super(key: key);\n\n  Widget? _createPresetTrailingWidget(\n      Map<String, dynamic> item, BuildContext context) {\n    //create trailing widget based on whether the preset is new\n    Widget? trailingWidget;\n    late Widget pmb;\n    if (!simplified) {\n      pmb = PopupMenuButton(\n        child: const Padding(\n          padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16),\n          child: Icon(Icons.more_vert),\n        ),\n        itemBuilder: (context) {\n          return PresetsPopupMenus.popupMenuPreset;\n        },\n        onSelected: (pos) {\n          onPopupMenuTap?.call(pos as PresetItemActions, item);\n        },\n      );\n    }\n\n    if (simplified) {\n      trailingWidget = null;\n    } else if (kDebugMode && false) {\n      trailingWidget = Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          IconButton(\n              onPressed: () {\n                Navigator.of(context).push(\n                  MaterialPageRoute(builder: (context) => PresetForm()),\n                );\n              },\n              icon: Icon(Icons.adaptive.share)),\n          pmb\n        ],\n      );\n    } else {\n      trailingWidget = pmb;\n    }\n\n    return trailingWidget;\n  }\n\n  Widget _iconLabel(String label, Color color) {\n    var items = label.split(\"|\");\n    List<Widget> widgets = [];\n    for (var item in items) {\n      if (item != '-') {\n        widgets.add(Text(\n          item,\n          textAlign: TextAlign.center,\n          style: TextStyle(fontSize: 14, color: color),\n        ));\n      } else {\n        widgets.add(SizedBox(\n          width: 36,\n          child: Divider(\n            indent: 0,\n            endIndent: 0,\n            thickness: 2,\n            height: 4,\n            color: color,\n          ),\n        ));\n      }\n    }\n\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.center,\n      children: widgets,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var pVersion = item[\"version\"] ?? 0;\n    var devVersion = device.productVersion;\n    bool enabled = true;\n    enabled = item[\"product_id\"] == device.presetClass;\n\n    if (!enabled && hideNotApplicable) return const SizedBox.shrink();\n    bool selected = item[\"uuid\"] == device.deviceControl.presetUUID;\n    bool newItem = item.containsKey(\"new\");\n\n    var dev = NuxDeviceControl.instance()\n            .getDeviceFromPresetClass(item[\"product_id\"]) ??\n        device;\n    Color color = dev.getPreset(0).channelColorsList[item[\"channel\"]];\n\n    if (!enabled) color = TinyColor.fromColor(color).desaturate(90).color;\n\n    int alpha = selected && !simplified ? 105 : 0;\n\n    return ColoredBox(\n      color: Color.fromARGB(alpha, 8, 102, 232),\n      child: ListTile(\n          enabled: enabled,\n          minLeadingWidth: 0,\n          contentPadding: const EdgeInsets.fromLTRB(0, 0, 0, 0),\n          leading: Container(\n            margin: const EdgeInsets.only(left: 4),\n            decoration: BoxDecoration(\n                border: Border.all(color: color, width: 1.5),\n                borderRadius: const BorderRadius.all(Radius.circular(5))),\n            width: 45,\n            height: 45,\n            child: Stack(\n              alignment: Alignment.center,\n              children: [\n                FittedBox(\n                  fit: BoxFit.fitWidth,\n                  child: Padding(\n                    padding: const EdgeInsets.all(3.0),\n                    child: _iconLabel(dev.productIconLabel, color),\n                  ),\n                ),\n                if (newItem)\n                  Transform(\n                    transform: Matrix4.translationValues(22, -20, 0),\n                    child: const Icon(\n                      Icons.circle,\n                      color: Colors.blue,\n                      size: 16,\n                    ),\n                  ),\n                if (enabled && pVersion != devVersion)\n                  Transform(\n                    transform: Matrix4.translationValues(18, 15, 0),\n                    child: const Icon(\n                      Icons.warning,\n                      color: Colors.amber,\n                      size: 20,\n                    ),\n                  )\n              ],\n            ),\n          ),\n          title: Text(item[\"name\"],\n              style:\n                  TextStyle(color: enabled ? Colors.white : Colors.grey[600])),\n          subtitle:\n              PresetEffectPreview(device: dev, preset: item, enabled: enabled),\n          trailing: _createPresetTrailingWidget(item, context),\n          onTap: onTap),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/presetList.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_lists.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/presets/preset_list/preset_widget.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport '../../../mainTabs.dart';\nimport '/utilities/string_extensions.dart';\n\nimport '../../search_field.dart';\nimport '/audio/setlist_player/setlistPlayerState.dart';\nimport '/audio/trackdata/trackData.dart';\nimport '/bluetooth/NuxDeviceControl.dart';\nimport '/bluetooth/devices/NuxDevice.dart';\nimport '/platform/presetsStorage.dart';\nimport '/platform/fileSaver.dart';\nimport '/platform/platformUtils.dart';\nimport '/UI/popups/alertDialogs.dart';\nimport '../trackEventsBlockInfo.dart';\nimport 'presetListMethods.dart';\nimport 'presets_popup_menus.dart';\n\nclass PresetList extends StatefulWidget {\n  final void Function(dynamic)? onTap;\n  final bool simplified;\n  final TabVisibilityEventHandler? visibilityEventHandler;\n  const PresetList(\n      {Key? key,\n      this.onTap,\n      this.simplified = false,\n      this.visibilityEventHandler})\n      : super(key: key);\n\n  @override\n  State<PresetList> createState() => _PresetListState();\n}\n\nclass _PresetListState extends State<PresetList>\n    with AutomaticKeepAliveClientMixin<PresetList> {\n  NuxDevice get device => NuxDeviceControl.instance().device;\n  List<dynamic> get _lists => PresetsStorage().presetsData;\n  Map<String, NuxDevice> devices = <String, NuxDevice>{};\n  bool _showSearch = false;\n  final TextEditingController _searchText = TextEditingController(text: \"\");\n  late ScrollController _scrollController;\n\n  @override\n  void initState() {\n    super.initState();\n\n    if (widget.visibilityEventHandler != null) {\n      widget.visibilityEventHandler!.onTabSelected = _onTabSelected;\n      widget.visibilityEventHandler!.onTabDeselected = _onTabDeselected;\n    }\n    _registerListeners();\n    _searchText.addListener(refreshPresets);\n\n    _scrollController = ScrollController();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    _onTabDeselected();\n    _searchText.removeListener(refreshPresets);\n  }\n\n  void _registerListeners() {\n    NuxDeviceControl.instance().addListener(refreshPresets);\n    PresetsStorage().addListener(refreshPresets);\n    NuxDeviceControl.instance().presetNameNotifier.addListener(refreshPresets);\n    if (!widget.simplified) {\n      SetlistPlayerState.instance().addListener(refreshPresets);\n    }\n  }\n\n  void _onTabSelected() {\n    _registerListeners();\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  void _onTabDeselected() {\n    print(\"on deselected\");\n    NuxDeviceControl.instance().removeListener(refreshPresets);\n    PresetsStorage().removeListener(refreshPresets);\n    NuxDeviceControl.instance()\n        .presetNameNotifier\n        .removeListener(refreshPresets);\n    if (!widget.simplified) {\n      SetlistPlayerState.instance().removeListener(refreshPresets);\n    }\n  }\n\n  void refreshPresets() {\n    setState(() {});\n  }\n\n  void _openToneShare() {\n    //Navigator.of(context)\n    //    .push(MaterialPageRoute(builder: (context) => const ToneShare()));\n\n    //Navigator.of(context)\n    //    .push(MaterialPageRoute(builder: (context) => MightyPatchesPage()));\n  }\n\n  Widget _mainPopupMenu() {\n    return PopupMenuButton(\n      child: const Padding(\n        padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16),\n        child: Icon(Icons.more_vert),\n      ),\n      itemBuilder: (context) {\n        return PresetsPopupMenus.presetsMenu;\n      },\n      onSelected: (pos) {\n        mainMenuActions(pos);\n      },\n    );\n  }\n\n  Widget? _createHeader() {\n    if (_showSearch) {\n      return SearchField(\n        textEditingController: _searchText,\n        onCloseSearch: () {\n          _searchText.clear();\n          _showSearch = false;\n          setState(() {});\n        },\n      );\n    } else if (!widget.simplified) {\n      return ListTile(\n        // shape: RoundedRectangleBorder(\n        //     borderRadius: BorderRadius.circular(20),\n        //     side: BorderSide(color: Colors.grey)),\n        contentPadding: const EdgeInsets.only(left: 16, right: 0),\n        title: const Text(\"Presets\"),\n        trailing: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            /*if (kDebugMode)\n              IconButton(\n                  onPressed: _openToneShare,\n                  icon: const Icon(\n                    Icons.cloud_download,\n                    size: 28,\n                  )),*/\n            IconButton(\n                onPressed: () {\n                  _showSearch = true;\n                  setState(() {});\n                },\n                icon: const Icon(\n                  Icons.search,\n                  size: 28,\n                )),\n            _mainPopupMenu()\n          ],\n        ),\n      );\n    }\n    return null;\n  }\n\n  Widget _createDragDropList(\n      List<DragAndDropListInterface> list, Widget? header, bool sliverList,\n      {bool disableScrolling = false}) {\n    return DragAndDropLists(\n      scrollController: _scrollController,\n      sliverList: sliverList,\n      key: const PageStorageKey<String>(\"presets\"),\n      children: list,\n      disableScrolling: disableScrolling,\n      headerWidget: header,\n      lastListTargetSize: 60,\n      contentsWhenEmpty: const SliverFillRemaining(\n        child: Center(\n          child: Text(\"Empty\"),\n        ),\n      ),\n      onItemReorder: _onItemReorder,\n      onListReorder: _onListReorder,\n      itemGhost: (item) {\n        return Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const Icon(\n              Icons.keyboard_arrow_right,\n              size: 30,\n              color: Colors.grey,\n            ),\n            Expanded(child: Opacity(opacity: 0.4, child: item))\n          ],\n        );\n      },\n      itemGhostOpacity: 1,\n      itemDragOffset: const Offset(30, 0),\n      // listGhost is mandatory when using expansion tiles to prevent multiple widgets using the same globalkey\n      listGhost: Container(\n        color: Colors.blue,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(vertical: 8.0),\n          child: Center(\n            child: Container(\n              padding:\n                  const EdgeInsets.symmetric(vertical: 8.0, horizontal: 100.0),\n              decoration: BoxDecoration(\n                border: Border.all(color: Colors.white),\n                borderRadius: BorderRadius.circular(7.0),\n              ),\n              child: const Icon(\n                Icons.add_box,\n                color: Colors.white,\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _createPresetTree(Widget? header, bool hideNonApplicable) {\n    List<DragAndDropListInterface> list = List.generate(\n        _lists.length, (index) => _buildList(index, hideNonApplicable));\n\n    return SafeArea(\n      child: CustomScrollView(\n        slivers: [\n          if (header != null)\n            SliverAppBar(\n              backgroundColor: Theme.of(context).scaffoldBackgroundColor,\n              title: header,\n              titleSpacing: 0,\n              floating: true,\n              snap: true,\n            ),\n          _createDragDropList(list, header, true)\n        ],\n      ),\n    );\n  }\n\n  Widget _createPresetTreeSimple(bool hideNonApplicable) {\n    List<DragAndDropListInterface> list = List.generate(\n        _lists.length, (index) => _buildList(index, hideNonApplicable));\n    return _createDragDropList(list, null, false, disableScrolling: true);\n  }\n\n  Widget _createSearchResultsList(Widget? header, bool hideNonApplicable) {\n    List presetList = [];\n    var searchText = _searchText.text.trim();\n    for (var l in _lists) {\n      var presets = l[\"presets\"];\n      for (var p in presets) {\n        if (p[\"name\"].toString().containsIgnoreCase(searchText)) {\n          presetList.add(p);\n        }\n      }\n    }\n    presetList.sort((a, b) => a[\"name\"].compareTo(b[\"name\"]));\n    return SafeArea(\n      child: CustomScrollView(\n        slivers: [\n          SliverAppBar(\n            backgroundColor: Theme.of(context).scaffoldBackgroundColor,\n            title: header,\n            titleSpacing: 0,\n            floating: true,\n            snap: true,\n          ),\n          if (presetList.isEmpty)\n            const SliverFillRemaining(\n              child: Center(child: Text(\"No Results\")),\n            ),\n          if (presetList.isNotEmpty)\n            SliverList.builder(\n              itemBuilder: (context, index) {\n                return _presetWidget(presetList[index], hideNonApplicable);\n              },\n              itemCount: presetList.length,\n              // prototypeItem: const ListTile(\n              //   subtitle: SizedBox.shrink(),\n              // ),\n            )\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n\n    bool hideNonApplicable =\n        SharedPrefs().getInt(SettingsKeys.hideNotApplicablePresets, 0) == 1;\n\n    Widget? header = _createHeader();\n\n    if (widget.simplified) return _createPresetTreeSimple(hideNonApplicable);\n    Widget ui;\n    if (_searchText.text.isEmpty) {\n      ui = _createPresetTree(header, hideNonApplicable);\n    } else {\n      ui = _createSearchResultsList(header, hideNonApplicable);\n    }\n\n    var sps = SetlistPlayerState.instance();\n    if (sps.state != PlayerState.play ||\n        (sps.automation?.presetChangeEventsAvailable == false)) {\n      return ui;\n    } else {\n      return TrackEventsBlockInfo(\n        child: ui,\n        onBypass: () {\n          setState(() {});\n        },\n      );\n    }\n  }\n\n  void _categoryMenu(CategoryMenuActions action, String item) {\n    switch (action) {\n      case CategoryMenuActions.Delete:\n        _deleteCategory(item);\n        break;\n      case CategoryMenuActions.Rename:\n        _renameCategory(item);\n        break;\n      case CategoryMenuActions.Export:\n        _exportCategory(item);\n        break;\n    }\n  }\n\n  _buildList(int outerIndex, bool hideNonApplicable) {\n    Map category = _lists[outerIndex];\n    List presets = category[\"presets\"];\n    return DragAndDropListExpansion(\n      canDrag: !widget.simplified,\n      title: Text(category[\"name\"]),\n      titleColor: Colors.grey[700],\n      titleColorExpanded: Colors.grey[600],\n      itemsBackgroundColor: Colors.grey[900]!,\n      trailing: widget.simplified\n          ? null\n          : PopupMenuButton(\n              child: const Padding(\n                padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),\n                child: Icon(Icons.more_vert),\n              ),\n              itemBuilder: (context) {\n                return PresetsPopupMenus.popupMenuCategory;\n              },\n              onSelected: (pos) {\n                _categoryMenu(pos as CategoryMenuActions, category[\"name\"]);\n              },\n            ),\n      children: List.generate(presets.length,\n          (index) => _buildPresetItem(presets[index], hideNonApplicable)),\n      listKey: ObjectKey(category),\n    );\n  }\n\n  Widget _presetWidget(Map<String, dynamic> item, bool hideNonApplicable) {\n    return PresetWidget(\n        simplified: widget.simplified,\n        device: device,\n        hideNonApplicable: hideNonApplicable,\n        onTap: widget.onTap,\n        preset: item);\n  }\n\n  _buildPresetItem(Map<String, dynamic> item, bool hideNonApplicable) {\n    return DragAndDropItem(\n      canDrag: !widget.simplified,\n      feedbackWidget: ListTile(\n        tileColor: const Color.fromARGB(127, 127, 127, 127),\n        title: Text(item[\"name\"]),\n      ),\n      child: _presetWidget(item, hideNonApplicable),\n    );\n  }\n\n  _onItemReorder(\n      int oldItemIndex, int oldListIndex, int newItemIndex, int newListIndex) {\n    if (PresetsStorage().reorderPresets(\n        oldItemIndex, oldListIndex, newItemIndex, newListIndex)) {\n      setState(() {});\n    } else {\n      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(\n          backgroundColor: Colors.deepOrange,\n          content: Text(\n            \"Destination category contains preset with the same name!\",\n            textAlign: TextAlign.center,\n            style: TextStyle(color: Colors.white, fontSize: 20),\n          )));\n    }\n  }\n\n  _onListReorder(int oldListIndex, int newListIndex) {\n    setState(() {\n      PresetsStorage().reorderCategories(oldListIndex, newListIndex);\n    });\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  ///\n  ///Actions\n  ///\n  ///\n  void mainMenuActions(action) {\n    switch (action) {\n      case PresetsTopMenuActions.ExportAll:\n        _exportCategory(\"\");\n        break;\n      case PresetsTopMenuActions.Import:\n        _importPresets();\n        break;\n    }\n  }\n\n  ///\n  /// Preset actions\n  ///\n  ///\n  void _deleteCategory(String category) {\n    AlertDialogs.showConfirmDialog(context,\n        title: \"Confirm\",\n        description: \"Are you sure you want to delete category $category?\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Delete\",\n        confirmColor: Colors.red, onConfirm: (delete) {\n      if (delete) {\n        PresetsStorage().deleteCategory(category).then((List<String> uuids) {\n          TrackData().removeMultiplePresetsInstances(uuids);\n          setState(() {});\n        });\n      }\n    });\n  }\n\n  void _renameCategory(String category) {\n    AlertDialogs.showInputDialog(context,\n        title: \"Rename\",\n        description: \"Enter category name:\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Rename\",\n        value: category,\n        validation: (String newName) {\n          return !PresetsStorage().getCategories().contains(newName);\n        },\n        validationErrorMessage: \"Name already taken!\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (newName) {\n          PresetsStorage()\n              .renameCategory(category, newName)\n              .then((value) => setState(() {}));\n        });\n  }\n\n  //if category is empty string it exports all categories\n  void _exportCategory(String category) {\n    String? data = PresetsStorage().presetsToJson(category);\n\n    if (category.isEmpty) {\n      category = \"Backup\";\n    }\n    if (data != null) {\n      if (!PlatformUtils.isIOS) {\n        saveFileString(\"application/octet-stream\", \"$category.nuxpreset\", data);\n      } else {\n        PresetListMethods.saveFileIos(category, data, context);\n      }\n    } else {\n      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(\n          backgroundColor: Colors.deepOrange,\n          content: Text(\n            \"Cannot export empty category!\",\n            textAlign: TextAlign.center,\n            style: TextStyle(color: Colors.white, fontSize: 20),\n          )));\n    }\n  }\n\n  void _importPresets() {\n    if (PlatformUtils.isAndroid) {\n      openFileString(\"application/octet-stream\").then(_onFileRead);\n    } else {\n      FilePicker().readFile().then((value) {\n        if (value != null) _onFileRead(value);\n      });\n    }\n  }\n\n  void _onFileRead(String value) {\n    PresetsStorage().presetsFromJson(value).then((value) {\n      setState(() {});\n      String label =\n          value == 1 ? \"Imported 1 preset\" : \"Imported $value presets\";\n      ScaffoldMessenger.of(context).showSnackBar(SnackBar(\n          backgroundColor: Colors.green,\n          content: Text(\n            label,\n            textAlign: TextAlign.center,\n            style: const TextStyle(color: Colors.white, fontSize: 20),\n          )));\n    }).catchError((error) {\n      AlertDialogs.showInfoDialog(context,\n          title: \"Error\",\n          description: \"The selected file is not a valid preset file!\",\n          confirmButton: \"OK\");\n    });\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/presetListMethods.dart",
    "content": "import 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:qr_utils/qr_utils.dart';\n\nimport '../../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../../platform/fileSaver.dart';\nimport '../../../../platform/platformUtils.dart';\nimport '../../../../platform/presetsStorage.dart';\nimport '../../../popups/alertDialogs.dart';\nimport '../../../popups/exportQRCode.dart';\n\nclass PresetListMethods {\n  static void exportQR(Map<String, dynamic> preset, BuildContext context) {\n    var dev = NuxDeviceControl.instance()\n        .getDeviceFromPresetClass(preset[\"product_id\"]);\n    var pVersion = preset[\"version\"] ?? 0;\n    if (dev != null) {\n      int? originalVersion;\n      if (dev.productVersion != pVersion) {\n        originalVersion = dev.productVersion;\n        dev.setFirmwareVersionByIndex(pVersion);\n      }\n      var qr = dev.jsonToQR(preset);\n      if (qr != null) {\n        QrUtils.generateQR(qr).then((Image img) {\n          var qrExport = QRExportDialog(img, preset[\"name\"], dev);\n          showDialog(\n            context: context,\n            builder: (BuildContext context) => qrExport.buildDialog(context),\n          ).then((value) {\n            if (originalVersion != null) {\n              dev.setFirmwareVersionByIndex(originalVersion);\n            }\n          });\n        });\n      }\n    }\n  }\n\n  static void saveFileIos(String name, String data, BuildContext context) {\n    AlertDialogs.showInputDialog(context,\n        title: \"Backup\",\n        description: \"Enter backup name:\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Backup\",\n        value: name,\n        validation: (String newName) {\n          RegExp regex = RegExp(r'[<>:\"/\\\\|?*\\x00-\\x1F\\x7F]+');\n          return !regex.hasMatch(newName);\n        },\n        validationErrorMessage: \"The file name contains invalid characters.\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (newName) async {\n          await FilePicker().saveFile(newName, data);\n        });\n  }\n\n  static void exportPreset(Map<String, dynamic> preset, BuildContext context) {\n    var category = PresetsStorage().findCategoryOfPreset(preset);\n    if (category != null) {\n      String? data =\n          PresetsStorage().presetToJson(category[\"name\"], preset[\"name\"]);\n\n      if (data != null) {\n        if (!PlatformUtils.isIOS) {\n          saveFileString(\n              \"application/octet-stream\", \"${preset[\"name\"]}.nuxpreset\", data);\n        } else {\n          PresetListMethods.saveFileIos(preset[\"name\"], data, context);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/preset_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\n\nimport '../../../../audio/trackdata/trackData.dart';\nimport '../../../../bluetooth/NuxDeviceControl.dart';\nimport '../../../../platform/presetsStorage.dart';\nimport '../../../popups/alertDialogs.dart';\nimport '../../../popups/changeCategory.dart';\nimport 'presetItem.dart';\nimport 'presetListMethods.dart';\nimport 'presets_popup_menus.dart';\n\nclass PresetWidget extends StatefulWidget {\n  final bool simplified;\n  final NuxDevice device;\n  final bool hideNonApplicable;\n  final Map<String, dynamic> preset;\n  final void Function(dynamic)? onTap;\n\n  const PresetWidget(\n      {super.key,\n      required this.simplified,\n      required this.device,\n      required this.hideNonApplicable,\n      required this.preset,\n      this.onTap});\n\n  @override\n  State<PresetWidget> createState() => _PresetWidgetState();\n}\n\nclass _PresetWidgetState extends State<PresetWidget> {\n  Widget _presetWidget(Map<String, dynamic> item, bool hideNonApplicable) {\n    return PresetItem(\n      device: widget.device,\n      item: item,\n      hideNotApplicable: hideNonApplicable,\n      simplified: widget.simplified,\n      onTap: () {\n        //remove the new marker if exists\n        if (!widget.simplified) {\n          PresetsStorage().clearNewFlag(item);\n        }\n\n        if (widget.onTap != null) {\n          widget.onTap!(item);\n        } else {\n          var dev = widget.device;\n          if (dev.isPresetSupported(item)) {\n            widget.device.presetFromJson(item, null);\n          }\n        }\n        setState(() {});\n      },\n      onPopupMenuTap: (action, item) {\n        switch (action) {\n          case PresetItemActions.Delete:\n            _deletePreset(item);\n            break;\n          case PresetItemActions.Rename:\n            _renamePreset(item);\n            break;\n          case PresetItemActions.ChangeChannel:\n            _changePresetChannel(item);\n            break;\n          case PresetItemActions.Duplicate:\n            _duplicatePreset(item);\n            break;\n          case PresetItemActions.Export:\n            PresetListMethods.exportPreset(item, context);\n            break;\n          case PresetItemActions.ChangeCategory:\n            _changePresetCategory(item);\n            break;\n          case PresetItemActions.ExportQR:\n            PresetListMethods.exportQR(item, context);\n            break;\n        }\n      },\n    );\n  }\n\n  void _deletePreset(Map<String, dynamic> preset) {\n    bool inUse = TrackData().isPresetInUse(preset[\"uuid\"]!);\n    String description = \"Are you sure you want to delete ${preset[\"name\"]}?\";\n    if (inUse) {\n      description += \"\\n\\nThe preset is used in one or more Jamtracks!\";\n    }\n\n    AlertDialogs.showConfirmDialog(context,\n        title: \"Confirm\",\n        description: description,\n        cancelButton: \"Cancel\",\n        confirmButton: \"Delete\",\n        confirmColor: Colors.red, onConfirm: (delete) {\n      if (delete) {\n        String uuid = preset[\"uuid\"] ?? \"\";\n        TrackData().removePresetInstances(uuid);\n        PresetsStorage().deletePreset(preset).then((value) => setState(() {}));\n      }\n    });\n  }\n\n  void _renamePreset(Map<String, dynamic> preset) {\n    var category = PresetsStorage().findCategoryOfPreset(preset);\n    if (category != null) {\n      AlertDialogs.showInputDialog(context,\n          title: \"Rename\",\n          description: \"Enter preset name:\",\n          cancelButton: \"Cancel\",\n          confirmButton: \"Rename\",\n          value: preset[\"name\"],\n          validationErrorMessage: \"Name already taken!\",\n          validation: (newName) {\n            return !PresetsStorage().presetExists(newName, category[\"name\"]);\n          },\n          confirmColor: Theme.of(context).hintColor,\n          onConfirm: (newName) {\n            PresetsStorage()\n                .renamePreset(preset, newName)\n                .then((value) => setState(() {}));\n          });\n    }\n  }\n\n  void _changePresetChannel(Map<String, dynamic> preset) {\n    List<String> channelList = [];\n    int nuxChannel = preset[\"channel\"];\n    var d = NuxDeviceControl.instance()\n        .getDeviceFromPresetClass(preset[\"product_id\"]);\n\n    if (d != null) {\n      for (int i = 0; i < d.channelsCount; i++) {\n        channelList.add(d.channelName(i));\n      }\n      var dialog = AlertDialogs.showOptionDialog(context,\n          confirmButton: \"Change\",\n          cancelButton: \"Cancel\",\n          title: \"Select Channel\",\n          confirmColor: Theme.of(context).hintColor,\n          options: channelList,\n          value: nuxChannel, onConfirm: (changed, newValue) {\n        if (changed) {\n          setState(() {\n            PresetsStorage().changeChannel(preset, newValue);\n          });\n        }\n      });\n      showDialog(\n        context: context,\n        builder: (BuildContext context) => dialog,\n      );\n    }\n  }\n\n  void _duplicatePreset(Map<String, dynamic> preset) {\n    var category = PresetsStorage().findCategoryOfPreset(preset);\n    if (category != null) {\n      PresetsStorage()\n          .duplicatePreset(category[\"name\"], preset[\"name\"])\n          .then((value) {\n        setState(() {});\n      });\n    }\n  }\n\n  void _changePresetCategory(Map<String, dynamic> preset) {\n    var category = PresetsStorage().findCategoryOfPreset(preset);\n    if (category != null) {\n      var categoryDialog = ChangeCategoryDialog(\n          category: category[\"name\"],\n          name: preset[\"name\"],\n          confirmColor: Theme.of(context).hintColor,\n          onCategoryChange: (newCategory) {\n            setState(() {\n              PresetsStorage().changePresetCategory(\n                  category[\"name\"], preset[\"name\"], newCategory);\n            });\n          });\n      showDialog(\n        context: context,\n        builder: (BuildContext context) => categoryDialog.buildDialog(context),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return _presetWidget(widget.preset, widget.hideNonApplicable);\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/preset_list/presets_popup_menus.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../mightierIcons.dart';\nimport '../../../theme.dart';\n\nenum PresetsTopMenuActions { ExportAll, Import }\n\nenum CategoryMenuActions { Delete, Rename, Export }\n\nenum PresetItemActions {\n  Delete,\n  Rename,\n  ChangeChannel,\n  Duplicate,\n  Export,\n  ChangeCategory,\n  ExportQR\n}\n\nclass PresetsPopupMenus {\n  //mainMenu\n  static final presetsMenu = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: PresetsTopMenuActions.ExportAll,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.archive,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Backup All\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetsTopMenuActions.Import,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.unarchive,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Restore\"),\n        ],\n      ),\n    ),\n  ];\n\n  //menu for category\n  static final List<PopupMenuEntry> popupMenuCategory = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: CategoryMenuActions.Delete,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.delete,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Delete\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: CategoryMenuActions.Rename,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.drive_file_rename_outline,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Rename\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: CategoryMenuActions.Export,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.archive,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Backup Category\"),\n        ],\n      ),\n    )\n  ];\n\n  static final List<PopupMenuEntry> popupMenuPreset = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: PresetItemActions.Delete,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.delete,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Delete\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.ChangeChannel,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.circle,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Change Channel\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.ChangeCategory,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            MightierIcons.tag,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Change Category\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.Rename,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.drive_file_rename_outline,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Rename\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.Duplicate,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.copy,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Duplicate\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.ExportQR,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.qr_code_2,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Share as QR Code\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: PresetItemActions.Export,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.archive,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Backup Preset\"),\n        ],\n      ),\n    )\n  ];\n}\n"
  },
  {
    "path": "lib/UI/widgets/presets/trackEventsBlockInfo.dart",
    "content": "import 'dart:ui';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';\n\nclass TrackEventsBlockInfo extends StatelessWidget {\n  final Widget child;\n  final Function() onBypass;\n  const TrackEventsBlockInfo(\n      {super.key, required this.child, required this.onBypass});\n\n  @override\n  Widget build(BuildContext context) {\n    return Stack(\n      alignment: Alignment.center,\n      children: [\n        child,\n        ClipRect(\n          child: BackdropFilter(\n              filter: ImageFilter.blur(\n                sigmaX: 2,\n                sigmaY: 2,\n              ),\n              child: Container(\n                color: Colors.black54,\n              )),\n        ),\n        Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              const Text(\n                  textAlign: TextAlign.center,\n                  style: TextStyle(fontSize: 16),\n                  \"The parameters are driven by the currently playing Jam Track!\"),\n              const SizedBox(\n                height: 20,\n              ),\n              ElevatedButton(\n                onPressed: () {\n                  SetlistPlayerState.instance()\n                      .automation\n                      ?.bypassPresetChanges();\n                  onBypass();\n                },\n                child: const Text(\"Bypass\"),\n              )\n            ],\n          ),\n        )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/rounded_icon_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass RoundedIconButton extends StatelessWidget {\n  final VoidCallback? onPressed;\n  final Widget icon;\n  final String? tooltip;\n  final double borderRadius;\n\n  const RoundedIconButton(\n      {Key? key,\n      this.onPressed,\n      required this.icon,\n      this.tooltip,\n      this.borderRadius = 6})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: ShapeDecoration(\n        color: onPressed != null ? Colors.blue : Colors.grey[800],\n        shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(borderRadius)),\n      ),\n      child: IconButton(\n        constraints: ButtonTheme.of(context).constraints,\n        icon: icon,\n        onPressed: onPressed,\n        tooltip: tooltip,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/scrollParent.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\n\nclass ScrollParent extends StatelessWidget {\n  final ScrollController controller;\n  final Widget child;\n\n  const ScrollParent({Key? key, required this.controller, required this.child})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return NotificationListener<OverscrollNotification>(\n      onNotification: (OverscrollNotification value) {\n        if (value.overscroll < 0 && controller.offset + value.overscroll <= 0) {\n          if (controller.offset != 0) controller.jumpTo(0);\n          return true;\n        }\n        if (controller.offset - value.overscroll >=\n            controller.position.maxScrollExtent) {\n          if (controller.offset != controller.position.maxScrollExtent) {\n            controller.jumpTo(controller.position.maxScrollExtent);\n          }\n          return true;\n        }\n        controller.jumpTo(controller.offset - value.overscroll);\n        return true;\n      },\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/scrollPicker.dart",
    "content": "// Copyright (c) 2018, codegrue. All rights reserved. Use of this source code\n// is governed by the MIT license that can be found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\n\n/// This helper widget manages the scrollable content inside a picker widget.\nclass ScrollPicker extends StatefulWidget {\n  // Constants\n  static const double itemHeight = 50.0;\n\n  const ScrollPicker({\n    Key? key,\n    required this.items,\n    required this.initialValue,\n    required this.onChanged,\n    required this.onChangedFinal,\n    this.enabled = true,\n  }) : super(key: key);\n\n  // Events\n  final ValueChanged<int> onChanged;\n  final Function(int, bool) onChangedFinal;\n\n  // Variables\n  final List<String> items;\n  final int initialValue;\n  final bool enabled;\n\n  @override\n  _ScrollPickerState createState() => _ScrollPickerState(initialValue);\n}\n\nclass _ScrollPickerState extends State<ScrollPicker> {\n  _ScrollPickerState(this.selectedValue);\n\n  // Variables\n  double widgetHeight = 0;\n\n  int selectedValue;\n  bool _isUserGenerated = false;\n\n  late FixedExtentScrollController scrollController;\n\n  @override\n  void initState() {\n    super.initState();\n    scrollController = FixedExtentScrollController(initialItem: selectedValue);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData themeData = Theme.of(context);\n    TextStyle defaultStyle = themeData.textTheme.bodyMedium!;\n    TextStyle selectedStyle =\n        themeData.textTheme.bodyLarge!.copyWith(fontSize: 26);\n\n    if (!_isUserGenerated) {\n      selectedValue = widget.initialValue;\n      scrollController.jumpToItem(\n        widget.initialValue,\n      );\n    }\n    //\n    return LayoutBuilder(\n      builder: (BuildContext context, BoxConstraints constraints) {\n        widgetHeight = constraints.maxHeight;\n\n        return IgnorePointer(\n          ignoring: !widget.enabled,\n          child: Opacity(\n            opacity: widget.enabled ? 1 : 0.3,\n            child: Stack(\n              children: <Widget>[\n                GestureDetector(\n                  onTapUp: _itemTapped,\n                  child: NotificationListener<ScrollNotification>(\n                    onNotification: (scrollNotification) {\n                      if (scrollNotification is UserScrollNotification) {\n                        if (scrollNotification.direction !=\n                            ScrollDirection.idle) {\n                          _isUserGenerated = true;\n                        }\n                      } else if (scrollNotification is ScrollEndNotification) {\n                        widget.onChangedFinal(selectedValue, _isUserGenerated);\n                        _isUserGenerated = false;\n                      }\n                      return false;\n                    },\n                    child: ListWheelScrollView.useDelegate(\n                      childDelegate: ListWheelChildBuilderDelegate(\n                          builder: (BuildContext context, int index) {\n                        if (index < 0 || index > widget.items.length - 1) {\n                          return null;\n                        }\n\n                        var value = widget.items[index];\n\n                        final TextStyle itemStyle = (index == selectedValue)\n                            ? selectedStyle\n                            : defaultStyle;\n\n                        return Center(\n                          child: AnimatedDefaultTextStyle(\n                            style: itemStyle,\n                            duration: const Duration(milliseconds: 100),\n                            child: Text(value),\n                          ),\n                        );\n                      }),\n                      controller: scrollController,\n                      itemExtent: ScrollPicker.itemHeight,\n                      onSelectedItemChanged: _onSelectedItemChanged,\n                      physics: const FixedExtentScrollPhysics(),\n                    ),\n                  ),\n                ),\n                IgnorePointer(\n                  child: Center(\n                    child: Container(\n                      height: ScrollPicker.itemHeight,\n                      decoration: const BoxDecoration(\n                        border: Border(\n                          top: BorderSide(color: Colors.grey, width: 1.0),\n                          bottom: BorderSide(color: Colors.grey, width: 1.0),\n                        ),\n                      ),\n                    ),\n                  ),\n                )\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  void _itemTapped(TapUpDetails details) {\n    Offset position = details.localPosition;\n    double center = widgetHeight / 2;\n    double changeBy = position.dy - center;\n    double newPosition = scrollController.offset + changeBy;\n\n    // animate to and center on the selected item\n    scrollController.animateTo(newPosition,\n        duration: const Duration(milliseconds: 500),\n        curve: Curves.easeInOutQuad);\n  }\n\n  void _onSelectedItemChanged(int index) {\n    if (index != selectedValue) {\n      selectedValue = index;\n      widget.onChanged(selectedValue);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/search_field.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass SearchField extends StatelessWidget {\n  final TextEditingController textEditingController;\n  final Function onCloseSearch;\n\n  const SearchField(\n      {super.key,\n      required this.onCloseSearch,\n      required this.textEditingController});\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n        title: TextField(\n      controller: textEditingController,\n      autofocus: true,\n      decoration: InputDecoration(\n        suffixIconColor: Colors.white,\n        focusColor: Colors.white,\n        //focusedBorder: InputBorder.none,\n        prefixIcon: const Icon(Icons.search),\n        border: InputBorder.none,\n        suffixIcon: IconButton(\n          icon: const Icon(Icons.close),\n          onPressed: () {\n            textEditingController.clear();\n            onCloseSearch();\n          },\n        ),\n      ),\n    ));\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/thickRangeSlider.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:math';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/semantics.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\n\nclass SliderRangeValues {\n  double start;\n  double end;\n  SliderRangeValues(this.start, this.end);\n\n  SliderRangeValues operator *(double value) {\n    return SliderRangeValues(start * value, end * value);\n  }\n}\n\nclass ThickRangeSlider extends StatefulWidget {\n  final Color activeColor;\n  final String label;\n  final double min, max;\n  final SliderRangeValues values;\n  final ValueChanged<SliderRangeValues>? onDragStart;\n  final Function(SliderRangeValues value, bool skip)? onChanged;\n  final ValueChanged<SliderRangeValues>? onDragEnd;\n  final String Function(SliderRangeValues) labelFormatter;\n  final int skipEmitting;\n  final bool enabled;\n  final bool handleVerticalDrag;\n  final double? maxHeight;\n\n  const ThickRangeSlider(\n      {Key? key,\n      required this.activeColor,\n      required this.label,\n      this.min = 0,\n      this.max = 1,\n      required this.values,\n      this.onDragStart,\n      this.onChanged,\n      this.onDragEnd,\n      this.handleVerticalDrag = true,\n      required this.labelFormatter,\n      this.skipEmitting = 3,\n      this.enabled = true,\n      this.maxHeight})\n      : super(key: key);\n\n  @override\n  State createState() => _ThickRangeSliderState();\n}\n\nclass _ThickRangeSliderState extends State<ThickRangeSlider> {\n  SliderRangeValues factor =\n      SliderRangeValues(0.2, 0.8); //normalized position in 0-1\n  SliderRangeValues pos = SliderRangeValues(0, 1);\n  int lastTapDown = 0;\n  int emitCounter = 0;\n  double scale = 1;\n\n  Offset startDragPos = const Offset(0, 0);\n  double width = 0;\n  double height = 0;\n\n  int handleIndex = 0;\n\n  // Returns a number between min and max, proportional to value, which must\n  // be between 0.0 and 1.0.\n  double _lerpSingle(double value) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (widget.max - widget.min) + widget.min;\n  }\n\n  SliderRangeValues _lerp(SliderRangeValues values) {\n    return SliderRangeValues(\n        _lerpSingle(values.start), _lerpSingle(values.end));\n  }\n\n  //same as above, only with custom min and max\n  double _lerp2Single(double value, double min, double max) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (max - min) + min;\n  }\n\n  SliderRangeValues _lerp2(SliderRangeValues values, double min, double max) {\n    return SliderRangeValues(_lerp2Single(values.start, min, max),\n        _lerp2Single(values.end, min, max));\n  }\n\n  // Returns a number between 0.0 and 1.0, given a value between min and max.\n\n  double _unlerpSingle(double value) {\n    assert(value <= widget.max);\n    assert(value >= widget.min);\n    return widget.max > widget.min\n        ? (value - widget.min) / (widget.max - widget.min)\n        : 0.0;\n  }\n\n  SliderRangeValues _unlerp(SliderRangeValues value) {\n    return SliderRangeValues(\n        _unlerpSingle(value.start), _unlerpSingle(value.end));\n  }\n\n  @override\n  void initState() {\n    super.initState();\n\n    //range check\n    assert(widget.min < widget.max);\n    assert(\n        widget.values.start >= widget.min && widget.values.start <= widget.max);\n    assert(widget.values.end >= widget.min && widget.values.end <= widget.max);\n    assert(widget.values.start <= widget.values.end);\n    assert(widget.skipEmitting > 0);\n    //normalize value to 0-1\n    factor = _unlerp(widget.values);\n  }\n\n  void addPercentage(value, width, int index) {\n    if (index != 1) {\n      pos.start += value;\n      pos.start = max(min(pos.start, pos.end), 0);\n      factor.start = pos.start / width;\n    }\n    if (index != 0) {\n      pos.end += value;\n      pos.end = max(min(pos.end, width), pos.start);\n      factor.end = pos.end / width;\n    }\n  }\n\n  void dragStart(DragStartDetails details) {\n    startDragPos = details.localPosition;\n    widget.onDragStart?.call(widget.values);\n\n    var startFactor = startDragPos.dx / width;\n    var midPoint = factor.start + (factor.end - factor.start) / 2;\n    handleIndex = startFactor < midPoint ? 0 : 1;\n    return;\n  }\n\n  void dragUpdate(DragUpdateDetails details) {\n    Offset delta = details.localPosition - startDragPos;\n    startDragPos = details.localPosition;\n\n    scale = 1;\n    var posAbs = (details.localPosition.dy - height / 2.0).abs();\n    if (posAbs > height * 1.5) scale = 0.5;\n    if (posAbs > height * 2.5) scale = 0.25;\n    if (posAbs > height * 4) scale = 0.125;\n    if (posAbs > height * 5.5) scale = 0.0625;\n    if (!widget.enabled) return;\n    addPercentage(delta.dx * scale, width, handleIndex);\n    emitCounter++;\n    bool skip = emitCounter % widget.skipEmitting != 0;\n    widget.onChanged?.call(_lerp(factor), skip);\n  }\n\n  void dragEnd(DragEndDetails details) {\n    if (!widget.enabled) return;\n    scale = 1;\n    //call the last factor value here\n    widget.onChanged?.call(_lerp(factor), false);\n    widget.onDragEnd?.call(_lerp(factor));\n    SemanticsService.announce(\n        widget.labelFormatter(_lerp(factor)), TextDirection.ltr);\n  }\n\n  void manualValueEnter() {\n    /*\n    String dialogValue = _lerp(factor).toStringAsFixed(2);\n\n    AlertDialogs.showInputDialog(context,\n        title: \"Enter Value\",\n        description: \"Enter new value for ${widget.label}\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Set\",\n        selectAll: true,\n        keyboardType: TextInputType.number,\n        value: dialogValue,\n        validation: (value) {\n          double? val = double.tryParse(value);\n          if (val == null) return false;\n\n          double min = 0, max = 0;\n\n          //Check for range\n          min = widget.min;\n          max = widget.max;\n\n          if (val < min || val > max) return false;\n          return true;\n        },\n        validationErrorMessage: \"Value not valid\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (value) {\n          var val = double.parse(value);\n\n          widget.onDragStart?.call(widget.values);\n          widget.onChanged?.call(val, false);\n          widget.onDragEnd?.call(val);\n        });\n        */\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ConstrainedBox(\n      constraints: BoxConstraints(maxHeight: widget.maxHeight ?? 50),\n      child: Semantics(\n        slider: true,\n        label: widget.label,\n        value: widget.labelFormatter(_lerp(factor)),\n        enabled: widget.enabled,\n        excludeSemantics: true,\n        child: LayoutBuilder(\n            builder: (BuildContext context, BoxConstraints constraints) {\n          width = constraints.maxWidth - 1;\n          height = constraints.maxHeight;\n          factor = _unlerp(widget.values);\n          pos = factor * width;\n          SliderRangeValues positionValues = _lerp2(factor, 0, width);\n          SliderRangeValues positionHandles = _lerp2(factor, 10, width - 10);\n\n          return GestureDetector(\n            dragStartBehavior: DragStartBehavior.start,\n            onDoubleTap: manualValueEnter,\n            onVerticalDragStart: widget.handleVerticalDrag ? dragStart : null,\n            onVerticalDragUpdate: widget.handleVerticalDrag ? dragUpdate : null,\n            onVerticalDragEnd: widget.handleVerticalDrag ? dragEnd : null,\n            onHorizontalDragStart: dragStart,\n            onHorizontalDragUpdate: dragUpdate,\n            onHorizontalDragEnd: dragEnd,\n            child: Container(\n              color: Colors.transparent,\n              height: height,\n              child: Stack(\n                alignment: Alignment.centerLeft,\n                children: [\n                  Positioned(\n                    left: positionValues.start,\n                    right: width - positionValues.end,\n                    child: Container(\n                      height: height * 0.75,\n                      color: widget.enabled\n                          ? TinyColor.fromColor(widget.activeColor)\n                              .darken(15)\n                              .color\n                          : Colors.grey[800],\n                      //width: max(factor * width, 0),\n                    ),\n                  ),\n                  Positioned(\n                      left: positionHandles.start - 10,\n                      width: 20,\n                      height: height * 0.9,\n                      child: Container(\n                          color: widget.enabled\n                              ? widget.activeColor\n                              : Colors.grey[700],\n                          width: 20)),\n                  Positioned(\n                      left: positionHandles.end - 10,\n                      width: 20,\n                      height: height * 0.9,\n                      child: Container(\n                          color: widget.enabled\n                              ? widget.activeColor\n                              : Colors.grey[700],\n                          width: 20)),\n                  Padding(\n                    padding: const EdgeInsets.symmetric(horizontal: 6.0),\n                    child: Row(\n                        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                        children: [\n                          Text(\n                            widget.label,\n                            style: TextStyle(\n                                color: widget.enabled\n                                    ? Colors.white\n                                    : Colors.grey[600],\n                                fontSize: 20),\n                          ),\n                          Text(\n                            widget.labelFormatter(_lerp(factor)),\n                            style: TextStyle(\n                                color: widget.enabled\n                                    ? Colors.white\n                                    : Colors.grey[600],\n                                fontSize: 20),\n                          )\n                        ]),\n                  ),\n                  Center(child: Text(scale < 1 ? \"x$scale\" : \"\"))\n                ],\n              ),\n            ),\n          );\n        }),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/thickSlider.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:math';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/semantics.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\n\nclass ThickSlider extends StatefulWidget {\n  final Color activeColor;\n  final String label;\n  final double min, max;\n  final double value;\n  final ValueChanged<double>? onDragStart;\n  final Function(double value, bool skip)? onChanged;\n  final ValueChanged<double>? onDragEnd;\n  final String Function(double) labelFormatter;\n  final int skipEmitting;\n  final bool enabled;\n  final bool handleVerticalDrag;\n  final Parameter? parameter;\n  final double? maxHeight;\n  final bool snapToCenter;\n\n  const ThickSlider(\n      {Key? key,\n      required this.activeColor,\n      required this.label,\n      this.min = 0,\n      this.max = 1,\n      required this.value,\n      this.snapToCenter = false,\n      this.onDragStart,\n      this.onChanged,\n      this.onDragEnd,\n      this.handleVerticalDrag = true,\n      required this.labelFormatter,\n      this.skipEmitting = 3,\n      this.enabled = true,\n      this.parameter,\n      this.maxHeight})\n      : super(key: key);\n\n  @override\n  State createState() => _ThickSliderState();\n}\n\nclass _ThickSliderState extends State<ThickSlider> {\n  double factor = 0.5; //normalized position in 0-1\n  double pos = 0;\n  int lastTapDown = 0;\n  int emitCounter = 0;\n  double scale = 1;\n\n  Offset startDragPos = const Offset(0, 0);\n  double width = 0;\n  double height = 0;\n\n  bool ownUpdate = false;\n\n  // Returns a number between min and max, proportional to value, which must\n  // be between 0.0 and 1.0.\n  double _lerp(double value) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (widget.max - widget.min) + widget.min;\n  }\n\n  //same as above, only with custom min and max\n  double _lerp2(double value, double min, double max) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (max - min) + min;\n  }\n\n  // Returns a number between 0.0 and 1.0, given a value between min and max.\n  double _unlerp(double value) {\n    assert(value <= widget.max);\n    assert(value >= widget.min);\n    return widget.max > widget.min\n        ? (value - widget.min) / (widget.max - widget.min)\n        : 0.0;\n  }\n\n  //lerp with an optional snap to center\n  double _lerpSnap(double value) {\n    if (widget.snapToCenter) {\n      if (value >= 0.475 && value <= 0.525) return _lerp(0.5);\n    }\n    return _lerp(value);\n  }\n\n  //lerp with an optional snap to center with min & max\n  double _lerpSnap2(double value, double min, double max) {\n    if (widget.snapToCenter) {\n      if (value >= 0.475 && value <= 0.525) return _lerp2(0.5, min, max);\n    }\n    return _lerp2(value, min, max);\n  }\n\n  @override\n  void initState() {\n    super.initState();\n\n    //range check\n    assert(widget.min < widget.max);\n    assert(widget.value >= widget.min && widget.value <= widget.max);\n    assert(widget.skipEmitting > 0);\n    //normalize value to 0-1\n    factor = _unlerp(widget.value);\n  }\n\n  void addPercentage(value, width) {\n    pos += value;\n    pos = max(min(pos, width), 0);\n    factor = pos / width;\n  }\n\n  void dragStart(DragStartDetails details) {\n    startDragPos = details.localPosition;\n    widget.onDragStart?.call(widget.value);\n  }\n\n  void dragUpdate(DragUpdateDetails details) {\n    Offset delta = details.localPosition - startDragPos;\n    startDragPos = details.localPosition;\n\n    scale = 1;\n    var posAbs = (details.localPosition.dy - height / 2.0).abs();\n    if (posAbs > height * 2) scale = 0.5;\n    if (posAbs > height * 3) scale = 0.25;\n    if (posAbs > height * 4.5) scale = 0.125;\n    if (posAbs > height * 6) scale = 0.0625;\n    if (!widget.enabled) return;\n\n    addPercentage(delta.dx * scale, width);\n    emitCounter++;\n\n    bool skip = emitCounter % widget.skipEmitting != 0;\n    widget.onChanged?.call(_lerpSnap(factor), skip);\n    ownUpdate = true;\n  }\n\n  void dragEnd(DragEndDetails details) {\n    if (!widget.enabled) return;\n    scale = 1;\n    //call the last factor value here\n    widget.onChanged?.call(_lerpSnap(factor), false);\n    widget.onDragEnd?.call(_lerpSnap(factor));\n    ownUpdate = true;\n    SemanticsService.announce(\n        widget.labelFormatter(_lerpSnap(factor)), TextDirection.ltr);\n  }\n\n  void manualValueEnter() {\n    String dialogValue = widget.value.toStringAsFixed(2);\n    if (widget.parameter != null) {\n      dialogValue = widget.parameter!.toHumanInput().toStringAsFixed(2);\n    }\n\n    AlertDialogs.showInputDialog(context,\n        title: \"Enter Value\",\n        description: \"Enter new value for ${widget.label}\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Set\",\n        selectAll: true,\n        keyboardType: TextInputType.number,\n        value: dialogValue,\n        validation: (value) {\n          double? val = double.tryParse(value);\n          if (val == null) return false;\n\n          double min = 0, max = 0;\n\n          //Check for range\n          if (widget.parameter == null) {\n            min = widget.min;\n            max = widget.max;\n          } else {\n            min = widget.parameter!.formatter.toHumanInput(widget.min);\n            max = widget.parameter!.formatter.toHumanInput(widget.max);\n            if (min > max) {\n              var tmp = max;\n              max = min;\n              min = tmp;\n            }\n          }\n\n          if (val < min || val > max) return false;\n          return true;\n        },\n        validationErrorMessage: \"Value not valid\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (value) {\n          var val = double.parse(value);\n\n          if (widget.parameter != null) {\n            //unscale value back\n            val = widget.parameter!.fromHumanInput(val);\n          }\n          factor = _unlerp(val);\n          widget.onDragStart?.call(widget.value);\n          widget.onChanged?.call(val, false);\n          widget.onDragEnd?.call(val);\n          ownUpdate = true;\n        });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ConstrainedBox(\n      constraints: BoxConstraints(maxHeight: widget.maxHeight ?? 50),\n      child: Semantics(\n        slider: true,\n        label: widget.label,\n        value: widget.labelFormatter(_lerpSnap(factor)),\n        enabled: widget.enabled,\n        excludeSemantics: true,\n        child: LayoutBuilder(\n            builder: (BuildContext context, BoxConstraints constraints) {\n          width = constraints.maxWidth - 1;\n          height = constraints.maxHeight;\n\n          if (!ownUpdate) {\n            factor = _unlerp(widget.value);\n          }\n          ownUpdate = false;\n          pos = factor * width;\n\n          return GestureDetector(\n            dragStartBehavior: DragStartBehavior.start,\n            onDoubleTap: manualValueEnter,\n            onVerticalDragStart: widget.handleVerticalDrag ? dragStart : null,\n            onVerticalDragUpdate: widget.handleVerticalDrag ? dragUpdate : null,\n            onVerticalDragEnd: widget.handleVerticalDrag ? dragEnd : null,\n            onHorizontalDragStart: dragStart,\n            onHorizontalDragUpdate: dragUpdate,\n            onHorizontalDragEnd: dragEnd,\n            child: Container(\n              color: Colors.transparent,\n              height: height,\n              child: Stack(\n                alignment: Alignment.centerLeft,\n                children: [\n                  Container(\n                    height: height * 0.75,\n                    color: widget.enabled\n                        ? TinyColor.fromColor(widget.activeColor)\n                            .darken(15)\n                            .color\n                        : Colors.grey[800],\n                    width: max(factor * width, 0),\n                  ),\n                  Positioned(\n                      left: _lerpSnap2(factor, 10, width - 10) - 10,\n                      width: 20,\n                      height: height * 0.9,\n                      child: Container(\n                          color: widget.enabled\n                              ? widget.activeColor\n                              : Colors.grey[700],\n                          width: 20)),\n                  Padding(\n                    padding: const EdgeInsets.symmetric(horizontal: 6.0),\n                    child: Row(\n                        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                        children: [\n                          Text(\n                            widget.label,\n                            style: TextStyle(\n                                color: widget.enabled\n                                    ? Colors.white\n                                    : Colors.grey[600],\n                                fontSize: 20),\n                          ),\n                          Text(\n                            widget.labelFormatter(_lerpSnap(factor)),\n                            style: TextStyle(\n                                color: widget.enabled\n                                    ? Colors.white\n                                    : Colors.grey[600],\n                                fontSize: 20),\n                          )\n                        ]),\n                  ),\n                  Center(child: Text(scale < 1 ? \"x$scale\" : \"\"))\n                ],\n              ),\n            ),\n          );\n        }),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/UI/widgets/verticalThickSlider.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:math';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\nimport 'package:tinycolor2/tinycolor2.dart';\n\nclass VerticalThickSlider extends StatefulWidget {\n  final Color activeColor;\n  final String label;\n  final double min, max;\n  final double value;\n  final double width;\n  final ValueChanged<double>? onDragStart;\n  final Function(double value, bool skip)? onChanged;\n  final ValueChanged<double>? onDragEnd;\n  final String Function(double) labelFormatter;\n  final int skipEmitting;\n  final bool enabled;\n  final bool handleHorizontalDrag;\n  final Parameter? parameter;\n\n  const VerticalThickSlider(\n      {Key? key,\n      required this.activeColor,\n      required this.label,\n      this.min = 0,\n      this.max = 1,\n      this.width = 50,\n      required this.value,\n      this.onDragStart,\n      this.onChanged,\n      this.onDragEnd,\n      this.handleHorizontalDrag = true,\n      required this.labelFormatter,\n      this.skipEmitting = 3,\n      this.enabled = true,\n      this.parameter})\n      : super(key: key);\n\n  @override\n  State createState() => _VerticalThickSliderState();\n}\n\nclass _VerticalThickSliderState extends State<VerticalThickSlider> {\n  double factor = 0.5; //normalized position in 0-1\n  double pos = 0;\n  int lastTapDown = 0;\n  int emitCounter = 0;\n  double scale = 1;\n\n  Offset startDragPos = const Offset(0, 0);\n  double width = 0;\n  double height = 0;\n\n  // Returns a number between min and max, proportional to value, which must\n  // be between 0.0 and 1.0.\n  double _lerp(double value) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (widget.max - widget.min) + widget.min;\n  }\n\n  //same as above, only with custom min and max\n  double _lerp2(double value, double _min, double _max) {\n    assert(value >= 0.0);\n    assert(value <= 1.0);\n    return value * (_max - _min) + _min;\n  }\n\n  // Returns a number between 0.0 and 1.0, given a value between min and max.\n  double _unlerp(double value) {\n    assert(value <= widget.max);\n    assert(value >= widget.min);\n    return widget.max > widget.min\n        ? (value - widget.min) / (widget.max - widget.min)\n        : 0.0;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n\n    //range check\n    assert(widget.min < widget.max);\n    assert(widget.value >= widget.min && widget.value <= widget.max);\n    assert(widget.skipEmitting >= 0);\n    //normalize value to 0-1\n    factor = _unlerp(widget.value);\n  }\n\n  void addPercentage(value, height) {\n    pos += value;\n    pos = max(min(pos, height), 0);\n    factor = pos / height;\n  }\n\n  void dragStart(DragStartDetails details) {\n    startDragPos = details.localPosition;\n    widget.onDragStart?.call(widget.value);\n  }\n\n  void dragUpdate(DragUpdateDetails details) {\n    Offset delta = details.localPosition - startDragPos;\n    startDragPos = details.localPosition;\n\n    scale = 1;\n    var posAbs = (details.localPosition.dx - width / 2.0).abs();\n    if (posAbs > width) scale = 0.5;\n    if (posAbs > width * 2.5) scale = 0.25;\n    if (posAbs > width * 4) scale = 0.125;\n    if (posAbs > width * 5.5) scale = 0.0625;\n    if (!widget.enabled) return;\n    addPercentage(-delta.dy * scale, height);\n    emitCounter++;\n\n    bool skip =\n        widget.skipEmitting == 0 || emitCounter % widget.skipEmitting != 0;\n\n    widget.onChanged?.call(_lerp(factor), skip);\n  }\n\n  void dragEnd(DragEndDetails details) {\n    if (!widget.enabled) return;\n    scale = 1;\n    //call the last factor value here\n    widget.onChanged?.call(_lerp(factor), false);\n    widget.onDragEnd?.call(_lerp(factor));\n  }\n\n  void manualValueEnter() {\n    String dialogValue = _lerp(factor).toStringAsFixed(2);\n    if (widget.parameter != null) {\n      dialogValue = widget.parameter!.toHumanInput().toStringAsFixed(2);\n    }\n\n    AlertDialogs.showInputDialog(context,\n        title: \"Enter Value\",\n        description: \"Enter new value for ${widget.label}\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Set\",\n        selectAll: true,\n        keyboardType: TextInputType.number,\n        value: dialogValue,\n        validation: (value) {\n          double? val = double.tryParse(value);\n          if (val == null) return false;\n\n          double min = 0, max = 0;\n\n          //Check for range\n          if (widget.parameter == null) {\n            min = widget.min;\n            max = widget.max;\n          } else {\n            min = widget.parameter!.formatter.toHumanInput(widget.min);\n            max = widget.parameter!.formatter.toHumanInput(widget.max);\n          }\n\n          if (val < min || val > max) return false;\n          return true;\n        },\n        validationErrorMessage: \"Value not valid\",\n        confirmColor: Colors.blue,\n        onConfirm: (value) {\n          var val = double.parse(value);\n\n          if (widget.parameter != null) {\n            //unscale value back\n            val = widget.parameter!.fromHumanInput(val);\n          }\n\n          widget.onDragStart?.call(widget.value);\n          widget.onChanged?.call(val, false);\n          widget.onDragEnd?.call(val);\n        });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ConstrainedBox(\n      constraints: BoxConstraints(maxWidth: widget.width),\n      child: LayoutBuilder(\n          builder: (BuildContext context, BoxConstraints constraints) {\n        width = constraints.maxWidth - 1;\n        height = constraints.maxHeight;\n        factor = _unlerp(widget.value);\n        pos = factor * height;\n\n        return GestureDetector(\n          dragStartBehavior: DragStartBehavior.start,\n          onDoubleTap: manualValueEnter,\n          onTapDown: (details) {\n            if (!widget.enabled) return;\n          },\n          onHorizontalDragStart: widget.handleHorizontalDrag ? dragStart : null,\n          onHorizontalDragUpdate:\n              widget.handleHorizontalDrag ? dragUpdate : null,\n          onHorizontalDragEnd: widget.handleHorizontalDrag ? dragEnd : null,\n          onVerticalDragStart: dragStart,\n          onVerticalDragUpdate: dragUpdate,\n          onVerticalDragEnd: dragEnd,\n          child: Container(\n            color: Colors.transparent,\n            height: height,\n            child: Stack(\n              alignment: Alignment.bottomCenter,\n              children: [\n                Container(\n                  height: max(factor * height, 0),\n                  color: widget.enabled\n                      ? TinyColor.fromColor(widget.activeColor).darken(15).color\n                      : Colors.grey[800],\n                  width: width * 0.5,\n                ),\n                Positioned(\n                    bottom: _lerp2(factor, 10, height - 10) - 10,\n                    height: 20,\n                    width: width * 0.9,\n                    child: Container(\n                        color: widget.enabled\n                            ? widget.activeColor\n                            : Colors.grey[700],\n                        height: 20)),\n                Padding(\n                  padding: const EdgeInsets.symmetric(vertical: 6.0),\n                  child: Column(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: [\n                        Text(\n                          widget.labelFormatter(_lerp(factor)),\n                          style: TextStyle(\n                              color: widget.enabled\n                                  ? Colors.white\n                                  : Colors.grey[600],\n                              fontSize: 20),\n                        ),\n                        Text(\n                          widget.label,\n                          style: TextStyle(\n                              color: widget.enabled\n                                  ? Colors.white\n                                  : Colors.grey[600],\n                              fontSize: 20),\n                        )\n                      ]),\n                ),\n                Center(child: Text(scale < 1 ? \"x$scale\" : \"\"))\n              ],\n            ),\n          ),\n        );\n      }),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/audioEditor.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:audio_waveform/audio_waveform.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:just_audio/just_audio.dart';\nimport 'package:mighty_plug_manager/UI/theme.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/audio/automationController.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/sourceResolver.dart';\nimport 'package:mighty_plug_manager/audio/widgets/presetsPanel.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport 'package:page_view_indicators/circle_page_indicator.dart';\n\nimport 'models/jamTrack.dart';\nimport 'models/trackAutomation.dart';\nimport 'models/waveform_data.dart';\nimport 'widgets/eventEditor.dart';\nimport 'widgets/loopPanel.dart';\nimport 'widgets/painted_waveform.dart';\nimport 'widgets/speedPanel.dart';\n\nenum EditorState { play, insert, duplicateInsert, insertLoop1, insertLoop2 }\n\nclass AudioEditor extends StatefulWidget {\n  final JamTrack track;\n  const AudioEditor(this.track, {Key? key}) : super(key: key);\n  @override\n  State createState() => _AudioEditorState();\n}\n\nclass _AudioEditorState extends State<AudioEditor> {\n  WaveformData? wfData;\n  AudioWaveformDecoder decoder = AudioWaveformDecoder();\n  late AutomationController automation;\n\n  final controller = PageController(\n    initialPage: 0,\n  );\n\n  final _currentPageNotifier = ValueNotifier<int>(0);\n\n  NuxDevice device = NuxDeviceControl.instance().device;\n\n  int currentSample = 0;\n  bool pageLeft = false;\n  int latency = SharedPrefs().getInt(SettingsKeys.latency, 0);\n\n  //screen stuff\n  double _samplesPerPixel = 0, _msPerSample = 0;\n\n  //stuff for inserting\n  EditorState state = EditorState.play;\n  dynamic selectedPreset;\n  AutomationEvent? duplicatedEvent;\n\n  AutomationEventType showType = AutomationEventType.preset;\n\n  String _resolvedPath = \"\";\n\n  @override\n  void initState() {\n    super.initState();\n\n    automation = AutomationController(widget.track, widget.track.automation);\n    WidgetsFlutterBinding.ensureInitialized();\n\n    if (AppThemeConfig.allowRotation) {\n      SystemChrome.setPreferredOrientations(\n          [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);\n    }\n\n    device = NuxDeviceControl.instance().device;\n\n    decodeAudio(widget.track.path);\n    automation.setAudioFile(widget.track.path, 4);\n\n    automation.positionStream.listen(playPositionUpdate);\n    automation.playerStateStream.listen(playerStateUpdate);\n    //automation.eventStream.listen(eventUpdate);\n\n    controller.addListener(() {\n      if (controller.page == null) return;\n      double p = controller.page!;\n      if (p == p.round()) {\n        debugPrint(p.round().toString());\n        switch (p.round()) {\n          case 0:\n            showType = AutomationEventType.preset;\n            break;\n          case 1:\n            showType = AutomationEventType.loop;\n            break;\n          case 2:\n            break;\n        }\n        setState(() {});\n      }\n    });\n  }\n\n  Future decodeAudio(String path) async {\n    print(\"Audio path $path\");\n    _resolvedPath = await SourceResolver.getSourceUrl(path);\n    print(\"Resolved path $_resolvedPath\");\n\n    bool legacy = Platform.isAndroid &&\n        SharedPrefs().getInt(SettingsKeys.legacyDecoder, 0) != 0;\n    await decoder.open(_resolvedPath, legacy);\n\n    decoder.decode(() {\n      wfData = WaveformData(maxValue: 1, data: decoder.samples);\n    }, () {\n      if (pageLeft) {\n        freeDecoder();\n        return false;\n      }\n      wfData!.setUpdate();\n      setState(() {});\n      return true;\n    }, () {\n      //final update\n      wfData!.setReady();\n      setState(() {});\n      freeDecoder();\n    });\n  }\n\n  void freeDecoder() {\n    SourceResolver.releaseUrl(widget.track.path, _resolvedPath);\n  }\n\n  int sampleToMs(int sample) {\n    var percentage = sample / wfData!.data.length;\n    return (percentage * decoder.duration * 1000).round();\n  }\n\n  void playFrom(int sample) {\n    automation.seek(Duration(milliseconds: sampleToMs(sample)));\n    if (automation.playing == false) automation.play();\n  }\n\n  void playPositionUpdate(Duration position) {\n    setState(() {\n      var posMs = max(position.inMilliseconds - latency, 0);\n      currentSample = (decoder.samples.length *\n              (posMs / automation.duration.inMilliseconds))\n          .floor();\n    });\n  }\n\n  void playerStateUpdate(PlayerState state) {\n    //just refresh state so the play button is correct\n    setState(() {});\n  }\n\n  void timingData(double samplesPerPixel, double msPerSample) {\n    _samplesPerPixel = samplesPerPixel;\n    _msPerSample = msPerSample;\n  }\n\n  void stepLeft() {\n    var event = automation.selectedEvent;\n    if (event == null) return;\n    var subtract =\n        Duration(milliseconds: (_samplesPerPixel / _msPerSample).ceil());\n    if (event.eventTime > subtract) {\n      event.eventTime -= subtract;\n    } else {\n      event.eventTime = const Duration(milliseconds: 0);\n    }\n\n    automation.sortEvents();\n    setState(() {});\n  }\n\n  void stepRight() {\n    var event = automation.selectedEvent;\n    if (event == null) return;\n    var subtract =\n        Duration(milliseconds: (_samplesPerPixel / _msPerSample).ceil());\n    var songLength = automation.duration;\n    if (event.eventTime < songLength - subtract) {\n      event.eventTime += subtract;\n    } else {\n      event.eventTime = songLength;\n    }\n\n    automation.sortEvents();\n    setState(() {});\n  }\n\n  void editEvent(AutomationEvent event, bool noneOption) {\n    var editor = EventEditor(event: event, noneOption: noneOption);\n    editor.buildDialog(context).then((value) {\n      setState(() {});\n    });\n  }\n\n  void duplicateEvent(AutomationEvent event) {\n    state = EditorState.duplicateInsert;\n    duplicatedEvent = event;\n    setState(() {});\n  }\n\n  void useLoopPoints(bool enable) {\n    automation.useLoopPoints = enable;\n    if (!automation.hasLoopPoints()) state = EditorState.insertLoop1;\n    setState(() {});\n  }\n\n  AutomationEventType? showEventType() {\n    if (showType == AutomationEventType.loop &&\n        (!automation.loopEnable || !automation.useLoopPoints)) return null;\n    return showType;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () async {\n        pageLeft = true;\n        await automation.dispose();\n        //revert back to orientation change\n        if (AppThemeConfig.allowRotation) {\n          SystemChrome.setPreferredOrientations([\n            DeviceOrientation.portraitUp,\n            DeviceOrientation.portraitDown,\n            DeviceOrientation.landscapeLeft,\n            DeviceOrientation.landscapeRight\n          ]);\n        }\n\n        return true;\n      },\n      child: Scaffold(\n        appBar: AppBar(\n          title: const Text(\"Song editor\"),\n        ),\n        body: Column(children: [\n          Expanded(\n              flex: 3,\n              child: Stack(\n                alignment: Alignment.center,\n                children: [\n                  PaintedWaveform(\n                    sampleData: wfData,\n                    currentSample: currentSample,\n                    automation: automation,\n                    onTimingData: timingData,\n                    showType: showEventType(),\n                    channelColors: device.presets[0].channelColorsList,\n                    onEventSelectionChanged: () {\n                      setState(() {});\n                    },\n                    onWaveformTap: (sample) {\n                      switch (state) {\n                        case EditorState.play:\n                          playFrom(sample);\n                          break;\n                        case EditorState.insert:\n                          setState(() {\n                            state = EditorState.play;\n                            automation\n                                .addEvent(\n                                    Duration(milliseconds: sampleToMs(sample)),\n                                    AutomationEventType.preset)\n                                .setPresetUuid(selectedPreset[\"uuid\"]);\n                          });\n                          break;\n                        case EditorState.duplicateInsert:\n                          if (duplicatedEvent == null) break;\n                          setState(() {\n                            state = EditorState.play;\n                            automation.addEventFromOther(duplicatedEvent!,\n                                Duration(milliseconds: sampleToMs(sample)));\n                          });\n                          break;\n                        case EditorState.insertLoop1:\n                          setState(() {\n                            state = EditorState.insertLoop2;\n                            automation.addEvent(\n                                Duration(milliseconds: sampleToMs(sample)),\n                                AutomationEventType.loop);\n                          });\n                          break;\n                        case EditorState.insertLoop2:\n                          setState(() {\n                            state = EditorState.play;\n                            automation.useLoopPoints = true;\n                            automation.addEvent(\n                                Duration(milliseconds: sampleToMs(sample)),\n                                AutomationEventType.loop);\n                          });\n                          break;\n                      }\n                    },\n                  ),\n                  if (state != EditorState.play)\n                    ColoredBox(\n                        color: Colors.grey[700]!,\n                        child: const Padding(\n                          padding: EdgeInsets.all(8.0),\n                          child: Text(\n                            \"Tap here to insert event\",\n                          ),\n                        ))\n                ],\n              )),\n          //Playback controls\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            children: [\n              MaterialButton(\n                onPressed: () {\n                  automation.rewind();\n                  setState(() {\n                    currentSample = 0;\n                  });\n                },\n                height: 70,\n                child: const Icon(\n                  Icons.skip_previous,\n                  color: Colors.white,\n                  size: 50,\n                ),\n              ),\n              MaterialButton(\n                onPressed: () {\n                  automation.playPause();\n                },\n                height: 70,\n                child: Icon(\n                  automation.playerState.playing == false ||\n                          automation.playerState.processingState ==\n                              ProcessingState.completed\n                      ? Icons.play_arrow\n                      : Icons.pause,\n                  color: Colors.white,\n                  size: 50,\n                ),\n              ),\n              MaterialButton(\n                onPressed: stepLeft, //move event left\n                height: 70,\n                child: const Icon(\n                  Icons.chevron_left,\n                  color: Colors.white,\n                  size: 60,\n                ),\n              ),\n              MaterialButton(\n                onPressed: stepRight, //move event left\n                height: 70,\n                child: const Icon(\n                  Icons.chevron_right,\n                  color: Colors.white,\n                  size: 60,\n                ),\n              ),\n            ],\n          ),\n          Expanded(\n              flex: 2,\n              child: IndexedStack(\n                index: state == EditorState.play ? 0 : 1,\n                alignment: Alignment.center,\n                children: [\n                  PageView(\n                    controller: controller,\n                    onPageChanged: (int index) {\n                      _currentPageNotifier.value = index;\n\n                      //clear selected event\n                      automation.selectedEvent = null;\n                    },\n                    children: [\n                      PresetsPanel(\n                          automation: automation,\n                          onDelete: () {\n                            if (automation.selectedEvent != null) {\n                              automation.removeEvent(automation.selectedEvent!);\n                            }\n                            setState(() {});\n                          },\n                          onEditEvent: editEvent,\n                          onDuplicateEvent: duplicateEvent,\n                          onSelectedPreset: (preset) {\n                            setState(() {\n                              selectedPreset = preset;\n                              state = EditorState.insert;\n                            });\n                          }),\n                      LoopPanel(\n                        automation: automation,\n                        onUseLoopPoints: useLoopPoints,\n                        onLoopEnable: (value) {\n                          setState(() {\n                            automation.loopEnable = value ?? false;\n                          });\n                        },\n                        onLoopTimes: (value) {\n                          setState(() {\n                            automation.loopTimes = value;\n                          });\n                        },\n                      ),\n                      SpeedPanel(\n                        semitones: automation.pitch,\n                        speed: automation.speed,\n                        onSpeedChanged: (speed) {\n                          setState(() {\n                            automation.speed = speed;\n                            automation.setSpeed(speed);\n                          });\n                        },\n                        onSemitonesChanged: (semitones) {\n                          setState(() {\n                            automation.pitch = semitones;\n                            automation.setPitch(semitones);\n                          });\n                        },\n                      ),\n                    ],\n                  ),\n                  ElevatedButton(\n                    child: const Text(\"Cancel\"),\n                    onPressed: () {\n                      if (state == EditorState.insertLoop1 ||\n                          state == EditorState.insertLoop2) {\n                        automation.removeAllLoopEvents();\n                      }\n\n                      state = EditorState.play;\n                      setState(() {});\n                    },\n                  )\n                ],\n              )),\n          Container(\n            height: 30,\n            alignment: Alignment.center,\n            child: state != EditorState.play\n                ? null\n                : CirclePageIndicator(\n                    itemCount: 3,\n                    currentPageNotifier: _currentPageNotifier,\n                  ),\n          )\n        ]),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/automationController.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:just_audio/just_audio.dart';\nimport 'package:mighty_plug_manager/audio/models/trackAutomation.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport 'models/jamTrack.dart';\nimport 'online_sources/sourceResolver.dart';\nimport '../platform/platformUtils.dart';\n\nenum ABRepeatState { off, addedA, addedB }\n\nclass AutomationController {\n  final TrackAutomation automation;\n  final JamTrack track;\n  late AudioPlayer player;\n  late AudioPipeline _pipeline;\n  final _enhancer = AndroidLoudnessEnhancer();\n\n  final StreamController<Duration> _positionController =\n      StreamController<Duration>();\n  //StreamController<AutomationEvent> _eventController =\n  //    StreamController<AutomationEvent>();\n\n  List<AutomationEvent> get events => automation.events;\n  AutomationEvent get initialEvent => automation.initialEvent;\n\n  bool get presetChangeEventsAvailable {\n    if (_presetChangeBypass) return false;\n    for (var event in events) {\n      if (event.type == AutomationEventType.preset) return true;\n    }\n    return false;\n  }\n\n  //optimisation for searching for the next event\n  int _nextEvent = 0;\n  int _positionReport = 0;\n  int _positionResolution = 1;\n\n  int _currentLoop = 0;\n  bool _forceLoopDisable = false;\n\n  bool _presetChangeBypass = false;\n\n  ABRepeatState _abRepeatState = ABRepeatState.off;\n  ABRepeatState get abRepeatState => _abRepeatState;\n\n  AutomationController(this.track, this.automation) {\n    if (Platform.isAndroid) {\n      _pipeline = AudioPipeline(androidAudioEffects: [_enhancer]);\n      player = AudioPlayer(audioPipeline: _pipeline);\n      _pipeline.androidAudioEffects.add(_enhancer);\n      _enhancer.setEnabled(true);\n    } else {\n      player = AudioPlayer();\n    }\n  }\n\n  void setGain(double gain) {\n    _enhancer.setTargetGain(gain / 10);\n  }\n\n  Stream<Duration> get positionStream => _positionController.stream;\n\n  Duration get duration => player.duration ?? const Duration();\n  PlayerState get playerState => player.playerState;\n  Stream<PlayerState> get playerStateStream => player.playerStateStream;\n  bool get playing => player.playing;\n\n  Function? onTrackComplete;\n\n  int _latency = 0;\n  final int _speed = 1;\n\n  StreamSubscription<Duration>? _positionSubscription;\n\n  //loop variables\n\n  bool get loopEnable => _forceLoopDisable ? false : track.loopEnable;\n\n  set loopEnable(val) {\n    track.loopEnable = val;\n    _currentLoop = 0;\n  }\n\n  bool get useLoopPoints =>\n      track.useLoopPoints || abRepeatState == ABRepeatState.addedB;\n\n  set useLoopPoints(val) {\n    track.useLoopPoints = val;\n    _currentLoop = 0;\n  }\n\n  int get loopTimes => track.loopTimes;\n  set loopTimes(val) {\n    track.loopTimes = val;\n    if (_currentLoop > track.loopTimes) _currentLoop = track.loopTimes;\n  }\n\n  int get currentLoop => _currentLoop;\n\n  double get speed => track.speed;\n  set speed(val) => track.speed = val;\n\n  int get pitch => track.pitch;\n  set pitch(val) => track.pitch = val;\n\n  //editor use only. don't serialize\n  AutomationEvent? selectedEvent;\n\n  String _sourceUrl = \"\", _resolvedUrl = \"\";\n\n  Future setAudioFile(String path, int positionEventSkips) async {\n    _sourceUrl = path;\n    _resolvedUrl = await SourceResolver.getSourceUrl(_sourceUrl);\n    var source = ProgressiveAudioSource(Uri.parse(_resolvedUrl));\n    await player.setAudioSource(source);\n\n    if (NuxDeviceControl.instance().isConnected) {\n      _latency = SharedPrefs().getInt(SettingsKeys.latency, 0);\n    } else {\n      _latency = 0;\n    }\n\n    setSpeed(speed);\n    setPitch(pitch);\n\n    //force 10ms precision. It's needed for accurate event switch\n    _positionSubscription = player\n        .createPositionStream(\n            steps: 1,\n            minPeriod: const Duration(milliseconds: 5),\n            maxPeriod: const Duration(milliseconds: 5))\n        .listen(playPositionUpdate);\n\n    _positionResolution = max(1, positionEventSkips);\n  }\n\n  void setTrackCompleteEvent(Function onComplete) {\n    onTrackComplete = onComplete;\n  }\n\n  //stream listener for track position updates\n  void playPositionUpdate(Duration position) {\n    //switch presets here when needed\n    if (_positionReport % _positionResolution == 0) {\n      _positionController.add(position);\n    }\n    _positionReport++;\n\n    if (position == player.duration) {\n      //check for looping\n\n      bool looped = false;\n      if (loopEnable && !useLoopPoints) {\n        if (loopTimes == 0 || _currentLoop < loopTimes) {\n          //seek to beginning\n          seek(const Duration(seconds: 0));\n          looped = true;\n          if (loopTimes > 0) _currentLoop++;\n        }\n      }\n\n      //call and lose ref to prevent double calling\n      if (!looped) {\n        onTrackComplete?.call();\n        onTrackComplete = null;\n      }\n    }\n\n    if (_nextEvent < automation.events.length) {\n      switch (automation.events[_nextEvent].type) {\n        case AutomationEventType.preset:\n          if (automation.events[_nextEvent].eventTime.inMilliseconds <=\n              position.inMilliseconds - _latency * (1 / _speed)) {\n            //set event\n            executeEvent(automation.events[_nextEvent]);\n            //increment expected event\n            _nextEvent++;\n            if (kDebugMode) print(\"next event $_nextEvent\");\n          }\n          break;\n        case AutomationEventType.loop:\n          //loops should not be compensated for latency\n          if (automation.events[_nextEvent].eventTime.inMilliseconds <=\n              position.inMilliseconds) {\n            //set event\n            if (loopEnable && useLoopPoints) {\n              executeEvent(automation.events[_nextEvent]);\n            }\n            //increment expected event\n            _nextEvent++;\n            if (kDebugMode) print(\"next event $_nextEvent\");\n          }\n          break;\n      }\n    }\n  }\n\n  void executeEvent(AutomationEvent event) {\n    var device = NuxDeviceControl.instance().device;\n\n    switch (event.type) {\n      case AutomationEventType.preset:\n        if (_presetChangeBypass) break;\n        debugPrint(\"Changing preset ${event.name}\");\n        var preset = event.getPreset();\n        if (preset != null && preset[\"product_id\"] == device.presetClass) {\n          device.presetFromJson(\n              preset,\n              event.cabinetLevelOverrideEnable\n                  ? event.cabinetLevelOverride\n                  : null,\n              dontChangeChannel: true);\n        }\n        break;\n      case AutomationEventType.loop:\n        if (kDebugMode) print(\"loop\");\n        //find previous loop point\n        for (int i = _nextEvent - 1; i >= 0; i--) {\n          if (events[i].type == AutomationEventType.loop) {\n            if (loopTimes == 0 || loopTimes > 0 && _currentLoop < loopTimes) {\n              seek(events[i].eventTime);\n              _nextEvent = i;\n              _currentLoop++;\n            }\n            break;\n          }\n        }\n        break;\n    }\n    //_eventController.add(event);\n  }\n\n  Future play() async {\n    if (playerState.processingState == ProcessingState.completed) {\n      await player.seek(const Duration(seconds: 0));\n    }\n    player.play();\n    seek(player.position);\n  }\n\n  Future playPause() async {\n    if (playerState.playing == false ||\n        playerState.processingState == ProcessingState.completed) {\n      await play();\n    } else {\n      await player.pause();\n    }\n  }\n\n  Future stop() async {\n    if (playerState.playing) {\n      await player.stop();\n    }\n  }\n\n  void setSpeed(double speed) {\n    player.setSpeed(speed);\n  }\n\n  void setPitch(int pitch) {\n    if (PlatformUtils.isIOS) return;\n    double lPitch = pow(2, pitch / 12).toDouble();\n    player.setPitch(lPitch);\n  }\n\n  void rewind() {\n    _currentLoop = 0;\n    seek(const Duration(seconds: 0));\n  }\n\n  void forceLoopDisable() {\n    _forceLoopDisable = true;\n  }\n\n  void seek(Duration position) {\n    player.seek(position);\n    _updateActiveEvent();\n\n    //check if seek before the first loop and if so - reset the loop counter\n    if (useLoopPoints && loopTimes > 0) {\n      for (int i = 0; i < events.length; i++) {\n        if (events[i].type == AutomationEventType.loop) {\n          if (position < events[i].eventTime) _currentLoop = 0;\n          break;\n        }\n      }\n    }\n  }\n\n  void sortEvents() {\n    automation.sortEvents();\n    _updateActiveEvent();\n  }\n\n  void _updateActiveEvent() {\n    if (!player.playing) return;\n    var position = player.position;\n    _nextEvent = automation.events.length;\n    //recalculate next event\n    for (int i = 0; i < automation.events.length; i++) {\n      if (position.inMilliseconds - _latency * (1 / _speed) <\n          automation.events[i].eventTime.inMilliseconds) {\n        //this is the first event prior the seek time\n        _nextEvent = i;\n        break;\n      }\n    }\n\n    if (kDebugMode) print(\"next event $_nextEvent\");\n\n    //find previous preset event\n    int prevEvent = -1;\n    for (int i = _nextEvent - 1; i >= 0; i--) {\n      if (automation.events[i].type == AutomationEventType.preset) {\n        prevEvent = i;\n        break;\n      }\n    }\n\n    //execute the previous\n    if (prevEvent >= 0) {\n      //find last\n      executeEvent(automation.events[prevEvent]);\n    } else {\n      executeEvent(automation.initialEvent);\n    }\n  }\n\n  AutomationEvent addEvent(Duration atPosition, AutomationEventType type) {\n    //finally make sure the events are sorted\n    var event = AutomationEvent(\n      eventTime: atPosition,\n      type: type,\n    );\n    automation.events.add(event);\n    selectedEvent = event;\n    sortEvents();\n    return event;\n  }\n\n  void addEventFromOther(AutomationEvent other, Duration atPosition) {\n    AutomationEvent ev =\n        AutomationEvent(eventTime: atPosition, type: other.type);\n    ev.setPresetUuid(other.getPresetUuid());\n    ev.cabinetLevelOverride = other.cabinetLevelOverride;\n    ev.cabinetLevelOverrideEnable = other.cabinetLevelOverrideEnable;\n    automation.events.add(ev);\n    selectedEvent = ev;\n    sortEvents();\n  }\n\n  void removeEvent(AutomationEvent event) {\n    if (!automation.events.contains(event)) return;\n    //make sure no reference remains\n    if (selectedEvent == event) selectedEvent = null;\n    automation.events.remove(event);\n    sortEvents();\n  }\n\n  void bypassPresetChanges() {\n    _presetChangeBypass = true;\n  }\n\n  //TODO: make sure there are always 2 loop events\n  void removeAllLoopEvents() {\n    for (int i = events.length - 1; i >= 0; i--) {\n      if (events[i].type == AutomationEventType.loop) events.removeAt(i);\n    }\n  }\n\n  bool hasLoopPoints() {\n    int loops = 0;\n    for (int i = 0; i < events.length; i++) {\n      if (events[i].type == AutomationEventType.loop) loops++;\n    }\n\n    //check for errors\n    if (loops > 0 && loops != 2) removeAllLoopEvents();\n\n    return loops == 2;\n  }\n\n  List<AutomationEvent> getLoopPoints() {\n    List<AutomationEvent> loopPoints = [];\n    for (int i = 0; i < events.length; i++) {\n      if (events[i].type == AutomationEventType.loop) loopPoints.add(events[i]);\n    }\n\n    return loopPoints;\n  }\n\n  void toggleABRepeat() {\n    switch (abRepeatState) {\n      case ABRepeatState.off:\n        loopEnable = false;\n        removeAllLoopEvents();\n        addEvent(player.position, AutomationEventType.loop);\n        _abRepeatState = ABRepeatState.addedA;\n        break;\n      case ABRepeatState.addedA:\n        loopTimes = 0;\n        addEvent(player.position, AutomationEventType.loop);\n        var lp = getLoopPoints();\n        seek(lp[0].eventTime);\n        _abRepeatState = ABRepeatState.addedB;\n        loopEnable = true;\n        break;\n      case ABRepeatState.addedB:\n        loopEnable = false;\n        _abRepeatState = ABRepeatState.off;\n        break;\n    }\n  }\n\n  Future dispose() async {\n    _positionSubscription?.cancel();\n    await player.stop();\n    await player.dispose();\n    _positionController.close();\n    SourceResolver.releaseUrl(_sourceUrl, _resolvedUrl);\n    //_eventController.close();\n  }\n}\n"
  },
  {
    "path": "lib/audio/models/jamTrack.dart",
    "content": "import 'package:mighty_plug_manager/audio/models/trackAutomation.dart';\n\nclass JamTrack {\n  final TrackAutomation _automation = TrackAutomation();\n\n  String _path = \"\";\n  String _name = \"\";\n  String _uuid = \"\";\n\n  bool _loopEnable = false;\n  bool _useLoopPoints = false;\n  int _loopTimes = 0;\n\n  double _speed = 1;\n  int _pitch = 0;\n\n  TrackAutomation get automation => _automation;\n\n  JamTrack(\n      {required path,\n      required name,\n      required uuid,\n      bool loopEnable = false,\n      bool useLoopPoints = false,\n      int loopTimes = 0,\n      double speed = 1,\n      int pitch = 0,\n      List<dynamic>? automationData}) {\n    _path = path;\n    _name = name;\n    _uuid = uuid;\n    _loopEnable = loopEnable;\n    _useLoopPoints = useLoopPoints;\n    _loopTimes = loopTimes;\n    _speed = speed;\n    _pitch = pitch;\n    if (automationData != null) _automation.fromJson(automationData);\n  }\n\n  String get name => _name;\n  String get path => _path;\n  set path(val) => _path = val;\n  String get uuid => _uuid;\n\n  set name(value) => _name = value;\n\n  bool get loopEnable => _loopEnable;\n  set loopEnable(val) => _loopEnable = val;\n\n  bool get useLoopPoints => _useLoopPoints;\n  set useLoopPoints(val) => _useLoopPoints = val;\n\n  int get loopTimes => _loopTimes;\n  set loopTimes(val) => _loopTimes = val;\n\n  double get speed => _speed;\n  set speed(val) => _speed = val;\n\n  int get pitch => _pitch;\n  set pitch(val) => _pitch = val;\n\n  factory JamTrack.fromJson(dynamic json) {\n    return JamTrack(\n        name: json['name'] as String,\n        path: json['path'] as String,\n        uuid: json['uuid'] as String,\n        loopEnable: json['loop_enable'] ?? false,\n        useLoopPoints: json['loop_use_points'] ?? false,\n        loopTimes: json['loop_times'] ?? 0,\n        speed: json['speed'] ?? 1,\n        pitch: json['pitch'] ?? 0,\n        automationData: json[\"events\"]);\n  }\n\n  Map<String, dynamic> toJson() {\n    var data = <String, dynamic>{};\n    data[\"path\"] = _path;\n    data[\"name\"] = _name;\n    data[\"uuid\"] = _uuid;\n    data[\"events\"] = automation.toJson();\n    data['loop_enable'] = _loopEnable;\n    data['loop_use_points'] = _useLoopPoints;\n    data['loop_times'] = _loopTimes;\n    data['speed'] = _speed;\n    data['pitch'] = _pitch;\n    return data;\n  }\n}\n"
  },
  {
    "path": "lib/audio/models/setlist.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:mighty_plug_manager/audio/models/jamTrack.dart';\nimport 'package:mighty_plug_manager/audio/trackdata/trackData.dart';\n\nclass SetlistItem {\n  String trackUuid = \"\";\n  JamTrack? trackReference;\n\n  SetlistItem({required this.trackUuid, required this.trackReference});\n}\n\nclass Setlist {\n  String name = \"\";\n  List<SetlistItem> items = <SetlistItem>[];\n\n  Setlist(this.name, List items) {\n    for (int i = 0; i < items.length; i++) {\n      addTrackByUuid(items[i]);\n    }\n  }\n\n  void addTrackByUuid(String uuid) {\n    JamTrack? track = TrackData().findByUuid(uuid);\n    if (track != null) {\n      items.add(SetlistItem(trackUuid: track.uuid, trackReference: track));\n    } else {\n      debugPrint(\"Track with uuid $uuid not found!\");\n    }\n  }\n\n  void addTrack(JamTrack track) {\n    items.add(SetlistItem(trackUuid: track.uuid, trackReference: track));\n  }\n\n  void clear() {\n    items.clear();\n  }\n\n  factory Setlist.fromJson(Map<String, dynamic> json) {\n    return Setlist(json[\"name\"] ?? \"Untitled\", json[\"tracks\"]);\n  }\n\n  Map<String, dynamic> toJson() {\n    var json = <String, dynamic>{};\n    var tracks = <String>[];\n    for (int i = 0; i < items.length; i++) {\n      tracks.add(items[i].trackUuid);\n    }\n\n    json[\"name\"] = name;\n    json[\"tracks\"] = tracks;\n    return json;\n  }\n}\n"
  },
  {
    "path": "lib/audio/models/trackAutomation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\n\nenum AutomationEventType { preset, loop }\n\nclass AutomationEvent {\n  AutomationEventType type;\n  Duration eventTime;\n\n  bool cabinetLevelOverrideEnable = false;\n  double cabinetLevelOverride = 0;\n  String get name => _preset == null\n      ? \"\"\n      : _preset!.containsKey(\"name\")\n          ? _preset![\"name\"]\n          : \"\";\n  int get channel => _preset == null\n      ? 0\n      : _preset!.containsKey(\"channel\")\n          ? _preset![\"channel\"]\n          : 0;\n  //uuids for presets per each device\n  String _presetUuid = \"\";\n\n  //values if type is presetChange\n  Map? _preset = {};\n\n  AutomationEvent({required this.eventTime, required this.type});\n\n  void setPresetUuid(String presetUuid) {\n    _presetUuid = presetUuid;\n    if (presetUuid == \"\") return;\n    var p = PresetsStorage().findPresetByUuid(presetUuid);\n    if (p != null) {\n      if (p.containsKey(\"cabinet\")) {\n        cabinetLevelOverride = p[\"cabinet\"][\"level\"];\n      }\n      _preset = p;\n    }\n  }\n\n  String getPresetUuid() {\n    return _presetUuid;\n  }\n\n  void clearPreset() {\n    _preset = null;\n    _presetUuid = \"\";\n  }\n\n  dynamic getPreset() {\n    return _preset;\n  }\n\n  Map<String, dynamic> toJson() {\n    Map<String, dynamic> data = {};\n    data[\"type\"] = type.index;\n    data[\"time\"] = eventTime.inMilliseconds;\n    data[\"preset_id\"] = _presetUuid;\n    data[\"cab_override\"] = cabinetLevelOverrideEnable;\n    data[\"cab_level\"] = cabinetLevelOverride;\n\n    return data;\n  }\n\n  factory AutomationEvent.fromJson(dynamic json) {\n    var type = AutomationEventType.values[json[\"type\"] ?? 0];\n    Duration time = Duration(milliseconds: json[\"time\"] ?? 0);\n    AutomationEvent event = AutomationEvent(eventTime: time, type: type);\n    event.setPresetUuid(json['preset_id'] ?? \"\");\n    event.cabinetLevelOverrideEnable = json[\"cab_override\"] ?? false;\n    event.cabinetLevelOverride = json[\"cab_level\"] ?? 0;\n    return event;\n  }\n}\n\nclass TrackAutomation {\n  AutomationEvent _initialEvent = AutomationEvent(\n      eventTime: const Duration(seconds: 0), type: AutomationEventType.preset);\n\n  final _events = <AutomationEvent>[];\n\n  List<AutomationEvent> get events => _events;\n  AutomationEvent get initialEvent => _initialEvent;\n\n  TrackAutomation();\n  fromJson(List<dynamic> jsonData) {\n    if (jsonData.isNotEmpty) {\n      _initialEvent = AutomationEvent.fromJson(jsonData[0]);\n    }\n\n    for (int i = 1; i < jsonData.length; i++) {\n      events.add(AutomationEvent.fromJson(jsonData[i]));\n    }\n  }\n\n  void sortEvents() {\n    _events.sort((a, b) => a.eventTime.compareTo(b.eventTime));\n  }\n\n  List<dynamic> toJson() {\n    List<Map<String, dynamic>> ev = [];\n\n    ev.add(initialEvent.toJson());\n\n    for (int i = 0; i < events.length; i++) {\n      ev.add(events[i].toJson());\n    }\n    return ev;\n  }\n}\n"
  },
  {
    "path": "lib/audio/models/waveform_data.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:math';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/painting.dart';\n\nclass WaveformData {\n  int maxValue;\n  List<int> data;\n  WaveformData({\n    required this.maxValue,\n    required this.data,\n  });\n\n  Path? _overallPath;\n  Path? _cachedPath;\n  int _oldFromFrame = -1, _oldToFrame = -1;\n  bool _needsUpdate = false;\n\n  bool _ready = false;\n  bool _initialized = false;\n\n  bool get needsUpdate => _needsUpdate;\n  bool get ready => _ready;\n  bool get initialized => _initialized;\n\n  void setUpdate() {\n    _needsUpdate = true;\n    _initialized = true;\n  }\n\n  void setReady() {\n    setUpdate();\n    _ready = true;\n  }\n\n  //calculate X coordinate of line within the chosen samples\n  double verticalLine(Size size, int sample, int fromFrame, int toFrame) {\n    if (sample < 0) sample = 0;\n    if (sample > data.length - 1) sample = data.length - 1;\n\n    double percentage = (sample - fromFrame) / (toFrame - fromFrame);\n    return size.width * percentage;\n  }\n\n  Path? path(Size size, {int? toFrame, int fromFrame = 0}) {\n    if (toFrame == _oldToFrame && fromFrame == _oldFromFrame && !_needsUpdate) {\n      return _cachedPath;\n    }\n\n    _needsUpdate = false;\n\n    if (fromFrame < 0) fromFrame = 0;\n    toFrame ??= data.length - 1;\n    if (toFrame < fromFrame + 50) toFrame = fromFrame + 50;\n    if (toFrame > data.length - 1) toFrame = data.length - 1;\n\n    if (toFrame == data.length - 1 && fromFrame == 0) {\n      _oldFromFrame = fromFrame;\n      _oldToFrame = toFrame;\n      _cachedPath = _path(data, size);\n      return _cachedPath;\n    }\n\n    // buffer so we can't start too far in the waveform, 90% max\n    if (fromFrame > (data.length * 0.98).floor()) {\n      debugPrint(\"from frame is too far at $fromFrame\");\n      fromFrame = ((data.length) * 0.98).floor();\n    }\n\n    _oldFromFrame = fromFrame;\n    _oldToFrame = toFrame;\n\n    _cachedPath = _path(data.sublist(fromFrame, toFrame), size);\n    return _cachedPath;\n  }\n\n  Path _path(List<int> samples, Size size) {\n    const upsample = 2;\n\n    List<double> points =\n        List<double>.filled(size.width.ceil() * upsample + 1, 0);\n    //points.fillRange(0, size.width.ceil() * upsample + 1, 0);\n    final middle = size.height;\n    //final int filter = (samples.length / size.width).floor();\n    var i = 0.0;\n\n    final t = size.width * upsample / samples.length;\n\n    final path = Path();\n    path.moveTo(0, middle);\n\n    for (var p = 0, len = samples.length; p < len; p += 1) {\n      var d = samples[p]; // / maxValue;\n      var pos = (t * i).round();\n      points[pos] += d.toDouble();\n\n      i += 1;\n    }\n\n    var vmax = points.reduce(max);\n    for (var _i = 0; _i < size.width * upsample; _i++) {\n      path.lineTo(_i / upsample, middle - points[_i] / vmax * middle);\n    }\n\n    //maxPoints.forEach((o) => path.lineTo(o.dx, o.dy));\n    // back to zero\n    path.lineTo(size.width, middle);\n    // draw the minimums backwards so we can fill the shape when done.\n    //minPoints.reversed\n    //    .forEach((o) => path.lineTo(o.dx, middle - (middle - o.dy)));\n\n    //path.close();\n    return path;\n  }\n\n  Path? overallPath(Size size) {\n    //TODO: have a separate flag as this can cause shared usage problems\n    if (!_needsUpdate) return _overallPath;\n    _overallPath = _path(data, size);\n    return _overallPath;\n  }\n}\n"
  },
  {
    "path": "lib/audio/online_sources/YoutubeSource.dart",
    "content": "import 'package:mighty_plug_manager/audio/online_sources/onlineSource.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/onlineTrack.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/sourceResolver.dart';\nimport 'package:youtube_explode_dart/youtube_explode_dart.dart';\n\nclass YoutubeSource extends OnlineSource {\n  @override\n  bool get hasSuggestions => false;\n\n  @override\n  String get name => \"Youtube\";\n\n  @override\n  Future<List<OnlineTrack>> getSearchResults(String query) async {\n    var yt = YoutubeExplode();\n\n    var results = await yt.search.search(query);\n    var songs = <OnlineTrack>[];\n\n    for (var result in results) {\n      songs.add(OnlineTrack(\n          artist: result.author,\n          title: result.title,\n          hasUrl: false,\n          id: result.id.value,\n          detailsUrl: result.url,\n          thumbnailUrl: result.thumbnails.standardResUrl));\n    }\n\n    return songs;\n  }\n\n  @override\n  Future<List<String>> getSuggestions(String query) async {\n    return [];\n  }\n\n  @override\n  Future<String> getTrackUri(OnlineTrack track) async {\n    return \"yt:${track.id}\";\n  }\n\n  @override\n  Future<String> getPreviewUrl(OnlineTrack track) async {\n    var urlCache = SourceResolver.getFromCache(track.id);\n    if (urlCache != null) return urlCache;\n\n    return getYoutubeUrlFromId(track.id);\n  }\n\n  static Future<String> getYoutubeUrlFromId(String id) async {\n    var yt = YoutubeExplode();\n    var manifest = await yt.videos.streamsClient.getManifest(id);\n    var stream = getHighestBitrateMP4(manifest);\n    SourceResolver.addToCache(id, stream.url.toString());\n    return stream.url.toString();\n  }\n\n  static  AudioOnlyStreamInfo getHighestBitrateMP4(StreamManifest manifest) {\n    AudioOnlyStreamInfo? stream;\n\n    for (var s in manifest.audioOnly) {\n      if (stream == null || (s.codec.mimeType == \"audio/mp4\" && s.size.totalBytes > stream.size.totalBytes)) {\n        stream = s;\n      }\n    }\n    return stream ?? manifest.audioOnly.withHighestBitrate();\n  }\n}\n"
  },
  {
    "path": "lib/audio/online_sources/backingTracksCoSource.dart",
    "content": "import 'package:mighty_plug_manager/audio/online_sources/onlineSource.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/onlineTrack.dart';\nimport 'package:html/parser.dart' as html;\nimport 'package:http/http.dart' as http;\n\nclass BackingTracksCoSource extends OnlineSource {\n  static const baseUrl = \"https://www.backingtracks.co\";\n  //static const suggestionsPath = \"/static/storage/gbt/search/suggestions/\";\n  static const searchPath = \"/search.php?text=\";\n\n  @override\n  bool get hasSuggestions => false;\n\n  @override\n  String get name => \"Backing Tracks Co\";\n\n  @override\n  Future<List<OnlineTrack>> getSearchResults(String query) async {\n    //build search url\n    var url = \"$baseUrl$searchPath$query\";\n    var result = await http.get(Uri.parse(url));\n    if (result.statusCode == 200) {\n      var songs = <OnlineTrack>[];\n      var doc = html.parse(result.body);\n      var results = doc.querySelectorAll(\"div.pl-in\");\n      if (results.isNotEmpty) {\n        for (var i = 0; i < results.length; i++) {\n          var item = results[i];\n          var url = item.children[1].children[0].attributes['data-url'] ?? \"\";\n          songs.add(OnlineTrack(\n              artist: item.children[2].children[0].text.trim(),\n              title: item.children[2].children[1].text.trim(),\n              hasUrl: true,\n              url: url,\n              detailsUrl: \"$baseUrl$url\"));\n        }\n        return songs;\n      }\n    }\n\n    return [];\n  }\n\n  @override\n  Future<List<String>> getSuggestions(String query) async {\n    return [];\n  }\n\n  @override\n  Future<String> getTrackUri(OnlineTrack track) async {\n    return track.url;\n  }\n\n  @override\n  Future<String> getPreviewUrl(OnlineTrack track) async {\n    return track.url;\n  }\n}\n"
  },
  {
    "path": "lib/audio/online_sources/guitarBackingTracksSource.dart",
    "content": "import 'dart:convert';\n\nimport 'package:mighty_plug_manager/audio/online_sources/onlineSource.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/onlineTrack.dart';\nimport 'package:html/parser.dart' as html;\nimport 'package:http/http.dart' as http;\n\nclass GuitarBackingTracksSource extends OnlineSource {\n  static const baseUrl = \"https://www.guitarbackingtrack.com\";\n  static const suggestionsPath = \"/static/storage/gbt/search/suggestions/\";\n  static const searchPath = \"/search.php?query=\";\n\n  @override\n  bool get hasSuggestions => true;\n\n  @override\n  String get name => \"Guitar Backing Tracks\";\n\n  @override\n  Future<List<OnlineTrack>> getSearchResults(String query) async {\n    //build search url\n    var url = \"$baseUrl$searchPath$query\";\n    var result = await http.get(Uri.parse(url));\n    if (result.statusCode == 200) {\n      var songs = <OnlineTrack>[];\n      var doc = html.parse(result.body);\n      var results = doc.querySelectorAll(\".gbt-b-section--table-row\");\n      if (results.length > 1) {\n        for (var i = 1; i < results.length; i++) {\n          var item = results[i];\n          var url = item.children[1].children[0].attributes['href'];\n          songs.add(OnlineTrack(\n              artist: item.children[0].children[0].text.trim(),\n              title: item.children[1].children[0].text.trim(),\n              hasUrl: false,\n              detailsUrl: \"$baseUrl$url\"));\n        }\n        return songs;\n      }\n    }\n\n    return [];\n  }\n\n  @override\n  Future<List<String>> getSuggestions(String query) async {\n    //build suggestion path\n    query = query.split(' ')[0];\n    if (query.isNotEmpty) {\n      var url = \"$baseUrl$suggestionsPath${query[0]}/$query.js\";\n      var result = await http.get(Uri.parse(url));\n      if (result.statusCode == 200) {\n        List<dynamic> _res = jsonDecode(result.body)['suggestions'];\n        return _res.map((e) => e.toString()).toList();\n      }\n    }\n\n    return [];\n  }\n\n  @override\n  Future<String> getTrackUri(OnlineTrack track) async {\n    var result = await http.get(Uri.parse(track.detailsUrl));\n    if (result.statusCode == 200) {\n      var doc = html.parse(result.body);\n      var item = doc.querySelector(\"audio.js-audio\");\n      if (item != null) {\n        return \"$baseUrl${item.attributes[\"src\"].toString()}\";\n      }\n    }\n    return \"\";\n  }\n\n  @override\n  Future<String> getPreviewUrl(OnlineTrack track) async {\n    return getTrackUri(track);\n  }\n}\n"
  },
  {
    "path": "lib/audio/online_sources/onlineSource.dart",
    "content": "import 'onlineTrack.dart';\n\nabstract class OnlineSource {\n  String get name;\n  bool get hasSuggestions;\n\n  Future<List<String>> getSuggestions(String query);\n\n  Future<List<OnlineTrack>> getSearchResults(String query);\n\n  Future<String> getTrackUri(OnlineTrack track);\n  Future<String> getPreviewUrl(OnlineTrack track);\n}\n"
  },
  {
    "path": "lib/audio/online_sources/onlineTrack.dart",
    "content": "class OnlineTrack {\n  String title;\n  String artist;\n  bool hasUrl;\n  String url;\n  String id;\n  String detailsUrl;\n  String thumbnailUrl;\n\n  OnlineTrack(\n      {required this.title,\n      required this.artist,\n      required this.hasUrl,\n      this.url = \"\",\n      this.id = \"\",\n      required this.detailsUrl,\n      this.thumbnailUrl = \"\"});\n}\n"
  },
  {
    "path": "lib/audio/online_sources/sourceResolver.dart",
    "content": "import 'package:audio_picker/audio_picker.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/YoutubeSource.dart';\nimport 'package:mighty_plug_manager/platform/platformUtils.dart';\n\nclass SourceResolver {\n  static final Map<String, String> _pathCache = {};\n  static Future<String> getSourceUrl(String sourceUri) async {\n    if (sourceUri.startsWith(\"yt:\")) {\n      var id = sourceUri.substring(3);\n\n      if (_pathCache.containsKey(id)) return _pathCache[id]!;\n      //this is youtube source, parse the url\n      String url = await YoutubeSource.getYoutubeUrlFromId(id);\n      _pathCache[id] = url;\n      return url;\n    }\n    else if (sourceUri.startsWith(\"iosbm:\")) {\n      var url = await AudioPicker().iosBookmarkToUrl(sourceUri);\n      return url;\n    }\n    return sourceUri;\n  }\n\n  static void releaseUrl(String sourceUrl, String resolvedUrl) {\n    if (PlatformUtils.isIOS) {\n      if (sourceUrl.startsWith(\"iosbm:\")) {\n        AudioPicker().iosReleaseSecurityScope(resolvedUrl);\n        return;\n      }\n    }\n  }\n\n  static void addToCache(String id, String url) {\n    _pathCache[id] = url;\n  }\n\n  static String? getFromCache(String id) {\n    return _pathCache[id];\n  }\n}\n"
  },
  {
    "path": "lib/audio/setlistPage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/UI/popups/selectTrack.dart';\nimport 'package:mighty_plug_manager/UI/theme.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';\nimport '../UI/pages/jamTracks.dart';\nimport 'models/setlist.dart';\nimport 'trackdata/trackData.dart';\n\nclass SetlistPage extends StatefulWidget {\n  final Setlist setlist;\n  final bool readOnly;\n\n  const SetlistPage({Key? key, required this.setlist, required this.readOnly})\n      : super(key: key);\n  @override\n  State createState() => _SetlistPageState();\n}\n\nclass _SetlistPageState extends State<SetlistPage> {\n  final animationDuration = const Duration(milliseconds: 200);\n\n  final SetlistPlayerState playerState = SetlistPlayerState.instance();\n\n  //multiselection stuff\n  bool _multiselectMode = false;\n  Offset dragStart = const Offset(0, 0);\n  Map<int, bool> selected = {};\n\n  var popupSubmenu = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: 0,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.highlight_remove_outlined,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Remove\"),\n        ],\n      ),\n    )\n  ];\n\n  void menuActions(BuildContext context, int action, SetlistItem item) async {\n    switch (action) {\n      case 0: //delete\n        AlertDialogs.showConfirmDialog(context,\n            title: \"Confirm\",\n            description:\n                \"Are you sure you want to remove ${item.trackReference!.name}?\",\n            cancelButton: \"Cancel\",\n            confirmButton: \"Delete\",\n            confirmColor: Colors.red, onConfirm: (delete) {\n          if (delete) {\n            SetlistItem? currentSong = findPlayedTrack();\n            widget.setlist.items.remove(item);\n            reattachTrackIndex(currentSong);\n            TrackData().saveSetlists().then((value) {\n              setState(() {});\n            });\n          }\n        });\n        break;\n    }\n  }\n\n  void addTrack() {\n    showDialog(\n      context: context,\n      builder: (BuildContext context) =>\n          SelectTrackDialog().buildDialog(context),\n    ).then((value) {\n      if (value == null) return;\n      if (value is List) {\n        for (var element in value) {\n          widget.setlist.addTrack(element);\n        }\n      } else {\n        widget.setlist.addTrack(value);\n      }\n\n      TrackData().saveSetlists();\n      setState(() {});\n    });\n  }\n\n  void multiselectHandler(int index) {\n    if (selected.isEmpty || !selected.containsKey(index)) {\n      //fill it first if not created\n      selected[index] = true;\n      _multiselectMode = true;\n    } else {\n      selected.remove(index);\n      if (selected.isEmpty) _multiselectMode = false;\n    }\n    setState(() {});\n  }\n\n  void deselectAll() {\n    selected.clear();\n    _multiselectMode = false;\n    setState(() {});\n  }\n\n  SetlistItem? findPlayedTrack() {\n    if (playerState.setlist == widget.setlist) {\n      return widget.setlist.items[playerState.currentTrack];\n    }\n    return null;\n  }\n\n  void reattachTrackIndex(SetlistItem? currentSong) {\n    if (currentSong != null) {\n      var index = widget.setlist.items.indexOf(currentSong);\n      if (index > -1) {\n        playerState.currentTrack = index;\n      } else {\n        playerState.clear();\n      }\n    }\n  }\n\n  Widget? createTrailingWidget(BuildContext context, int index) {\n    if (widget.readOnly) return null;\n    if (_multiselectMode) {\n      return Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16),\n        child: Icon(\n          selected.containsKey(index)\n              ? Icons.check_circle\n              : Icons.brightness_1_outlined,\n          color: selected.containsKey(index) ? null : Colors.grey[800],\n        ),\n      );\n    }\n\n    return PopupMenuButton(\n      child: const Padding(\n        padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16),\n        child: Icon(Icons.more_vert),\n      ),\n      itemBuilder: (context) {\n        return popupSubmenu;\n      },\n      onSelected: (pos) {\n        menuActions(context, pos as int, widget.setlist.items[index]);\n      },\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () async {\n        if (_multiselectMode) {\n          deselectAll();\n          return false;\n        }\n        return true;\n      },\n      child: Scaffold(\n        appBar: AppBar(\n            backgroundColor: Colors.grey[850],\n            title: Text(widget.setlist.name)),\n        body: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Expanded(\n              child: ListTileTheme(\n                selectedTileColor: const Color.fromARGB(255, 9, 51, 116),\n                selectedColor: Colors.white,\n                iconColor: Colors.white,\n                child: IndexedStack(\n                  index: widget.setlist.items.isNotEmpty ? 0 : 1,\n                  children: [\n                    Theme(\n                      data: Theme.of(context).copyWith(\n                        canvasColor: Colors.grey[700],\n                      ),\n                      child: ReorderableListView.builder(\n                          buildDefaultDragHandles: false,\n                          itemCount: widget.setlist.items.length,\n                          itemBuilder: (context, index) {\n                            return Container(\n                              key: Key(\"$index\"),\n                              child: InkWell(\n                                onTap: () {\n                                  if (_multiselectMode) {\n                                    multiselectHandler(index);\n                                    return;\n                                  }\n                                  var track = widget\n                                      .setlist.items[index].trackReference;\n                                  if (track != null) {\n                                    if (playerState.setlist != widget.setlist) {\n                                      playerState.openSetlist(widget.setlist);\n                                    }\n                                    playerState.openTrack(index);\n                                  }\n                                  setState(() {});\n                                },\n                                onLongPress: widget.readOnly\n                                    ? null\n                                    : () => multiselectHandler(index),\n                                child: Row(\n                                  children: [\n                                    if (!widget.readOnly && !_multiselectMode)\n                                      ReorderableDragStartListener(\n                                        index: index,\n                                        child: InkWell(\n                                          child: SizedBox(\n                                            width:\n                                                AppThemeConfig.dragHandlesWidth,\n                                            height: 48,\n                                            child: const Icon(\n                                              Icons.drag_handle,\n                                              color: Colors.grey,\n                                              size: 24,\n                                            ),\n                                          ),\n                                        ),\n                                      ),\n                                    Expanded(\n                                      child: ListTile(\n                                        selected: _multiselectMode &&\n                                            selected.containsKey(index),\n                                        contentPadding: EdgeInsets.only(\n                                            left: widget.readOnly ||\n                                                    _multiselectMode\n                                                ? 16\n                                                : 0,\n                                            right: 0),\n                                        title: Text(widget.setlist.items[index]\n                                            .trackReference!.name),\n                                        trailing: createTrailingWidget(\n                                            context, index),\n                                      ),\n                                    ),\n                                  ],\n                                ),\n                              ),\n                            );\n                          },\n                          onReorder: (int oldIndex, int newIndex) {\n                            var currentItem =\n                                widget.setlist.items[playerState.currentTrack];\n                            if (oldIndex < newIndex) {\n                              // removing the item at oldIndex will shorten the list by 1.\n                              newIndex -= 1;\n                            }\n                            final element =\n                                widget.setlist.items.removeAt(oldIndex);\n                            widget.setlist.items.insert(newIndex, element);\n\n                            if (playerState.setlist == widget.setlist) {\n                              playerState.currentTrack =\n                                  widget.setlist.items.indexOf(currentItem);\n                            }\n\n                            TrackData().saveSetlists();\n                          }),\n                    ),\n                    Center(\n                      child: Text(\n                        \"No Tracks\",\n                        style: Theme.of(context).textTheme.bodyLarge,\n                      ),\n                    )\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n        floatingActionButton: widget.readOnly\n            ? null\n            : FloatingActionButton(\n                backgroundColor: Colors.blue,\n                foregroundColor: Colors.white,\n                onPressed: () {\n                  if (_multiselectMode) {\n                    //delete mode\n                    AlertDialogs.showConfirmDialog(\n                        JamTracks.jamtracksNavigator.currentContext!,\n                        title: \"Confirm\",\n                        description:\n                            \"Are you sure you want to remove ${selected.length} items?\",\n                        cancelButton: \"Cancel\",\n                        confirmButton: \"Delete\",\n                        confirmColor: Colors.red, onConfirm: (delete) async {\n                      if (delete) {\n                        SetlistItem? currentSong = findPlayedTrack();\n\n                        for (int i = selected.length - 1; i >= 0; i--) {\n                          var index = selected.keys.elementAt(i);\n                          if (playerState.setlist == widget.setlist &&\n                              playerState.currentTrack == index) {}\n                          widget.setlist.items.removeAt(index);\n                        }\n\n                        reattachTrackIndex(currentSong);\n                        await TrackData().saveSetlists();\n                        deselectAll();\n                      }\n                    });\n                    return;\n                  }\n                  addTrack();\n                },\n                child: Icon(\n                  _multiselectMode ? Icons.delete : Icons.add,\n                  size: 28,\n                ),\n              ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/setlist_player/setlistPlayerState.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\n\nimport '../../platform/simpleSharedPrefs.dart';\nimport '../automationController.dart';\nimport '../models/setlist.dart';\n\nenum PlayerState { idle, play, pause }\n\nclass SetlistPlayerState extends ChangeNotifier {\n  static final SetlistPlayerState _setlistPlayerState = SetlistPlayerState._();\n\n  SetlistPlayerState._() {\n    gain = SharedPrefs().getValue(SettingsKeys.trackGain, 0.0);\n  }\n\n  factory SetlistPlayerState.instance() {\n    return _setlistPlayerState;\n  }\n\n  PlayerState state = PlayerState.idle;\n  final StreamController<Duration> _positionController =\n      StreamController<Duration>.broadcast();\n\n  Stream<Duration> get positionStream => _positionController.stream;\n  Setlist? setlist;\n  int currentTrack = 0;\n  Duration currentPosition = const Duration(seconds: 0);\n  bool _autoAdvance = true;\n  bool _inPositionUpdateMode = false;\n\n  bool _expanded = false;\n  bool get expanded => _expanded;\n\n  int _pitch = 1;\n  double _speed = 1;\n  double _gain = 0;\n\n  ABRepeatState get abRepeat => automation?.abRepeatState ?? ABRepeatState.off;\n\n  int get pitch => _pitch;\n  set pitch(val) {\n    _pitch = val;\n    notifyListeners();\n  }\n\n  double get speed => _speed;\n  set speed(val) {\n    _speed = val;\n    notifyListeners();\n  }\n\n  double get gain => _gain;\n  set gain(double val) {\n    _gain = val;\n    automation?.setGain(_gain);\n  }\n\n  AutomationController? get automation => _automation;\n\n  bool get autoAdvance => _autoAdvance;\n  set autoAdvance(bool val) {\n    _autoAdvance = val;\n    notifyListeners();\n  }\n\n  AutomationController? _automation;\n\n  void openTrack(int setlistIndex) async {\n    currentTrack = setlistIndex;\n    await closeTrack();\n\n    await _openTrack(setlistIndex);\n\n    await play();\n    notifyListeners();\n  }\n\n  void openSetlist(Setlist newSetlist) {\n    setlist = newSetlist;\n  }\n\n  Future _openTrack(int index) async {\n    if (setlist == null) return;\n    currentPosition = const Duration(milliseconds: 0);\n    currentTrack = index;\n    var track = setlist!.items[index].trackReference;\n    if (track != null) {\n      print(\"Opening track ${track.name}\");\n      print(\"Track path: ${track.path}\");\n      _automation = AutomationController(track, track.automation);\n      await _automation?.setAudioFile(track.path, 70);\n      _automation?.setTrackCompleteEvent(_onTrackComplete);\n      _automation?.positionStream.listen(_onPosition);\n      automation?.setGain(_gain);\n      pitch = _automation?.pitch ?? 1;\n      speed = _automation?.speed ?? 1;\n    }\n  }\n\n  Future play() async {\n    await _automation?.play();\n    state = PlayerState.play;\n    notifyListeners();\n  }\n\n  Future playPause() async {\n    if (setlist == null) return;\n    if (_automation == null) await _openTrack(currentTrack);\n    await _automation?.playPause();\n    if (_automation!.player.playerState.playing == false) {\n      state = PlayerState.pause;\n    } else {\n      state = PlayerState.play;\n    }\n    debugPrint(state.toString());\n    notifyListeners();\n  }\n\n  Future stop() async {\n    await _automation?.stop();\n    state = PlayerState.idle;\n    notifyListeners();\n  }\n\n  Future clear() async {\n    setlist = null;\n    currentTrack = 0;\n    await stop();\n  }\n\n  void previous() async {\n    if (_automation == null) return;\n    if (currentTrack == 0 || _automation!.player.position.inSeconds > 3) {\n      _automation!.rewind();\n      currentPosition = const Duration(milliseconds: 0);\n    } else if (currentTrack > 0) {\n      await closeTrack();\n      currentTrack--;\n      await _openTrack(currentTrack);\n      if (state == PlayerState.play) await play();\n    }\n\n    notifyListeners();\n  }\n\n  void next() async {\n    if (setlist == null) return;\n    if (currentTrack < setlist!.items.length - 1) {\n      await closeTrack();\n      currentTrack++;\n      await _openTrack(currentTrack);\n      if (state == PlayerState.play) await play();\n      notifyListeners();\n    }\n  }\n\n  Future? closeTrack() {\n    return _automation?.dispose();\n  }\n\n  void onTrackRemoved(String trackUuld) {\n    if (setlist == null) return;\n    bool hasItem =\n        setlist!.items.any((element) => element.trackUuid == trackUuld);\n    if (hasItem) {\n      clear();\n      notifyListeners();\n    }\n  }\n\n  void _onPosition(Duration pos) {\n    if (!_inPositionUpdateMode) currentPosition = pos;\n    _positionController.add(pos);\n  }\n\n  String getMMSS(Duration d) {\n    var m = d.inMinutes.toString().padLeft(2, \"0\");\n    var s = d.inSeconds.remainder(60).toString().padLeft(2, \"0\");\n    return \"$m:$s\";\n  }\n\n  Duration getDuration() {\n    return _automation?.duration ?? const Duration(seconds: 0);\n  }\n\n  void setPosition(int positionMS) {\n    if (positionMS < 0) positionMS = 0;\n\n    var duration = getDuration().inMilliseconds;\n    if (positionMS > duration) positionMS = duration;\n\n    currentPosition = Duration(milliseconds: positionMS);\n    if (!_inPositionUpdateMode) {\n      _automation?.seek(currentPosition);\n      notifyListeners();\n      _positionController.add(currentPosition);\n    }\n  }\n\n  void setPositionUpdateMode(bool enabled) {\n    _inPositionUpdateMode = enabled;\n    if (!enabled) _automation?.seek(currentPosition);\n  }\n\n  void _onTrackComplete() async {\n    await closeTrack();\n\n    if (setlist == null) return;\n    currentPosition = const Duration(milliseconds: 0);\n    if (currentTrack < setlist!.items.length - 1) {\n      currentTrack++;\n      await _openTrack(currentTrack);\n      if (_autoAdvance) {\n        await play();\n        state = PlayerState.play;\n      } else {\n        state = PlayerState.pause;\n      }\n    } else {\n      currentTrack = 0;\n      await _openTrack(currentTrack);\n      state = PlayerState.pause;\n    }\n    notifyListeners();\n  }\n\n  void toggleExpanded() {\n    _expanded = !_expanded;\n    notifyListeners();\n  }\n\n  void toggleABRepeat() {\n    if (state != PlayerState.play) return;\n    automation?.toggleABRepeat();\n    notifyListeners();\n  }\n}\n"
  },
  {
    "path": "lib/audio/setlistsPage.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/UI/theme.dart';\nimport 'package:mighty_plug_manager/audio/trackdata/trackData.dart';\n\nimport 'models/setlist.dart';\n\nclass Setlists extends StatefulWidget {\n  final Function(Setlist)? onSetlistSelect;\n  final Function()? onAllTracksSelect;\n\n  const Setlists({Key? key, this.onSetlistSelect, this.onAllTracksSelect})\n      : super(key: key);\n\n  @override\n  State createState() => _SetlistsState();\n}\n\nclass _SetlistsState extends State<Setlists> {\n  Offset _position = const Offset(0, 0);\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  void createSetlist() {\n    AlertDialogs.showInputDialog(context,\n        title: \"New Setlist\",\n        description: \"Create new setlist\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Create\",\n        value: \"New Setlist\",\n        validation: (name) {\n          if (TrackData().findSetlist(name) != null) return false;\n          return true;\n        },\n        validationErrorMessage: \"A setlist with this name already exists\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (name) {\n          TrackData().addSetlist(name);\n\n          setState(() {});\n        });\n  }\n\n  var popupSubmenu = <PopupMenuEntry>[\n    // PopupMenuItem(\n    //   value: 0,\n    //   child: Row(\n    //     children: <Widget>[\n    //       Icon(\n    //         Icons.view,\n    //         color: AppThemeConfig.contextMenuIconColor,\n    //       ),\n    //       const SizedBox(width: 5),\n    //       Text(\"Open\"),\n    //     ],\n    //   ),\n    // ),\n    PopupMenuItem(\n      value: 1,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.drive_file_rename_outline,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Rename\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: 2,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.delete,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Delete\"),\n        ],\n      ),\n    )\n  ];\n\n  void showContextMenu(\n      BuildContext context, dynamic item, List<PopupMenuEntry> menu) {\n    final RenderBox overlay =\n        Overlay.of(context).context.findRenderObject() as RenderBox;\n    //open menu\n    var rect = RelativeRect.fromRect(\n        _position & const Size(40, 40), // smaller rect, the touch area\n        Offset.zero & overlay.size);\n    showMenu(\n      position: rect,\n      items: menu,\n      context: context,\n    ).then((value) {\n      if (value != null) menuActions(context, value, item);\n    });\n  }\n\n  void menuActions(BuildContext context, int action, Setlist item) async {\n    switch (action) {\n      case 1: //rename\n        renameSetlist(context, item);\n        break;\n      case 2: //delete\n        AlertDialogs.showConfirmDialog(context,\n            title: \"Confirm\",\n            description: \"Are you sure you want to delete ${item.name}?\",\n            cancelButton: \"Cancel\",\n            confirmButton: \"Delete\",\n            confirmColor: Colors.red, onConfirm: (delete) {\n          if (delete) {\n            TrackData().removeSetlist(item).then((value) => setState(() {}));\n          }\n        });\n        break;\n    }\n  }\n\n  void renameSetlist(BuildContext context, Setlist setlist) {\n    AlertDialogs.showInputDialog(context,\n        title: \"Rename\",\n        description: \"Enter setlist name:\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Rename\",\n        value: setlist.name,\n        validation: (String newName) {\n          if (TrackData().findSetlist(newName) != null) return false;\n          return true;\n        },\n        validationErrorMessage: \"Name already taken!\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (newName) {\n          setlist.name = newName;\n          TrackData().saveSetlists();\n          setState(() {});\n        });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var setlists = TrackData().setlists;\n    if (TrackData().tracks.isEmpty) {\n      return const Center(child: Text(\"Add some tracks first!\"));\n    }\n    return ListTileTheme(\n      iconColor: Colors.white,\n      child: Stack(\n        alignment: Alignment.bottomRight,\n        children: [\n          Column(\n            children: [\n              ListTile(\n                contentPadding: EdgeInsets.only(\n                    left: AppThemeConfig.dragHandlesWidth, right: 16),\n                title: Text(TrackData().allTracks.name),\n                subtitle: Text(\"${TrackData().allTracks.items.length} tracks\"),\n                trailing: const Icon(Icons.keyboard_arrow_right),\n                onTap: () {\n                  widget.onAllTracksSelect?.call();\n                },\n              ),\n              Expanded(\n                child: Theme(\n                  data: Theme.of(context).copyWith(\n                    canvasColor: Colors.grey[700],\n                    //shadowColor: Colors.grey,\n                  ),\n                  child: ReorderableListView.builder(\n                      padding: const EdgeInsets.only(bottom: 90),\n                      itemCount: setlists.length,\n                      itemBuilder: (context, index) {\n                        return Container(\n                          key: Key(\"$index\"),\n                          child: InkWell(\n                            onTap: () {\n                              widget.onSetlistSelect?.call(setlists[index]);\n                            },\n                            onTapDown: (details) {\n                              _position = details.globalPosition;\n                            },\n                            onLongPress: () {\n                              showContextMenu(\n                                  context, setlists[index], popupSubmenu);\n                            },\n                            child: Row(\n                              children: [\n                                ReorderableDragStartListener(\n                                  index: index,\n                                  child: InkWell(\n                                    child: SizedBox(\n                                      width: AppThemeConfig.dragHandlesWidth,\n                                      height: 64,\n                                      child: const Icon(\n                                        Icons.drag_handle,\n                                        color: Colors.grey,\n                                        size: 24,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                                Expanded(\n                                  child: ListTile(\n                                    contentPadding:\n                                        const EdgeInsets.only(right: 0),\n                                    title: Text(setlists[index].name),\n                                    subtitle: Text(\n                                        \"${setlists[index].items.length} tracks\"),\n                                    trailing: PopupMenuButton(\n                                      padding: EdgeInsets.zero,\n                                      child: const Padding(\n                                        padding: EdgeInsets.symmetric(\n                                            horizontal: 16,\n                                            vertical: 16),\n                                        child: Icon(Icons.more_vert),\n                                      ),\n                                      itemBuilder: (context) {\n                                        return popupSubmenu;\n                                      },\n                                      onSelected: (pos) {\n                                        menuActions(context, pos as int,\n                                            setlists[index]);\n                                      },\n                                    ),\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        );\n                      },\n                      buildDefaultDragHandles: false,\n                      onReorder: (int oldIndex, int newIndex) {\n                        if (oldIndex < newIndex) {\n                          // removing the item at oldIndex will shorten the list by 1.\n                          newIndex -= 1;\n                        }\n                        final element = setlists.removeAt(oldIndex);\n                        setlists.insert(newIndex, element);\n                        TrackData().saveSetlists();\n                      }),\n                ),\n              ),\n            ],\n          ),\n          Padding(\n            padding: const EdgeInsets.all(20.0),\n            child: FloatingActionButton(\n              backgroundColor: Colors.blue,\n              foregroundColor: Colors.white,\n              onPressed: () {\n                createSetlist();\n              },\n              child: const Icon(\n                Icons.add,\n                size: 28,\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/trackdata/trackData.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:audio_picker/audio_picker.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:mighty_plug_manager/audio/models/jamTrack.dart';\nimport 'package:mighty_plug_manager/audio/models/setlist.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:uuid/uuid.dart';\n\nimport '../../platform/platformUtils.dart';\n\nclass TrackData {\n  static final TrackData _storage = TrackData._();\n  static const tracksFile = \"tracks.json\";\n  static const setlistsFile = \"setlists.json\";\n\n  final Uuid uuid = const Uuid();\n\n  factory TrackData() {\n    return _storage;\n  }\n\n  String tracksPath = \"\";\n  String setlistsPath = \"\";\n  late Directory? storageDirectory;\n  late File _tracksFile, _setlistsFile;\n\n  List<JamTrack> _tracksData = <JamTrack>[];\n  List<JamTrack> get tracks => _tracksData;\n\n  List<Setlist> _setlistsData = <Setlist>[];\n  final Setlist _allTracks = Setlist(\"All Tracks\", []);\n  List<Setlist> get setlistsFull => [_allTracks] + _setlistsData;\n  Setlist get allTracks => _allTracks;\n  List<Setlist> get setlists => _setlistsData;\n\n  bool _tracksReady = false;\n\n  TrackData._() {\n    _init();\n  }\n\n  _init() async {\n    _tracksData = <JamTrack>[];\n    await _getDirectory();\n    await _loadTracks();\n    AudioPicker().regusterOnStaleBookmark(_onBookmarkUpdated);\n  }\n\n  _getDirectory() async {\n    storageDirectory = await PlatformUtils.getAppDataDirectory();\n    tracksPath = path.join(storageDirectory?.path ?? \"\", tracksFile);\n    setlistsPath = path.join(storageDirectory?.path ?? \"\", setlistsFile);\n    _tracksFile = File(tracksPath);\n    _setlistsFile = File(setlistsPath);\n  }\n\n  _loadTracks() async {\n    try {\n      var exists = await _tracksFile.exists();\n      if (exists) {\n        var tracksJson = await _tracksFile.readAsString();\n        var data = json.decode(tracksJson);\n        _tracksData =\n            data.map<JamTrack>((json) => JamTrack.fromJson(json)).toList();\n\n        //read setlists\n        exists = await _setlistsFile.exists();\n        if (exists) {\n          var setlistsJson = await _setlistsFile.readAsString();\n          data = json.decode(setlistsJson);\n\n          _setlistsData =\n              data.map<Setlist>((json) => Setlist.fromJson(json)).toList();\n        }\n        _createAllTracksSetlist();\n      }\n      _tracksReady = true;\n    } catch (e) {\n      debugPrint(e.toString());\n      //still ready\n      _tracksReady = true;\n      //   //no file\n      //   print(\"Presets file not available\");\n    }\n  }\n\n  _createAllTracksSetlist() {\n    _allTracks.clear();\n    for (int i = 0; i < _tracksData.length; i++) {\n      _allTracks.addTrack(_tracksData[i]);\n    }\n  }\n\n  Future waitLoading() async {\n    for (int i = 0; i < 20; i++) {\n      if (_tracksReady) break;\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n  }\n\n  addTrack(String file, String name, bool save) {\n    _tracksData.add(JamTrack(\n      name: name,\n      path: file,\n      uuid: _generateUuid(),\n    ));\n    if (save) saveTracks();\n  }\n\n  JamTrack? findByUuid(String uuid) {\n    for (int i = 0; i < _tracksData.length; i++) {\n      if (_tracksData[i].uuid == uuid) return _tracksData[i];\n    }\n\n    return null;\n  }\n\n  removeTrack(JamTrack track) async {\n    if (_tracksData.contains(track)) {\n      _tracksData.remove(track);\n\n      bool tracklistChanged = false;\n      //remove any setlist instances\n      for (int i = 0; i < _setlistsData.length; i++) {\n        for (int j = _setlistsData[i].items.length - 1; j >= 0; j--) {\n          if (_setlistsData[i].items[j].trackUuid == track.uuid) {\n            _setlistsData[i].items.removeAt(j);\n            tracklistChanged = true;\n          }\n        }\n      }\n\n      if (tracklistChanged) await saveSetlists();\n\n      await saveTracks();\n    }\n  }\n\n  removeTracks(List<JamTrack> tracks) async {\n    bool tracklistChanged = false;\n    for (var element in tracks) {\n      _tracksData.remove(element);\n\n      //remove any setlist instances\n      for (int i = 0; i < _setlistsData.length; i++) {\n        for (int j = _setlistsData[i].items.length - 1; j >= 0; j--) {\n          if (_setlistsData[i].items[j].trackUuid == element.uuid) {\n            _setlistsData[i].items.removeAt(j);\n            tracklistChanged = true;\n          }\n        }\n      }\n    }\n\n    if (tracklistChanged) await saveSetlists();\n    await saveTracks();\n  }\n\n  bool isPresetInUse(String presetUuid) {\n    for (int i = 0; i < _tracksData.length; i++) {\n      if (_tracksData[i].automation.initialEvent.getPresetUuid() ==\n          presetUuid) {\n        return true;\n      }\n      var e = _tracksData[i].automation.events;\n      for (int j = 0; j < e.length; j++) {\n        if (e[j].getPresetUuid() == presetUuid) return true;\n      }\n    }\n    return false;\n  }\n\n  bool isAnyPresetInUse(List<String> presetsUuid) {\n    for (int i = 0; i < _tracksData.length; i++) {\n      if (presetsUuid.contains(\n          _tracksData[i].automation.initialEvent.getPresetUuid())) return true;\n      var e = _tracksData[i].automation.events;\n      for (int j = 0; j < e.length; j++) {\n        if (presetsUuid.contains(e[j].getPresetUuid())) return true;\n      }\n    }\n    return false;\n  }\n\n  void removePresetInstances(String presetUuid) {\n    for (int i = 0; i < _tracksData.length; i++) {\n      if (_tracksData[i].automation.initialEvent.getPresetUuid() ==\n          presetUuid) {\n        _tracksData[i].automation.initialEvent.clearPreset();\n      }\n\n      var e = _tracksData[i].automation.events;\n      for (int j = e.length - 1; j >= 0; j--) {\n        if (e[j].getPresetUuid() == presetUuid) e[j].clearPreset();\n      }\n    }\n    saveTracks();\n  }\n\n  void removeMultiplePresetsInstances(List<String> presetsUuid) {\n    for (int i = 0; i < _tracksData.length; i++) {\n      if (presetsUuid\n          .contains(_tracksData[i].automation.initialEvent.getPresetUuid())) {\n        _tracksData[i].automation.initialEvent.clearPreset();\n      }\n\n      var e = _tracksData[i].automation.events;\n      for (int j = e.length - 1; j >= 0; j--) {\n        var uuid = e[j].getPresetUuid();\n        if (presetsUuid.contains(uuid)) {\n          e[j].clearPreset();\n        }\n      }\n    }\n    saveTracks();\n  }\n\n  saveTracks() async {\n    _createAllTracksSetlist();\n    String jsonData = json.encode(_tracksData);\n    await _tracksFile.writeAsString(jsonData);\n  }\n\n  addSetlist(String name) {\n    var setlist = Setlist(name, []);\n    _setlistsData.add(setlist);\n    saveSetlists();\n  }\n\n  Setlist? findSetlist(String name) {\n    for (int i = 0; i < _setlistsData.length; i++) {\n      if (_setlistsData[i].name == name) return _setlistsData[i];\n    }\n    return null;\n  }\n\n  removeSetlist(Setlist setlist) async {\n    if (_setlistsData.contains(setlist)) {\n      _setlistsData.remove(setlist);\n      await saveSetlists();\n    }\n  }\n\n  saveSetlists() async {\n    String jsonData = json.encode(_setlistsData);\n    await _setlistsFile.writeAsString(jsonData);\n  }\n\n  String _generateUuid() {\n    String id = \"\";\n    bool unique = true;\n    do {\n      id = uuid.v4();\n      // check unique\n      for (var element in _tracksData) {\n        if (element.uuid == id) unique = false;\n      }\n    } while (unique == false);\n    return id;\n  }\n\n  void _onBookmarkUpdated(String oldBookmark, String newBookmark)\n  {\n    for (var track in _tracksData)\n    {\n      if (track.path == oldBookmark) {\n        track.path = newBookmark;\n        saveTracks();\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "lib/audio/tracksPage.dart",
    "content": "import 'package:audio_picker/audio_picker.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:on_audio_query_forked/on_audio_query.dart';\nimport 'package:mighty_plug_manager/UI/popups/alertDialogs.dart';\nimport 'package:mighty_plug_manager/UI/theme.dart';\nimport 'package:mighty_plug_manager/UI/widgets/fabMenu.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/searchTextField.dart';\nimport 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';\nimport 'package:mighty_plug_manager/audio/widgets/media_library/media_browse.dart';\nimport 'package:path/path.dart';\nimport '../platform/platformUtils.dart';\nimport '../platform/simpleSharedPrefs.dart';\nimport 'audioEditor.dart';\nimport 'models/jamTrack.dart';\nimport 'online_sources/YoutubeSource.dart';\nimport 'online_sources/onlineTrack.dart';\nimport 'trackdata/trackData.dart';\nimport 'widgets/online_source/online_source.dart';\nimport 'widgets/online_source/search_screen.dart';\n\nclass TracksPage extends StatefulWidget {\n  final bool selectorOnly;\n  final Function(JamTrack)? onSelectedTrack;\n  final Function(bool, Map<int, bool>)? multiSelectState;\n\n  const TracksPage(\n      {Key? key,\n      this.selectorOnly = false,\n      this.onSelectedTrack,\n      this.multiSelectState})\n      : super(key: key);\n\n  @override\n  State createState() => _TracksPageState();\n}\n\nclass _TracksPageState extends State<TracksPage>\n    with SingleTickerProviderStateMixin {\n  //search (filter) stuff\n  String filter = \"\";\n  final TextEditingController searchCtrl = TextEditingController(text: \"\");\n  final scrollController = ScrollController();\n  bool _showHiddenSources = false;\n\n  //multiselection stuff\n  bool _multiselectMode = false;\n\n  //menu anim\n  late Animation<double> _animation;\n  late AnimationController _animationController;\n  static List<SongModel>? songList;\n\n  bool get multiselectMode => _multiselectMode;\n  set multiselectMode(value) {\n    _multiselectMode = value;\n    widget.multiSelectState?.call(_multiselectMode, selected);\n  }\n\n  Map<int, bool> selected = {};\n\n  var popupSubmenu = <PopupMenuEntry>[\n    PopupMenuItem(\n      value: 0,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.edit,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Edit\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: 1,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.drive_file_rename_outline,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Rename\"),\n        ],\n      ),\n    ),\n    PopupMenuItem(\n      value: 2,\n      child: Row(\n        children: <Widget>[\n          Icon(\n            Icons.delete,\n            color: AppThemeConfig.contextMenuIconColor,\n          ),\n          const SizedBox(width: 5),\n          const Text(\"Delete\"),\n        ],\n      ),\n    )\n  ];\n\n  void menuActions(BuildContext context, int action, JamTrack item) async {\n    switch (action) {\n      case 0: //edit\n        editTrack(context, item);\n        break;\n      case 1: //rename\n        renameTrack(context, item);\n        break;\n      case 2: //delete\n        AlertDialogs.showConfirmDialog(context,\n            title: \"Confirm\",\n            description: \"Are you sure you want to delete ${item.name}?\",\n            cancelButton: \"Cancel\",\n            confirmButton: \"Delete\",\n            confirmColor: Colors.red, onConfirm: (delete) {\n          if (delete) {\n            SetlistPlayerState.instance().onTrackRemoved(item.uuid);\n            TrackData().removeTrack(item).then((value) => setState(() {}));\n          }\n        });\n        break;\n    }\n  }\n\n  String getProperTags(Map? tags, String filename) {\n    String title = \"\", artist = \"\";\n    if (tags != null) {\n      if (tags.containsKey(\"artist\")) artist = tags[\"artist\"];\n      if (tags.containsKey(\"title\")) title = tags[\"title\"];\n    }\n\n    if (artist.isNotEmpty || title.isNotEmpty) {\n      return \"$artist - $title\";\n    }\n\n    String fn = basename(filename);\n    if (fn.contains('.')) {\n      return fn.substring(0, fn.lastIndexOf(\".\"));\n    }\n    return fn;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n\n    searchCtrl.addListener(() {\n      filter = searchCtrl.value.text.toLowerCase();\n      setState(() {});\n    });\n\n    _animationController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 260),\n    );\n\n    final curvedAnimation =\n        CurvedAnimation(curve: Curves.easeInOut, parent: _animationController);\n    _animation = Tween<double>(begin: 0, end: 1).animate(curvedAnimation);\n\n    _showHiddenSources =\n        SharedPrefs().getInt(SettingsKeys.hiddenSources, 0) != 0 || kDebugMode;\n    querySongs();\n  }\n\n  void querySongs() async {\n    if (songList != null) return;\n    if (PlatformUtils.isAndroid) {\n      final OnAudioQuery audioQuery = OnAudioQuery();\n      songList = await audioQuery.querySongs();\n    }\n  }\n\n  void multiselectHandler(int index) {\n    if (selected.isEmpty || !selected.containsKey(index)) {\n      //fill it first if not created\n      selected[index] = true;\n      multiselectMode = true;\n    } else {\n      selected.remove(index);\n      if (selected.isEmpty) multiselectMode = false;\n    }\n    setState(() {});\n  }\n\n  void deselectAll() {\n    selected.clear();\n    multiselectMode = false;\n    setState(() {});\n  }\n\n  void stopPlayer() {\n    SetlistPlayerState.instance().stop();\n  }\n\n  void editTrack(BuildContext context, JamTrack track) {\n    stopPlayer();\n    Navigator.of(context, rootNavigator: true)\n        .push(MaterialPageRoute(builder: (context) => AudioEditor(track)))\n        .then((value) {\n      //save track data\n      TrackData().saveTracks();\n    });\n  }\n\n  void renameTrack(BuildContext context, JamTrack track) {\n    AlertDialogs.showInputDialog(context,\n        title: \"Rename\",\n        description: \"Enter track name:\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Rename\",\n        value: track.name,\n        validation: (String newName) {\n          return newName.isNotEmpty;\n        },\n        validationErrorMessage: \"Name already taken!\",\n        confirmColor: Theme.of(context).hintColor,\n        onConfirm: (newName) {\n          track.name = newName;\n          TrackData().saveTracks();\n          setState(() {});\n        });\n  }\n\n  Widget? createTrailingWidget(BuildContext context, int index) {\n    if (multiselectMode) {\n      return Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 10),\n        child: Icon(\n          selected.containsKey(index)\n              ? Icons.check_circle\n              : Icons.brightness_1_outlined,\n          color: selected.containsKey(index) ? null : Colors.grey[800],\n        ),\n      );\n    }\n\n    if (widget.selectorOnly) return null;\n    return PopupMenuButton(\n      child: const Padding(\n        padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 10),\n        child: Icon(Icons.more_vert),\n      ),\n      itemBuilder: (context) {\n        return popupSubmenu;\n      },\n      onSelected: (pos) {\n        menuActions(context, pos as int, TrackData().tracks[index]);\n      },\n    );\n  }\n\n  void deleteSelected(BuildContext context) {\n    AlertDialogs.showConfirmDialog(context,\n        title: \"Confirm\",\n        description:\n            \"Are you sure you want to delete ${selected.length} items?\",\n        cancelButton: \"Cancel\",\n        confirmButton: \"Delete\",\n        confirmColor: Colors.red, onConfirm: (delete) async {\n      if (delete) {\n        List<JamTrack> delTracks = [];\n        for (int i = 0; i < selected.length; i++) {\n          var item = TrackData().tracks[selected.keys.elementAt(i)];\n          delTracks.add(item);\n          SetlistPlayerState.instance().onTrackRemoved(item.uuid);\n        }\n        await TrackData().removeTracks(delTracks);\n        deselectAll();\n      }\n    });\n  }\n\n  Future _processMediaList(List<String> urls) async {\n    for (int i = 0; i < urls.length; i++) {\n      await _processFileUrl(urls[i]);\n      //clear filter and scroll to bottom\n      searchCtrl.text = \"\";\n      setState(() {});\n    }\n    if (urls.isNotEmpty) {\n      TrackData().saveTracks();\n      _scrollToNewSongs();\n    }\n  }\n\n  void addFromFile() async {\n    //add track mode\n    var path = await AudioPicker().pickAudioMultiple();\n    await _processMediaList(path);\n  }\n\n  void addFromIosFile() async {\n    var path = await AudioPicker().pickAudioFiles();\n    await _processMediaList(path);\n  }\n\n  Future _processFileUrl(String path) async {\n    SongModel? libSong;\n\n    if (PlatformUtils.isAndroid &&\n        path.contains(\"com.android.providers.media\")) {\n      var spl = path.split(\"%3A\");\n      if (spl.length < 2) return;\n      var id = int.tryParse(path.split(\"%3A\")[1]);\n      if (id != null) {\n        for (var s = 0; s < (songList?.length ?? 0); s++) {\n          if (songList![s].id == id) {\n            libSong = songList![s];\n            break;\n          }\n        }\n      }\n    } else {\n      //find song in media library\n      String file = basename(path);\n\n      for (var s = 0; s < (songList?.length ?? 0); s++) {\n        if (songList![s].uri?.contains(file) ?? false) {\n          libSong = songList![s];\n          break;\n        }\n      }\n    }\n\n    String artist = \"\";\n    String title = \"\";\n    String trackName = \"\";\n    String url = \"\";\n    if (libSong != null) {\n      artist = libSong.artist == null ? \"\" : libSong.artist!;\n      title = libSong.title;\n      url = libSong.uri ?? \"\";\n    } else {\n      var meta = await AudioPicker().getMetadata(path);\n      artist = meta[\"artist\"]?.trim() ?? \"\";\n      title = meta[\"title\"]?.trim() ?? \"\";\n      url = path;\n    }\n\n    trackName =\n        artist.isEmpty || title.isEmpty ? artist + title : \"$artist - $title\";\n\n    if (url.isEmpty) {\n      url = path;\n    }\n    if (trackName.isEmpty) {\n      trackName = Uri.decodeComponent(basenameWithoutExtension(path));\n    }\n\n    TrackData().addTrack(url, trackName, false);\n  }\n\n  void addFromMediaLibrary(BuildContext context) {\n    Navigator.of(context, rootNavigator: true)\n        .push(MaterialPageRoute(\n            builder: (context) => const MediaLibraryBrowser()))\n        .then((value) {\n      if (value is List<SongModel>) {\n        for (int i = 0; i < value.length; i++) {\n          var name = value[i].artist != \"<unknown>\"\n              ? \"${value[i].artist} - ${value[i].title}\"\n              : value[i].title;\n          TrackData().addTrack(value[i].uri ?? \"\", name, false);\n        }\n        TrackData().saveTracks();\n        //clear filter and scroll to bottom\n        searchCtrl.text = \"\";\n        setState(() {});\n        _scrollToNewSongs();\n      }\n    });\n  }\n\n  void addFromOnlineSource(BuildContext context) {\n    stopPlayer();\n    Navigator.of(context, rootNavigator: true)\n        .push(\n            MaterialPageRoute(builder: (context) => const OnlineSourceSearch()))\n        .then((value) {\n      if (value is List<OnlineTrack>) {\n        for (int i = 0; i < value.length; i++) {\n          var name = \"${value[i].artist} - ${value[i].title}\";\n          TrackData().addTrack(value[i].url, name, false);\n        }\n        TrackData().saveTracks();\n        //clear filter and scroll to bottom\n        searchCtrl.text = \"\";\n        setState(() {});\n        _scrollToNewSongs();\n      }\n    });\n  }\n\n  void addFromYoutubeSource(BuildContext context) {\n    stopPlayer();\n    Navigator.of(context, rootNavigator: true)\n        .push(MaterialPageRoute(\n            builder: (context) => OnlineSearchScreen(source: YoutubeSource())))\n        .then((value) {\n      if (value is List<OnlineTrack>) {\n        for (int i = 0; i < value.length; i++) {\n          var name = \"${value[i].artist} - ${value[i].title}\";\n          TrackData().addTrack(value[i].url, name, false);\n        }\n        TrackData().saveTracks();\n        //clear filter and scroll to bottom\n        searchCtrl.text = \"\";\n        setState(() {});\n        _scrollToNewSongs();\n      }\n    });\n  }\n\n  void _scrollToNewSongs() async {\n    await Future.delayed(const Duration(milliseconds: 300));\n    scrollController.animateTo(scrollController.position.maxScrollExtent,\n        duration: const Duration(milliseconds: 300), curve: Curves.easeInCubic);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () {\n        if (multiselectMode) {\n          deselectAll();\n          return Future.value(false);\n        }\n        return Future.value(true);\n      },\n      child: Scaffold(\n        resizeToAvoidBottomInset: false,\n        body: Column(\n          children: [\n            if (TrackData().tracks.isNotEmpty)\n              SearchTextField(controller: searchCtrl),\n            Expanded(\n              child: ListTileTheme(\n                selectedTileColor: const Color.fromARGB(255, 9, 51, 116),\n                selectedColor: Colors.white,\n                child: IndexedStack(\n                  index: TrackData().tracks.isEmpty ? 0 : 1,\n                  children: [\n                    Center(\n                        child: Text(\"No Tracks\",\n                            style: Theme.of(context).textTheme.bodyLarge)),\n                    ListView.builder(\n                      controller: scrollController,\n                      itemCount: TrackData().tracks.length,\n                      padding: const EdgeInsets.only(bottom: 90),\n                      itemBuilder: (context, index) {\n                        if (filter != \"\" &&\n                            !TrackData()\n                                .tracks[index]\n                                .name\n                                .toLowerCase()\n                                .contains(filter)) return const SizedBox();\n                        return ListTile(\n                          contentPadding: const EdgeInsets.only(left: 12),\n                          selected:\n                              multiselectMode && selected.containsKey(index),\n                          title: Text(TrackData().tracks[index].name),\n                          onTap: () {\n                            if (multiselectMode) {\n                              multiselectHandler(index);\n                              return;\n                            }\n                            if (widget.selectorOnly) {\n                              widget.onSelectedTrack\n                                  ?.call(TrackData().tracks[index]);\n                            } else {\n                              editTrack(context, TrackData().tracks[index]);\n                            }\n                          },\n                          onLongPress: () => multiselectHandler(index),\n                          trailing: createTrailingWidget(context, index),\n                        );\n                      },\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n        floatingActionButton: (widget.selectorOnly)\n            ? null\n            : FloatingActionBubble(\n                // Menu items\n                items: _bubbles(context),\n\n                // animation controller\n                animation: _animation,\n\n                // On pressed change animation state\n                onPress: () {\n                  if (multiselectMode) {\n                    deleteSelected(context);\n                  } else {\n                    _animationController.isCompleted\n                        ? _animationController.reverse()\n                        : _animationController.forward();\n                  }\n                },\n\n                // Floating Action button Icon color\n                iconColor: Colors.white,\n\n                // Flaoting Action button Icon\n                iconData: multiselectMode ? Icons.delete : Icons.add,\n                backGroundColor: Colors.blue,\n              ),\n      ),\n    );\n  }\n\n  List<Bubble> _bubbles(BuildContext context) {\n    return [\n      // Floating action menu item\n      if (_showHiddenSources)\n        Bubble(\n            title: \"Youtube\",\n            iconColor: Colors.white,\n            bubbleColor: Colors.red,\n            icon: Icons.ondemand_video_outlined,\n            titleStyle: const TextStyle(fontSize: 16, color: Colors.white),\n            onPress: () {\n              _animationController.reverse();\n              addFromYoutubeSource(context);\n            }),\n      if (_showHiddenSources)\n        Bubble(\n          title: \"Online Source\",\n          iconColor: Colors.white,\n          bubbleColor: Colors.blue,\n          icon: Icons.cloud,\n          titleStyle: const TextStyle(fontSize: 16, color: Colors.white),\n          onPress: () {\n            _animationController.reverse();\n            addFromOnlineSource(context);\n          },\n        ),\n      Bubble(\n        title: \"Media Library\",\n        iconColor: Colors.white,\n        bubbleColor: Colors.blue,\n        icon: Icons.library_music,\n        titleStyle: const TextStyle(fontSize: 16, color: Colors.white),\n        onPress: () {\n          _animationController.reverse();\n          if (PlatformUtils.isIOS) {\n            addFromFile();\n          } else {\n            addFromMediaLibrary(context);\n          }\n        },\n      ),\n      //Floating action menu item\n      Bubble(\n        title: \"File Browser\",\n        iconColor: Colors.white,\n        bubbleColor: Colors.blue,\n        icon: Icons.folder,\n        titleStyle: const TextStyle(fontSize: 16, color: Colors.white),\n        onPress: () {\n          _animationController.reverse();\n          if (PlatformUtils.isAndroid) {\n            addFromFile();\n          } else if (PlatformUtils.isIOS) {\n            addFromIosFile();\n          }\n        },\n      ),\n    ];\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/eventEditor.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/selectPreset.dart';\nimport 'package:mighty_plug_manager/UI/widgets/thickSlider.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/presets/preset_constants.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport '../models/trackAutomation.dart';\n\nclass EventEditor {\n  final AutomationEvent event;\n  final bool noneOption;\n  EventEditor({required this.event, required this.noneOption});\n\n  List<Widget> createPresetTiles(\n      context, dynamic preset, StateSetter setState) {\n    var tiles = <Widget>[];\n\n    Color color = preset != null\n        ? PresetConstants.channelColorsPlug[preset[\"channel\"]]\n        : Colors.white;\n    String category = preset != null\n        ? PresetsStorage().findCategoryOfPreset(preset)![\"name\"]\n        : \"\";\n    String name = preset != null ? \"$category/${preset['name']}\" : \"None\";\n    var tile = ListTile(\n      title: Text(\n        name,\n        style: TextStyle(color: color),\n      ),\n      trailing: const Icon(Icons.keyboard_arrow_right),\n      onTap: () {\n        showDialog(\n          context: context,\n          builder: (BuildContext context) =>\n              SelectPresetDialog().buildDialog(context, noneOption: noneOption),\n        ).then((value) {\n          if (value == false) {\n            event.setPresetUuid(\"\");\n          } else if (value != null) {\n            event.setPresetUuid(value['uuid']);\n          }\n          setState(() {});\n        });\n      },\n    );\n    tiles.add(tile);\n    return tiles;\n  }\n\n  Future buildDialog(BuildContext context) {\n    return showGeneralDialog(\n      context: context,\n      barrierDismissible:\n          true, // should dialog be dismissed when tapped outside\n      barrierLabel: \"Dialog\", // label for barrier\n      pageBuilder: (_, __, ___) {\n        // your widget implementation\n        return StatefulBuilder(\n          builder: (context, setState) {\n            var device = NuxDeviceControl.instance().device;\n            bool cab = device.cabinetSupport;\n            var preset =\n                PresetsStorage().findPresetByUuid(event.getPresetUuid());\n\n            return AlertDialog(\n              title: Row(\n                mainAxisAlignment: MainAxisAlignment.start,\n                children: [\n                  IconButton(\n                      icon: Icon(\n                        Icons.adaptive.arrow_back,\n                        color: Colors.white,\n                      ),\n                      onPressed: () => Navigator.of(context).pop()),\n                  const Text(\"Edit Event\",\n                      style: TextStyle(color: Colors.white)),\n                ],\n              ),\n              contentPadding: const EdgeInsets.only(\n                  left: 10, right: 10, bottom: 20, top: 30),\n              content: ListTileTheme(\n                iconColor: Colors.white,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    const Text(\"Preset\",\n                        style: TextStyle(\n                            color: Colors.white,\n                            fontSize: 16,\n                            fontWeight: FontWeight.bold)),\n                    ...createPresetTiles(context, preset, setState),\n                    if (cab) const Divider(),\n                    if (cab)\n                      CheckboxListTile(\n                        title: const Text(\"Cabinet level override\"),\n                        value: event.cabinetLevelOverrideEnable,\n                        onChanged: (val) {\n                          if (val == null) return;\n                          event.cabinetLevelOverrideEnable = val;\n                          setState(() {});\n                        },\n                      ),\n                    if (cab)\n                      ListTile(\n                        enabled: event.cabinetLevelOverrideEnable,\n                        title: SizedBox(\n                          height: 50,\n                          width: 1,\n                          child: ThickSlider(\n                            enabled: event.cabinetLevelOverrideEnable,\n                            activeColor: Colors.blue,\n                            min: device.decibelFormatter?.min.toDouble() ?? -6,\n                            max: device.decibelFormatter?.max.toDouble() ?? 6,\n                            value: event.cabinetLevelOverride,\n                            onChanged: (value, skip) {\n                              event.cabinetLevelOverride = value;\n                              setState(() {});\n                            },\n                            label: \"Level\",\n                            labelFormatter: (value) {\n                              return \"${value.toStringAsFixed(1)} db\";\n                            },\n                          ),\n                        ),\n                        trailing: IconButton(\n                          icon: const Icon(Icons.replay_sharp),\n                          onPressed: !event.cabinetLevelOverrideEnable\n                              ? null\n                              : () {\n                                  if (preset != null) {\n                                    event.cabinetLevelOverride =\n                                        preset[\"cabinet\"][\"level\"];\n                                  } else {\n                                    event.cabinetLevelOverride = 0;\n                                  }\n                                  setState(() {});\n                                },\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n            );\n          },\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/jamtracksView.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../setlist_player/setlistPlayerState.dart';\nimport 'setlistPlayer.dart';\n\nclass JamtracksView extends StatelessWidget {\n  final Widget child;\n  const JamtracksView({Key? key, required this.child}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    final SetlistPlayerState playerState = SetlistPlayerState.instance();\n    final bool playerVisible = SetlistPlayerState.instance().setlist != null &&\n        SetlistPlayerState.instance().currentTrack <\n            SetlistPlayerState.instance().setlist!.items.length;\n    return Stack(\n      alignment: Alignment.bottomCenter,\n      children: [\n        Padding(\n          padding: EdgeInsets.only(bottom: playerVisible ? 56 : 0),\n          child: child,\n        ),\n        if (playerVisible)\n          AnimatedSwitcher(\n            duration: const Duration(milliseconds: 250),\n            child: playerState.expanded\n                ? const SetlistPlayer()\n                : const SetlistMiniPlayer(),\n          )\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/loopPanel.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/numberPicker.dart';\nimport '../automationController.dart';\n\nclass LoopPanel extends StatelessWidget {\n  final AutomationController automation;\n  final Function(bool?) onLoopEnable;\n  final Function(bool) onUseLoopPoints;\n  final Function(int) onLoopTimes;\n  const LoopPanel({\n    Key? key,\n    required this.automation,\n    required this.onLoopEnable,\n    required this.onUseLoopPoints,\n    required this.onLoopTimes,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var dense = false;\n    var height = MediaQuery.of(context).size.height;\n    if (height < 600) dense = true;\n\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 24.0),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          /*ElevatedButton(\n            onPressed: () {\n              onAddLoop();\n            },\n            child: Text(\"Insert Loop Points\"),\n          ),\n          const SizedBox(\n            width: 8,\n          ),*/\n\n          CheckboxListTile(\n              title: const Text(\"Enable Loop\"),\n              value: automation.loopEnable,\n              dense: dense,\n              onChanged: onLoopEnable),\n          SwitchListTile(\n              title: const Text(\"Use Loop Points\"),\n              value: automation.useLoopPoints,\n              dense: dense,\n              onChanged:\n                  automation.loopEnable == false ? null : onUseLoopPoints),\n          if (!dense)\n            const SizedBox(\n              height: 8,\n            ),\n          Center(\n              child: Text(\n            \"Loop Times\",\n            style: TextStyle(\n                fontSize: dense ? 12 : 16,\n                color: automation.loopEnable ? Colors.white : Colors.grey[700]),\n          )),\n          AbsorbPointer(\n            absorbing: !automation.loopEnable,\n            child: NumberPicker(\n              axis: Axis.horizontal,\n              itemHeight: dense ? 50 : 70,\n              minValue: 0,\n              maxValue: 20,\n              selectedTextStyle: TextStyle(\n                  fontSize: 22,\n                  color:\n                      automation.loopEnable ? Colors.white : Colors.grey[700]),\n              textStyle: TextStyle(\n                  color:\n                      automation.loopEnable ? Colors.grey : Colors.grey[800]),\n              zeroSymbol: \"∞\",\n              value: automation.loopTimes,\n              onChanged: automation.loopEnable == false\n                  ? null\n                  : (value) {\n                      onLoopTimes(value);\n                    },\n            ),\n          )\n          /*Row(\n            children: [\n              Expanded(\n                child: ElevatedButton(\n                  child: Text(\"Edit\"),\n                  onPressed: automation.selectedEvent == null\n                      ? null\n                      : () {\n                          //onEditEvent(automation.selectedEvent!);\n                        },\n                ),\n              ),\n              const SizedBox(\n                width: 8,\n              ),\n              Expanded(\n                child: ElevatedButton(\n                  child: Text(\"Delete\"),\n                  onPressed: automation.selectedEvent == null\n                      ? null\n                      : () {\n                          //onDelete();\n                        },\n                ),\n              )\n            ],\n          ),*/\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/media_library/albumTracks.dart",
    "content": "// (c) 2020 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:on_audio_query_forked/on_audio_query.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\n\nclass AlbumTracks extends StatefulWidget {\n  final String albumName;\n  final String albumId;\n  final String artist;\n\n  const AlbumTracks(this.albumName, this.albumId, this.artist, {Key? key})\n      : super(key: key);\n\n  @override\n  State createState() => _AlbumTracksState();\n}\n\nclass _AlbumTracksState extends State<AlbumTracks> {\n  final OnAudioQuery audioQuery = OnAudioQuery();\n  late Future<List<SongModel>> songs;\n  late List<SongModel> songList;\n  bool _multiselectMode = false;\n  Map<int, bool> selected = {};\n\n  @override\n  void initState() {\n    super.initState();\n    songs = audioQuery.queryAudiosFrom(AudiosFromType.ALBUM_ID, widget.albumId);\n    //songs = audioQuery.getSongsFromArtistAlbum(\n    //    albumId: widget.albumId, artist: widget.artist);\n  }\n\n  void multiselectHandler(int index) {\n    if (selected.isEmpty || !selected.containsKey(index)) {\n      //fill it first if not created\n      selected[index] = true;\n      _multiselectMode = true;\n    } else {\n      selected.remove(index);\n      if (selected.isEmpty) _multiselectMode = false;\n    }\n    setState(() {});\n  }\n\n  void deselectAll() {\n    selected.clear();\n    _multiselectMode = false;\n    setState(() {});\n  }\n\n  Widget? createTrailingWidget(BuildContext context, int index) {\n    if (_multiselectMode) {\n      return Icon(\n        selected.containsKey(index)\n            ? Icons.check_circle\n            : Icons.brightness_1_outlined,\n        color: selected.containsKey(index) ? null : Colors.grey[800],\n      );\n    }\n\n    return null;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () {\n        //collapse player if extended\n\n        if (_multiselectMode) {\n          deselectAll();\n          return Future.value(false);\n        }\n\n        return Future.value(true);\n      },\n      child: Scaffold(\n        appBar: AppBar(title: Text(\"${widget.albumName} tracks\")),\n        body: FutureBuilder<List<SongModel>>(\n          future: songs,\n          builder: (context, snapshot) {\n            switch (snapshot.connectionState) {\n              case ConnectionState.none:\n                break;\n              case ConnectionState.waiting:\n                break;\n              case ConnectionState.active:\n                break;\n              case ConnectionState.done:\n                songList = snapshot.data!;\n                return ListTileTheme(\n                  selectedTileColor: const Color.fromARGB(255, 9, 51, 116),\n                  selectedColor: Colors.white,\n                  child: ListView.builder(\n                      itemCount: snapshot.data!.length,\n                      itemBuilder: (BuildContext ctxt, int index) {\n                        return Padding(\n                          padding: const EdgeInsets.symmetric(vertical: 2.0),\n                          child: ListTile(\n                              selected: _multiselectMode &&\n                                  selected.containsKey(index),\n                              onTap: () {\n                                if (_multiselectMode) {\n                                  multiselectHandler(index);\n                                  return;\n                                }\n                                //return list of 1 track\n                                Navigator.of(context)\n                                    .pop([snapshot.data![index]]);\n                              },\n                              onLongPress: () => multiselectHandler(index),\n                              title: Text(\n                                snapshot.data![index].title,\n                                style: const TextStyle(color: Colors.white),\n                              ),\n                              trailing: createTrailingWidget(context, index)),\n                        );\n                      }),\n                );\n            }\n            return const Text(\"Loading...\");\n          },\n        ),\n        floatingActionButton: _multiselectMode && selected.isNotEmpty\n            ? FloatingActionButton(\n                onPressed: () {\n                  List<SongModel> sel = [];\n                  for (int i = 0; i < selected.length; i++) {\n                    var index = selected.keys.elementAt(i);\n                    if (selected[index] == true) {\n                      sel.add(songList[index]);\n                    }\n                  }\n                  Navigator.of(context).pop(sel);\n                },\n                backgroundColor: Colors.blue,\n                foregroundColor: Colors.white,\n                shape: const StadiumBorder(),\n                child: const Icon(Icons.add),\n              )\n            : null,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/media_library/artistAlbums.dart",
    "content": "// (c) 2020 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:on_audio_query_forked/on_audio_query.dart';\n\nimport 'albumTracks.dart';\n\nclass ArtistAlbums extends StatelessWidget {\n  final String artist;\n  final int artistId;\n  final OnAudioQuery audioQuery = OnAudioQuery();\n  ArtistAlbums(this.artist, {Key? key, required this.artistId})\n      : super(key: key);\n  @override\n  Widget build(BuildContext context) {\n    Future<List> album = audioQuery.queryWithFilters(\n        artist, WithFiltersType.ALBUMS,\n        args: AlbumsArgs.ARTIST);\n\n    //Future<List<AlbumModel>> album =\n    //    audioQuery.getAlbumsFromArtist(artist: artist);\n    return Scaffold(\n      appBar: AppBar(title: Text(\"$artist albums\")),\n      body: FutureBuilder<List<dynamic>>(\n        future: album,\n        builder: (context, snapshot) {\n          switch (snapshot.connectionState) {\n            case ConnectionState.none:\n              break;\n            case ConnectionState.waiting:\n              break;\n            case ConnectionState.active:\n              break;\n            case ConnectionState.done:\n              return ListView.builder(\n                  itemCount: snapshot.data!.length,\n                  itemBuilder: (BuildContext ctxt, int index) {\n                    var albums = snapshot.data!;\n                    return Padding(\n                      padding: const EdgeInsets.symmetric(vertical: 2.0),\n                      child: ListTile(\n                          onTap: () async {\n                            var result = await Navigator.of(context).push(\n                                MaterialPageRoute(\n                                    builder: (context) => AlbumTracks(\n                                        albums[index][\"album\"],\n                                        albums[index][\"album_id\"],\n                                        albums[index][\"artist\"] ?? \"\")));\n                            if (result != null) {\n                              Navigator.of(context).pop(result);\n                            }\n                          },\n                          title: Text(\n                            snapshot.data![index][\"album\"],\n                            style: const TextStyle(color: Colors.white),\n                          ),\n                          trailing: const Icon(Icons.keyboard_arrow_right)),\n                    );\n                  });\n          }\n          return const Text(\"Loading...\");\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/media_library/media_browse.dart",
    "content": "// (c) 2020 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n//\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:on_audio_query_forked/on_audio_query.dart';\n\nimport 'artistAlbums.dart';\n\nclass MediaLibraryBrowser extends StatefulWidget {\n  const MediaLibraryBrowser({super.key});\n\n  @override\n  _MediaLibraryBrowserState createState() => _MediaLibraryBrowserState();\n}\n\nclass _MediaLibraryBrowserState extends State<MediaLibraryBrowser> {\n  final StreamController<String> _refreshController =\n      StreamController<String>();\n\n  //Future<List<SongInfo>> songs;\n  static List<ArtistModel> artists = [];\n\n  TextEditingController editingController = TextEditingController();\n\n  @override\n  void initState() {\n    super.initState();\n\n    getArtists(refresh: false);\n    editingController.addListener(() {\n      setState(() {});\n    });\n  }\n\n  Future<void> getArtists({bool refresh = true}) async {\n    final OnAudioQuery audioQuery = OnAudioQuery();\n    if (artists.isEmpty || refresh) artists = await audioQuery.queryArtists();\n    _refreshController.add(\"\");\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text(\"Media Library\")),\n      body: Center(\n        child: Column(\n          children: [\n            TextField(\n              controller: editingController,\n              decoration: const InputDecoration(\n                  labelText: \"Search\",\n                  hintText: \"Search\",\n                  prefixIcon: Icon(Icons.search),\n                  border: OutlineInputBorder(\n                      borderRadius: BorderRadius.all(Radius.circular(25.0)))),\n            ),\n            Expanded(\n              child: StreamBuilder<String>(\n                stream: _refreshController.stream,\n                builder: (context, snapshot) {\n                  switch (snapshot.connectionState) {\n                    case ConnectionState.none:\n                      break;\n                    case ConnectionState.waiting:\n                      break;\n                    case ConnectionState.active:\n                    case ConnectionState.done:\n                      List<ArtistModel> _artists;\n                      var searchText = editingController.text.toLowerCase();\n                      if (editingController.text.isNotEmpty) {\n                        _artists = <ArtistModel>[];\n                        for (var item in artists) {\n                          if (item.artist.toLowerCase().contains(searchText)) {\n                            _artists.add(item);\n                          }\n                        }\n                      } else {\n                        _artists = artists;\n                      }\n\n                      return RefreshIndicator(\n                        onRefresh: getArtists,\n                        child: ListView.builder(\n                            itemCount: _artists.length,\n                            itemBuilder: (BuildContext ctxt, int index) {\n                              return Padding(\n                                padding:\n                                    const EdgeInsets.symmetric(vertical: 2.0),\n                                child: ListTile(\n                                    onTap: () async {\n                                      var result = await Navigator.of(context)\n                                          .push(MaterialPageRoute(\n                                              builder: (context) =>\n                                                  ArtistAlbums(\n                                                      _artists[index].artist,\n                                                      artistId:\n                                                          _artists[index].id)));\n                                      if (result != null) {\n                                        Navigator.of(context).pop(result);\n                                      }\n                                    },\n                                    title: Text(\n                                      _artists[index].artist,\n                                    ),\n                                    trailing:\n                                        const Icon(Icons.keyboard_arrow_right)),\n                              );\n                            }),\n                      );\n                  }\n                  return const Center(\n                      child: CircularProgressIndicator.adaptive());\n                },\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/online_source/online_source.dart",
    "content": "// (c) 2020 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n//\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/backingTracksCoSource.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/guitarBackingTracksSource.dart';\n\nimport 'search_screen.dart';\n\nclass OnlineSourceSearch extends StatefulWidget {\n  const OnlineSourceSearch({Key? key}) : super(key: key);\n\n  @override\n  _OnlineSourceSearchState createState() => _OnlineSourceSearchState();\n}\n\nclass _OnlineSourceSearchState extends State<OnlineSourceSearch> {\n  int refreshTime = 1;\n  String path = \"\";\n\n  TextEditingController editingController = TextEditingController();\n\n  @override\n  void initState() {\n    super.initState();\n\n    editingController.addListener(() {\n      setState(() {});\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n        appBar: AppBar(title: const Text(\"Online Sources\")),\n        body: ListView(\n          children: [\n            ListTile(\n                leading: const Icon(Icons.cloud),\n                onTap: () async {\n                  var result = await Navigator.of(context).push(\n                      MaterialPageRoute(\n                          builder: (context) => OnlineSearchScreen(\n                              source: GuitarBackingTracksSource())));\n                  if (result != null) Navigator.of(context).pop(result);\n                },\n                title: const Text(\"guitarbackingtracks.com\"),\n                trailing: const Icon(Icons.keyboard_arrow_right)),\n            ListTile(\n                leading: const Icon(Icons.cloud),\n                onTap: () async {\n                  var result = await Navigator.of(context).push(\n                      MaterialPageRoute(\n                          builder: (context) => OnlineSearchScreen(\n                              source: BackingTracksCoSource())));\n                  if (result != null) Navigator.of(context).pop(result);\n                },\n                title: const Text(\"backingtracks.co\"),\n                trailing: const Icon(Icons.keyboard_arrow_right))\n          ],\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/online_source/search_screen.dart",
    "content": "// (c) 2020 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n//\n\nimport 'package:flutter/material.dart';\nimport 'package:just_audio/just_audio.dart';\nimport 'package:mighty_plug_manager/UI/widgets/common/nestedWillPopScope.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/onlineSource.dart';\nimport 'package:flutter_typeahead/flutter_typeahead.dart';\nimport 'package:mighty_plug_manager/audio/online_sources/onlineTrack.dart';\n\nclass OnlineSearchScreen extends StatefulWidget {\n  final OnlineSource source;\n\n  const OnlineSearchScreen({Key? key, required this.source}) : super(key: key);\n\n  @override\n  State createState() => _OnlineSearchScreenState();\n}\n\nclass _OnlineSearchScreenState extends State<OnlineSearchScreen> {\n  List<OnlineTrack> tracks = [];\n  bool loading = false;\n\n  TextEditingController editingController = TextEditingController();\n\n  AudioPlayer? player;\n  int? playedTrack;\n\n  //multiselection\n  bool _multiselectMode = false;\n  Map<int, bool> selected = {};\n\n  @override\n  void initState() {\n    super.initState();\n\n    editingController.addListener(() {\n      setState(() {});\n    });\n  }\n\n  void multiselectHandler(int index) {\n    if (selected.isEmpty || !selected.containsKey(index)) {\n      //fill it first if not created\n      selected[index] = true;\n      _multiselectMode = true;\n    } else {\n      selected.remove(index);\n      if (selected.isEmpty) _multiselectMode = false;\n    }\n    setState(() {});\n  }\n\n  void deselectAll() {\n    selected.clear();\n    _multiselectMode = false;\n    setState(() {});\n  }\n\n  Widget? createTrailingWidget(BuildContext context, int index) {\n    if (_multiselectMode) {\n      return Icon(\n        selected.containsKey(index)\n            ? Icons.check_circle\n            : Icons.brightness_1_outlined,\n        color: selected.containsKey(index) ? null : Colors.grey[800],\n      );\n    }\n\n    return null;\n  }\n\n  void onSubmit() async {\n    setState(() {\n      loading = true;\n    });\n    tracks = await widget.source.getSearchResults(editingController.text);\n    setState(() {\n      loading = false;\n    });\n  }\n\n  void closeTrack() {\n    player?.dispose();\n    player = null;\n    playedTrack = null;\n    setState(() {});\n  }\n\n  void previewPlay(int index) async {\n    if (playedTrack != null && index == playedTrack) {\n      // player?.pause();\n      // setState(() {});\n      return;\n    }\n    await player?.dispose();\n\n    if (tracks[index].url == \"\") {\n      tracks[index].url = await widget.source.getPreviewUrl(tracks[index]);\n    }\n\n    var as = ProgressiveAudioSource(Uri.parse(tracks[index].url));\n    player = AudioPlayer();\n    await player?.setAudioSource(as);\n    player?.play();\n    player?.positionStream.listen((event) {\n      setState(() {});\n    });\n    print(\"index $index\");\n    playedTrack = index;\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return NestedWillPopScope(\n      onWillPop: () {\n        if (_multiselectMode) {\n          deselectAll();\n          return Future.value(false);\n        }\n\n        closeTrack();\n        return Future.value(true);\n      },\n      child: Scaffold(\n        appBar: AppBar(title: Text(widget.source.name)),\n        body: ListTileTheme(\n          minLeadingWidth: 0,\n          selectedTileColor: const Color.fromARGB(255, 9, 51, 116),\n          selectedColor: Colors.white,\n          child: Column(\n            children: [\n              TypeAheadField(\n                builder: (context, controller, focusNode) {\n                  return TextField(\n                      autofocus: true,\n                      controller: editingController,\n                      onSubmitted: (value) => onSubmit(),\n                      decoration: const InputDecoration(\n                        border: OutlineInputBorder(),\n                        hintText: \"Search\",\n                        prefixIcon: Icon(Icons.search),\n                      ));\n                },\n                suggestionsCallback: (pattern) async {\n                  return await widget.source.getSuggestions(pattern);\n                },\n                itemBuilder: (context, suggestion) {\n                  return ListTile(\n                    title: Text(suggestion.toString()),\n                  );\n                },\n                onSelected: (suggestion) async {\n                  editingController.text = suggestion.toString();\n                  onSubmit();\n                },\n              ),\n              Expanded(\n                child: IndexedStack(\n                  alignment: Alignment.center,\n                  index: loading == true ? 0 : 1,\n                  children: [\n                    const CircularProgressIndicator.adaptive(),\n                    ListView.builder(\n                      itemBuilder: (context, index) {\n                        return ListTile(\n                            selected:\n                                _multiselectMode && selected.containsKey(index),\n                            onTap: () async {\n                              if (_multiselectMode) {\n                                multiselectHandler(index);\n                                return;\n                              }\n                              //return list of 1 track\n                              tracks[index].url = await widget.source\n                                  .getTrackUri(tracks[index]);\n                              closeTrack();\n                              Navigator.of(context).pop([tracks[index]]);\n                            },\n                            onLongPress: () => multiselectHandler(index),\n                            leading: ColoredBox(\n                              color: Colors.red,\n                              child: IconButton(\n                                icon: Icon(\n                                  index == playedTrack\n                                      ? Icons.pause\n                                      : Icons.play_arrow,\n                                  size: 30,\n                                ),\n                                onPressed: () => previewPlay(index),\n                              ),\n                            ),\n                            title: Text(tracks[index].artist),\n                            subtitle: Text(tracks[index].title),\n                            trailing: createTrailingWidget(context, index));\n                      },\n                      itemCount: tracks.length,\n                    ),\n                  ],\n                ),\n              ),\n              if (player != null)\n                ListTile(\n                  title: Slider(\n                    max: player?.duration?.inSeconds.toDouble() ?? 1,\n                    value: player?.position.inSeconds.toDouble() ?? 0,\n                    onChanged: (value) {\n                      player?.seek(Duration(seconds: value.round()));\n                      setState(() {});\n                    },\n                  ),\n                  trailing: IconButton(\n                    icon: const Icon(Icons.close),\n                    onPressed: closeTrack,\n                  ),\n                )\n            ],\n          ),\n        ),\n        floatingActionButton: _multiselectMode && selected.isNotEmpty\n            ? FloatingActionButton(\n                onPressed: () async {\n                  List<OnlineTrack> sel = [];\n                  for (int i = 0; i < selected.length; i++) {\n                    var index = selected.keys.elementAt(i);\n                    if (selected[index] == true) {\n                      tracks[index].url =\n                          await widget.source.getTrackUri(tracks[index]);\n                      sel.add(tracks[index]);\n                    }\n                  }\n                  closeTrack();\n                  Navigator.of(context).pop(sel);\n                },\n                backgroundColor: Colors.blue,\n                foregroundColor: Colors.white,\n                shape: const StadiumBorder(),\n                child: const Icon(Icons.add),\n              )\n            : null,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/painted_waveform.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/models/trackAutomation.dart';\nimport 'package:mighty_plug_manager/audio/models/waveform_data.dart';\nimport 'package:mighty_plug_manager/audio/widgets/waveform_painter.dart';\n\nimport '../automationController.dart';\n\nclass PaintedWaveform extends StatefulWidget {\n  final double dragHandlesheight = 56;\n  final Function(int) onWaveformTap;\n  final Function onEventSelectionChanged;\n  final WaveformData? sampleData;\n  final int currentSample;\n  final AutomationEventType? showType;\n  final AutomationController automation;\n  final Function(double, double) onTimingData;\n  final List<Color> channelColors;\n  const PaintedWaveform(\n      {Key? key,\n      required this.sampleData,\n      required this.onWaveformTap,\n      required this.onEventSelectionChanged,\n      required this.currentSample,\n      required this.automation,\n      required this.showType,\n      required this.onTimingData,\n      required this.channelColors})\n      : super(key: key);\n\n  @override\n  _PaintedWaveformState createState() => _PaintedWaveformState();\n}\n\nclass _PaintedWaveformState extends State<PaintedWaveform> {\n  int startPosition = 0;\n  int endPosition = 0;\n\n  double canvasSize = 0;\n\n  late Offset _startingFocalPoint;\n\n  double _previousOffset = 0;\n  double _offset = 0; // where the top left corner of the waveform is drawn\n\n  double _previousScale = 0;\n  double _scale = 0;\n  bool isSingle = true;\n\n  bool layoutBuilt = false;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  void initScaling() {\n    endPosition = widget.sampleData!.data.length - 1;\n\n    //get initial scale. endPosition is essentialy waveform width\n    _scale = canvasSize / endPosition;\n\n    double fitted = endPosition * _scale;\n\n    _offset = canvasSize - fitted;\n    layoutBuilt = true;\n  }\n\n  void scroll(d) {\n    if (widget.sampleData == null) return;\n    var _fullScale = widget.sampleData!.data.length / canvasSize;\n    var _position = (d.localPosition.dx * _fullScale).round();\n    var _extent = ((endPosition - startPosition) / 2).round();\n\n    if (_position - _extent < 0) _position = _extent;\n    if (_position + _extent > widget.sampleData!.data.length - 1) {\n      _position = widget.sampleData!.data.length - 1 - _extent;\n    }\n    startPosition = _position - _extent;\n    endPosition = _position + _extent;\n    _offset = -_scale * startPosition;\n    setState(() {});\n  }\n\n  void zoomViewOnTapUp(TapUpDetails e) {\n    {\n      int sample =\n          ((e.localPosition.dx / canvasSize) * (endPosition - startPosition) +\n                  startPosition)\n              .floor();\n      widget.onWaveformTap.call(sample);\n    }\n  }\n\n  void zoomViewScaleStart(ScaleStartDetails d) {\n    _startingFocalPoint = d.focalPoint;\n    _previousOffset = _offset;\n    _previousScale = _scale;\n  }\n\n  void zoomViewScaleUpdate(ScaleUpdateDetails d) {\n    if (d.scale == 1) {\n      isSingle = true;\n      //return;\n    }\n\n    isSingle = false;\n    double newScale = _previousScale * d.scale;\n    //if (newScale > 50 || newScale < 0.01) {\n    //  return;\n    //}\n\n    // Ensure that item under the focal point stays in the same place despite zooming\n    final double normalizedOffset =\n        (_startingFocalPoint.dx - _previousOffset) / _previousScale;\n    final double newOffset = d.focalPoint.dx - normalizedOffset * newScale;\n\n    setState(() {\n      var _oldScale = _scale;\n      var _oldOffset = _offset;\n      _scale = newScale;\n      _offset = newOffset;\n\n      //limit left boundary\n      if (_offset > 0) {\n        _offset = 0;\n      }\n\n      startPosition = -(_offset / _scale).round();\n\n      //limit right boundary\n      if (canvasSize / _scale + startPosition >\n          widget.sampleData!.data.length - 1) {\n        _offset = _oldOffset;\n        //i think we should not manipulate the scale\n        //we should adjust the offset\n        endPosition = widget.sampleData!.data.length - 1;\n\n        //calculate offset based on end position and new scale\n        startPosition = endPosition - (canvasSize / _scale).round();\n\n        _scale = _oldScale;\n\n        if (startPosition < 0) startPosition = 0;\n      } else {\n        endPosition = (startPosition + canvasSize / _scale).round();\n      }\n    });\n  }\n\n  Widget _eventPointer(\n      AutomationEvent event, double msPerSample, double samplesPerPixel) {\n    bool empty = event.type == AutomationEventType.preset &&\n        event.getPresetUuid().isEmpty;\n\n    return Positioned(\n      left: (((event.eventTime.inMilliseconds * msPerSample) - startPosition) /\n                  (endPosition - startPosition)) *\n              canvasSize -\n          widget.dragHandlesheight / 2 -\n          9,\n      child: GestureDetector(\n        onHorizontalDragUpdate: (d) {\n          widget.automation.selectedEvent = event;\n          //get samples per pixel\n\n          setState(() {\n            event.eventTime += Duration(\n                milliseconds:\n                    (d.delta.dx * (samplesPerPixel / msPerSample)).round());\n          });\n        },\n        onHorizontalDragEnd: (d) {\n          widget.automation.selectedEvent = event;\n          widget.onEventSelectionChanged();\n          widget.automation.sortEvents();\n          //update automation\n          setState(() {});\n        },\n        child: ClipPath(\n          clipper: GuitarPickClipper(),\n          child: ElevatedButton(\n              onPressed: () {\n                widget.automation.selectedEvent = event;\n                widget.onEventSelectionChanged();\n                setState(() {});\n              },\n              style: ElevatedButton.styleFrom(\n                shape: const CircleBorder(),\n                padding: const EdgeInsets.fromLTRB(24, 20, 24, 15),\n                backgroundColor: empty\n                    ? Colors.grey\n                    : widget.channelColors[event.channel], // <-- Button color\n                foregroundColor: Colors.black, // <-- Splash color\n              ),\n              child: Icon(widget.automation.selectedEvent == event\n                  ? Icons.circle\n                  : null)),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget build(context) {\n    double msPerSample = 0;\n    //double time = 0;\n    List<Widget> automationEventButtons = <Widget>[];\n\n    if (layoutBuilt == true && widget.sampleData != null) {\n      msPerSample = widget.sampleData!.data.length /\n          widget.automation.duration.inMilliseconds;\n\n      var samplesPerPixel = ((endPosition - startPosition) / canvasSize);\n      widget.onTimingData(samplesPerPixel, msPerSample);\n      //time = (widget.currentSample / msPerSample) / 1000;\n      //create automation event handles (TODO: move them in separate widget)\n\n      for (int i = 0; i < widget.automation.events.length; i++) {\n        var element = widget.automation.events[i];\n\n        if (element.type != widget.showType) continue;\n        Widget w = _eventPointer(element, msPerSample, samplesPerPixel);\n\n        automationEventButtons.add(w);\n      }\n    }\n    return ColoredBox(\n      color: Colors.grey[900]!,\n      child: LayoutBuilder(\n        builder: (context, BoxConstraints constraints) {\n          // adjust the shape based on parent's orientation/shape\n\n          if (canvasSize == 0 && widget.sampleData != null) {\n            canvasSize = constraints.maxWidth;\n            initScaling();\n          }\n\n          return Column(\n            children: [\n              Expanded(\n                flex: 1,\n                child: GestureDetector(\n                  behavior: HitTestBehavior.translucent,\n                  onTapUp: scroll,\n                  onHorizontalDragUpdate: scroll,\n                  child: CustomPaint(\n                    size: Size(\n                      constraints.maxWidth,\n                      constraints.maxHeight,\n                    ),\n                    foregroundPainter: WaveformPainter(\n                      widget.sampleData,\n                      endingFrame: endPosition,\n                      startingFrame: startPosition,\n                      currentSample: widget.currentSample,\n                      automation: widget.automation,\n                      showType: widget.showType,\n                      overallWaveform: true,\n                      color: const Color(0xff3994DB),\n                    ),\n                  ),\n                ),\n              ),\n              Expanded(\n                flex: 2,\n                child: GestureDetector(\n                  behavior: HitTestBehavior.translucent,\n                  onTapUp: zoomViewOnTapUp,\n                  onScaleStart: zoomViewScaleStart,\n                  onScaleUpdate: zoomViewScaleUpdate,\n                  child: CustomPaint(\n                    size: Size(\n                      constraints.maxWidth,\n                      constraints.maxHeight,\n                    ),\n                    foregroundPainter: WaveformPainter(\n                      widget.sampleData,\n                      endingFrame: endPosition,\n                      startingFrame: startPosition,\n                      currentSample: widget.currentSample,\n                      overallWaveform: false,\n                      automation: widget.automation,\n                      showType: widget.showType,\n                      color: const Color(0xff3994DB),\n                    ),\n                  ),\n                ),\n              ),\n              //container for event handles\n              Container(\n                decoration: BoxDecoration(\n                    border: Border.all(color: Colors.grey),\n                    color: Colors.black),\n                height: widget.dragHandlesheight,\n                child: Stack(\n                  children: automationEventButtons,\n                ),\n              ),\n              //Text(time.floor().toString())\n            ],\n          );\n        },\n      ),\n    );\n  }\n}\n\nclass GuitarPickClipper extends CustomClipper<Path> {\n  @override\n  getClip(Size size) {\n    var path = Path();\n    path.moveTo(size.width * 0.5, 0);\n    path.cubicTo(size.width * 0.9, size.height * 0.5, size.width * 0.9,\n        size.height * 0.9, size.width * 0.5, size.height * 0.9);\n    path.cubicTo(size.width * 0.1, size.height * 0.9, size.width * 0.1,\n        size.height * 0.5, size.width * 0.5, 0);\n    return path;\n  }\n\n  @override\n  bool shouldReclip(CustomClipper oldClipper) {\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/presetsPanel.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/popups/selectPreset.dart';\nimport 'package:mighty_plug_manager/audio/models/trackAutomation.dart';\nimport '../automationController.dart';\n\nclass PresetsPanel extends StatelessWidget {\n  final AutomationController automation;\n  final Function(Map<String, dynamic>) onSelectedPreset;\n  final Function(AutomationEvent) onDuplicateEvent;\n  final Function(AutomationEvent, bool) onEditEvent;\n  final Function onDelete;\n  const PresetsPanel(\n      {Key? key,\n      required this.onSelectedPreset,\n      required this.automation,\n      required this.onDelete,\n      required this.onEditEvent,\n      required this.onDuplicateEvent})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 24.0),\n      child: ListView(\n        //crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          Row(\n            children: [\n              Expanded(\n                child: ElevatedButton(\n                  onPressed: () {\n                    showDialog(\n                      context: context,\n                      builder: (BuildContext context) => SelectPresetDialog()\n                          .buildDialog(context, noneOption: false),\n                    ).then((value) {\n                      if (value != null) {\n                        onSelectedPreset(value);\n                      }\n                    });\n                  },\n                  child: const Text(\"Insert Event\"),\n                ),\n              ),\n              const SizedBox(\n                width: 8,\n              ),\n              Expanded(\n                child: ElevatedButton(\n                  onPressed: automation.selectedEvent != null\n                      ? () {\n                          onDuplicateEvent(automation.selectedEvent!);\n                        }\n                      : null,\n                  child: const Text(\"Duplicate\"),\n                ),\n              ),\n            ],\n          ),\n          Row(\n            children: [\n              Expanded(\n                child: ElevatedButton(\n                  onPressed: automation.selectedEvent == null\n                      ? null\n                      : () {\n                          onEditEvent(automation.selectedEvent!, false);\n                        },\n                  child: const Text(\"Edit\"),\n                ),\n              ),\n              const SizedBox(\n                width: 8,\n              ),\n              Expanded(\n                child: ElevatedButton(\n                  onPressed: automation.selectedEvent == null\n                      ? null\n                      : () {\n                          onDelete();\n                        },\n                  child: const Text(\"Delete\"),\n                ),\n              )\n            ],\n          ),\n          MaterialButton(\n            color: automation.initialEvent.getPresetUuid() == \"\"\n                ? Colors.orange[700]\n                : Colors.blue,\n            textColor: Colors.white,\n            child: const Text(\"Edit Initial Parameters\"),\n            onPressed: () {\n              onEditEvent(automation.initialEvent, true);\n            },\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/setlistPlayer.dart",
    "content": "import 'dart:async';\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart';\nimport 'package:marquee_text/marquee_text.dart';\nimport 'package:mighty_plug_manager/UI/widgets/thickSlider.dart';\nimport '../../UI/mightierIcons.dart';\nimport '../../UI/widgets/VolumeDrawer.dart';\nimport '../../bluetooth/NuxDeviceControl.dart';\nimport '../../platform/platformUtils.dart';\nimport '../../platform/simpleSharedPrefs.dart';\nimport '../automationController.dart';\nimport '../setlist_player/setlistPlayerState.dart';\nimport 'speedPanel.dart';\n\nclass SetlistPlayer extends StatefulWidget {\n  const SetlistPlayer({Key? key}) : super(key: key);\n\n  @override\n  State<SetlistPlayer> createState() => _SetlistPlayerState();\n}\n\nclass _SetlistPlayerState extends State<SetlistPlayer> {\n  final animationDuration = const Duration(milliseconds: 200);\n  final SetlistPlayerState playerState = SetlistPlayerState.instance();\n  StreamSubscription? _positionSub;\n\n  @override\n  void initState() {\n    super.initState();\n    playerState.addListener(_onPlayerStateChange);\n    _positionSub = playerState.positionStream.listen(_onPlayerPosition);\n    NuxDeviceControl().addListener(_onPlayerStateChange);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    playerState.removeListener(_onPlayerStateChange);\n    NuxDeviceControl().removeListener(_onPlayerStateChange);\n    _positionSub?.cancel();\n  }\n\n  void _onPlayerPosition(Duration position) {\n    setState(() {});\n  }\n\n  void _onPlayerStateChange() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return createPlayerView(context);\n  }\n\n  Widget? createTitle() {\n    return MarqueeText(\n      text: TextSpan(\n          text: playerState.setlist?.items[playerState.currentTrack]\n                  .trackReference?.name ??\n              \"No Track\"),\n      speed: 20,\n    );\n  }\n\n  Widget createPlayerView(BuildContext context) {\n    return LayoutBuilder(builder: (context, constraints) {\n      return Material(\n        color: Theme.of(context).scaffoldBackgroundColor,\n        child: ListView(\n          //crossAxisAlignment: CrossAxisAlignment.stretch,\n          //physics: const NeverScrollableScrollPhysics(),\n          children: [\n            ListTile(\n              tileColor: Colors.grey[850],\n              leading: IconButton(\n                iconSize: 32,\n                onPressed: playerState.toggleExpanded,\n                icon: const Icon(Icons.keyboard_arrow_down),\n              ),\n              title: createTitle(),\n            ),\n            Row(\n              mainAxisSize: MainAxisSize.max,\n              mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n              children: createFullTrackControls(constraints),\n            ),\n            Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 12.0),\n              child: Row(\n                children: [\n                  Text(playerState.getMMSS(playerState.currentPosition)),\n                  Expanded(\n                      child: SliderTheme(\n                    data: SliderThemeData(\n                        trackShape: SliderRepeatTrackShape(state: playerState)),\n                    child: Slider(\n                      value:\n                          playerState.currentPosition.inMilliseconds.toDouble(),\n                      onChanged: (value) {\n                        setState(() {\n                          playerState.setPosition(value.round());\n                        });\n                      },\n                      max: playerState.getDuration().inMilliseconds.toDouble(),\n                      onChangeStart: (val) {\n                        playerState.setPositionUpdateMode(true);\n                      },\n                      onChangeEnd: (val) {\n                        playerState.setPosition(val.round());\n                        playerState.setPositionUpdateMode(false);\n                      },\n                    ),\n                  )),\n                  Text(playerState.getMMSS(playerState.getDuration()))\n                ],\n              ),\n            ),\n            /*ListTile(\n              title: Text(\"Current preset: aoufh\"),\n            ),*/\n            CheckboxListTile(\n                title: const Text(\"Auto Advance\"),\n                value: playerState.autoAdvance,\n                onChanged: (value) {\n                  playerState.autoAdvance = value ?? true;\n                  setState(() {});\n                }),\n            if (playerState.automation != null &&\n                playerState.automation!.loopEnable &&\n                playerState.automation!.abRepeatState != ABRepeatState.addedB)\n              ListTile(\n                title: Text(\"Loop ${createLoopLabel()}\"),\n                trailing: ElevatedButton(\n                  child: const Text(\"Cancel Loop\"),\n                  onPressed: () {\n                    playerState.automation?.forceLoopDisable();\n\n                    setState(() {});\n                  },\n                ),\n              ),\n            SpeedPanel(\n              compact: true,\n              onSemitonesChanged: (val) {\n                playerState.pitch = val;\n                playerState.automation?.setPitch(val);\n                setState(() {});\n              },\n              onSpeedChanged: (speed) {\n                playerState.speed = speed;\n                playerState.automation?.setSpeed(speed);\n                setState(() {});\n              },\n              semitones: playerState.pitch,\n              speed: playerState.speed,\n            ),\n            if (PlatformUtils.isAndroid)\n              ThickSlider(\n                activeColor: playerState.gain <= 0\n                    ? Colors.blue\n                    : playerState.gain < 12\n                        ? Colors.amber\n                        : Colors.red,\n                label: \"Track Gain\",\n                value: playerState.gain,\n                min: -20,\n                max: 20,\n                snapToCenter: true,\n                labelFormatter: (val) =>\n                    \"${playerState.gain.toStringAsFixed(1)} db\",\n                onChanged: (value, skip) {\n                  playerState.gain = value;\n                  setState(() {});\n                },\n                onDragEnd: (value) {\n                  SharedPrefs()\n                      .setValue(SettingsKeys.trackGain, playerState.gain);\n                },\n              ),\n            const VolumeSlider(label: \"Amp Volume\")\n          ],\n        ),\n      );\n    });\n  }\n\n  String createLoopLabel() {\n    if (playerState.automation!.loopTimes == 0) return \"∞\";\n    return \"${playerState.automation!.currentLoop}/${playerState.automation!.loopTimes}\";\n  }\n\n  IconData getABRepeatIcon() {\n    switch (SetlistPlayerState.instance().abRepeat) {\n      case ABRepeatState.off:\n        return MightierIcons.repeat;\n      case ABRepeatState.addedA:\n        return MightierIcons.repeat_a;\n      case ABRepeatState.addedB:\n        return MightierIcons.repeat_ab;\n    }\n  }\n\n  List<Widget> createFullTrackControls(BoxConstraints constraints) {\n    var totalIconSize = constraints.maxWidth.floorToDouble() / 6;\n    totalIconSize = math.min(totalIconSize, 70);\n    var iconSize = totalIconSize - 14;\n    var padding = const EdgeInsets.all(7);\n    return [\n      IconButton(\n        padding: padding,\n        onPressed: () {\n          playerState.previous();\n        },\n        iconSize: iconSize,\n        icon: const Icon(\n          Icons.skip_previous,\n          color: Colors.white,\n        ),\n      ),\n      IconButton(\n        padding: padding,\n        onPressed: () {\n          playerState.setPosition(\n              (playerState.currentPosition + const Duration(seconds: -5))\n                  .inMilliseconds);\n        },\n        iconSize: iconSize,\n        icon: const Icon(\n          Icons.fast_rewind,\n          color: Colors.white,\n        ),\n      ),\n      IconButton(\n        padding: padding,\n        onPressed: () {\n          playerState.playPause();\n        },\n        iconSize: iconSize,\n        icon: Icon(\n          playerState.state == PlayerState.play\n              ? Icons.pause\n              : Icons.play_arrow,\n          color: Colors.white,\n        ),\n      ),\n      IconButton(\n        padding: padding,\n        onPressed: () {\n          playerState.setPosition(\n              (playerState.currentPosition + const Duration(seconds: 5))\n                  .inMilliseconds);\n        },\n        iconSize: iconSize,\n        icon: const Icon(\n          Icons.fast_forward,\n          color: Colors.white,\n        ),\n      ),\n      IconButton(\n        padding: padding,\n        onPressed: playerState.next,\n        iconSize: iconSize,\n        icon: const Icon(\n          Icons.skip_next,\n          color: Colors.white,\n        ),\n      ),\n      IconButton(\n        padding: padding,\n        onPressed: playerState.toggleABRepeat,\n        iconSize: iconSize,\n        icon: Icon(\n          getABRepeatIcon(),\n          color: Colors.white,\n        ),\n      ),\n    ];\n  }\n}\n\nclass SliderRepeatTrackShape extends RoundedRectSliderTrackShape {\n  final SetlistPlayerState state;\n  double p1 = 0, p2 = 0;\n  bool loopEnabled = false;\n  final Paint repeatPaintOff = Paint()\n    ..style = PaintingStyle.stroke\n    ..color = Colors.grey[700]!\n    ..strokeWidth = 2;\n  final Paint repeatPaint = Paint()\n    ..style = PaintingStyle.stroke\n    ..color = Colors.green\n    ..strokeWidth = 2;\n  SliderRepeatTrackShape({required this.state}) {\n    if (state.automation != null && state.automation!.loopEnable == true) {\n      loopEnabled = true;\n      var points = state.automation!.getLoopPoints();\n      var dur = state.automation!.duration.inMicroseconds;\n      if (points.length == 2 && state.automation!.useLoopPoints) {\n        p1 = points[0].eventTime.inMicroseconds / dur;\n        p2 = points[1].eventTime.inMicroseconds / dur;\n      } else if (!state.automation!.useLoopPoints) {\n        p1 = 0;\n        p2 = 1;\n      }\n    }\n  }\n\n  @override\n  void paint(\n    PaintingContext context,\n    Offset offset, {\n    required RenderBox parentBox,\n    required SliderThemeData sliderTheme,\n    required Animation<double> enableAnimation,\n    required TextDirection textDirection,\n    required Offset thumbCenter,\n    Offset? secondaryOffset,\n    bool isDiscrete = false,\n    bool isEnabled = false,\n    double additionalActiveTrackHeight = 2,\n  }) {\n    final Rect trackRect = getPreferredRect(\n      parentBox: parentBox,\n      offset: offset,\n      sliderTheme: sliderTheme,\n      isEnabled: isEnabled,\n      isDiscrete: isDiscrete,\n    );\n\n    if (state.automation != null && loopEnabled) {\n      var pos1 = (trackRect.right - trackRect.left) * p1 + trackRect.left;\n      var pos2 = (trackRect.right - trackRect.left) * p2 + trackRect.left;\n      var posPercentage = state.currentPosition.inMicroseconds /\n          state.automation!.duration.inMicroseconds;\n\n      var paint = repeatPaintOff;\n      if (posPercentage >= p1 &&\n          (state.automation!.loopTimes == 0 ||\n              state.automation!.currentLoop < state.automation!.loopTimes)) {\n        paint = repeatPaint;\n      }\n      context.canvas.drawRect(\n          Rect.fromLTRB(\n            pos1,\n            (textDirection == TextDirection.ltr)\n                ? trackRect.top - additionalActiveTrackHeight * 4\n                : trackRect.top,\n            pos2,\n            (textDirection == TextDirection.ltr)\n                ? trackRect.bottom + additionalActiveTrackHeight * 4\n                : trackRect.bottom,\n          ),\n          paint);\n    }\n    super.paint(context, offset,\n        parentBox: parentBox,\n        sliderTheme: sliderTheme,\n        enableAnimation: enableAnimation,\n        textDirection: textDirection,\n        thumbCenter: thumbCenter);\n  }\n}\n\nclass SetlistMiniPlayer extends StatefulWidget {\n  const SetlistMiniPlayer({Key? key}) : super(key: key);\n\n  @override\n  State<SetlistMiniPlayer> createState() => SetlistMiniPlayerState();\n}\n\nclass SetlistMiniPlayerState extends State<SetlistMiniPlayer> {\n  final SetlistPlayerState playerState = SetlistPlayerState.instance();\n  StreamSubscription? _positionSub;\n\n  @override\n  void initState() {\n    super.initState();\n    playerState.addListener(_onPlayerStateChange);\n    _positionSub = playerState.positionStream.listen(_opPlayerPosition);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    playerState.removeListener(_onPlayerStateChange);\n    _positionSub?.cancel();\n  }\n\n  void _opPlayerPosition(Duration position) {\n    setState(() {});\n  }\n\n  void _onPlayerStateChange() {\n    setState(() {});\n  }\n\n  Widget? createTitle() {\n    return MarqueeText(\n      text: TextSpan(\n          text: playerState.setlist?.items[playerState.currentTrack]\n                  .trackReference?.name ??\n              \"No Track\"),\n      speed: 20,\n    );\n  }\n\n  List<Widget> createMiniTrackControls() {\n    return [\n      IconButton(\n        onPressed: playerState.playPause,\n        icon: Icon(\n          playerState.state == PlayerState.play\n              ? Icons.pause\n              : Icons.play_arrow,\n          color: Colors.white,\n          size: 30,\n        ),\n      ),\n      IconButton(\n        onPressed: playerState.next,\n        icon: const Icon(\n          Icons.skip_next,\n          color: Colors.white,\n          size: 30,\n        ),\n      )\n    ];\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      color: Colors.grey[850],\n      child: ListTile(\n        onTap: playerState.toggleExpanded,\n        leading: IconButton(\n          iconSize: 32,\n          onPressed: playerState.toggleExpanded,\n          icon: const Icon(Icons.keyboard_arrow_up),\n        ),\n        minLeadingWidth: 0,\n        title: createTitle(),\n        trailing: Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            mainAxisSize: MainAxisSize.min,\n            children: createMiniTrackControls()),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/speedPanel.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport '../../UI/widgets/hold_to_repeat.dart';\nimport '../../platform/platformUtils.dart';\n\nclass SpeedPanel extends StatelessWidget {\n  final double speed;\n  final int semitones;\n  final bool compact;\n  final Function(double) onSpeedChanged;\n  final Function(int) onSemitonesChanged;\n\n  const SpeedPanel(\n      {Key? key,\n      required this.speed,\n      required this.semitones,\n      required this.onSpeedChanged,\n      required this.onSemitonesChanged,\n      this.compact = false})\n      : super(key: key);\n\n  void _modifySpeed(double amount) {\n    var _speed = speed + amount;\n\n    _speed = min(max(_speed, 0.1), 2.5);\n    onSpeedChanged(_speed);\n  }\n\n  void _modifyPitch(int amount) {\n    var _semitones = semitones + amount;\n    _semitones = min(max(_semitones, -12), 12);\n    onSemitonesChanged(_semitones);\n  }\n\n  Widget _speedControl() {\n    return Row(\n      children: [\n        HoldToRepeat(\n          onPressed: () => _modifySpeed(-0.02),\n          child: const Padding(\n              padding: EdgeInsets.all(16),\n              child: Icon(Icons.remove_circle_outlined)),\n        ),\n        InkWell(\n          onTap: () => onSpeedChanged(1),\n          child: SizedBox(\n            width: 58,\n            child: Column(\n              children: [\n                const Icon(Icons.speed),\n                Text(\"${(speed * 100).round()}%\")\n              ],\n            ),\n          ),\n        ),\n        HoldToRepeat(\n          onPressed: () => _modifySpeed(0.02),\n          child: const Padding(\n              padding: EdgeInsets.all(16),\n              child: Icon(Icons.add_circle_outlined)),\n        ),\n      ],\n    );\n  }\n\n  Widget _pitchControl() {\n    return Row(\n      children: [\n        IconButton(\n            padding: const EdgeInsets.all(16),\n            onPressed: () => _modifyPitch(-1),\n            icon: const Icon(Icons.remove_circle_outlined)),\n        InkWell(\n          onTap: () => onSemitonesChanged(0),\n          child: SizedBox(\n            width: 58,\n            child: Column(\n              children: [\n                const Icon(Icons.music_note),\n                Text(\"${semitones > 0 ? \"+\" : \"\"}$semitones semi\")\n              ],\n            ),\n          ),\n        ),\n        IconButton(\n            padding: const EdgeInsets.all(16),\n            onPressed: () => _modifyPitch(1),\n            icon: const Icon(Icons.add_circle_outlined)),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        if (compact)\n          Row(\n              mainAxisSize: MainAxisSize.max,\n              mainAxisAlignment: PlatformUtils.isIOS\n                  ? MainAxisAlignment.center\n                  : MainAxisAlignment.spaceBetween,\n              children: [\n                _speedControl(),\n                if (!PlatformUtils.isIOS) _pitchControl(),\n              ]),\n        if (!compact)\n          ListTile(\n            title: Text(\"Speed: ${(speed * 100).round()}%\"),\n            trailing: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                ElevatedButton(\n                    onPressed: () => _modifySpeed(-0.02),\n                    child: const Text(\"-\")),\n                ElevatedButton(\n                    onPressed: () => _modifySpeed(0.02), child: const Text(\"+\"))\n              ],\n            ),\n          ),\n        if (!compact && !PlatformUtils.isIOS)\n          ListTile(\n            title:\n                Text(\"Pitch: ${semitones > 0 ? \"+\" : \"\"}$semitones semitones\"),\n            trailing: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                ElevatedButton(\n                    onPressed: () => _modifyPitch(-1), child: const Text(\"-\")),\n                ElevatedButton(\n                    onPressed: () => _modifyPitch(1), child: const Text(\"+\"))\n              ],\n            ),\n          ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/audio/widgets/waveform_painter.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui' as ui;\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/audio/models/trackAutomation.dart';\nimport '../../bluetooth/devices/presets/preset_constants.dart';\nimport '../automationController.dart';\nimport '../models/waveform_data.dart';\n\nclass WaveformPainter extends CustomPainter {\n  final WaveformData? data;\n  final int startingFrame;\n  final int endingFrame;\n  final int currentSample;\n  final bool overallWaveform;\n  final AutomationController automation;\n  final AutomationEventType? showType;\n  late Paint painter;\n  final Color color;\n  final double strokeWidth;\n  final Paint playbackPaint = Paint()\n    ..color = Colors.grey[200]!\n    ..strokeWidth = 1\n    ..style = PaintingStyle.stroke;\n\n  final List<Paint> channelPaints = <Paint>[];\n  final Paint greyPaint = Paint();\n\n  WaveformPainter(this.data,\n      {this.strokeWidth = 1.0,\n      this.startingFrame = 0,\n      this.endingFrame = 1,\n      this.currentSample = 0,\n      required this.automation,\n      required this.showType,\n      this.overallWaveform = false,\n      this.color = Colors.blue}) {\n    painter = Paint()\n      ..style = PaintingStyle.fill\n      ..color = color\n      ..strokeWidth = strokeWidth\n      ..isAntiAlias = true;\n\n    for (int i = 0; i < PresetConstants.channelColorsPlug.length; i++) {\n      var _paint = Paint()\n        ..color = PresetConstants.channelColorsPlug[i]\n        ..strokeWidth = 1\n        ..style = PaintingStyle.stroke;\n      channelPaints.add(_paint);\n    }\n\n    greyPaint\n      ..color = Colors.grey\n      ..strokeWidth = 1\n      ..style = PaintingStyle.stroke;\n  }\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (data == null || !data!.initialized) {\n      return;\n    }\n    var _start = startingFrame, _end = endingFrame;\n\n    if (!overallWaveform) {\n      final path =\n          data!.path(size, fromFrame: startingFrame, toFrame: endingFrame);\n\n      if (path != null) canvas.drawPath(path, painter);\n      if (currentSample >= startingFrame && currentSample <= endingFrame) {\n        double dx =\n            data!.verticalLine(size, currentSample, startingFrame, endingFrame);\n        canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), playbackPaint);\n      }\n    } else {\n      _start = 0;\n      _end = data!.data.length;\n      final path = data!.overallPath(size);\n      if (path != null) canvas.drawPath(path, painter);\n      double dx = data!.verticalLine(size, startingFrame, 0, data!.data.length);\n      double dy = data!.verticalLine(size, endingFrame, 0, data!.data.length);\n\n      //draw currently visible rectangle\n      var rrect = Rect.fromLTRB(dx, 0, dy, size.height);\n      canvas.drawRect(rrect, playbackPaint);\n\n      //draw playback needle\n      dx = data!.verticalLine(size, currentSample, 0, data!.data.length);\n      canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), playbackPaint);\n    }\n\n    var msPerSample = data!.data.length / automation.duration.inMilliseconds;\n\n    //draw events\n    int realIndex = 0;\n    for (int i = 0; i < automation.events.length; i++) {\n      var element = automation.events[i];\n\n      var paint = channelPaints[element.channel];\n      if (element.type == AutomationEventType.preset &&\n          element.getPresetUuid().isEmpty) paint = greyPaint;\n\n      if (element.type != showType) continue;\n      var dx = (((element.eventTime.inMilliseconds * msPerSample) - _start) /\n              (_end - _start)) *\n          size.width;\n      if (dx < 0 || dx > size.width - 1) continue;\n      canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), paint);\n\n      //add labels\n      if (!overallWaveform) {\n        var paragraphBuilder = ui.ParagraphBuilder(ui.ParagraphStyle())\n          ..pushStyle(ui.TextStyle(\n              color: PresetConstants.channelColorsPlug[element.channel]))\n          ..addText(element.name);\n        final ui.Paragraph paragraph = paragraphBuilder.build()\n          ..layout(ui.ParagraphConstraints(width: size.width - 12.0 - 12.0));\n        canvas.drawParagraph(paragraph, Offset(dx + 2, 6 + realIndex % 3 * 13));\n      }\n      realIndex++;\n    }\n  }\n\n  @override\n  bool shouldRepaint(WaveformPainter oldDelegate) {\n    if (oldDelegate.data != data) {\n      debugPrint(\"Redrawing\");\n      return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/NuxDeviceControl.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMighty8BT.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMighty8BTMk2.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport 'package:mighty_plug_manager/utilities/list_extenstions.dart';\nimport 'package:undo/undo.dart';\n\nimport 'bleMidiHandler.dart';\n\nimport 'ble_controllers/BLEController.dart';\nimport 'devices/NuxConstants.dart';\nimport 'devices/NuxDevice.dart';\nimport 'devices/NuxMighty2040BT.dart';\nimport 'devices/NuxMightyLite.dart';\nimport 'devices/NuxMightyLiteMk2.dart';\nimport 'devices/NuxMightyPlugAir.dart';\nimport 'devices/NuxMightyPlugPro.dart';\nimport 'devices/NuxMightySpace.dart';\nimport 'devices/effects/Processor.dart';\n\nenum DeviceConnectionState {\n  connectionBegin,\n  presetsLoaded,\n  connectionComplete,\n  disconnected\n}\n\nclass NuxDiagnosticData {\n  String device = \"\";\n  bool connected = false;\n  String lastNuxPreset = \"\";\n\n  Map<String, dynamic> toMap(bool includeJsonPreset) {\n    var data = <String, dynamic>{};\n    data['device'] = device;\n    data['connected'] = connected;\n    data['lastNuxPreset'] = lastNuxPreset;\n\n    if (includeJsonPreset) {\n      data['jsonPreset'] = NuxDeviceControl.instance().device.presetToJson();\n    }\n\n    return data;\n  }\n}\n\nclass NuxDeviceControl extends ChangeNotifier {\n  static final NuxDeviceControl _nuxDeviceControl = NuxDeviceControl._();\n\n  final BLEMidiHandler _midiHandler = BLEMidiHandler.instance();\n\n  factory NuxDeviceControl.instance() {\n    return _nuxDeviceControl;\n  }\n\n  NuxDiagnosticData diagData = NuxDiagnosticData();\n\n  //holds current device\n  late NuxDevice _device;\n  StreamSubscription<List<int>>? rxSubscription;\n  Timer? batteryTimer;\n\n  //Preset Name Stuff\n  String _presetName = \"\";\n  String presetCategory = \"\";\n  String presetUUID = \"\";\n\n  String get presetName => _presetName;\n  set presetName(String name) {\n    _presetName = name;\n    presetNameNotifier.value = name;\n  }\n\n  ValueNotifier presetNameNotifier = ValueNotifier<String>(\"\");\n  ValueNotifier<double> masterVolumeNotifier = ValueNotifier<double>(100);\n\n  double _masterVolume = 100;\n\n  ChangeStack get changes => device.presets[device.selectedChannel].changes;\n\n  bool developer = false;\n  Function(List<int>)? onDataReceiveDebug;\n\n  double get masterVolume {\n    if (device.fakeMasterVolume) {\n      return _masterVolume;\n    } else {\n      return device.presets[device.selectedChannel].volume;\n    }\n  }\n\n  set masterVolume(double vol) {\n    masterVolumeNotifier.value = vol;\n    if (device.fakeMasterVolume) {\n      _masterVolume = vol;\n      if (isConnected) {\n        device.sendAmpLevel();\n      }\n    } else {\n      device.presets[device.selectedChannel].volume = vol;\n    }\n  }\n\n  //connect status control\n  final StreamController<DeviceConnectionState> _connectStatus =\n      StreamController.broadcast();\n  final StreamController<int> _batteryPercentage =\n      StreamController<int>.broadcast();\n\n  Stream<DeviceConnectionState> get connectStatus => _connectStatus.stream;\n  Stream<int> get batteryPercentage => _batteryPercentage.stream;\n\n  bool get isConnected => _midiHandler.connectedDevice != null;\n\n  //list of all different nux devices\n  final List<NuxDevice> _deviceInstances = <NuxDevice>[];\n\n  List<NuxDevice> get deviceList => _deviceInstances;\n\n  List<String> deviceBLEName() {\n    var names = <String>[];\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      names.addAll(_deviceInstances[i].productBLENames);\n    }\n    return names;\n  }\n\n  List<String> get deviceNameList {\n    var names = <String>[];\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      names.add(_deviceInstances[i].productNameShort);\n    }\n    return names;\n  }\n\n  int get deviceIndex {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      if (_device == _deviceInstances[i]) return i;\n    }\n    return 0;\n  }\n\n  set deviceIndex(int index) {\n    _clearAllDevicesStack();\n    clearPresetData();\n    _device = _deviceInstances[index];\n\n    updateDiagnosticsData();\n    SharedPrefs().setValue(SettingsKeys.device, _device.productStringId);\n    SharedPrefs().setValue(SettingsKeys.deviceVersion, _device.productVersion);\n    notifyListeners();\n  }\n\n  List<String> get deviceVersionsList {\n    var names = <String>[];\n    for (int i = 0; i < device.getAvailableVersions(); i++) {\n      names.add(device.getProductNameVersion(i));\n    }\n    return names;\n  }\n\n  int get deviceFirmwareVersion => device.productVersion;\n\n  set deviceFirmwareVersion(int ver) {\n    _clearDeviceStack();\n    clearPresetData();\n    device.setFirmwareVersionByIndex(ver);\n    SharedPrefs().setValue(SettingsKeys.deviceVersion, ver);\n  }\n\n  NuxDevice deviceFromBLEId(String id) {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      if (_deviceInstances[i].productBLENames.containsPartial(id)) {\n        return _deviceInstances[i];\n      }\n    }\n\n    //return plug/air by default\n    return _deviceInstances[0];\n  }\n\n  String getDeviceNameFromId(String id) {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      if (_deviceInstances[i].productStringId == id) {\n        return _deviceInstances[i].productNameShort;\n      }\n    }\n    return \"Unknown\";\n  }\n\n  NuxDevice? getDeviceFromId(String id) {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      if (_deviceInstances[i].productStringId == id) return _deviceInstances[i];\n    }\n    return null;\n  }\n\n  NuxDevice? getDeviceFromPresetClass(String presetClass) {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      if (_deviceInstances[i].presetClass == presetClass) {\n        return _deviceInstances[i];\n      }\n    }\n    return null;\n  }\n\n  _clearDeviceStack({NuxDevice? device}) {\n    bool notify = device == null;\n    device ??= _device;\n    for (int i = 0; i < device.channelsCount; i++) {\n      device.presets[i].changes.clearHistory();\n    }\n\n    if (notify) notifyListeners();\n  }\n\n  _clearAllDevicesStack() {\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      _clearDeviceStack(device: _deviceInstances[i]);\n    }\n  }\n\n  undoStackChanged() {\n    notifyListeners();\n  }\n\n  void clearPresetData() {\n    presetName = \"\";\n    presetCategory = \"\";\n    presetUUID = \"\";\n  }\n\n  forceNotifyListeners() {\n    notifyListeners();\n  }\n\n  factory NuxDeviceControl() {\n    return _nuxDeviceControl;\n  }\n\n  NuxDeviceControl._() {\n    _midiHandler.setAmpDeviceIdProvider(deviceBLEName);\n    _midiHandler.status.listen(_statusListener);\n\n    //create all supported devices\n    _deviceInstances.add(NuxMightyPlug(this));\n    _deviceInstances.add(NuxMightyPlugPro(this));\n    _deviceInstances.add(NuxMightySpace(this));\n    _deviceInstances.add(NuxMighty8BT(this));\n    _deviceInstances.add(NuxMighty2040BT(this));\n    _deviceInstances.add(NuxMightyLite(this));\n    _deviceInstances.add(NuxMightyLiteMk2(this));\n    _deviceInstances.add(NuxMighty8BTMk2(this));\n\n    //make it read from config\n    String dev = SharedPrefs()\n        .getValue(SettingsKeys.device, _deviceInstances[0].productStringId);\n\n    _device = getDeviceFromId(dev) ?? _deviceInstances[0];\n\n    int ver = SharedPrefs().getValue(\n        SettingsKeys.deviceVersion, _device.getAvailableVersions() - 1);\n    _device.setFirmwareVersionByIndex(ver);\n\n    updateDiagnosticsData(connected: false);\n\n    if (device.fakeMasterVolume) {\n      masterVolume = SharedPrefs().getValue(SettingsKeys.masterVolume, 100.0);\n    }\n\n    for (int i = 0; i < _deviceInstances.length; i++) {\n      var dev = _deviceInstances[i];\n      dev.parameterChanged.stream.listen(parameterChangedListener);\n      _deviceInstances[i].effectChanged.stream.listen(effectChangedListener);\n      _deviceInstances[i].effectSwitched.stream.listen(effectSwitchedListener);\n      _deviceInstances[i].slotSwapped.stream.listen(slotSwappedListener);\n    }\n  }\n\n  void _statusListener(statusValue) {\n    switch (statusValue) {\n      case MidiSetupStatus.deviceFound:\n        // check if this is valid nux device\n        debugPrint(\"Devices found ${_midiHandler.nuxDevices}\");\n        for (var dev in _midiHandler.nuxDevices) {\n          //don't autoconnect on manual scan\n          if (!_midiHandler.manualScan) {\n            _midiHandler.connectToDevice(dev.device);\n          }\n        }\n        break;\n      case MidiSetupStatus.deviceConnected:\n        _clearDeviceStack();\n\n        //find which device connected\n        if (isConnected) {\n          debugPrint(\"${_midiHandler.connectedDevice!.name} connected\");\n          _device = deviceFromBLEId(_midiHandler.connectedDevice!.name);\n\n          updateDiagnosticsData(connected: true);\n          SharedPrefs().setValue(SettingsKeys.device, _device.productStringId);\n          //can't set version yet, firmware is unknown\n          notifyListeners();\n          _onConnect();\n        }\n        break;\n      case MidiSetupStatus.deviceDisconnected:\n        _clearDeviceStack();\n        updateDiagnosticsData(connected: false);\n        notifyListeners();\n        _onDisconnect();\n        break;\n      default:\n        break;\n    }\n  }\n\n  void _onConnect() {\n    clearPresetData();\n    device.onConnect();\n    _connectStatus.add(DeviceConnectionState.connectionBegin);\n    rxSubscription = _midiHandler.registerDataListener(_onDataReceive);\n\n    requestFirmwareVersion();\n  }\n\n  void _onDisconnect() {\n    batteryTimer?.cancel();\n    rxSubscription?.cancel();\n    clearPresetData();\n    device.onDisconnect();\n    debugPrint(\"Device disconnected\");\n    _connectStatus.add(DeviceConnectionState.disconnected);\n  }\n\n  void _onDataReceive(List<int> data) {\n    if (developer) onDataReceiveDebug?.call(data);\n    _device.communication.onDataReceive(data);\n  }\n\n  void _onBatteryTimer(Timer? t) {\n    device.communication.requestBatteryStatus();\n  }\n\n  void requestFirmwareVersion() async {\n    await Future.delayed(const Duration(seconds: 1));\n    var data = device.communication.createFirmwareMessage();\n    if (data.isNotEmpty) {\n      sendBLEData(data);\n    } else {\n      onFirmwareVersionReady();\n    }\n  }\n\n  void onFirmwareVersionReady() {\n    device.communication.performNextConnectionStep();\n  }\n\n  void onConnectionStepReady() {\n    if (device.communication.isConnectionReady()) {\n      if (device.batterySupport) {\n        batteryTimer =\n            Timer.periodic(const Duration(seconds: 15), _onBatteryTimer);\n        _onBatteryTimer(null);\n      }\n      device.sendAmpLevel();\n      _connectStatus.add(DeviceConnectionState.connectionComplete);\n      debugPrint(\"Device connection complete\");\n      notifyListeners();\n    } else {\n      device.communication.performNextConnectionStep();\n    }\n  }\n\n  bool isConnectionComplete() {\n    return device.communication.isConnectionReady();\n  }\n\n  void onPresetsReady() {\n    _connectStatus.add(DeviceConnectionState.presetsLoaded);\n  }\n\n  //for some reason we should not ask for presets immediately\n  void requestPresetDelayed(int? delay) async {\n    await Future.delayed(Duration(milliseconds: delay ?? 400));\n    requestPreset(0);\n  }\n\n  void requestPreset(int index) {\n    sendBLEData(_device.communication.requestPresetByIndex(index));\n  }\n\n  void onBatteryPercentage(int val) {\n    _batteryPercentage.add(val);\n  }\n\n  //preset editing listeners\n  void parameterChangedListener(Parameter param) {\n    if (!isConnected) return;\n    sendParameter(param, false);\n  }\n\n  void changeDeviceChannel(int channel) {\n    if (!isConnected) return;\n    sendBLEData(device.communication.setChannel(channel));\n  }\n\n  void effectChangedListener(int slot) {\n    sendFullEffectSettings(slot, true);\n  }\n\n  void effectSwitchedListener(int slot) {\n    device.communication.sendSlotEnabledState(slot);\n  }\n\n  void slotSwappedListener(int slot) {\n    device.communication.sendSlotOrder();\n  }\n\n  void sendFullEffectSettings(int slot, bool force) {\n    if (!isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n    Processor effect;\n    int index;\n\n    effect =\n        preset.getEffectsForSlot(slot)[preset.getSelectedEffectForSlot(slot)];\n    index = effect.nuxIndex;\n\n    //check if preset switchable\n    bool switchable = preset.slotSwitchable(slot);\n    bool enabled = preset.slotEnabled(slot);\n    bool distinctCCodes =\n        effect.midiCCSelectionValue != effect.midiCCEnableValue;\n    //send parameters only if the effect is on OR is not switchable off\n    bool send = !switchable || (switchable && enabled) || force;\n    send = true; //still buggy, fix it first\n\n    //send effect type\n    if (effect.midiCCSelectionValue >= 0) {\n      if (distinctCCodes) {\n        if (device.presets[0].getEffectsForSlot(slot).length > 1) {\n          device.communication.sendSlotEffect(slot, index);\n        }\n      } else {\n        device.communication.sendSlotEnabledState(slot);\n      }\n    }\n\n    //send parameters\n    if (send) {\n      for (int i = 0; i < effect.parameters.length; i++) {\n        sendParameter(effect.parameters[i], false);\n      }\n    }\n\n    //send switched\n    if (switchable && distinctCCodes) {\n      device.communication.sendSlotEnabledState(slot);\n    }\n  }\n\n  void sendFullPresetSettings() {\n    if (!isConnected) return;\n\n    BLEMidiHandler.instance().clearDataQueue();\n    if (!device.fakeMasterVolume) {\n      device.presets[device.selectedChannel].sendVolume();\n    }\n\n    for (var i = 0; i < device.processorList.length; i++) {\n      sendFullEffectSettings(i, false);\n    }\n\n    if (device.reorderableFXChain) {\n      device.communication.sendSlotOrder();\n    }\n  }\n\n  void resetToChannelDefaults() {\n    int channel = device.selectedChannel;\n    changeDeviceChannel(channel);\n    sendFullPresetSettings();\n  }\n\n  List<int> sendParameter(Parameter param, bool returnOnly) {\n    int outVal;\n\n    //implement master volume\n    if (device.fakeMasterVolume && param.masterVolume) {\n      outVal = param.masterVolMidiValue;\n    } else {\n      outVal = param.midiValue;\n    }\n    var data = createCCMessage(param.midiCC, outVal);\n    if (!returnOnly) sendBLEData(data);\n    return data;\n  }\n\n  void saveNuxPreset() async {\n    if (!isConnected) return;\n    double vol = 0;\n    if (device.fakeMasterVolume) {\n      vol = masterVolume;\n      if (vol < 100) {\n        _masterVolume = 100;\n        device.sendAmpLevel();\n        await Future.delayed(const Duration(milliseconds: 200));\n      }\n    }\n\n    device.communication.saveCurrentPreset(device.selectedChannel);\n\n    if (device.fakeMasterVolume) {\n      _masterVolume = vol;\n    }\n    requestPreset(device.selectedChannel);\n  }\n\n  void resetNuxPresets() async {\n    if (!isConnected) return;\n    device.communication.sendReset();\n\n    //show loading popup\n    if (device.presetSaveSupport) {\n      await Future.delayed(const Duration(seconds: 3));\n      _connectStatus.add(DeviceConnectionState.connectionBegin);\n      requestPresetDelayed(3000);\n    }\n  }\n\n  void sendBLEData(List<int> data) {\n    _midiHandler.sendData(data);\n  }\n\n  List<int> createCCMessage(int controlNumber, int value) {\n    var msg = List<int>.filled(5, 0);\n    msg[0] = 0x80;\n    msg[1] = 0x80;\n    msg[2] = MidiMessageValues.controlChange;\n    msg[3] = controlNumber;\n    msg[4] = value;\n    return msg;\n  }\n\n  void updateDiagnosticsData(\n      {bool? connected, String? nuxPreset, bool includeJsonPreset = false}) {\n    if (nuxPreset != null) diagData.lastNuxPreset = nuxPreset;\n\n    diagData.device = \"${_device.productName} ${_device.productVersion}\";\n    if (connected != null) diagData.connected = connected;\n\n/*\n    Sentry.configureScope((scope) {\n      scope.setTag(\n          \"nuxDevice\", \"${_device.productName} ${_device.productVersion}\");\n      scope.setContexts('NUX', diagData.toMap(includeJsonPreset));\n    });*/\n  }\n\n  NuxDevice get device => _device;\n}\n"
  },
  {
    "path": "lib/bluetooth/bleMidiHandler.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\n//Good explanation for location usage\n//https://support.chefsteps.com/hc/en-us/articles/360009480814-I-have-an-Android-Why-am-I-being-asked-to-allow-location-access-\nimport 'dart:async';\nimport 'package:flutter/foundation.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'ble_controllers/DummyBLEController.dart';\nimport 'ble_controllers/FlutterBluePlusController.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport '../platform/platformUtils.dart';\nimport 'ble_controllers/BLEController.dart';\nimport 'ble_controllers/WebBleController.dart';\n\ntypedef BluetoothErrorCallback = void Function(BleError, dynamic data);\n\nclass BLEMidiHandler {\n  //List of devices that doesn't advertise their midi service\n  static const List<String> forcedDevices = [\n    \"FootCtrl\", //Cuvave / M-Wave Chocolate\n    \"FootCtrlPlus\"\n  ];\n\n  static final BLEMidiHandler _bleHandler = BLEMidiHandler._();\n\n  late BLEController bleController;\n\n  Stream<MidiSetupStatus> get status => bleController.status;\n  Stream<bool> get isScanningStream => bleController.isScanningStream;\n  MidiSetupStatus get currentStatus => bleController.currentStatus;\n\n  bool _manualScan = false;\n  bool _granted = false;\n  bool _permanentlyDenied = false;\n\n  bool get permissionGranted => PlatformUtils.isWeb || _granted;\n  bool get permanentlyDenied => !PlatformUtils.isWeb && _permanentlyDenied;\n\n  BleState get bleState => bleController.bleState;\n  bool get isScanning => bleController.isScanning;\n  bool get manualScan => _manualScan;\n\n  factory BLEMidiHandler.instance() {\n    return _bleHandler;\n  }\n\n  var _nuxDevices = <BLEScanResult>[];\n\n  List<BLEScanResult> get nuxDevices => _nuxDevices;\n\n  //controller devices\n  var _controllerDevices = <BLEScanResult>[];\n\n  List<BLEScanResult> get controllerDevices => _controllerDevices;\n\n  BLEDevice? get connectedDevice {\n    return bleController.connectedDevice;\n  }\n\n  BLEMidiHandler._() {\n    //bleController = DummyBLEController(forcedDevices);\n    //return;\n\n    if (PlatformUtils.isAndroid) {\n      bleController = FlutterBluePlusController(forcedDevices);\n    } else if (PlatformUtils.isIOS) {\n      bleController = FlutterBluePlusController(forcedDevices);\n    } else if (PlatformUtils.isWeb) {\n      bleController = WebBleController(forcedDevices);\n    } else if (PlatformUtils.isWindows) {\n      bleController = DummyBLEController(forcedDevices);\n    } else if (PlatformUtils.isLinux) {\n      bleController = DummyBLEController(forcedDevices);\n    } else {\n      bleController = DummyBLEController(forcedDevices);\n    }\n  }\n\n  initBle(BluetoothErrorCallback onError) async {\n    var deviceInfoPlugin = DeviceInfoPlugin();\n    bool noLocationNeeded = false;\n\n    //TODO: what happens with iOS?\n    if (PlatformUtils.isAndroid) {\n      final androidInfo = await deviceInfoPlugin.androidInfo;\n      noLocationNeeded = (androidInfo.version.sdkInt) >= 31;\n    }\n\n    if (PlatformUtils.isMobile) {\n      PermissionStatus pStatus;\n      bool askOneTime = false;\n      if (noLocationNeeded) {\n        pStatus = await Permission.bluetoothScan.status;\n        if (!pStatus.isGranted) {\n          pStatus = await Permission.bluetoothScan.request();\n        }\n        if (!pStatus.isGranted) {\n          onError(BleError.scanPermissionDenied, pStatus);\n          return;\n        }\n\n        pStatus = await Permission.bluetoothConnect.status;\n        if (!pStatus.isGranted) {\n          pStatus = await Permission.bluetoothConnect.request();\n        }\n        if (!pStatus.isGranted) onError(BleError.scanPermissionDenied, pStatus);\n      } else {\n        do {\n          if (PlatformUtils.isIOS) break;\n          pStatus = await Permission.location.status;\n          if (pStatus.isGranted) break;\n          if (!askOneTime) {\n            pStatus = await Permission.location.request();\n            if (pStatus.isPermanentlyDenied) _permanentlyDenied = true;\n            askOneTime = true;\n            if (!pStatus.isGranted) {\n              onError(BleError.permissionDenied, pStatus);\n            }\n          }\n          Future.delayed(const Duration(milliseconds: 500));\n        } while (!pStatus.isGranted);\n      }\n    }\n    debugPrint(\"BLE permissions granted!\");\n    _granted = true;\n    _permanentlyDenied = false;\n\n    await bleController.init(_onScanResults);\n\n    var available = await bleController.isAvailable();\n    if (!available) {\n      onError(BleError.unavailable, null);\n    }\n\n    if (PlatformUtils.isAndroid && !noLocationNeeded) {\n      ServiceStatus ss = await Permission.location.serviceStatus;\n\n      if (!ss.isEnabled) {\n        onError(BleError.locationServiceOff, null);\n      }\n    }\n    debugPrint(\"BLEMidiHandler:Init()\");\n  }\n\n  void _onScanResults(\n      List<BLEScanResult> nuxResults, List<BLEScanResult> controllerResults) {\n    _nuxDevices = nuxResults;\n    _controllerDevices = controllerResults;\n  }\n\n  void setAmpDeviceIdProvider(List<String> Function() provider) {\n    bleController.setAmpDeviceIdProvider(provider);\n  }\n\n  void startScanning(bool manual) {\n    if (!_granted) return;\n    _manualScan = manual;\n    bleController.startScanning();\n  }\n\n  void stopScanning() {\n    if (!_granted) return;\n    bleController.stopScanning();\n  }\n\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (!_granted) return null;\n    return bleController.connectToDevice(device);\n  }\n\n  void disconnectDevice() async {\n    if (!_granted) return;\n    bleController.disconnectDevice();\n  }\n\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int>) listener) {\n    return bleController.registerDataListener(listener);\n  }\n\n  void clearDataQueue() {\n    bleController.clearDataQueue();\n  }\n\n  void onDataQueueEmpty(VoidCallback onEmpty) {\n    bleController.onDataQueueEmpty(onEmpty);\n  }\n\n  void sendData(List<int> data) {\n    if (!_granted) return;\n    bleController.sendData(data);\n  }\n\n  void dispose() {\n    bleController.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/BLEController.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\n\nimport '../devices/NuxConstants.dart';\n\nenum MidiSetupStatus {\n  bluetoothOff,\n  deviceIdle,\n  deviceSearching,\n  deviceFound,\n  deviceConnecting,\n  deviceConnected,\n  deviceDisconnected,\n  unknown\n}\n\nenum BleState { off, on }\n\nenum BleDeviceState { disconnected, connecting, connected, disconnecting }\n\nenum BleError {\n  unavailable,\n  permissionDenied,\n  locationServiceOff,\n  scanPermissionDenied\n}\n\ntypedef ScanResultsCallback = void Function(\n    List<BLEScanResult> nuxDevices, List<BLEScanResult> controllerDevices);\n\nabstract class BLEScanResult {\n  String get id;\n  String get name;\n\n  late BLEDevice _device;\n\n  @protected\n  set device(BLEDevice val) => _device = val;\n  BLEDevice get device => _device;\n}\n\nabstract class BLEDevice {\n  String get name;\n  String get id;\n\n  ///Returns a stream telling the connection state of a device\n  ///Used only for MIDI foot controllers and not for amps\n  Stream<BleDeviceState> get state;\n}\n\n/// Ble connection class used for MIDI foot controllers only\n/// Not needed for amps\nclass BLEConnection {\n  final Stream<List<int>> _dataStream;\n  Stream<List<int>> get data => _dataStream;\n\n  BLEConnection(this._dataStream);\n}\n\nabstract class BLEController {\n  static const String midiServiceGuid = \"03b80e5a-ede8-4b33-a751-6ce34ec4c700\";\n  static const String midiCharacteristicGuid =\n      \"7772e5db-3868-4112-a1a9-f2669d106bf3\";\n\n  MidiSetupStatus _currentStatus = MidiSetupStatus.unknown;\n  final StreamController<MidiSetupStatus> _status =\n      StreamController.broadcast();\n  Stream<MidiSetupStatus> get status => _status.stream;\n\n  BleState _bleState = BleState.off;\n  @protected\n  set bleState(BleState state) => _bleState = state;\n  BleState get bleState => _bleState;\n\n  @protected\n  set currentStatus(MidiSetupStatus val) => _currentStatus = val;\n  MidiSetupStatus get currentStatus => _currentStatus;\n\n  BLEDevice? get connectedDevice;\n  final StreamController<bool> _scanStatus = StreamController.broadcast();\n  Stream<bool> get isScanningStream => _scanStatus.stream;\n\n  bool _isScanning = false;\n  bool get isScanning => _isScanning;\n\n  ListQueue<List<int>> dataQueue = ListQueue<List<int>>();\n\n  @protected\n  late List<String> Function() deviceListProvider;\n\n  @protected\n  late ScanResultsCallback onScanResults;\n\n  @protected\n  List<String> forcedDevices;\n\n  BLEController(this.forcedDevices);\n\n  void setAmpDeviceIdProvider(List<String> Function() provider) {\n    deviceListProvider = provider;\n  }\n\n  Future init(ScanResultsCallback callback) async {\n    onScanResults = callback;\n  }\n\n  Future<bool> isAvailable();\n\n  void startScanning();\n  void stopScanning();\n\n  Future<BLEConnection?> connectToDevice(BLEDevice device);\n  void disconnectDevice();\n\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int>) listener);\n\n  void sendData(List<int> data) {\n    var queueLength = dataQueue.length;\n\n    if (data[2] == MidiMessageValues.controlChange && dataQueue.isNotEmpty) {\n      //check if another CC message with the same code is in the queue and remove it\n      dataQueue.removeWhere((element) =>\n          element[2] == MidiMessageValues.controlChange &&\n          element[3] == data[3]);\n    }\n\n    dataQueue.addLast(data);\n    if (queueLength == 0) _queueSender();\n  }\n\n  void clearDataQueue() {\n    dataQueue.clear();\n  }\n\n  VoidCallback? _onQueueEmpty;\n\n  void onDataQueueEmpty(VoidCallback onQueueEmpty) {\n    if (dataQueue.isEmpty) {\n      onQueueEmpty.call();\n    } else {\n      _onQueueEmpty = onQueueEmpty;\n    }\n  }\n\n  void dispose();\n\n  void _queueSender() async {\n    //Stopwatch stopwatch = Stopwatch()..start();\n    //List<int> currentData = List<int>();\n    bool noResponse = true;\n    while (dataQueue.isNotEmpty) {\n      if (connectedDevice == null) {\n        dataQueue.clear();\n        break;\n      }\n      try {\n        if (isWriteReady) {\n          var data = dataQueue.first;\n\n          //try to combine CC messages in single running message\n          //default MTU 23 bytes per packet (maybe 20???)\n          /*int elementsCount = 0;\n          if ((data[2] == MidiMessageValues.controlChange ||\n                  data[2] == MidiMessageValues.programChange) &&\n              dataQueue.length > 1) {\n            for (var element in dataQueue) {\n              if (element[2] == MidiMessageValues.controlChange ||\n                  element[2] == MidiMessageValues.programChange) {\n                elementsCount++;\n                if (elementsCount == 2) break;\n              } else {\n                break;\n              }\n            }\n            List<int> dataPacket = [data[0], data[1], data[2]];\n            for (int i = 0; i < elementsCount; i++) {\n              var dataElement = dataQueue.elementAt(i);\n              dataPacket.add(dataElement[3]);\n              dataPacket.add(dataElement[4]);\n            }\n            await writeToCharacteristic(dataPacket);\n            print(\"Combined: ${dataPacket.toString()}\");\n            for (int i = 0; i < elementsCount; i++) {\n              dataQueue.removeFirst();\n            }\n          } else {*/\n          //any other message\n          if (Platform.isAndroid &&\n              data[2] == MidiMessageValues.sysExStart &&\n              data[6] == SyxMsg.kSYX_MODULELINK) {\n            noResponse = false;\n            await Future.delayed(const Duration(milliseconds: 100));\n          }\n          await writeToCharacteristic(data, noResponse);\n          if (Platform.isAndroid) {\n            await Future.delayed(const Duration(milliseconds: 10));\n          }\n          noResponse = true;\n          dataQueue.removeFirst();\n          //}\n        } else {\n          dataQueue.clear();\n        }\n      } catch (e) {\n        debugPrint(e.toString());\n\n        //noResponse = false;\n        //await Future.delayed(const Duration(milliseconds: 50));\n      }\n    }\n    _onQueueEmpty?.call();\n    _onQueueEmpty = null;\n    // if (kDebugMode) {\n    //   Settings.print('sending executed in ${stopwatch.elapsed.inMilliseconds}');\n    // }\n  }\n\n  @protected\n  void setMidiSetupStatus(MidiSetupStatus status) {\n    _currentStatus = status;\n    _status.add(status);\n  }\n\n  @protected\n  void setScanningStatus(bool scanning) {\n    _isScanning = scanning;\n    _scanStatus.add(scanning);\n  }\n\n  bool get isWriteReady;\n  Future writeToCharacteristic(List<int> data, bool noResponse);\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/DummyBLEController.dart",
    "content": "import 'dart:async';\n\nimport 'BLEController.dart';\n\nclass DummyBLEController extends BLEController {\n  DummyBLEController(List<String> forcedDevices) : super(forcedDevices);\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) {\n    throw UnimplementedError();\n  }\n\n  @override\n  BLEDevice? get connectedDevice => null;\n\n  @override\n  void disconnectDevice() {}\n\n  @override\n  void dispose() {}\n\n  @override\n  Future<bool> isAvailable() async {\n    return false;\n  }\n\n  @override\n  bool get isWriteReady => false;\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int> p1) listener) {\n    throw UnimplementedError();\n  }\n\n  @override\n  void startScanning() {}\n\n  @override\n  void stopScanning() {}\n\n  @override\n  Future writeToCharacteristic(List<int> data, bool noResponse) {\n    return Future.delayed(const Duration(milliseconds: 100));\n  }\n\n/*\n  @override\n  Future setNotificationEnabled(bool enabled) {\n    return Future.delayed(const Duration(milliseconds: 100));\n  }\n  \n*/\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/FlutterBluePluginController.dart",
    "content": "/*\nAlmost identical to flutte_blue_plus - comes from the same base, but added\nWindows and macOS support.\nHowever, doesn't work well on Windows. Not tested on macOS, nut flutter_blue_plus\nshould be easy to port for macOS.\nAnother problem is that it requires Android API level 21 - lollipop and too many\npeople requested to keep KitKat compatibility\n*/\n\n/*\nimport 'dart:async';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_blue_plugin/flutter_blue_plugin.dart';\nimport 'package:mighty_plug_manager/bluetooth/ble_controllers/BLEController.dart';\n\nclass FBPScanResult extends BLEScanResult {\n  @override\n  String get id => (device as FBPBleDevice).device.id.toString().toLowerCase();\n\n  @override\n  String get name => (device as FBPBleDevice).device.name;\n\n  FBPScanResult(ScanResult sr) {\n    device = FBPBleDevice(sr.device);\n  }\n}\n\nclass FBPBleDevice extends BLEDevice {\n  final BluetoothDevice _device;\n  BluetoothDevice get device => _device;\n\n  FBPBleDevice(this._device);\n\n  @override\n  String get name => _device.name;\n\n  @override\n  String get id => _device.id.toString().toLowerCase();\n\n  @override\n  Stream<BleDeviceState> get state {\n    StreamController<BleDeviceState> stateStream = StreamController();\n    StreamSubscription<BluetoothDeviceState> s = _device.state.listen((event) {\n      switch (event) {\n        case BluetoothDeviceState.disconnected:\n          stateStream.add(BleDeviceState.disconnected);\n          break;\n        case BluetoothDeviceState.connecting:\n          stateStream.add(BleDeviceState.connecting);\n          break;\n        case BluetoothDeviceState.connected:\n          stateStream.add(BleDeviceState.connected);\n          break;\n        case BluetoothDeviceState.disconnecting:\n          stateStream.add(BleDeviceState.disconnecting);\n          break;\n      }\n    });\n\n    stateStream.onCancel = () {\n      s.cancel();\n    };\n    return stateStream.stream;\n  }\n}\n\nclass FlutterBluePluginController extends BLEController {\n  FlutterBlue flutterBlue = FlutterBlue.instance;\n\n  FBPBleDevice? _device;\n  @override\n  BLEDevice? get connectedDevice => _device;\n  BluetoothCharacteristic? _midiCharacteristic;\n  StreamSubscription? _deviceStreamSubscription;\n  bool _connectInProgress = false;\n\n  StreamSubscription<bool>? _scanningStatusSubscription;\n  StreamSubscription<BluetoothState>? _bluetoothStateSubscription;\n  StreamSubscription<List<ScanResult>>? _scanSubscription;\n\n  FlutterBluePluginController(List<String> forcedDevices)\n      : super(forcedDevices);\n\n  @override\n  Future<bool> isAvailable() {\n    return flutterBlue.isAvailable;\n  }\n\n  @override\n  void startScanning() {\n    if (bleState == BleState.off) return;\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n    flutterBlue\n        .startScan(\n      timeout: const Duration(seconds: 8),\n      //withServices: [Guid(midiService)]\n    )\n        .listen((event) {\n      print(event);\n    });\n    // .then((result) {\n    //if device is not connected after the search - set to idle\n    //if (_device == null) setMidiSetupStatus(MidiSetupStatus.deviceIdle);\n    //});\n  }\n\n  @override\n  void stopScanning() {\n    if (bleState == BleState.off) return;\n    flutterBlue.stopScan();\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (bleState != BleState.on) return null;\n    var ownDevice = (device as FBPBleDevice).device;\n\n    bool ampDevice = false;\n    if (deviceListProvider.call().containsPartial(ownDevice.name)) {\n      ampDevice = true;\n      if (_connectInProgress || _device != null) {\n        debugPrint(\"Denying secondary connection!\");\n        return null;\n      }\n    }\n\n    _connectInProgress = true;\n    stopScanning();\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n    try {\n      await ownDevice.connect(\n          autoConnect: false, timeout: const Duration(seconds: 5));\n    } on Exception {\n      _connectInProgress = false;\n      return null;\n    } catch (e) {\n      debugPrint(\"Connect error $e\");\n      _connectInProgress = false;\n      if (e == 'already_connected') return null;\n      rethrow;\n    }\n\n    if (ampDevice) {\n      if (_device != null) return null;\n      _device = device;\n    }\n\n    List<BluetoothService> services = await ownDevice.discoverServices();\n    //find midi service\n    BluetoothService? midiService;\n    for (var element in services) {\n      if (element.uuid == Guid(BLEController.midiServiceGuid)) {\n        midiService = element;\n      }\n    }\n\n    if (midiService != null) {\n      for (var characteristic in midiService.characteristics) {\n        if (characteristic.uuid == Guid(BLEController.midiCharacteristicGuid)) {\n          if (ampDevice) {\n            _connectAmpDevice(device.device, characteristic);\n          } else {\n            characteristic.setNotifyValue(true);\n            _connectInProgress = false;\n            return BLEConnection(characteristic.value);\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  void _connectAmpDevice(\n      BluetoothDevice device, BluetoothCharacteristic characteristic) {\n    _midiCharacteristic = characteristic;\n\n    _midiCharacteristic?.setNotifyValue(true);\n\n    _connectInProgress = false;\n\n    setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n    _deviceStreamSubscription = device.state.listen((event) {\n      if (event == BluetoothDeviceState.disconnected) {\n        _deviceStreamSubscription?.cancel();\n        _device = null;\n        _midiCharacteristic = null;\n        _connectInProgress = false;\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n      }\n    });\n  }\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    _subscribeBleState();\n    _subscribeScanningStatus();\n    _subscribeScanResults();\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int>) listener) {\n    return _midiCharacteristic!.value.listen(listener);\n  }\n\n  @override\n  void disconnectDevice() async {\n    if (_device != null) {\n      _connectInProgress = false;\n      _device?.device.disconnect();\n      _midiCharacteristic = null;\n      _device = null;\n    }\n  }\n\n  @override\n  void dispose() {\n    _scanningStatusSubscription?.cancel();\n    _bluetoothStateSubscription?.cancel();\n    _scanSubscription?.cancel();\n    _device?.device.disconnect();\n    _connectInProgress = false;\n  }\n\n  _subscribeBleState() {\n    _bluetoothStateSubscription = flutterBlue.state.listen((event) {\n      debugPrint(event.toString());\n      switch (event) {\n        case BluetoothState.unknown:\n        case BluetoothState.unavailable:\n        case BluetoothState.unauthorized:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          break;\n        case BluetoothState.turningOn:\n        case BluetoothState.on:\n          bleState = BleState.on;\n          setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n          startScanning();\n          break;\n        case BluetoothState.turningOff:\n          flutterBlue.stopScan();\n          break;\n        case BluetoothState.off:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          _device = null;\n          _connectInProgress = false;\n          break;\n      }\n    });\n  }\n\n  _subscribeScanningStatus() {\n    _scanningStatusSubscription = flutterBlue.isScanning.listen((event) {\n      setScanningStatus(event);\n    });\n  }\n\n  _subscribeScanResults() {\n    _scanSubscription = flutterBlue.scanResults.listen((results) {\n      List<ScanResult> nuxDevices = <ScanResult>[];\n      List<ScanResult> controllerDevices = <ScanResult>[];\n      //filter the scan results\n      var devNames = deviceListProvider.call();\n\n      for (ScanResult result in results) {\n        if (devNames.containsPartial(result.device.name)) {\n          nuxDevices.add(result);\n        } else {\n          bool validDevice = false;\n          //check if it advertises the MIDI service\n          for (var uuid in result.advertisementData.serviceUuids) {\n            if (uuid.toLowerCase() == BLEController.midiServiceGuid) {\n              validDevice = true;\n            }\n          }\n\n          //check if it is in the special device list\n          if (validDevice ||\n              forcedDevices.contains(result.advertisementData.localName) ||\n              forcedDevices.contains(result.device.name)) {\n            controllerDevices.add(result);\n          }\n        }\n      }\n      //convert to blescanresult\n      List<BLEScanResult> nuxBle = [], ctrlBle = [];\n      for (var dev in nuxDevices) {\n        nuxBle.add(FBPScanResult(dev));\n      }\n      for (var dev in controllerDevices) {\n        ctrlBle.add(FBPScanResult(dev));\n      }\n      onScanResults(nuxBle, ctrlBle);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n      for (ScanResult r in results) {\n        debugPrint('${r.device.name} found! rssi: ${r.rssi}');\n      }\n    });\n  }\n\n  @override\n  bool get isWriteReady => _midiCharacteristic != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data) async {\n    return _midiCharacteristic!.write(data, withoutResponse: true);\n  }\n}\n*/"
  },
  {
    "path": "lib/bluetooth/ble_controllers/FlutterBluePlusController.dart",
    "content": "/*\nThe original plugin used in Mightier Amp. For Android and iOS\nhttps://pub.dev/packages/flutter_blue_plus\n\nThis plugin works great. Unfortunately it's only for mobile platforms.\nMacOS is possible, due to almost 100% identical code to iOS\n*/\n\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_blue_plus/flutter_blue_plus.dart';\nimport 'package:mighty_plug_manager/bluetooth/ble_controllers/BLEController.dart';\nimport 'package:mighty_plug_manager/utilities/list_extenstions.dart';\n\nclass FBPScanResult extends BLEScanResult {\n  @override\n  String get id => (device as FBPBleDevice).device.id.toString().toLowerCase();\n\n  @override\n  String get name => (device as FBPBleDevice).device.name;\n\n  FBPScanResult(ScanResult sr) {\n    device = FBPBleDevice(sr.device);\n  }\n}\n\nclass FBPBleDevice extends BLEDevice {\n  final BluetoothDevice _device;\n  BluetoothDevice get device => _device;\n\n  FBPBleDevice(this._device);\n\n  @override\n  String get name => _device.name;\n\n  @override\n  String get id => _device.id.toString().toLowerCase();\n\n  @override\n  Stream<BleDeviceState> get state {\n    StreamController<BleDeviceState> stateStream = StreamController();\n    StreamSubscription<BluetoothDeviceState> s = _device.state.listen((event) {\n      switch (event) {\n        case BluetoothDeviceState.disconnected:\n          stateStream.add(BleDeviceState.disconnected);\n          break;\n        case BluetoothDeviceState.connecting:\n          stateStream.add(BleDeviceState.connecting);\n          break;\n        case BluetoothDeviceState.connected:\n          stateStream.add(BleDeviceState.connected);\n          break;\n        case BluetoothDeviceState.disconnecting:\n          stateStream.add(BleDeviceState.disconnecting);\n          break;\n      }\n    });\n\n    stateStream.onCancel = () {\n      s.cancel();\n    };\n    return stateStream.stream;\n  }\n}\n\nclass FlutterBluePlusController extends BLEController {\n  FlutterBluePlus flutterBlue = FlutterBluePlus.instance;\n\n  FBPBleDevice? _device;\n  @override\n  BLEDevice? get connectedDevice => _device;\n  BluetoothCharacteristic? _midiCharacteristic;\n  StreamSubscription? _deviceStreamSubscription;\n  bool _connectInProgress = false;\n\n  StreamSubscription<bool>? _scanningStatusSubscription;\n  StreamSubscription<BluetoothState>? _bluetoothStateSubscription;\n  StreamSubscription<List<ScanResult>>? _scanSubscription;\n\n  FlutterBluePlusController(List<String> forcedDevices) : super(forcedDevices);\n\n  @override\n  Future<bool> isAvailable() {\n    return flutterBlue.isAvailable;\n  }\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    _subscribeBleState();\n    _subscribeScanningStatus();\n    _subscribeScanResults();\n\n    flutterBlue.setLogLevel(LogLevel.info);\n  }\n\n  @override\n  void startScanning() {\n    if (bleState == BleState.off) return;\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n    flutterBlue\n        .startScan(\n      timeout: const Duration(seconds: 8),\n      //withServices: [Guid(midiService)]\n    )\n        .then((result) {\n      //if device is not connected after the search - set to idle\n      if (_device == null) setMidiSetupStatus(MidiSetupStatus.deviceIdle);\n    });\n  }\n\n  @override\n  Future stopScanning() {\n    if (bleState == BleState.off) return Future.value(null);\n    return flutterBlue.stopScan();\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (bleState != BleState.on) return null;\n    var ownDevice = (device as FBPBleDevice).device;\n\n    bool ampDevice = false;\n    if (deviceListProvider.call().containsPartial(ownDevice.name)) {\n      ampDevice = true;\n      if (_connectInProgress || _device != null) {\n        debugPrint(\"Denying secondary connection!\");\n        return null;\n      }\n    }\n\n    _connectInProgress = true;\n    await stopScanning();\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n    try {\n      await ownDevice.connect(\n          autoConnect: false, timeout: const Duration(seconds: 5));\n    } on Exception {\n      _connectInProgress = false;\n      return null;\n    } catch (e) {\n      debugPrint(\"Connect error $e\");\n      _connectInProgress = false;\n      if (e == 'already_connected') return null;\n      rethrow;\n    }\n\n    if (ampDevice) {\n      if (_device != null) return null;\n      _device = device;\n    }\n\n    List<BluetoothService> services = await ownDevice.discoverServices();\n    //find midi service\n    BluetoothService? midiService;\n    for (var element in services) {\n      if (element.uuid == Guid(BLEController.midiServiceGuid)) {\n        midiService = element;\n      }\n    }\n\n    if (midiService != null) {\n      for (var characteristic in midiService.characteristics) {\n        if (characteristic.uuid == Guid(BLEController.midiCharacteristicGuid)) {\n          if (ampDevice) {\n            _connectAmpDevice(device.device, characteristic);\n          } else {\n            characteristic.setNotifyValue(true);\n            _connectInProgress = false;\n            return BLEConnection(characteristic.value);\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  void _connectAmpDevice(\n      BluetoothDevice device, BluetoothCharacteristic characteristic) {\n    _midiCharacteristic = characteristic;\n\n    _midiCharacteristic?.setNotifyValue(true);\n\n    _connectInProgress = false;\n\n    setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n    _deviceStreamSubscription = device.state.listen((event) {\n      if (event == BluetoothDeviceState.disconnected) {\n        if (Platform.isAndroid) {\n          //android deadObjectException fix\n          device.clearGattCache().then((value) {\n            device.disconnect();\n          }).catchError((_) {});\n        }\n        _deviceStreamSubscription?.cancel();\n        _device = null;\n        _midiCharacteristic = null;\n        _connectInProgress = false;\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n      }\n    });\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int>) listener) {\n    return _midiCharacteristic!.value.listen(listener);\n  }\n\n  @override\n  void disconnectDevice() async {\n    if (_device != null) {\n      _connectInProgress = false;\n      await _device?.device.disconnect();\n      _midiCharacteristic = null;\n      _device = null;\n    }\n  }\n\n  @override\n  void dispose() {\n    _scanningStatusSubscription?.cancel();\n    _bluetoothStateSubscription?.cancel();\n    _scanSubscription?.cancel();\n    _device?.device.disconnect();\n    _connectInProgress = false;\n  }\n\n  _subscribeBleState() {\n    _bluetoothStateSubscription = flutterBlue.state.listen((event) {\n      debugPrint(event.toString());\n      switch (event) {\n        case BluetoothState.unknown:\n          //fix for ios not recognizing bluetooth on at startup\n          if (Platform.isIOS) {\n            Future.delayed(const Duration(milliseconds: 500)).then((value) {\n              flutterBlue.isOn.then((value) {\n                if (value) {\n                  bleState = BleState.on;\n                  setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n                  startScanning();\n                }\n              });\n            });\n          }\n          break;\n        case BluetoothState.unavailable:\n        case BluetoothState.unauthorized:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          break;\n        case BluetoothState.turningOn:\n        case BluetoothState.on:\n          bleState = BleState.on;\n          setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n          startScanning();\n          break;\n        case BluetoothState.turningOff:\n          flutterBlue.stopScan();\n          break;\n        case BluetoothState.off:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          _device = null;\n          _connectInProgress = false;\n          break;\n      }\n    });\n  }\n\n  _subscribeScanningStatus() {\n    _scanningStatusSubscription = flutterBlue.isScanning.listen((event) {\n      setScanningStatus(event);\n    });\n  }\n\n  _subscribeScanResults() {\n    _scanSubscription = flutterBlue.scanResults.listen((results) {\n      List<ScanResult> nuxDevices = <ScanResult>[];\n      List<ScanResult> controllerDevices = <ScanResult>[];\n      //filter the scan results\n      var devNames = deviceListProvider.call();\n\n      for (ScanResult result in results) {\n        if (devNames.containsPartial(result.device.name)) {\n          nuxDevices.add(result);\n        } else {\n          bool validDevice = false;\n          //check if it advertises the MIDI service\n          for (var uuid in result.advertisementData.serviceUuids) {\n            if (uuid.toLowerCase() == BLEController.midiServiceGuid) {\n              validDevice = true;\n            }\n          }\n\n          //check if it is in the special device list\n          if (validDevice ||\n              forcedDevices.contains(result.advertisementData.localName) ||\n              forcedDevices.contains(result.device.name)) {\n            controllerDevices.add(result);\n          }\n        }\n      }\n      //convert to blescanresult\n      List<BLEScanResult> nuxBle = [], ctrlBle = [];\n      for (var dev in nuxDevices) {\n        nuxBle.add(FBPScanResult(dev));\n      }\n      for (var dev in controllerDevices) {\n        ctrlBle.add(FBPScanResult(dev));\n      }\n      onScanResults(nuxBle, ctrlBle);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n      for (ScanResult r in results) {\n        debugPrint('${r.device.name} found! rssi: ${r.rssi}');\n      }\n    });\n  }\n\n  @override\n  bool get isWriteReady => _midiCharacteristic != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data, bool noResponse) async {\n    bool withoutResponse = noResponse;\n    //wait for response on sysex messages\n    //if (data[2] == 0xf0) withoutResponse = false;\n    return _midiCharacteristic!.write(data, withoutResponse: withoutResponse);\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/FlutterReactiveBle.dart",
    "content": "\n/*\nimport 'dart:async';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_reactive_ble/flutter_reactive_ble.dart';\nimport 'package:mighty_plug_manager/bluetooth/ble_controllers/BLEController.dart';\n\nclass FRBScanResult extends BLEScanResult {\n  @override\n  String get id => (device as FRBleDevice).id.toString().toLowerCase();\n\n  @override\n  String get name => (device as FRBleDevice).name;\n\n  FRBScanResult(DiscoveredDevice sr) {\n    device = FRBleDevice(sr);\n  }\n}\n\nclass FRBleDevice extends BLEDevice {\n  final DiscoveredDevice _device;\n  DiscoveredDevice get device => _device;\n\n  FRBleDevice(this._device);\n\n  @override\n  String get name => _device.name;\n\n  @override\n  String get id => _device.id.toString().toLowerCase();\n\n  @override\n  Stream<BleDeviceState> get state {\n    StreamController<BleDeviceState> stateStream = StreamController();\n    StreamSubscription<BluetoothDeviceState> s = _device.state.listen((event) {\n      switch (event) {\n        case BluetoothDeviceState.disconnected:\n          stateStream.add(BleDeviceState.disconnected);\n          break;\n        case BluetoothDeviceState.connecting:\n          stateStream.add(BleDeviceState.connecting);\n          break;\n        case BluetoothDeviceState.connected:\n          stateStream.add(BleDeviceState.connected);\n          break;\n        case BluetoothDeviceState.disconnecting:\n          stateStream.add(BleDeviceState.disconnecting);\n          break;\n      }\n    });\n\n    stateStream.onCancel = () {\n      s.cancel();\n    };\n    return stateStream.stream;\n  }\n}\n\nclass FlutterReactiveBleController extends BLEController {\n  FlutterReactiveBle flutterBlue = FlutterReactiveBle();\n\n  FRBleDevice? _device;\n  @override\n  BLEDevice? get connectedDevice => _device;\n  BluetoothCharacteristic? _midiCharacteristic;\n  StreamSubscription? _deviceStreamSubscription;\n  bool _connectInProgress = false;\n\n  StreamSubscription<bool>? _scanningStatusSubscription;\n  StreamSubscription<BluetoothState>? _bluetoothStateSubscription;\n  StreamSubscription<List<ScanResult>>? _scanSubscription;\n\n  FlutterReactiveBleController(List<String> forcedDevices)\n      : super(forcedDevices);\n\n  @override\n  Future<bool> isAvailable() async {\n    return true;\n  }\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    _subscribeBleState();\n    _subscribeScanningStatus();\n    _subscribeScanResults();\n  }\n\n  @override\n  void startScanning() {\n    if (bleState == BleState.off) return;\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n\n    flutterBlue.scanForDevices(\n      withServices: [],\n    );\n\n    flutterBlue\n        .startScan(\n      timeout: const Duration(seconds: 8),\n      //withServices: [Guid(midiService)]\n    )\n        .then((result) {\n      //if device is not connected after the search - set to idle\n      if (_device == null) setMidiSetupStatus(MidiSetupStatus.deviceIdle);\n    });\n  }\n\n  @override\n  void stopScanning() {\n    if (bleState == BleState.off) return;\n    flutterBlue.stopScan();\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (bleState != BleState.on) return null;\n    var ownDevice = (device as FBPBleDevice).device;\n\n    bool ampDevice = false;\n    if (deviceListProvider.call().containsPartial(ownDevice.name)) {\n      ampDevice = true;\n      if (_connectInProgress || _device != null) {\n        debugPrint(\"Denying secondary connection!\");\n        return null;\n      }\n    }\n\n    _connectInProgress = true;\n    stopScanning();\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n    try {\n      await ownDevice.connect(\n          autoConnect: false, timeout: const Duration(seconds: 5));\n    } on Exception {\n      _connectInProgress = false;\n      return null;\n    } catch (e) {\n      debugPrint(\"Connect error $e\");\n      _connectInProgress = false;\n      if (e == 'already_connected') return null;\n      rethrow;\n    }\n\n    if (ampDevice) {\n      if (_device != null) return null;\n      _device = device;\n    }\n\n    List<BluetoothService> services = await ownDevice.discoverServices();\n    //find midi service\n    BluetoothService? midiService;\n    for (var element in services) {\n      if (element.uuid == Guid(BLEController.midiServiceGuid)) {\n        midiService = element;\n      }\n    }\n\n    if (midiService != null) {\n      for (var characteristic in midiService.characteristics) {\n        if (characteristic.uuid == Guid(BLEController.midiCharacteristicGuid)) {\n          if (ampDevice) {\n            _connectAmpDevice(device.device, characteristic);\n          } else {\n            characteristic.setNotifyValue(true);\n            _connectInProgress = false;\n            return BLEConnection(characteristic.value);\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  void _connectAmpDevice(\n      BluetoothDevice device, BluetoothCharacteristic characteristic) {\n    _midiCharacteristic = characteristic;\n\n    _midiCharacteristic?.setNotifyValue(true);\n\n    _connectInProgress = false;\n\n    setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n    _deviceStreamSubscription = device.state.listen((event) {\n      if (event == BluetoothDeviceState.disconnected) {\n        _deviceStreamSubscription?.cancel();\n        _device = null;\n        _midiCharacteristic = null;\n        _connectInProgress = false;\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n      }\n    });\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int>) listener) {\n    return _midiCharacteristic!.value.listen(listener);\n  }\n\n  @override\n  void disconnectDevice() async {\n    if (_device != null) {\n      _connectInProgress = false;\n      await _device?.device.disconnect();\n      _midiCharacteristic = null;\n      _device = null;\n    }\n  }\n\n  @override\n  void dispose() {\n    _scanningStatusSubscription?.cancel();\n    _bluetoothStateSubscription?.cancel();\n    _scanSubscription?.cancel();\n    _device?.device.disconnect();\n    _connectInProgress = false;\n  }\n\n  _subscribeBleState() {\n    _bluetoothStateSubscription = flutterBlue.statusStream.listen((event) {\n      debugPrint(event.toString());\n      switch (event) {\n        case BleStatus.unknown:\n        case BleStatus.poweredOff:\n        case BleStatus.unauthorized:\n        case BleStatus.unsupported:\n        case BleStatus.locationServicesDisabled:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          break;\n        case BleStatus.ready:\n          bleState = BleState.on;\n          setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n          startScanning();\n          break;\n        case BleStatus.poweredOff:\n          //flutterBlue.\n          break;\n        case BluetoothState.off:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          _device = null;\n          _connectInProgress = false;\n          break;\n      }\n    });\n  }\n\n  _onScanResults(DiscoveredDevice result) {\n    List<DiscoveredDevice> nuxDevices = [];\n    List<DiscoveredDevice> controllerDevices = [];\n    //filter the scan results\n    var devNames = deviceListProvider.call();\n\n    if (devNames.containsPartial(result.name)) {\n      nuxDevices.add(result);\n    } else {\n      bool validDevice = false;\n      //check if it advertises the MIDI service\n      for (var uuid in result.serviceUuids) {\n        if (uuid.toString().toLowerCase() == BLEController.midiServiceGuid) {\n          validDevice = true;\n        }\n      }\n\n      //check if it is in the special device list\n      if (validDevice || forcedDevices.contains(result.name)) {\n        controllerDevices.add(result);\n      }\n    }\n\n    //convert to blescanresult\n    List<BLEScanResult> nuxBle = [], ctrlBle = [];\n    for (var dev in nuxDevices) {\n      nuxBle.add(FBPScanResult(dev));\n    }\n    for (var dev in controllerDevices) {\n      ctrlBle.add(FBPScanResult(dev));\n    }\n    onScanResults(nuxBle, ctrlBle);\n    setMidiSetupStatus(MidiSetupStatus.deviceFound);\n    for (ScanResult r in results) {\n      debugPrint('${r.device.name} found! rssi: ${r.rssi}');\n    }\n  }\n\n  @override\n  bool get isWriteReady => _midiCharacteristic != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data) async {\n    return _midiCharacteristic!.write(data, withoutResponse: true);\n  }\n}\n*/"
  },
  {
    "path": "lib/bluetooth/ble_controllers/MightyBle.dart",
    "content": "import 'dart:async';\nimport 'package:mighty_plug_manager/utilities/list_extenstions.dart';\n\nimport 'BLEController.dart';\nimport 'package:mighty_ble/mighty_ble.dart';\n\nclass MBScanResult extends BLEScanResult {\n  @override\n  String get id => (device as MBDevice).id;\n\n  @override\n  String get name => (device as MBDevice).name;\n\n  MBScanResult(ScanResult sr) {\n    device = MBDevice(sr.id, sr.name);\n  }\n}\n\nclass MBDevice extends BLEDevice {\n  final String _device;\n  final String _name;\n  String get device => _device;\n  final StreamController<BleDeviceState> _stateStream = StreamController();\n\n  MBDevice(this._device, this._name);\n\n  @override\n  String get name => _name;\n\n  @override\n  String get id => _device;\n\n  @override\n  Stream<BleDeviceState> get state => _stateStream.stream;\n\n  void statePost(BleDeviceState state) {\n    _stateStream.add(state);\n  }\n\n  void dispose() {\n    _stateStream.close();\n  }\n}\n\nclass MightyBLEController extends BLEController {\n  MightyBle mightyBle = MightyBle();\n\n  MightyBLEController(List<String> forcedDevices) : super(forcedDevices);\n\n  StreamSubscription<bool>? _scanningStatusSubscription;\n  //StreamSubscription<BluetoothState>? _bluetoothStateSubscription;\n  StreamSubscription<List<ScanResult>>? _scanSubscription;\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    mightyBle.init();\n    //_subscribeBleState();\n    _subscribeScanningStatus();\n    _subscribeScanResults();\n    _subscribeConnectStatus();\n    mightyBle.setNotifyCallback(_notifyCallback);\n\n    setMidiSetupStatus(MidiSetupStatus.deviceIdle);\n    bleState = BleState.on;\n  }\n\n  MBDevice? _connectedDevice;\n  MBDevice? _tmpConnectingDevice;\n\n  @override\n  MBDevice? get connectedDevice => _connectedDevice;\n\n  StreamController<List<int>>? _dataStreamController;\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    var ownDevice = (device as MBDevice);\n    _tmpConnectingDevice = device;\n    mightyBle.connect(ownDevice.id);\n    ownDevice.statePost(BleDeviceState.connecting);\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n    return null;\n  }\n\n  @override\n  void disconnectDevice() async {\n    if (_connectedDevice == null) {\n      return;\n    }\n    var ownDevice = (connectedDevice as MBDevice);\n    _connectedDevice!.statePost(BleDeviceState.disconnecting);\n    await mightyBle.disconnect(ownDevice.id);\n  }\n\n  @override\n  void dispose() {\n    _scanningStatusSubscription?.cancel();\n    _scanSubscription?.cancel();\n    _dataStreamController?.close();\n  }\n\n  @override\n  Future<bool> isAvailable() async {\n    return await mightyBle.isAvailable();\n  }\n\n  @override\n  bool get isWriteReady => _connectedDevice != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data, bool noResponse) {\n    return mightyBle.writeBle(_connectedDevice!.id, data);\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int> value) listener) {\n    _dataStreamController = StreamController();\n    return _dataStreamController!.stream.listen(listener);\n  }\n\n  @override\n  void startScanning() {\n    mightyBle.startScan();\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n  }\n\n  @override\n  void stopScanning() {\n    mightyBle.stopScan();\n  }\n\n/*\n  @override\n  Future setNotificationEnabled(bool enabled) async {\n    if (_connectedDevice == null) return;\n    return mightyBle.setNotificationEnabled(_connectedDevice!.id, enabled);\n  }\n*/\n  _notifyCallback(String id, List<int> data) {\n    if (_connectedDevice != null) {\n      if (_connectedDevice!.id == id) {\n        _dataStreamController?.add(data);\n      }\n    }\n  }\n\n  _subscribeScanningStatus() {\n    _scanningStatusSubscription = mightyBle.scanStatus.listen((event) {\n      print(\"ScanStatus $event\");\n      setScanningStatus(event);\n    });\n  }\n\n  _subscribeScanResults() {\n    _scanSubscription = mightyBle.scanResults.listen((results) {\n      List<ScanResult> nuxDevices = <ScanResult>[];\n      List<ScanResult> controllerDevices = <ScanResult>[];\n      //filter the scan results\n      var devNames = deviceListProvider.call();\n\n      for (ScanResult result in results) {\n        if (devNames.containsPartial(result.name)) {\n          nuxDevices.add(result);\n        } else {\n          //check if it is in the special device list\n          if (result.hasMidiService || forcedDevices.contains(result.name)) {\n            controllerDevices.add(result);\n          }\n        }\n      }\n      //convert to blescanresult\n      List<BLEScanResult> nuxBle = [], ctrlBle = [];\n      for (var dev in nuxDevices) {\n        nuxBle.add(MBScanResult(dev));\n      }\n      for (var dev in controllerDevices) {\n        ctrlBle.add(MBScanResult(dev));\n      }\n      onScanResults(nuxBle, ctrlBle);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n      for (ScanResult r in results) {\n        print('${r.name} found!');\n      }\n    });\n  }\n\n  _subscribeConnectStatus() {\n    mightyBle.onConnect.listen((id) {\n      print(\"MightyBle on connect $id\");\n      if (_tmpConnectingDevice?.id == id) {\n        _connectedDevice = _tmpConnectingDevice;\n        _tmpConnectingDevice = null;\n        setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n        _connectedDevice!.statePost(BleDeviceState.connected);\n      }\n    });\n    mightyBle.onDisconnect.listen((id) {\n      print(\"MightyBle on disconnect $id\");\n      if (id == _connectedDevice?.id) {\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n        _connectedDevice!.statePost(BleDeviceState.disconnected);\n        _connectedDevice!.dispose();\n        _connectedDevice = null;\n        _dataStreamController?.close();\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/QuickBlueController.dart",
    "content": "/*\nController that uses quick_blue plugin, which supports all platforms, except web\nhttps://pub.dev/packages/quick_blue\n\nSummary\nState: Bad\n\nTested mostly in Windows, also in Linux and Android\nWindows:\nWhen app is launched, the first connection attempt works 50% of the time.\nAny subsequent connects don't work. Few days later it stopped working AT ALL!\nSometimes even crashes the app\n\nLinux:\nthe version from pub.dev has incomplete linux port, only scanning is done.\nThere's another nearly complete version here\nhttps://github.com/woodemi/quick.flutter/tree/master/packages/quick_blue\nHowever it's not reliable. While it connects, it does not raise connect &\ndisconnect events properly. It uses bluez plugin for linux:\nhttps://pub.dev/packages/bluez\nThis can be used as a starting point for custom plugin\n\nAndroid:\ntested it just a little, works horrible, which proves that the plugin is crap,\nbecause the actual Android plugin that I use - flutter_blue_plugin is flawless. \nAnother problem is that it required API level 21 (Lollipop), however there are\ntoo many people using the app on KitKat so it's important to keep compatibility.\nThis plugin doesn't provide device services while scanning. This is important,\nbecause it can't filter by devices which support MIDI-BLE\n*/\n\n/*\nimport 'dart:async';\nimport 'dart:typed_data';\nimport 'package:quick_blue/quick_blue.dart';\nimport 'BLEController.dart';\n\nclass QuickBlueScanResult extends BLEScanResult {\n  @override\n  String get id => (device as QuickBlueDevice).id;\n\n  @override\n  String get name => (device as QuickBlueDevice).name;\n\n  late BlueScanResult _scanResult;\n\n  QuickBlueScanResult(BlueScanResult r) {\n    _scanResult = r;\n    device = QuickBlueDevice(_scanResult);\n  }\n}\n\nclass QuickBlueDevice extends BLEDevice {\n  final BlueScanResult _scanResult;\n  late StreamController<BleDeviceState> _deviceState;\n\n  QuickBlueDevice(this._scanResult);\n\n  @override\n  String get id => _scanResult.deviceId;\n\n  @override\n  String get name => _scanResult.name;\n\n  void setupDeviceStateStream() {\n    _deviceState = StreamController();\n  }\n\n  void publishDeviceState(BleDeviceState devState) {\n    _deviceState.add(devState);\n    if (devState == BleDeviceState.disconnected) {\n      _deviceState.close();\n    }\n  }\n\n  @override\n  // TODO: implement state\n  Stream<BleDeviceState> get state => _deviceState.stream;\n}\n\nclass QuickBlueController extends BLEController {\n  QuickBlueController(List<String> forcedDevices) : super(forcedDevices);\n\n  StreamSubscription<BlueScanResult>? _scanSubscription;\n\n  QuickBlueDevice? _device;\n\n  List<BlueScanResult> scannedDevices = [];\n\n  DateTime _scanStarted = DateTime.now();\n\n  late List<String> nuxDeviceNames;\n\n  StreamController<List<int>>? _dataStreamController;\n\n  bool _connected = false;\n  bool _connectInProgress = false;\n\n  @override\n  // TODO: implement connectedDevice\n  BLEDevice? get connectedDevice => _device;\n\n  @override\n  Future<bool> isAvailable() async {\n    bool available = await QuickBlue.isBluetoothAvailable();\n    if (available) bleState = BleState.on;\n    return available;\n  }\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    nuxDeviceNames = deviceListProvider.call();\n    //_subscribeBleState();\n    //_subscribeScanningStatus();\n    _subscribeScanResults();\n\n    QuickBlue.setValueHandler(_handleValueChange);\n  }\n\n  @override\n  void startScanning() {\n    if (bleState == BleState.off) return;\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n    setScanningStatus(true);\n    _scanStarted = DateTime.now();\n    QuickBlue.startScan();\n  }\n\n  @override\n  void stopScanning() {\n    QuickBlue.stopScan();\n    setScanningStatus(false);\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int> data) listener) {\n    _dataStreamController = StreamController();\n    return _dataStreamController!.stream.listen(listener);\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (bleState != BleState.on) return null;\n\n    bool ampDevice = false;\n    if (nuxDeviceNames.containsPartial(device.name)) {\n      ampDevice = true;\n      if (_connectInProgress || _device != null) {\n        print(\"Denying secondary connection!\");\n        return null;\n      }\n    }\n\n    _connectInProgress = true;\n    stopScanning();\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n\n    if (ampDevice) {\n      if (_device != null) return null;\n      _device = device as QuickBlueDevice;\n      _device!.setupDeviceStateStream();\n      _device!.publishDeviceState(BleDeviceState.connecting);\n    }\n\n    QuickBlue.setConnectionHandler(_handleConnectionChange);\n    QuickBlue.connect(device.id);\n  }\n\n  void _handleConnectionChange(String deviceId, BlueConnectionState state) {\n    if (_device != null && deviceId == _device!.id) {\n      switch (state) {\n        case BlueConnectionState.connected:\n          print(\"QuickBlue: device connected\");\n          _device!.publishDeviceState(BleDeviceState.connected);\n          QuickBlue.setServiceHandler(_handleServiceDiscovery);\n          QuickBlue.discoverServices(_device!.id);\n          break;\n        case BlueConnectionState.disconnected:\n          print(\"QuickBlue: device disconnected\");\n          _device!.publishDeviceState(BleDeviceState.disconnected);\n          _dataStreamController?.close();\n          _device = null;\n          _connectInProgress = false;\n          _connected = false;\n          setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n          break;\n      }\n    }\n  }\n\n  void _handleServiceDiscovery(\n      String deviceId, String serviceId, List<String> characteristicIds) {\n    if (_device != null && deviceId == _device!.id) {\n      if (serviceId == BLEController.midiServiceGuid) {\n        print(\"QuickBlue: midi service discovered\");\n        if (characteristicIds.contains(BLEController.midiCharacteristicGuid)) {\n          print(\"QuickBlue: midi characteristic discovered\");\n          _connectInProgress = false;\n          _connected = true;\n          setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n          QuickBlue.setNotifiable(\n              deviceId,\n              serviceId,\n              BLEController.midiCharacteristicGuid,\n              BleInputProperty.notification);\n        }\n      }\n    }\n  }\n\n  void _handleValueChange(\n      String deviceId, String characteristicId, Uint8List value) {\n    print(\"QuickBlue: Data coming\");\n    if (_device != null && _device!.id == deviceId) {\n      _dataStreamController?.add(value.toList());\n    }\n  }\n\n  @override\n  void disconnectDevice() {\n    if (_device != null) {\n      _connectInProgress = false;\n      QuickBlue.disconnect(_device!.id);\n\n      //TODO: this should not be here\n      _dataStreamController?.close();\n      _device = null;\n      _connectInProgress = false;\n      _connected = false;\n    }\n  }\n\n  @override\n  void dispose() {\n    _scanSubscription?.cancel();\n  }\n\n  @override\n  bool get isWriteReady => _connected;\n\n  @override\n  Future writeToCharacteristic(List<int> data) async {\n    print(\"QuickBlue: Writing\");\n    if (_connected) {\n      return QuickBlue.writeValue(\n          _device!.id,\n          BLEController.midiServiceGuid,\n          BLEController.midiCharacteristicGuid,\n          Uint8List.fromList(data),\n          BleOutputProperty.withoutResponse);\n    }\n  }\n\n  void _subscribeScanResults() {\n    _scanSubscription =\n        _scanSubscription = QuickBlue.scanResultStream.listen((device) {\n      print(\"---Scan Result---\");\n      print(device.deviceId);\n      print(device.name);\n      print(device.rssi);\n      print(device.manufacturerData.toList());\n      print(device.manufacturerDataHead.toList());\n\n      final index = scannedDevices\n          .indexWhere((element) => element.deviceId == device.deviceId);\n      // Updating existing device\n      if (index != -1) {\n        // if (device.name.isNotEmpty && scannedDevices[index].name.isEmpty) {\n        //   scannedDevices[index].name = device.name;\n        // }\n\n        // if (device.serviceUuids.isNotEmpty &&\n        //     scannedDevices[index].serviceUuids.isEmpty) {\n        //   scannedDevices[index].serviceUuids = device.serviceUuids;\n        // }\n      } else {\n        scannedDevices.add(device);\n      }\n\n      //TODO: scan timeout must be implemented in a different way\n      //because this breaks in linux\n      if ((DateTime.now().difference(_scanStarted).inMilliseconds < 5000)) {\n        return;\n      }\n\n      stopScanning();\n      scannedDevices\n          .retainWhere((device) => nuxDeviceNames.containsPartial(device.name));\n\n      List<BLEScanResult> nuxBle = [], ctrlBle = [];\n      for (var dev in scannedDevices) {\n        nuxBle.add(QuickBlueScanResult(dev));\n      }\n\n      onScanResults(nuxBle, []);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n    });\n  }\n}\n*/"
  },
  {
    "path": "lib/bluetooth/ble_controllers/WebBleController.dart",
    "content": "/*\nController that uses flutter_web_bluetooth plugin for adding BLE support for web\nhttps://pub.dev/packages/flutter_web_bluetooth\n\nSummary\nState: works somewhat\n\nThe plugin works, but is not very reliable. Can't determine if the platform\nhas bluetooth hardware or not. Connects half of the time, sometimes disconnects\nin 1-2 minutes of inactivity. This may be due to the very early stage of\nweb bluetooth standard. \n*/\n\nimport 'dart:async';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_web_bluetooth/flutter_web_bluetooth.dart';\nimport 'package:flutter_web_bluetooth/js_web_bluetooth.dart';\nimport 'BLEController.dart';\n\nclass WebBleScanResult extends BLEScanResult {\n  @override\n  String get id => (device as WebBleDevice).device.id.toString().toLowerCase();\n\n  @override\n  String get name => (device as WebBleDevice).device.name ?? \"Unknown\";\n\n  WebBleScanResult(BluetoothDevice dev) {\n    device = WebBleDevice(dev);\n  }\n}\n\nclass WebBleDevice extends BLEDevice {\n  final BluetoothDevice _device;\n  BluetoothDevice get device => _device;\n\n  WebBleDevice(this._device);\n\n  @override\n  String get name => _device.name ?? \"Unknown\";\n\n  @override\n  String get id => _device.id.toString().toLowerCase();\n\n  @override\n  Stream<BleDeviceState> get state {\n    StreamController<BleDeviceState> stateStream = StreamController();\n    StreamSubscription<bool> s = _device.connected.listen((event) {\n      if (event) {\n        stateStream.add(BleDeviceState.disconnected);\n      } else {\n        stateStream.add(BleDeviceState.connected);\n      }\n    });\n\n    stateStream.onCancel = () {\n      s.cancel();\n    };\n    return stateStream.stream;\n  }\n}\n\nclass WebBleController extends BLEController {\n  WebBleController(List<String> forcedDevices) : super(forcedDevices);\n\n  StreamSubscription<bool>? _bluetoothStateSubscription;\n  StreamSubscription<bool>? _deviceStreamSubscription;\n\n  WebBleDevice? _device;\n  @override\n  BLEDevice? get connectedDevice => _device;\n\n  BluetoothCharacteristic? _characteristic;\n  bool? lastBleState;\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n    _subscribeBleState();\n  }\n\n  @override\n  Future<bool> isAvailable() async {\n    // The bluetooth api exists in this user agent.\n    final supported = FlutterWebBluetooth.instance\n        .isBluetoothApiSupported; // A stream that says if a bluetooth adapter is available to the browser.\n    return supported;\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice dev) async {\n    var ownDevice = dev as WebBleDevice;\n    var device = ownDevice.device;\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n    await device.connect();\n    final services = await device.discoverServices();\n    final service = services\n        .firstWhere((service) => service.uuid == BLEController.midiServiceGuid);\n    // Now get the characteristic\n    _characteristic =\n        await service.getCharacteristic(BLEController.midiCharacteristicGuid);\n    await _characteristic?.startNotifications();\n    _device = dev;\n    setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n\n    _deviceStreamSubscription = device.connected.listen((event) {\n      if (event == false) {\n        _deviceStreamSubscription?.cancel();\n        _device = null;\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n      }\n    });\n    return null;\n  }\n\n  @override\n  void disconnectDevice() {\n    // TODO: implement disconnectDevice\n    _device?.device.disconnect();\n    _device = null;\n    _characteristic = null;\n  }\n\n  @override\n  void startScanning() async {\n    final requestOptions = RequestOptionsBuilder.acceptAllDevices(\n        optionalServices: [BLEController.midiServiceGuid]);\n\n    try {\n      final device =\n          await FlutterWebBluetooth.instance.requestDevice(requestOptions);\n      final scanResult = WebBleScanResult(device);\n      onScanResults([scanResult], []);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n    } on UserCancelledDialogError {\n      // The user cancelled the dialog\n    } on DeviceNotFoundError {\n      // There is no device in range for the options defined above\n    }\n  }\n\n  @override\n  void stopScanning() {}\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int> data) listener) {\n    StreamController<List<int>> streamCtrl = StreamController();\n    var dataSubscr = _characteristic?.value.listen((data) {\n      var listData = data.buffer.asUint8List().toList(growable: false);\n      streamCtrl.add(listData);\n    });\n\n    streamCtrl.onCancel = () {\n      dataSubscr?.cancel();\n    };\n\n    return streamCtrl.stream.listen(listener);\n  }\n\n  @override\n  bool get isWriteReady => _characteristic != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data, noResponse) async {\n    Uint8List byteData = Uint8List.fromList(data);\n    if (noResponse) {\n      return _characteristic!.writeValueWithoutResponse(byteData);\n    } else {\n      return _characteristic!.writeValueWithResponse(byteData);\n    }\n  }\n\n  @override\n  void dispose() {\n    _bluetoothStateSubscription?.cancel();\n  }\n\n  _subscribeBleState() {\n    _bluetoothStateSubscription =\n        FlutterWebBluetooth.instance.isAvailable.listen((event) {\n      if (lastBleState != null && lastBleState == event) return;\n      debugPrint(\"Ble state ${event.toString()}\");\n      bleState = event ? BleState.on : BleState.off;\n      lastBleState = event;\n      if (event) {\n        bleState = BleState.on;\n        setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n        startScanning();\n      } else {\n        bleState = BleState.off;\n        setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/ble_controllers/WinBleController.dart",
    "content": "/*\nController that uses win_ble plugin for adding BLE support for Windows\nhttps://pub.dev/packages/win_ble\n\nSummary\nState: Unusable\n\nBLE support detection works 10% of the time\nConnection to the device works\nIF the peripheral device sends a packet that has a byte with value 0x40,\nmaybe also 0x41, the packet is not received at all:\nhttps://github.com/rohitsangwan01/win_ble/issues/17\n*/\n\n/*\nimport 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:win_ble/win_ble.dart' as ble;\n\nimport 'BLEController.dart';\n\nclass WinBleScanResult extends BLEScanResult {\n  @override\n  String get id => (device as WinBleDevice).id;\n\n  @override\n  String get name => (device as WinBleDevice).name;\n\n  WinBleScanResult(ble.BleDevice dev) {\n    device = WinBleDevice(dev);\n  }\n}\n\nclass WinBleDevice extends BLEDevice {\n  final ble.BleDevice _device;\n\n  WinBleDevice(this._device);\n\n  @override\n  // TODO: implement id\n  String get id => _device.address;\n\n  @override\n  // TODO: implement name\n  String get name => _device.name;\n\n  String get address => _device.address;\n\n  ble.BleDevice get device => _device;\n\n  @override\n  // TODO: implement state\n  Stream<BleDeviceState> get state => throw UnimplementedError();\n}\n\nclass WinBleController extends BLEController {\n  WinBleController(List<String> forcedDevices) : super(forcedDevices);\n\n  WinBleDevice? _device;\n  ble.BleCharacteristic? _midiCharacteristic;\n  bool _connectInProgress = false;\n\n  bool? _bleSupported;\n  bool _scanning = false;\n  DateTime _scanStarted = DateTime.now();\n  List<ble.BleDevice> scannedDevices = [];\n\n  late List<String> nuxDeviceNames;\n\n  StreamSubscription<ble.BleDevice>? _scanSubscription;\n  StreamSubscription<ble.BleState>? _bluetoothStateSubscription;\n  StreamSubscription<bool>? _deviceStreamSubscription;\n\n  @override\n  BLEDevice? get connectedDevice => _device;\n\n  @override\n  Future init(ScanResultsCallback callback) async {\n    await super.init(callback);\n\n    nuxDeviceNames = deviceListProvider.call();\n    _subscribeBleState();\n    _subscribeScanResults();\n\n    await ble.WinBle.initialize(enableLog: false);\n    print(\"WinBle controller init.\");\n\n    bleState = BleState.on;\n  }\n\n  @override\n  Future<bool> isAvailable() async {\n    for (int i = 0; i < 10; i++) {\n      if (_bleSupported != null) break;\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n    if (_bleSupported == null) {\n      print(\"Can't get info if bluetooth is supported\");\n    }\n    return _bleSupported ?? false;\n  }\n\n  @override\n  void startScanning() {\n    if (bleState == BleState.off) return;\n\n    scannedDevices.clear();\n    _scanSubscription?.cancel();\n    _subscribeScanResults();\n    ble.WinBle.startScanning();\n    setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n    setScanningStatus(true);\n    _scanning = true;\n    _scanStarted = DateTime.now();\n  }\n\n  @override\n  void stopScanning() {\n    if (bleState == BleState.off) return;\n    _scanSubscription?.cancel();\n    ble.WinBle.stopScanning();\n    setScanningStatus(false);\n    _scanning = false;\n  }\n\n  @override\n  Future<BLEConnection?> connectToDevice(BLEDevice device) async {\n    if (bleState != BleState.on) return null;\n    WinBleDevice ownDevice = device as WinBleDevice;\n\n    bool ampDevice = false;\n    if (deviceListProvider.call().contains(ownDevice.name)) {\n      ampDevice = true;\n      if (_connectInProgress || _device != null) {\n        print(\"Denying secondary connection!\");\n        return null;\n      }\n    }\n\n    _connectInProgress = true;\n    stopScanning();\n\n    setMidiSetupStatus(MidiSetupStatus.deviceConnecting);\n\n    try {\n      await ble.WinBle.connect(ownDevice.address);\n    } on Exception {\n      _connectInProgress = false;\n      return null;\n    } catch (e) {\n      print(\"Connect error $e\");\n      _connectInProgress = false;\n      return null;\n    }\n\n    if (ampDevice) {\n      if (_device != null) return null;\n      _device = device;\n    }\n\n    var services = await ble.WinBle.discoverServices(_device!.address);\n\n    if (services.contains(BLEController.midiServiceGuid)) {\n      List<ble.BleCharacteristic> bleCharacteristics =\n          await ble.WinBle.discoverCharacteristics(\n              address: _device!.address,\n              serviceId: BLEController.midiServiceGuid);\n\n      for (var characteristic in bleCharacteristics) {\n        if (characteristic.uuid == BLEController.midiCharacteristicGuid) {\n          if (ampDevice) {\n            _connectAmpDevice(_device!.device, characteristic);\n          } else {\n            ble.WinBle.subscribeToCharacteristic(\n                address: _device!.address,\n                serviceId: BLEController.midiServiceGuid,\n                characteristicId: characteristic.uuid);\n            _connectInProgress = false;\n            //Stream  _connectionStream =\n            //ble.WinBle.connectionStreamOf(_device.address)\n            //return BLEConnection(characteristic.value);\n          }\n          break;\n        }\n      }\n    }\n    return null;\n  }\n\n  void _connectAmpDevice(\n      ble.BleDevice device, ble.BleCharacteristic characteristic) async {\n    _midiCharacteristic = characteristic;\n\n    await ble.WinBle.subscribeToCharacteristic(\n        address: device.address,\n        serviceId: BLEController.midiServiceGuid,\n        characteristicId: characteristic.uuid);\n\n    _connectInProgress = false;\n\n    setMidiSetupStatus(MidiSetupStatus.deviceConnected);\n    _deviceStreamSubscription =\n        ble.WinBle.connectionStreamOf(device.address).listen((event) {\n      if (event == false) {\n        _deviceStreamSubscription?.cancel();\n        _device = null;\n        _midiCharacteristic = null;\n        _connectInProgress = false;\n        setMidiSetupStatus(MidiSetupStatus.deviceDisconnected);\n      }\n    });\n  }\n\n  @override\n  void disconnectDevice() async {\n    if (bleState != BleState.on) return;\n    if (_device != null) {\n      _connectInProgress = false;\n      await ble.WinBle.disconnect(_device!.address);\n    }\n  }\n\n  @override\n  void dispose() {\n    _scanSubscription?.cancel();\n    _bluetoothStateSubscription?.cancel();\n    _deviceStreamSubscription?.cancel();\n    ble.WinBle.dispose();\n  }\n\n  @override\n  StreamSubscription<List<int>> registerDataListener(\n      Function(List<int> data) listener) {\n    StreamController<List<int>> streamCtrl = StreamController();\n\n    // ble.WinBle.characteristicValueStream.listen((event) {\n    //   print(event);\n    // });\n\n    var dataSubscr = ble.WinBle.characteristicValueStreamOf(\n            address: _device!.address,\n            serviceId: BLEController.midiServiceGuid,\n            characteristicId: _midiCharacteristic!.uuid)\n        .listen((data) {\n      streamCtrl.add(data.cast<int>());\n    });\n\n    streamCtrl.onCancel = () {\n      dataSubscr.cancel();\n    };\n    return streamCtrl.stream.listen(listener);\n  }\n\n  @override\n  bool get isWriteReady => _midiCharacteristic != null;\n\n  @override\n  Future writeToCharacteristic(List<int> data) {\n    Uint8List byteData = Uint8List.fromList(data);\n    print(\"WinBle: Write $data\");\n    return ble.WinBle.write(\n        address: _device!.address,\n        service: BLEController.midiServiceGuid,\n        characteristic: _midiCharacteristic!.uuid,\n        data: byteData,\n        writeWithResponse: false);\n  }\n\n  void _subscribeBleState() {\n    _bluetoothStateSubscription =\n        ble.WinBle.bleState.listen((ble.BleState event) {\n      print(\"Ble Event: $event\");\n      _bleSupported = true;\n      switch (event) {\n        case ble.BleState.On:\n          bleState = BleState.on;\n          //setMidiSetupStatus(MidiSetupStatus.deviceSearching);\n          //startScanning();\n          break;\n        case ble.BleState.Off:\n        case ble.BleState.Unknown:\n        case ble.BleState.Disabled:\n          bleState = BleState.off;\n          setMidiSetupStatus(MidiSetupStatus.bluetoothOff);\n          if (_scanning) stopScanning();\n          break;\n        case ble.BleState.Unsupported:\n          _bleSupported = false;\n          break;\n      }\n    });\n  }\n\n  void _subscribeScanResults() {\n    _scanSubscription = ble.WinBle.scanStream.listen((device) {\n      final index = scannedDevices\n          .indexWhere((element) => element.address == device.address);\n      // Updating existing device\n      if (index != -1) {\n        if (device.name.isNotEmpty && scannedDevices[index].name.isEmpty) {\n          scannedDevices[index].name = device.name;\n        }\n\n        if (device.serviceUuids.isNotEmpty &&\n            scannedDevices[index].serviceUuids.isEmpty) {\n          scannedDevices[index].serviceUuids = device.serviceUuids;\n        }\n      } else {\n        scannedDevices.add(device);\n      }\n\n      if ((DateTime.now().difference(_scanStarted).inMilliseconds < 5000)) {\n        return;\n      }\n\n      stopScanning();\n      scannedDevices.retainWhere((device) =>\n          nuxDeviceNames.containsPartial(device.name) &&\n          device.serviceUuids.contains(\"{${BLEController.midiServiceGuid}}\"));\n\n      List<BLEScanResult> nuxBle = [], ctrlBle = [];\n      for (var dev in scannedDevices) {\n        nuxBle.add(WinBleScanResult(dev));\n      }\n\n      onScanResults(nuxBle, []);\n      setMidiSetupStatus(MidiSetupStatus.deviceFound);\n    });\n  }\n}\n*/"
  },
  {
    "path": "lib/bluetooth/devices/NuxConstants.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'NuxFXID.dart';\n\nclass AppConstants {\n  static const patcherUrl =\n      \"https://github.com/tuntorius/nux-ir-patcher#nux-ir-patcher\";\n}\n\nclass EProductNo {\n  static const CHERUB_VID = 8721;\n  static const TAPECORE_PID = 0;\n  static const STAGEMAN_PID = 16;\n  static const CERBERUS_PID = 32;\n  static const MIGHTYBT_PID = 48;\n  static const MIGHTYLITE_PID = 64;\n  static const TAP5_PID = 102;\n}\n\nclass CherubSysExMessageID {\n  static const cSysExRollCallMsgID = 0;\n  static const cSysExDeviceSpecMsgID = 7;\n}\n\nclass SysCtrlState {\n  static const syscmd_null = 0;\n  static const syscmd_save = 48;\n  static const syscmd_footsw = 49;\n  static const syscmd_resetall = 50;\n  static const syscmd_refresh_preset = 51;\n  static const syscmd_bt = 64;\n  static const syscmd_eco_pro = 65;\n  static const syscmd_dsprun_battery = 66;\n  static const syscmd_usbaudio = 67;\n  static const speccmd_auxeqsave = 68;\n  static const speccmd_speakereqsave = 69;\n  static const syscmd_midicc_ex = 112;\n}\n\nclass DeviceMessageID {\n  static const devReqFwID = 0;\n  static const devReqMIDIParaMsgID = 0;\n  static const devGetMIDIParaMsgID = 1;\n  static const devSetMIDIParaMsgID = 2;\n  static const devReqCurCCMsgID = 3;\n  static const devReqCurNRPNMsgID = 4;\n  static const devSysCtrlMsgID = 5;\n  static const devReqPresetMsgID = 6; //request preset\n  static const devGetPresetMsgID = 7;\n  static const devSetPresetMsgID = 8;\n  static const devReqCurLoopMsgID = 9;\n  static const devProjectMsgID = 16;\n  static const devReqManuMsgID = 22;\n  static const devGetManuMsgID = 23;\n  static const devSetManuMsgID = 24;\n  static const devSetPresetNameMsgID = 32;\n  static const devNullDataID = 80;\n  static const devParaDataID = 81;\n  static const devCabDataSetID = 88;\n  static const devCabDataGetID = 89;\n  static const devCrcNameGetId = 92;\n  static const devCablevelGetId = 94;\n  static const devCabLCGetId = 96;\n  static const devCabHCGetId = 98;\n  static const devOpenTapLedMsgID = 10;\n  static const padReqCurCCMsgID = 19;\n  static const devHadrWareTestID = 100;\n  static const devDfuEnterID = 102;\n  static const devSysStateID = 103;\n  static const devDfuDataSetID = 104;\n  static const devDfuDataGetID = 105;\n}\n\nclass PresetDataIndexPlugAir {\n  static const ngenable = 0;\n  static const ngthresold = 1;\n  static const ngsustain = 2;\n  static const efxenable = 3;\n  static const efxtype = 4;\n  static const efxvar1 = 5;\n  static const efxvar2 = 6;\n  static const efxvar3 = 7;\n  static const ampenable = 8;\n  static const amptype = 9;\n  static const ampgain = 10;\n  static const amplevel = 11;\n  static const ampbass = 12;\n  static const ampmiddle = 13;\n  static const amptreble = 14;\n  static const amptone = 15;\n  static const cabenable = 16;\n  static const cabtype = 17;\n  static const cabgain = 18;\n  static const modfxenable = 19;\n  static const modfxtype = 20;\n  static const modfxrate = 21;\n  static const modfxvar1rate = 21;\n  static const modfxdepth = 22;\n  static const modfxvar2depth = 22;\n  static const modfxmix = 23;\n  static const modfxvar3mix = 23;\n  static const delayenable = 24;\n  static const delaytype = 25;\n  static const delaytime = 26;\n  static const delayvar1time = 26;\n  static const delayfeedback = 27;\n  static const delayvar2feedback = 27;\n  static const delaymix = 28;\n  static const delayvar3mix = 28;\n  static const reverbenable = 29;\n  static const reverbtype = 30;\n  static const reverbdecay = 31;\n  static const reverbvar1decay = 31;\n  static const reverbdamp = 32;\n  static const reverbvar2damp = 32;\n  static const reverbmix = 33;\n  static const reverbvar3mix = 33;\n}\n\nclass PresetDataIndex8BT {\n  //use PresetDataIndexLite for most of the constants\n}\n\nclass PresetDataIndex2040BT {\n  static const ngenable = 0;\n  static const ngthresold = 1;\n\n  static const wah_enable = 2;\n  static const wah_pedal = 3;\n  static const amp_type = 4;\n  static const amp_gain = 5;\n  static const amp_level = 6;\n  static const amp_bass = 7;\n  static const amp_mid = 8;\n  static const amp_high = 9;\n  static const mod_enable = 10;\n  static const mod_type = 11;\n  static const mod_rate = 12;\n  static const mod_depth = 13;\n  static const mod_mix = 14;\n  static const dly_enable = 15;\n  static const dly_type = 16;\n  static const dly_time = 17;\n  static const dly_feedback = 18;\n  static const dly_mix = 19;\n  static const rvb_enable = 20;\n  static const rvb_type = 21;\n  static const rvb_decay = 22;\n  static const rvb_damp = 23;\n  static const rvb_mix = 24;\n  static const tap_time_flag = 25;\n  static const tap_time_value_h = 26;\n  static const tap_time_value_l = 27;\n}\n\nclass PresetDataIndexLite {\n  static const ngenable = 0;\n  static const ngthresold = 1;\n  static const ngsustain = 2;\n\n  static const drivetype = 3;\n  static const drivesubtype1 = 4;\n  static const drivesubtype2 = 5;\n  static const drivesubtype3 = 6;\n  static const drivegain = 7;\n  static const drivelevel = 8;\n  static const drivebass = 9;\n  static const drivemid = 10;\n  static const drivetreble = 11;\n  static const drivetone = 12;\n\n  static const modfxenable = 13;\n  static const modfxtype = 14;\n  static const modfxrate = 15;\n  static const modfxdepth = 16;\n  static const modfxmix = 17;\n\n  static const efxenable = 18;\n  static const efxtype = 19;\n  static const reverbtype = 20;\n  static const reverbdecay = 21;\n  static const reverbmix = 22;\n\n  static const delaytype = 23;\n  static const delaytime = 24;\n  static const delayfeedback = 25;\n  static const delaymix = 26;\n\n  static const tap_time_flag = 27;\n  static const tap_time_bpm_h = 28;\n  static const tap_time_bpm_l = 29;\n  static const tap_time_value_h = 30;\n  static const tap_time_value_l = 31;\n  static const reverbenable = 32;\n  static const delayenable = 33;\n  static const miclevel = 34;\n  static const micambsend = 35;\n}\n\nclass PresetDataIndexPlugPro {\n  static const effectTypesIndex = [\n    Head_iCMP,\n    Head_iEFX,\n    Head_iAMP,\n    Head_iEQ,\n    Head_iNG,\n    Head_iMOD,\n    Head_iDLY,\n    Head_iRVB,\n    Head_iCAB,\n    //Head_iSR\n  ];\n\n  static const defaultEffects = [\n    PlugProFXID.gate,\n    PlugProFXID.comp,\n    PlugProFXID.mod,\n    PlugProFXID.efx,\n    PlugProFXID.amp,\n    PlugProFXID.cab,\n    PlugProFXID.eq,\n    PlugProFXID.reverb,\n    PlugProFXID.delay\n  ];\n\n  static const Head_iWAH = 0;\n  static const Head_iCMP = 1;\n  static const Head_iEFX = 2;\n  static const Head_iAMP = 3;\n  static const Head_iEQ = 4;\n  static const Head_iNG = 5;\n  static const Head_iMOD = 6;\n  static const Head_iDLY = 7;\n  static const Head_iRVB = 8;\n  static const Head_iCAB = 9;\n  static const Head_iSR = 10;\n  static const WAH_Count = 11;\n  static const WAH_Para1 = 12;\n  static const WAH_Para2 = 13;\n  static const CMP_Count = 14;\n  static const CMP_Para1 = 15;\n  static const CMP_Para2 = 16;\n  static const CMP_Para3 = 17;\n  static const CMP_Para4 = 18;\n  static const EFX_Count = 19;\n  static const EFX_Para1 = 20;\n  static const EFX_Para2 = 21;\n  static const EFX_Para3 = 22;\n  static const EFX_Para4 = 23;\n  static const EFX_Para5 = 24;\n  static const EFX_Para6 = 25;\n  static const AMP_Count = 26;\n  static const AMP_Para1 = 27;\n  static const AMP_Para2 = 28;\n  static const AMP_Para3 = 29;\n  static const AMP_Para4 = 30;\n  static const AMP_Para5 = 31;\n  static const AMP_Para6 = 32;\n  static const AMP_Para7 = 33;\n  static const AMP_Para8 = 34;\n  static const EQ_Count = 35;\n  static const EQ_Para1 = 36;\n  static const EQ_Para2 = 37;\n  static const EQ_Para3 = 38;\n  static const EQ_Para4 = 39;\n  static const EQ_Para5 = 40;\n  static const EQ_Para6 = 41;\n  static const EQ_Para7 = 42;\n  static const EQ_Para8 = 43;\n  static const EQ_Para9 = 44;\n  static const EQ_Para10 = 45;\n  static const EQ_Para11 = 46;\n  static const EQ_Para12 = 47;\n  static const NG_Count = 48;\n  static const NG_Para1 = 49;\n  static const NG_Para2 = 50;\n  static const NG_Para3 = 51;\n  static const NG_Para4 = 52;\n  static const MOD_Count = 53;\n  static const MOD_Para1 = 54;\n  static const MOD_Para2 = 55;\n  static const MOD_Para3 = 56;\n  static const MOD_Para4 = 57;\n  static const MOD_Para5 = 58;\n  static const MOD_Para6 = 59;\n  static const DLY_Count = 60;\n  static const DLY_Para1 = 61;\n  static const DLY_Para2 = 62;\n  static const DLY_Para3 = 63;\n  static const DLY_Para4 = 64;\n  static const DLY_Para5 = 65;\n  static const DLY_Para6 = 66;\n  static const DLY_Para7 = 67;\n  static const DLY_Para8 = 68;\n  static const RVB_Count = 69;\n  static const RVB_Para1 = 70;\n  static const RVB_Para2 = 71;\n  static const RVB_Para3 = 72;\n  static const RVB_Para4 = 73;\n  static const CAB_Count = 74;\n  static const CAB_Para1 = 75;\n  static const CAB_Para2 = 76;\n  static const CAB_Para3 = 77;\n  static const CAB_Para4 = 78;\n  static const CAB_Para5 = 79;\n  static const CAB_Para6 = 80;\n  static const SR_Count = 81;\n  static const SR_Para1 = 82;\n  static const SR_Para2 = 83;\n  static const MASTER = 84;\n  static const delay_time_flag = 85;\n  static const bpmH = 86;\n  static const bpmL = 87;\n  static const BITCTRL = 88;\n  static const LINK1 = 89;\n  static const LINK2 = 90;\n  static const LINK3 = 91;\n  static const LINK4 = 92;\n  static const LINK5 = 93;\n  static const LINK6 = 94;\n  static const LINK7 = 95;\n  static const LINK8 = 96;\n  static const LINK9 = 97;\n  static const LINK10 = 98;\n  static const LINK11 = 99;\n  static const UserName1 = 100;\n  static const UserName2 = 101;\n  static const UserName3 = 102;\n  static const UserName4 = 103;\n  static const UserName5 = 104;\n  static const UserName6 = 105;\n  static const UserName7 = 106;\n  static const UserName8 = 107;\n  static const UserName9 = 108;\n  static const UserName10 = 109;\n  static const UserName11 = 110;\n  static const UserName12 = 111;\n  static const UserName13 = 112;\n  static const UserName14 = 113;\n  static const UserName15 = 114;\n  static const UserName16 = 115;\n  static const swsel1 = 116;\n  static const swsel2 = 117;\n  static const swsel3 = 118;\n  static const pdsel1 = 119;\n  static const pdsel2 = 120;\n  static const version = 121;\n  static const scene1 = 122;\n  static const scene2 = 123;\n  static const scene3 = 124;\n}\n\nclass MidiMessageValues {\n  static const controlChange = 0xb0;\n  static const programChange = 0xc0;\n  static const sysExStart = 0xf0;\n  static const sysExEnd = 0xf7;\n}\n\nclass SysexPrivacy {\n  final int _value;\n  const SysexPrivacy._internal(this._value);\n  @override\n  toString() => '$_value';\n  toInt() => _value;\n\n  static const kSYSEX_PUBLIC = 0x0;\n  static const kSYSEX_PUBLICREPLY = 0x10;\n  static const kSYSEX_RDCTRL = 0x20;\n  static const kSYSEX_IRCTRL = 0x30;\n  static const kSYSEX_PRIVATE = 0x70;\n}\n\nclass SyxMsg {\n  final int _value;\n  const SyxMsg._internal(this._value);\n  @override\n  toString() => '$_value';\n  toInt() => _value;\n\n  static const kSYX_BPM = 0x03;\n  static const kSYX_LANGUAGE = 0x04;\n  static const kSYX_CPURUN = 0x05;\n  static const kSYX_SWAPPRESET = 0x06;\n  static const kSYX_CPYPRESET = 0x07;\n  static const kSYX_IRSAVEAS = 0x08;\n  static const kSYX_CRCNAME = 0x09;\n  static const kSYX_MANUAL = 0x0A;\n  static const kSYX_PRESET = 0x0B;\n  static const kSYX_CURPRESET = 0x0C;\n  static const kSYX_MODULELINK = 0x0D;\n  static const kSYX_GLOBLE = 0x0E;\n  static const kSYX_MIDICC = 0x0F;\n  static const kSYX_CABDATA = 0x10;\n  static const kSYX_CABCURVE = 0x11;\n  static const kSYX_PRESETNAME = 0x12;\n  static const kSYX_PEDALSET = 0x13;\n  static const kSYX_SYSTEMSET = 0x14;\n  static const kSYX_CURSTATE = 0x15;\n  static const kSYX_IRDELETE = 0x16;\n  static const kSYX_CUTOVER = 0x17;\n  static const kSYX_LOOP = 0x18;\n  static const kSYX_DRUM = 0x19;\n  static const kSYX_CABNAME = 0x1A;\n  static const kSYX_BTSET =\n      0x1B; //bluetooth eq groups 1-3, however use group 4 to retrieve mute and phase\n\n  static const kSYX_AUXEQ = 27;\n  static const kSYX_SPKEQ = 28;\n\n  static const kSYX_SPKSET = 0x1C;\n\n  static const kSYX_STICKY = 95;\n  static const kSYX_PARAINIT = 0x60;\n  static const kSYX_WELCOME = 0x61;\n  static const kSYX_QTVERSION = 0x62;\n  static const kSYX_UAC_EFFECT = 0x63;\n  static const kSYX_UAC_TRANS = 0x64;\n  static const kSYX_UAC_SAVE = 0x65;\n  static const kSYX_TUNER_SETTINGS = 0x6F;\n  static const kSYX_VOLDISPLAY = 0x74;\n  static const kSYX_SPEC_CMD = 0x75;\n  static const kSYX_HW_VERSION = 0x76;\n  static const kSYX_CODEC_SET = 0x77;\n  static const kSYX_TFT_SET = 0x78;\n  static const kSYX_SNAPSHOTCMD = 0x79;\n  static const kSYX_SNAPSHOT = 0x7A;\n  static const kSYX_RESET = 0x7B;\n  static const kSYX_IRINFO = 0x7C;\n  static const kSYX_DEVINFO = 0x7D;\n  static const kSYX_SENDCMD = 0x7E;\n  static const kSYX_NOUSE = 0x7F;\n}\n\nclass SyxDir {\n  static const kSYXDIR_GET = 0;\n  static const kSYXDIR_SET = 1;\n  static const kSYXDIR_REQ = 2;\n  static const kSYXDIR_ACK = 3;\n  static const kSYXDIR_CMD = 4;\n}\n\nclass MidiCCValues {\n  static const bCC_NotUsed = -1; //for LITE amp\n  static const bCC_OverDriveEnable = 111;\n  static const bCC_OverDriveDrive = 13;\n  static const bCC_OverDriveTone = 14;\n  static const bCC_OverDriveLevel = 15;\n  static const bCC_OverDriveMode = 16;\n  static const bCC_DistEnable = 84;\n  static const bCC_DistGain = 21;\n  static const bCC_DistTone = 17;\n  static const bCC_DistLevel = 10;\n  static const bCC_DistMode = 12;\n  static const bCC_BoostEnable = 76;\n  static const bCC_BypassEnable = 9;\n  static const bCC_Routing = 11;\n  static const bCC_VolumePedal = 7;\n  static const bCC_VolumePrePost = 47;\n  static const bCC_VolumePedalMin = 46;\n  static const bCC_TempoMSB = 89;\n  static const bCC_TempoLSB = 90;\n  static const bCC_Tap = 64;\n  static const bCC_GateEnable = 22;\n  static const bCC_GateThresold = 23;\n  static const bCC_GateDecay = 24;\n  static const bCC_CabMode = 71;\n  static const bCC_CabMicsel = 70;\n  static const bCC_CabEnable = 101;\n  static const bCC_AmpModeSetup = 75;\n  static const bCC_AmpMode = 78;\n  static const bCC_AmpDrive = 79;\n  static const bCC_AmpPresence = 80;\n  static const bCC_AmpMaster = 81;\n  static const bCC_AmpEnable = 102;\n  static const bCC_AmpBass = 103;\n  static const bCC_AmpMid = 104;\n  static const bCC_AmpHigh = 105;\n  static const bCC_ModfxMode = 58;\n  static const bCC_ModfxRate = 51;\n  static const bCC_ModfxDepth = 52;\n  static const bCC_ChorusMode = 61;\n  static const bCC_ChorusRate = 53;\n  static const bCC_ChorusDepth = 54;\n  static const bCC_ChorusLevel = 55;\n  static const bCC_ModfxEnable = 56;\n  static const bCC_ChorusEnable = 57;\n  static const bCC_DelayMode = 88;\n  static const bCC_DelayTime = 30;\n  static const bCC_DelayRepeat = 31;\n  static const bCC_ReverbMode = 37;\n  static const bCC_DelayLevel = 85;\n  static const bCC_ReverbDecay = 86;\n  static const bCC_ReverbLevel = 87;\n  static const bCC_ReverbRouting = 34;\n  static const bCC_DelayEnable = 28;\n  static const bCC_ReverbEnable = 36;\n  static const bCC_CtrlType = 49;\n  static const bCC_drumOnOff_No = 122;\n  static const bCC_drumType_No = 123;\n  static const bCC_drumLevel_No = 125;\n  static const bCC_drumTempo1 = 0x62;\n  static const bCC_drumTempo2 = 0x63;\n  static const bCC_drumTempoH = 0x06;\n  static const bCC_drumTempoL = 0x26;\n  static const bCC_LoopLevel = 121;\n  static const bCC_LoopCtrl = 124;\n  static const bCC_DrumLed = 126;\n  static const bCC_CtrlCmd = 127;\n  static const bcc_mChrOnOff = 112;\n  static const bcc_gChrOnOff = 57;\n  static const bcc_mRevOnOff = 113;\n  static const bcc_gRevOnOff = 36;\n  static const bcc_gChrRate = 51;\n  static const bcc_gChrDepth = 52;\n  static const bcc_mChrRate = 53;\n  static const bcc_mChrDepth = 54;\n  static const bcc_gRevDecay = 91;\n  static const bcc_gRevDamp = 92;\n  static const bcc_mRevDecay = 93;\n  static const bcc_mRevDamp = 94;\n  static const bcc_gChrType = 60;\n  static const bcc_mChrType = 63;\n  static const bcc_gRevType = 37;\n  static const bcc_mRevType = 39;\n}\n\nclass MidiCCValuesPro {\n  static const CC_Unknown = 0;\n  static const Head_iWAH = 0;\n  static const Head_iCMP = 1;\n  static const Head_iEFX = 2;\n  static const Head_iAMP = 3;\n  static const Head_iEQ = 4;\n  static const Head_iNG = 5;\n  static const Head_iMOD = 6;\n  static const Head_iDLY = 7;\n  static const Head_iRVB = 8;\n  static const Head_iCAB = 9;\n  static const Head_iSR = 10;\n  static const TUNER_State = 11;\n  static const TUNER_Note = 12;\n  static const CMP_Para1 = 13;\n  static const CMP_Para2 = 14;\n  static const CMP_Para3 = 15;\n  static const CMP_Para4 = 16;\n  static const EFX_Para1 = 17;\n  static const EFX_Para2 = 18;\n  static const EFX_Para3 = 19;\n  static const EFX_Para4 = 20;\n  static const EFX_Para5 = 21;\n  static const EFX_Para6 = 22;\n  static const AMP_Para1 = 23;\n  static const AMP_Para2 = 24;\n  static const AMP_Para3 = 25;\n  static const AMP_Para4 = 26;\n  static const AMP_Para5 = 27;\n  static const AMP_Para6 = 28;\n  static const AMP_Para7 = 29;\n  static const AMP_Para8 = 30;\n  static const EQ_Para1 = 31;\n  static const EQ_Para2 = 32;\n  static const EQ_Para3 = 33;\n  static const EQ_Para4 = 34;\n  static const EQ_Para5 = 35;\n  static const EQ_Para6 = 36;\n  static const EQ_Para7 = 37;\n  static const EQ_Para8 = 38;\n  static const EQ_Para9 = 39;\n  static const EQ_Para10 = 40;\n  static const EQ_Para11 = 41;\n  static const EQ_Para12 = 42;\n  static const NG_Para1 = 43;\n  static const NG_Para2 = 44;\n  static const NG_Para3 = 45;\n  static const NG_Para4 = 46;\n  static const MOD_Para1 = 47;\n  static const MOD_Para2 = 48;\n  static const MOD_Para3 = 49;\n  static const MOD_Para4 = 50;\n  static const MOD_Para5 = 51;\n  static const MOD_Para6 = 52;\n  static const DLY_Para1 = 53;\n  static const DLY_Para2 = 54;\n  static const DLY_Para3 = 55;\n  static const DLY_Para4 = 56;\n  static const DLY_Para5 = 57;\n  static const DLY_Para6 = 58;\n  static const DLY_Para7 = 59;\n  static const DLY_Para8 = 60;\n  static const RVB_Para1 = 61;\n  static const RVB_Para2 = 62;\n  static const RVB_Para3 = 63;\n  static const RVB_Para4 = 64;\n  static const CAB_Para1 = 65;\n  static const CAB_Para2 = 66;\n  static const CAB_Para3 = 67;\n  static const CAB_Para4 = 68;\n  static const CAB_Para5 = 69;\n  static const CAB_Para6 = 70;\n  static const TUNER_Number = 71;\n  static const TUNER_Cent = 72;\n  static const MASTER = 73; //patch level\n  static const MSELECT = 74;\n  static const PEDAL = 75;\n  static const SCENE = 76;\n  static const DRUMENABLE = 77;\n  static const DRUMTYPE = 78; //drum styles - 0 to xx(66?)\n  static const DRUMLEVEL = 79;\n  static const LOOPLEVEL = 80; //Looper level - confirmed\n  static const LOOPSTATE = 81;\n  static const AUXEQENABLE = 82; //aux eq group 0-3\n  static const PRESETRANGE = 83; //this sets/receives Active bitfield\n  static const MICVOLUME = 84;\n  static const MICMUTE = 85;\n  static const USBROUNT_1 = 86; //Recording LV\n  static const USBROUNT_2 = 87; //Playback LV\n  static const USBROUNT_3 = 88; //Audio Mode 0-2\n  //0-dry out, 1 - normal, 2 - reamp, ---x ---- - this bit is for loopback\n  //the loopback is supposed to work with normal only, but I can set it with everything\n  static const USBROUNT_4 = 89; //Dry/Wet\n  static const AUX_MUTE = 90;\n  static const AUX_PHASE = 91; //phase invert\n  static const AUX_BAND_1 = 92;\n  static const AUX_BAND_2 = 93;\n  static const AUX_BAND_3 = 94;\n  static const AUX_BAND_4 = 95;\n  static const AUX_BAND_5 = 96;\n  static const AUX_BAND_6 = 97;\n  static const AUX_BAND_7 = 98;\n  static const AUX_BAND_8 = 99;\n  static const AUX_BAND_9 = 100;\n  static const AUX_BAND_10 = 101;\n  static const AUX_BAND_11 = 102;\n  static const AUX_BAND_12 = 103; //NOT USED\n  static const DRUM_BASS = 104;\n  static const DRUM_MIDDLE = 105;\n  static const DRUM_TREBLE = 106;\n  static const LOOP_ARNR = 107;\n  static const NR_ENABLE = 108;\n  static const NR_SENS = 109;\n  static const NR_DECAY = 110;\n  static const SPK_EQ_GROUP = 111;\n  static const SPK_EQ_VOL = 112;\n  static const SPK_EQ_1 = 113;\n  static const SPK_EQ_2 = 114;\n  static const SPK_EQ_3 = 115;\n  static const SPK_EQ_4 = 116;\n  static const SPK_EQ_5 = 117;\n  static const SPK_EQ_6 = 118;\n  static const SPK_EQ_7 = 119;\n  static const SPK_EQ_8 = 120;\n  static const SPK_EQ_9 = 121;\n  static const SPK_EQ_10 = 122;\n  static const SPK_EQ_11 = 123;\n  static const AUX_SAVE = 125;\n\n  static const TunerLiteMK2_State = 112;\n  static const TunerLiteMK2_Note = 113;\n  static const TunerLiteMK2_Number = 114;\n  static const TunerLiteMK2_Cent = 115;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxDevice.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\nimport 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'package:flutter/widgets.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/communication.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\nimport 'package:qr_utils/qr_utils.dart';\n\nimport '../../modules/cloud/presetEncoder.dart';\nimport '../NuxDeviceControl.dart';\nimport '../bleMidiHandler.dart';\nimport \"NuxConstants.dart\";\nimport 'NuxFXID.dart';\nimport 'effects/Processor.dart';\nimport 'presets/Preset.dart';\nimport 'value_formatters/ValueFormatter.dart';\n\nclass NuxDeviceConfiguration {\n  bool ecoMode = false;\n\n  //drum settings\n  bool drumsEnabled = false;\n  int selectedDrumStyle = 0;\n  double drumsVolume = 50;\n  double drumsTempo = 120;\n\n  late List<bool> activeChannels;\n}\n\nabstract class NuxDevice extends ChangeNotifier {\n  final NuxDeviceControl deviceControl;\n\n  int get productVID;\n\n  int get vendorID {\n    return 8721;\n  }\n\n  DeviceCommunication get communication;\n\n  @protected\n  NuxDeviceConfiguration get config;\n\n//General device parameters\n  String get productName;\n  String get productNameShort;\n  String get productIconLabel;\n  String get productStringId;\n\n  String get presetClass;\n  String get productNameForQR => productNameShort;\n\n  int get productVersion;\n  List<String> get productBLENames;\n\n  int get channelsCount;\n  int get effectsChainLength;\n\n  List<ProcessorInfo> get processorList;\n\n  int get amplifierSlotIndex;\n  bool get activeChannelRetrieval;\n  bool get fakeMasterVolume;\n  bool get longChannelNames;\n  bool get cabinetSupport;\n  bool get hackableIRs;\n  int get cabinetSlotIndex;\n  bool get presetSaveSupport;\n  bool get reorderableFXChain;\n  bool get batterySupport;\n  bool get nativeActiveChannelsSupport;\n  ValueFormatter? get decibelFormatter => null;\n  bool get jamTrackChannelChange => false;\n\n  int get deviceQRId;\n  int get deviceQRVersion;\n  int get channelChangeCC;\n\n  List<String> channelNames = [];\n  List<String> groupsName = <String>[];\n\n  //Notifies when an effect is switched on and off\n  final StreamController<int> effectSwitched = StreamController<int>();\n\n  //Notifies when an effect in a certain slot is changed\n  final StreamController<int> effectChanged = StreamController<int>();\n\n  //Notifies when an effect in a certain slot is changed\n  final StreamController<int> slotSwapped = StreamController<int>();\n\n  //Notifies when an effect parameter has changed\n  final StreamController<Parameter> parameterChanged =\n      StreamController<Parameter>();\n\n  List<Preset> presets = <Preset>[];\n\n  bool nuxPresetsReceived = false;\n\n  @protected\n  int selectedChannelP = 0; //nux-based channel index\n\n  int get selectedChannel => selectedChannelP;\n\n  void setFirmwareVersion(int ver);\n\n  void setFirmwareVersionByIndex(int ver);\n\n  NuxDevice(this.deviceControl) {\n    config.activeChannels = List<bool>.filled(channelsCount, true);\n  }\n\n  int getAvailableVersions() {\n    return 1;\n  }\n\n  String getProductNameVersion(int version) {\n    return productNameShort;\n  }\n\n  String getProductNameForQR(int version) {\n    return productNameForQR;\n  }\n\n  ProcessorInfo? getProcessorInfoByKey(String key) {\n    for (var proc in processorList) {\n      if (proc.keyName == key) return proc;\n    }\n    return null;\n  }\n\n  int? getSlotByEffectKeyName(String key) {\n    var pi = getProcessorInfoByKey(key);\n    if (pi != null) {\n      return pi.nuxFXID.toInt();\n    }\n    return null;\n  }\n\n  ProcessorInfo? getProcessorInfoByFXID(NuxFXID fxid) {\n    return processorList[fxid.toInt()];\n  }\n\n  void setSelectedChannel(int chan,\n      {required bool notifyBT,\n      required bool sendFullPreset,\n      required bool notifyUI}) {\n    if (chan >= channelsCount) {\n      debugPrint(\n          \"setSelectedChannel error: trying to set to invalid channel $chan\");\n      chan = 0;\n    }\n\n    if (selectedChannelP != chan) {\n      selectedChannelP = chan;\n      deviceControl.clearPresetData();\n      if (notifyBT) deviceControl.changeDeviceChannel(selectedChannelP);\n    }\n    if (sendFullPreset) deviceControl.sendFullPresetSettings();\n    if (deviceControl.isConnected) sendAmpLevel();\n    if (notifyUI) {\n      deviceControl.forceNotifyListeners();\n    }\n  }\n\n  bool getChannelActive(int channel) {\n    return config.activeChannels[channel];\n  }\n\n  void toggleChannelActive(int channel) {\n    config.activeChannels[channel] = !config.activeChannels[channel];\n\n    //check for at least one channel enabled\n    bool hasEnabled = false;\n    for (var act in config.activeChannels) {\n      if (act == true) hasEnabled = true;\n    }\n    if (!hasEnabled) {\n      config.activeChannels[channel] = true;\n      return;\n    }\n\n    if (nativeActiveChannelsSupport) {\n      communication.sendActiveChannels(config.activeChannels);\n    }\n    notifyListeners();\n  }\n\n  //UI Stuff\n  int selectedSlot = 0;\n\n  //general settings\n\n  bool get ecoMode => config.ecoMode;\n\n  //drum stuff\n  double get drumsMinTempo => 40;\n  double get drumsMaxTempo => 240;\n  bool get drumsEnabled => config.drumsEnabled;\n  int get selectedDrumStyle => config.selectedDrumStyle;\n  double get drumsVolume => config.drumsVolume;\n  double get drumsTempo => config.drumsTempo;\n\n  void onConnect() {\n    nuxPresetsReceived = false;\n    //reset nux data\n    for (int i = 0; i < presets.length; i++) {\n      presets[i].resetNuxData();\n    }\n    resetDrumSettings();\n  }\n\n  void onDisconnect() {\n    communication.onDisconnect();\n    deviceControl.onBatteryPercentage(0);\n  }\n\n  dynamic getDrumStyles();\n  int getDrumStylesCount() {\n    return (getDrumStyles() as List).length;\n  }\n\n  void resetDrumSettings() {\n    config.drumsEnabled = false;\n    config.selectedDrumStyle = 0;\n    config.drumsVolume = 50;\n    config.drumsTempo = 120;\n  }\n\n  void setDrumsEnabled(bool enabled) {\n    config.drumsEnabled = enabled;\n    communication.sendDrumsEnabled(config.drumsEnabled);\n  }\n\n  void setDrumsStyle(int style) {\n    if (config.selectedDrumStyle == style) return;\n    config.selectedDrumStyle = style;\n    communication.sendDrumsStyle(style);\n  }\n\n  void setDrumsLevel(double level, bool send) {\n    if (config.drumsVolume == level) return;\n    config.drumsVolume = level;\n    if (send) communication.sendDrumsLevel(level);\n  }\n\n  void setDrumsTempo(double tempo, bool send) {\n    if (config.drumsTempo == tempo) return;\n    tempo = math.min(math.max(tempo, drumsMinTempo), drumsMaxTempo);\n    config.drumsTempo = tempo;\n    if (send) communication.sendDrumsTempo(tempo);\n  }\n\n  void setEcoMode(bool enabled) {\n    config.ecoMode = enabled;\n    communication.setEcoMode(enabled);\n  }\n\n  //used for master volume control\n  void sendAmpLevel() {\n    if (fakeMasterVolume) {\n      //amps are at slot 1\n      var preset = getPreset(selectedChannel);\n      var amp = preset.getEffectsForSlot(amplifierSlotIndex)[\n          preset.getSelectedEffectForSlot(amplifierSlotIndex)];\n      for (int i = 0; i < amp.parameters.length; i++) {\n        if (amp.parameters[i].masterVolume) {\n          deviceControl.sendParameter(amp.parameters[i], false);\n        }\n      }\n    }\n  }\n\n  Preset getPreset(int index) {\n    return presets[index];\n  }\n\n  //used for QR stuff, probably will be removed\n  Preset getCustomPreset(int channel);\n\n  String getAmpNameByNuxIndex(int index, int version) {\n    return presets[0].getAmpNameByNuxIndex(index, version);\n  }\n\n  void renameCabinet(int cabIndex, String name) {\n    if (cabinetSupport) {\n      SharedPrefs().setCustomCabinetName(productStringId, cabIndex, name);\n      notifyListeners();\n    }\n  }\n\n  List<Preset> getPresetsList() {\n    return presets;\n  }\n\n  String channelName(int channel) {\n    return channelNames[channel];\n  }\n\n  void onPresetsReady() {\n    if (!activeChannelRetrieval) {\n      setSelectedChannel(0,\n          notifyBT: true, notifyUI: true, sendFullPreset: true);\n    }\n    deviceControl.onPresetsReady();\n    nuxPresetsReceived = true;\n  }\n\n  void _handleChannelChange(int index) {\n    var newIndex = index;\n\n    if (!nativeActiveChannelsSupport) {\n      int attempts = 0;\n      //channel skipping\n      while (config.activeChannels[newIndex] == false) {\n        newIndex++;\n        attempts++;\n        if (newIndex == channelsCount) newIndex = 0;\n        if (attempts > 7) break;\n      }\n    }\n    if (newIndex == index) {\n      setSelectedChannel(index,\n          notifyBT: false, notifyUI: true, sendFullPreset: false);\n    } else {\n      //skipped - update ui\n      setSelectedChannel(newIndex,\n          notifyBT: true, sendFullPreset: false, notifyUI: true);\n    }\n\n    getPreset(selectedChannel).setupPresetFromNuxData();\n    //immediately set the amp level\n    sendAmpLevel();\n  }\n\n  void _handleKnobReceiveData(List<int> data) {\n    if (data.length < 3) return;\n\n    //scan through the effects to find which one is controlled\n    var preset = getPreset(selectedChannel);\n    for (int i = 0; i < effectsChainLength; i++) {\n      var selected = preset.getSelectedEffectForSlot(i);\n      var effect = preset.getEffectsForSlot(i)[selected];\n      var cmdCC = data[1];\n      bool enable = ((data[2] & 0xc0) != 0) ^ effect.nuxEnableInverted;\n      int effectIndex = data[2] & 0x3f;\n\n      if (effect.midiCCEnableValue == effect.midiCCSelectionValue &&\n          cmdCC == effect.midiCCEnableValue) {\n        var procIndex = preset.getFXIDFromSlot(i);\n        var nuxIndex =\n            preset.getEffectArrayIndexFromNuxIndex(procIndex, effectIndex);\n        preset.setSelectedEffectForSlot(i, nuxIndex, false);\n        preset.setSlotEnabled(i, enable, false);\n        notifyListeners();\n        return;\n      } else if (cmdCC == effect.midiCCEnableValue) {\n        preset.setSlotEnabled(i, enable, false);\n        notifyListeners();\n        return;\n      } else if (cmdCC == effect.midiCCSelectionValue) {\n        var procIndex = preset.getFXIDFromSlot(i);\n        var nuxIndex =\n            preset.getEffectArrayIndexFromNuxIndex(procIndex, effectIndex);\n        preset.setSelectedEffectForSlot(i, nuxIndex, false);\n        notifyListeners();\n        return;\n      } else {\n        for (var param in effect.parameters) {\n          if (param.midiCC == data[1]) {\n            //this is the one to change\n            param.midiValue = data[2];\n            notifyListeners();\n            return;\n          }\n        }\n      }\n    }\n  }\n\n  void onDataReceived(List<int> data) {\n    if (data.length < 2) return;\n\n    switch (data[0] & 0xf0) {\n      case MidiMessageValues.sysExStart:\n        switch (data[1]) {\n          case DeviceMessageID.devReqMIDIParaMsgID:\n            switch (data[7]) {\n              case DeviceMessageID.devSysCtrlMsgID:\n                switch (data[8]) {\n                  case SysCtrlState.syscmd_dsprun_battery:\n                    //Is this MP-2 Only?\n                    deviceControl.onBatteryPercentage(data[9]);\n                    break;\n                }\n                break;\n            }\n            break;\n        }\n        break;\n      case MidiMessageValues.programChange:\n        if (data[1] < channelsCount) _handleChannelChange(data[1]);\n        break;\n      case MidiMessageValues.controlChange:\n        if (data[1] == channelChangeCC) {\n          _handleChannelChange(data[2]);\n        } else if (data[1] == MidiCCValues.bCC_drumOnOff_No) {\n          config.drumsEnabled = data[2] > 0 ? true : false;\n          deviceControl.forceNotifyListeners();\n          return;\n        } else if (data[1] == MidiCCValues.bCC_drumType_No) {\n          config.selectedDrumStyle = data[2];\n          deviceControl.forceNotifyListeners();\n        } else {\n          _handleKnobReceiveData(data);\n        }\n        break;\n    }\n  }\n\n  void saveNuxPreset() {\n    deviceControl.saveNuxPreset();\n  }\n\n  void resetNuxPresets() {\n    nuxPresetsReceived = false;\n    deviceControl.resetNuxPresets();\n  }\n\n  bool isPresetSupported(dynamic preset) {\n    String productId = preset[\"product_id\"];\n    return presetClass == productId;\n  }\n\n  Widget getSettingsWidget() {\n    return const SizedBox.shrink();\n  }\n\n  PresetQRError setupFromQRData(String qrData) {\n    var result = presets[selectedChannel].setupPresetFromQRData(qrData);\n\n    if (result == PresetQRError.Ok) {\n      deviceControl.clearPresetData();\n    }\n\n    return result;\n  }\n\n  Preset? setupDetachedPresetFromQRData(String qrData) {\n    var p = getCustomPreset(selectedChannel);\n\n    var result = p.setupPresetFromQRData(qrData);\n    if (result == PresetQRError.Ok) return p;\n    return null;\n  }\n\n  String? jsonToQR(Map<String, dynamic> jsonPreset) {\n    var preset = presetFromJson(jsonPreset, null, qrOnly: true);\n    if (preset != null) {\n      var data = preset.createNuxDataFromPreset();\n      return \"${QrUtils.nuxQRPrefix}${base64Encode(data)}\";\n    }\n    return null;\n  }\n\n  List<int>? jsonToCompressedData(Map<String, dynamic> jsonPreset) {\n    var preset = presetFromJson(jsonPreset, null, qrOnly: true);\n    if (preset != null) {\n      var data = preset.createNuxDataFromPreset();\n      var encoded = PresetEncoder.encode(data);\n      return encoded;\n    }\n    return null;\n  }\n\n  String channelToQR(int channel) {\n    var data = presets[channel].createNuxDataFromPreset();\n    return \"${QrUtils.nuxQRPrefix}${base64Encode(data)}\";\n  }\n\n  bool checkQRValid(int deviceId, int ver);\n\n  void parseEffect(\n      Map<String, dynamic> effect,\n      int slotIndex,\n      Preset devicePreset,\n      int presetVersion,\n      bool unselected,\n      double? overrideLevel) {\n    int fxTypeNuxIndex = effect[\"fx_type\"];\n    bool enabled = unselected ? false : effect[\"enabled\"];\n    NuxFXID nuxSlotIndex = devicePreset.getFXIDFromSlot(slotIndex);\n    int fxIndex = devicePreset.getEffectArrayIndexFromNuxIndex(\n        nuxSlotIndex, fxTypeNuxIndex);\n    //check if preset conversion is needed\n    if (presetVersion != productVersion) {\n      //temporarily switch the preset to the other version\n      //to get equivalent from this one\n      devicePreset.setFirmwareVersion(presetVersion);\n      //2 things - either switch the version or convert the preset\n      int? newfxType = devicePreset\n          .getEffectsForSlot(slotIndex)[fxIndex]\n          .getEquivalentEffect(productVersion);\n\n      if (newfxType != null) {\n        fxTypeNuxIndex = newfxType;\n        fxIndex = devicePreset.getEffectArrayIndexFromNuxIndex(\n            nuxSlotIndex, fxTypeNuxIndex);\n      } else {\n        //if we don't know equivalent then disable it\n        fxTypeNuxIndex = 0; //set to 0 to avoid null references\n        fxIndex = 0;\n        enabled = false;\n      }\n\n      //revert the preset back\n      devicePreset.setFirmwareVersion(productVersion);\n    }\n\n    if (!unselected) {\n      devicePreset.setSelectedEffectForSlot(slotIndex, fxIndex, false);\n\n      devicePreset.setSlotEnabled(slotIndex, enabled, false);\n    }\n\n    Processor? fx;\n    if (unselected) {\n      var fxList = devicePreset.getEffectsForSlot(slotIndex);\n      for (var searchFx in fxList) {\n        if (searchFx.nuxIndex == fxTypeNuxIndex) fx = searchFx;\n      }\n    } else {\n      fx = devicePreset.getEffectsForSlot(\n          slotIndex)[devicePreset.getSelectedEffectForSlot(slotIndex)];\n    }\n    if (fx == null) return;\n\n    for (int f = 0; f < fx.parameters.length; f++) {\n      //this is only for cabs override level\n      if (overrideLevel != null &&\n          cabinetSupport &&\n          slotIndex == cabinetSlotIndex &&\n          fx.parameters[f].handle == \"level\") {\n        fx.parameters[f].value = overrideLevel;\n      } else {\n        if (presetVersion == productVersion) {\n          if (effect.containsKey(fx.parameters[f].handle)) {\n            fx.parameters[f].value = effect[fx.parameters[f].handle];\n          } else {\n            debugPrint(\n                \"Warning: No key ${fx.parameters[f].handle} for effect $fxTypeNuxIndex in slot $fxTypeNuxIndex\");\n          }\n        } else {\n          //ask the effect for the proper handle\n          var handle = fx.parameters[f].handle;\n          if (effect.containsKey(handle)) {\n            fx.parameters[f].value = effect[handle];\n          }\n        }\n      }\n    }\n  }\n\n  Preset? presetFromJson(Map<String, dynamic> preset, double? overrideLevel,\n      {bool qrOnly = false, bool dontChangeChannel = false}) {\n    var pVersion = preset[\"version\"] ?? 0;\n\n    var nuxChannel = preset[\"channel\"];\n\n    if (!qrOnly) {\n      BLEMidiHandler.instance().clearDataQueue();\n      if (!dontChangeChannel || jamTrackChannelChange) {\n        setSelectedChannel(nuxChannel,\n            notifyBT: true, notifyUI: true, sendFullPreset: false);\n      }\n      deviceControl.presetName = preset[\"name\"];\n      var category = PresetsStorage().findCategoryOfPreset(preset);\n      deviceControl.presetCategory = category![\"name\"];\n      deviceControl.presetUUID = preset[\"uuid\"];\n    }\n\n    Preset p;\n\n    if (!qrOnly) {\n      p = getPreset(selectedChannel);\n    } else {\n      p = getCustomPreset(nuxChannel);\n    }\n\n    if (preset.containsKey(\"volume\")) p.setVolume(preset[\"volume\"], !qrOnly);\n\n    //set the chain order first, if the device supports it\n    if (reorderableFXChain) {\n      int index = 0;\n      for (String key in preset.keys) {\n        var pInfo = getProcessorInfoByKey(key);\n        if (pInfo != null) {\n          p.setFXIDAtSlot(index, pInfo.nuxFXID);\n          index++;\n        }\n      }\n    }\n\n    //parse selected effects and apply them\n    for (String key in preset.keys) {\n      int? index = getSlotByEffectKeyName(key);\n      if (index != null) {\n        //get effect\n        Map<String, dynamic> effect = preset[key];\n\n        parseEffect(effect, index, p, pVersion, false, overrideLevel);\n        if (!qrOnly) deviceControl.sendFullEffectSettings(index, false);\n      }\n    }\n\n    //parse unselected effects\n    if (!qrOnly && preset.containsKey(PresetsStorage.inactiveEffectsKey)) {\n      var inactives = preset[PresetsStorage.inactiveEffectsKey];\n      for (String effectKey in inactives.keys) {\n        int? index = getSlotByEffectKeyName(effectKey);\n        if (index != null) {\n          //get effect\n          for (var effect in inactives[effectKey]) {\n            parseEffect(effect, index, p, pVersion, true, null);\n          }\n        }\n      }\n    }\n\n    //send slot order last, because it's a message with a response\n    //and due to a bug in android ble stack causing a race condition\n    //it screws up the connection\n    if (!qrOnly) communication.sendSlotOrder();\n\n    //update widgets\n    if (!qrOnly) {\n      deviceControl.forceNotifyListeners();\n    } else {\n      return p;\n    }\n\n    return null;\n  }\n\n  Map<String, dynamic> presetToJson({Preset? customPreset}) {\n    Map<String, dynamic> mainJson = {\n      \"channel\": selectedChannel,\n      \"product_id\": presetClass,\n      \"version\": productVersion\n    };\n\n    Preset p = customPreset ?? getPreset(selectedChannel);\n\n    if (!fakeMasterVolume) mainJson[\"volume\"] = p.volume;\n    //parse all effects\n    for (int i = 0; i < effectsChainLength; i++) {\n      Processor fx;\n\n      fx = p.getEffectsForSlot(i)[p.getSelectedEffectForSlot(i)];\n\n      var fxData = <String, dynamic>{};\n      fxData[\"fx_type\"] = fx.nuxIndex;\n      fxData[\"enabled\"] = p.slotEnabled(i);\n\n      for (int f = 0; f < fx.parameters.length; f++) {\n        fxData[fx.parameters[f].handle] = fx.parameters[f].value;\n      }\n\n      var proc = p.getFXIDFromSlot(i);\n      var effect = getProcessorInfoByFXID(proc);\n      mainJson[effect!.keyName] = fxData;\n    }\n\n    // Save settings for not selected effects\n    var inactiveFX = <String, dynamic>{};\n\n    for (int i = 0; i < effectsChainLength; i++) {\n      List fxSlotList = [];\n\n      //skip cab block, because it makes the preset huge\n      //while not being very useful\n      if (i == cabinetSlotIndex) continue;\n\n      List<Processor> effectsForslot = p.getEffectsForSlot(i);\n      for (int j = 0; j < effectsForslot.length; j++) {\n        if (j == p.getSelectedEffectForSlot(i)) continue;\n\n        var fxData = <String, dynamic>{};\n        fxData[\"fx_type\"] = effectsForslot[j].nuxIndex;\n\n        // Generic processing of not selected effects\n        Processor fx;\n        fx = effectsForslot[j];\n\n        for (int f = 0; f < fx.parameters.length; f++) {\n          fxData[fx.parameters[f].handle] = fx.parameters[f].value;\n        }\n\n        fxSlotList.add(fxData);\n      }\n\n      if (fxSlotList.isNotEmpty) {\n        var proc = p.getFXIDFromSlot(i);\n        var effect = getProcessorInfoByFXID(proc);\n        inactiveFX[effect!.keyName] = fxSlotList;\n      }\n    }\n\n    mainJson[PresetsStorage.inactiveEffectsKey] = inactiveFX;\n    return mainJson;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxFXID.dart",
    "content": "import \"NuxConstants.dart\";\n\nclass NuxFXID {\n  final int value;\n  const NuxFXID._internal(this.value);\n  @override\n  toString() => '$value';\n  toInt() => value;\n  static fromInt(int val) => NuxFXID._internal(val);\n\n  @override\n  bool operator ==(covariant NuxFXID other) => other.value == value;\n}\n\nclass PlugAirFXID extends NuxFXID {\n  const PlugAirFXID._internal(int value) : super._internal(value);\n  static const gate = PlugAirFXID._internal(0);\n  static const efx = PlugAirFXID._internal(1);\n  static const amp = PlugAirFXID._internal(2);\n  static const cab = PlugAirFXID._internal(3);\n  static const mod = PlugAirFXID._internal(4);\n  static const delay = PlugAirFXID._internal(5);\n  static const reverb = PlugAirFXID._internal(6);\n}\n\nclass PlugProFXID extends NuxFXID {\n  const PlugProFXID._internal(int value) : super._internal(value);\n\n  static const wah = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iWAH);\n  static const comp = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iCMP);\n  static const efx = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iEFX);\n  static const amp = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iAMP);\n  static const eq = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iEQ);\n  static const gate = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iNG);\n  static const mod = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iMOD);\n  static const delay = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iDLY);\n  static const reverb = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iRVB);\n  static const cab = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iCAB);\n  static const sr = PlugProFXID._internal(PresetDataIndexPlugPro.Head_iSR);\n\n  //@override\n  //bool operator ==(covariant NuxFXID other) => other.value == value;\n}\n\nclass PlugBTFXID extends NuxFXID {\n  const PlugBTFXID._internal(int value) : super._internal(value);\n  static const gate = PlugBTFXID._internal(0);\n  static const amp = PlugBTFXID._internal(1);\n  static const mod = PlugBTFXID._internal(2);\n  static const delay = PlugBTFXID._internal(3);\n  static const reverb = PlugBTFXID._internal(4);\n}\n\nclass LiteFXID extends NuxFXID {\n  const LiteFXID._internal(int value) : super._internal(value);\n  static const gate = LiteFXID._internal(0);\n  static const amp = LiteFXID._internal(1);\n  static const mod = LiteFXID._internal(2);\n  static const ambience = LiteFXID._internal(3);\n}\n\nclass LiteMK2FXID extends NuxFXID {\n  const LiteMK2FXID._internal(int value) : super._internal(value);\n  static const gate = LiteFXID._internal(0);\n  static const efx = LiteFXID._internal(1);\n  static const amp = LiteFXID._internal(2);\n  static const cab = LiteFXID._internal(3);\n  static const mod = LiteFXID._internal(4);\n  static const delay = LiteFXID._internal(5);\n  static const reverb = LiteFXID._internal(6);\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMighty2040BT.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/device_data/processors_list.dart';\nimport 'NuxConstants.dart';\nimport 'communication/communication.dart';\nimport 'communication/liteCommunication.dart';\nimport 'device_data/drumstyles.dart';\nimport 'presets/MightyXXBTPreset.dart';\n\nimport '../NuxDeviceControl.dart';\nimport 'NuxDevice.dart';\nimport 'effects/Processor.dart';\nimport 'presets/Preset.dart';\n\nenum M2040BTChannel {\n  Clean1,\n  Overdrive1,\n  Metal1,\n  Lead1,\n  Clean2,\n  Overdrive2,\n  Metal2,\n  Lead2\n}\n\nclass NuxMighty2040BT extends NuxDevice {\n  @override\n  int get productVID => 48;\n\n  late final LiteCommunication _communication = LiteCommunication(this, config);\n  @override\n  DeviceCommunication get communication => _communication;\n  final NuxDeviceConfiguration _config = NuxDeviceConfiguration();\n  @override\n  NuxDeviceConfiguration get config => _config;\n\n  @override\n  String get productName => \"NUX Mighty 20/40 BT\";\n  @override\n  String get productNameShort => \"Mighty 20/40 BT\";\n  @override\n  String get productStringId => \"mighty_20_40bt\";\n  @override\n  String get presetClass => productStringId;\n  @override\n  int get productVersion => 0;\n  @override\n  String get productIconLabel => \"20/40|BT\";\n  @override\n  List<String> get productBLENames => [\"NUX MIGHTY20BT\", \"NUX MIGHTY40BT\"];\n\n  @override\n  int get channelsCount => 8;\n  @override\n  int get effectsChainLength => 5;\n  int get groupsCount => 1;\n  @override\n  int get amplifierSlotIndex => 1;\n  @override\n  bool get fakeMasterVolume => true;\n  @override\n  bool get activeChannelRetrieval => false;\n  @override\n  bool get longChannelNames => true;\n  @override\n  bool get cabinetSupport => false;\n  @override\n  bool get hackableIRs => false;\n  @override\n  int get cabinetSlotIndex => 0;\n  @override\n  bool get presetSaveSupport => true;\n  @override\n  bool get reorderableFXChain => false;\n  @override\n  bool get batterySupport => false;\n  @override\n  bool get nativeActiveChannelsSupport => false;\n  @override\n  int get channelChangeCC => MidiCCValues.bCC_AmpMode;\n  @override\n  int get deviceQRId => 7;\n  @override\n  int get deviceQRVersion => 1;\n  @override\n  bool get jamTrackChannelChange => true;\n\n  @override\n  List<String> get groupsName => [\"All\"]; //, \"Group 2\"];\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.bt2040List;\n\n  List<Preset> presets1 = <Preset>[];\n  List<Preset> presets2 = <Preset>[];\n\n  NuxMighty2040BT(NuxDeviceControl devControl) : super(devControl) {\n    //get channel names\n    for (var element in M2040BTChannel.values) {\n      channelNames.add(element.toString().split('.')[1]);\n    }\n\n    //clean\n    presets1.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Clean1.index,\n        channelName: \"Clean 1\"));\n\n    //OD\n    presets1.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Overdrive1.index,\n        channelName: \"Drive 1\"));\n\n    //Metal\n    presets1.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Metal1.index,\n        channelName: \"Metal 1\"));\n\n    //Lead\n    presets1.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Lead1.index,\n        channelName: \"Lead 1\"));\n\n    presets2.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Clean2.index,\n        channelName: \"Clean 2\"));\n\n    //OD\n    presets2.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Overdrive2.index,\n        channelName: \"Drive 2\"));\n\n    //Metal\n    presets2.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Metal2.index,\n        channelName: \"Metal 2\"));\n\n    //Lead\n    presets2.add(MXXBTPreset(\n        device: this,\n        channel: M2040BTChannel.Lead2.index,\n        channelName: \"Lead 2\"));\n\n    presets.addAll(presets1);\n    presets.addAll(presets2);\n  }\n\n  @override\n  dynamic getDrumStyles() => DrumStyles.drumStyles2040BT;\n\n  @override\n  void setFirmwareVersion(int ver) {}\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {}\n\n  @override\n  MXXBTPreset getCustomPreset(int channel) {\n    var preset = MXXBTPreset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    return deviceId == deviceQRId;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMighty8BT.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/device_data/processors_list.dart';\nimport 'NuxConstants.dart';\nimport 'communication/communication.dart';\nimport 'communication/liteCommunication.dart';\nimport 'device_data/drumstyles.dart';\nimport 'presets/Mighty8BTPreset.dart';\n\nimport '../NuxDeviceControl.dart';\nimport 'NuxDevice.dart';\nimport 'effects/Processor.dart';\n\nenum M8BTChannel { Clean, Overdrive, Distortion }\n\nclass NuxMighty8BT extends NuxDevice {\n  @override\n  int get productVID => 48;\n\n  late final LiteCommunication _communication = LiteCommunication(this, config);\n  @override\n  DeviceCommunication get communication => _communication;\n  final NuxDeviceConfiguration _config = NuxDeviceConfiguration();\n  @override\n  NuxDeviceConfiguration get config => _config;\n\n  @override\n  String get productName => \"NUX Mighty 8 BT\";\n  @override\n  String get productNameShort => \"Mighty 8 BT\";\n  @override\n  String get productIconLabel => \"8 BT\";\n\n  @override\n  String get productStringId => \"mighty_8bt\";\n  @override\n  String get presetClass => productStringId;\n  @override\n  int get productVersion => 0;\n  @override\n  List<String> get productBLENames => [\"NUX MIGHTY8BT\"];\n\n  @override\n  int get channelsCount => 3;\n  @override\n  int get effectsChainLength => 5;\n  @override\n  int get amplifierSlotIndex => 1;\n  @override\n  bool get fakeMasterVolume => true;\n  @override\n  bool get activeChannelRetrieval => false;\n  @override\n  bool get longChannelNames => true;\n  @override\n  bool get cabinetSupport => false;\n  @override\n  bool get hackableIRs => false;\n  @override\n  int get cabinetSlotIndex => 0;\n  @override\n  bool get presetSaveSupport => true;\n  @override\n  bool get reorderableFXChain => false;\n  @override\n  bool get batterySupport => false;\n  @override\n  bool get nativeActiveChannelsSupport => false;\n  @override\n  int get channelChangeCC => MidiCCValues.bCC_AmpModeSetup;\n  @override\n  int get deviceQRId => 12;\n  @override\n  int get deviceQRVersion => 1;\n  @override\n  bool get jamTrackChannelChange => true;\n\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.mighty8BTList;\n\n  List<String> channelNames = [];\n\n  NuxMighty8BT(NuxDeviceControl devControl) : super(devControl) {\n    //get channel names\n    for (var element in M8BTChannel.values) {\n      channelNames.add(element.toString().split('.')[1]);\n    }\n\n    //clean\n    presets.add(M8BTPreset(\n        device: this, channel: M8BTChannel.Clean.index, channelName: \"Clean\"));\n\n    //OD\n    presets.add(M8BTPreset(\n        device: this,\n        channel: M8BTChannel.Overdrive.index,\n        channelName: \"Drive\"));\n\n    //Dist\n    presets.add(M8BTPreset(\n        device: this,\n        channel: M8BTChannel.Distortion.index,\n        channelName: \"Dist\"));\n  }\n\n  @override\n  dynamic getDrumStyles() => DrumStyles.drumStyles8BT;\n\n  @override\n  void setFirmwareVersion(int ver) {}\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {}\n\n  @override\n  M8BTPreset getCustomPreset(int channel) {\n    var preset = M8BTPreset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    return deviceId == deviceQRId;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMighty8BTMk2.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/device_specific_settings/PlugProSettings.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/communication.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\n\nimport '../../UI/pages/device_specific_settings/LiteMk2Settings.dart';\nimport 'NuxConstants.dart';\nimport 'communication/liteMk2Communication.dart';\nimport 'device_data/drumstyles.dart';\nimport 'device_data/processors_list.dart';\nimport 'effects/plug_pro/EQ.dart';\nimport 'features/drumsTone.dart';\nimport 'features/looper.dart';\nimport 'features/proUsbSettings.dart';\nimport 'features/tuner.dart';\nimport 'presets/MightyMk2Preset.dart';\nimport 'value_formatters/ValueFormatter.dart';\n\nenum LiteMK2Version { LiteMK2v1 }\n\nclass NuxMighty8BT2Configuration extends NuxDeviceConfiguration {\n  static const bluetoothEQCount = 4;\n\n  double drumsBass = 50;\n  double drumsMiddle = 50;\n  double drumsTreble = 50;\n\n  int routingMode = 1;\n  int recLevel = 50;\n  int playbackLevel = 50;\n  int usbDryWet = 50;\n\n  //Bluetooth and mic\n  EQTenBandBT bluetoothEQ = EQTenBandBT();\n  int bluetoothGroup = 0;\n  bool bluetoothEQMute = false;\n  bool bluetoothInvertChannel = false;\n\n  bool micMute = false;\n  int micVolume = 50;\n  bool micNoiseGate = false;\n  int micNGSensitivity = 50;\n  int micNGDecay = 50;\n\n  LooperData looperData = LooperData();\n\n  TunerData tunerData = TunerData();\n}\n\nclass NuxMighty8BTMk2 extends NuxDevice\n    implements Tuner, ProUsbSettings, DrumsTone, Looper {\n  NuxMighty8BTMk2(super.devControl) {\n    //get channel names\n    for (int i = 0; i < channelsCount; i++) {\n      presets.add(MightyMk2Preset(\n          device: this, channel: i, channelName: (i + 1).toString()));\n      channelNames.add((i + 1).toString());\n    }\n  }\n\n  late final LiteMk2Communication _communication =\n      LiteMk2Communication(this, config);\n\n  final NuxMighty8BT2Configuration _config = NuxMighty8BT2Configuration();\n\n  LiteMK2Version version = LiteMK2Version.LiteMK2v1;\n\n  @override\n  String get productName => \"NUX Mighty 8BT MKII\";\n  @override\n  String get productNameShort => \"Mighty 8BT MKII\";\n  @override\n  String get productStringId => \"mighty_lite2\";\n  @override\n  int get productVersion => version.index;\n  @override\n  String get productIconLabel => \"LITE II|-|8BT II\";\n  @override\n  List<String> get productBLENames => [\"NUX NGA-8BT\", \"MIGHTY 8BT MKII\"];\n\n  @override\n  int get productVID => 0;\n\n  @override\n  bool get activeChannelRetrieval => true;\n\n  @override\n  bool get batterySupport => false;\n\n  @override\n  bool get cabinetSupport => true;\n\n  @override\n  int get channelChangeCC => -1;\n\n  @override\n  int get channelsCount => 7;\n\n  @override\n  ValueFormatter? get decibelFormatter => ValueFormatters.decibelMPPro;\n\n  @override\n  DeviceCommunication get communication => _communication;\n\n  @override\n  // TODO: implement config\n  NuxMighty8BT2Configuration get config => _config;\n\n  @override\n  int get deviceQRId => 0x14;\n\n  int get deviceQRIdAlt => 0x13; //Mighty lite QR\n\n  @override\n  int get deviceQRVersion => 0x01;\n\n  @override\n  int get effectsChainLength => 7;\n\n  @override\n  bool get fakeMasterVolume => false;\n\n  @override\n  bool get hackableIRs => false;\n\n  @override\n  bool get longChannelNames => false;\n\n  @override\n  bool get nativeActiveChannelsSupport => true;\n\n  @override\n  bool get reorderableFXChain => false;\n\n  @override\n  int get amplifierSlotIndex => 2;\n\n  @override\n  int get cabinetSlotIndex => 3;\n\n  @override\n  String get presetClass => \"mighty_amps_mk2\";\n\n  @override\n  bool get presetSaveSupport => true;\n\n  @override\n  double get drumsBass => _config.drumsBass;\n  @override\n  double get drumsMiddle => _config.drumsMiddle;\n  @override\n  double get drumsTreble => _config.drumsTreble;\n\n  @override\n  double get drumsMaxTempo => 300;\n\n  @override\n  int get loopState => config.looperData.loopState;\n  @override\n  int get loopUndoState => config.looperData.loopUndoState;\n  @override\n  int get loopRecordMode => config.looperData.loopRecordMode;\n  @override\n  double get loopLevel => config.looperData.loopLevel;\n\n  final looperController = StreamController<LooperData>.broadcast();\n\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.liteMk2List;\n  final _tunerController = StreamController<TunerData>.broadcast();\n\n  int? _drumStylesCount;\n\n  @override\n  getDrumStyles() => DrumStyles.drumCategoriesPro;\n\n  @override\n  int getDrumStylesCount() {\n    if (_drumStylesCount == null) {\n      _drumStylesCount = 0;\n      for (var cat in DrumStyles.drumCategoriesPro.values) {\n        _drumStylesCount = _drumStylesCount! + cat.length;\n      }\n    }\n    return _drumStylesCount!;\n  }\n\n  @override\n  void setFirmwareVersion(int ver) {\n    // TODO: implement setFirmwareVersion\n  }\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {\n    // TODO: implement setFirmwareVersionByIndex\n  }\n\n  @override\n  Widget getSettingsWidget() {\n    return PlugProSettings(device: this, mightySpace: false);\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    if (deviceId != deviceQRId && deviceId != deviceQRIdAlt) return false;\n    return ver == 1;\n  }\n\n  @override\n  MightyMk2Preset getCustomPreset(int channel) {\n    var preset =\n        MightyMk2Preset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  void setDrumsTone(double value, DrumsToneControl control, bool send) {\n    switch (control) {\n      case DrumsToneControl.bass:\n        _config.drumsBass = value;\n        break;\n      case DrumsToneControl.middle:\n        _config.drumsMiddle = value;\n        break;\n      case DrumsToneControl.treble:\n        _config.drumsTreble = value;\n        break;\n    }\n    if (send) _communication.setDrumsTone(value, control);\n  }\n\n  @override\n  bool get tunerAvailable {\n    return deviceControl.isConnected;\n  }\n\n  @override\n  void tunerEnable(bool enable) {\n    _communication.enableTuner(enable);\n  }\n\n  @override\n  void tunerRequestSettings() {\n    _communication.requestTunerSettings();\n  }\n\n  @override\n  void tunerSetMode(TunerMode mode) {\n    _config.tunerData.mode = mode;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerSetReferencePitch(int refPitch) {\n    _config.tunerData.referencePitch = refPitch;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerMute(bool enable) {\n    _config.tunerData.muted = enable;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  Stream<TunerData> getTunerDataStream() {\n    return _tunerController.stream;\n  }\n\n  @override\n  void notifyTunerListeners() {\n    _tunerController.add(_config.tunerData);\n  }\n\n  @override\n  int get tunerNoteCC => MidiCCValuesPro.TunerLiteMK2_Note;\n\n  @override\n  int get tunerPitchCC => MidiCCValuesPro.TunerLiteMK2_Cent;\n\n  @override\n  int get tunerStateCC => MidiCCValuesPro.TunerLiteMK2_State;\n\n  @override\n  int get tunerStringCC => MidiCCValuesPro.TunerLiteMK2_Number;\n\n  @override\n  void setUsbMode(int mode) {\n    _config.routingMode = mode;\n    communication.setUsbAudioMode(mode);\n  }\n\n  @override\n  void setUsbRecordingVol(int vol) {\n    _config.recLevel = vol;\n    communication.setUsbInputVolume(vol);\n  }\n\n  @override\n  void setUsbPlaybackVol(int vol) {\n    _config.playbackLevel = vol;\n    communication.setUsbOutputVolume(vol);\n  }\n\n  @override\n  void setUsbDryWetVol(int vol) {\n    _config.usbDryWet = vol;\n    _communication.setUsbDryWet(vol);\n  }\n\n  @override\n  Stream<LooperData> getLooperDataStream() {\n    return looperController.stream;\n  }\n\n  void notifyLooperListeners() {\n    looperController.add(config.looperData);\n  }\n\n  @override\n  void looperClear() {\n    _communication.looperClear();\n  }\n\n  @override\n  void looperRecordPlay() {\n    _communication.looperRecord();\n  }\n\n  @override\n  void looperStop() {\n    _communication.looperStop();\n  }\n\n  @override\n  void looperUndoRedo() {\n    _communication.looperUndoRedo();\n  }\n\n  @override\n  void looperLevel(int vol) {\n    config.looperData.loopLevel = vol.toDouble();\n    _communication.looperVolume(vol);\n  }\n\n  @override\n  void looperNrAr(bool auto) {\n    config.looperData.loopRecordMode = auto ? 1 : 0;\n    _communication.looperNrAr(auto);\n  }\n\n  @override\n  void requestLooperSettings() {\n    _communication.requestLooperSettings();\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMightyLite.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/device_data/processors_list.dart';\nimport 'NuxConstants.dart';\nimport 'communication/communication.dart';\nimport 'communication/liteCommunication.dart';\nimport 'device_data/drumstyles.dart';\nimport 'presets/MightyLitePreset.dart';\n\nimport '../NuxDeviceControl.dart';\nimport 'NuxDevice.dart';\nimport 'effects/Processor.dart';\n\nenum MLiteChannel { Clean, Overdrive, Distortion }\n\nclass NuxMightyLite extends NuxDevice {\n  @override\n  int get productVID => 64;\n\n  late final LiteCommunication _communication = LiteCommunication(this, config);\n  @override\n  DeviceCommunication get communication => _communication;\n  final NuxDeviceConfiguration _config = NuxDeviceConfiguration();\n  @override\n  NuxDeviceConfiguration get config => _config;\n\n  @override\n  String get productName => \"NUX Mighty Lite BT\";\n  @override\n  String get productNameShort => \"Mighty Lite\";\n  @override\n  String get productStringId => \"mighty_lite\";\n  @override\n  String get presetClass => productStringId;\n  @override\n  int get productVersion => 0;\n  @override\n  String get productIconLabel => \"LITE\";\n\n  @override\n  List<String> get productBLENames =>\n      [\"NUX MIGHTY LITE\", \"AirBorne GO\", \"GUO AN\"];\n\n  @override\n  int get channelsCount => 3;\n  @override\n  int get effectsChainLength => 4;\n  int get groupsCount => 1;\n  @override\n  int get amplifierSlotIndex => 1;\n  @override\n  bool get fakeMasterVolume => true;\n  @override\n  bool get activeChannelRetrieval => false;\n  @override\n  bool get longChannelNames => true;\n  @override\n  bool get cabinetSupport => false;\n  @override\n  bool get hackableIRs => false;\n  @override\n  int get cabinetSlotIndex => 0;\n  @override\n  bool get presetSaveSupport => true;\n  @override\n  bool get reorderableFXChain => false;\n  @override\n  bool get batterySupport => false;\n  @override\n  bool get nativeActiveChannelsSupport => false;\n  @override\n  int get channelChangeCC => MidiCCValues.bCC_AmpModeSetup;\n  @override\n  int get deviceQRId => 9;\n  @override\n  int get deviceQRVersion => 1;\n  @override\n  bool get jamTrackChannelChange => true;\n\n  @override\n  List<String> get groupsName => [\"Default\"];\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.liteList;\n\n  List<String> channelNames = [];\n\n  NuxMightyLite(NuxDeviceControl devControl) : super(devControl) {\n    //get channel names\n    for (var element in MLiteChannel.values) {\n      channelNames.add(element.toString().split('.')[1]);\n    }\n\n    //clean\n    presets.add(MLitePreset(\n        device: this, channel: MLiteChannel.Clean.index, channelName: \"Clean\"));\n\n    //OD\n    presets.add(MLitePreset(\n        device: this,\n        channel: MLiteChannel.Overdrive.index,\n        channelName: \"Drive\"));\n\n    //Dist\n    presets.add(MLitePreset(\n        device: this,\n        channel: MLiteChannel.Distortion.index,\n        channelName: \"Dist\"));\n  }\n\n  @override\n  dynamic getDrumStyles() => DrumStyles.drumStyles8BT;\n\n  @override\n  void setFirmwareVersion(int ver) {}\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {}\n\n  @override\n  MLitePreset getCustomPreset(int channel) {\n    var preset = MLitePreset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    return deviceId == deviceQRId;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMightyLiteMk2.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/communication.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/Processor.dart';\n\nimport '../../UI/pages/device_specific_settings/LiteMk2Settings.dart';\nimport 'NuxConstants.dart';\nimport 'NuxMightyPlugPro.dart';\nimport 'communication/liteMk2Communication.dart';\nimport 'device_data/drumstyles.dart';\nimport 'device_data/processors_list.dart';\nimport 'features/drumsTone.dart';\nimport 'features/proUsbSettings.dart';\nimport 'features/tuner.dart';\nimport 'presets/MightyMk2Preset.dart';\nimport 'value_formatters/ValueFormatter.dart';\n\nenum LiteMK2Version { LiteMK2v1 }\n\nclass NuxMightyLiteMk2 extends NuxDevice\n    implements Tuner, ProUsbSettings, DrumsTone {\n  NuxMightyLiteMk2(super.devControl) {\n    //get channel names\n    for (int i = 0; i < channelsCount; i++) {\n      presets.add(MightyMk2Preset(\n          device: this, channel: i, channelName: (i + 1).toString()));\n      channelNames.add((i + 1).toString());\n    }\n  }\n\n  late final LiteMk2Communication _communication =\n      LiteMk2Communication(this, config);\n\n  final NuxPlugProConfiguration _config = NuxPlugProConfiguration();\n\n  LiteMK2Version version = LiteMK2Version.LiteMK2v1;\n\n  @override\n  String get productName => \"NUX Mighty Lite MKII\";\n  @override\n  String get productNameShort => \"Mighty Lite MKII\";\n  @override\n  String get productStringId => \"mighty_lite2\";\n  @override\n  int get productVersion => version.index;\n  @override\n  String get productIconLabel => \"LITE II|-|8BT II\";\n  @override\n  List<String> get productBLENames => [\"NUX NGA-3BT\", \"MIGHTY LITE BT MKII\"];\n\n  @override\n  int get productVID => 0;\n\n  @override\n  bool get activeChannelRetrieval => true;\n\n  @override\n  bool get batterySupport => false;\n\n  @override\n  bool get cabinetSupport => true;\n\n  @override\n  int get channelChangeCC => -1;\n\n  @override\n  int get channelsCount => 7;\n\n  @override\n  ValueFormatter? get decibelFormatter => ValueFormatters.decibelMPPro;\n\n  @override\n  DeviceCommunication get communication => _communication;\n\n  @override\n  // TODO: implement config\n  NuxDeviceConfiguration get config => _config;\n\n  @override\n  int get deviceQRId => 0x13;\n\n  int get deviceQRIdAlt => 0x14; //mighty 8BT mk2\n\n  @override\n  int get deviceQRVersion => 0x01;\n\n  @override\n  int get effectsChainLength => 7;\n\n  @override\n  bool get fakeMasterVolume => false;\n\n  @override\n  bool get hackableIRs => false;\n\n  @override\n  bool get longChannelNames => false;\n\n  @override\n  bool get nativeActiveChannelsSupport => true;\n\n  @override\n  bool get reorderableFXChain => false;\n\n  @override\n  int get amplifierSlotIndex => 2;\n\n  @override\n  int get cabinetSlotIndex => 3;\n\n  @override\n  String get presetClass => \"mighty_amps_mk2\";\n\n  @override\n  bool get presetSaveSupport => true;\n\n  @override\n  double get drumsBass => _config.drumsBass;\n  @override\n  double get drumsMiddle => _config.drumsMiddle;\n  @override\n  double get drumsTreble => _config.drumsTreble;\n\n  @override\n  double get drumsMaxTempo => 300;\n\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.liteMk2List;\n  final _tunerController = StreamController<TunerData>.broadcast();\n\n  int? _drumStylesCount;\n\n  @override\n  getDrumStyles() => DrumStyles.drumCategoriesPro;\n\n  @override\n  int getDrumStylesCount() {\n    if (_drumStylesCount == null) {\n      _drumStylesCount = 0;\n      for (var cat in DrumStyles.drumCategoriesPro.values) {\n        _drumStylesCount = _drumStylesCount! + cat.length;\n      }\n    }\n    return _drumStylesCount!;\n  }\n\n  @override\n  void setFirmwareVersion(int ver) {\n    // TODO: implement setFirmwareVersion\n  }\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {\n    // TODO: implement setFirmwareVersionByIndex\n  }\n\n  @override\n  Widget getSettingsWidget() {\n    return LiteMk2Settings(device: this);\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    if (deviceId != deviceQRId && deviceId != deviceQRIdAlt) return false;\n    return ver == 1;\n  }\n\n  @override\n  MightyMk2Preset getCustomPreset(int channel) {\n    var preset =\n        MightyMk2Preset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  void setDrumsTone(double value, DrumsToneControl control, bool send) {\n    switch (control) {\n      case DrumsToneControl.bass:\n        _config.drumsBass = value;\n        break;\n      case DrumsToneControl.middle:\n        _config.drumsMiddle = value;\n        break;\n      case DrumsToneControl.treble:\n        _config.drumsTreble = value;\n        break;\n    }\n    if (send) _communication.setDrumsTone(value, control);\n  }\n\n  @override\n  bool get tunerAvailable {\n    return deviceControl.isConnected;\n  }\n\n  @override\n  void tunerEnable(bool enable) {\n    _communication.enableTuner(enable);\n  }\n\n  @override\n  void tunerRequestSettings() {\n    _communication.requestTunerSettings();\n  }\n\n  @override\n  void tunerSetMode(TunerMode mode) {\n    _config.tunerData.mode = mode;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerSetReferencePitch(int refPitch) {\n    _config.tunerData.referencePitch = refPitch;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerMute(bool enable) {\n    _config.tunerData.muted = enable;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  Stream<TunerData> getTunerDataStream() {\n    return _tunerController.stream;\n  }\n\n  @override\n  void notifyTunerListeners() {\n    _tunerController.add(_config.tunerData);\n  }\n\n  @override\n  int get tunerNoteCC => MidiCCValuesPro.TunerLiteMK2_Note;\n\n  @override\n  int get tunerPitchCC => MidiCCValuesPro.TunerLiteMK2_Cent;\n\n  @override\n  int get tunerStateCC => MidiCCValuesPro.TunerLiteMK2_State;\n\n  @override\n  int get tunerStringCC => MidiCCValuesPro.TunerLiteMK2_Number;\n\n  @override\n  void setUsbMode(int mode) {\n    _config.routingMode = mode;\n    communication.setUsbAudioMode(mode);\n  }\n\n  @override\n  void setUsbRecordingVol(int vol) {\n    _config.recLevel = vol;\n    communication.setUsbInputVolume(vol);\n  }\n\n  @override\n  void setUsbPlaybackVol(int vol) {\n    _config.playbackLevel = vol;\n    communication.setUsbOutputVolume(vol);\n  }\n\n  @override\n  void setUsbDryWetVol(int vol) {\n    _config.usbDryWet = vol;\n    _communication.setUsbDryWet(vol);\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMightyPlugAir.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/device_specific_settings/PlugAirSettings.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/device_data/processors_list.dart';\nimport '../bleMidiHandler.dart';\nimport 'communication/communication.dart';\nimport 'communication/plugAirCommunication.dart';\n\nimport '../NuxDeviceControl.dart';\nimport 'NuxConstants.dart';\nimport 'NuxDevice.dart';\nimport 'device_data/drumstyles.dart';\nimport 'effects/Processor.dart';\nimport 'presets/PlugAirPreset.dart';\nimport 'presets/Preset.dart';\nimport 'value_formatters/ValueFormatter.dart';\n\nenum PlugAirChannel { Clean, Overdrive, Distortion, AGSim, Pop, Rock, Funk }\n\nenum PlugAirVersion { PlugAir15, PlugAir21 }\n\nenum PlugAirVariant { MightyPlug, MightyAir }\n\nclass NuxMightyPlugConfiguration extends NuxDeviceConfiguration {\n  int usbMode = 0;\n  int inputVol = 50;\n  int outputVol = 50;\n  int btEq = 0;\n}\n\nclass NuxMightyPlug extends NuxDevice {\n  //this is used in conversion of very old format of presets which\n  // didn't contain device id. They were always for mighty plug/air\n  static const defaultNuxId = \"mighty_plug_air\";\n  @override\n  int get productVID => 48;\n\n  late final PlugAirCommunication _communication =\n      PlugAirCommunication(this, config);\n  @override\n  DeviceCommunication get communication => _communication;\n\n  final NuxMightyPlugConfiguration _config = NuxMightyPlugConfiguration();\n  @override\n  NuxMightyPlugConfiguration get config => _config;\n\n  PlugAirVersion version = PlugAirVersion.PlugAir21;\n\n  PlugAirVariant ampVariant = PlugAirVariant.MightyPlug;\n\n  @override\n  String get productName => \"NUX Mighty Plug/Air\";\n  @override\n  String get productNameShort => \"Mighty Plug/Air\";\n  @override\n  String get productStringId => \"mighty_plug_air\";\n  @override\n  String get presetClass => productStringId;\n  @override\n  int get productVersion => version.index;\n  @override\n  String get productIconLabel => \"PLUG|-|AIR\";\n  @override\n  List<String> get productBLENames => [\"NUX MIGHTY PLUG\", \"NUX MIGHTY AIR\", \"NUX NGA-10W\"];\n\n  String get mightyAirBLEName => productBLENames[1];\n  //general settings\n\n  int get usbMode => config.usbMode;\n  int get inputVol => config.inputVol;\n  int get outputVol => config.outputVol;\n  int get btEq => config.btEq;\n\n  @override\n  int get channelsCount => 7;\n  @override\n  int get effectsChainLength => 7;\n  int get groupsCount => 1;\n  @override\n  int get amplifierSlotIndex => 2;\n  @override\n  bool get fakeMasterVolume => true;\n  @override\n  bool get activeChannelRetrieval => true;\n  @override\n  bool get longChannelNames => false;\n  @override\n  bool get cabinetSupport => true;\n  @override\n  bool get hackableIRs => true;\n  @override\n  int get cabinetSlotIndex => 3;\n  @override\n  bool get presetSaveSupport => true;\n  @override\n  bool get reorderableFXChain => false;\n  @override\n  bool get batterySupport => true;\n  @override\n  bool get nativeActiveChannelsSupport => false;\n  @override\n  ValueFormatter? get decibelFormatter => ValueFormatters.decibelMP2;\n  @override\n  int get channelChangeCC => MidiCCValues.bCC_CtrlType;\n  @override\n  int get deviceQRId => 11;\n\n  //alternative id for Mighty Air\n  int get deviceQRIdAlt => 6;\n\n  @override\n  int get deviceQRVersion => version == PlugAirVersion.PlugAir21 ? 2 : 0;\n\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.plugAirList;\n\n  List<Preset> guitarPresets = <Preset>[];\n  List<Preset> bassPresets = <Preset>[];\n\n  List<String> channelNames = [];\n\n  NuxMightyPlug(NuxDeviceControl devControl) : super(devControl) {\n    //clean\n    guitarPresets.add(PlugAirPreset(\n        device: this, channel: PlugAirChannel.Clean.index, channelName: \"1\"));\n\n    //OD\n    guitarPresets.add(PlugAirPreset(\n        device: this,\n        channel: PlugAirChannel.Overdrive.index,\n        channelName: \"2\"));\n\n    //Dist\n    guitarPresets.add(PlugAirPreset(\n        device: this,\n        channel: PlugAirChannel.Distortion.index,\n        channelName: \"3\"));\n\n    //AGSim\n    guitarPresets.add(PlugAirPreset(\n        device: this, channel: PlugAirChannel.AGSim.index, channelName: \"4\"));\n\n    //Pop Bass\n    bassPresets.add(PlugAirPreset(\n        device: this, channel: PlugAirChannel.Pop.index, channelName: \"5\"));\n\n    //Rock Bass\n    bassPresets.add(PlugAirPreset(\n        device: this, channel: PlugAirChannel.Rock.index, channelName: \"6\"));\n\n    //Funk Bass\n    bassPresets.add(PlugAirPreset(\n        device: this, channel: PlugAirChannel.Funk.index, channelName: \"7\"));\n\n    presets.addAll(guitarPresets);\n    presets.addAll(bassPresets);\n\n    //get channel names\n    for (var preset in presets) {\n      (preset as PlugAirPreset).setFirmwareVersion(version.index);\n      channelNames.add(\"Channel ${preset.channelName}\");\n    }\n  }\n\n  @override\n  dynamic getDrumStyles() => DrumStyles.drumStylesPlug;\n\n  @override\n  void onConnect() {\n    var name = BLEMidiHandler.instance().connectedDevice?.name;\n    if (name != null && name.contains(mightyAirBLEName)) {\n      ampVariant = PlugAirVariant.MightyAir;\n    } else {\n      ampVariant = PlugAirVariant.MightyPlug;\n    }\n    super.onConnect();\n  }\n\n  @override\n  void setFirmwareVersion(int ver) {\n    if (ver < 21) {\n      version = PlugAirVersion.PlugAir15;\n    } else {\n      version = PlugAirVersion.PlugAir21;\n    }\n\n    //set all presets with that firmware\n    for (var preset in presets) {\n      (preset as PlugAirPreset).setFirmwareVersion(version.index);\n    }\n  }\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {\n    version = PlugAirVersion.values[ver];\n\n    //set all presets with that firmware\n    for (var preset in presets) {\n      (preset as PlugAirPreset).setFirmwareVersion(version.index);\n    }\n  }\n\n  @override\n  int getAvailableVersions() {\n    return 2;\n  }\n\n  @override\n  String getProductNameVersion(int version) {\n    switch (PlugAirVersion.values[version]) {\n      case PlugAirVersion.PlugAir15:\n        return \"$productNameShort v1.x\";\n      case PlugAirVersion.PlugAir21:\n        return \"$productNameShort v2.x\";\n    }\n  }\n\n  @override\n  String getProductNameForQR(int version) {\n    switch (PlugAirVersion.values[version]) {\n      case PlugAirVersion.PlugAir15:\n        return \"$productNameForQR v1.x\";\n      case PlugAirVersion.PlugAir21:\n        return \"$productNameForQR v2.x\";\n    }\n  }\n\n  @override\n  PlugAirPreset getCustomPreset(int channel) {\n    var preset = PlugAirPreset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  //device specific settings\n  void setUsbMode(int mode) {\n    config.usbMode = mode;\n    communication.setUsbAudioMode(mode);\n  }\n\n  void setUsbInputVol(int vol) {\n    config.inputVol = vol;\n    communication.setUsbInputVolume(vol);\n  }\n\n  void setUsbOutputVol(int vol) {\n    config.outputVol = vol;\n    communication.setUsbOutputVolume(vol);\n  }\n\n  void setBtEq(int eq) {\n    config.btEq = eq;\n    communication.setBTEq(eq);\n  }\n\n  @override\n  Widget getSettingsWidget() {\n    return PlugAirSettings(device: this);\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    if (deviceId != deviceQRId && deviceId != deviceQRIdAlt) return false;\n    if (version == PlugAirVersion.PlugAir15 && ver == 0) {\n      return true;\n    } else if (version == PlugAirVersion.PlugAir21 && ver > 0) {\n      return true;\n    }\n\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMightyPlugPro.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/device_data/processors_list.dart';\nimport '../../UI/pages/device_specific_settings/PlugProSettings.dart';\nimport 'NuxConstants.dart';\nimport 'NuxFXID.dart';\nimport 'NuxReorderableDevice.dart';\nimport 'communication/communication.dart';\nimport 'communication/plugProCommunication.dart';\n\nimport '../NuxDeviceControl.dart';\nimport 'NuxDevice.dart';\nimport 'device_data/drumstyles.dart';\nimport 'effects/Processor.dart';\nimport 'effects/plug_pro/EQ.dart';\nimport 'features/drumsTone.dart';\nimport 'features/looper.dart';\nimport 'features/proUsbSettings.dart';\nimport 'features/tuner.dart';\nimport 'presets/PlugProPreset.dart';\nimport 'value_formatters/ValueFormatter.dart';\n\nenum PlugProChannel { Clean, Overdrive, Distortion, AGSim, Pop, Rock, Funk }\n\nenum PlugProVersion { PlugPro1 }\n\nclass NuxPlugProConfiguration extends NuxDeviceConfiguration {\n  static const bluetoothEQCount = 4;\n\n  double drumsBass = 50;\n  double drumsMiddle = 50;\n  double drumsTreble = 50;\n\n  int routingMode = 1;\n  int recLevel = 50;\n  int playbackLevel = 50;\n  int usbDryWet = 50;\n\n  //Bluetooth and mic\n  EQTenBandBT bluetoothEQ = EQTenBandBT();\n  int bluetoothGroup = 0;\n  bool bluetoothEQMute = false;\n  bool bluetoothInvertChannel = false;\n\n  bool micMute = false;\n  int micVolume = 50;\n  bool micNoiseGate = false;\n  int micNGSensitivity = 50;\n  int micNGDecay = 50;\n\n  LooperData looperData = LooperData();\n\n  TunerData tunerData = TunerData();\n}\n\nclass NuxMightyPlugPro extends NuxReorderableDevice<PlugProPreset>\n    implements Tuner, ProUsbSettings, DrumsTone {\n  @override\n  int get productVID => 48;\n  late final PlugProCommunication _communication =\n      PlugProCommunication(this, config);\n\n  @override\n  DeviceCommunication get communication => _communication;\n\n  final NuxPlugProConfiguration _config = NuxPlugProConfiguration();\n\n  @override\n  NuxPlugProConfiguration get config => _config;\n\n  PlugProVersion version = PlugProVersion.PlugPro1;\n\n  String versionDate = \"\";\n  bool version2024July = true;\n\n  @override\n  String get productName => \"NUX Mighty Plug Pro\";\n  @override\n  String get productNameShort => \"Mighty Plug Pro\";\n  @override\n  String get productStringId => \"mighty_plug_pro\";\n  @override\n  String get presetClass => \"mighty_plug_pro\";\n  @override\n  String get productNameForQR => \"Mighty Plug Pro/Space\";\n  @override\n  int get productVersion => version.index;\n  @override\n  String get productIconLabel => \"MP-3|-|SPACE\";\n  @override\n  List<String> get productBLENames => [\"MIGHTY PLUG PRO\"];\n\n  @override\n  int get channelsCount => 7;\n  @override\n  int get effectsChainLength => 9;\n  int get groupsCount => 1;\n\n  @override\n  NuxFXID get ampFXID => PlugProFXID.amp;\n\n  @override\n  NuxFXID get cabFXID => PlugProFXID.cab;\n\n  @override\n  bool get longChannelNames => false;\n  @override\n  bool get fakeMasterVolume => false;\n  @override\n  bool get activeChannelRetrieval => true;\n  @override\n  bool get cabinetSupport => true;\n  @override\n  bool get hackableIRs => false;\n\n  @override\n  bool get presetSaveSupport => true;\n  @override\n  bool get batterySupport => false;\n  @override\n  bool get nativeActiveChannelsSupport => true;\n  @override\n  int get channelChangeCC => -1;\n  @override\n  ValueFormatter? get decibelFormatter => ValueFormatters.decibelMPPro;\n\n  @override\n  int get deviceQRId => 15;\n  @override\n  int get deviceQRVersion => 1;\n\n  @override\n  double get drumsBass => config.drumsBass;\n  @override\n  double get drumsMiddle => config.drumsMiddle;\n  @override\n  double get drumsTreble => config.drumsTreble;\n\n  @override\n  double get drumsMaxTempo => 300;\n\n  @override\n  List<ProcessorInfo> get processorList => ProcessorsList.plugProList;\n\n  final _tunerController = StreamController<TunerData>.broadcast();\n\n  int? _drumStylesCount;\n\n  NuxMightyPlugPro(NuxDeviceControl devControl) : super(devControl) {\n    for (int i = 0; i < PlugProChannel.values.length; i++) {\n      presets.add(PlugProPreset(\n          device: this, channel: i, channelName: (i + 1).toString()));\n    }\n\n    for (var preset in presets) {\n      (preset as PlugProPreset).setFirmwareVersion(version.index);\n      channelNames.add(\"Channel ${preset.channelName}\");\n    }\n  }\n\n  @override\n  Map<String, Map<dynamic, dynamic>> getDrumStyles() => version2024July\n      ? DrumStyles.drumCategoriesProV2\n      : DrumStyles.drumCategoriesPro;\n\n  @override\n  int getDrumStylesCount() {\n    if (_drumStylesCount == null) {\n      _drumStylesCount = 0;\n      for (var cat in getDrumStyles().values) {\n        _drumStylesCount = _drumStylesCount! + cat.length;\n      }\n    }\n    return _drumStylesCount!;\n  }\n\n  @override\n  void setFirmwareVersion(int ver) {\n    version = PlugProVersion.PlugPro1;\n\n    //set all presets with that firmware\n    for (var preset in presets) {\n      (preset as PlugProPreset).setFirmwareVersion(version.index);\n    }\n  }\n\n  @override\n  void setFirmwareVersionByIndex(int ver) {\n    if (ver > getAvailableVersions() - 1) ver = getAvailableVersions() - 1;\n    version = PlugProVersion.values[ver];\n\n    //set all presets with that firmware\n    for (var preset in presets) {\n      (preset as PlugProPreset).setFirmwareVersion(version.index);\n    }\n  }\n\n  void setVersionDate(String vDate) {\n    versionDate = vDate;\n    version2024July = versionDate.compareTo(\"20240101\") > 0;\n  }\n\n  @override\n  onDisconnect() {\n    versionDate = \"\";\n    super.onDisconnect();\n  }\n\n  @override\n  PlugProPreset getCustomPreset(int channel) {\n    var preset = PlugProPreset(device: this, channel: channel, channelName: \"\");\n    preset.setFirmwareVersion(productVersion);\n    return preset;\n  }\n\n  @override\n  void setUsbMode(int mode) {\n    config.routingMode = mode;\n    communication.setUsbAudioMode(mode);\n  }\n\n  @override\n  void setUsbRecordingVol(int vol) {\n    config.recLevel = vol;\n    communication.setUsbInputVolume(vol);\n  }\n\n  @override\n  void setUsbPlaybackVol(int vol) {\n    config.playbackLevel = vol;\n    communication.setUsbOutputVolume(vol);\n  }\n\n  @override\n  void setUsbDryWetVol(int vol) {\n    config.usbDryWet = vol;\n    _communication.setUsbDryWet(vol);\n  }\n\n  @override\n  Widget getSettingsWidget() {\n    return PlugProSettings(device: this, mightySpace: false);\n  }\n\n  @override\n  bool checkQRValid(int deviceId, int ver) {\n    return deviceId == deviceQRId && ver == 1;\n  }\n\n  @override\n  void setDrumsTone(double value, DrumsToneControl control, bool send) {\n    switch (control) {\n      case DrumsToneControl.bass:\n        config.drumsBass = value;\n        break;\n      case DrumsToneControl.middle:\n        config.drumsMiddle = value;\n        break;\n      case DrumsToneControl.treble:\n        config.drumsTreble = value;\n        break;\n    }\n    if (send) _communication.setDrumsTone(value, control);\n  }\n\n  @override\n  bool get tunerAvailable {\n    return versionDate.compareTo(\"20230101\") > 0;\n  }\n\n  @override\n  void tunerEnable(bool enable) {\n    _communication.enableTuner(enable);\n  }\n\n  @override\n  void tunerRequestSettings() {\n    _communication.requestTunerSettings();\n  }\n\n  @override\n  void tunerSetMode(TunerMode mode) {\n    config.tunerData.mode = mode;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerSetReferencePitch(int refPitch) {\n    config.tunerData.referencePitch = refPitch;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  void tunerMute(bool enable) {\n    config.tunerData.muted = enable;\n    _communication.tunerSetSettings();\n    notifyTunerListeners();\n  }\n\n  @override\n  Stream<TunerData> getTunerDataStream() {\n    return _tunerController.stream;\n  }\n\n  @override\n  void notifyTunerListeners() {\n    _tunerController.add(config.tunerData);\n  }\n\n  @override\n  int get tunerNoteCC => MidiCCValuesPro.TUNER_Note;\n\n  @override\n  int get tunerPitchCC => MidiCCValuesPro.TUNER_Cent;\n\n  @override\n  int get tunerStateCC => MidiCCValuesPro.TUNER_State;\n\n  @override\n  int get tunerStringCC => MidiCCValuesPro.TUNER_Number;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxMightySpace.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/plugProCommunication.dart';\n\nimport '../../UI/pages/device_specific_settings/PlugProSettings.dart';\nimport 'NuxMightyPlugPro.dart';\nimport 'effects/plug_pro/EQ.dart';\nimport 'features/looper.dart';\nimport 'features/tuner.dart';\n\nclass NuxMightySpaceConfiguration extends NuxPlugProConfiguration {\n  EQTenBandSpeaker speakerEQ = EQTenBandSpeaker();\n  int speakerEQGroup = 0;\n}\n\nclass NuxMightySpace extends NuxMightyPlugPro implements Tuner, Looper {\n  NuxMightySpace(super.devControl);\n\n  final NuxMightySpaceConfiguration _config = NuxMightySpaceConfiguration();\n\n  @override\n  NuxMightySpaceConfiguration get config => _config;\n\n  PlugProCommunication get _communication =>\n      communication as PlugProCommunication;\n\n  @override\n  String get productName => \"NUX Mighty Space\";\n  @override\n  String get productNameShort => \"Mighty Space\";\n  @override\n  String get productStringId => \"mighty_space\";\n  @override\n  int get productVersion => version.index;\n  @override\n  String get productIconLabel => \"MP-3|-|SPACE\";\n  @override\n  List<String> get productBLENames => [\"MIGHTY SPACE\", \"NUX NGA-30W\"];\n\n  @override\n  int get loopState => config.looperData.loopState;\n  @override\n  int get loopUndoState => config.looperData.loopUndoState;\n  @override\n  int get loopRecordMode => config.looperData.loopRecordMode;\n  @override\n  double get loopLevel => config.looperData.loopLevel;\n\n  bool get speakerAvailable => versionDate.compareTo(\"20230101\") > 0;\n\n  final looperController = StreamController<LooperData>.broadcast();\n\n  @override\n  Widget getSettingsWidget() {\n    return PlugProSettings(device: this, mightySpace: true);\n  }\n\n  @override\n  Stream<LooperData> getLooperDataStream() {\n    return looperController.stream;\n  }\n\n  void notifyLooperListeners() {\n    looperController.add(config.looperData);\n  }\n\n  @override\n  void looperClear() {\n    _communication.looperClear();\n  }\n\n  @override\n  void looperRecordPlay() {\n    _communication.looperRecord();\n  }\n\n  @override\n  void looperStop() {\n    _communication.looperStop();\n  }\n\n  @override\n  void looperUndoRedo() {\n    _communication.looperUndoRedo();\n  }\n\n  @override\n  void looperLevel(int vol) {\n    config.looperData.loopLevel = vol.toDouble();\n    _communication.looperVolume(vol);\n  }\n\n  @override\n  void looperNrAr(bool auto) {\n    config.looperData.loopRecordMode = auto ? 1 : 0;\n    _communication.looperNrAr(auto);\n  }\n\n  @override\n  void requestLooperSettings() {\n    _communication.requestLooperSettings();\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/NuxReorderableDevice.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\n\nimport 'NuxFXID.dart';\nimport 'effects/Processor.dart';\nimport 'presets/Preset.dart';\n\nabstract class NuxReorderableDevice<T extends Preset> extends NuxDevice {\n  NuxReorderableDevice(super.deviceControl);\n\n  NuxFXID get ampFXID;\n  NuxFXID get cabFXID;\n\n  @override\n  bool get reorderableFXChain => true;\n\n  @override\n  int get amplifierSlotIndex {\n    var preset = getPreset(selectedChannel);\n    for (int i = 0; i < processorList.length; i++) {\n      if (preset.getFXIDFromSlot(i) == ampFXID) {\n        return i;\n      }\n    }\n\n    return ampFXID.value;\n  }\n\n  @override\n  int get cabinetSlotIndex {\n    var preset = getPreset(selectedChannel);\n    for (int i = 0; i < processorList.length; i++) {\n      if (preset.getFXIDFromSlot(i) == cabFXID) {\n        return i;\n      }\n    }\n\n    return cabFXID.value;\n  }\n\n  @override\n  ProcessorInfo? getProcessorInfoByFXID(NuxFXID fxid) {\n    for (var proc in processorList) {\n      if (proc.nuxFXID == fxid) return proc;\n    }\n    return null;\n  }\n\n  @override\n  int? getSlotByEffectKeyName(String key) {\n    var pi = getProcessorInfoByKey(key);\n    if (pi != null) {\n      T p = getPreset(selectedChannel) as T;\n      var index = p.getSlotFromFXID(pi.nuxFXID);\n      if (index != null) return index;\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/communication/communication.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nimport '../NuxConstants.dart';\nimport '../NuxDevice.dart';\n\nabstract class DeviceCommunication {\n  @protected\n  NuxDevice device;\n  NuxDeviceConfiguration config;\n\n  DeviceCommunication(this.device, this.config);\n  List<int> createFirmwareMessage();\n\n  List<int> requestPresetByIndex(int index);\n\n  void requestBatteryStatus();\n\n  @protected\n  int get connectionSteps;\n\n  @protected\n  int currentConnectionStep = 0;\n\n  bool isConnectionReady() {\n    return connectionSteps == currentConnectionStep;\n  }\n\n  void performNextConnectionStep();\n\n  @protected\n  void connectionStepReady() {\n    if (isConnectionReady()) return;\n    currentConnectionStep++;\n    device.deviceControl.onConnectionStepReady();\n  }\n\n  void sendSlotEnabledState(int slot) {\n    if (!device.deviceControl.isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n    var swIndex = preset\n        .getEffectsForSlot(slot)[preset.getSelectedEffectForSlot(slot)]\n        .midiCCEnableValue;\n\n    //in midi boolean is 00 and 7f for false and true\n    int enabled = preset.slotEnabled(slot) ? 0x7f : 0x00;\n    var data = createCCMessage(swIndex, enabled);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void sendSlotEffect(int slot, int index) {\n    if (!device.deviceControl.isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n    var paramIndex = preset\n        .getEffectsForSlot(slot)[preset.getSelectedEffectForSlot(slot)]\n        .midiCCSelectionValue;\n    var data = createCCMessage(paramIndex, index);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void saveCurrentPreset(int index);\n\n  void sendActiveChannels(List<bool> channels) {}\n  void sendSlotOrder() {}\n  void sendReset();\n\n  void sendDrumsEnabled(bool enabled);\n  void sendDrumsStyle(int style);\n  void sendDrumsLevel(double volume);\n  void sendDrumsTempo(double tempo);\n\n  void setEcoMode(bool enable);\n  void setBTEq(int eq);\n  void setUsbAudioMode(int mode);\n  void setUsbInputVolume(int vol);\n  void setUsbOutputVolume(int vol);\n\n  void onDataReceive(List<int> data);\n\n  void onDisconnect() {\n    currentConnectionStep = 0;\n  }\n\n  List<int> setChannel(int channel);\n\n  @protected\n  List<int> createCCMessage(int controlNumber, int value) {\n    var msg = List<int>.filled(5, 0);\n    msg[0] = 0x80;\n    msg[1] = 0x80;\n    msg[2] = MidiMessageValues.controlChange;\n    msg[3] = controlNumber;\n    msg[4] = value;\n    return msg;\n  }\n\n  List<int> createPCMessage(int programNumber) {\n    var msg = List<int>.filled(4, 0);\n    msg[0] = 0x80;\n    msg[1] = 0x80;\n    msg[2] = MidiMessageValues.programChange;\n    msg[3] = programNumber;\n    return msg;\n  }\n\n  List<int> createSysExMessage(int deviceMessageId, var data,\n      {int sysExMsgId = CherubSysExMessageID.cSysExDeviceSpecMsgID}) {\n    List<int> msg = [];\n\n    //create header\n    msg.addAll([\n      0x80,\n      0x80,\n      MidiMessageValues.sysExStart,\n      0,\n      device.vendorID & 255,\n      (device.vendorID >> 8) & 255,\n      device.productVID & 255,\n      (device.productVID >> 8) & 255,\n      (7 & sysExMsgId) << 4,\n      deviceMessageId\n    ]);\n\n    //add payload\n    if (data is int) {\n      msg.add(data);\n    } else {\n      msg.addAll(data);\n    }\n\n    //add termination symbol\n    msg.addAll([0x80, MidiMessageValues.sysExEnd]);\n\n    return msg;\n  }\n\n  //version for Mighty Plug Pro\n  List<int> createSysExMessagePro(\n      int privacy, int syxMsgType, int syxDir, List<int> data) {\n    List<int> msg = [];\n    //create header\n    msg.addAll([\n      0x80,\n      0x80,\n      MidiMessageValues.sysExStart,\n      0x43,\n      0x58,\n      privacy,\n      syxMsgType,\n      syxDir,\n    ]);\n\n    msg.addAll(data);\n    msg.addAll([0x80, MidiMessageValues.sysExEnd]);\n\n    return msg;\n  }\n\n  @protected\n  int percentageTo7Bit(double val) {\n    return (val / 100 * 127).floor();\n  }\n\n  void fillTestData() {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/communication/liteCommunication.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/NuxDevice.dart';\n\nimport '../NuxConstants.dart';\nimport 'communication.dart';\n\nclass LiteCommunication extends DeviceCommunication {\n  LiteCommunication(NuxDevice device, NuxDeviceConfiguration config)\n      : super(device, config);\n\n  @override\n  int get connectionSteps => 1;\n\n  int _readyPresetsCount = 0;\n\n  @override\n  void performNextConnectionStep() {\n    switch (currentConnectionStep) {\n      case 0:\n        _readyPresetsCount = 0;\n        //device.deviceControl.sendBLEData(requestPresetByIndex(0));\n        requestAllPresets();\n        break;\n    }\n    connectionStepReady();\n  }\n\n  void requestAllPresets() async {\n    for (int i = 0; i < device.channelsCount; i++) {\n      device.deviceControl.sendBLEData(requestPresetByIndex(i));\n      await Future.delayed(const Duration(milliseconds: 80));\n    }\n  }\n\n  @override\n  List<int> createFirmwareMessage() {\n    return [];\n  }\n\n  @override\n  List<int> requestPresetByIndex(int index) {\n    return createSysExMessage(DeviceMessageID.devReqPresetMsgID, index);\n  }\n\n  @override\n  List<int> setChannel(int channel) {\n    return createCCMessage(device.channelChangeCC, channel);\n  }\n\n  @override\n  void requestBatteryStatus() {\n    if (!device.batterySupport) return;\n    var data = createSysExMessage(DeviceMessageID.devSysCtrlMsgID,\n        [SysCtrlState.syscmd_dsprun_battery, 0, 0, 0, 0]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendReset() {\n    var data = createCCMessage(MidiCCValues.bCC_CtrlCmd, 0x7f);\n    device.deviceControl.sendBLEData(data);\n\n    _readyPresetsCount = 0;\n  }\n\n  @override\n  void sendDrumsEnabled(bool enabled) {\n    if (!device.deviceControl.isConnected) return;\n    var data =\n        createCCMessage(MidiCCValues.bCC_drumOnOff_No, enabled ? 0x7f : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsStyle(int style) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValues.bCC_drumType_No, style);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsLevel(double volume) {\n    if (!device.deviceControl.isConnected) return;\n    int val = percentageTo7Bit(volume);\n    var data = createCCMessage(MidiCCValues.bCC_drumLevel_No, val);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsTempo(double tempo) {\n    if (!device.deviceControl.isConnected) return;\n\n    int tempoNux = (((tempo - 40) / 200) * 16384).floor();\n    //these must be sent as 2 7bit values\n    int tempoL = tempoNux & 0x7f;\n    int tempoH = (tempoNux >> 7);\n\n    //no idea what the first 2 messages are for\n    var data = createCCMessage(MidiCCValues.bCC_drumTempo1, 0x06);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempo2, 0x26);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempoH, tempoH);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempoL, tempoL);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setEcoMode(bool enable) {}\n  @override\n  void setBTEq(int eq) {}\n  @override\n  void setUsbAudioMode(int mode) {}\n  @override\n  void setUsbInputVolume(int vol) {}\n  @override\n  void setUsbOutputVolume(int vol) {}\n  @override\n  void saveCurrentPreset(int index) {\n    var data = createCCMessage(MidiCCValues.bCC_CtrlCmd, 0x7e);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void _handlePresetDataPiece(List<int> data) {\n    var total = (data[3] & 0xf0) >> 4;\n    var current = data[3] & 0x0f;\n\n    print('preset ${data[2] + 1}, piece ${current + 1} of $total');\n    print(data);\n\n    var preset = device.getPreset(data[2]);\n    if (current == 0) preset.resetNuxData();\n\n    preset.addNuxPayloadPiece(data.sublist(4, data.length - 2), current, total);\n\n    if (preset.payloadPiecesReady()) {\n      preset.setupPresetFromNuxData();\n      if (!device.nuxPresetsReceived) {\n        _readyPresetsCount++;\n\n        if (_readyPresetsCount == device.channelsCount) {\n          device.onPresetsReady();\n          device.deviceControl.forceNotifyListeners();\n          //connectionStepReady();\n        } else {\n          //device.deviceControl.sendBLEData(requestPresetByIndex(data[2] + 1));\n        }\n      } else {\n        device.deviceControl.forceNotifyListeners();\n      }\n    }\n  }\n\n  @override\n  void onDataReceive(List<int> data) {\n    if (data.length < 3) return;\n\n    switch (data[2] & 0xf0) {\n      case MidiMessageValues.sysExStart:\n        switch (data[3]) {\n          case DeviceMessageID.devGetPresetMsgID:\n            _handlePresetDataPiece(data.sublist(2));\n            return;\n        }\n        break;\n    }\n\n    device.onDataReceived(data.sublist(2));\n  }\n\n  @override\n  void onDisconnect() {\n    super.onDisconnect();\n    _readyPresetsCount = 0;\n  }\n\n  @override\n  void fillTestData() {\n    //Data for Mighty 20/40 BT\n    _handlePresetDataPiece(\n        [240, 7, 0, 48, 0, 0, 0, 50, 0, 20, 41, 40, 30, 55, 0, 2, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 0, 49, 52, 24, 2, 0, 0, 50, 1, 12, 1, 0, 30, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 0, 50, 20, 1, 3, 116, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 1, 48, 0, 0, 0, 50, 1, 70, 23, 30, 30, 20, 0, 1, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 1, 49, 78, 41, 100, 0, 0, 50, 39, 19, 1, 0, 28, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 1, 50, 35, 1, 3, 116, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 2, 48, 1, 70, 0, 50, 2, 80, 20, 50, 50, 50, 0, 2, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 2, 49, 55, 39, 100, 0, 0, 50, 52, 19, 1, 0, 20, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 2, 50, 35, 1, 3, 116, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 3, 48, 0, 45, 0, 50, 3, 100, 21, 50, 50, 35, 0, 1, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 3, 49, 50, 50, 100, 0, 2, 50, 50, 40, 1, 0, 40, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 3, 50, 25, 1, 5, 71, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 4, 48, 0, 0, 0, 50, 4, 50, 50, 40, 90, 0, 1, 1, 128, 247]);\n    _handlePresetDataPiece([\n      240,\n      7,\n      4,\n      49,\n      50,\n      100,\n      100,\n      1,\n      1,\n      50,\n      30,\n      20,\n      0,\n      0,\n      11,\n      50,\n      128,\n      247\n    ]);\n    _handlePresetDataPiece(\n        [240, 7, 4, 50, 26, 1, 3, 119, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 5, 48, 0, 0, 0, 50, 5, 80, 12, 30, 100, 15, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 5, 49, 27, 50, 100, 0, 1, 50, 35, 20, 1, 0, 15, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 5, 50, 25, 1, 3, 119, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 6, 48, 1, 70, 0, 50, 6, 80, 25, 40, 50, 50, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 6, 49, 2, 27, 100, 0, 0, 50, 50, 24, 0, 0, 11, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 6, 50, 70, 1, 3, 116, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 7, 48, 0, 49, 0, 50, 7, 100, 17, 50, 50, 50, 0, 0, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 7, 49, 2, 49, 100, 1, 0, 50, 60, 34, 1, 0, 60, 50, 128, 247]);\n    _handlePresetDataPiece(\n        [240, 7, 7, 50, 20, 1, 3, 119, 0, 0, 0, 0, 0, 0, 0, 0, 128, 247]);\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/communication/liteMk2Communication.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/communication/plugProCommunication.dart';\nimport '../NuxDevice.dart';\n\nclass LiteMk2Communication extends PlugProCommunication {\n  LiteMk2Communication(NuxDevice device, NuxDeviceConfiguration config)\n      : super(device, config);\n\n  @override\n  get connectionSteps => 3;\n\n  @override\n  void performNextConnectionStep() {\n    switch (currentConnectionStep) {\n      case 0: //presets\n        readyPresetsCount = 0;\n        readyIRsCount = 0;\n        device.deviceControl.sendBLEData(requestPresetByIndex(0));\n        break;\n      case 1:\n        device.deviceControl.sendBLEData(requestCurrentChannel());\n        break;\n      case 2:\n        device.deviceControl\n            .sendBLEData(requestIRName(PlugProCommunication.customIRStart));\n        break;\n      /*case 3:\n        device.deviceControl.sendBLEData(_requestSystemSettings());\n        break;\n      case 4:\n        device.deviceControl.sendBLEData(_requestDrumData());\n        break;\n      case 5:\n        device.deviceControl.sendBLEData(_requestMicSettings());\n        break;*/\n    }\n  }\n\n  @override\n  List<int> createFirmwareMessage() {\n    return [];\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/communication/plugAirCommunication.dart",
    "content": "import '../NuxMightyPlugAir.dart';\nimport '../../../platform/simpleSharedPrefs.dart';\nimport '../NuxDevice.dart';\nimport '../NuxConstants.dart';\nimport 'communication.dart';\n\nclass PlugAirCommunication extends DeviceCommunication {\n  PlugAirCommunication(NuxDevice device, NuxDeviceConfiguration config)\n      : super(device, config);\n\n  @override\n  int get connectionSteps => 3;\n\n  int _readyPresetsCount = 0;\n\n  @override\n  NuxMightyPlugConfiguration get config =>\n      super.config as NuxMightyPlugConfiguration;\n\n  @override\n  List<int> createFirmwareMessage() {\n    List<int> msg = [];\n\n    //create header\n    msg.addAll([\n      0x80,\n      0x80,\n      MidiMessageValues.sysExStart,\n      0,\n      device.vendorID & 255,\n      (device.vendorID >> 8) & 255,\n      device.productVID & 255,\n      (device.productVID >> 8) & 255,\n      0\n    ]);\n\n    //add termination symbol\n    msg.add(0x80);\n    msg.add(MidiMessageValues.sysExEnd);\n\n    return msg;\n  }\n\n  @override\n  void performNextConnectionStep() {\n    switch (currentConnectionStep) {\n      case 0:\n        _readyPresetsCount = 0;\n        device.deviceControl.sendBLEData(requestPresetByIndex(0));\n        break;\n      case 1: //eco mode and other\n        var message = createSysExMessage(DeviceMessageID.devReqManuMsgID, [0]);\n        device.deviceControl.sendBLEData(message);\n        break;\n      case 2: //usb settings\n        var message = createSysExMessage(DeviceMessageID.devSysCtrlMsgID,\n            [SysCtrlState.syscmd_usbaudio, 0, 0, 0, 0]);\n        device.deviceControl.sendBLEData(message);\n        break;\n    }\n  }\n\n  @override\n  void saveCurrentPreset(int index) {\n    var data = createCCMessage(MidiCCValues.bCC_CtrlCmd, 0x7e);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  List<int> requestPresetByIndex(int index) {\n    return createSysExMessage(DeviceMessageID.devReqPresetMsgID, index);\n  }\n\n  @override\n  void requestBatteryStatus() {\n    if (!device.batterySupport) return;\n    var data = createSysExMessage(DeviceMessageID.devSysCtrlMsgID,\n        [SysCtrlState.syscmd_dsprun_battery, 0, 0, 0, 0]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendReset() {\n    var data = createCCMessage(MidiCCValues.bCC_CtrlCmd, 0x7f);\n    device.deviceControl.sendBLEData(data);\n\n    _readyPresetsCount = 0;\n  }\n\n  @override\n  List<int> setChannel(int channel) {\n    return createCCMessage(device.channelChangeCC, channel);\n  }\n\n  //*************/\n  //Drums section\n  //*************/\n  @override\n  void sendDrumsEnabled(bool enabled) {\n    if (!device.deviceControl.isConnected) return;\n    var data =\n        createCCMessage(MidiCCValues.bCC_drumOnOff_No, enabled ? 0x7f : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsStyle(int style) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValues.bCC_drumType_No, style);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsLevel(double volume) {\n    if (!device.deviceControl.isConnected) return;\n    int val = percentageTo7Bit(volume);\n    var data = createCCMessage(MidiCCValues.bCC_drumLevel_No, val);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsTempo(double tempo) {\n    if (!device.deviceControl.isConnected) return;\n\n    int tempoNux = (((tempo - 40) / 200) * 16384).floor();\n    //these must be sent as 2 7bit values\n    int tempoL = tempoNux & 0x7f;\n    int tempoH = (tempoNux >> 7);\n\n    //no idea what the first 2 messages are for\n    var data = createCCMessage(MidiCCValues.bCC_drumTempo1, 0x06);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempo2, 0x26);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempoH, tempoH);\n    device.deviceControl.sendBLEData(data);\n    data = createCCMessage(MidiCCValues.bCC_drumTempoL, tempoL);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  //***************/\n  //Settings section\n  //***************/\n  @override\n  void setEcoMode(bool enable) {\n    var data = createSysExMessage(DeviceMessageID.devSysCtrlMsgID,\n        [SysCtrlState.syscmd_eco_pro, enable ? 1 : 0, 0, 0, 0]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setBTEq(int eq) {\n    var data = createSysExMessage(\n        DeviceMessageID.devSysCtrlMsgID, [SysCtrlState.syscmd_bt, 1, eq, 0, 0]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbAudioMode(int mode) {\n    var data = createCCMessage(MidiCCValues.bCC_VolumePedalMin, mode);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbInputVolume(int vol) {\n    var data = createCCMessage(\n        MidiCCValues.bCC_VolumePedal, percentageTo7Bit(vol.toDouble()));\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbOutputVolume(int vol) {\n    var data = createCCMessage(\n        MidiCCValues.bCC_VolumePrePost, percentageTo7Bit(vol.toDouble()));\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void _handlePresetDataPiece(List<int> data) {\n    var total = (data[3] & 0xf0) >> 4;\n    var current = data[3] & 0x0f;\n\n    var preset = device.getPreset(data[2]);\n    if (current == 0) preset.resetNuxData();\n\n    preset.addNuxPayloadPiece(data.sublist(4, 16), current, total);\n\n    if (preset.payloadPiecesReady()) {\n      preset.setupPresetFromNuxData();\n      if (!device.nuxPresetsReceived) {\n        _readyPresetsCount++;\n\n        if (_readyPresetsCount == device.channelsCount) {\n          device.onPresetsReady();\n          connectionStepReady();\n        } else {\n          device.deviceControl.sendBLEData(requestPresetByIndex(data[2] + 1));\n        }\n      }\n    }\n  }\n\n  bool _handleFirmwareData(List<int> data) {\n    if (data[8] == 16 && data.length == 12) {\n      //firmware version is in the 9th bit\n      device.setFirmwareVersion(data[9]);\n      //save device version since we know it already\n      SharedPrefs().setValue(SettingsKeys.deviceVersion, device.productVersion);\n\n      device.deviceControl.onFirmwareVersionReady();\n      return true;\n    }\n    return false;\n  }\n\n  void _handleBTEcoMode(List<int> data) {\n    //this has lots of unknown values - maybe bpm settings\n    //eco mode is 12\n    if (data[data.length - 1] == MidiMessageValues.sysExEnd) {\n      //current preset is located here\n      device.setSelectedChannel(data[4],\n          notifyBT: false, notifyUI: false, sendFullPreset: false);\n      config.btEq = data[10];\n      config.ecoMode = data[12] != 0;\n      connectionStepReady();\n    }\n  }\n\n  void _handleUSBConfig(List<int> data) {\n    config.usbMode = data[9];\n    config.inputVol = data[10];\n    config.outputVol = data[11];\n    connectionStepReady();\n  }\n\n  @override\n  void onDataReceive(List<int> data) {\n    if (data.length > 3) {\n      switch (data[2] & 0xf0) {\n        case MidiMessageValues.sysExStart:\n          switch (data[3]) {\n            case DeviceMessageID.devReqFwID:\n              if (data[9] == DeviceMessageID.devSysCtrlMsgID &&\n                  data[10] == SysCtrlState.syscmd_usbaudio) {\n                _handleUSBConfig(data.sublist(2));\n              } else if (_handleFirmwareData(data)) {\n                return;\n              }\n              break;\n            case DeviceMessageID.devGetManuMsgID:\n              _handleBTEcoMode(data.sublist(2));\n              break;\n            case DeviceMessageID.devGetPresetMsgID:\n              _handlePresetDataPiece(data.sublist(2));\n              return;\n          }\n          break;\n      }\n      device.onDataReceived(data.sublist(2));\n    }\n  }\n\n  @override\n  void onDisconnect() {\n    super.onDisconnect();\n    _readyPresetsCount = 0;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/communication/plugProCommunication.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/foundation.dart';\n\nimport '../NuxDevice.dart';\nimport '../NuxFXID.dart';\nimport '../NuxMightySpace.dart';\nimport '../effects/plug_pro/Cabinet.dart';\nimport '../features/drumsTone.dart';\nimport '../features/tuner.dart';\nimport '../presets/PlugProPreset.dart';\n\nimport '../../../platform/simpleSharedPrefs.dart';\nimport '../NuxConstants.dart';\nimport '../NuxMightyPlugPro.dart';\nimport 'communication.dart';\n\nclass PlugProCommunication extends DeviceCommunication {\n  PlugProCommunication(NuxDevice device, NuxDeviceConfiguration config)\n      : super(device, config);\n\n  StreamController<List<int>>? _bluetoothEQReceived;\n  Stream<List<int>>? get bluetoothEQStream => _bluetoothEQReceived?.stream;\n\n  StreamController<List<int>>? _speakerEQReceived;\n  Stream<List<int>>? get speakerEQStream => _speakerEQReceived?.stream;\n\n  @override\n  get connectionSteps => 6;\n\n  @protected\n  int readyPresetsCount = 0;\n  @protected\n  int readyIRsCount = 0;\n\n  //use this, because when the app sends the order, the amp answers sends it back,\n  //however, it must be ignored in this case, but not in other cases.\n  //This DateTime is used for that\n  DateTime _lastEffectReorder = DateTime.now();\n\n  @override\n  NuxPlugProConfiguration get config => super.config as NuxPlugProConfiguration;\n\n  static const int customIRStart = 34;\n  static const int customIRsCount = 20;\n  static const int irLength = customIRStart + customIRsCount;\n\n  @override\n  List<int> createFirmwareMessage() {\n    List<int> msg = [];\n\n    //create header\n    msg.addAll([\n      0x80,\n      0x80,\n      MidiMessageValues.sysExStart,\n      0x43,\n      0x58,\n      SysexPrivacy.kSYSEX_PUBLIC.toInt(),\n      0x80,\n      MidiMessageValues.sysExEnd\n    ]);\n\n    return msg;\n  }\n\n  @override\n  void performNextConnectionStep() {\n    switch (currentConnectionStep) {\n      case 0: //presets\n        readyPresetsCount = 0;\n        readyIRsCount = 0;\n        device.deviceControl.sendBLEData(requestPresetByIndex(0));\n        break;\n      case 1:\n        device.deviceControl.sendBLEData(requestCurrentChannel());\n        break;\n      case 2:\n        device.deviceControl.sendBLEData(requestIRName(customIRStart));\n        break;\n      case 3:\n        device.deviceControl.sendBLEData(_requestSystemSettings());\n        break;\n      case 4:\n        device.deviceControl.sendBLEData(_requestDrumData());\n        break;\n      case 5:\n        device.deviceControl.sendBLEData(_requestMicSettings());\n        break;\n    }\n  }\n\n  @override\n  void saveCurrentPreset(int index) {\n    var data = createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SPEC_CMD,\n        SyxDir.kSYXDIR_SET,\n        [SysCtrlState.syscmd_save, index]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  List<int> requestPresetByIndex(int index) {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_PRESET, SyxDir.kSYXDIR_REQ, [index]);\n  }\n\n  @protected\n  List<int> requestCurrentChannel() {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_CURPRESET, SyxDir.kSYXDIR_REQ, []);\n  }\n\n  List<int> _requestSystemSettings() {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SYSTEMSET, SyxDir.kSYXDIR_REQ, []);\n  }\n\n  @protected\n  List<int> requestIRName(int index) {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_CRCNAME, SyxDir.kSYXDIR_REQ, [index]);\n  }\n\n  List<int> _requestEffectsOrder() {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_MODULELINK, SyxDir.kSYXDIR_REQ, []);\n  }\n\n  List<int> _requestDrumData() {\n    return createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE, SyxMsg.kSYX_DRUM, SyxDir.kSYXDIR_REQ, []);\n  }\n\n  List<int> _requestMicSettings() {\n    return createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_CURSTATE, SyxDir.kSYXDIR_REQ, []);\n  }\n\n  void requestBTEQData(int index) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_BTSET, SyxDir.kSYXDIR_REQ, [index]);\n    device.deviceControl.sendBLEData(data);\n    _bluetoothEQReceived = StreamController<List<int>>();\n  }\n\n  void requestSpeakerEQData(int index) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SPKSET, SyxDir.kSYXDIR_GET, [index]);\n    device.deviceControl.sendBLEData(data);\n    _speakerEQReceived = StreamController<List<int>>();\n  }\n\n  @override\n  void requestBatteryStatus() {\n    if (!device.batterySupport) return;\n    //TODO: Wrong!!!\n\n    // var data = createSysExMessagePro(\n    //     SysexPrivacy.kSYSEX_PRIVATE,\n    //     SyxMsg.kSYX_SPEC_CMD,\n    //     SyxDir.kSYXDIR_REQ,\n    //     [SysCtrlState.syscmd_dsprun_battery]);\n\n    var data = createSysExMessage(DeviceMessageID.devSysCtrlMsgID,\n        [SysCtrlState.syscmd_dsprun_battery, 0, 0, 0, 0]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendReset() {\n    var data = createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SPEC_CMD,\n        SyxDir.kSYXDIR_SET,\n        [SysCtrlState.syscmd_resetall]);\n\n    readyPresetsCount = 0;\n    readyIRsCount = 0;\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void _sendSlotData(int slot, bool enabled, int effectIndex) {\n    var preset = device.getPreset(device.selectedChannel);\n    var swIndex = preset\n        .getEffectsForSlot(slot)[preset.getSelectedEffectForSlot(slot)]\n        .midiCCEnableValue;\n    preset.getSelectedEffectForSlot(slot);\n\n    int midiVal = effectIndex | (enabled ? 0x00 : 0x40);\n\n    var data = createCCMessage(swIndex, midiVal);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendSlotEnabledState(int slot) {\n    if (!device.deviceControl.isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n\n    var effect =\n        preset.getEffectsForSlot(slot)[preset.getSelectedEffectForSlot(slot)];\n    var index = effect.nuxIndex;\n\n    _sendSlotData(slot, preset.slotEnabled(slot), index);\n  }\n\n  void setSlotEffect(int slot, int index) {\n    if (!device.deviceControl.isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n    _sendSlotData(slot, preset.slotEnabled(slot), index);\n  }\n\n  @override\n  void sendActiveChannels(List<bool> channels) {\n    if (!device.deviceControl.isConnected) return;\n    int channelsBitfield = 0;\n    for (int i = 0; i < channels.length; i++) {\n      channelsBitfield |= (channels[i] ? 1 : 0) << i;\n    }\n\n    var data = createCCMessage(MidiCCValuesPro.PRESETRANGE, channelsBitfield);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendSlotOrder() {\n    if (!device.deviceControl.isConnected) return;\n    var preset = device.getPreset(device.selectedChannel);\n    List<NuxFXID> order = (preset as PlugProPreset).processorAtSlot;\n\n    var nuxOrder = [order.length];\n    for (var i = 0; i < order.length; i++) {\n      var p = device.getProcessorInfoByFXID(order[i]);\n      if (p != null) nuxOrder.add(p.nuxFXID.toInt());\n    }\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_MODULELINK, SyxDir.kSYXDIR_SET, nuxOrder);\n    device.deviceControl.sendBLEData(data);\n    _lastEffectReorder = DateTime.now();\n  }\n\n  void sendChannelVolume(int value) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.MASTER, value);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  List<int> setChannel(int channel) {\n    return createPCMessage(channel);\n  }\n\n  @override\n  void sendDrumsEnabled(bool enabled) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.DRUMENABLE, enabled ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsStyle(int style) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.DRUMTYPE, style);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsLevel(double volume) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.DRUMLEVEL, volume.round());\n    device.deviceControl.sendBLEData(data);\n  }\n\n  setDrumsTone(double value, DrumsToneControl control) {\n    if (!device.deviceControl.isConnected) return;\n    int cc = 0;\n    switch (control) {\n      case DrumsToneControl.bass:\n        cc = MidiCCValuesPro.DRUM_BASS;\n        break;\n      case DrumsToneControl.middle:\n        cc = MidiCCValuesPro.DRUM_MIDDLE;\n        break;\n      case DrumsToneControl.treble:\n        cc = MidiCCValuesPro.DRUM_TREBLE;\n        break;\n    }\n    var data = createCCMessage(cc, value.round());\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void sendDrumsTempo(double tempo) {\n    if (!device.deviceControl.isConnected) return;\n\n    //int tempoNux = (((tempo - 40) / 200) * 16384).floor();\n    //these must be sent as 2 7bit values\n    int tempoL = tempo.round() & 0x7f;\n    int tempoH = (tempo.round() >> 7);\n\n    var data = createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE, SyxMsg.kSYX_DRUM, SyxDir.kSYXDIR_SET, [\n      config.drumsEnabled ? 1 : 0,\n      config.selectedDrumStyle,\n      config.drumsVolume.round(),\n      config.drumsBass.round(),\n      config.drumsMiddle.round(),\n      config.drumsTreble.round(),\n      tempoH,\n      tempoL\n    ]);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setEcoMode(bool enable) {}\n\n  //sets eq group\n  @override\n  void setBTEq(int eq) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.AUXEQENABLE, eq);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void saveBTEQGroup(int group) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SPEC_CMD,\n        SyxDir.kSYXDIR_SET,\n        [SysCtrlState.speccmd_auxeqsave, group]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setSpeakerEq(int eq) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.SPK_EQ_GROUP, eq);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void saveSpeakerEQGroup(int group) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(\n        SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_SPEC_CMD,\n        SyxDir.kSYXDIR_SET,\n        [SysCtrlState.speccmd_speakereqsave, group]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setBTInvert(bool invert) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.AUX_PHASE, invert ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setBTMute(bool mute) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.AUX_MUTE, mute ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setMicMute(bool mute) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.MICMUTE, mute ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setMicLevel(int level) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.MICVOLUME, level);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setMicNoiseGate(bool enable) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.NR_ENABLE, enable ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setMicNoiseGateSens(int level) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.NR_SENS, level);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setMicNoiseGateDecay(int level) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.NR_DECAY, level);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbAudioMode(int mode) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.USBROUNT_3, mode);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbInputVolume(int vol) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.USBROUNT_1, vol);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  @override\n  void setUsbOutputVolume(int vol) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.USBROUNT_2, vol);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void setUsbDryWet(int vol) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.USBROUNT_4, vol);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void enableTuner(bool enable) {\n    tunerSetSettings(tunerOn: enable);\n  }\n\n  void tunerSetSettings({bool tunerOn = true}) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_TUNER_SETTINGS, SyxDir.kSYXDIR_SET, [\n      tunerOn ? 1 : 0,\n      config.tunerData.mode.mode,\n      config.tunerData.referencePitch,\n      config.tunerData.muted ? 1 : 0,\n      0,\n      0,\n      0\n    ]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void requestTunerSettings() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_TUNER_SETTINGS, SyxDir.kSYXDIR_GET, [0, 0, 0, 0, 0, 0, 0]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperRecord() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOPSTATE, 1);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperStop() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOPSTATE, 2);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperClear() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOPSTATE, 4);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperUndoRedo() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOPSTATE, 8);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperVolume(int volume) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOPLEVEL, volume);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void looperNrAr(bool auto) {\n    if (!device.deviceControl.isConnected) return;\n    var data = createCCMessage(MidiCCValuesPro.LOOP_ARNR, auto ? 1 : 0);\n    device.deviceControl.sendBLEData(data);\n  }\n\n  void requestLooperSettings() {\n    if (!device.deviceControl.isConnected) return;\n    var data = createSysExMessagePro(SysexPrivacy.kSYSEX_PRIVATE,\n        SyxMsg.kSYX_LOOP, SyxDir.kSYXDIR_GET, [0, 0, 0, 0, 0, 0, 0, 0]);\n\n    device.deviceControl.sendBLEData(data);\n  }\n\n  List<List<int>> _splitPresetData(List<int> data) {\n    List<List<int>> presetData = [];\n    int pos = 0;\n\n    //sometimes MPPro sends several data pieces in one payload.\n    //Let's split it here\n    do {\n      pos = data.indexOf(SysexPrivacy.kSYSEX_PRIVATE);\n\n      if (pos > 0) {\n        var sublist = data.sublist(0, pos - 1);\n        presetData.add(sublist);\n        if (data.length >= pos + 1) data = data.sublist(pos + 1);\n      } else {\n        if (data.length > 2) presetData.add(data);\n      }\n    } while (pos > 0);\n\n    return presetData;\n  }\n\n  void _handlePresetDataPiece(List<int> data) {\n    List<List<int>> presetData = _splitPresetData(data);\n\n    for (List<int> data in presetData) {\n      //remove last 2 bytes if needed\n      if (data[data.length - 1] == MidiMessageValues.sysExEnd) {\n        data = data.sublist(0, data.length - 2);\n      }\n\n      var total = (data[3] & 0xf0) >> 4;\n      var current = data[3] & 0x0f;\n\n      debugPrint('preset ${data[2] + 1}, piece ${current + 1} of $total');\n\n      var preset = device.getPreset(data[2]);\n      if (current == 0) preset.resetNuxData();\n\n      preset.addNuxPayloadPiece(data.sublist(4), current, total);\n\n      if (preset.payloadPiecesReady()) {\n        preset.setupPresetFromNuxData();\n        if (!device.nuxPresetsReceived) {\n          readyPresetsCount++;\n\n          if (readyPresetsCount == device.channelsCount) {\n            device.onPresetsReady();\n            debugPrint(\"Presets connection step ready\");\n            connectionStepReady();\n          } else {\n            device.deviceControl.sendBLEData(requestPresetByIndex(data[2] + 1));\n          }\n        }\n      }\n    }\n  }\n\n  void _handleIRName(List<int> data) {\n    if (data.length > 8) {\n      int index = data[1];\n      bool hasIR = data[data.length - 3] != 0;\n      int stringEnd = 0;\n\n      //find name length\n      for (int i = 8; i < data.length - 1; i++) {\n        if (data[i] == 0 && data[i + 1] == 0) {\n          stringEnd = i;\n          break;\n        }\n      }\n      if (stringEnd < 8) stringEnd = data.length - 3;\n\n      if (hasIR) {\n        List<int> encodedName = data.sublist(8, stringEnd);\n        List<int> decodedName = [];\n        for (int i = 0; i < encodedName.length; i++) {\n          if (i % 3 == 0) {\n            decodedName.add((encodedName[i] & 0x01) << 6);\n          } else if (i % 3 == 1) {\n            decodedName.last |= encodedName[i] >> 1;\n          } else if (i % 3 == 2) {\n            decodedName.add(encodedName[i]);\n          }\n        }\n        var decoder = const AsciiDecoder();\n        String name = decoder.convert(decodedName);\n        debugPrint(\"IR $index, active: $hasIR, name: $name\");\n\n        for (var preset in device.presets) {\n          if (preset.cabinetList == null) continue;\n          if (index >= preset.cabinetList!.length) break;\n          var cab = preset.cabinetList![index];\n          if (cab is UserCab) {\n            cab.setName(name);\n          }\n        }\n      } else {\n        debugPrint(\"IR $index, active: $hasIR}\");\n      }\n    }\n    readyIRsCount++;\n\n    if (readyIRsCount == customIRsCount) {\n      debugPrint(\"IR names connection step ready\");\n      connectionStepReady();\n    } else {\n      device.deviceControl\n          .sendBLEData(requestIRName(customIRStart + readyIRsCount));\n    }\n  }\n\n  bool _handleEffectsOrderData(List<int> data) {\n    var dt = DateTime.now();\n    if (dt.difference(_lastEffectReorder).inMilliseconds < 3000) {\n      return true;\n    }\n\n    if (data[0] == SyxDir.kSYXDIR_REQ) {\n      var len = data[1];\n      var preset = device.getPreset(device.selectedChannel);\n\n      List<NuxFXID> order = (preset as PlugProPreset).processorAtSlot;\n      order.clear();\n      data.sublist(2, 2 + len).forEach((element) {\n        order.add(NuxFXID.fromInt(element));\n      });\n      device.deviceControl.forceNotifyListeners();\n      return true;\n    }\n    return false;\n  }\n\n  bool _handleFirmwareData(List<int> data) {\n    //check for firmware message\n    if (data[2] == MidiMessageValues.sysExStart &&\n        data[3] == 67 &&\n        data[5] == SysexPrivacy.kSYSEX_PUBLICREPLY.toInt()) {\n      //the actual version starts at byte 9 and is 8 byte string\n      //containing the date of the build\n      //for now it's not needed\n      device.setFirmwareVersion(0);\n\n      //get FW version date of MPPro\n      var versionArray = data.sublist(6, 14);\n      String asciiString = String.fromCharCodes(versionArray);\n      (device as NuxMightyPlugPro).setVersionDate(asciiString);\n\n      //save device version since we know it already\n      SharedPrefs().setValue(SettingsKeys.deviceVersion, device.productVersion);\n\n      device.deviceControl.onFirmwareVersionReady();\n      return true;\n    }\n    return false;\n  }\n\n  bool _handleDrumCCData(int control, int value) {\n    bool consumed = false;\n    switch (control) {\n      case MidiCCValuesPro.DRUMENABLE:\n        config.drumsEnabled = value != 0;\n        consumed = true;\n        break;\n      case MidiCCValuesPro.DRUMLEVEL:\n        config.drumsVolume = value.toDouble();\n        consumed = true;\n        break;\n      case MidiCCValuesPro.DRUMTYPE:\n        config.selectedDrumStyle = value;\n        consumed = true;\n        break;\n      case MidiCCValuesPro.DRUM_BASS:\n        config.drumsBass = value.toDouble();\n        consumed = true;\n        break;\n      case MidiCCValuesPro.DRUM_MIDDLE:\n        config.drumsMiddle = value.toDouble();\n        consumed = true;\n        break;\n      case MidiCCValuesPro.DRUM_TREBLE:\n        config.drumsTreble = value.toDouble();\n        consumed = true;\n        break;\n    }\n    if (consumed) {\n      device.deviceControl.forceNotifyListeners();\n      return true;\n    }\n    return false;\n  }\n\n  void _handleActiveChannelsData(int bitfield) {\n    for (int i = 0; i < config.activeChannels.length; i++) {\n      config.activeChannels[i] = ((bitfield >> i) & 1) != 0;\n    }\n    device.deviceControl.forceNotifyListeners();\n  }\n\n  void _handleVolumeData(int vol) {\n    (device.presets[device.selectedChannel] as PlugProPreset).setVolumeRaw(vol);\n    device.deviceControl.forceNotifyListeners();\n  }\n\n  void _handleLooperState(int state) {\n    config.looperData.loopState = state & 0x0f;\n    config.looperData.loopUndoState = (state >> 4) & 0x03;\n    config.looperData.loopHasAudio = (state >> 6) & 0x01 != 0;\n  }\n\n  void _handleLooperCC(int ccNumber, int value) {\n    switch (ccNumber) {\n      case MidiCCValuesPro.LOOPLEVEL:\n        config.looperData.loopLevel = value.toDouble();\n        break;\n      case MidiCCValuesPro.LOOPSTATE:\n        _handleLooperState(value);\n        break;\n      case MidiCCValuesPro.LOOP_ARNR:\n        config.looperData.loopRecordMode = value;\n        break;\n    }\n    (device as NuxMightySpace).notifyLooperListeners();\n  }\n\n  void _handleLooperSysEx(List<int> data) {\n    if (data[0] != 2) return;\n    config.looperData.loopLevel = data[1].toDouble();\n    _handleLooperState(data[2]);\n    config.looperData.loopRecordMode = data[3];\n    (device as NuxMightySpace).notifyLooperListeners();\n  }\n\n  void _handleTuner(int ccNumber, int value) {\n    var tuner = device as Tuner;\n\n    if (ccNumber == tuner.tunerStateCC) {\n      config.tunerData.enabled = value == 1;\n    } else if (ccNumber == tuner.tunerNoteCC) {\n      config.tunerData.note = value;\n    } else if (ccNumber == tuner.tunerPitchCC) {\n      config.tunerData.cents = value;\n    } else if (ccNumber == tuner.tunerStringCC) {\n      config.tunerData.stringNumber = value;\n    }\n    tuner.notifyTunerListeners();\n  }\n\n  void _handleTunerSysEx(List<int> data) {\n    if (data[0] != 2) return;\n    config.tunerData.mode = TunerMode.getByMode(data[2]) ?? TunerMode.chromatic;\n    config.tunerData.referencePitch = data[3];\n    config.tunerData.muted = data[4] == 1;\n    (device as Tuner).notifyTunerListeners();\n  }\n\n  //Info: in plugProDataObject.js in the beginning there are few const enums\n  // O, G, z, etc... they are the indexes of some SysEx data\n  //just reduce with 1\n  /*\n  const G = {\n  micmute: 0,\n  outmodeeq1: 1,\n  outmodeeq2: 2,\n  outmodeeq3: 3,\n  display1: 4,\n  display2: 5,\n  display3: 6,\n  expset1: 7,\n  expset2: 8,\n  expset3: 9,\n  expset4: 10,\n  preeq1: 11,\n  preeq2: 12,\n  preeq3: 13,\n  preeq4: 14,\n  usbrount1: 15,\n  usbrount2: 16,\n  usbrount3: 17,\n  usbrount4: 18,\n  presetrange: 19,\n  micvolume: 20,\n  midi_chan: 21,\n  length: 22,\n};\n*/\n  void _handleSystemSettings(List<int> data) {\n    config.micMute = data[1] > 0;\n    config.routingMode = data[18];\n    config.recLevel = data[16];\n    config.playbackLevel = data[17];\n    config.usbDryWet = data[19];\n    config.micVolume = data[21];\n    for (int i = 0; i < config.activeChannels.length; i++) {\n      config.activeChannels[i] = ((data[20] >> i) & 1) != 0;\n    }\n  }\n\n/*\nconst z = {\n  drum_command: 0,\n  drumtype: 1,\n  drum_vol: 2,\n  drumeqL: 3,\n  drumeqM: 4,\n  drumeqH: 5,\n  tmpoH: 6,\n  tmpoL: 7,\n  length: 8,\n};\n*/\n  void _handleDrumData(List<int> data) {\n    if (data[0] == SyxDir.kSYXDIR_REQ && data.length >= 8) {\n      config.drumsEnabled = data[1] != 0;\n      config.selectedDrumStyle = data[2];\n      config.drumsVolume = data[3].toDouble();\n      config.drumsBass = data[4].toDouble();\n      config.drumsMiddle = data[5].toDouble();\n      config.drumsTreble = data[6].toDouble();\n\n      config.drumsTempo = (data[8] + (data[7] << 7)).toDouble();\n      if (!isConnectionReady()) {\n        debugPrint(\"Drums connection step ready\");\n        connectionStepReady();\n      } else {\n        device.deviceControl.forceNotifyListeners();\n      }\n    }\n  }\n\n  void _handleMicSettings(List<int> data) {\n    if (data[0] == SyxDir.kSYXDIR_REQ) {\n      config.bluetoothGroup = data[2];\n      config.micNoiseGate = data[3] > 0;\n      config.micNGSensitivity = data[4];\n      config.micNGDecay = data[5];\n\n      if (config is NuxMightySpaceConfiguration) {\n        (config as NuxMightySpaceConfiguration).speakerEQGroup = data[6];\n      }\n\n      debugPrint(\"Mic step ready\");\n      connectionStepReady();\n    }\n  }\n\n  void _handleBTEqData(List<int> data) {\n    if (data[0] == SyxDir.kSYXDIR_REQ) {\n      _bluetoothEQReceived?.add(data.sublist(2));\n      _bluetoothEQReceived?.close();\n    }\n  }\n\n  void _handleSpeakerEqData(List<int> data) {\n    if (data[0] == SyxDir.kSYXDIR_REQ) {\n      _speakerEQReceived?.add(data.sublist(2));\n      _speakerEQReceived?.close();\n      _speakerEQReceived = null;\n    }\n  }\n\n//Some discovered stuff\n//kSYX_SYSTEMSET - for ACTIVE channels, mic stuff and USB stuff\n\n  @override\n  void onDataReceive(List<int> data) {\n    if (data.length > 2) {\n      switch (data[2]) {\n        case MidiMessageValues.controlChange:\n          switch (data[3]) {\n            case MidiCCValuesPro.PRESETRANGE:\n              _handleActiveChannelsData(data[4]);\n              return;\n            case MidiCCValuesPro.MASTER:\n              _handleVolumeData(data[4]);\n              break;\n            case MidiCCValuesPro.TUNER_State:\n            case MidiCCValuesPro.TUNER_Note:\n            case MidiCCValuesPro.TUNER_Number:\n            case MidiCCValuesPro.TUNER_Cent:\n            case MidiCCValuesPro.TunerLiteMK2_Cent:\n            case MidiCCValuesPro.TunerLiteMK2_Note:\n            case MidiCCValuesPro.TunerLiteMK2_Number:\n            case MidiCCValuesPro.TunerLiteMK2_State:\n              _handleTuner(data[3], data[4]);\n              break;\n            case MidiCCValuesPro.LOOPLEVEL:\n            case MidiCCValuesPro.LOOPSTATE:\n            case MidiCCValuesPro.LOOP_ARNR:\n              _handleLooperCC(data[3], data[4]);\n          }\n          bool consumed = false;\n          consumed = _handleDrumCCData(data[3], data[4]);\n          if (consumed) return;\n          break;\n        case MidiMessageValues.sysExStart:\n          switch (data[5]) {\n            case SysexPrivacy.kSYSEX_PUBLICREPLY:\n              if (_handleFirmwareData(data)) return;\n              break;\n            case SysexPrivacy.kSYSEX_PRIVATE:\n              switch (data[6]) {\n                case SyxMsg.kSYX_PRESET:\n                  _handlePresetDataPiece(data.sublist(6));\n                  return;\n                case SyxMsg.kSYX_CRCNAME:\n                  _handleIRName(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_SYSTEMSET:\n                  _handleSystemSettings(data.sublist(7));\n                  connectionStepReady();\n                  return;\n                case SyxMsg.kSYX_CURPRESET:\n\n                  //current preset is sent 3 times, check it's the 3rd time\n                  //to proceed with connection\n                  if (data[9] == 0x32) {\n                    device.setSelectedChannel(data[8],\n                        notifyBT: false, notifyUI: true, sendFullPreset: false);\n                    debugPrint(\"Current preset connection step ready\");\n                    connectionStepReady();\n                  }\n                  return;\n                case SyxMsg.kSYX_MODULELINK:\n                  if (_handleEffectsOrderData(data.sublist(7))) return;\n                  break;\n                case SyxMsg.kSYX_DRUM:\n                  _handleDrumData(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_CURSTATE:\n                  _handleMicSettings(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_BTSET:\n                  _handleBTEqData(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_SPKSET:\n                  _handleSpeakerEqData(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_TUNER_SETTINGS:\n                  _handleTunerSysEx(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_LOOP:\n                  _handleLooperSysEx(data.sublist(7));\n                  return;\n                case SyxMsg.kSYX_SENDCMD:\n                  if (data[7] == SyxDir.kSYXDIR_REQ) {\n                    switch (data[8]) {\n                      case SyxMsg.kSYX_MODULELINK:\n                        device.deviceControl\n                            .sendBLEData(_requestEffectsOrder());\n                        break;\n                      case SyxMsg.kSYX_DRUM:\n                        //request drums data\n                        device.deviceControl.sendBLEData(_requestDrumData());\n                        break;\n                    }\n                  }\n                  return;\n              }\n              break;\n          }\n          break;\n      }\n      device.onDataReceived(data.sublist(2));\n    }\n  }\n\n  @override\n  void onDisconnect() {\n    super.onDisconnect();\n    readyPresetsCount = 0;\n    readyIRsCount = 0;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/device_data/drumstyles.dart",
    "content": "class DrumStyles {\n  static const List<String> drumStyles8BT = [\n    \"Metronome\",\n    \"Pop\",\n    \"Metal\",\n    \"Blues\",\n    \"Country\",\n    \"Rock\",\n    \"Ballad Rock\",\n    \"Funk\",\n    \"R&B\",\n    \"Latin\"\n  ];\n\n  static const List<String> drumStyles2040BT = [\n    \"Metronome\",\n    \"Rock\",\n    \"60's\",\n    \"Bossanova\",\n    \"Pop 1\",\n    \"Pop 2\",\n    \"Pop 3\",\n    \"Blues 1\",\n    \"Blues 2\",\n    \"Jazz\",\n    \"Jam\",\n    \"R&B\",\n    \"Latin\",\n    \"Dance House\",\n    \"Dance House 1\",\n    \"Blues 3/4\",\n    \"Ballad 3/4\"\n  ];\n\n  static const List<String> drumStylesPlug = [\n    \"Metronome\",\n    \"Pop\",\n    \"Metal\",\n    \"Blues\",\n    \"Swing\",\n    \"Rock\",\n    \"Ballad Rock\",\n    \"Funk\",\n    \"R&B\",\n    \"Latin\",\n    \"Dance\"\n  ];\n\n  static const Map<String, int> rockStylesPro = {\n    'Standard': 0,\n    'Swing Rock': 1,\n    'Power Beat': 2,\n    'Smooth': 3,\n    'Mega Drive': 4,\n    'Hard Rock': 5,\n    'Boogie': 6\n  };\n\n  static const Map<String, int> countryStylesPro = {\n    'Walk Line': 7,\n    'Blue Grass': 8,\n    'Country': 9,\n    'Waltz': 10,\n    'Train': 11,\n    'Country Rock': 12,\n    'Slowly': 13\n  };\n\n  static const Map<String, int> bluesStylesPro = {\n    'Slow Blues': 14,\n    'Chicago': 15,\n    'R&B': 16,\n    'Blues Rock': 17,\n    'Road Train': 18,\n    'Shuffle': 19,\n  };\n\n  static const Map<String, int> metalStylesPro = {\n    '2X Bass': 20,\n    'Close Beat': 21,\n    'Heavy Bass': 22,\n    'Fast': 23,\n    'Holy Case': 24,\n    'Open Hat': 25,\n    'Epic': 26,\n  };\n\n  static const Map<String, int> funkStylesPro = {\n    'Bounce': 27,\n    'East Coast': 28,\n    'New Mann': 29,\n    'R&B Funk': 30,\n    '80s Funk': 31,\n    'Soul': 32,\n    'Uncle Jam': 33,\n  };\n\n  static const Map<String, int> jazzStylesPro = {\n    'Blues Jazz': 34,\n    'Classic 1': 35,\n    'Classic 2': 36,\n    'Easy Jazz': 37,\n    'Fast': 38,\n    'Walking': 39,\n    'Smooth': 40,\n  };\n\n  static const Map<String, int> balladStylesPro = {\n    'Bluesy': 41,\n    'Grooves': 42,\n    'Ballad Rock': 43,\n    'Slow Rock': 44,\n    'Tutorial': 45,\n    'R&B Ballad': 46,\n    'Gospel': 47,\n  };\n\n  static const Map<String, int> popStylesPro = {\n    'Beach Side': 48,\n    'Big City': 49,\n    'Funky Pop': 50,\n    'Modern': 51,\n    'School Pop': 52,\n    'Motown': 53,\n    'Resistor': 54,\n  };\n\n  static const Map<String, int> reggaeStylesPro = {\n    'Sheriff': 55,\n    'Santeria': 56,\n    'Reggae 3': 57,\n    'Reggae 4': 58,\n    'Reggae 5': 59,\n    'Reggae 6': 60,\n    'Reggae 7': 61,\n  };\n\n  static const Map<String, int> electronicStylesPro = {\n    'Electronic 1': 62,\n    'Electronic 2': 63,\n    'Electronic 3': 64,\n    'Elec-EDM': 65,\n    'Elec-Tech': 66,\n  };\n\n  static const Map<String, int> metronomeStylesPro = {\n    'M1 - 4/4 4th': 67,\n    'M2 - 4/4 8th': 68,\n    'M3 - 4/4 16th': 69,\n    'M4 - 4/4 2nd Tri': 70,\n    'M5 - 4/4 4th Tri': 71,\n    'M6 - 4/4 8th Tri': 72,\n    'M7 - 3/4 4th': 73,\n    'M8 - 3/4 8th': 74,\n  };\n\n  static const Map<String, Map> drumCategoriesPro = {\n    \"Rock\": rockStylesPro,\n    \"Country\": countryStylesPro,\n    \"Blues\": bluesStylesPro,\n    \"Metal\": metalStylesPro,\n    \"Funk\": funkStylesPro,\n    \"Jazz\": jazzStylesPro,\n    \"Ballad\": balladStylesPro,\n    \"Pop\": popStylesPro,\n    \"Reggae\": reggaeStylesPro,\n    \"Electronic\": electronicStylesPro\n  };\n\n  static const Map<String, Map> drumCategoriesProV2 = {\n    \"Metronome\": metronomeStylesProV2,\n    \"Rock\": rockStylesProV2,\n    \"Country\": countryStylesProV2,\n    \"Blues\": bluesStylesProV2,\n    \"Metal\": metalStylesProV2,\n    \"Funk\": funkStylesProV2,\n    \"Jazz\": jazzStylesProV2,\n    \"Ballad\": balladStylesProV2,\n    \"Pop\": popStylesProV2,\n    \"Reggae\": reggaeStylesProV2,\n    \"Electronic\": electronicStylesProV2\n  };\n\n  //version 2 - for 2024 update:\n\n  static const Map<String, int> metronomeStylesProV2 = {\n    'M1 - 4/4 4th': 0,\n    'M2 - 4/4 8th': 1,\n    'M3 - 4/4 16th': 2,\n    'M4 - 4/4 2nd Tri': 3,\n    'M5 - 4/4 4th Tri': 4,\n    'M6 - 4/4 8th Tri': 5,\n    'M7 - 3/4 4th': 6,\n    'M8 - 3/4 8th': 7,\n  };\n\n  static const Map<String, int> rockStylesProV2 = {\n    'Standard': 8,\n    'Swing Rock': 9,\n    'Power Beat': 10,\n    'Smooth': 11,\n    'Mega Drive': 12,\n    'Hard Rock': 13,\n    'Boogie': 14\n  };\n\n  static const Map<String, int> countryStylesProV2 = {\n    'Walk Line': 15,\n    'Blue Grass': 16,\n    'Country': 17,\n    'Waltz': 18,\n    'Train': 19,\n    'Country Rock': 20,\n    'Slowly': 21\n  };\n\n  static const Map<String, int> bluesStylesProV2 = {\n    'Slow Blues': 22,\n    'Chicago': 23,\n    'R&B': 24,\n    'Blues Rock': 25,\n    'Road Train': 26,\n    'Shuffle': 27,\n  };\n\n  static const Map<String, int> metalStylesProV2 = {\n    '2X Bass': 28,\n    'Close Beat': 29,\n    'Heavy Bass': 30,\n    'Fast': 31,\n    'Holy Case': 32,\n    'Open Hat': 33,\n    'Epic': 34,\n  };\n\n  static const Map<String, int> funkStylesProV2 = {\n    'Bounce': 35,\n    'East Coast': 36,\n    'New Mann': 37,\n    'R&B Funk': 38,\n    '80s Funk': 39,\n    'Soul': 40,\n    'Uncle Jam': 41,\n  };\n\n  static const Map<String, int> jazzStylesProV2 = {\n    'Blues Jazz': 42,\n    'Classic 1': 43,\n    'Classic 2': 44,\n    'Easy Jazz': 45,\n    'Fast': 46,\n    'Walking': 47,\n    'Smooth': 48,\n  };\n\n  static const Map<String, int> balladStylesProV2 = {\n    'Bluesy': 49,\n    'Grooves': 50,\n    'Ballad Rock': 51,\n    'Slow Rock': 52,\n    'Tutorial': 53,\n    'R&B Ballad': 54,\n    'Gospel': 55,\n  };\n\n  static const Map<String, int> popStylesProV2 = {\n    'Beach Side': 56,\n    'Big City': 57,\n    'Funky Pop': 58,\n    'Modern': 59,\n    'School Pop': 60,\n    'Motown': 61,\n    'Resistor': 62,\n  };\n\n  static const Map<String, int> reggaeStylesProV2 = {\n    'Sheriff': 63,\n    'Santeria': 64,\n    'Reggae 3': 65,\n    'Reggae 4': 66,\n    'Reggae 5': 67,\n    'Reggae 6': 68,\n    'Reggae 7': 69,\n  };\n\n  static const Map<String, int> electronicStylesProV2 = {\n    'Electronic 1': 70,\n    'Electronic 2': 71,\n    'Electronic 3': 72,\n    'Elec-EDM': 73,\n    'Elec-Tech': 74,\n  };\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/device_data/processors_list.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../../../UI/mightierIcons.dart';\nimport '../NuxFXID.dart';\nimport '../effects/Processor.dart';\n\nclass ProcessorsList {\n  static const List<ProcessorInfo> plugAirList = [\n    ProcessorInfo(\n        shortName: \"Gate\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: PlugAirFXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"EFX\",\n        longName: \"EFX\",\n        keyName: \"efx\",\n        nuxFXID: PlugAirFXID.efx,\n        color: Color(0xFFB388FF), //deepPurpleAccent[100]\n        icon: MightierIcons.pedal),\n    ProcessorInfo(\n        shortName: \"Amp\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: PlugAirFXID.amp,\n        color: Colors.green,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"IR\",\n        longName: \"Cabinet\",\n        keyName: \"cabinet\",\n        nuxFXID: PlugAirFXID.cab,\n        color: Colors.blue,\n        icon: MightierIcons.cabinet),\n    ProcessorInfo(\n        shortName: \"Mod\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: PlugAirFXID.mod,\n        color: Color(0xFF4DD0E1), //cyan[300]\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"Delay\",\n        longName: \"Delay\",\n        keyName: \"delay\",\n        nuxFXID: PlugAirFXID.delay,\n        color: Colors.blueAccent,\n        icon: Icons.blur_linear),\n    ProcessorInfo(\n        shortName: \"Reverb\",\n        longName: \"Reverb\",\n        keyName: \"reverb\",\n        nuxFXID: PlugAirFXID.reverb,\n        color: Colors.orange,\n        icon: Icons.blur_on),\n  ];\n\n  static const List<ProcessorInfo> plugProList = [\n    ProcessorInfo(\n        shortName: \"COMP\",\n        longName: \"Comp\",\n        keyName: \"comp\",\n        nuxFXID: PlugProFXID.comp,\n        color: Colors.lime,\n        icon: MightierIcons.compressor),\n    ProcessorInfo(\n        shortName: \"EFX\",\n        longName: \"EFX\",\n        keyName: \"efx\",\n        nuxFXID: PlugProFXID.efx,\n        color: Colors.orange,\n        icon: MightierIcons.pedal),\n    ProcessorInfo(\n        shortName: \"AMP\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: PlugProFXID.amp,\n        color: Colors.red,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"EQ\",\n        longName: \"EQ\",\n        keyName: \"eq\",\n        nuxFXID: PlugProFXID.eq,\n        color: Color(0xFFE0E0E0), //grey[300]\n        icon: MightierIcons.sliders),\n    ProcessorInfo(\n        shortName: \"GATE\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: PlugProFXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"MOD\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: PlugProFXID.mod,\n        color: Color(0xFF7E57C2), //deepPurple[400]\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"DLY\",\n        longName: \"Delay\",\n        keyName: \"delay\",\n        nuxFXID: PlugProFXID.delay,\n        color: Color(0xFF4DD0E1), //cyan[300]\n        icon: Icons.blur_linear),\n    ProcessorInfo(\n        shortName: \"RVB\",\n        longName: \"Reverb\",\n        keyName: \"reverb\",\n        nuxFXID: PlugProFXID.reverb,\n        color: Color(0xFFCE93D8), //purple[200]\n        icon: Icons.blur_on),\n    ProcessorInfo(\n        shortName: \"IR\",\n        longName: \"Cab\",\n        keyName: \"cabinet\",\n        nuxFXID: PlugProFXID.cab,\n        color: Color(0xFF29B6F6), //lightBlue[400]\n        icon: MightierIcons.cabinet),\n  ];\n\n  static const List<ProcessorInfo> liteMk2List = [\n    ProcessorInfo(\n        shortName: \"GATE\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: LiteMK2FXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"EFX\",\n        longName: \"EFX\",\n        keyName: \"efx\",\n        nuxFXID: LiteMK2FXID.efx,\n        color: Colors.orange,\n        icon: MightierIcons.pedal),\n    ProcessorInfo(\n        shortName: \"AMP\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: LiteMK2FXID.amp,\n        color: Colors.red,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"IR\",\n        longName: \"Cab\",\n        keyName: \"cabinet\",\n        nuxFXID: LiteMK2FXID.cab,\n        color: Color(0xFF29B6F6), //lightBlue[400]\n        icon: MightierIcons.cabinet),\n    ProcessorInfo(\n        shortName: \"MOD\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: LiteMK2FXID.mod,\n        color: Color(0xFF7E57C2), //Colors.deepPurple[400]!,\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"DLY\",\n        longName: \"Delay\",\n        keyName: \"delay\",\n        nuxFXID: LiteMK2FXID.delay,\n        color: Color(0xFF4DD0E1), //Colors.cyan[300]!,\n        icon: Icons.blur_linear),\n    ProcessorInfo(\n        shortName: \"RVB\",\n        longName: \"Reverb\",\n        keyName: \"reverb\",\n        nuxFXID: LiteMK2FXID.reverb,\n        color: Color(0xFFCE93D8), //Colors.purple[200]!,\n        icon: Icons.blur_on),\n  ];\n\n  static const List<ProcessorInfo> liteList = [\n    ProcessorInfo(\n        shortName: \"Gate\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: LiteFXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"Amp\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: LiteFXID.amp,\n        color: Colors.green,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"Mod\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: LiteFXID.mod,\n        color: Color(0xFF4DD0E1), //cyan[300]\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"Ambience\",\n        longName: \"Ambience\",\n        keyName: \"ambience\",\n        nuxFXID: LiteFXID.ambience,\n        color: Colors.orange,\n        icon: Icons.blur_on),\n  ];\n\n  static const List<ProcessorInfo> bt2040List = [\n    ProcessorInfo(\n        shortName: \"Gate\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: PlugBTFXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"Amp\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: PlugBTFXID.amp,\n        color: Colors.green,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"Mod\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: PlugBTFXID.mod,\n        color: Color(0xFF4DD0E1), //cyan[300]\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"Delay\",\n        longName: \"Delay\",\n        keyName: \"delay\",\n        nuxFXID: PlugBTFXID.delay,\n        color: Colors.blueAccent,\n        icon: Icons.blur_linear),\n    ProcessorInfo(\n        shortName: \"Reverb\",\n        longName: \"Reverb\",\n        keyName: \"reverb\",\n        nuxFXID: PlugBTFXID.reverb,\n        color: Colors.orange,\n        icon: Icons.blur_on),\n  ];\n\n  static const List<ProcessorInfo> mighty8BTList = [\n    ProcessorInfo(\n        shortName: \"Gate\",\n        longName: \"Noise Gate\",\n        keyName: \"gate\",\n        nuxFXID: PlugBTFXID.gate,\n        color: Colors.green,\n        icon: MightierIcons.gate),\n    ProcessorInfo(\n        shortName: \"Amp\",\n        longName: \"Amplifier\",\n        keyName: \"amp\",\n        nuxFXID: PlugBTFXID.amp,\n        color: Colors.green,\n        icon: MightierIcons.amp),\n    ProcessorInfo(\n        shortName: \"Mod\",\n        longName: \"Modulation\",\n        keyName: \"mod\",\n        nuxFXID: PlugBTFXID.mod,\n        color: Color(0xFF4DD0E1), //cyan[300]\n        icon: Icons.waves),\n    ProcessorInfo(\n        shortName: \"Delay\",\n        longName: \"Delay\",\n        keyName: \"delay\",\n        nuxFXID: PlugBTFXID.delay,\n        color: Colors.blueAccent,\n        icon: Icons.blur_linear),\n    ProcessorInfo(\n        shortName: \"Reverb\",\n        longName: \"Reverb\",\n        keyName: \"reverb\",\n        nuxFXID: PlugBTFXID.reverb,\n        color: Colors.orange,\n        icon: Icons.blur_on),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/MidiControllerHandles.dart",
    "content": "enum ControllerHandleId {\n  unknown,\n  gateOff,\n  gateOn,\n  gateToggle,\n  gatePrev,\n  gateNext,\n  compOff,\n  compOn,\n  compToggle,\n  compPrev,\n  compNext,\n  modOff,\n  modOn,\n  modToggle,\n  modPrev,\n  modNext,\n  efxOff,\n  efxOn,\n  efxToggle,\n  efxPrev,\n  efxNext,\n  ampOff,\n  ampOn,\n  ampToggle,\n  ampPrev,\n  ampNext,\n  cabOff,\n  cabOn,\n  cabToggle,\n  cabPrev,\n  cabNext,\n  eqOff,\n  eqOn,\n  eqToggle,\n  eqPrev,\n  eqNext,\n  reverbOff,\n  reverbOn,\n  reverbToggle,\n  reverbPrev,\n  reverbNext,\n  delayOff,\n  delayOn,\n  delayToggle,\n  delayPrev,\n  delayNext,\n\n  gateSense,\n  gateDecay,\n\n  compLevel,\n  compSustain,\n  compThreshold,\n  compRatio,\n\n  efxLevel,\n  efxGain,\n  efxTone,\n  efxRate,\n  efxDepth,\n  efxBass,\n\n  ampGain,\n  ampVolume,\n  ampBass,\n  ampMiddle,\n  ampTreble,\n  ampTone,\n\n  cabLevel,\n  cabLoCut,\n  cabHiCut,\n\n  delayLevel,\n  delayTime,\n  delayRepeat,\n  delayMod,\n\n  reverbDecay,\n  reverbMix,\n  reverbTone,\n\n  modRate,\n  modDepth,\n  modIntensity\n}\n\nclass MidiControllerHandle {\n  final String label;\n  final ControllerHandleId id;\n  const MidiControllerHandle(this.label, this.id);\n}\n\nclass MidiControllerHandles {\n  //on;off;toggle;prev;next handles\n  static const MidiControllerHandle gateOff =\n      MidiControllerHandle(\"\", ControllerHandleId.gateOff);\n  static const MidiControllerHandle gateOn =\n      MidiControllerHandle(\"\", ControllerHandleId.gateOn);\n  static const MidiControllerHandle gateToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.gateToggle);\n  static const MidiControllerHandle gatePrev =\n      MidiControllerHandle(\"\", ControllerHandleId.gatePrev);\n  static const MidiControllerHandle gateNext =\n      MidiControllerHandle(\"\", ControllerHandleId.gateNext);\n  static const MidiControllerHandle compOff =\n      MidiControllerHandle(\"\", ControllerHandleId.compOff);\n  static const MidiControllerHandle compOn =\n      MidiControllerHandle(\"\", ControllerHandleId.compOn);\n  static const MidiControllerHandle compToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.compToggle);\n  static const MidiControllerHandle compPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.compPrev);\n  static const MidiControllerHandle compNext =\n      MidiControllerHandle(\"\", ControllerHandleId.compNext);\n  static const MidiControllerHandle modOff =\n      MidiControllerHandle(\"\", ControllerHandleId.modOff);\n  static const MidiControllerHandle modOn =\n      MidiControllerHandle(\"\", ControllerHandleId.modOn);\n  static const MidiControllerHandle modToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.modToggle);\n  static const MidiControllerHandle modPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.modPrev);\n  static const MidiControllerHandle modNext =\n      MidiControllerHandle(\"\", ControllerHandleId.modNext);\n  static const MidiControllerHandle efxOff =\n      MidiControllerHandle(\"\", ControllerHandleId.efxOff);\n  static const MidiControllerHandle efxOn =\n      MidiControllerHandle(\"\", ControllerHandleId.efxOn);\n  static const MidiControllerHandle efxToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.efxToggle);\n  static const MidiControllerHandle efxPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.efxPrev);\n  static const MidiControllerHandle efxNext =\n      MidiControllerHandle(\"\", ControllerHandleId.efxNext);\n  static const MidiControllerHandle ampOff =\n      MidiControllerHandle(\"\", ControllerHandleId.ampOff);\n  static const MidiControllerHandle ampOn =\n      MidiControllerHandle(\"\", ControllerHandleId.ampOn);\n  static const MidiControllerHandle ampToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.ampToggle);\n  static const MidiControllerHandle ampPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.ampPrev);\n  static const MidiControllerHandle ampNext =\n      MidiControllerHandle(\"\", ControllerHandleId.ampNext);\n  static const MidiControllerHandle cabOff =\n      MidiControllerHandle(\"\", ControllerHandleId.cabOff);\n  static const MidiControllerHandle cabOn =\n      MidiControllerHandle(\"\", ControllerHandleId.cabOn);\n  static const MidiControllerHandle cabToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.cabToggle);\n  static const MidiControllerHandle cabPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.cabPrev);\n  static const MidiControllerHandle cabNext =\n      MidiControllerHandle(\"\", ControllerHandleId.cabNext);\n  static const MidiControllerHandle eqOff =\n      MidiControllerHandle(\"\", ControllerHandleId.eqOff);\n  static const MidiControllerHandle eqOn =\n      MidiControllerHandle(\"\", ControllerHandleId.eqOn);\n  static const MidiControllerHandle eqToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.eqToggle);\n  static const MidiControllerHandle eqPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.eqPrev);\n  static const MidiControllerHandle eqNext =\n      MidiControllerHandle(\"\", ControllerHandleId.eqNext);\n  static const MidiControllerHandle reverbOff =\n      MidiControllerHandle(\"\", ControllerHandleId.reverbOff);\n  static const MidiControllerHandle reverbOn =\n      MidiControllerHandle(\"\", ControllerHandleId.reverbOn);\n  static const MidiControllerHandle reverbToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.reverbToggle);\n  static const MidiControllerHandle reverbPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.reverbPrev);\n  static const MidiControllerHandle reverbNext =\n      MidiControllerHandle(\"\", ControllerHandleId.reverbNext);\n  static const MidiControllerHandle delayOff =\n      MidiControllerHandle(\"\", ControllerHandleId.delayOff);\n  static const MidiControllerHandle delayOn =\n      MidiControllerHandle(\"\", ControllerHandleId.delayOn);\n  static const MidiControllerHandle delayToggle =\n      MidiControllerHandle(\"\", ControllerHandleId.delayToggle);\n  static const MidiControllerHandle delayPrev =\n      MidiControllerHandle(\"\", ControllerHandleId.delayPrev);\n  static const MidiControllerHandle delayNext =\n      MidiControllerHandle(\"\", ControllerHandleId.delayNext);\n\n  //Gate\n  static const MidiControllerHandle gateSense =\n      MidiControllerHandle(\"Threshold\", ControllerHandleId.gateSense);\n  static const MidiControllerHandle gateDecay =\n      MidiControllerHandle(\"Decay\", ControllerHandleId.gateDecay);\n\n  //comp\n  static const MidiControllerHandle compLevel =\n      MidiControllerHandle(\"Level\", ControllerHandleId.compLevel);\n  static const MidiControllerHandle compSustain =\n      MidiControllerHandle(\"Sustain\", ControllerHandleId.compSustain);\n  static const MidiControllerHandle compThreshold =\n      MidiControllerHandle(\"Threshold\", ControllerHandleId.compThreshold);\n  static const MidiControllerHandle compRatio =\n      MidiControllerHandle(\"Ratio\", ControllerHandleId.compRatio);\n\n  //EFX\n  static const MidiControllerHandle efxLevel =\n      MidiControllerHandle(\"Level\", ControllerHandleId.efxLevel);\n  static const MidiControllerHandle efxGain =\n      MidiControllerHandle(\"Gain/Drive\", ControllerHandleId.efxGain);\n  static const MidiControllerHandle efxTone =\n      MidiControllerHandle(\"Tone/Treble\", ControllerHandleId.efxTone);\n  static const MidiControllerHandle efxRate =\n      MidiControllerHandle(\"Rate\", ControllerHandleId.efxRate);\n  static const MidiControllerHandle efxDepth =\n      MidiControllerHandle(\"Depth/Sustain\", ControllerHandleId.efxDepth);\n  static const MidiControllerHandle efxBass =\n      MidiControllerHandle(\"Bass\", ControllerHandleId.efxBass);\n\n  //Amps\n  static const MidiControllerHandle ampGain =\n      MidiControllerHandle(\"Gain\", ControllerHandleId.ampGain);\n  static const MidiControllerHandle ampVolume =\n      MidiControllerHandle(\"Master Level\", ControllerHandleId.ampVolume);\n  static const MidiControllerHandle ampBass =\n      MidiControllerHandle(\"Bass\", ControllerHandleId.ampBass);\n  static const MidiControllerHandle ampMiddle =\n      MidiControllerHandle(\"Middle\", ControllerHandleId.ampMiddle);\n  static const MidiControllerHandle ampTreble =\n      MidiControllerHandle(\"Treble\", ControllerHandleId.ampTreble);\n  static const MidiControllerHandle ampTone =\n      MidiControllerHandle(\"Presence/Tone\", ControllerHandleId.ampTone);\n\n  //Cabs\n  static const MidiControllerHandle cabLevel =\n      MidiControllerHandle(\"Level\", ControllerHandleId.cabLevel);\n  static const MidiControllerHandle cabLoCut =\n      MidiControllerHandle(\"Low Cut\", ControllerHandleId.cabLoCut);\n  static const MidiControllerHandle cabHiCut =\n      MidiControllerHandle(\"High Cut\", ControllerHandleId.cabHiCut);\n\n  //Delays\n  static const MidiControllerHandle delayLevel =\n      MidiControllerHandle(\"Level\", ControllerHandleId.delayLevel);\n  static const MidiControllerHandle delayTime =\n      MidiControllerHandle(\"Time\", ControllerHandleId.delayTime);\n  static const MidiControllerHandle delayRepeat =\n      MidiControllerHandle(\"Repeat\", ControllerHandleId.delayRepeat);\n  static const MidiControllerHandle delayMod =\n      MidiControllerHandle(\"Modulation\", ControllerHandleId.delayMod);\n\n  //Reverbs\n  static const MidiControllerHandle reverbDecay =\n      MidiControllerHandle(\"Decay\", ControllerHandleId.reverbDecay);\n  static const MidiControllerHandle reverbMix =\n      MidiControllerHandle(\"Level/Mix\", ControllerHandleId.reverbMix);\n  static const MidiControllerHandle reverbTone =\n      MidiControllerHandle(\"Tone/Misc\", ControllerHandleId.reverbTone);\n\n  static const MidiControllerHandle modRate =\n      MidiControllerHandle(\"Rate\", ControllerHandleId.modRate);\n  static const MidiControllerHandle modDepth =\n      MidiControllerHandle(\"Depth/Width\", ControllerHandleId.modDepth);\n  static const MidiControllerHandle modIntensity =\n      MidiControllerHandle(\"Intensity/Mix\", ControllerHandleId.modIntensity);\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/NoiseGate.dart",
    "content": "import '../NuxConstants.dart';\nimport '../value_formatters/ValueFormatter.dart';\nimport 'MidiControllerHandles.dart';\nimport 'Processor.dart';\n\nclass NoiseGate2Param extends Processor {\n  @override\n  final name = \"Noise Gate\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  int? get nuxEffectTypeIndex => null;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.ngenable;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_GateEnable;\n\n  @override\n  int get midiCCSelectionValue => 0;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.gateOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.gateOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.gateToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Threshold\",\n        handle: \"threshold\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ngthresold,\n        midiCC: MidiCCValues.bCC_GateThresold,\n        midiControllerHandle: MidiControllerHandles.gateSense),\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 47,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ngsustain,\n        midiCC: MidiCCValues.bCC_GateDecay,\n        midiControllerHandle: MidiControllerHandles.gateDecay),\n  ];\n}\n\nclass NoiseGate1Param extends Processor {\n  @override\n  final name = \"Noise Gate\";\n\n  @override\n  int get nuxIndex => 0;\n\n  //noise gate has no type specified\n  @override\n  int? get nuxEffectTypeIndex => null;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.ngenable;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_GateEnable;\n\n  @override\n  int get midiCCSelectionValue => 0;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.gateOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.gateOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.gateToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Threshold\",\n        handle: \"threshold\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ngthresold,\n        midiCC: MidiCCValues.bCC_GateThresold,\n        midiControllerHandle: MidiControllerHandles.gateSense),\n  ];\n}\n\nclass NoiseGatePro extends Processor {\n  @override\n  final name = \"Noise Gate\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iNG;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iNG;\n\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iNG;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.gateOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.gateOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.gateToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Sensitivity\",\n        handle: \"sensitivity\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.NG_Para1,\n        midiCC: MidiCCValuesPro.NG_Para1,\n        midiControllerHandle: MidiControllerHandles.gateSense),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.NG_Para2,\n        midiCC: MidiCCValuesPro.NG_Para2,\n        midiControllerHandle: MidiControllerHandles.gateDecay),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/Processor.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/value_formatters/ValueFormatter.dart';\n\nimport '../NuxFXID.dart';\nimport '../../../utilities/MathEx.dart';\nimport '../value_formatters/SwitchFormatters.dart';\nimport 'MidiControllerHandles.dart';\n\nclass Parameter {\n  ValueFormatter formatter;\n  String name;\n  String handle;\n  int midiCC;\n  int devicePresetIndex;\n  double value;\n  bool masterVolume = false;\n  MidiControllerHandle? midiControllerHandle;\n\n  Parameter(\n      {required this.value,\n      required this.handle,\n      required this.formatter,\n      required this.name,\n      required this.midiCC,\n      required this.devicePresetIndex,\n      this.midiControllerHandle,\n      this.masterVolume = false});\n\n  int get midiValue => formatter.valueToMidi7Bit(value);\n  int get masterVolMidiValue => formatter\n      .valueToMidi7Bit(value * (NuxDeviceControl().masterVolume * 0.01));\n  set midiValue(mv) => value = formatter.midi7BitToValue(mv);\n  String get label => formatter.toLabel(value);\n\n  double toHumanInput() {\n    return formatter.toHumanInput(value);\n  }\n\n  double fromHumanInput(double val) {\n    value = formatter.fromHumanInput(val);\n    return value;\n  }\n}\n\nclass ProcessorInfo {\n  final String shortName;\n  final String longName;\n  final String keyName;\n  final NuxFXID nuxFXID;\n  final Color color;\n  final IconData icon;\n  const ProcessorInfo(\n      {required this.shortName,\n      required this.longName,\n      required this.keyName,\n      required this.nuxFXID,\n      required this.color,\n      required this.icon});\n}\n\nenum EffectEditorUI { Sliders, EQ }\n\nabstract class Processor {\n  String get name;\n\n  List<Parameter> get parameters;\n\n  //the number which the nux device uses to refer to the effect\n  int get nuxIndex;\n\n  //index in nux data array where the effect type is set\n  int? get nuxEffectTypeIndex;\n\n  int? get nuxEnableIndex;\n  int get nuxEnableMask => 0x7f;\n  bool get nuxEnableInverted => false;\n\n  EffectEditorUI get editorUI;\n  //The CC command that switches the effect on/off\n  int get midiCCEnableValue;\n\n  //The CC command that selects the active effect for a certain slot\n  int get midiCCSelectionValue;\n\n  //MIDI foot controller stuff\n  MidiControllerHandle? get midiControlOff;\n  MidiControllerHandle? get midiControlOn;\n  MidiControllerHandle? get midiControlToggle;\n  MidiControllerHandle? get midiControlPrev;\n  MidiControllerHandle? get midiControlNext;\n\n  //used to declare that the device is a separator\n  //Used in the selection popup menu\n  bool isSeparator = false;\n\n  //Used to sort various effects in a category\n  //for example acoustic amps/electric amps\n  //used in conjunction with isSeparator\n  String category = \"\";\n\n  //at least for Mighty Plug MP-2, the NuxPayload values are 0-100, not 0,127\n  void setupFromNuxPayload(List<int> nuxData) {\n    for (int i = 0; i < parameters.length; i++) {\n      var valueIndex = parameters[i].devicePresetIndex;\n      if (nuxData.length <= valueIndex) {\n        debugPrint(\"Error: $valueIndex outside of preset data!\");\n        continue;\n      }\n      if (parameters[i].formatter is SwitchFormatter) {\n        parameters[i].value =\n            nuxData[parameters[i].devicePresetIndex].toDouble();\n      } else {\n        parameters[i].value = MathEx.map(\n            nuxData[parameters[i].devicePresetIndex].toDouble(),\n            0,\n            100,\n            parameters[i].formatter.min.toDouble(),\n            parameters[i].formatter.max.toDouble());\n      }\n    }\n  }\n\n  void getNuxPayload(List<int> nuxData, bool enabled) {\n    if (nuxEffectTypeIndex != null) nuxData[nuxEffectTypeIndex!] = nuxIndex;\n    for (int i = 0; i < parameters.length; i++) {\n      //TODO: isn't this supposed to use valueformatter valueToMidi7Bit()\n      int value = MathEx.map(\n              parameters[i].value,\n              parameters[i].formatter.min.toDouble(),\n              parameters[i].formatter.max.toDouble(),\n              0,\n              100)\n          .round();\n      nuxData[parameters[i].devicePresetIndex] = value;\n    }\n    if (nuxEnableIndex != null) {\n      int value = (enabled != nuxEnableInverted ? 0xff : 0) & nuxEnableMask;\n      nuxData[nuxEnableIndex!] |= value;\n    }\n  }\n\n  //this is used for version transition\n  int? getEquivalentEffect(int version) {\n    return nuxIndex;\n  }\n}\n\nabstract class Amplifier extends Processor {\n  @override\n  int get midiCCEnableValue;\n  @override\n  int get midiCCSelectionValue;\n  int get defaultCab;\n}\n\nabstract class Cabinet extends Processor {\n  String get cabName;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/lite/Ambience.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Ambience extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexLite.efxtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.efxenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ChorusEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ChorusMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.reverbOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.reverbOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.reverbToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.reverbPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.reverbNext;\n}\n\nclass Delay1 extends Ambience {\n  @override\n  final name = \"Delay 1\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay2 extends Ambience {\n  @override\n  final name = \"Delay 2\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay3 extends Ambience {\n  @override\n  final name = \"Delay 3\";\n\n  @override\n  int get nuxIndex => 2;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay4 extends Ambience {\n  @override\n  final name = \"Delay 4\";\n\n  @override\n  int get nuxIndex => 3;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass RoomReverb extends Ambience {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass HallReverb extends Ambience {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass PlateReverb extends Ambience {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass SpringReverb extends Ambience {\n  @override\n  final name = \"Spring\";\n\n  @override\n  int get nuxIndex => 13;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 32,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/lite/Amps.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class LiteAmplifier extends Amplifier {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => null;\n  @override\n  int? get nuxEnableIndex => null;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_AmpEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_NotUsed;\n  @override\n  int get defaultCab => 0;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n}\n\nclass AmpClean extends LiteAmplifier {\n  @override\n  final name = \"Amplifier\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  bool isSeparator = false;\n  @override\n  String category = \"\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.drivegain,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexLite.drivelevel,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.drivetone, //check this\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/lite/Modulation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Modulation extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexLite.modfxtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.modfxenable;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  //row 1247: 0-phaser, 1-chorus, 2-Stereo chorus, 3-Flanger, 4-Vibe, 5-Tremolo\n\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ModfxEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ModfxMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.modOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.modOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.modToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.modPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.modNext;\n}\n\nclass Phaser extends Modulation {\n  @override\n  final name = \"Phaser\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Chorus extends Modulation {\n  @override\n  final name = \"Chorus\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 88,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Tremolo extends Modulation {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Vibe extends Modulation {\n  @override\n  final name = \"Vibe\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/liteMk2/delay.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/value_formatters/ValueFormatter.dart';\n\nimport '../../NuxConstants.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\nimport '../plug_pro/Delay.dart';\n\nclass AnalogDelayLiteMk2 extends DelayPro {\n  @override\n  final name = \"Analog\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"rate\",\n        value: 50,\n        formatter: ValueFormatters.tempoProAnalog,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"echo\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"intensity\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n  ];\n}\n\nclass DigitalDelayLiteV2 extends DelayPro {\n  @override\n  final name = \"Digital\";\n\n  @override\n  int get nuxIndex => 2;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 50,\n        formatter: ValueFormatters.tempoProAnalog,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"feedback\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n  ];\n}\n\nclass ModDelayLiteMk2 extends DelayPro {\n  @override\n  final name = \"Modulation\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 49,\n        formatter: ValueFormatters.tempoProMod,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 48,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"level\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Mod\",\n        handle: \"mod\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para4,\n        midiCC: MidiCCValuesPro.DLY_Para4,\n        midiControllerHandle: MidiControllerHandles.delayMod),\n  ];\n}\n\nclass TapeEchoLiteMk2 extends DelayPro {\n  @override\n  final name = \"Tape Echo\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 61,\n        formatter: ValueFormatters.tempoProTapeEcho,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 56,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"level\",\n        value: 43,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n  ];\n}\n\nclass PhiDelayLiteMk2 extends DelayPro {\n  @override\n  final name = \"Phi Delay\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 50,\n        formatter: ValueFormatters.tempoPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"level\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/liteMk2/efx.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\nimport '../plug_pro/EFX.dart';\n\nclass RoseCompLiteMk2 extends EFXPro {\n  @override\n  final name = \"Rose Comp\";\n\n  @override\n  int get nuxIndex => 14;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.compSustain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.compLevel),\n  ];\n}\n\nclass KCompLiteMk2 extends EFXPro {\n  @override\n  final name = \"K Comp\";\n\n  @override\n  int get nuxIndex => 15;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.compSustain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.compLevel),\n    Parameter(\n        name: \"Clipping\",\n        handle: \"clipping\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.compThreshold),\n  ];\n}\n\nclass TouchWahLiteMk2 extends EFXPro {\n  @override\n  int get nuxIndex => 16;\n\n  @override\n  final name = \"Touch Wah\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Type\",\n        handle: \"type\",\n        value: 81,\n        formatter: ValueFormatters.touchWahFormatterLiteMk2,\n        devicePresetIndex: 0,\n        midiCC: MidiCCValuesPro.EFX_Para1),\n    Parameter(\n        name: \"Wow\",\n        handle: \"wow\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: 0,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Sense\",\n        handle: \"sense\",\n        value: 27,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: 0,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n  ];\n}\n\nclass TremoloEFXLiteMk2 extends EFXPro {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 17;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 15,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n  ];\n}\n\nclass VibeEFXLiteMk2 extends EFXPro {\n  @override\n  final name = \"U-Vibe\";\n\n  @override\n  int get nuxIndex => 18;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"Rate\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 0,\n        formatter: ValueFormatters.vibeModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3),\n  ];\n}\n\nclass PH100LiteMk2 extends EFXPro {\n  @override\n  final name = \"PH 100\";\n\n  @override\n  int get nuxIndex => 19;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/liteMk2/modulation.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/effects/plug_pro/Modulation.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nclass FlangerLiteMk2 extends FlangerPro {\n  @override\n  int get nuxIndex => 5;\n}\n\nclass Phase90LiteMk2 extends Phase90 {\n  @override\n  int get nuxIndex => 6;\n}\n\nclass Phase100LiteMk2 extends Phase100 {\n  @override\n  int get nuxIndex => 7;\n}\n\nclass SCFLiteMk2 extends SCFPro {\n  @override\n  int get nuxIndex => 8;\n}\n\nclass VibeLiteMk2 extends VibePro {\n  @override\n  int get nuxIndex => 9;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"speed\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"intensity\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 0,\n        formatter: ValueFormatters.vibeModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3),\n  ];\n}\n\nclass TremoloLiteMk2 extends TremoloPro {\n  @override\n  int get nuxIndex => 10;\n}\n\nclass SCH1LiteMk2 extends SCH1Pro {\n  @override\n  int get nuxIndex => 11;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/liteMk2/reverb.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/effects/plug_pro/Reverb.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nclass RoomReverbLiteMk2 extends Reverb {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para3,\n        midiCC: MidiCCValuesPro.RVB_Para3,\n        midiControllerHandle: MidiControllerHandles.reverbTone),\n  ];\n}\n\nclass HallReverbLiteMk2 extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Tone\",\n        handle: \"liveliness\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para3,\n        midiCC: MidiCCValuesPro.RVB_Para3,\n        midiControllerHandle: MidiControllerHandles.reverbTone),\n  ];\n}\n\nclass DampReverbLiteMk2 extends DampReverbPro {\n  @override\n  int get nuxIndex => 5;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_2040bt/Amps.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class MXXBTAmplifier extends Amplifier {\n  @override\n  int? get nuxEffectTypeIndex => null;\n  @override\n  int? get nuxEnableIndex => null;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_AmpEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_NotUsed;\n  @override\n  int get defaultCab => 0;\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n}\n\nclass Amp1 extends MXXBTAmplifier {\n  @override\n  final name = \"Amplifier\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  bool isSeparator = false;\n  @override\n  String category = \"\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.amp_gain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndex2040BT.amp_level,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.amp_bass,\n        midiCC: MidiCCValues.bCC_AmpBass,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.amp_mid,\n        midiCC: MidiCCValues.bCC_AmpMid,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"High\",\n        handle: \"high\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.amp_high,\n        midiCC: MidiCCValues.bCC_AmpHigh,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_2040bt/Delay.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Delay extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndex2040BT.dly_type;\n  @override\n  int? get nuxEnableIndex => PresetDataIndex2040BT.dly_enable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_DelayEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_DelayMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.delayOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.delayOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.delayToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.delayPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.delayNext;\n}\n\nclass AnalogDelay extends Delay {\n  @override\n  final name = \"Analog Delay\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndex2040BT.dly_time,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass ModulationDelay extends Delay {\n  @override\n  final name = \"Modulation\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 56,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 43,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 61,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndex2040BT.dly_time,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass DigitalDelay extends Delay {\n  @override\n  final name = \"Digital Delay\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 49,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.dly_mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 48,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndex2040BT.dly_time,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_2040bt/Modulation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Modulation extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndex2040BT.mod_type;\n  @override\n  int? get nuxEnableIndex => PresetDataIndex2040BT.mod_enable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ModfxEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ModfxMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.modOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.modOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.modToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.modPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.modNext;\n}\n\nclass Phaser extends Modulation {\n  @override\n  final name = \"Phaser\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate)\n  ];\n}\n\nclass Chorus extends Modulation {\n  @override\n  final name = \"Chorus\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 88,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n\nclass Tremolo extends Modulation {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.mod_rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_2040bt/Reverb.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Reverb extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndex2040BT.rvb_type;\n  @override\n  int? get nuxEnableIndex => PresetDataIndex2040BT.rvb_enable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ReverbEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ReverbMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.reverbOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.reverbOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.reverbToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.reverbPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.reverbNext;\n}\n\nclass HallReverb extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_mix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass PlateReverb extends Reverb {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_mix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass SpringReverb extends Reverb {\n  @override\n  final name = \"Spring\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 32,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndex2040BT.rvb_mix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_8bt/Amps.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class M8BTAmplifier extends Amplifier {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => null;\n  @override\n  int? get nuxEnableIndex => null;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_AmpEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_NotUsed;\n  @override\n  int get defaultCab => 0;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n}\n\nclass AmpClean extends M8BTAmplifier {\n  @override\n  final name = \"Amplifier\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  bool isSeparator = false;\n  @override\n  String category = \"\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.drivegain,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.drivetone,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexLite.drivelevel,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Mic Level\",\n        handle: \"miclevel\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.miclevel,\n        midiCC: MidiCCValues.bCC_AmpDrive),\n    Parameter(\n        name: \"AMB Send\",\n        handle: \"ambsend\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.micambsend,\n        midiCC: MidiCCValues.bCC_AmpMaster),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_8bt/Delay.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Delay extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexLite.delaytype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.delayenable;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_DelayEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_DelayMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.delayOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.delayOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.delayToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.delayPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.delayNext;\n}\n\nclass Delay1 extends Delay {\n  @override\n  final name = \"Delay 1\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay2 extends Delay {\n  @override\n  final name = \"Delay 2\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay3 extends Delay {\n  @override\n  final name = \"Delay 3\";\n\n  @override\n  int get nuxIndex => 2;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass Delay4 extends Delay {\n  @override\n  final name = \"Delay 4\";\n\n  @override\n  int get nuxIndex => 3;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexLite.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_8bt/Modulation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Modulation extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexLite.modfxtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.modfxenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  //row 1247: 0-phaser, 1-chorus, 2-Stereo chorus, 3-Flanger, 4-Vibe, 5-Tremolo\n\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ModfxEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ModfxMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.modOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.modOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.modToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.modPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.modNext;\n}\n\nclass Phaser extends Modulation {\n  @override\n  final name = \"Phaser\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Chorus extends Modulation {\n  @override\n  final name = \"Chorus\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 88,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Tremolo extends Modulation {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Vibe extends Modulation {\n  @override\n  final name = \"Vibe\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/mighty_8bt/Reverb.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Reverb extends Processor {\n  //TODO: check if correct\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexLite.reverbtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexLite.reverbenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ReverbEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ReverbMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.reverbOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.reverbOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.reverbToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.reverbPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.reverbNext;\n}\n\nclass RoomReverb extends Reverb {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass HallReverb extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass PlateReverb extends Reverb {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass SpringReverb extends Reverb {\n  @override\n  final name = \"Spring\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 32,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexLite.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Amps.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/MidiControllerHandles.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/value_formatters/ValueFormatter.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../NuxMightyPlugAir.dart';\nimport '../Processor.dart';\nimport 'Ampsv2.dart';\nimport 'Cabinet.dart';\n\nabstract class PlugAirAmplifier extends Amplifier {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.amptype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.ampenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_AmpEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_AmpModeSetup;\n  @override\n  int get defaultCab;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.ampPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.ampNext;\n}\n\nclass TwinVerb extends PlugAirAmplifier {\n  @override\n  final name = \"Twin Verb\";\n\n  @override\n  int get defaultCab => TR212.cabIndex;\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Clean\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return TwinRvbV2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass JZ120 extends PlugAirAmplifier {\n  @override\n  final name = \"JZ 120\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  int get defaultCab => JZ120IR.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 76,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 75,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 62,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return JazzClean().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass TweedDlx extends PlugAirAmplifier {\n  @override\n  final name = \"Tweed Dlx\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  int get defaultCab => DR112.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 92,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 42,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 49,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return DeluxeRvb().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Plexi extends PlugAirAmplifier {\n  @override\n  final name = \"Plexi\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Overdrive\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  int get defaultCab => GB412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 26,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 53,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index)\n      return Plexi1987x50().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass TopBoost extends PlugAirAmplifier {\n  @override\n  final name = \"Top Boost 30\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  int get defaultCab => A212.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mdl\",\n        value: 71,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone (Presence)\",\n        handle: \"tone\",\n        value: 58,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return ClassA30().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Lead100 extends PlugAirAmplifier {\n  @override\n  final name = \"Lead 100\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  int get defaultCab => BS410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 71,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"middle\",\n        value: 62,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 53,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone (Presence)\",\n        handle: \"tone\",\n        value: 67,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return Brit800().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Fireman extends PlugAirAmplifier {\n  @override\n  final name = \"Fireman\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Distortion\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  int get defaultCab => V412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 69,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 53,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass DIEVH4 extends PlugAirAmplifier {\n  @override\n  final name = \"DIE VH4\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  int get defaultCab => V412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 72,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone (Presence)\",\n        handle: \"tone\",\n        value: 51,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return DIEVH4v2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Recto extends PlugAirAmplifier {\n  @override\n  final name = \"Recto\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  int get defaultCab => V412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 73,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 69,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 46,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Tone (Presence)\",\n        handle: \"tone\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  //this is used for version transition\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return DualRect().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Optima extends PlugAirAmplifier {\n  @override\n  final name = \"Optima\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Acoustic\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  int get defaultCab => MD45.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 72,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 100,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return Stagemanv2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Stageman extends PlugAirAmplifier {\n  @override\n  final name = \"Stageman\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  int get defaultCab => MD45.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 90,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return Stagemanv2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass MLD extends PlugAirAmplifier {\n  @override\n  final name = \"MLD\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Bass\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  int get defaultCab => TRC410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 91,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 61,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return MLDv2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass AGL extends PlugAirAmplifier {\n  @override\n  final name = \"AGL\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  int get defaultCab => AGLDB810.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 61,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 89,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 72,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return AGLv2().nuxIndex;\n    return nuxIndex;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Ampsv2.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../NuxMightyPlugAir.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\nimport 'Amps.dart';\nimport 'Cabinet.dart';\n\nclass JazzClean extends PlugAirAmplifier {\n  @override\n  final name = \"Jazz Clean\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  int get defaultCab => JZ120IR.cabIndex;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Clean\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"tone\",\n        value: 100,\n        formatter: ValueFormatters.brightMode,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return JZ120().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass DeluxeRvb extends PlugAirAmplifier {\n  @override\n  final name = \"Deluxe Rvb\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  int get defaultCab => DR112.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return TweedDlx().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass TwinRvbV2 extends PlugAirAmplifier {\n  @override\n  final name = \"Twin Rvb\";\n\n  @override\n  int get defaultCab => TR212.cabIndex;\n  @override\n  int get nuxIndex => 2;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 85,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass, //check this\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"middle\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle, //check this\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble, //check this\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"tone\",\n        value: 100,\n        formatter: ValueFormatters.brightMode,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return TwinVerb().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass ClassA30 extends PlugAirAmplifier {\n  @override\n  final name = \"Class A30\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  int get defaultCab => A212.cabIndex;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Drive\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return TopBoost().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Brit800 extends PlugAirAmplifier {\n  @override\n  final name = \"Brit 800\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  int get defaultCab => V1960.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"middle\",\n        value: 71,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"tone\",\n        value: 58,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone, //check this\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return Lead100().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Plexi1987x50 extends PlugAirAmplifier {\n  @override\n  final name = \"1987x50\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  int get defaultCab => GB412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 71,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"tone\",\n        value: 58,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return Plexi().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass FiremanHBE extends PlugAirAmplifier {\n  @override\n  final name = \"Fireman HBE\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  int get defaultCab => V412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 77,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"tone\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass DualRect extends PlugAirAmplifier {\n  @override\n  final name = \"Dual Rect\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  int get defaultCab => V412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"tone\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return Recto().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass DIEVH4v2 extends PlugAirAmplifier {\n  @override\n  final name = \"DIE VH4\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  int get defaultCab => GB412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"tone\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return DIEVH4().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass AGLv2 extends PlugAirAmplifier {\n  @override\n  final name = \"AGL\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  int get defaultCab => AGLDB810.cabIndex;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Bass\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 61,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 89,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 72,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return AGL().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Starlift extends PlugAirAmplifier {\n  @override\n  final name = \"Starlift\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  int get defaultCab => MKB410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Contour\",\n        handle: \"contour\",\n        value: 0,\n        formatter: ValueFormatters.contourMode,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return AGL().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass MLDv2 extends PlugAirAmplifier {\n  @override\n  final name = \"MLD\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  int get defaultCab => TRC410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 61,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 89,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 72,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptone,\n        midiCC: MidiCCValues.bCC_AmpPresence,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return MLD().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass Stagemanv2 extends PlugAirAmplifier {\n  @override\n  final name = \"Stageman\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  int get defaultCab => MD45.cabIndex;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Acoustic\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampgain,\n        midiCC: MidiCCValues.bCC_AmpDrive,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugAir.amplevel,\n        midiCC: MidiCCValues.bCC_AmpMaster,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampbass,\n        midiCC: MidiCCValues.bCC_OverDriveDrive,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.ampmiddle,\n        midiCC: MidiCCValues.bCC_OverDriveTone,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.amptreble,\n        midiCC: MidiCCValues.bCC_OverDriveLevel,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return Stageman().nuxIndex;\n    return nuxIndex;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Cabinet.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:core';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\n//cabinets are 3 categories - electric, acoustic and bass\nabstract class CabinetMP2 extends Cabinet {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.cabtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.cabenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_CabEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_CabMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.cabPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.cabNext;\n\n  @override\n  String get cabName;\n  @override\n  String get name {\n    var name = SharedPrefs().getCustomCabinetName(\n        NuxDeviceControl.instance().device.productStringId, nuxIndex);\n    return name ?? cabName;\n  }\n\n  Parameter value = Parameter(\n      devicePresetIndex: PresetDataIndexPlugAir.cabgain,\n      name: \"Level\",\n      handle: \"level\",\n      value: 0,\n      formatter: ValueFormatters.decibelMP2,\n      midiCC: MidiCCValues.bCC_Routing,\n      midiControllerHandle: MidiControllerHandles.cabLevel);\n\n  @override\n  List<Parameter> get parameters => [value];\n}\n\nclass V1960 extends CabinetMP2 {\n  @override\n  bool get isSeparator => true;\n  @override\n  String get category => \"Electric IR\";\n  @override\n  final cabName = \"V1960\";\n  static int get cabIndex => 0;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass A212 extends CabinetMP2 {\n  @override\n  final cabName = \"A212\"; //Sunn A212???\n  static int get cabIndex => 1;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass BS410 extends CabinetMP2 {\n  @override\n  final cabName = \"BS410\";\n  static int get cabIndex => 2;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass DR112 extends CabinetMP2 {\n  @override\n  final cabName = \"DR112\";\n  static int get cabIndex => 3;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GB412 extends CabinetMP2 {\n  @override\n  final cabName = \"GB412\";\n  static int get cabIndex => 4;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass JZ120IR extends CabinetMP2 {\n  @override\n  final cabName = \"JZ120\";\n  static int get cabIndex => 5;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass TR212 extends CabinetMP2 {\n  @override\n  final cabName = \"TR212\";\n  @override\n  int get nuxIndex => cabIndex;\n  static int get cabIndex => 6;\n}\n\nclass V412 extends CabinetMP2 {\n  @override\n  final cabName = \"V412\";\n  static int get cabIndex => 7;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass AGLDB810 extends CabinetMP2 {\n  @override\n  bool get isSeparator => true;\n\n  @override\n  String get category => \"Bass IR\";\n  @override\n  final cabName = \"AGL DB810\";\n  static int get cabIndex => 8;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass AMPSV810 extends CabinetMP2 {\n  @override\n  final cabName = \"AMP SV810\";\n  static int get cabIndex => 9;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MKB410 extends CabinetMP2 {\n  @override\n  final cabName = \"MKB 410\";\n  static int get cabIndex => 10;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass TRC410 extends CabinetMP2 {\n  @override\n  final cabName = \"TRC 410\";\n  static int get cabIndex => 11;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GHBird extends CabinetMP2 {\n  @override\n  bool get isSeparator => true;\n\n  @override\n  String get category => \"Acoustic IR\";\n  @override\n  final cabName = \"G HBird EG Magnetic\";\n  static int get cabIndex => 12;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GJ15 extends CabinetMP2 {\n  @override\n  final cabName = \"G J15 EG Magnetic\";\n  static int get cabIndex => 13;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MD45 extends CabinetMP2 {\n  @override\n  final cabName = \"M D45 EG Magnetic\";\n  static int get cabIndex => 14;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GIBJ200 extends CabinetMP2 {\n  @override\n  final cabName = \"GIB J200 EG Magnetic\";\n  static int get cabIndex => 15;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GIBJ45 extends CabinetMP2 {\n  @override\n  final cabName = \"GIB J45 EG Magnetic\";\n  static int get cabIndex => 16;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass TL314 extends CabinetMP2 {\n  @override\n  final cabName = \"TL 314 EG Magnetic\";\n  static int get cabIndex => 17;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MHD28 extends CabinetMP2 {\n  @override\n  final cabName = \"M HD28 EG Magnetic\";\n  static int get cabIndex => 18;\n  @override\n  int get nuxIndex => cabIndex;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Delay.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../NuxMightyPlugAir.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Delay extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.delaytype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.delayenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_DelayEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_DelayMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.delayOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.delayOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.delayToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.delayPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.delayNext;\n}\n\nclass AnalogDelay extends Delay {\n  @override\n  final name = \"Analog Delay\";\n\n  @override\n  int get nuxIndex => 0;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 34,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar2feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar3mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 52,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar1time,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass TapeEcho extends Delay {\n  @override\n  final name = \"Tape Echo\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 56,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 43,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 61,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return ModDelay().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass DigitalDelay extends Delay {\n  @override\n  final name = \"Digital Delay\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 49,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayfeedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delaymix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 48,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index)\n      return DigitalDelayv2().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass PingPong extends Delay {\n  @override\n  final name = \"Ping Pong\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar2feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar3mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 50,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n}\n\nclass DigitalDelayv2 extends Delay {\n  @override\n  final name = \"Digital Delay\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 49,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar2feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar3mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 48,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar1time,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) {\n      return DigitalDelay().nuxIndex;\n    }\n    return nuxIndex;\n  }\n}\n\nclass ModDelay extends Delay {\n  @override\n  final name = \"Mod Delay\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 49,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar2feedback,\n        midiCC: MidiCCValues.bCC_DelayRepeat,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.delayvar3mix,\n        midiCC: MidiCCValues.bCC_DelayLevel,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 48,\n        formatter: ValueFormatters.tempo,\n        devicePresetIndex: PresetDataIndexPlugAir.delaytime,\n        midiCC: MidiCCValues.bCC_DelayTime,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return TapeEcho().nuxIndex;\n    return nuxIndex;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/EFX.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugAir.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/plug_air/EFXv2.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class EFX extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.efxtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.efxenable;\n  //row 1871\n  // 0 -Touch Wah, 1 - Uni Vibe, 2 - Tremolo, 3 - Phaser, 4 - Boost, 5 - TS Drive, 6 - Bass TS\n  // 7 - 3 Band EQ, 8 - Muff, 9 - Crunch, 10 - Red Dist, 11 - Morning Drive, 12 - Dist One\n  // The bass TS (6) is only available in bass preset mode, the rest are everywhere\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_DistEnable;\n\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_DistMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.efxOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.efxOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.efxToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.efxPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.efxNext;\n}\n\nclass TouchWah extends EFX {\n  @override\n  final name = \"Touch Wah\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Type\",\n        handle: \"type\",\n        value: 1,\n        formatter: ValueFormatters.touchWahFormatter,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain),\n    Parameter(\n        name: \"Wow\",\n        handle: \"wow\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Sense\",\n        handle: \"sense\",\n        value: 27,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n  ];\n}\n\nclass UniVibe extends EFX {\n  @override\n  final name = \"Uni Vibe\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 73,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 83,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 0,\n        formatter: ValueFormatters.vibeMode,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel),\n  ];\n}\n\nclass TremoloEFX extends EFX {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 58,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 73,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n  ];\n}\n\nclass PhaserEFX extends EFX {\n  @override\n  final name = \"Phaser\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n    Parameter(\n        name: \"Feedback\",\n        handle: \"feedback\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass Boost extends EFX {\n  @override\n  final name = \"Boost\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return Katana().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass TSDrive extends EFX {\n  @override\n  final name = \"T Screamer\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 67,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass BassTS extends EFX {\n  @override\n  final name = \"Bass TS\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 41,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 67,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index) return null;\n    return nuxIndex;\n  }\n}\n\nclass ThreeBandEQ extends EFX {\n  @override\n  final name = \"3 Band EQ\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass Muff extends EFX {\n  @override\n  final name = \"Muff Fuzz\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n  ];\n}\n\nclass Crunch extends EFX {\n  @override\n  final name = \"Crunch\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 20,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass RedDist extends EFX {\n  @override\n  final name = \"Red Dist\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 85,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass MorningDrive extends EFX {\n  @override\n  final name = \"Morning Drive\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass DistOne extends EFX {\n  @override\n  final name = \"Dist One\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/EFXv2.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../NuxMightyPlugAir.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\nimport 'EFX.dart';\n\nclass PH100EFX extends EFX {\n  @override\n  final name = \"PH 100\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"depth\", //legacy\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n  ];\n}\n\nclass STSinger extends EFX {\n  @override\n  final name = \"ST Singer\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"level\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Filter\",\n        handle: \"filter\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return null;\n    return nuxIndex;\n  }\n}\n\nclass Katana extends EFX {\n  @override\n  final name = \"Katana\";\n\n  @override\n  int get nuxIndex => 6;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Boost\",\n        handle: \"gain\",\n        value: 100,\n        formatter: ValueFormatters.boostMode,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain),\n    Parameter(\n        name: \"Volume\",\n        handle: \"level\",\n        value: 78,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return Boost().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass RedDirt extends EFX {\n  @override\n  final name = \"Red Dirt\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 30,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 40,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar3,\n        midiCC: MidiCCValues.bCC_DistLevel,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n  ];\n}\n\nclass RoseComp extends EFX {\n  @override\n  final name = \"Rose Comp\";\n\n  @override\n  int get nuxIndex => 13;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 55,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar2,\n        midiCC: MidiCCValues.bCC_DistTone,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.efxvar1,\n        midiCC: MidiCCValues.bCC_DistGain,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n  ];\n\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir15.index) return null;\n    return nuxIndex;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Modulation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Modulation extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.modfxtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.modfxenable;\n  //row 1247: 0-phaser, 1-chorus, 2-Stereo chorus, 3-Flanger, 4-Vibe, 5-Tremolo\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ModfxEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ModfxMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.modOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.modOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.modToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.modPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.modNext;\n}\n\nclass Phaser extends Modulation {\n  @override\n  final name = \"Phaser\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Feedback\",\n        handle: \"feedback\",\n        value: 32,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxmix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass Chorus extends Modulation {\n  @override\n  final name = \"Chorus\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 88,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxmix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass STChorus extends Modulation {\n  @override\n  final name = \"ST Chorus\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 74,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 36,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxmix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass Flanger extends Modulation {\n  @override\n  final name = \"Flanger\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 56,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxmix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass Vibe extends Modulation {\n  @override\n  final name = \"U-Vibe\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 54,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 0,\n        formatter: ValueFormatters.vibeMode,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxmix,\n        midiCC: MidiCCValues.bCC_ChorusLevel),\n  ];\n}\n\nclass Tremolo extends Modulation {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 59,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxrate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 63,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxdepth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass PH100 extends Modulation {\n  @override\n  final name = \"PH 100\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar1rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar2depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n\nclass CE1 extends Modulation {\n  @override\n  final name = \"CE-1\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"mix\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar1rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 88,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar2depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar3mix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n\nclass STChorusv2 extends Modulation {\n  @override\n  final name = \"ST Chorus\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"mix\",\n        value: 36,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar1rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Width\",\n        handle: \"depth\",\n        value: 74,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar2depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar3mix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n\nclass SCF extends Modulation {\n  @override\n  final name = \"SCF\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"rate\",\n        value: 56,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar1rate,\n        midiCC: MidiCCValues.bCC_ModfxRate,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Width\",\n        handle: \"depth\",\n        value: 68,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar2depth,\n        midiCC: MidiCCValues.bCC_ModfxDepth,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"mix\",\n        value: 80,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.modfxvar3mix,\n        midiCC: MidiCCValues.bCC_ChorusLevel,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_air/Reverb.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../NuxMightyPlugAir.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Reverb extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugAir.reverbtype;\n  @override\n  int? get nuxEnableIndex => PresetDataIndexPlugAir.reverbenable;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValues.bCC_ReverbEnable;\n  @override\n  int get midiCCSelectionValue => MidiCCValues.bCC_ReverbMode;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.reverbOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.reverbOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.reverbToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.reverbPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.reverbNext;\n}\n\nclass RoomReverb extends Reverb {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 64,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 60,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass HallReverb extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 65,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass PlateReverb extends Reverb {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Damp\",\n        handle: \"damp\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbdamp,\n        midiCC: MidiCCValues.bCC_ReverbRouting,\n        midiControllerHandle: MidiControllerHandles.reverbTone),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass SpringReverb extends Reverb {\n  @override\n  final name = \"Spring\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 32,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar1decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar2damp,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n\nclass ShimmerReverb extends Reverb {\n  @override\n  final name = \"Shimmer Reverb\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbdecay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbmix,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n  @override\n  int? getEquivalentEffect(int version) {\n    if (version == PlugAirVersion.PlugAir21.index)\n      return SpringReverb().nuxIndex;\n    return nuxIndex;\n  }\n}\n\nclass RoomReverbv2 extends Reverb {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 0;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 35,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar1decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 25,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar2damp,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar3mix,\n        midiCC: MidiCCValues.bCC_ReverbRouting,\n        midiControllerHandle: MidiControllerHandles.reverbTone)\n  ];\n}\n\nclass HallReverbv2 extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 70,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar1decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 45,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar2damp,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Damp\",\n        handle: \"damp\",\n        value: 85,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar3mix,\n        midiCC: MidiCCValues.bCC_ReverbRouting,\n        midiControllerHandle: MidiControllerHandles.reverbTone)\n  ];\n}\n\nclass PlateReverbv2 extends Reverb {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 81,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar1decay,\n        midiCC: MidiCCValues.bCC_ReverbDecay,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 66,\n        formatter: ValueFormatters.percentage,\n        devicePresetIndex: PresetDataIndexPlugAir.reverbvar2damp,\n        midiCC: MidiCCValues.bCC_ReverbLevel,\n        midiControllerHandle: MidiControllerHandles.reverbMix)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Amps.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/MidiControllerHandles.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../Processor.dart';\nimport 'Cabinet.dart';\n\nabstract class PlugProAmplifier extends Amplifier {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iAMP;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iAMP;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iAMP;\n  @override\n  int get defaultCab;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.ampOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.ampOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.ampToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.ampPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.ampNext;\n}\n\nclass JazzClean extends PlugProAmplifier {\n  @override\n  final name = \"Jazz Clean\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  int get defaultCab => JZ120Pro.cabIndex;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Guitar\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"bright\",\n        value: 1,\n        formatter: ValueFormatters.brightModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass DeluxeRvb extends PlugProAmplifier {\n  @override\n  final name = \"Deluxe Rvb\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  int get defaultCab => DR112Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n\nclass BassMate extends PlugProAmplifier {\n  @override\n  final name = \"Bass Mate\";\n\n  @override\n  int get defaultCab => BS410.cabIndex;\n  @override\n  int get nuxIndex => 3;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Bass\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 85,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 100,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Tweedy extends PlugProAmplifier {\n  @override\n  final name = \"Tweedy\";\n\n  @override\n  int get defaultCab => DR112Pro.cabIndex;\n  @override\n  int get nuxIndex => 4;\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Guitar\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 78,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass HiWire extends PlugProAmplifier {\n  @override\n  final name = \"Hiwire\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  int get defaultCab => HIWIRE412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 76,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 75,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 62,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 54,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass CaliCrunch extends PlugProAmplifier {\n  @override\n  final name = \"Cali Crunch\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  int get defaultCab => CALI112.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 92,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 42,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 59,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 66,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 49,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass ClassA15 extends PlugProAmplifier {\n  @override\n  final name = \"Class A15\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  int get defaultCab => A112.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass ClassA30 extends PlugProAmplifier {\n  @override\n  final name = \"Class A30\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  int get defaultCab => A212Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Plexi100 extends PlugProAmplifier {\n  @override\n  final name = \"Plexi 100\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  int get defaultCab => GB412Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 71,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 66,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 62,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 53,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 67,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Plexi45 extends PlugProAmplifier {\n  @override\n  final name = \"Plexi 45\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  int get defaultCab => GB412Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 26,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 53,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 62,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 53,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 67,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Brit800 extends PlugProAmplifier {\n  @override\n  final name = \"Brit 800\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  int get defaultCab => M1960AV.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 81,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 71,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 58,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Pl1987x50 extends PlugProAmplifier {\n  @override\n  final name = \"1987x50\";\n\n  @override\n  int get nuxIndex => 13;\n  @override\n  int get defaultCab => M1960TV.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 81,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 71,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 58,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Slo100 extends PlugProAmplifier {\n  @override\n  final name = \"Slo 100\";\n\n  @override\n  int get nuxIndex => 14;\n  @override\n  int get defaultCab => SLO412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 81,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 71,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 58,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass FiremanHBE extends PlugProAmplifier {\n  @override\n  final name = \"Fireman HBE\";\n\n  @override\n  int get nuxIndex => 15;\n  @override\n  int get defaultCab => FIREMAN412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 77,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass DualRect extends PlugProAmplifier {\n  @override\n  final name = \"Dual Rect\";\n\n  @override\n  int get nuxIndex => 16;\n  @override\n  int get defaultCab => RECT412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass DIEVH4 extends PlugProAmplifier {\n  @override\n  final name = \"DIE VH4\";\n\n  @override\n  int get nuxIndex => 17;\n  @override\n  int get defaultCab => DIE412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 72,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 41,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 64,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 51,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass MrZ38 extends PlugProAmplifier {\n  @override\n  final name = \"Mr. Z38\";\n\n  @override\n  int get nuxIndex => 20;\n  @override\n  int get defaultCab => Z212.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 44,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 81,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 71,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 58,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass SuperRvb extends PlugProAmplifier {\n  @override\n  final name = \"Super Rvb\";\n\n  @override\n  int get nuxIndex => 21;\n  @override\n  int get defaultCab => SUPERVERB410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"bright\",\n        value: 1,\n        formatter: ValueFormatters.brightModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass AGL extends PlugProAmplifier {\n  @override\n  final name = \"AGL\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Bass\";\n\n  @override\n  int get nuxIndex => 26;\n  @override\n  int get defaultCab => AGLDB810.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 61,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 89,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 72,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6, //check this\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 63,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n\nclass MLD extends PlugProAmplifier {\n  @override\n  final name = \"MLD\";\n\n  @override\n  int get nuxIndex => 27;\n  @override\n  int get defaultCab => MKB410.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 91,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 59,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Mid Freq\",\n        handle: \"mid_freq\",\n        value: 63,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 61,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n\nclass OptimaAir extends PlugProAmplifier {\n  @override\n  final name = \"Optima Air\";\n\n  @override\n  bool isSeparator = true;\n  @override\n  String category = \"Acoustic\";\n\n  @override\n  int get nuxIndex => 28;\n  @override\n  int get defaultCab => GJ15Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 72,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 100,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n\nclass Stageman extends PlugProAmplifier {\n  @override\n  final name = \"Stageman\";\n\n  @override\n  int get nuxIndex => 29;\n  @override\n  int get defaultCab => MD45Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 90,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n  ];\n}\n\nclass TwinRvb extends PlugProAmplifier {\n  @override\n  final name = \"Twin Reverb\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  int get defaultCab => TR212Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"bright\",\n        value: 1,\n        formatter: ValueFormatters.brightModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass VibroKing extends PlugProAmplifier {\n  @override\n  final name = \"Vibro King\";\n\n  @override\n  int get nuxIndex => 18;\n  @override\n  int get defaultCab => VIBROKING310.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Bright\",\n        handle: \"bright\",\n        value: 1,\n        formatter: ValueFormatters.brightModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Budda extends PlugProAmplifier {\n  @override\n  final name = \"Budda\";\n\n  @override\n  int get nuxIndex => 19;\n  @override\n  int get defaultCab => BUDDA112.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass BritBlues extends PlugProAmplifier {\n  @override\n  final name = \"Brit Blues\";\n\n  @override\n  int get nuxIndex => 22;\n  @override\n  int get defaultCab => GB412Pro.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass MatchD30 extends PlugProAmplifier {\n  @override\n  final name = \"Match D30\";\n\n  @override\n  int get nuxIndex => 23;\n  @override\n  int get defaultCab => MATCH212.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Cut\",\n        handle: \"cut\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass Brit2000 extends PlugProAmplifier {\n  @override\n  final name = \"Brit 2000\";\n\n  @override\n  int get nuxIndex => 24;\n  @override\n  int get defaultCab => M1960AV.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n\nclass UberHiGain extends PlugProAmplifier {\n  @override\n  final name = \"Uber HiGain\";\n\n  @override\n  int get nuxIndex => 25;\n  @override\n  int get defaultCab => UBER412.cabIndex;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para1,\n        midiCC: MidiCCValuesPro.AMP_Para1,\n        midiControllerHandle: MidiControllerHandles.ampGain),\n    Parameter(\n        name: \"Master\",\n        handle: \"master\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        masterVolume: true,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para2,\n        midiCC: MidiCCValuesPro.AMP_Para2,\n        midiControllerHandle: MidiControllerHandles.ampVolume),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para3,\n        midiCC: MidiCCValuesPro.AMP_Para3,\n        midiControllerHandle: MidiControllerHandles.ampBass),\n    Parameter(\n        name: \"Middle\",\n        handle: \"mid\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para4,\n        midiCC: MidiCCValuesPro.AMP_Para4,\n        midiControllerHandle: MidiControllerHandles.ampMiddle),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para5,\n        midiCC: MidiCCValuesPro.AMP_Para5,\n        midiControllerHandle: MidiControllerHandles.ampTreble),\n    Parameter(\n        name: \"Presence\",\n        handle: \"presence\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.AMP_Para6,\n        midiCC: MidiCCValuesPro.AMP_Para6,\n        midiControllerHandle: MidiControllerHandles.ampTone),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Cabinet.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:core';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class CabinetPro extends Cabinet {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iCAB;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iCAB;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iCAB;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.cabOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.cabOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.cabToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.cabPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.cabNext;\n\n  @override\n  String get name => cabName;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        devicePresetIndex: PresetDataIndexPlugPro.CAB_Para4,\n        name: \"Level\",\n        handle: \"level\",\n        value: 0,\n        formatter: ValueFormatters.decibelMPPro,\n        midiCC: MidiCCValuesPro.CAB_Para4,\n        midiControllerHandle: MidiControllerHandles.cabLevel),\n    Parameter(\n        devicePresetIndex: PresetDataIndexPlugPro.CAB_Para5,\n        name: \"Low Cut\",\n        handle: \"lowcut\",\n        value: 20,\n        formatter: ValueFormatters.lowFreqFormatter,\n        midiCC: MidiCCValuesPro.CAB_Para5,\n        midiControllerHandle: MidiControllerHandles.cabLoCut),\n    Parameter(\n        devicePresetIndex: PresetDataIndexPlugPro.CAB_Para6,\n        name: \"High Cut\",\n        handle: \"hicut\",\n        value: 100,\n        formatter: ValueFormatters.highFreqFormatter,\n        midiCC: MidiCCValuesPro.CAB_Para6,\n        midiControllerHandle: MidiControllerHandles.cabHiCut)\n  ];\n}\n\nclass JZ120Pro extends CabinetPro {\n  @override\n  bool get isSeparator => true;\n  @override\n  String get category => \"Electric IR\";\n  @override\n  final cabName = \"JZ120\";\n  static int get cabIndex => 1;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass DR112Pro extends CabinetPro {\n  @override\n  final cabName = \"DR112\";\n  static int get cabIndex => 2;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass TR212Pro extends CabinetPro {\n  @override\n  final cabName = \"TR212\";\n  static int get cabIndex => 3;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass HIWIRE412 extends CabinetPro {\n  @override\n  final cabName = \"HIWIRE412\";\n  static int get cabIndex => 4;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass CALI112 extends CabinetPro {\n  @override\n  final cabName = \"CALI 112\";\n  static int get cabIndex => 5;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass A112 extends CabinetPro {\n  @override\n  final cabName = \"A112\";\n  @override\n  int get nuxIndex => cabIndex;\n  static int get cabIndex => 6;\n}\n\nclass GB412Pro extends CabinetPro {\n  @override\n  final cabName = \"GB412\";\n  static int get cabIndex => 7;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass M1960AX extends CabinetPro {\n  @override\n  final cabName = \"M1960AX\";\n  static int get cabIndex => 8;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass M1960AV extends CabinetPro {\n  @override\n  final cabName = \"M1960AV\";\n  static int get cabIndex => 9;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass M1960TV extends CabinetPro {\n  @override\n  final cabName = \"M1960TV\";\n  static int get cabIndex => 10;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass SLO412 extends CabinetPro {\n  @override\n  final cabName = \"SLO412\";\n  static int get cabIndex => 11;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass FIREMAN412 extends CabinetPro {\n  @override\n  final cabName = \"FIREMAN 412\";\n  static int get cabIndex => 12;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass RECT412 extends CabinetPro {\n  @override\n  final cabName = \"RECT 412\";\n  static int get cabIndex => 13;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass DIE412 extends CabinetPro {\n  @override\n  final cabName = \"DIE412\";\n  static int get cabIndex => 14;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MATCH212 extends CabinetPro {\n  @override\n  final cabName = \"MATCH212\";\n  static int get cabIndex => 15;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass UBER412 extends CabinetPro {\n  @override\n  final cabName = \"UBER412\";\n  static int get cabIndex => 16;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass BS410 extends CabinetPro {\n  @override\n  final cabName = \"BS410\";\n  static int get cabIndex => 17;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass A212Pro extends CabinetPro {\n  @override\n  final cabName = \"A212\";\n  static int get cabIndex => 18;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass M1960AHW extends CabinetPro {\n  @override\n  final cabName = \"M1960AHW\";\n  static int get cabIndex => 19;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass M1936 extends CabinetPro {\n  @override\n  final cabName = \"M1936\";\n  static int get cabIndex => 20;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass BUDDA112 extends CabinetPro {\n  @override\n  final cabName = \"BUDDA112\";\n  static int get cabIndex => 21;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass Z212 extends CabinetPro {\n  @override\n  final cabName = \"Z212\";\n  static int get cabIndex => 22;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass SUPERVERB410 extends CabinetPro {\n  @override\n  final cabName = \"SUPERVERB410\";\n  static int get cabIndex => 23;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass VIBROKING310 extends CabinetPro {\n  @override\n  final cabName = \"VIBROKING310\";\n  static int get cabIndex => 24;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\n//Bass amps\nclass AGLDB810 extends CabinetPro {\n  @override\n  bool get isSeparator => true;\n  @override\n  String get category => \"Bass IR\";\n  @override\n  final cabName = \"AGL_DB810\";\n  static int get cabIndex => 25;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass AMPSV212 extends CabinetPro {\n  @override\n  final cabName = \"AMP_SV212\";\n  static int get cabIndex => 26;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass AMPSV410 extends CabinetPro {\n  @override\n  final cabName = \"AMP_SV410\";\n  static int get cabIndex => 27;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass AMPSV810 extends CabinetPro {\n  @override\n  final cabName = \"AMP_SV810\";\n  static int get cabIndex => 28;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass BASSGUY410 extends CabinetPro {\n  @override\n  final cabName = \"BASSGUY410\";\n  static int get cabIndex => 29;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass EDEN410 extends CabinetPro {\n  @override\n  final cabName = \"EDEN410\";\n  static int get cabIndex => 30;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MKB410 extends CabinetPro {\n  @override\n  final cabName = \"MKB410\";\n  static int get cabIndex => 31;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GHBIRDPro extends CabinetPro {\n  @override\n  bool get isSeparator => true;\n  @override\n  String get category => \"Acoustic IR\";\n  @override\n  final cabName = \"G-HBIRD\";\n  static int get cabIndex => 32;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass GJ15Pro extends CabinetPro {\n  @override\n  final cabName = \"G-J15\";\n  static int get cabIndex => 33;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass MD45Pro extends CabinetPro {\n  @override\n  final cabName = \"M-D45\";\n  static int get cabIndex => 34;\n  @override\n  int get nuxIndex => cabIndex;\n}\n\nclass UserCab extends CabinetPro {\n  String _cabinetName = \"...\";\n  late int _nuxIndex;\n  @override\n  String get cabName => _cabinetName;\n\n  @override\n  int get nuxIndex => _nuxIndex;\n\n  void setName(String name) {\n    _cabinetName = name;\n  }\n\n  void setNuxIndex(int index) {\n    _nuxIndex = index;\n  }\n\n  void setActive(bool active) {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Compressor.dart",
    "content": "// (c) 2020-2022 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Compressor extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iCMP;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iCMP;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iCMP;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.compOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.compOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.compToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.compPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.compNext;\n}\n\nclass RoseCompPro extends Compressor {\n  @override\n  final name = \"Rose Comp\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para2,\n        midiCC: MidiCCValuesPro.CMP_Para2,\n        midiControllerHandle: MidiControllerHandles.compLevel),\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para1,\n        midiCC: MidiCCValuesPro.CMP_Para1,\n        midiControllerHandle: MidiControllerHandles.compSustain),\n  ];\n}\n\nclass KComp extends Compressor {\n  @override\n  final name = \"K Comp\";\n\n  @override\n  int get nuxIndex => 2;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para2,\n        midiCC: MidiCCValuesPro.CMP_Para2,\n        midiControllerHandle: MidiControllerHandles.compLevel),\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para1,\n        midiCC: MidiCCValuesPro.CMP_Para1,\n        midiControllerHandle: MidiControllerHandles.compSustain),\n    Parameter(\n        name: \"Clipping\",\n        handle: \"clipping\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para3,\n        midiCC: MidiCCValuesPro.CMP_Para3,\n        midiControllerHandle: MidiControllerHandles.compThreshold),\n  ];\n}\n\nclass StudioComp extends Compressor {\n  @override\n  final name = \"Studio Comp\";\n\n  @override\n  int get nuxIndex => 3;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para3,\n        midiCC: MidiCCValuesPro.CMP_Para3,\n        midiControllerHandle: MidiControllerHandles.compLevel),\n    Parameter(\n        name: \"Threshold\",\n        handle: \"threshold\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para1,\n        midiCC: MidiCCValuesPro.CMP_Para1,\n        midiControllerHandle: MidiControllerHandles.compThreshold),\n    Parameter(\n        name: \"Ratio\",\n        handle: \"ratio\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para2,\n        midiCC: MidiCCValuesPro.CMP_Para2,\n        midiControllerHandle: MidiControllerHandles.compRatio),\n    Parameter(\n        name: \"Release\",\n        handle: \"release\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.CMP_Para4,\n        midiCC: MidiCCValuesPro.CMP_Para4,\n        midiControllerHandle: MidiControllerHandles.compSustain)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Delay.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class DelayPro extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iDLY;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iDLY;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iDLY;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.delayOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.delayOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.delayToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.delayPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.delayNext;\n}\n\nclass AnalogDelay extends DelayPro {\n  @override\n  final name = \"Analog\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"echo\",\n        value: 45,\n        formatter: ValueFormatters.tempoProAnalog,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 34,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n  ];\n}\n\nclass AnalogDelayV2 extends DelayPro {\n  @override\n  final name = \"Analog\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 52,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 34,\n        formatter: ValueFormatters.tempoProAnalog,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Echo\",\n        handle: \"echo\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat)\n  ];\n}\n\nclass DigitalDelay extends DelayPro {\n  @override\n  final name = \"Digital Delay\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"E.Level\",\n        handle: \"level\",\n        value: 49,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 48,\n        formatter: ValueFormatters.tempoPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Feedback\",\n        handle: \"feedback\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n  ];\n}\n\nclass ModDelay extends DelayPro {\n  @override\n  final name = \"Modulation\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 49,\n        formatter: ValueFormatters.tempoProMod,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 48,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para4,\n        midiCC: MidiCCValuesPro.DLY_Para4,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mod\",\n        handle: \"mod\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayMod),\n  ];\n}\n\nclass TapeEcho extends DelayPro {\n  @override\n  final name = \"Tape Echo\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 43,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 61,\n        formatter: ValueFormatters.tempoProTapeEcho,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 56,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n  ];\n}\n\nclass PanDelay extends DelayPro {\n  @override\n  final name = \"Pan Delay\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 50,\n        formatter: ValueFormatters.tempoPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n  ];\n}\n\nclass PhiDelayPro extends DelayPro {\n  @override\n  final name = \"Phi Delay\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Time\",\n        handle: \"time\",\n        value: 50,\n        formatter: ValueFormatters.tempoPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para1,\n        midiCC: MidiCCValuesPro.DLY_Para1,\n        midiControllerHandle: MidiControllerHandles.delayTime),\n    Parameter(\n        name: \"Repeat\",\n        handle: \"repeat\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para2,\n        midiCC: MidiCCValuesPro.DLY_Para2,\n        midiControllerHandle: MidiControllerHandles.delayRepeat),\n    Parameter(\n        name: \"Mix\",\n        handle: \"level\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.DLY_Para3,\n        midiCC: MidiCCValuesPro.DLY_Para3,\n        midiControllerHandle: MidiControllerHandles.delayLevel),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/EFX.dart",
    "content": "// (c) 2020-2022 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class EFXPro extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iEFX;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iEFX;\n\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iEFX;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.efxOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.efxOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.efxToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.efxPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.efxNext;\n}\n\nclass DistortionPlus extends EFXPro {\n  @override\n  final name = \"Distortion+\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Output\",\n        handle: \"output\",\n        value: 75,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Sensitivity\",\n        handle: \"sensitivity\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n  ];\n}\n\nclass RCBoost extends EFXPro {\n  @override\n  final name = \"RC Boost\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxBass),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para4,\n        midiCC: MidiCCValuesPro.EFX_Para4,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass ACBoost extends EFXPro {\n  @override\n  final name = \"AC Boost\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Bass\",\n        handle: \"bass\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxBass),\n    Parameter(\n        name: \"Treble\",\n        handle: \"treble\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para4,\n        midiCC: MidiCCValuesPro.EFX_Para4,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass DistOne extends EFXPro {\n  @override\n  final name = \"Dist One\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass TSDrive extends EFXPro {\n  @override\n  final name = \"T Screamer\";\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 55,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass BluesDrive extends EFXPro {\n  @override\n  final name = \"Blues Drive\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass MorningDrive extends EFXPro {\n  @override\n  final name = \"Morning Drive\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass EatDist extends EFXPro {\n  @override\n  final name = \"Eat Dist\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Distortion\",\n        handle: \"distortion\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Filter\",\n        handle: \"filter\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass RedDirt extends EFXPro {\n  @override\n  final name = \"Red Dirt\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Drive\",\n        handle: \"drive\",\n        value: 65,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass Crunch extends EFXPro {\n  @override\n  final name = \"Crunch\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 25,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass MuffFuzz extends EFXPro {\n  @override\n  final name = \"Muff Fuzz\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Sustain\",\n        handle: \"sustain\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxDepth),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass Katana extends EFXPro {\n  @override\n  final name = \"Katana\";\n\n  @override\n  int get nuxIndex => 12;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 45,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Boost\",\n        handle: \"boost\",\n        value: 0,\n        formatter: ValueFormatters.boostModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1),\n  ];\n}\n\nclass STSinger extends EFXPro {\n  @override\n  final name = \"ST Singer\";\n\n  @override\n  int get nuxIndex => 13;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Gain\",\n        handle: \"gain\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Filter\",\n        handle: \"filter\",\n        value: 40,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxTone),\n  ];\n}\n\nclass TouchWahPro extends EFXPro {\n  @override\n  int get nuxIndex => 14;\n\n  @override\n  final name = \"Touch Wah\";\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Type\",\n        handle: \"type\",\n        value: 1,\n        formatter: ValueFormatters.touchWahFormatterLiteMk2,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para1,\n        midiCC: MidiCCValuesPro.EFX_Para1),\n    Parameter(\n        name: \"Wow\",\n        handle: \"wow\",\n        value: 35,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para2,\n        midiCC: MidiCCValuesPro.EFX_Para2,\n        midiControllerHandle: MidiControllerHandles.efxGain),\n    Parameter(\n        name: \"Sense\",\n        handle: \"sense\",\n        value: 90,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para3,\n        midiCC: MidiCCValuesPro.EFX_Para3,\n        midiControllerHandle: MidiControllerHandles.efxRate),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 100,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para5,\n        midiCC: MidiCCValuesPro.EFX_Para5,\n        midiControllerHandle: MidiControllerHandles.efxLevel),\n    Parameter(\n        name: \"Up/Down Switch\",\n        handle: \"direction\",\n        value: 0,\n        formatter: ValueFormatters.touchWahDirectionFormatterPro,\n        devicePresetIndex: PresetDataIndexPlugPro.EFX_Para4,\n        midiCC: MidiCCValuesPro.EFX_Para4),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/EQ.dart",
    "content": "// (c) 2020-2022 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class EQ extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iEQ;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.EQ;\n\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iEQ;\n\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iEQ;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.eqOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.eqOn;\n  @override\n  MidiControllerHandle? get midiControlToggle => MidiControllerHandles.eqToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.eqPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.eqNext;\n}\n\nclass EQSixBand extends EQ {\n  @override\n  final name = \"6-Band\";\n\n  @override\n  int get nuxIndex => 1;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"100\",\n        handle: \"eq_p1\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para1,\n        midiCC: MidiCCValuesPro.EQ_Para1),\n    Parameter(\n        name: \"220\",\n        handle: \"eq_p2\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para2,\n        midiCC: MidiCCValuesPro.EQ_Para2),\n    Parameter(\n        name: \"500\",\n        handle: \"eq_p3\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para3,\n        midiCC: MidiCCValuesPro.EQ_Para3),\n    Parameter(\n        name: \"1.2K\",\n        handle: \"eq_p4\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para4,\n        midiCC: MidiCCValuesPro.EQ_Para4),\n    Parameter(\n        name: \"2.6K\",\n        handle: \"eq_p5\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para5,\n        midiCC: MidiCCValuesPro.EQ_Para5),\n    Parameter(\n        name: \"6.4K\",\n        handle: \"eq_p6\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para6,\n        midiCC: MidiCCValuesPro.EQ_Para6),\n  ];\n}\n\nclass EQTenBand extends EQ {\n  @override\n  final name = \"10-Band\";\n\n  @override\n  int get nuxIndex => 3;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Vol\",\n        handle: \"eq_vol\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para1,\n        midiCC: MidiCCValuesPro.EQ_Para1),\n    Parameter(\n        name: \"31\",\n        handle: \"eq_b1\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para2,\n        midiCC: MidiCCValuesPro.EQ_Para2),\n    Parameter(\n        name: \"62\",\n        handle: \"eq_b2\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para3,\n        midiCC: MidiCCValuesPro.EQ_Para3),\n    Parameter(\n        name: \"125\",\n        handle: \"eq_b3\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para4,\n        midiCC: MidiCCValuesPro.EQ_Para4),\n    Parameter(\n        name: \"250\",\n        handle: \"eq_b4\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para5,\n        midiCC: MidiCCValuesPro.EQ_Para5),\n    Parameter(\n        name: \"500\",\n        handle: \"eq_b5\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para6,\n        midiCC: MidiCCValuesPro.EQ_Para6),\n    Parameter(\n        name: \"1K\",\n        handle: \"eq_b6\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para7,\n        midiCC: MidiCCValuesPro.EQ_Para7),\n    Parameter(\n        name: \"2K\",\n        handle: \"eq_b7\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para8,\n        midiCC: MidiCCValuesPro.EQ_Para8),\n    Parameter(\n        name: \"4K\",\n        handle: \"eq_b8\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para9,\n        midiCC: MidiCCValuesPro.EQ_Para9),\n    Parameter(\n        name: \"8K\",\n        handle: \"eq_b9\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para10,\n        midiCC: MidiCCValuesPro.EQ_Para10),\n    Parameter(\n        name: \"16K\",\n        handle: \"eq_b10\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para11,\n        midiCC: MidiCCValuesPro.EQ_Para11),\n  ];\n}\n\nclass EQTenBandBT extends EQ {\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Vol\",\n        handle: \"eq_vol\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para1,\n        midiCC: MidiCCValuesPro.AUX_BAND_1),\n    Parameter(\n        name: \"31\",\n        handle: \"eq_b1\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para2,\n        midiCC: MidiCCValuesPro.AUX_BAND_2),\n    Parameter(\n        name: \"62\",\n        handle: \"eq_b2\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para3,\n        midiCC: MidiCCValuesPro.AUX_BAND_3),\n    Parameter(\n        name: \"125\",\n        handle: \"eq_b3\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para4,\n        midiCC: MidiCCValuesPro.AUX_BAND_4),\n    Parameter(\n        name: \"250\",\n        handle: \"eq_b4\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para5,\n        midiCC: MidiCCValuesPro.AUX_BAND_5),\n    Parameter(\n        name: \"500\",\n        handle: \"eq_b5\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para6,\n        midiCC: MidiCCValuesPro.AUX_BAND_6),\n    Parameter(\n        name: \"1K\",\n        handle: \"eq_b6\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para7,\n        midiCC: MidiCCValuesPro.AUX_BAND_7),\n    Parameter(\n        name: \"2K\",\n        handle: \"eq_b7\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para8,\n        midiCC: MidiCCValuesPro.AUX_BAND_8),\n    Parameter(\n        name: \"4K\",\n        handle: \"eq_b8\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para9,\n        midiCC: MidiCCValuesPro.AUX_BAND_9),\n    Parameter(\n        name: \"8K\",\n        handle: \"eq_b9\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para10,\n        midiCC: MidiCCValuesPro.AUX_BAND_10),\n    Parameter(\n        name: \"16K\",\n        handle: \"eq_b10\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para11,\n        midiCC: MidiCCValuesPro.AUX_BAND_11),\n  ];\n\n  //TODO: this might not be needed\n  List<int> getNuxCommand() {\n    List<int> data = [];\n\n    for (int i = 0; i < parameters.length; i++) {\n      data.add(parameters[i].midiValue);\n    }\n    return data;\n  }\n\n  @override\n  void setupFromNuxPayload(List<int> nuxData) {\n    for (int i = 0; i < parameters.length; i++) {\n      parameters[i].midiValue = nuxData[i];\n    }\n  }\n\n  @override\n  String get name => \"Bluetooth EQ\";\n\n  @override\n  int get nuxIndex => 0;\n}\n\nclass EQTenBandSpeaker extends EQ {\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Vol\",\n        handle: \"eq_vol\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para1,\n        midiCC: MidiCCValuesPro.SPK_EQ_VOL),\n    Parameter(\n        name: \"31\",\n        handle: \"eq_b1\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para2,\n        midiCC: MidiCCValuesPro.SPK_EQ_1),\n    Parameter(\n        name: \"62\",\n        handle: \"eq_b2\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para3,\n        midiCC: MidiCCValuesPro.SPK_EQ_2),\n    Parameter(\n        name: \"125\",\n        handle: \"eq_b3\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para4,\n        midiCC: MidiCCValuesPro.SPK_EQ_3),\n    Parameter(\n        name: \"250\",\n        handle: \"eq_b4\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para5,\n        midiCC: MidiCCValuesPro.SPK_EQ_4),\n    Parameter(\n        name: \"500\",\n        handle: \"eq_b5\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para6,\n        midiCC: MidiCCValuesPro.SPK_EQ_5),\n    Parameter(\n        name: \"1K\",\n        handle: \"eq_b6\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para7,\n        midiCC: MidiCCValuesPro.SPK_EQ_6),\n    Parameter(\n        name: \"2K\",\n        handle: \"eq_b7\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para8,\n        midiCC: MidiCCValuesPro.SPK_EQ_7),\n    Parameter(\n        name: \"4K\",\n        handle: \"eq_b8\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para9,\n        midiCC: MidiCCValuesPro.SPK_EQ_8),\n    Parameter(\n        name: \"8K\",\n        handle: \"eq_b9\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para10,\n        midiCC: MidiCCValuesPro.SPK_EQ_9),\n    Parameter(\n        name: \"16K\",\n        handle: \"eq_b10\",\n        value: 0,\n        formatter: ValueFormatters.decibelEQ,\n        devicePresetIndex: PresetDataIndexPlugPro.EQ_Para11,\n        midiCC: MidiCCValuesPro.SPK_EQ_10),\n  ];\n\n  //TODO: this might not be needed\n  List<int> getNuxCommand() {\n    List<int> data = [];\n\n    for (int i = 0; i < parameters.length; i++) {\n      data.add(parameters[i].midiValue);\n    }\n    return data;\n  }\n\n  @override\n  void setupFromNuxPayload(List<int> nuxData) {\n    for (int i = 0; i < parameters.length; i++) {\n      parameters[i].midiValue = nuxData[i];\n    }\n  }\n\n  @override\n  String get name => \"Speaker EQ\";\n\n  @override\n  int get nuxIndex => 0;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/EmptyEffects.dart",
    "content": "import '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nclass WahDummyPro extends Processor {\n  @override\n  final name = \"Wah\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iWAH;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iWAH;\n\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iWAH;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => null;\n  @override\n  MidiControllerHandle? get midiControlOn => null;\n  @override\n  MidiControllerHandle? get midiControlToggle => null;\n  @override\n  MidiControllerHandle? get midiControlPrev => null;\n  @override\n  MidiControllerHandle? get midiControlNext => null;\n\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Param1\",\n        handle: \"param1\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.WAH_Para1,\n        midiCC: MidiCCValuesPro.CC_Unknown),\n    Parameter(\n        name: \"Param2\",\n        handle: \"param2\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.WAH_Para2,\n        midiCC: MidiCCValuesPro.CC_Unknown),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Modulation.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/MidiControllerHandles.dart';\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../Processor.dart';\n\nabstract class Modulation extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iMOD;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  //row 1247: 0-phaser, 1-chorus, 2-Stereo chorus, 3-Flanger, 4-Vibe, 5-Tremolo\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iMOD;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iMOD;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.modOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.modOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.modToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.modPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.modNext;\n}\n\nclass ModCE1 extends Modulation {\n  @override\n  final name = \"CE-1\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 39,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 32,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass ModCE2 extends Modulation {\n  @override\n  final name = \"CE-2\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass STChorusPro extends Modulation {\n  @override\n  final name = \"ST Chorus\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Width\",\n        handle: \"width\",\n        value: 36,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 74,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass Vibrato extends Modulation {\n  @override\n  final name = \"Vibrato\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 56,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 68,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth)\n  ];\n}\n\nclass Detune extends Modulation {\n  @override\n  final name = \"Detune\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Shift-L\",\n        handle: \"shift_l\",\n        value: 54,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Shift-R\",\n        handle: \"shift_r\",\n        value: 0,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass FlangerPro extends Modulation {\n  @override\n  final name = \"Flanger\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 59,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Width\",\n        handle: \"width\",\n        value: 63,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 59,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Feedback\",\n        handle: \"feedback\",\n        value: 63,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para4,\n        midiCC: MidiCCValuesPro.MOD_Para4),\n  ];\n}\n\nclass Phase90 extends Modulation {\n  @override\n  final name = \"Phase 90\";\n\n  @override\n  int get nuxIndex => 7;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"speed\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n  ];\n}\n\nclass Phase100 extends Modulation {\n  @override\n  final name = \"Phase 100\";\n\n  @override\n  int get nuxIndex => 8;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"speed\",\n        value: 39,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass SCFPro extends Modulation {\n  @override\n  final name = \"S.C.F.\";\n\n  @override\n  int get nuxIndex => 9;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"speed\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Width\",\n        handle: \"width\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para4,\n        midiCC: MidiCCValuesPro.MOD_Para4,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 1,\n        formatter: ValueFormatters.scfMode,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3),\n  ];\n}\n\nclass VibePro extends Modulation {\n  @override\n  final name = \"U-Vibe\";\n\n  @override\n  int get nuxIndex => 10;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"speed\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Volume\",\n        handle: \"volume\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Intensity\",\n        handle: \"intensity\",\n        value: 80,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Mode\",\n        handle: \"mode\",\n        value: 0,\n        formatter: ValueFormatters.vibeModePro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para4,\n        midiCC: MidiCCValuesPro.MOD_Para4),\n  ];\n}\n\nclass TremoloPro extends Modulation {\n  @override\n  final name = \"Tremolo\";\n\n  @override\n  int get nuxIndex => 11;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 15,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass Rotary extends Modulation {\n  @override\n  final name = \"Rotary\";\n\n  @override\n  int get nuxIndex => 12;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Speed\",\n        handle: \"speed\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Balance\",\n        handle: \"balance\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n\nclass SCH1Pro extends Modulation {\n  @override\n  final name = \"SCH-1\";\n\n  @override\n  int get nuxIndex => 13;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Rate\",\n        handle: \"rate\",\n        value: 30,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 70,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 60,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n  ];\n}\n\nclass MonoOctave extends Modulation {\n  @override\n  final name = \"Mono Octave\";\n\n  @override\n  int get nuxIndex => 14;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Sub\",\n        handle: \"sub\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para1,\n        midiCC: MidiCCValuesPro.MOD_Para1,\n        midiControllerHandle: MidiControllerHandles.modRate),\n    Parameter(\n        name: \"Dry\",\n        handle: \"dry\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para2,\n        midiCC: MidiCCValuesPro.MOD_Para2,\n        midiControllerHandle: MidiControllerHandles.modIntensity),\n    Parameter(\n        name: \"Up\",\n        handle: \"up\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.MOD_Para3,\n        midiCC: MidiCCValuesPro.MOD_Para3,\n        midiControllerHandle: MidiControllerHandles.modDepth),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/effects/plug_pro/Reverb.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport '../../NuxConstants.dart';\nimport '../../value_formatters/ValueFormatter.dart';\nimport '../MidiControllerHandles.dart';\nimport '../Processor.dart';\n\nabstract class Reverb extends Processor {\n  @override\n  int? get nuxEffectTypeIndex => PresetDataIndexPlugPro.Head_iRVB;\n  @override\n  int? get nuxEnableIndex => nuxEffectTypeIndex;\n  @override\n  int get nuxEnableMask => 0x40;\n  @override\n  bool get nuxEnableInverted => true;\n  @override\n  EffectEditorUI get editorUI => EffectEditorUI.Sliders;\n  @override\n  int get midiCCEnableValue => MidiCCValuesPro.Head_iRVB;\n  @override\n  int get midiCCSelectionValue => MidiCCValuesPro.Head_iRVB;\n\n  //MIDI foot controller stuff\n  @override\n  MidiControllerHandle? get midiControlOff => MidiControllerHandles.reverbOff;\n  @override\n  MidiControllerHandle? get midiControlOn => MidiControllerHandles.reverbOn;\n  @override\n  MidiControllerHandle? get midiControlToggle =>\n      MidiControllerHandles.reverbToggle;\n  @override\n  MidiControllerHandle? get midiControlPrev => MidiControllerHandles.reverbPrev;\n  @override\n  MidiControllerHandle? get midiControlNext => MidiControllerHandles.reverbNext;\n}\n\nclass RoomReverb extends Reverb {\n  @override\n  final name = \"Room\";\n\n  @override\n  int get nuxIndex => 1;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para3,\n        midiCC: MidiCCValuesPro.RVB_Para3,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Tone\",\n        handle: \"tone\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbTone),\n  ];\n}\n\nclass HallReverb extends Reverb {\n  @override\n  final name = \"Hall\";\n\n  @override\n  int get nuxIndex => 2;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para4,\n        midiCC: MidiCCValuesPro.RVB_Para4,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Pre Delay\",\n        handle: \"predelay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbTone),\n    Parameter(\n        name: \"Liveliness\",\n        handle: \"liveliness\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para3,\n        midiCC: MidiCCValuesPro.RVB_Para3),\n  ];\n}\n\nclass PlateReverb extends Reverb {\n  @override\n  final name = \"Plate\";\n\n  @override\n  int get nuxIndex => 3;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n  ];\n}\n\nclass SpringReverb extends Reverb {\n  @override\n  final name = \"Spring\";\n\n  @override\n  int get nuxIndex => 4;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Level\",\n        handle: \"level\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 32,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n  ];\n}\n\nclass ShimmerReverb extends Reverb {\n  @override\n  final name = \"Shimmer\";\n\n  @override\n  int get nuxIndex => 5;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Decay\",\n        handle: \"decay\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbDecay),\n    Parameter(\n        name: \"Shimmer\",\n        handle: \"shimmer\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para3,\n        midiCC: MidiCCValuesPro.RVB_Para3,\n        midiControllerHandle: MidiControllerHandles.reverbTone)\n  ];\n}\n\nclass DampReverbPro extends Reverb {\n  @override\n  final name = \"Damp\";\n\n  @override\n  int get nuxIndex => 6;\n  @override\n  List<Parameter> parameters = [\n    Parameter(\n        name: \"Mix\",\n        handle: \"mix\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para1,\n        midiCC: MidiCCValuesPro.RVB_Para1,\n        midiControllerHandle: MidiControllerHandles.reverbMix),\n    Parameter(\n        name: \"Depth\",\n        handle: \"depth\",\n        value: 50,\n        formatter: ValueFormatters.percentageMPPro,\n        devicePresetIndex: PresetDataIndexPlugPro.RVB_Para2,\n        midiCC: MidiCCValuesPro.RVB_Para2,\n        midiControllerHandle: MidiControllerHandles.reverbTone)\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/features/drumsTone.dart",
    "content": "enum DrumsToneControl { bass, middle, treble }\n\nabstract class DrumsTone {\n  double get drumsBass;\n  double get drumsMiddle;\n  double get drumsTreble;\n\n  void setDrumsTone(double value, DrumsToneControl control, bool send);\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/features/looper.dart",
    "content": "abstract class Looper {\n  int get loopState;\n  int get loopUndoState;\n  int get loopRecordMode;\n  double get loopLevel;\n\n  void looperRecordPlay();\n  void looperStop();\n  void looperClear();\n  void looperUndoRedo();\n  void looperLevel(int vol);\n  void looperNrAr(bool auto);\n  void requestLooperSettings();\n  Stream<LooperData> getLooperDataStream();\n}\n\nclass LooperData {\n  int loopState = 0;\n  int loopUndoState = 0;\n  int loopRecordMode = 0;\n  bool loopHasAudio = false;\n  double loopLevel = 50;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/features/proUsbSettings.dart",
    "content": "abstract class ProUsbSettings {\n  void setUsbMode(int mode);\n  void setUsbRecordingVol(int vol);\n  void setUsbPlaybackVol(int vol);\n  void setUsbDryWetVol(int vol);\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/features/tuner.dart",
    "content": "import 'dart:async';\n\nenum TunerMode {\n  chromatic(0),\n  guitarStandard(2),\n  guitarCompensated(1),\n  bass(3);\n\n  const TunerMode(this.mode);\n  final int mode;\n\n  static TunerMode? getByMode(int mode) {\n    for (TunerMode m in TunerMode.values) {\n      if (m.mode == mode) return m;\n    }\n    return null;\n  }\n}\n\nabstract class Tuner {\n  static const List<String> modesString = [\n    \"Chromatic\",\n    \"Guitar Standard\",\n    \"Guitar Compensated\",\n    \"Bass\"\n  ];\n\n  int get tunerStateCC;\n  int get tunerNoteCC;\n  int get tunerStringCC;\n  int get tunerPitchCC;\n\n  bool get tunerAvailable;\n  void tunerEnable(bool enable);\n  void tunerRequestSettings();\n  void tunerSetMode(TunerMode mode);\n  void tunerSetReferencePitch(int refPitch);\n  void tunerMute(bool enable);\n  Stream<TunerData> getTunerDataStream();\n  void notifyTunerListeners();\n}\n\nclass TunerData {\n  //TODO: this is not enabled but note on/note off\n  bool enabled = false;\n  bool muted = false;\n  int note = 0;\n  int stringNumber = 0;\n  int cents = 0;\n  int referencePitch = 10;\n  TunerMode mode = TunerMode.guitarStandard;\n\n  void clear() {\n    note = 0;\n    stringNumber = 0;\n    cents = 0;\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/Mighty8BTPreset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui';\n\nimport '../NuxDevice.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/mighty_8bt/Amps.dart';\nimport '../effects/mighty_8bt/Modulation.dart';\nimport '../effects/mighty_8bt/Delay.dart';\nimport '../effects/mighty_8bt/Reverb.dart';\nimport 'Preset.dart';\nimport 'preset_constants.dart';\n\nclass M8BTPreset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n  @override\n  int get qrDataLength => 40;\n  @override\n  Color get channelColor => PresetConstants.channelColorsPlug[channel];\n  final NoiseGate2Param noiseGate = NoiseGate2Param();\n  @override\n  final List<M8BTAmplifier> amplifierList = <M8BTAmplifier>[];\n  final List<Modulation> modulationList = <Modulation>[];\n  final List<Delay> delayList = <Delay>[];\n  final List<Reverb> reverbList = <Reverb>[];\n\n  bool noiseGateEnabled = true;\n  bool modulationEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedMod = 0;\n  int selectedDelay = 0;\n  int selectedReverb = 0;\n\n  M8BTPreset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    //modulation is available everywhere\n    modulationList.addAll([Phaser(), Chorus(), Tremolo(), Vibe()]);\n\n    amplifierList.addAll([AmpClean()]);\n\n    delayList.addAll([Delay1(), Delay2(), Delay3(), Delay4()]);\n\n    //reverb is available in all presets\n    reverbList\n        .addAll([RoomReverb(), HallReverb(), PlateReverb(), SpringReverb()]);\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    if (index == 1) return false;\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    switch (index) {\n      case 0:\n        return noiseGateEnabled;\n      case 2:\n        return modulationEnabled;\n      case 3:\n        return delayEnabled;\n      case 4:\n        return reverbEnabled;\n      default:\n        return true;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    switch (index) {\n      case 0:\n        noiseGateEnabled = value;\n        break;\n      case 2:\n        modulationEnabled = value;\n        break;\n      case 3:\n        delayEnabled = value;\n        break;\n      case 4:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return [noiseGate];\n      case 1:\n        return amplifierList;\n      case 2:\n        return modulationList;\n      case 3:\n        return delayList;\n      case 4:\n        return reverbList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return 0;\n      case 1:\n        return 0;\n      case 2:\n        return selectedMod;\n      case 3:\n        return selectedDelay;\n      case 4:\n        return selectedReverb;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    switch (slot) {\n      case 2:\n        selectedMod = index;\n        break;\n      case 3:\n        selectedDelay = index;\n        break;\n      case 4:\n        selectedReverb = index;\n        break;\n    }\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  @override\n  Color effectColor(int index) {\n    if (index != 1) {\n      return device.processorList[index].color;\n    } else {\n      return channelColor;\n    }\n  }\n\n  @override\n  setFirmwareVersion(int version) {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/MightyLitePreset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui';\n\nimport '../NuxDevice.dart';\nimport '../NuxFXID.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/lite/Amps.dart';\nimport '../effects/lite/Modulation.dart';\nimport '../effects/lite/Ambience.dart';\nimport 'Preset.dart';\nimport 'preset_constants.dart';\n\nclass MLitePreset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n  @override\n  int get qrDataLength => 40;\n  @override\n  Color get channelColor => PresetConstants.channelColorsPlug[channel];\n  final NoiseGate2Param noiseGate = NoiseGate2Param();\n  @override\n  final List<LiteAmplifier> amplifierList = <LiteAmplifier>[];\n  final List<Modulation> modulationList = <Modulation>[];\n  final List<Ambience> ambiList = <Ambience>[];\n\n  bool noiseGateEnabled = true;\n  bool modulationEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedMod = 0;\n  int selectedAmbience = 0;\n\n  MLitePreset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    //modulation is available everywhere\n    modulationList.addAll([Phaser(), Chorus(), Tremolo(), Vibe()]);\n\n    amplifierList.addAll([AmpClean()]);\n\n    ambiList.addAll([\n      Delay1(),\n      Delay2(),\n      Delay3(),\n      Delay4(),\n      RoomReverb(),\n      HallReverb(),\n      PlateReverb(),\n      SpringReverb()\n    ]);\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    if (index == 1) return false;\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    switch (index) {\n      case 0:\n        return noiseGateEnabled;\n      case 2:\n        return modulationEnabled;\n      case 3:\n        return delayEnabled;\n      case 4:\n        return reverbEnabled;\n      default:\n        return true;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    switch (index) {\n      case 0:\n        noiseGateEnabled = value;\n        break;\n      case 2:\n        modulationEnabled = value;\n        break;\n      case 3:\n        delayEnabled = value;\n        break;\n      case 4:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return [noiseGate];\n      case 1:\n        return amplifierList;\n      case 2:\n        return modulationList;\n      case 3:\n        return ambiList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return 0;\n      case 1:\n        return 0;\n      case 2:\n        return selectedMod;\n      case 3:\n        return selectedAmbience;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    switch (slot) {\n      case 2:\n        selectedMod = index;\n        break;\n      case 3:\n        selectedAmbience = index;\n        break;\n    }\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  @override\n  int getEffectArrayIndexFromNuxIndex(NuxFXID fxid, int nuxIndex) {\n    if (fxid == LiteFXID.ambience) {\n      for (int i = 0; i < ambiList.length; i++) {\n        if (ambiList[i].nuxIndex == nuxIndex) return i;\n      }\n    }\n    return nuxIndex;\n  }\n\n  @override\n  Color effectColor(int index) {\n    if (index != 1) {\n      return device.processorList[index].color;\n    } else {\n      return channelColor;\n    }\n  }\n\n  @override\n  setFirmwareVersion(int ver) {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/MightyMk2Preset.dart",
    "content": "// (c) 2020-2021 Dian Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/liteMk2Communication.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/liteMk2/delay.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/liteMk2/efx.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/liteMk2/reverb.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/presets/preset_constants.dart';\n\nimport '../NuxConstants.dart';\nimport '../NuxDevice.dart';\nimport '../NuxFXID.dart';\nimport '../NuxMightyLiteMk2.dart';\nimport '../communication/plugProCommunication.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/liteMk2/modulation.dart';\nimport '../effects/plug_pro/EFX.dart';\nimport '../effects/plug_pro/Amps.dart';\nimport '../effects/plug_pro/Cabinet.dart';\nimport '../effects/plug_pro/Modulation.dart';\nimport '../effects/plug_pro/Delay.dart';\nimport '../effects/plug_pro/Reverb.dart';\nimport 'Preset.dart';\n\nclass MightyMk2Preset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n\n  @override\n  List<Color> get channelColorsList => PresetConstants.channelColorsPro;\n\n  @override\n  int get qrDataLength => 113;\n\n  double _volume = 0;\n\n  @override\n  double get volume => _volume;\n\n  @override\n  set volume(double vol) {\n    setVolume(vol, true);\n  }\n\n  final NoiseGatePro noiseGate = NoiseGatePro();\n\n  @override\n  List<Amplifier> get amplifierList => _amplifierList;\n  final List<EFXPro> _efxList = <EFXPro>[];\n  final List<Amplifier> _amplifierList = <Amplifier>[];\n  final List<CabinetPro> _cabinetList = <CabinetPro>[];\n  final List<Modulation> _modulationList = <Modulation>[];\n  final List<DelayPro> _delayList = <DelayPro>[];\n  final List<Reverb> _reverbList = <Reverb>[];\n\n  @override\n  List<Cabinet> get cabinetList => _cabinetList;\n  bool noiseGateEnabled = true;\n  bool efxEnabled = true;\n  bool ampEnabled = true;\n  bool cabEnabled = true;\n  bool modulationEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedEfx = 0;\n  int selectedAmp = 0;\n  int selectedCabinet = 0;\n  int selectedMod = 0;\n  int selectedDelay = 0;\n  int selectedReverb = 0;\n\n  LiteMK2Version version = LiteMK2Version.LiteMK2v1;\n\n  MightyMk2Preset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    _modulationList.addAll([\n      ModCE1(),\n      ModCE2(),\n      STChorusPro(),\n      Vibrato(),\n      FlangerLiteMk2(),\n      Phase90LiteMk2(),\n      Phase100LiteMk2(),\n      SCFLiteMk2(),\n      VibeLiteMk2(),\n      TremoloLiteMk2(),\n      SCH1LiteMk2(),\n    ]);\n\n    _efxList.addAll([\n      DistortionPlus(),\n      RCBoost(),\n      ACBoost(),\n      DistOne(),\n      TSDrive(),\n      BluesDrive(),\n      MorningDrive(),\n      EatDist(),\n      RedDirt(),\n      Crunch(),\n      MuffFuzz(),\n      Katana(),\n      STSinger(),\n      RoseCompLiteMk2(),\n      KCompLiteMk2(),\n      TouchWahLiteMk2(),\n      TremoloEFXLiteMk2(),\n      VibeEFXLiteMk2(),\n      PH100LiteMk2()\n    ]);\n\n    _amplifierList.addAll([\n      JazzClean(),\n      DeluxeRvb(),\n      BassMate(),\n      Tweedy(),\n      //this one and VibroKing cause crashes or ear piercing feedbacks\n      TwinRvb(),\n      HiWire(),\n      CaliCrunch(),\n      ClassA15(),\n      ClassA30(),\n      Plexi100(),\n      Plexi45(),\n      Brit800(),\n      Pl1987x50(),\n      Slo100(),\n      FiremanHBE(),\n      DualRect(),\n      DIEVH4(),\n      VibroKing(),\n      Budda(),\n      MrZ38(),\n      SuperRvb(),\n      BritBlues(),\n      MatchD30(),\n      Brit2000(),\n      UberHiGain(),\n      AGL(),\n      MLD(),\n      OptimaAir(),\n      Stageman(),\n    ]);\n\n    _cabinetList.addAll([\n      JZ120Pro(),\n      DR112Pro(),\n      TR212Pro(),\n      HIWIRE412(),\n      CALI112(),\n      A112(),\n      GB412Pro(),\n      M1960AX(),\n      M1960AV(),\n      M1960TV(),\n      SLO412(),\n      FIREMAN412(),\n      RECT412(),\n      DIE412(),\n      MATCH212(),\n      UBER412(),\n      BS410(),\n      A212Pro(),\n      M1960AHW(),\n      M1936(),\n      BUDDA112(),\n      Z212(),\n      SUPERVERB410(),\n      VIBROKING310(),\n      AGLDB810(),\n      AMPSV212(),\n      AMPSV410(),\n      AMPSV810(),\n      BASSGUY410(),\n      EDEN410(),\n      MKB410(),\n      GHBIRDPro(),\n      GJ15Pro(),\n      MD45Pro(),\n    ]);\n\n    //add the user cabs\n    for (int i = 0; i < PlugProCommunication.customIRsCount; i++) {\n      var userCab = UserCab();\n      userCab.setNuxIndex(i + PlugProCommunication.customIRStart + 1);\n      if (i == 0) {\n        userCab.isSeparator = true;\n        userCab.category = \"User IRs\";\n      }\n      _cabinetList.add(userCab);\n    }\n\n    _delayList.addAll([\n      AnalogDelayLiteMk2(),\n      DigitalDelayLiteV2(),\n      ModDelayLiteMk2(),\n      TapeEchoLiteMk2(),\n      PhiDelayLiteMk2()\n    ]);\n\n    //reverb is available in all presets\n    _reverbList.addAll([\n      RoomReverbLiteMk2(),\n      HallReverbLiteMk2(),\n      PlateReverb(),\n      SpringReverb(),\n      DampReverbLiteMk2()\n    ]);\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    switch (index) {\n      case 0:\n        return noiseGateEnabled;\n      case 1:\n        return efxEnabled;\n      case 2:\n        return ampEnabled;\n      case 3:\n        return cabEnabled;\n      case 4:\n        return modulationEnabled;\n      case 5:\n        return delayEnabled;\n      case 6:\n        return reverbEnabled;\n      default:\n        return true;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    switch (index) {\n      case 0:\n        noiseGateEnabled = value;\n        break;\n      case 1:\n        efxEnabled = value;\n        break;\n      case 2:\n        ampEnabled = value;\n        break;\n      case 3:\n        cabEnabled = value;\n        break;\n      case 4:\n        modulationEnabled = value;\n        break;\n      case 5:\n        delayEnabled = value;\n        break;\n      case 6:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return [noiseGate];\n      case 1:\n        return _efxList;\n      case 2:\n        return _amplifierList;\n      case 3:\n        return _cabinetList;\n      case 4:\n        return _modulationList;\n      case 5:\n        return _delayList;\n      case 6:\n        return _reverbList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return 0;\n      case 1:\n        return selectedEfx;\n      case 2:\n        return selectedAmp;\n      case 3:\n        return selectedCabinet;\n      case 4:\n        return selectedMod;\n      case 5:\n        return selectedDelay;\n      case 6:\n        return selectedReverb;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    switch (slot) {\n      case 1:\n        selectedEfx = index;\n        break;\n      case 2:\n        selectedAmp = index;\n        break;\n      case 3:\n        selectedCabinet = index;\n        break;\n      case 4:\n        selectedMod = index;\n        break;\n      case 5:\n        selectedDelay = index;\n        break;\n      case 6:\n        selectedReverb = index;\n        break;\n    }\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  @override\n  int getEffectArrayIndexFromNuxIndex(NuxFXID fxid, int nuxIndex) {\n    List<Processor> list = [];\n    list = getEffectsForSlot(fxid.value);\n\n    for (int i = 0; i < list.length; i++) {\n      if (list[i].nuxIndex == nuxIndex) return i;\n    }\n\n    return 0;\n  }\n\n  @override\n  Color effectColor(int index) {\n    return device.processorList[index].color;\n  }\n\n  @override\n  setFirmwareVersion(int ver) {\n    version = LiteMK2Version.values[ver];\n  }\n\n  @override\n  void setVolume(double vol, bool btTransmit) {\n    _volume = vol;\n    if (btTransmit) {\n      sendVolume();\n    }\n  }\n\n  @override\n  void sendVolume() {\n    (device.communication as LiteMk2Communication)\n        .sendChannelVolume(device.decibelFormatter!.valueToMidi7Bit(_volume));\n  }\n\n  @override\n  void setupPresetFromNuxDataArray(List<int> nuxData) {\n    super.setupPresetFromNuxDataArray(nuxData);\n\n    if (nuxData.length > PresetDataIndexPlugPro.MASTER) {\n      _volume = device.decibelFormatter!\n          .midi7BitToValue(nuxData[PresetDataIndexPlugPro.MASTER]);\n    } else {\n      debugPrint(\"Error: master volume outside of preset data!\");\n    }\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/MightyXXBTPreset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui';\n\nimport 'package:mighty_plug_manager/bluetooth/devices/presets/preset_constants.dart';\n\nimport '../NuxDevice.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/mighty_2040bt/Amps.dart';\nimport '../effects/mighty_2040bt/Modulation.dart';\nimport '../effects/mighty_2040bt/Delay.dart';\nimport '../effects/mighty_2040bt/Reverb.dart';\nimport 'Preset.dart';\n\nclass MXXBTPreset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n  @override\n  int get qrDataLength => 40;\n  @override\n  Color get channelColor => PresetConstants.channelColorsPlug[channel];\n  final NoiseGate1Param noiseGate = NoiseGate1Param();\n  @override\n  final List<MXXBTAmplifier> amplifierList = <MXXBTAmplifier>[];\n  final List<Modulation> modulationList = <Modulation>[];\n  final List<Delay> delayList = <Delay>[];\n  final List<Reverb> reverbList = <Reverb>[];\n\n  bool noiseGateEnabled = true;\n  bool modulationEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedMod = 0;\n  int selectedDelay = 0;\n  int selectedReverb = 0;\n\n  MXXBTPreset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    //modulation is available everywhere\n    modulationList.addAll([Phaser(), Chorus(), Tremolo()]);\n\n    amplifierList.addAll([\n      Amp1(),\n      // AmpClean2(),\n      // AmpDrive1(),\n      // AmpDrive2(),\n      // AmpMetal1(),\n      // AmpMetal2(),\n      // AmpLead1(),\n      // AmpLead2()\n    ]);\n\n    delayList.addAll([AnalogDelay(), ModulationDelay(), DigitalDelay()]);\n\n    //reverb is available in all presets\n    reverbList.addAll([HallReverb(), PlateReverb(), SpringReverb()]);\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    if (index == 1) return false;\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    switch (index) {\n      case 0:\n        return noiseGateEnabled;\n      case 2:\n        return modulationEnabled;\n      case 3:\n        return delayEnabled;\n      case 4:\n        return reverbEnabled;\n      default:\n        return true;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    switch (index) {\n      case 0:\n        noiseGateEnabled = value;\n        break;\n      case 2:\n        modulationEnabled = value;\n        break;\n      case 3:\n        delayEnabled = value;\n        break;\n      case 4:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return [noiseGate];\n      case 1:\n        return amplifierList;\n      case 2:\n        return modulationList;\n      case 3:\n        return delayList;\n      case 4:\n        return reverbList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return 0;\n      case 1:\n        return 0;\n      case 2:\n        return selectedMod;\n      case 3:\n        return selectedDelay;\n      case 4:\n        return selectedReverb;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    switch (slot) {\n      case 2:\n        selectedMod = index;\n        break;\n      case 3:\n        selectedDelay = index;\n        break;\n      case 4:\n        selectedReverb = index;\n        break;\n    }\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  @override\n  Color effectColor(int index) {\n    if (index != 1) {\n      return device.processorList[index].color;\n    } else {\n      return channelColor;\n    }\n  }\n\n  @override\n  setFirmwareVersion(int ver) {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/PlugAirPreset.dart",
    "content": "// (c) 2020-2021 Dian Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:ui';\n\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugAir.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/plug_air/Ampsv2.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/presets/preset_constants.dart';\n\nimport '../NuxDevice.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/plug_air/EFX.dart';\nimport '../effects/plug_air/EFXv2.dart';\nimport '../effects/plug_air/Amps.dart';\nimport '../effects/plug_air/Cabinet.dart';\nimport '../effects/plug_air/Modulation.dart';\nimport '../effects/plug_air/Delay.dart';\nimport '../effects/plug_air/Reverb.dart';\nimport 'Preset.dart';\n\nclass PlugAirPreset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n\n  @override\n  List<Color> get channelColorsList {\n    if ((device as NuxMightyPlug).ampVariant == PlugAirVariant.MightyAir) {\n      return PresetConstants.channelColorsAir;\n    }\n    return PresetConstants.channelColorsPlug;\n  }\n\n  @override\n  int get qrDataLength => 40;\n\n  final NoiseGate2Param noiseGate = NoiseGate2Param();\n\n  List<EFX> get efxList =>\n      version == PlugAirVersion.PlugAir21 ? efxListv2 : efxListv1;\n  @override\n  List<Amplifier> get amplifierList =>\n      version == PlugAirVersion.PlugAir21 ? amplifierListv2 : amplifierListv1;\n\n  @override\n  final List<CabinetMP2> cabinetList = <CabinetMP2>[];\n  List<Modulation> get modulationList =>\n      version == PlugAirVersion.PlugAir21 ? modulationListv2 : modulationListv1;\n  List<Delay> get delayList =>\n      version == PlugAirVersion.PlugAir21 ? delayList2 : delayList1;\n  List<Reverb> get reverbList =>\n      version == PlugAirVersion.PlugAir21 ? reverbListv2 : reverbListv1;\n\n  final List<EFX> efxListv1 = <EFX>[];\n  final List<EFX> efxListv2 = <EFX>[];\n\n  final List<Amplifier> amplifierListv1 = <Amplifier>[];\n  final List<Amplifier> amplifierListv2 = <Amplifier>[];\n\n  final List<Modulation> modulationListv1 = <Modulation>[];\n  final List<Modulation> modulationListv2 = <Modulation>[];\n\n  final List<Delay> delayList1 = <Delay>[];\n  final List<Delay> delayList2 = <Delay>[];\n\n  final List<Reverb> reverbListv1 = <Reverb>[];\n  final List<Reverb> reverbListv2 = <Reverb>[];\n\n  bool noiseGateEnabled = true;\n  bool efxEnabled = true;\n  bool modulationEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedEfx = 0;\n  int selectedAmp = 0;\n  int selectedCabinet = 0;\n  int selectedMod = 0;\n  int selectedDelay = 0;\n  int selectedReverb = 0;\n\n  PlugAirVersion version = PlugAirVersion.PlugAir15;\n\n  PlugAirPreset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    modulationListv1\n        .addAll([Phaser(), Chorus(), STChorus(), Flanger(), Vibe(), Tremolo()]);\n    modulationListv2\n        .addAll([PH100(), CE1(), STChorus(), SCF(), Vibe(), Tremolo()]);\n\n    efxListv1.addAll([\n      TouchWah(),\n      UniVibe(),\n      TremoloEFX(),\n      PhaserEFX(),\n      Boost(),\n      TSDrive(),\n      BassTS(),\n      ThreeBandEQ(),\n      Muff(),\n      Crunch(),\n      RedDist(),\n      MorningDrive(),\n      DistOne(),\n    ]);\n\n    efxListv2.addAll([\n      TouchWah(),\n      UniVibe(),\n      TremoloEFX(),\n      PH100EFX(),\n      STSinger(),\n      TSDrive(),\n      Katana(),\n      ThreeBandEQ(),\n      Muff(),\n      Crunch(),\n      RedDirt(),\n      MorningDrive(),\n      DistOne(),\n      RoseComp()\n    ]);\n\n    amplifierListv1.addAll([\n      TwinVerb(),\n      JZ120(),\n      TweedDlx(),\n      Plexi(),\n      TopBoost(),\n      Lead100(),\n      Fireman(),\n      DIEVH4(),\n      Recto(),\n      Optima(),\n      Stageman(),\n      MLD(),\n      AGL()\n    ]);\n\n    amplifierListv2.addAll([\n      JazzClean(),\n      DeluxeRvb(),\n      TwinRvbV2(),\n      ClassA30(),\n      Brit800(),\n      Plexi1987x50(),\n      FiremanHBE(),\n      DualRect(),\n      DIEVH4v2(),\n      AGLv2(),\n      Starlift(),\n      MLDv2(),\n      Stagemanv2(),\n    ]);\n\n    cabinetList.addAll([\n      V1960(),\n      A212(),\n      BS410(),\n      DR112(),\n      GB412(),\n      JZ120IR(),\n      TR212(),\n      V412(),\n      AGLDB810(),\n      AMPSV810(),\n      MKB410(),\n      TRC410(),\n      GHBird(),\n      GJ15(),\n      MD45(),\n      GIBJ200(),\n      GIBJ45(),\n      TL314(),\n      MHD28()\n    ]);\n\n    delayList1.addAll([AnalogDelay(), TapeEcho(), DigitalDelay(), PingPong()]);\n    delayList2\n        .addAll([AnalogDelay(), DigitalDelayv2(), ModDelay(), PingPong()]);\n\n    //reverb is available in all presets\n    reverbListv1.addAll([\n      RoomReverb(),\n      HallReverb(),\n      PlateReverb(),\n      SpringReverb(),\n      ShimmerReverb()\n    ]);\n\n    reverbListv2.addAll(\n        [RoomReverbv2(), HallReverbv2(), PlateReverbv2(), SpringReverb()]);\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    if (index == 2 || index == 3) return false;\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    switch (index) {\n      case 0:\n        return noiseGateEnabled;\n      case 1:\n        return efxEnabled;\n      case 4:\n        return modulationEnabled;\n      case 5:\n        return delayEnabled;\n      case 6:\n        return reverbEnabled;\n      default:\n        return true;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    switch (index) {\n      case 0:\n        noiseGateEnabled = value;\n        break;\n      case 1:\n        efxEnabled = value;\n        break;\n      case 4:\n        modulationEnabled = value;\n        break;\n      case 5:\n        delayEnabled = value;\n        break;\n      case 6:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return [noiseGate];\n      case 1:\n        return efxList;\n      case 2:\n        return amplifierList;\n      case 3:\n        return cabinetList;\n      case 4:\n        return modulationList;\n      case 5:\n        return delayList;\n      case 6:\n        return reverbList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    switch (slot) {\n      case 0:\n        return 0;\n      case 1:\n        return selectedEfx;\n      case 2:\n        return selectedAmp;\n      case 3:\n        return selectedCabinet;\n      case 4:\n        return selectedMod;\n      case 5:\n        return selectedDelay;\n      case 6:\n        return selectedReverb;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    switch (slot) {\n      case 1:\n        selectedEfx = index;\n        break;\n      case 2:\n        selectedAmp = index;\n        break;\n      case 3:\n        selectedCabinet = index;\n        break;\n      case 4:\n        selectedMod = index;\n        break;\n      case 5:\n        selectedDelay = index;\n        break;\n      case 6:\n        selectedReverb = index;\n        break;\n    }\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  @override\n  Color effectColor(int index) {\n    return device.processorList[index].color;\n  }\n\n  @override\n  setFirmwareVersion(int ver) {\n    version = PlugAirVersion.values[ver];\n    //some special consideration for fx limit\n    if (version == PlugAirVersion.PlugAir15 &&\n        selectedEfx >= efxListv1.length) {\n      selectedEfx = efxListv1.length - 1;\n    }\n\n    if (version == PlugAirVersion.PlugAir21 &&\n        selectedReverb >= reverbListv2.length) {\n      selectedReverb = reverbListv2.length - 1;\n    }\n  }\n\n  @override\n  String getAmpNameByNuxIndex(int index, int version) {\n    try {\n      var ver = PlugAirVersion.values[version];\n      switch (ver) {\n        case PlugAirVersion.PlugAir15:\n          return amplifierListv1[index].name;\n        case PlugAirVersion.PlugAir21:\n          return amplifierListv2[index].name;\n      }\n    } catch (e) {\n      throw (\"Unknown Mighty Plug/Air version: $version\");\n    }\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/PlugProPreset.dart",
    "content": "// (c) 2020-2021 Dian Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:convert/convert.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugPro.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/communication/plugProCommunication.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/effects/plug_pro/EmptyEffects.dart';\n\nimport '../../NuxDeviceControl.dart';\nimport '../NuxConstants.dart';\nimport '../NuxDevice.dart';\nimport '../NuxFXID.dart';\nimport '../effects/Processor.dart';\nimport '../effects/NoiseGate.dart';\nimport '../effects/plug_pro/Compressor.dart';\nimport '../effects/plug_pro/EFX.dart';\nimport '../effects/plug_pro/Amps.dart';\nimport '../effects/plug_pro/Cabinet.dart';\nimport '../effects/plug_pro/Modulation.dart';\nimport '../effects/plug_pro/Delay.dart';\nimport '../effects/plug_pro/Reverb.dart';\nimport '../effects/plug_pro/EQ.dart';\nimport 'Preset.dart';\nimport 'preset_constants.dart';\n\nclass PlugProPreset extends Preset {\n  @override\n  NuxDevice device;\n  @override\n  int channel;\n  @override\n  String channelName;\n  @override\n  List<Color> get channelColorsList => PresetConstants.channelColorsPro;\n\n  @override\n  int get qrDataLength => 113;\n\n  final WahDummyPro wahDummy = WahDummyPro();\n  final NoiseGatePro noiseGate = NoiseGatePro();\n\n  final List<Compressor> _compressorList = <Compressor>[];\n  final List<EFXPro> efxList = <EFXPro>[];\n\n  @override\n  final List<CabinetPro> cabinetList = <CabinetPro>[];\n  final List<Modulation> modulationList = <Modulation>[];\n  final List<Reverb> _reverbList = <Reverb>[];\n  @override\n  final List<Amplifier> amplifierList = <Amplifier>[];\n  final List<DelayPro> delayList = <DelayPro>[];\n  final List<EQ> eqList = <EQ>[];\n\n  //presets stored in nux indexing (unused Wah is 0)\n  List<NuxFXID> processorAtSlot = [];\n\n  bool wahEnabled = true;\n  bool noiseGateEnabled = true;\n  bool compressorEnabled = true;\n  bool efxEnabled = true;\n  bool ampEnabled = true;\n  bool irEnabled = true;\n  bool modulationEnabled = true;\n  bool eqEnabled = true;\n  bool delayEnabled = true;\n  bool reverbEnabled = true;\n\n  int selectedComp = 0;\n  int selectedEfx = 0;\n  int selectedAmp = 0;\n  int selectedCabinet = 0;\n  int selectedMod = 0;\n  int selectedEQ = 0;\n  int selectedDelay = 0;\n  int selectedReverb = 0;\n\n  PlugProVersion version = PlugProVersion.PlugPro1;\n\n  double _volume = 0;\n\n  PlugProPreset(\n      {required this.device, required this.channel, required this.channelName})\n      : super(channel: channel, channelName: channelName, device: device) {\n    _compressorList.addAll([RoseCompPro(), KComp(), StudioComp()]);\n\n    modulationList.addAll([\n      ModCE1(),\n      ModCE2(),\n      STChorusPro(),\n      Vibrato(),\n      Detune(),\n      FlangerPro(),\n      Phase90(),\n      Phase100(),\n      SCFPro(),\n      VibePro(),\n      TremoloPro(),\n      Rotary(),\n      SCH1Pro(),\n      MonoOctave()\n    ]);\n\n    efxList.addAll([\n      DistortionPlus(),\n      RCBoost(),\n      ACBoost(),\n      DistOne(),\n      TSDrive(),\n      BluesDrive(),\n      MorningDrive(),\n      EatDist(),\n      RedDirt(),\n      Crunch(),\n      MuffFuzz(),\n      Katana(),\n      STSinger(),\n      TouchWahPro()\n    ]);\n\n    amplifierList.addAll([\n      JazzClean(),\n      DeluxeRvb(),\n      BassMate(),\n      Tweedy(),\n      TwinRvb(),\n      HiWire(),\n      CaliCrunch(),\n      ClassA15(),\n      ClassA30(),\n      Plexi100(),\n      Plexi45(),\n      Brit800(),\n      Pl1987x50(),\n      Slo100(),\n      FiremanHBE(),\n      DualRect(),\n      DIEVH4(),\n      VibroKing(),\n      Budda(),\n      MrZ38(),\n      SuperRvb(),\n      BritBlues(),\n      MatchD30(),\n      Brit2000(),\n      UberHiGain(),\n      AGL(),\n      MLD(),\n      OptimaAir(),\n      Stageman(),\n    ]);\n\n    eqList.addAll([EQSixBand(), EQTenBand()]);\n\n    cabinetList.addAll([\n      JZ120Pro(),\n      DR112Pro(),\n      TR212Pro(),\n      HIWIRE412(),\n      CALI112(),\n      A112(),\n      GB412Pro(),\n      M1960AX(),\n      M1960AV(),\n      M1960TV(),\n      SLO412(),\n      FIREMAN412(),\n      RECT412(),\n      DIE412(),\n      MATCH212(),\n      UBER412(),\n      BS410(),\n      A212Pro(),\n      M1960AHW(),\n      M1936(),\n      BUDDA112(),\n      Z212(),\n      SUPERVERB410(),\n      VIBROKING310(),\n      AGLDB810(),\n      AMPSV212(),\n      AMPSV410(),\n      AMPSV810(),\n      BASSGUY410(),\n      EDEN410(),\n      MKB410(),\n      GHBIRDPro(),\n      GJ15Pro(),\n      MD45Pro(),\n    ]);\n\n    //add the user cabs\n    for (int i = 0; i < PlugProCommunication.customIRsCount; i++) {\n      var userCab = UserCab();\n      userCab.setNuxIndex(i + PlugProCommunication.customIRStart + 1);\n      if (i == 0) {\n        userCab.isSeparator = true;\n        userCab.category = \"User IRs\";\n      }\n      cabinetList.add(userCab);\n    }\n\n    delayList.addAll([\n      AnalogDelayV2(),\n      DigitalDelay(),\n      ModDelay(),\n      TapeEcho(),\n      PanDelay(),\n      PhiDelayPro()\n    ]);\n\n    _reverbList.addAll([\n      RoomReverb(),\n      HallReverb(),\n      PlateReverb(),\n      SpringReverb(),\n      ShimmerReverb(),\n      DampReverbPro()\n    ]);\n\n    for (int i = 0; i < PresetDataIndexPlugPro.defaultEffects.length; i++) {\n      processorAtSlot.add(PresetDataIndexPlugPro.defaultEffects[i]);\n    }\n  }\n\n  /// checks if the effect slot can be switched on and off\n  @override\n  bool slotSwitchable(int index) {\n    return true;\n  }\n\n  //returns whether the specific slot is on or off\n  @override\n  bool slotEnabled(int index) {\n    var proc = getFXIDFromSlot(index);\n    return _FXIDEnabled(proc);\n  }\n\n  bool _FXIDEnabled(NuxFXID fxid) {\n    switch (fxid.value) {\n      case PresetDataIndexPlugPro.Head_iWAH:\n        return wahEnabled;\n      case PresetDataIndexPlugPro.Head_iNG:\n        return noiseGateEnabled;\n      case PresetDataIndexPlugPro.Head_iCMP:\n        return compressorEnabled;\n      case PresetDataIndexPlugPro.Head_iEFX:\n        return efxEnabled;\n      case PresetDataIndexPlugPro.Head_iAMP:\n        return ampEnabled;\n      case PresetDataIndexPlugPro.Head_iCAB:\n        return irEnabled;\n      case PresetDataIndexPlugPro.Head_iMOD:\n        return modulationEnabled;\n      case PresetDataIndexPlugPro.Head_iEQ:\n        return eqEnabled;\n      case PresetDataIndexPlugPro.Head_iDLY:\n        return delayEnabled;\n      case PresetDataIndexPlugPro.Head_iRVB:\n        return reverbEnabled;\n      default:\n        return false;\n    }\n  }\n\n  //turns slot on or off\n  @override\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    var proc = getFXIDFromSlot(index);\n    _setFXIDEnabled(proc, value);\n    super.setSlotEnabled(index, value, notifyBT);\n  }\n\n  void _setFXIDEnabled(NuxFXID fxid, bool value) {\n    switch (fxid.value) {\n      case PresetDataIndexPlugPro.Head_iWAH:\n        wahEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iNG:\n        noiseGateEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iCMP:\n        compressorEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iEFX:\n        efxEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iAMP:\n        ampEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iCAB:\n        irEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iMOD:\n        modulationEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iEQ:\n        eqEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iDLY:\n        delayEnabled = value;\n        break;\n      case PresetDataIndexPlugPro.Head_iRVB:\n        reverbEnabled = value;\n        break;\n      default:\n        return;\n    }\n  }\n\n  @override\n  NuxFXID getFXIDFromSlot(int slot) {\n    return processorAtSlot[slot];\n  }\n\n  @override\n  int? getSlotFromFXID(NuxFXID fxid) {\n    for (int i = 0; i < processorAtSlot.length; i++) {\n      if (processorAtSlot[i] == fxid) return i;\n    }\n    return null;\n  }\n\n  @override\n  void setFXIDAtSlot(int slot, NuxFXID fxid) {\n    processorAtSlot[slot] = fxid;\n  }\n\n  @override\n  void swapProcessorSlots(int from, int to, notifyBT) {\n    var fxFrom = processorAtSlot[from];\n\n    //shift all after 'from' one position to the left\n    for (int i = from; i < device.processorList.length - 1; i++) {\n      processorAtSlot[i] = processorAtSlot[i + 1];\n    }\n\n    //shift all at and after 'to' one position to the right to make room\n    for (int i = device.processorList.length - 1; i > to; i--) {\n      processorAtSlot[i] = processorAtSlot[i - 1];\n    }\n\n    //place the moved one\n    processorAtSlot[to] = fxFrom;\n\n    super.swapProcessorSlots(from, to, notifyBT);\n  }\n\n  //returns list of effects for given slot\n  @override\n  List<Processor> getEffectsForSlot(int slot) {\n    var proc = getFXIDFromSlot(slot);\n    return _getEffectsForFXID(proc);\n  }\n\n  List<Processor> _getEffectsForFXID(NuxFXID fxid) {\n    switch (fxid.value) {\n      case PresetDataIndexPlugPro.Head_iWAH:\n        return [wahDummy];\n      case PresetDataIndexPlugPro.Head_iNG:\n        return [noiseGate];\n      case PresetDataIndexPlugPro.Head_iCMP:\n        return _compressorList;\n      case PresetDataIndexPlugPro.Head_iEFX:\n        return efxList;\n      case PresetDataIndexPlugPro.Head_iAMP:\n        return amplifierList;\n      case PresetDataIndexPlugPro.Head_iCAB:\n        return cabinetList;\n      case PresetDataIndexPlugPro.Head_iMOD:\n        return modulationList;\n      case PresetDataIndexPlugPro.Head_iEQ:\n        return eqList;\n      case PresetDataIndexPlugPro.Head_iDLY:\n        return delayList;\n      case PresetDataIndexPlugPro.Head_iRVB:\n        return _reverbList;\n    }\n    return <Processor>[];\n  }\n\n  //returns which of the effects is selected for a given slot\n  @override\n  int getSelectedEffectForSlot(int slot) {\n    var fxid = getFXIDFromSlot(slot);\n    return _getSelectedEffectForFXID(fxid);\n  }\n\n  int _getSelectedEffectForFXID(NuxFXID fxid) {\n    switch (fxid.value) {\n      case PresetDataIndexPlugPro.Head_iCMP:\n        return selectedComp;\n      case PresetDataIndexPlugPro.Head_iEFX:\n        return selectedEfx;\n      case PresetDataIndexPlugPro.Head_iAMP:\n        return selectedAmp;\n      case PresetDataIndexPlugPro.Head_iCAB:\n        return selectedCabinet;\n      case PresetDataIndexPlugPro.Head_iMOD:\n        return selectedMod;\n      case PresetDataIndexPlugPro.Head_iEQ:\n        return selectedEQ;\n      case PresetDataIndexPlugPro.Head_iDLY:\n        return selectedDelay;\n      case PresetDataIndexPlugPro.Head_iRVB:\n        return selectedReverb;\n      default:\n        return 0;\n    }\n  }\n\n  //sets the effect for the given slot\n  @override\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    var proc = getFXIDFromSlot(slot);\n    _setSelectedEffectForFXID(proc, index);\n\n    super.setSelectedEffectForSlot(slot, index, notifyBT);\n  }\n\n  void _setSelectedEffectForFXID(NuxFXID fxid, int index) {\n    switch (fxid.value) {\n      case PresetDataIndexPlugPro.Head_iCMP:\n        selectedComp = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iEFX:\n        selectedEfx = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iAMP:\n        selectedAmp = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iCAB:\n        selectedCabinet = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iMOD:\n        selectedMod = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iEQ:\n        selectedEQ = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iDLY:\n        selectedDelay = index;\n        break;\n      case PresetDataIndexPlugPro.Head_iRVB:\n        selectedReverb = index;\n        break;\n    }\n  }\n\n  @override\n  int getEffectArrayIndexFromNuxIndex(NuxFXID fxid, int nuxIndex) {\n    List<Processor> list = [];\n    list = _getEffectsForFXID(fxid);\n\n    for (int i = 0; i < list.length; i++) {\n      if (list[i].nuxIndex == nuxIndex) return i;\n    }\n\n    return 0;\n  }\n\n  @override\n  Color effectColor(int index) {\n    var fxid = getFXIDFromSlot(index);\n    return device.getProcessorInfoByFXID(fxid)?.color ?? Colors.grey;\n  }\n\n  @override\n  setFirmwareVersion(int version) {\n    this.version = PlugProVersion.values[version];\n  }\n\n  @override\n  void setupPresetFromNuxDataArray(List<int> nuxData) {\n    if (nuxData.length < 10) return;\n\n    var loadedPreset = hex.encode(nuxData);\n\n    NuxDeviceControl.instance().diagData.lastNuxPreset = loadedPreset;\n    NuxDeviceControl.instance().updateDiagnosticsData(nuxPreset: loadedPreset);\n\n    for (int i = 0; i < PresetDataIndexPlugPro.effectTypesIndex.length; i++) {\n      int nuxSlot = PresetDataIndexPlugPro.effectTypesIndex[i];\n      NuxFXID fxid = NuxFXID.fromInt(nuxSlot);\n      //set proper effect\n      int effectParam = nuxData[nuxSlot];\n      int effectIndex = effectParam & 0x3f;\n      bool effectOn = (effectParam & 0x40) == 0;\n\n      effectIndex = getEffectArrayIndexFromNuxIndex(fxid, effectIndex);\n\n      _setSelectedEffectForFXID(fxid, effectIndex);\n\n      //enable/disable effect\n      _setFXIDEnabled(fxid, effectOn);\n\n      _getEffectsForFXID(fxid)[effectIndex].setupFromNuxPayload(nuxData);\n    }\n\n    if (nuxData.length > PresetDataIndexPlugPro.MASTER) {\n      _volume = device.decibelFormatter!\n          .midi7BitToValue(nuxData[PresetDataIndexPlugPro.MASTER]);\n    } else {\n      debugPrint(\"Error: master volume outside of preset data!\");\n    }\n\n    //effects chain arrangement\n    int start = PresetDataIndexPlugPro.LINK1;\n\n    if (nuxData.length <= start) {\n      debugPrint(\"Error: preset doesn't contain FX chain order settings\");\n      return;\n    }\n    //fix for QR\n    for (int i = 0; i < 3; i++) {\n      if (!PresetDataIndexPlugPro.effectTypesIndex.contains(nuxData[start])) {\n        start++;\n      }\n    }\n\n    for (int i = 0; i < device.effectsChainLength; i++) {\n      processorAtSlot[i] = NuxFXID.fromInt(nuxData[start + i]);\n    }\n  }\n\n  @override\n  List<int> createNuxDataFromPreset() {\n    List<int> data = List.filled(qrDataLength, 0);\n\n    List<int> qrData = [];\n    qrData.add(device.deviceQRId);\n    qrData.add(device.deviceQRVersion);\n\n    data[PresetDataIndexPlugPro.MASTER] =\n        device.decibelFormatter!.valueToMidi7Bit(_volume);\n\n    for (int i = 0; i < PresetDataIndexPlugPro.effectTypesIndex.length; i++) {\n      var slot = PresetDataIndexPlugPro.effectTypesIndex[i];\n      NuxFXID fxid = NuxFXID.fromInt(slot);\n\n      _getEffectsForFXID(fxid)[_getSelectedEffectForFXID(fxid)]\n          .getNuxPayload(data, _FXIDEnabled(fxid));\n    }\n\n    //fx chain order\n    int start = PresetDataIndexPlugPro.LINK1;\n\n    //store fx chain\n    for (int i = 0; i < device.effectsChainLength; i++) {\n      data[start + i] = processorAtSlot[i].toInt();\n    }\n\n    qrData.addAll(data);\n    return qrData;\n  }\n\n  @override\n  double get volume => _volume;\n\n  @override\n  set volume(double vol) {\n    setVolume(vol, true);\n  }\n\n  @override\n  void setVolume(double vol, bool btTransmit) {\n    _volume = vol;\n    if (btTransmit) {\n      sendVolume();\n    }\n  }\n\n  @override\n  void sendVolume() {\n    (device.communication as PlugProCommunication)\n        .sendChannelVolume(device.decibelFormatter!.valueToMidi7Bit(_volume));\n  }\n\n  void setVolumeRaw(int vol) {\n    _volume = device.decibelFormatter!.midi7BitToValue(vol);\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/Preset.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:convert';\nimport 'dart:ui';\n\nimport 'package:convert/convert.dart';\nimport 'package:qr_utils/qr_utils.dart';\nimport 'package:undo/undo.dart';\nimport '../../NuxDeviceControl.dart';\nimport '../NuxDevice.dart';\nimport '../NuxFXID.dart';\nimport '../effects/Processor.dart';\nimport 'preset_constants.dart';\n\nabstract class Preset {\n  int get qrDataLength;\n\n  NuxDevice device;\n  int channel;\n  String channelName;\n  Color get channelColor => channelColorsList[channel];\n  List<Color> get channelColorsList => PresetConstants.channelColorsPlug;\n  List<Amplifier> get amplifierList;\n  List<Cabinet>? get cabinetList => null;\n\n  final _changeStack = ChangeStack();\n\n  ChangeStack get changes => _changeStack;\n\n  List<List<int>> nuxDataPieces = [];\n\n  Preset(\n      {required this.device, required this.channel, required this.channelName});\n\n  //checks if the effect slot can be switched on and off\n  bool slotSwitchable(int index);\n\n  //returns whether the specific slot is on or off\n  bool slotEnabled(int index);\n\n  //override in reorderable fx chain\n  NuxFXID getFXIDFromSlot(int slot) {\n    return NuxFXID.fromInt(slot);\n  }\n\n  int? getSlotFromFXID(NuxFXID fxid) {\n    return fxid.toInt();\n  }\n\n  void setupPresetFromNuxDataArray(List<int> nuxData) {\n    if (nuxData.length < 10) return;\n\n    var loadedPreset = hex.encode(nuxData);\n\n    NuxDeviceControl.instance().diagData.lastNuxPreset = loadedPreset;\n    NuxDeviceControl.instance().updateDiagnosticsData(nuxPreset: loadedPreset);\n\n    for (int i = 0; i < device.effectsChainLength; i++) {\n      bool fxFound = false;\n\n      var effects = getEffectsForSlot(i);\n\n      if (effects.isEmpty) continue;\n      //set proper effect\n      if (effects[0].nuxEffectTypeIndex != null) {\n        int effectData = nuxData[effects[0].nuxEffectTypeIndex!];\n\n        int effectIndex = effectData;\n        if (effects[0].nuxEffectTypeIndex == effects[0].nuxEnableIndex) {\n          effectIndex &= ~effects[0].nuxEnableMask;\n        }\n\n        //find array index by nux index\n        for (int j = 0; j < effects.length; j++) {\n          if (effects[j].nuxIndex == effectIndex) {\n            effectIndex = j;\n            fxFound = true;\n            break;\n          }\n        }\n        setSelectedEffectForSlot(i, effectIndex, false);\n      }\n\n      //enable/disable effect\n      if (fxFound && effects[0].nuxEnableIndex != null) {\n        int enableData =\n            nuxData[effects[0].nuxEnableIndex!] & effects[0].nuxEnableMask;\n\n        bool enabled = (enableData != 0) ^ effects[0].nuxEnableInverted;\n\n        setSlotEnabled(i, enabled, false);\n\n        getEffectsForSlot(i)[getSelectedEffectForSlot(i)]\n            .setupFromNuxPayload(nuxData);\n      } else {\n        setSlotEnabled(i, false, false);\n      }\n    }\n  }\n\n  void setFXIDAtSlot(int slot, NuxFXID fxid) {}\n  void swapProcessorSlots(int from, int to, bool notifyBT) {\n    if (notifyBT) device.slotSwapped.add(to);\n  }\n\n  //turns slot on or off\n  void setSlotEnabled(int index, bool value, bool notifyBT) {\n    if (notifyBT) device.effectSwitched.add(index);\n  }\n\n  //returns list of effects for given slot\n  List<Processor> getEffectsForSlot(int slot);\n\n  //returns which of the effects is selected for a given slot\n  int getSelectedEffectForSlot(int slot);\n\n  //sets the effect for the given slot\n  void setSelectedEffectForSlot(int slot, int index, bool notifyBT) {\n    if (notifyBT) device.effectChanged.add(slot);\n  }\n\n  void setFirmwareVersion(int version);\n\n  //change a parameter and announce it\n  void setParameterValue(Parameter param, double value, {bool notify = true}) {\n    param.value = value;\n    if (notify) {\n      device.parameterChanged.add(param);\n    }\n  }\n\n  //override in more complex FX chains\n  int getEffectArrayIndexFromNuxIndex(NuxFXID fxid, int nuxIndex) {\n    return nuxIndex;\n  }\n\n  Color effectColor(int index);\n\n  void resetNuxData() {\n    nuxDataPieces = [];\n  }\n\n  //receives data chunk from a device\n  void addNuxPayloadPiece(List<int> data, int part, int total) {\n    if (total == 0) return;\n    if (nuxDataPieces.length != total) {\n      nuxDataPieces = List.filled(total, []);\n    }\n\n    nuxDataPieces[part] = data;\n  }\n\n  bool payloadPiecesReady() {\n    for (int i = 0; i < nuxDataPieces.length; i++) {\n      if (nuxDataPieces[i].isEmpty) return false;\n    }\n    return true;\n  }\n\n  //this is for QR export\n  List<int> createNuxDataFromPreset() {\n    List<int> data = List.filled(qrDataLength, 0);\n    List<int> qrData = [];\n    qrData.add(device.deviceQRId);\n    qrData.add(device.deviceQRVersion);\n\n    for (int i = 0; i < device.effectsChainLength; i++) {\n      getEffectsForSlot(i)[getSelectedEffectForSlot(i)]\n          .getNuxPayload(data, slotEnabled(i));\n    }\n\n    qrData.addAll(data);\n    return qrData;\n  }\n\n  void setupPresetFromNuxData() {\n    List<int> nuxData = [];\n    for (int i = 0; i < nuxDataPieces.length; i++) {\n      nuxData.addAll(nuxDataPieces[i]);\n    }\n    setupPresetFromNuxDataArray(nuxData);\n  }\n\n  PresetQRError setupPresetFromQRData(String qrData) {\n    if (qrData.contains(QrUtils.nuxQRPrefix)) {\n      var b64Data = qrData.substring(QrUtils.nuxQRPrefix.length);\n      var data = base64Decode(b64Data);\n      if (device.checkQRValid(data[0], data[1])) {\n        setupPresetFromNuxDataArray(data.sublist(2));\n        device.deviceControl.sendFullPresetSettings();\n        return PresetQRError.Ok;\n      }\n      if (data[0] != device.deviceQRId) return PresetQRError.WrongDevice;\n      return PresetQRError.WrongFWVersion;\n    }\n    return PresetQRError.UnsupportedFormat;\n  }\n\n  String getAmpNameByNuxIndex(int index, int version) {\n    var ampIndex = getFXIDFromSlot(device.amplifierSlotIndex);\n    index = getEffectArrayIndexFromNuxIndex(ampIndex, index);\n    return amplifierList[index].name;\n  }\n\n  double get volume => 0;\n\n  set volume(double vol) => {};\n\n  void setVolume(double vol, bool btTransmit) {}\n\n  void sendVolume() {}\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/presets/preset_constants.dart",
    "content": "import 'dart:ui';\n\nimport 'package:flutter/material.dart';\n\nclass PresetConstants {\n  static const List<Color> channelColorsPlug = [\n    Color.fromARGB(255, 0, 255, 0),\n    Color.fromARGB(255, 240, 160, 10),\n    Color.fromARGB(255, 255, 0, 0),\n    Color.fromARGB(220, 230, 230, 255),\n    Color.fromARGB(255, 130, 225, 255),\n    Color.fromARGB(255, 210, 140, 250),\n    Color.fromARGB(255, 71, 167, 245),\n    Color.fromARGB(230, 230, 230, 255),\n  ];\n\n  static const List<Color> channelColorsAir = [\n    Color.fromARGB(255, 0, 255, 0),\n    Color.fromARGB(255, 212, 202, 0),\n    Color.fromARGB(255, 255, 0, 0),\n    Color.fromARGB(220, 255, 0, 255),\n    Color.fromARGB(255, 0, 191, 255),\n    Color.fromARGB(255, 224, 142, 0),\n    Color.fromARGB(255, 20, 125, 255),\n  ];\n\n  static const List<Color> channelColorsPro = [\n    Color.fromARGB(255, 0, 255, 0),\n    Color.fromARGB(255, 240, 160, 10),\n    Color.fromARGB(255, 220, 0, 0),\n    Colors.blue,\n    Color.fromARGB(255, 130, 225, 255),\n    Color.fromARGB(255, 231, 120, 215),\n    Color(0xFFE1BEE7),\n  ];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/DecibelFormatter.dart",
    "content": "import 'ValueFormatter.dart';\n\nclass DecibelFormatterMP2 extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int get min => -6;\n\n  @override\n  int get max => 6;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return ((value + 6) / 12 * 127).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 127) * 12 - 6;\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.toStringAsFixed(1)} db\";\n  }\n}\n\nclass DecibelFormatterMPPro extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int get min => -12;\n\n  @override\n  int get max => 12;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return ((value + 12) / 24 * 100).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 100) * 24 - 12;\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.toStringAsFixed(1)} db\";\n  }\n}\n\nclass DecibelFormatterEQ extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int get min => -15;\n\n  @override\n  int get max => 15;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return ((value + 15) / 30 * 100).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 100) * 30 - 15;\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.toStringAsFixed(1)} db\";\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/FrequencyFormatter.dart",
    "content": "import 'ValueFormatter.dart';\nimport 'dart:math';\n\ndouble log10(num x) => log(x) / ln10;\n\nclass LowFrequencyFormatter extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int get min => 20;\n\n  @override\n  int get max => 300;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return ((value - 20) / 280 * 100).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 100) * 280 + 20;\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.toStringAsFixed(0)} Hz\";\n  }\n}\n\nclass HighFrequencyFormatter extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int get min => 0;\n\n  @override\n  int get max => 100;\n\n  double _valueToFreq(double value) {\n    final a = log10(5e3) + (log10(2e4) - log10(5e3)) * (value / 100);\n    return pow(10, a).toDouble();\n  }\n\n  double _freqToValue(double freq) {\n    double a = log10(freq);\n\n    var value = (a - log10(5e3)) / (log10(2e4) - log10(5e3));\n    return value * 100;\n  }\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return value.round();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return midi7bit.toDouble();\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${_valueToFreq(value).toStringAsFixed(0)} Hz\";\n  }\n\n  @override\n  double toHumanInput(double value) {\n    return _valueToFreq(value);\n  }\n\n  @override\n  double fromHumanInput(double value) {\n    return _freqToValue(value);\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/PercentageFormatter.dart",
    "content": "import 'ValueFormatter.dart';\n\nclass PercentageFormatter extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return (value / 100 * 127).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 127.0) * 100;\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.round()} %\";\n  }\n}\n\nclass PercentageFormatterMPPro extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return value.round();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return midi7bit.toDouble();\n  }\n\n  @override\n  String toLabel(double value) {\n    return \"${value.round()} %\";\n  }\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/SwitchFormatters.dart",
    "content": "import 'ValueFormatter.dart';\n\nabstract class SwitchFormatter extends ValueFormatter {\n  String get labelTitle;\n\n  @override\n  InputType get inputType => InputType.SwitchInput;\n\n  List<String> get labelValues;\n  List<int> get midiValues;\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return midi7bit.toDouble();\n  }\n\n  @override\n  String toLabel(double value) {\n    // TODO: implement toLabel\n    throw UnimplementedError();\n  }\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return value.round();\n  }\n}\n\nclass BrightModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Bright:\";\n\n  @override\n  List<String> get labelValues => [\"Off\", \"On\"];\n\n  @override\n  List<int> get midiValues => [0, 127];\n}\n\nclass BrightModeFormatterMPPro extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Bright:\";\n\n  @override\n  List<String> get labelValues => [\"Off\", \"On\"];\n\n  @override\n  List<int> get midiValues => [0, 1];\n}\n\nclass BoostModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Boost:\";\n\n  @override\n  List<String> get labelValues => [\"Off\", \"On\"];\n\n  @override\n  List<int> get midiValues => [0, 127];\n}\n\nclass BoostModeFormatterMPPro extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Boost:\";\n\n  @override\n  List<String> get labelValues => [\"Off\", \"On\"];\n\n  @override\n  List<int> get midiValues => [0, 1];\n}\n\nclass VibeModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Mode:\";\n\n  @override\n  List<String> get labelValues => [\"Vibe\", \"Chorus\"];\n\n  @override\n  List<int> get midiValues => [0, 127];\n}\n\nclass VibeModeFormatterPro extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Mode:\";\n\n  @override\n  List<String> get labelValues => [\"Chorus\", \"Vibrato\"];\n\n  @override\n  List<int> get midiValues => [0, 1];\n}\n\nclass ContourModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Contour:\";\n\n  @override\n  List<String> get labelValues => [\"Vintage\", \"Off\", \"Modern\"];\n\n  @override\n  List<int> get midiValues => [0, 64, 127];\n}\n\nclass SCFModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Mode:\";\n\n  @override\n  List<String> get labelValues => [\"Chorus\", \"P.M.\", \"Flanger\"];\n\n  @override\n  List<int> get midiValues => [0, 1, 2];\n}\n\nclass TouchWahModeFormatter extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Type:\";\n\n  @override\n  List<String> get labelValues => [\"Cry\", \"VX\", \"Full\", \"Talk\"];\n\n  @override\n  List<int> get midiValues => [0, 32, 64, 96];\n}\n\nclass TouchWahModeFormatterLiteMk2 extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Type:\";\n\n  @override\n  List<String> get labelValues => [\"Cry\", \"VX\", \"Full\", \"Talk\"];\n\n  @override\n  List<int> get midiValues => [0, 1, 2, 3];\n}\n\nclass TouchWahDirectionFormatterPro extends SwitchFormatter {\n  @override\n  String get labelTitle => \"Up/Down Switch:\";\n\n  @override\n  List<String> get labelValues => [\"Down\", \"Up\"];\n\n  @override\n  List<int> get midiValues => [0, 1];\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/TempoFormatter.dart",
    "content": "import '../../../UI/pages/settings.dart';\nimport '../../../platform/simpleSharedPrefs.dart';\nimport 'ValueFormatter.dart';\n\nclass TempoFormatter extends ValueFormatter {\n  @override\n  InputType get inputType => InputType.SliderInput;\n\n  static const delayTimeMstable = [\n    .07972789115646259,\n    .16124716553287982,\n    .5031292517006802,\n    .7398412698412699,\n    1.1972789115646258\n  ];\n\n  List<double> get delayMsTable => delayTimeMstable;\n\n  double percentageToTime(double p) {\n    double t = p / 25;\n    int lo = t.floor();\n    int hi = t.ceil();\n    var hiF = t - lo;\n    var loF = 1 - hiF;\n    return (delayMsTable[lo] * loF + delayMsTable[hi] * hiF);\n  }\n\n  double percentageToBPM(double p) {\n    return 60 / percentageToTime(p);\n  }\n\n  double bpmToPercentage(double b) {\n    return timeToPercentage(60 / b);\n  }\n\n  double timeToPercentage(t) {\n    return (t < delayMsTable[0]\n        ? 0\n        : t < delayMsTable[1]\n            ? 25 * (t - delayMsTable[0]) / (delayMsTable[1] - delayMsTable[0])\n            : t < delayMsTable[2]\n                ? 25 *\n                        (t - delayMsTable[1]) /\n                        (delayMsTable[2] - delayMsTable[1]) +\n                    25\n                : t < delayMsTable[3]\n                    ? 25 *\n                            (t - delayMsTable[2]) /\n                            (delayMsTable[3] - delayMsTable[2]) +\n                        50\n                    : t < delayMsTable[4]\n                        ? 25 *\n                                (t - delayMsTable[3]) /\n                                (delayMsTable[4] - delayMsTable[3]) +\n                            75\n                        : 100);\n  }\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return (value / 100 * 127).floor();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return (midi7bit / 127.0) * 100;\n  }\n\n  @override\n  String toLabel(double value) {\n    var unit =\n        SharedPrefs().getValue(SettingsKeys.timeUnit, TimeUnit.BPM.index);\n    if (unit == TimeUnit.BPM.index) {\n      return \"${percentageToBPM(value).toStringAsFixed(2)} BPM\";\n    }\n    return \"${percentageToTime(value).toStringAsFixed(2)} s\";\n  }\n\n  @override\n  double toHumanInput(double value) {\n    var unit = TimeUnit.values[\n        SharedPrefs().getValue(SettingsKeys.timeUnit, TimeUnit.BPM.index)];\n\n    if (unit == TimeUnit.BPM) return percentageToBPM(value);\n    return percentageToTime(value);\n  }\n\n  @override\n  double fromHumanInput(double value) {\n    var unit = TimeUnit.values[\n        SharedPrefs().getValue(SettingsKeys.timeUnit, TimeUnit.BPM.index)];\n    if (unit == TimeUnit.BPM) return bpmToPercentage(value);\n    return timeToPercentage(value);\n  }\n}\n\n//Tempo formatter for digital and Pan Delay\nclass TempoFormatterPro extends TempoFormatter {\n  static const delayTimeMstable = [\n    .07972789115646259,\n    .16124716553287982,\n    .5031292517006802,\n    .7398412698412699,\n    .9902292\n  ];\n\n  @override\n  List<double> get delayMsTable => delayTimeMstable;\n\n  @override\n  int valueToMidi7Bit(double value) {\n    return value.round();\n  }\n\n  @override\n  double midi7BitToValue(int midi7bit) {\n    return midi7bit.toDouble();\n  }\n}\n\nclass TempoFormatterProMod extends TempoFormatterPro {\n  static const delayTimeMstable = [\n    0.01825,\n    0.198292,\n    0.5982083,\n    1.0399583,\n    1.1918125\n  ];\n\n  @override\n  List<double> get delayMsTable => delayTimeMstable;\n}\n\nclass TempoFormatterProAnalog extends TempoFormatterPro {\n  static const delayTimeMstable = [\n    0.0402708333333333,\n    0.1602916666666667,\n    0.2803125,\n    0.3307291666666667,\n    0.4007708333333333\n  ];\n\n  @override\n  List<double> get delayMsTable => delayTimeMstable;\n}\n\nclass TempoFormatterProTapeEcho extends TempoFormatterPro {\n  static const delayTimeMstable = [\n    0.0533125,\n    0.1883125,\n    0.3980416666666667,\n    0.4881458333333333,\n    0.5459375\n  ];\n\n  @override\n  List<double> get delayMsTable => delayTimeMstable;\n}\n"
  },
  {
    "path": "lib/bluetooth/devices/value_formatters/ValueFormatter.dart",
    "content": "import 'package:mighty_plug_manager/bluetooth/devices/value_formatters/FrequencyFormatter.dart';\nimport 'package:mighty_plug_manager/bluetooth/devices/value_formatters/SwitchFormatters.dart';\n\nimport 'TempoFormatter.dart';\nimport 'DecibelFormatter.dart';\nimport 'PercentageFormatter.dart';\n\nenum InputType { SliderInput, SwitchInput }\n\nclass ValueFormatters {\n  static PercentageFormatter percentage = PercentageFormatter();\n  static PercentageFormatterMPPro percentageMPPro = PercentageFormatterMPPro();\n  static DecibelFormatterMP2 decibelMP2 = DecibelFormatterMP2();\n  static DecibelFormatterMPPro decibelMPPro = DecibelFormatterMPPro();\n  static DecibelFormatterEQ decibelEQ = DecibelFormatterEQ();\n  static TempoFormatter tempo = TempoFormatter();\n  static TempoFormatterPro tempoPro = TempoFormatterPro();\n  static TempoFormatterProMod tempoProMod = TempoFormatterProMod();\n  static TempoFormatterProAnalog tempoProAnalog = TempoFormatterProAnalog();\n  static TempoFormatterProTapeEcho tempoProTapeEcho =\n      TempoFormatterProTapeEcho();\n  static BrightModeFormatter brightMode = BrightModeFormatter();\n  static BrightModeFormatterMPPro brightModePro = BrightModeFormatterMPPro();\n  static BoostModeFormatter boostMode = BoostModeFormatter();\n  static BoostModeFormatterMPPro boostModePro = BoostModeFormatterMPPro();\n  static VibeModeFormatter vibeMode = VibeModeFormatter();\n  static VibeModeFormatterPro vibeModePro = VibeModeFormatterPro();\n  static ContourModeFormatter contourMode = ContourModeFormatter();\n  static SCFModeFormatter scfMode = SCFModeFormatter();\n  static LowFrequencyFormatter lowFreqFormatter = LowFrequencyFormatter();\n  static HighFrequencyFormatter highFreqFormatter = HighFrequencyFormatter();\n  static TouchWahModeFormatter touchWahFormatter = TouchWahModeFormatter();\n  static TouchWahModeFormatterLiteMk2 touchWahFormatterLiteMk2 =\n      TouchWahModeFormatterLiteMk2();\n  static TouchWahDirectionFormatterPro touchWahDirectionFormatterPro =\n      TouchWahDirectionFormatterPro();\n}\n\nabstract class ValueFormatter {\n  InputType get inputType;\n  int get min => 0;\n  int get max => 100;\n\n  int valueToMidi7Bit(double value);\n  double midi7BitToValue(int midi7bit);\n  String toLabel(double value);\n  double toHumanInput(double value) {\n    return value;\n  }\n\n  double fromHumanInput(double value) {\n    return value;\n  }\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/UI/pages/DebugConsolePage.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\n\n//pages\nimport 'UI/mainTabs.dart';\nimport 'UI/theme.dart';\nimport 'audio/trackdata/trackData.dart';\nimport 'bluetooth/NuxDeviceControl.dart';\n\n//recreate this file with your own api keys\n//import 'configKeys.dart';\nimport 'modules/cloud/cloudManager.dart';\n\n//able to create snackbars/messages everywhere\nfinal navigatorKey = GlobalKey<NavigatorState>();\nfinal bucketGlobal = PageStorageBucket();\n\nvoid main() {\n  runZoned(() {\n    //configuration data is needed before start of the app\n    WidgetsFlutterBinding.ensureInitialized();\n    SharedPrefs prefs = SharedPrefs();\n\n    prefs.waitLoading().then((value) {\n      PresetsStorage storage = PresetsStorage();\n      storage.init().then((value) => mainRunApp());\n    });\n  }, zoneSpecification: ZoneSpecification(\n      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {\n    parent.print(zone, line);\n    DebugConsole.print(line);\n  }));\n}\n\nmainRunApp() {\n  if (kDebugMode) CloudManager.instance.initialize();\n\n  // Run the app within a zone\n  runApp(const App());\n}\n\nclass App extends StatefulWidget {\n  const App({Key? key}) : super(key: key);\n\n  @override\n  State createState() => _AppState();\n}\n\nclass _AppState extends State<App> {\n  NuxDeviceControl device = NuxDeviceControl.instance();\n  SharedPrefs prefs = SharedPrefs();\n  TrackData trackData = TrackData();\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Mightier Amp',\n      theme: getTheme(),\n      home: MainTabs(),\n      scrollBehavior: const MaterialScrollBehavior().copyWith(\n        dragDevices: {\n          PointerDeviceKind.mouse,\n          PointerDeviceKind.touch,\n          PointerDeviceKind.stylus,\n          PointerDeviceKind.unknown\n        },\n      ),\n      //showSemanticsDebugger: true,\n      navigatorKey: navigatorKey,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/midi/BleMidiManager.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\n\nimport '../bluetooth/ble_controllers/BLEController.dart';\nimport 'ControllerConstants.dart';\nimport 'MidiControllerManager.dart';\nimport 'controllers/BleMidiController.dart';\n\nclass BleMidiManager extends ChangeNotifier {\n  //List<MidiDevice> _devices = [];\n\n  bool get isScanning => BLEMidiHandler.instance().isScanning;\n  bool _firstTimeScanned = false;\n  final Function(HotkeyControl) onHotkeyReceived;\n\n  List<BleMidiController> get controllers => _controllers;\n  final List<BleMidiController> _controllers = [];\n\n  bool usbMidiSupported = false;\n\n  StreamSubscription<bool>? _bleScanSub;\n\n  BleMidiManager(this.onHotkeyReceived) {\n    BLEMidiHandler.instance().status.listen(_bleStatusListener);\n  }\n\n  startScan() {\n    if (BLEMidiHandler.instance().isScanning) return;\n\n    for (int i = controllers.length - 1; i >= 0; i--) {\n      if (!controllers[i].connected) controllers.removeAt(i);\n    }\n\n    _bleScanSub =\n        BLEMidiHandler.instance().isScanningStream.listen(_scanStatusListener);\n    BLEMidiHandler.instance().startScanning(true);\n  }\n\n  stopScan() {\n    BLEMidiHandler.instance().stopScanning();\n    _unsubscribeScanListener();\n  }\n\n  createControllers() {\n    var ctrls = BLEMidiHandler.instance().controllerDevices;\n    for (var ctl in ctrls) {\n      var blectl = BleMidiController(ctl, onHotkeyReceived);\n      if (!_controllers.contains(blectl)) {\n        _controllers.add(BleMidiController(ctl, onHotkeyReceived));\n      }\n    }\n  }\n\n  _unsubscribeScanListener() {\n    _bleScanSub?.cancel();\n  }\n\n  _scanStatusListener(bool scanning) {\n    if (scanning == false) _unsubscribeScanListener();\n    notifyListeners();\n  }\n\n  _bleStatusListener(MidiSetupStatus status) {\n    switch (status) {\n      case MidiSetupStatus.bluetoothOff:\n        // TODO: Handle this case.\n        break;\n      case MidiSetupStatus.deviceIdle:\n        if (!_firstTimeScanned) {\n          _firstTimeScanned = true;\n          MidiControllerManager().connectAvailableBLEDevices();\n        }\n        break;\n      case MidiSetupStatus.deviceSearching:\n        // TODO: Handle this case.\n        break;\n      case MidiSetupStatus.deviceFound:\n        createControllers();\n        break;\n      case MidiSetupStatus.deviceConnecting:\n        // TODO: Handle this case.\n        break;\n      case MidiSetupStatus.deviceConnected:\n        // TODO: Handle this case.\n        break;\n      case MidiSetupStatus.deviceDisconnected:\n        // TODO: Handle this case.\n        break;\n      case MidiSetupStatus.unknown:\n        // TODO: Handle this case.\n        break;\n    }\n\n    notifyListeners();\n  }\n}\n"
  },
  {
    "path": "lib/midi/ControllerConstants.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport '../UI/mightierIcons.dart';\n\nclass MidiConstants {\n  static const NoteOn = 0x90;\n  static const NoteOff = 0x80;\n  static const PolyAfterTouch = 0xa0;\n  static const ControlChange = 0xb0;\n  static const ProgramChange = 0xc0;\n  static const ChannelPressure = 0xd0;\n  static const PitchBend = 0xe0;\n}\n\nenum HotkeyControl {\n  PreviousChannel,\n  NextChannel,\n  ChannelByIndex,\n  EffectSlotEnable,\n  EffectSlotDisable,\n  EffectSlotToggle,\n  ParameterSet,\n  DelayTapTempo,\n  MasterVolumeSet,\n  EffectDecrement,\n  EffectIncrement,\n  DrumsStartStop,\n  DrumsVolume,\n  DrumsTempoMinus1,\n  DrumsTempoPlus1,\n  DrumsTempoMinus5,\n  DrumsTempoPlus5,\n  DrumsTempoTap,\n  DrumsPreviousStyle,\n  DrumsNextStyle,\n  LooperRecord,\n  LooperStop,\n  LooperClear,\n  LooperUndoRedo,\n  LooperLevel,\n  JamTracksPlayPause,\n  JamTracksPreviousTrack,\n  JamTracksNextTrack,\n  JamTracksRewind,\n  JamTracksFF,\n  JamTracksABRepeat,\n  PreviousPresetGlobal,\n  NextPresetGlobal,\n  PreviousPresetCategory,\n  NextPresetCategory,\n  ToggleTuner\n}\n\nextension HotkeyLabel on HotkeyControl {\n  String? get label {\n    switch (this) {\n      case HotkeyControl.DrumsStartStop:\n        return 'Start/Stop';\n      case HotkeyControl.DrumsVolume:\n        return 'Volume';\n      case HotkeyControl.DrumsTempoMinus1:\n        return 'Tempo -1';\n      case HotkeyControl.DrumsTempoPlus1:\n        return 'Tempo +1';\n      case HotkeyControl.DrumsTempoMinus5:\n        return 'Tempo -5';\n      case HotkeyControl.DrumsTempoPlus5:\n        return 'Tempo +5';\n      case HotkeyControl.DrumsTempoTap:\n        return \"Tap Tempo\";\n      case HotkeyControl.DrumsPreviousStyle:\n        return \"Previous Style\";\n      case HotkeyControl.DrumsNextStyle:\n        return \"Next Style\";\n\n      case HotkeyControl.LooperRecord:\n        return 'Record/Play/Overdub';\n      case HotkeyControl.LooperStop:\n        return \"Stop\";\n      case HotkeyControl.LooperClear:\n        return \"Clear\";\n      case HotkeyControl.LooperUndoRedo:\n        return \"Undo/Redo\";\n      case HotkeyControl.LooperLevel:\n        return \"Level\";\n\n      case HotkeyControl.JamTracksPlayPause:\n        return \"Play/Pause\";\n      case HotkeyControl.JamTracksPreviousTrack:\n        return \"Previous Track\";\n      case HotkeyControl.JamTracksNextTrack:\n        return \"Next Track\";\n      case HotkeyControl.JamTracksRewind:\n        return \"Rewind\";\n      case HotkeyControl.JamTracksFF:\n        return \"Fast Forward\";\n      case HotkeyControl.JamTracksABRepeat:\n        return \"A-B Repeat\";\n\n      case HotkeyControl.ToggleTuner:\n        return \"Toggle Tuner\";\n      default:\n        return null;\n    }\n  }\n\n  IconData? get icon {\n    switch (this) {\n      case HotkeyControl.DrumsStartStop:\n        return Icons.play_arrow;\n      case HotkeyControl.DrumsVolume:\n        return Icons.volume_up;\n      case HotkeyControl.DrumsTempoMinus1:\n        return Icons.keyboard_arrow_left;\n      case HotkeyControl.DrumsTempoPlus1:\n        return Icons.keyboard_arrow_right;\n      case HotkeyControl.DrumsTempoMinus5:\n        return Icons.keyboard_double_arrow_left;\n      case HotkeyControl.DrumsTempoPlus5:\n        return Icons.keyboard_double_arrow_right;\n      case HotkeyControl.DrumsTempoTap:\n        return Icons.touch_app;\n      case HotkeyControl.DrumsPreviousStyle:\n        return Icons.keyboard_arrow_up;\n      case HotkeyControl.DrumsNextStyle:\n        return Icons.keyboard_arrow_down;\n      case HotkeyControl.LooperRecord:\n        return Icons.fiber_manual_record;\n      case HotkeyControl.LooperStop:\n        return Icons.stop;\n      case HotkeyControl.LooperClear:\n        return Icons.clear;\n      case HotkeyControl.LooperUndoRedo:\n        return Icons.undo;\n      case HotkeyControl.LooperLevel:\n        return Icons.volume_up;\n      case HotkeyControl.JamTracksPlayPause:\n        return Icons.play_arrow;\n      case HotkeyControl.JamTracksPreviousTrack:\n        return Icons.skip_previous;\n      case HotkeyControl.JamTracksNextTrack:\n        return Icons.skip_next;\n      case HotkeyControl.JamTracksRewind:\n        return Icons.fast_rewind;\n      case HotkeyControl.JamTracksFF:\n        return Icons.fast_forward;\n      case HotkeyControl.JamTracksABRepeat:\n        return Icons.repeat;\n      case HotkeyControl.ToggleTuner:\n        return MightierIcons.tuner;\n      default:\n        return null;\n    }\n  }\n\n  bool get sliderMode {\n    switch (this) {\n      case HotkeyControl.ParameterSet:\n      case HotkeyControl.DrumsVolume:\n      case HotkeyControl.MasterVolumeSet:\n      case HotkeyControl.LooperLevel:\n        return true;\n      default:\n        return false;\n    }\n  }\n}\n\nenum HotkeyCategory {\n  Channels,\n  EffectSlots,\n  EffectParameters,\n  Drums,\n  JamTracks,\n  Looper,\n  Misc\n}\n"
  },
  {
    "path": "lib/midi/MidiControllerManager.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\nimport 'package:mighty_plug_manager/midi/UsbMidiManager.dart';\nimport 'package:mighty_plug_manager/midi/controllers/BleMidiController.dart';\nimport 'package:mighty_plug_manager/midi/controllers/HidController.dart';\nimport 'package:path/path.dart' as path;\n\nimport '../bluetooth/ble_controllers/BLEController.dart';\nimport '../platform/platformUtils.dart';\nimport 'BleMidiManager.dart';\nimport 'ControllerConstants.dart';\nimport 'controllers/MidiController.dart';\n\ntypedef MidiDataOverride = void Function(\n    MidiController ctrl, int code, int? sliderValue, String name);\n\nclass MidiControllerManager extends ChangeNotifier {\n  static final MidiControllerManager _controller = MidiControllerManager._();\n\n  late BleMidiManager _bleMidiManager;\n  late UsbMidiManager _usbMidiManager;\n\n  bool get isScanning => _bleMidiManager.isScanning;\n  List<MidiController> get controllers => _controllers;\n  final List<MidiController> _controllers = [];\n\n  late MidiController _hidController;\n\n  MidiDataOverride? dataOverride;\n\n  final StreamController<HotkeyControl> _midiCommandController =\n      StreamController<HotkeyControl>.broadcast();\n\n  Stream<HotkeyControl> get controllerStream => _midiCommandController.stream;\n\n  //file stuff for saving controller assignments\n  static const controllersFile = \"midicontrollers.json\";\n\n  String filePath = \"\";\n  late Directory? storageDirectory;\n  late File _controllersFile;\n  List<dynamic> _controllersData = [];\n\n  factory MidiControllerManager() {\n    return _controller;\n  }\n\n  MidiControllerManager._() {\n    _bleMidiManager = BleMidiManager(_onHotkeyReceived);\n    _usbMidiManager = UsbMidiManager(_onHotkeyReceived, scanUsb);\n    _hidController = HidController(_onHotkeyReceived);\n    _controllers.add(_hidController);\n    _bleMidiManager.addListener(_onBleMidiManagerChanged);\n    loadConfig().then(\n      (_) async {\n        await Future.delayed(const Duration(seconds: 1));\n        scanUsb();\n      },\n    );\n\n    BLEMidiHandler.instance().status.listen(_statusListener);\n  }\n\n  void _statusListener(statusValue) {\n    switch (statusValue) {\n      case MidiSetupStatus.deviceFound:\n        // check if this is valid nux device\n        for (var dev in BLEMidiHandler.instance().controllerDevices) {\n          //don't autoconnect on manual scan\n          if (!BLEMidiHandler.instance().manualScan) {\n            //_midiHandler.connectToDevice(dev.device);\n          }\n        }\n        break;\n    }\n  }\n\n  startScan() {\n    notifyListeners();\n    _controllers.clear();\n\n    //add the hid controller by default\n    _controllers.add(_hidController);\n    _loadControllerHotkeys(_hidController);\n\n    //scan for usb midi devices\n    scanUsb();\n\n    _bleMidiManager.startScan();\n  }\n\n  scanUsb() {\n    _usbMidiManager.getDevices().then(_connectAvailableUsbDevices);\n  }\n\n  stopScan() {\n    _bleMidiManager.stopScan();\n    notifyListeners();\n  }\n\n  _connectAvailableUsbDevices(List<MidiController> devices) {\n    for (var dev in devices) {\n      if (_controllers.contains(dev)) {\n        _controllers.remove(dev);\n      }\n      _controllers.add(dev);\n      dev.setOnStatus(onControllerStatus);\n      dev.setOnDataReceived(onControllerData);\n      if (_loadControllerHotkeys(dev) == true && !dev.connected) {\n        dev.connect();\n      }\n    }\n    notifyListeners();\n  }\n\n  connectAvailableBLEDevices() {\n    for (var c in _controllers) {\n      if (c is BleMidiController) {\n        if (!c.connected) c.connect();\n      }\n    }\n  }\n\n  _onBleMidiManagerChanged() {\n    //check for new device\n    for (var dev in _bleMidiManager.controllers) {\n      if (!_controllers.contains(dev)) {\n        _controllers.add(dev);\n        dev.setOnStatus(onControllerStatus);\n        dev.setOnDataReceived(onControllerData);\n        _loadControllerHotkeys(dev);\n      }\n    }\n    notifyListeners();\n  }\n\n  onControllerStatus(MidiController ctrl, ControllerStatus status) {\n    notifyListeners();\n  }\n\n  onControllerData(MidiController ctrl, List<int> data) {\n    bool consumed = false;\n    int code = 0;\n    int? value = 0;\n    String name = \"\";\n    for (int i = 0; i < data.length - 1; i++) {\n      //check midi message start\n      if (data[i] >= 0x80 && data[i + 1] < 0x80) {\n        int status = data[i] & 0xf0;\n        switch (status) {\n          case MidiConstants.NoteOn:\n            if (data.length - i < 3) break;\n            code = data[i] << 16 | data[i + 1] << 8;\n            value = data[i + 2];\n            if (value == 0) return;\n            if (dataOverride != null) {\n              name = \"NO ${data[i + 1].toRadixString(16)}\";\n            }\n            consumed = true;\n            break;\n          case MidiConstants.PolyAfterTouch:\n            if (data.length - i < 3) break;\n            code = data[i] << 8 | data[i + 1] << 8;\n            value = data[i + 2];\n            if (dataOverride != null) {\n              name = \"PKP ${data[i + 1].toRadixString(16).padLeft(2, '0')}\";\n            }\n            consumed = true;\n            break;\n          case MidiConstants.ControlChange:\n            if (data.length - i < 3) break;\n            code = data[i] << 16 | data[i + 1] << 8 | data[i + 2];\n            value = data[i + 2];\n            if (dataOverride != null) {\n              name =\n                  \"CC ${data[i + 1].toRadixString(16).padLeft(2, '0')} ${data[i + 2].toRadixString(16).padLeft(2, '0')}\";\n            }\n            consumed = true;\n            break;\n          case MidiConstants.ProgramChange:\n            if (data.length - i < 2) break;\n            code = data[i] << 16 | data[i + 1] << 8;\n            value = null;\n\n            if (dataOverride != null) {\n              name = \"PC ${data[i + 1].toRadixString(16).padLeft(2, '0')}\";\n            }\n            consumed = true;\n            break;\n          case MidiConstants.ChannelPressure:\n            if (data.length - i < 2) break;\n            code = data[i] << 8;\n            value = data[i + 1];\n            name = \"CP\";\n            consumed = true;\n            break;\n          case MidiConstants.PitchBend:\n            if (data.length - i < 3) break;\n            code = data[i] << 8;\n            value = data[i + 1] | data[i + 2] << 7;\n            name = \"PB\";\n            consumed = true;\n            break;\n        }\n      }\n      if (consumed) break;\n    }\n\n    //decode message\n    _onControlMessage(ctrl, code, value, name);\n  }\n\n  onHIDData(RawKeyEvent event) {\n    _onControlMessage(_hidController, event.physicalKey.usbHidUsage, null,\n        event.logicalKey.keyLabel);\n  }\n\n  _onControlMessage(\n      MidiController ctrl, int code, int? sliderValue, String name) {\n    //do whatever you do\n    if (dataOverride != null) {\n      dataOverride!.call(ctrl, code, sliderValue, name);\n    } else {\n      //execute function\n      var hk = ctrl.getHotkeyByCode(code, false);\n      hk?.execute(sliderValue);\n    }\n  }\n\n  overrideOnData(MidiDataOverride override) {\n    dataOverride = override;\n  }\n\n  cancelOnDataOverride() {\n    dataOverride = null;\n  }\n\n  Future<void> loadConfig() async {\n    await _getDirectory();\n\n    try {\n      var exists = await _controllersFile.exists();\n      if (exists) {\n        var ctrlJson = await _controllersFile.readAsString();\n        _controllersData = json.decode(ctrlJson);\n        _loadControllerHotkeys(_hidController);\n      }\n    } catch (e) {\n      debugPrint(e.toString());\n    }\n  }\n\n  saveConfig() async {\n    //generate controllers data\n    _controllersData.clear();\n\n    //while json encode does this, it's needed here as well\n    //so prepare it manually\n    for (var c in _controllers) {\n      _controllersData.add(c.toJson());\n    }\n\n    String jsonData = json.encode(_controllersData);\n    await _controllersFile.writeAsString(jsonData);\n  }\n\n  _getDirectory() async {\n    storageDirectory = await PlatformUtils.getAppDataDirectory();\n    filePath = path.join(storageDirectory?.path ?? \"\", controllersFile);\n    _controllersFile = File(filePath);\n  }\n\n  bool _loadControllerHotkeys(MidiController ctrl) {\n    for (var config in _controllersData) {\n      if (config is Map<String, dynamic>) {\n        if (config[\"name\"] == ctrl.name) {\n          ctrl.fromJson(config, _onHotkeyReceived);\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  void _onHotkeyReceived(HotkeyControl hotkey) {\n    _midiCommandController.add(hotkey);\n  }\n}\n"
  },
  {
    "path": "lib/midi/UsbMidiManager.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter_midi_command/flutter_midi_command.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:mighty_plug_manager/midi/MidiControllerManager.dart';\nimport 'package:mighty_plug_manager/midi/controllers/UsbMidiController.dart';\n\nimport '../platform/platformUtils.dart';\nimport 'ControllerConstants.dart';\nimport 'controllers/MidiController.dart';\n\nclass UsbMidiManager {\n  List<MidiDevice> _devices = [];\n  final Function(HotkeyControl) onHotkeyReceived;\n  final Function() onMidiDeviceFound;\n\n  final List<UsbMidiController> _controllers = [];\n\n  bool usbMidiSupported = false;\n\n  UsbMidiManager(this.onHotkeyReceived, this.onMidiDeviceFound) {\n    _init();\n  }\n\n  _init() async {\n    if (PlatformUtils.isAndroid) {\n      var deviceInfoPlugin = DeviceInfoPlugin();\n      final androidInfo = await deviceInfoPlugin.androidInfo;\n      usbMidiSupported = (androidInfo.version.sdkInt) >= 23;\n    } else if (PlatformUtils.isIOS) {\n      //TODO: Check if all ios versions support midi\n      usbMidiSupported = true;\n    }\n    if (usbMidiSupported) {\n      MidiCommand().onMidiDataReceived!.listen(_onDataReceive);\n      MidiCommand().onMidiSetupChanged!.listen(_onMidiSetupChanged);\n    }\n  }\n\n  Future<List<MidiController>> getDevices() async {\n    if (!usbMidiSupported) return [];\n    _devices = await MidiCommand().devices ?? [];\n\n    _controllers.clear();\n    for (var dev in _devices) {\n      var udev = UsbMidiController(dev, onHotkeyReceived);\n      _controllers.add(udev);\n    }\n    return _controllers;\n  }\n\n  // connectToDevice(MidiDevice device) {\n  //   MidiCommand().connectToDevice(device);\n  // }\n\n  _onMidiSetupChanged(String data) {\n    //deviceFound - when plugged in - might be used for scanning\n    //deviceLost - for disconnect\n    //deviceOpened - for connect\n    //onDeviceStatusChanged - for connect probably\n    var ctls = MidiControllerManager().controllers;\n\n    if (data == \"deviceLost\") {\n      for (var ctl in ctls) {\n        if (ctl is UsbMidiController) ctl.checkForDisconnection();\n      }\n    } else if (data == \"deviceFound\") {\n      onMidiDeviceFound();\n    } else if (data == \"deviceOpened\") {}\n    debugPrint(\"OnMidiSetupChanged: $data\");\n  }\n\n  _onDataReceive(MidiPacket event) {\n    //find which device this belongs to\n    var ctls = MidiControllerManager().controllers;\n    for (var ctl in ctls) {\n      if (ctl.id == event.device.id) {\n        (ctl as UsbMidiController).onDataReceivedLoopback(event.data);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/midi/controllers/BleMidiController.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:mighty_plug_manager/bluetooth/bleMidiHandler.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nimport '../../bluetooth/ble_controllers/BLEController.dart';\n\nclass BleMidiController extends MidiController {\n  final BLEScanResult _scanResult;\n  BLEConnection? _bleConnection;\n  StreamSubscription? _characteristicSubscription;\n  StreamSubscription? _deviceStatusSubscription;\n\n  @override\n  ControllerType get type => ControllerType.MidiBle;\n\n  BleMidiController(this._scanResult, super.onHotkeyReceived);\n\n  @override\n  String get id => _scanResult.id;\n\n  @override\n  String get name => _scanResult.name;\n\n  @override\n  bool get connected => _connected;\n  bool _connected = false;\n\n  @override\n  Future<bool> connect() async {\n    _bleConnection =\n        await BLEMidiHandler.instance().connectToDevice(_scanResult.device);\n\n    if (_bleConnection != null) {\n      _onConnected();\n    }\n    return _bleConnection != null;\n  }\n\n  _onConnected() {\n    _deviceStatusSubscription =\n        _scanResult.device.state.listen(_deviceStateListener);\n    _connected = true;\n\n    _characteristicSubscription =\n        _bleConnection!.data.listen(_onDataReceivedEvent);\n  }\n\n  _onDataReceivedEvent(List<int> data) {\n    onDataReceived?.call(this, data);\n  }\n\n  _deviceStateListener(BleDeviceState event) {\n    if (event == BleDeviceState.disconnected) {\n      //remove device from the list\n      debugPrint(\"Midi controller disconnected\");\n      _connected = false;\n      onStatus?.call(this, ControllerStatus.Disconnected);\n      _characteristicSubscription?.cancel();\n      _deviceStatusSubscription?.cancel();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/midi/controllers/ControllerHotkey.dart",
    "content": "import 'package:mighty_plug_manager/audio/setlist_player/setlistPlayerState.dart';\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:mighty_plug_manager/utilities/DelayTapTimer.dart';\nimport '../../bluetooth/devices/NuxDevice.dart';\nimport '../../bluetooth/devices/effects/MidiControllerHandles.dart';\nimport '../../bluetooth/devices/effects/Processor.dart';\nimport '../../bluetooth/devices/features/looper.dart';\nimport '../../bluetooth/devices/presets/Preset.dart';\nimport '../../bluetooth/devices/value_formatters/ValueFormatter.dart';\nimport '../../utilities/MathEx.dart';\nimport '../../bluetooth/devices/value_formatters/TempoFormatter.dart';\nimport '../../modules/tempo_trainer.dart';\nimport '../ControllerConstants.dart';\n\nclass ControllerHotkey {\n  //type of value it controls\n  HotkeyControl control;\n\n  //friendly name\n  String hotkeyName;\n\n  //code that activates it - either 16 bit midi message or HID code\n  int hotkeyCode;\n\n  //main parameter - i.e. channel or slot\n  int index;\n\n  //sub parameter - which slider for example\n  int subIndex;\n\n  //whether to invert knob/slider style value\n  bool invertSlider;\n\n  final Function(HotkeyControl) onHotkeyReceived;\n\n  NuxDevice? _cachedDevice;\n  int? _cachedSlot;\n  int? _cachedFX;\n  int? _cachedParameter;\n\n  ControllerHotkey(\n      {required this.onHotkeyReceived,\n      required this.control,\n      required this.index,\n      required this.subIndex,\n      required this.hotkeyCode,\n      required this.hotkeyName,\n      required this.invertSlider});\n\n  execute(int? value) {\n    var device = NuxDeviceControl().device;\n    int channel = device.selectedChannel;\n    switch (control) {\n      case HotkeyControl.PreviousChannel:\n        do {\n          channel--;\n          if (channel < 0) channel = device.channelsCount - 1;\n        } while (!device.getChannelActive(channel));\n        device.setSelectedChannel(channel,\n            notifyBT: true, sendFullPreset: false, notifyUI: true);\n        device.getPreset(device.selectedChannel).setupPresetFromNuxData();\n        break;\n      case HotkeyControl.NextChannel:\n        do {\n          channel++;\n          if (channel >= device.channelsCount) channel = 0;\n        } while (!device.getChannelActive(channel));\n        device.setSelectedChannel(channel,\n            notifyBT: true, sendFullPreset: false, notifyUI: true);\n        device.getPreset(device.selectedChannel).setupPresetFromNuxData();\n        break;\n      case HotkeyControl.ChannelByIndex:\n        device.setSelectedChannel(index,\n            notifyBT: true, sendFullPreset: false, notifyUI: true);\n        device.getPreset(device.selectedChannel).setupPresetFromNuxData();\n        break;\n      case HotkeyControl.EffectSlotEnable:\n        var p = device.getPreset(device.selectedChannel);\n        var slot = _findSlotByFunction(control);\n        if (slot != null) {\n          p.setSlotEnabled(slot, true, true);\n          NuxDeviceControl.instance().forceNotifyListeners();\n        }\n        break;\n      case HotkeyControl.EffectSlotDisable:\n        var p = device.getPreset(device.selectedChannel);\n        var slot = _findSlotByFunction(control);\n        if (slot != null) {\n          p.setSlotEnabled(slot, false, true);\n          NuxDeviceControl.instance().forceNotifyListeners();\n        }\n        break;\n      case HotkeyControl.EffectSlotToggle:\n        var p = device.getPreset(device.selectedChannel);\n        var slot = _findSlotByFunction(control);\n        if (slot != null) {\n          p.setSlotEnabled(slot, !p.slotEnabled(slot), true);\n          NuxDeviceControl.instance().forceNotifyListeners();\n        }\n        break;\n      case HotkeyControl.EffectDecrement:\n        var p = device.getPreset(device.selectedChannel);\n        var slot = _findSlotByFunction(control);\n        if (slot != null) {\n          var effects = p.getEffectsForSlot(slot);\n          var effect = p.getSelectedEffectForSlot(slot) - 1;\n          if (effect < 0) effect = effects.length - 1;\n          p.setSelectedEffectForSlot(slot, effect, true);\n          NuxDeviceControl.instance().forceNotifyListeners();\n        }\n        break;\n      case HotkeyControl.EffectIncrement:\n        var p = device.getPreset(device.selectedChannel);\n        var slot = _findSlotByFunction(control);\n        if (slot != null) {\n          var effects = p.getEffectsForSlot(slot);\n          var effect = p.getSelectedEffectForSlot(slot) + 1;\n          if (effect > effects.length - 1) effect = 0;\n          p.setSelectedEffectForSlot(slot, effect, true);\n          NuxDeviceControl.instance().forceNotifyListeners();\n        }\n        break;\n      case HotkeyControl.MasterVolumeSet:\n        var val = midiToPercentage(value);\n        if (device.fakeMasterVolume) {\n          NuxDeviceControl.instance().masterVolume = val;\n        } else {\n          NuxDeviceControl.instance().masterVolume =\n              _mapValueToFormatter(val, device.decibelFormatter!);\n        }\n        break;\n      case HotkeyControl.ParameterSet:\n        if (index >= ControllerHandleId.values.length) return;\n        _hotkeyParameterSet(value, device);\n        break;\n      case HotkeyControl.DelayTapTempo:\n        if (index >= ControllerHandleId.values.length) return;\n        _delayTapTempo(device);\n        break;\n      case HotkeyControl.DrumsStartStop:\n        if (!device.deviceControl.isConnected) return;\n        device.setDrumsEnabled(!device.drumsEnabled);\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.DrumsVolume:\n        device.setDrumsLevel(midiToPercentage(value), true);\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.DrumsTempoMinus1:\n        _modifyTempo(device, -1);\n        break;\n      case HotkeyControl.DrumsTempoMinus5:\n        _modifyTempo(device, -5);\n        break;\n      case HotkeyControl.DrumsTempoPlus1:\n        _modifyTempo(device, 1);\n        break;\n      case HotkeyControl.DrumsTempoPlus5:\n        _modifyTempo(device, 5);\n        break;\n      case HotkeyControl.DrumsTempoTap:\n        _tapTempo(device);\n        break;\n      case HotkeyControl.DrumsPreviousStyle:\n        var ds = device.selectedDrumStyle - 1;\n        if (ds < 0) {\n          ds = device.getDrumStylesCount() - 1;\n        }\n        device.setDrumsStyle(ds);\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.DrumsNextStyle:\n        var ds = device.selectedDrumStyle + 1;\n        if (ds >= device.getDrumStylesCount()) {\n          ds = 0;\n        }\n        device.setDrumsStyle(ds);\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.LooperRecord:\n        if (device is! Looper || !device.deviceControl.isConnected) return;\n        if (TempoTrainer.instance().enable == true) {\n          TempoTrainer.instance().enable = false;\n        }\n        (device as Looper).looperRecordPlay();\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.LooperStop:\n        if (device is! Looper || !device.deviceControl.isConnected) return;\n        (device as Looper).looperStop();\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.LooperClear:\n        if (device is! Looper || !device.deviceControl.isConnected) return;\n        (device as Looper).looperClear();\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.LooperUndoRedo:\n        if (device is! Looper || !device.deviceControl.isConnected) return;\n        (device as Looper).looperUndoRedo();\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.LooperLevel:\n        if (device is! Looper || !device.deviceControl.isConnected) return;\n        (device as Looper).looperLevel(midiToPercentage(value).toInt());\n        NuxDeviceControl.instance().forceNotifyListeners();\n        break;\n      case HotkeyControl.JamTracksPlayPause:\n        SetlistPlayerState.instance().playPause();\n        break;\n      case HotkeyControl.JamTracksPreviousTrack:\n        SetlistPlayerState.instance().previous();\n        break;\n      case HotkeyControl.JamTracksNextTrack:\n        SetlistPlayerState.instance().next();\n        break;\n      case HotkeyControl.JamTracksRewind:\n        SetlistPlayerState.instance().setPosition(\n            (SetlistPlayerState.instance().currentPosition -\n                    const Duration(seconds: 5))\n                .inMilliseconds);\n        break;\n      case HotkeyControl.JamTracksFF:\n        SetlistPlayerState.instance().setPosition(\n            (SetlistPlayerState.instance().currentPosition +\n                    const Duration(seconds: 5))\n                .inMilliseconds);\n        break;\n      case HotkeyControl.JamTracksABRepeat:\n        SetlistPlayerState.instance().toggleABRepeat();\n        break;\n      case HotkeyControl.PreviousPresetGlobal:\n        _changeToAdjacentPreset(device, true, PresetChangeDirection.previous);\n        break;\n      case HotkeyControl.NextPresetGlobal:\n        _changeToAdjacentPreset(device, true, PresetChangeDirection.next);\n        break;\n      case HotkeyControl.PreviousPresetCategory:\n        _changeToAdjacentPreset(device, false, PresetChangeDirection.previous);\n        break;\n      case HotkeyControl.NextPresetCategory:\n        _changeToAdjacentPreset(device, false, PresetChangeDirection.next);\n        break;\n      default:\n        onHotkeyReceived(control);\n    }\n  }\n\n  double midiToPercentage(int? midiVal) {\n    var val = midiVal ?? 0;\n    if (invertSlider) val = 127 - val;\n    return (val / 127) * 100;\n  }\n\n  void _changeToAdjacentPreset(\n      NuxDevice device, bool acrossCategories, PresetChangeDirection dir) {\n    var uuid = NuxDeviceControl.instance().presetUUID;\n    for (int i = 0; i < 200; i++) {\n      var preset =\n          PresetsStorage().findAdjacentPreset(uuid, acrossCategories, dir);\n      if (preset != null &&\n          preset[\"uuid\"] != uuid &&\n          device.isPresetSupported(preset)) {\n        device.presetFromJson(preset, null);\n        break;\n      } else if (preset != null) {\n        uuid = preset[\"uuid\"];\n      }\n    }\n  }\n\n  void _modifyTempo(NuxDevice device, double amount) {\n    double newTempo = device.drumsTempo + amount;\n    device.setDrumsTempo(newTempo, true);\n    NuxDeviceControl.instance().forceNotifyListeners();\n  }\n\n  void _tapTempo(NuxDevice device) {\n    DelayTapTimer.addClickTime();\n    var bpm = DelayTapTimer.calculateBpm();\n    if (bpm != false) {\n      device.setDrumsTempo(bpm, true);\n      NuxDeviceControl.instance().forceNotifyListeners();\n    }\n  }\n\n  void _delayTapTempo(NuxDevice device) {\n    var p = _getEffectCached(device);\n\n    if (_cachedSlot == null || _cachedSlot! >= device.effectsChainLength) {\n      return;\n    }\n\n    DelayTapTimer.addClickTime();\n    var bpm = DelayTapTimer.calculate();\n    if (bpm != false) {\n      var selectedFX = p.getSelectedEffectForSlot(_cachedSlot!);\n      var effect = p.getEffectsForSlot(_cachedSlot!)[selectedFX];\n      var param = effect.parameters[_cachedParameter!];\n      var newValue =\n          (param.formatter as TempoFormatter).timeToPercentage(bpm / 1000);\n      p.setParameterValue(param, newValue);\n\n      NuxDeviceControl.instance().forceNotifyListeners();\n    }\n  }\n\n  void _hotkeyParameterSet(int? value, NuxDevice device) {\n    var p = _getEffectCached(device);\n\n    if (_cachedSlot == null || _cachedSlot! >= device.effectsChainLength) {\n      return;\n    }\n    var selectedFX = p.getSelectedEffectForSlot(_cachedSlot!);\n    var effect = p.getEffectsForSlot(_cachedSlot!)[selectedFX];\n\n    double val = midiToPercentage(value);\n\n    //Translate the 0-100 value into the range of the parameter\n    val = _mapValueToFormatter(\n        val, effect.parameters[_cachedParameter!].formatter);\n    p.setParameterValue(effect.parameters[_cachedParameter!], val);\n    NuxDeviceControl.instance().forceNotifyListeners();\n  }\n\n  double _mapValueToFormatter(double value, ValueFormatter formatter) {\n    return MathEx.map(\n        value, 0, 100, formatter.min.toDouble(), formatter.max.toDouble());\n  }\n\n  Preset _getEffectCached(NuxDevice device) {\n    ControllerHandleId id = ControllerHandleId.values[index];\n\n    bool deviceChanged = device != _cachedDevice;\n    _cachedDevice = device;\n\n    var p = device.getPreset(device.selectedChannel);\n\n    //find slot and cache it\n    if (deviceChanged ||\n        _cachedSlot == null ||\n        _cachedFX != p.getSelectedEffectForSlot(_cachedSlot!)) {\n      _cachedSlot = null;\n      _cachedFX = null;\n      _cachedParameter = null;\n      for (int i = 0; i < device.effectsChainLength; i++) {\n        var selectedFX = p.getSelectedEffectForSlot(i);\n        var effect = p.getEffectsForSlot(i)[selectedFX];\n        var paramIndex = _findParameterByControllerHandleId(effect, id);\n        if (paramIndex != null) {\n          _cachedSlot = i;\n          _cachedFX = selectedFX;\n          _cachedParameter = paramIndex;\n          break;\n        }\n      }\n    }\n    return p;\n  }\n\n  int? _findSlotByFunction(HotkeyControl func) {\n    var device = NuxDeviceControl().device;\n    if (index >= ControllerHandleId.values.length) return null;\n    ControllerHandleId id = ControllerHandleId.values[index];\n    var p = device.getPreset(device.selectedChannel);\n    int? slot;\n    for (int i = 0; i < device.effectsChainLength; i++) {\n      if (func == HotkeyControl.EffectSlotDisable &&\n          p.getEffectsForSlot(i)[0].midiControlOff?.id == id) {\n        slot = i;\n        break;\n      } else if (func == HotkeyControl.EffectSlotEnable &&\n          p.getEffectsForSlot(i)[0].midiControlOn?.id == id) {\n        slot = i;\n        break;\n      } else if (func == HotkeyControl.EffectSlotToggle &&\n          p.getEffectsForSlot(i)[0].midiControlToggle?.id == id) {\n        slot = i;\n        break;\n      } else if (func == HotkeyControl.EffectDecrement &&\n          p.getEffectsForSlot(i)[0].midiControlPrev?.id == id) {\n        slot = i;\n        break;\n      } else if (func == HotkeyControl.EffectIncrement &&\n          p.getEffectsForSlot(i)[0].midiControlNext?.id == id) {\n        slot = i;\n        break;\n      }\n    }\n    return slot;\n  }\n\n  int? _findParameterByControllerHandleId(\n      Processor proc, ControllerHandleId id) {\n    for (int i = 0; i < proc.parameters.length; i++) {\n      if (proc.parameters[i].midiControllerHandle?.id == id) return i;\n    }\n    return null;\n  }\n\n  Map<String, dynamic> toJson() {\n    var data = <String, dynamic>{};\n    data[\"name\"] = hotkeyName;\n    data[\"control\"] = control.toString();\n    data[\"code\"] = hotkeyCode;\n    data[\"index\"] = index;\n    data[\"subIndex\"] = subIndex;\n    data[\"invert\"] = invertSlider;\n    return data;\n  }\n\n  factory ControllerHotkey.fromJson(\n      dynamic json, Function(HotkeyControl) onReceived) {\n    ControllerHotkey hk = ControllerHotkey(\n        control: getHKFromString(json[\"control\"]),\n        hotkeyCode: json[\"code\"],\n        hotkeyName: json[\"name\"],\n        index: json[\"index\"],\n        subIndex: json[\"subIndex\"],\n        invertSlider: json[\"invert\"] ?? false,\n        onHotkeyReceived: onReceived);\n    return hk;\n  }\n\n  static HotkeyControl getHKFromString(String controlAsString) {\n    for (var element in HotkeyControl.values) {\n      if (element.toString() == controlAsString) {\n        return element;\n      }\n    }\n    throw Exception(\"Error: Unknown HotkeyControl type: $controlAsString\");\n  }\n}\n"
  },
  {
    "path": "lib/midi/controllers/HidController.dart",
    "content": "import 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nclass HidController extends MidiController {\n  HidController(super.onHotkeyReceived);\n\n  @override\n  Future<bool> connect() {\n    return Future.value(true);\n  }\n\n  @override\n  // HID is always connected\n  bool get connected => true;\n\n  @override\n  // TODO: implement id\n  String get id => \"__hid__\";\n\n  @override\n  // TODO: implement name\n  String get name => \"HID Input\";\n\n  @override\n  // TODO: implement type\n  ControllerType get type => ControllerType.Hid;\n}\n"
  },
  {
    "path": "lib/midi/controllers/MidiController.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:mighty_plug_manager/midi/ControllerConstants.dart';\n\nimport 'ControllerHotkey.dart';\n\nenum ControllerType { Hid, MidiUsb, MidiBle }\n\nenum ControllerStatus { Connected, Disconnected }\n\nabstract class MidiController {\n  String get name;\n  String get id;\n  ControllerType get type;\n  final Function(HotkeyControl) onHotkeyReceived;\n\n  MidiController(this.onHotkeyReceived);\n  final List<ControllerHotkey> _hotkeys = [];\n\n  //faster access by code\n  final Map<int, ControllerHotkey> _hotkeysDictionary = {};\n\n  assignHotkey(HotkeyControl ctrl, int index, int subindex, int keyCode,\n      String hotkeyName, bool invert) {\n    //find if already set for this function\n    if (ctrl == HotkeyControl.ParameterSet) keyCode &= 0xffffff00;\n\n    var hk = getHotkeyByFunction(ctrl, index, subindex);\n    if (hk == null) {\n      hk = ControllerHotkey(\n          control: ctrl,\n          index: index,\n          subIndex: subindex,\n          hotkeyCode: keyCode,\n          hotkeyName: hotkeyName,\n          invertSlider: invert,\n          onHotkeyReceived: onHotkeyReceived);\n    } else {\n      hk.hotkeyCode = keyCode;\n      hk.hotkeyName = hotkeyName;\n    }\n\n    if (!_hotkeys.contains(hk)) {\n      _hotkeys.add(hk);\n    }\n    _rebuildDictionary();\n  }\n\n  removeHotkey(ControllerHotkey? hk) {\n    if (hk != null) {\n      _hotkeys.remove(hk);\n      _rebuildDictionary();\n    }\n  }\n\n  removeHotkeyByFunction(HotkeyControl ctrl, int index, int subindex) {\n    var hk = getHotkeyByFunction(ctrl, index, subindex);\n    removeHotkey(hk);\n  }\n\n  ControllerHotkey? getHotkeyByCode(int code, bool ignoreLowByte) {\n    if (_hotkeysDictionary.containsKey(code)) return _hotkeysDictionary[code];\n\n    //now enumerate the dictionary and find keys with the lower byte set to 0\n    var mainCode = code & 0xffffff00;\n    for (var key in _hotkeysDictionary.keys) {\n      var _key = key & 0xffffff00;\n      if (_key == mainCode &&\n          (ignoreLowByte || _hotkeysDictionary[key]!.control.sliderMode)) {\n        return _hotkeysDictionary[key];\n      }\n    }\n\n    return null;\n  }\n\n  ControllerHotkey? getHotkeyByFunction(\n      HotkeyControl ctrl, int index, int subindex) {\n    for (var hk in _hotkeys) {\n      if (hk.control == ctrl && hk.index == index && hk.subIndex == subindex) {\n        return hk;\n      }\n    }\n    return null;\n  }\n\n  _rebuildDictionary() {\n    _hotkeysDictionary.clear();\n    for (var hk in _hotkeys) {\n      _hotkeysDictionary[hk.hotkeyCode] = hk;\n    }\n  }\n\n  @protected\n  void Function(MidiController, ControllerStatus)? onStatus;\n\n  @protected\n  void Function(MidiController, List<int>)? onDataReceived;\n\n  setOnStatus(Function(MidiController, ControllerStatus) event) {\n    onStatus = event;\n  }\n\n  setOnDataReceived(Function(MidiController, List<int>) event) {\n    onDataReceived = event;\n  }\n\n  bool get connected;\n\n  @override\n  bool operator ==(other) {\n    return (other is MidiController) && other.name == name;\n  }\n\n  @override\n  int get hashCode => super.hashCode;\n\n  Future<bool> connect();\n\n  Map<String, dynamic> toJson() {\n    var data = <String, dynamic>{};\n    data[\"name\"] = name;\n    data[\"id\"] = id;\n\n    List<Map<String, dynamic>> hk = [];\n\n    for (int i = 0; i < _hotkeys.length; i++) {\n      hk.add(_hotkeys[i].toJson());\n    }\n    data[\"hotkeys\"] = hk;\n    return data;\n  }\n\n  fromJson(dynamic json, Function(HotkeyControl) onReceived) {\n    if (json[\"hotkeys\"] != null) {\n      _hotkeys.clear();\n      for (var hk in json[\"hotkeys\"]) {\n        try {\n          var hotkey = ControllerHotkey.fromJson(hk, onReceived);\n          _hotkeys.add(hotkey);\n        } on Exception catch (e) {\n          print(e);\n        } finally {}\n      }\n      _rebuildDictionary();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/midi/controllers/UsbMidiController.dart",
    "content": "import 'package:flutter_midi_command/flutter_midi_command.dart';\nimport 'package:mighty_plug_manager/midi/controllers/MidiController.dart';\n\nclass UsbMidiController extends MidiController {\n  MidiDevice device;\n  @override\n  ControllerType get type => ControllerType.MidiUsb;\n  UsbMidiController(this.device, super.onHotkeyReceived);\n\n  @override\n  String get id => device.id;\n\n  String? _name;\n\n  @override\n  String get name {\n    if (_name == null) {\n      _name = device.name;\n\n      // Some androids are adding #XXX where XXX is a random number to the name\n      // of the midi controller. This RegEx strips it from the name\n      RegExp regex = RegExp(r'#\\d+');\n      _name = _name!.replaceAll(regex, '');\n    }\n\n    return _name!;\n  }\n\n  @override\n  bool get connected => device.connected;\n\n  @override\n  Future<bool> connect() async {\n    MidiCommand().connectToDevice(device);\n    //wait for up to 2 seconds\n    for (int i = 0; i < 4; i++) {\n      var devs = await MidiCommand().devices;\n      if (devs != null) {\n        for (var d in devs) {\n          if (d.name == name && d.id == id && d.connected) device = d;\n        }\n      }\n      await Future.delayed(const Duration(milliseconds: 500));\n      if (device.connected) {\n        onStatus?.call(this, ControllerStatus.Connected);\n        return true;\n      }\n    }\n\n    return device.connected;\n  }\n\n  void checkForDisconnection() async {\n    bool found = false;\n    var devs = await MidiCommand().devices;\n    if (devs != null) {\n      for (var d in devs) {\n        if (d.name == name && d.id == id) {\n          device = d;\n          found = true;\n        }\n      }\n    }\n    //a shitty hack to work around missing functionality\n    if (found == false) device.connected = false;\n    if (!device.connected) onStatus?.call(this, ControllerStatus.Disconnected);\n  }\n\n  void onDataReceivedLoopback(List<int> data) {\n    if (data[0] != 248 && data[0] != 254) onDataReceived?.call(this, data);\n  }\n}\n"
  },
  {
    "path": "lib/modules/cloud/cloudManager.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:mighty_plug_manager/modules/cloud/cloudStorageListener.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:pocketbase/pocketbase.dart';\n\nimport 'customAuthStore.dart';\n\nclass CloudManager extends ChangeNotifier {\n  final pb = PocketBase('https://mightier-amp.pockethost.io/',\n      authStore: CustomAuthStore());\n\n  /// private constructor\n  CloudManager._();\n\n  /// the one and only instance of this singleton\n  static final instance = CloudManager._();\n\n  bool _signedIn = false;\n  bool get signedIn => _signedIn;\n\n  String get userId => pb.authStore.model?.id ?? \"\";\n  String get userIdFilter => 'user_id=\"${CloudManager.instance.userId}\"';\n\n  late final CloudStorageListener _storageListener = CloudStorageListener(pb);\n\n  void initialize() async {\n    pb.authStore.onChange.listen(_onAuthChange);\n\n    _signedIn = pb.authStore.isValid;\n    print(\"PocketBase initialized. Signed in = $_signedIn\");\n\n    //used for syncing across devices\n    //PresetsStorage().registerPresetStorageListener(_storageListener);\n\n    //TEST syncing or sth\n    if (_signedIn) {\n      refreshToken();\n      // var sw = Stopwatch()..start();\n      // syncPresets().then((value) {\n      //   sw.stop();\n      //   print(\"List time ${sw.elapsedMilliseconds} ms\");\n      // });\n    }\n  }\n\n  Future<RecordAuth> signIn({required String email, required String password}) {\n    email = email.toLowerCase();\n    return pb.collection('users').authWithPassword(email, password);\n  }\n\n  Future<RecordAuth> refreshToken() {\n    return pb.collection('users').authRefresh();\n  }\n\n  Future register({required String email, required String password}) {\n    email = email.toLowerCase();\n    return pb.collection('users').create(body: {\n      \"email\": email,\n      \"password\": password,\n      \"passwordConfirm\": password,\n      //username: \"Random Name\"\n    });\n  }\n\n  Future requestValidation(String email) {\n    email = email.toLowerCase();\n    return pb.collection('users').requestVerification(email);\n  }\n\n  void signOut() {\n    pb.authStore.clear();\n  }\n\n  _onAuthChange(AuthStoreEvent event) {\n    _signedIn = event.model != null;\n    notifyListeners();\n  }\n\n  /// Presets handling\n\n  Future<RecordModel> createPreset(Map preset, String categoryId) {\n    Map copy = jsonDecode(jsonEncode(preset));\n    copy.remove(\"inactiveEffects\");\n    return pb.collection('presets').create(body: {\n      'name': copy[\"name\"],\n      'uuid': copy['uuid'],\n      'data': copy,\n      \"category_id\": categoryId,\n      \"user_id\": CloudManager.instance.userId\n    });\n  }\n\n  Future<RecordModel> updatePreset(Map preset) async {\n    final pData = await pb\n        .collection('presets')\n        .getFirstListItem('uuid=\"${preset[\"uuid\"]}\"');\n\n    Map copy = jsonDecode(jsonEncode(preset));\n    copy.remove(\"inactiveEffects\");\n\n    return await pb\n        .collection('presets')\n        .update(pData.id, body: {'name': preset[\"name\"], 'data': copy});\n  }\n\n  void syncPresets() async {\n    var sw = Stopwatch()..start();\n\n    var futures = <Future<RecordModel>>[];\n\n    //first create all categories\n    for (int i = 0; i < PresetsStorage().presetsData.length; i++) {\n      var cat = PresetsStorage().presetsData[i];\n      futures.add(pb.collection('categories').create(body: {\n        'name': cat[\"name\"],\n        \"uuid\": cat[\"uuid\"],\n        \"user_id\": CloudManager.instance.userId,\n        \"position\": i\n      }));\n    }\n\n    List<RecordModel> results = await Future.wait(futures);\n    futures.clear();\n    print(\"categories ready\");\n\n    //now create presets\n    for (var cat in PresetsStorage().presetsData) {\n      for (var preset in cat[\"presets\"]) {\n        var catId = results\n            .firstWhere((element) => element.data[\"name\"] == cat[\"name\"]);\n        futures.add(createPreset(preset, catId.id));\n      }\n    }\n    results = await Future.wait(futures);\n    // await pb.collection('presets').create(body: {\n    //   'name': \"AllPresets\",\n    //   'uuid': \"95533e39-f0b8-4edc-940a-b72496c2b2a8\",\n    //   'data': data,\n    //   \"user_id\": CloudManager.instance.userId\n    // });\n    sw.stop();\n    print(\"List time ${sw.elapsedMilliseconds} ms\");\n  }\n}\n"
  },
  {
    "path": "lib/modules/cloud/cloudStorageListener.dart",
    "content": "import 'dart:collection';\n\nimport 'package:mighty_plug_manager/modules/cloud/cloudManager.dart';\nimport 'package:mighty_plug_manager/platform/presetStorageListener.dart';\nimport 'package:mighty_plug_manager/platform/presetsStorage.dart';\nimport 'package:pocketbase/pocketbase.dart';\n\nclass CloudStorageListener implements PresetStorageListener {\n  final PocketBase pb;\n\n  CloudStorageListener(this.pb);\n\n  final ListQueue<Map<String, dynamic>> _creationQueue = ListQueue();\n  final ListQueue<Map<String, dynamic>> _updateQueue = ListQueue();\n  final ListQueue<String> _deletionQueue = ListQueue();\n\n  @override\n  void onPresetCreated(Map<String, dynamic> preset) {\n    var queueLength = _creationQueue.length;\n    _creationQueue.add(preset);\n\n    if (queueLength == 0) _creationQueueHandler();\n  }\n\n  @override\n  void onPresetUpdated(Map<String, dynamic> preset) {\n    var queueLength = _updateQueue.length;\n    _updateQueue.add(preset);\n\n    if (queueLength == 0) _updateQueueHandler();\n  }\n\n  @override\n  void onPresetDeleted(String uuid) {\n    var queueLength = _deletionQueue.length;\n    _deletionQueue.add(uuid);\n    if (queueLength == 0) _deletionQueueHandler();\n  }\n\n  void _creationQueueHandler() async {\n    while (_creationQueue.isNotEmpty) {\n      var data = _creationQueue.first;\n      try {\n        var sw = Stopwatch()..start();\n        final record = await pb.collection('presets').create(body: {\n          'name': data[\"name\"],\n          'uuid': data['uuid'],\n          'data': data,\n          \"user_id\": CloudManager.instance.userId\n        });\n        _creationQueue.removeFirst();\n        sw.stop();\n        print(\"Created in ${sw.elapsedMilliseconds} ms\");\n      } on ClientException catch (e) {\n        print(e);\n        _creationQueue.removeFirst();\n      } finally {}\n    }\n  }\n\n  void _updateQueueHandler() async {\n    while (_updateQueue.isNotEmpty) {\n      var data = _updateQueue.first;\n      try {\n        var sw = Stopwatch()..start();\n        await CloudManager.instance.updatePreset(data);\n        _updateQueue.removeFirst();\n        sw.stop();\n        print(\"Created in ${sw.elapsedMilliseconds} ms\");\n      } on ClientException catch (e) {\n        print(e);\n        _updateQueue.removeFirst();\n      } finally {}\n    }\n  }\n\n  void _deletionQueueHandler() async {\n    while (_deletionQueue.isNotEmpty) {\n      var data = _deletionQueue.first;\n\n      try {\n        var sw = Stopwatch()..start();\n        var result =\n            await pb.collection('presets').getFirstListItem('uuid=\"$data\"');\n\n        var delresult = await pb.collection('presets').delete(result.id);\n        _deletionQueue.removeFirst();\n        sw.stop();\n        print(\"Deleted in ${sw.elapsedMilliseconds} ms\");\n      } on ClientException catch (e) {\n        print(e);\n        //await Future.delayed(Duration(milliseconds: 500));\n        _deletionQueue.removeFirst();\n      } finally {}\n    }\n  }\n\n  @override\n  void onCategoryReordered(int from, int to) async {\n    var categories = await pb\n        .collection(\"categories\")\n        .getFullList(filter: CloudManager.instance.userIdFilter);\n\n    var changed = 0;\n\n    var futures = <Future<RecordModel>>[];\n\n    for (int i = 0; i < PresetsStorage().presetsData.length; i++) {\n      var category = PresetsStorage().presetsData[i];\n      var pbCategory = categories\n          .firstWhere((element) => element.data[\"uuid\"] == category[\"uuid\"]);\n\n      if (pbCategory.data[\"position\"] != i) {\n        futures.add(pb\n            .collection(\"categories\")\n            .update(pbCategory.id, body: {\"position\": i}));\n        changed++;\n      }\n    }\n    await Future.wait(futures);\n    print(\"Changed categories: $changed\");\n  }\n}\n"
  },
  {
    "path": "lib/modules/cloud/customAuthStore.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pocketbase/pocketbase.dart';\n\nimport '../../platform/simpleSharedPrefs.dart';\n\nclass CustomAuthStore extends AuthStore {\n  final String key;\n\n  CustomAuthStore({this.key = \"pb_auth\"}) {\n    final String? raw = SharedPrefs().getValue(key, null);\n\n    if (raw != null && raw.isNotEmpty) {\n      final decoded = jsonDecode(raw);\n      final token = (decoded as Map<String, dynamic>)[\"token\"] as String? ?? \"\";\n      final model =\n          RecordModel.fromJson(decoded[\"model\"] as Map<String, dynamic>? ?? {});\n\n      save(token, model);\n    }\n  }\n\n  @override\n  void save(\n    String newToken,\n    dynamic /* RecordModel|AdminModel|null */ newModel,\n  ) {\n    super.save(newToken, newModel);\n\n    final encoded =\n        jsonEncode(<String, dynamic>{\"token\": newToken, \"model\": newModel});\n\n    SharedPrefs().setValue(key, encoded);\n  }\n\n  @override\n  void clear() {\n    super.clear();\n\n    SharedPrefs().remove(key);\n  }\n}\n"
  },
  {
    "path": "lib/modules/cloud/presetEncoder.dart",
    "content": "class PresetEncoder {\n  //The algorithm is super simple, but works better than any of the\n  //standard algorithms like zlib,bzip etc...\n  //the data is always 7 bit and quite often has long run of zeros\n  //therefore I replace the run of zeros with a byte wiht highest bit set\n  //and the run length. Even if there's just one zero, the run-lenght of it\n  //doesn't take more space. For MPPro presets this achieves ~50% recduction\n  static List<int> encode(List<int> data) {\n    List<int> out = [];\n    int zeroRle = 0;\n    for (var i = 0; i < data.length; i++) {\n      if (data[i] != 0) {\n        out.add(data[i]);\n      } else {\n        zeroRle++;\n\n        if (i == data.length - 1 || data[i + 1] != 0) {\n          //end of zero run\n          var rle = 0x80 | zeroRle;\n          out.add(rle);\n          zeroRle = 0;\n        }\n      }\n    }\n    print(\n        \"${data.length} vs ${out.length} R:${out.length / data.length * 100}\");\n    return out;\n  }\n\n  static List<int> decode(List<int> data) {\n    List<int> decode = [];\n    //decompress\n    for (var i = 0; i < data.length; i++) {\n      if (data[i] & 0x80 != 0) {\n        int len = data[i] & 0x7f;\n        for (var j = 0; j < len; j++) {\n          decode.add(0);\n        }\n      } else {\n        decode.add(data[i]);\n      }\n    }\n    return decode;\n  }\n}\n"
  },
  {
    "path": "lib/modules/tempo_trainer.dart",
    "content": "import 'dart:async';\n\nimport 'package:mighty_plug_manager/bluetooth/NuxDeviceControl.dart';\nimport 'package:mighty_plug_manager/platform/simpleSharedPrefs.dart';\n\nimport '../UI/widgets/thickRangeSlider.dart';\nimport '../bluetooth/devices/NuxDevice.dart';\n\nenum TempoChangeMode { beat, time }\n\nclass TempoTrainer {\n  static final TempoTrainer _tempoTrainer = TempoTrainer._();\n\n  TempoTrainer._() {\n    _loadConfig();\n  }\n\n  NuxDevice get _device => NuxDeviceControl.instance().device;\n\n  factory TempoTrainer.instance() {\n    return _tempoTrainer;\n  }\n\n  Timer? _timer;\n\n  SliderRangeValues tempoRange = SliderRangeValues(80, 200);\n  int tempoStep = 5;\n  TempoChangeMode changeMode = TempoChangeMode.beat;\n\n  //this how much beats or seconds to the next change\n  int changeUnits = 8;\n  bool _enable = false;\n\n  DateTime _expiryTime = DateTime.now();\n  double _durationMs = 0;\n\n  bool get enable => _enable;\n  set enable(enable) {\n    _enable = enable;\n    _device.setDrumsEnabled(enable);\n    NuxDeviceControl.instance().forceNotifyListeners();\n    if (enable) {\n      _startTrainer();\n    } else {\n      _timer?.cancel();\n    }\n  }\n\n  void _startTrainer() {\n    //reset tempo from beginning and setup timer\n    _device.setDrumsTempo(tempoRange.start, true);\n    _setupTimer();\n  }\n\n  void _setupTimer() {\n    //setup for the next iteration of the trainer\n    _durationMs = changeMode == TempoChangeMode.beat\n        ? ((59.9 / _device.drumsTempo) * changeUnits.toDouble()) * 1000\n        : changeUnits.toDouble() * 1000;\n    _expiryTime =\n        DateTime.now().add(Duration(milliseconds: _durationMs.round()));\n    _timer = Timer(Duration(milliseconds: _durationMs.round()), _onTimerStep);\n  }\n\n  double getTimerCountdown() {\n    if (!_enable) return 0;\n    return _expiryTime.difference(DateTime.now()).inMilliseconds / _durationMs;\n  }\n\n  void _onTimerStep() {\n    //increment to the next tempo value\n    var tempo = _device.drumsTempo;\n    tempo += tempoStep;\n    if (tempo > tempoRange.end) tempo = tempoRange.end;\n\n    _device.setDrumsTempo(tempo, true);\n    NuxDeviceControl.instance().forceNotifyListeners();\n    _setupTimer();\n  }\n\n  void _loadConfig() {\n    tempoRange.start =\n        SharedPrefs().getValue(SettingsKeys.tempoTrainerTempoMin, 80.0);\n    tempoRange.end = SharedPrefs()\n        .getValue(SettingsKeys.tempoTrainerTempoMax, 200.0) as double;\n    tempoStep = SharedPrefs().getInt(SettingsKeys.tempoTrainerStep, 5);\n    changeMode = TempoChangeMode\n        .values[SharedPrefs().getInt(SettingsKeys.tempoTrainerChangeMode, 0)];\n    changeUnits = SharedPrefs().getInt(SettingsKeys.tempoTrainerChangeUnits, 5);\n  }\n\n  void saveConfig() {\n    SharedPrefs().setValue(SettingsKeys.tempoTrainerTempoMin, tempoRange.start);\n    SharedPrefs().setValue(SettingsKeys.tempoTrainerTempoMax, tempoRange.end);\n    SharedPrefs().setInt(SettingsKeys.tempoTrainerStep, tempoStep);\n    SharedPrefs().setInt(SettingsKeys.tempoTrainerChangeMode, changeMode.index);\n    SharedPrefs().setInt(SettingsKeys.tempoTrainerChangeUnits, changeUnits);\n  }\n}\n"
  },
  {
    "path": "lib/platform/fileSaver.dart",
    "content": "import 'package:flutter/services.dart';\n\nFuture<String> saveFileString(String mime, String name, String data) async {\n  const platform =\n      MethodChannel(\"com.msvcode.filesaver/files\"); //unique channel identifier\n  try {\n    final result = await platform.invokeMethod(\"saveFile\", {\n      \"mime\": mime,\n      \"name\": name,\n      \"data\": data,\n      \"byteArray\": false\n    }); //name in native code\n\n    return result;\n  } on PlatformException {\n    return Future.error(\"Error saving file\");\n  }\n}\n\nFuture<String> saveFile(String mime, String name, List<int> data) async {\n  const platform =\n      MethodChannel(\"com.msvcode.filesaver/files\"); //unique channel identifier\n  try {\n    final result = await platform.invokeMethod(\"saveFile\", {\n      \"mime\": mime,\n      \"name\": name,\n      \"data\": data,\n      \"byteArray\": true\n    }); //name in native code\n\n    return result;\n  } on PlatformException {\n    return Future.error(\"Error saving file\");\n  }\n}\n\nFuture<String> openFileString(String mime) async {\n  const platform =\n      MethodChannel(\"com.msvcode.filesaver/files\"); //unique channel identifier\n  try {\n    final result = await platform.invokeMethod(\n        \"openFile\", {\"mime\": mime, \"byte_array\": false}); //name in native code\n\n    return result;\n  } on PlatformException {\n    //fails native call\n    //handle error\n    return Future.error(\"Can't open text file\");\n  }\n}\n\nFuture<List<int>> openFile(String mime) async {\n  const platform =\n      MethodChannel(\"com.msvcode.filesaver/files\"); //unique channel identifier\n  try {\n    final result = await platform.invokeMethod(\n        \"openFile\", {\"mime\": mime, \"byte_array\": true}); //name in native code\n\n    return result;\n  } on PlatformException {\n    //fails native call\n    //handle error\n    return Future.error(\"Can't open byte array file\");\n  }\n}\n"
  },
  {
    "path": "lib/platform/platformUtils.dart",
    "content": "import \"dart:io\" as io;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\n\nclass PlatformUtils {\n  static get isMobile {\n    return !kIsWeb && (io.Platform.isAndroid || io.Platform.isIOS);\n  }\n\n  static get isWeb => kIsWeb;\n\n  static get isAndroid => !kIsWeb && io.Platform.isAndroid;\n  static get isIOS => !kIsWeb && io.Platform.isIOS;\n\n  static get isWindows => !kIsWeb && io.Platform.isWindows;\n  static get isLinux => !kIsWeb && io.Platform.isLinux;\n\n  static Future<io.Directory?> getAppDataDirectory() async {\n    if (PlatformUtils.isAndroid) {\n      return getExternalStorageDirectory();\n    } else if (PlatformUtils.isIOS) {\n      return getApplicationDocumentsDirectory();\n    }\n    return Future.error(\"getAppDataDirectory(): Platform not supported\");\n  }\n}\n"
  },
  {
    "path": "lib/platform/presetStorageListener.dart",
    "content": "abstract class PresetStorageListener {\n  void onPresetCreated(Map<String, dynamic> preset);\n  void onPresetUpdated(Map<String, dynamic> preset);\n  void onPresetDeleted(String uuid);\n  void onCategoryReordered(int from, int to);\n}\n"
  },
  {
    "path": "lib/platform/presetsStorage.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'package:flutter/material.dart';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:mighty_plug_manager/bluetooth/devices/NuxMightyPlugAir.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:uuid/uuid.dart';\n\nimport '../../../platform/platformUtils.dart';\nimport 'presetStorageListener.dart';\n\nenum PresetChangeDirection { previous, next }\n\nclass PresetsStorage extends ChangeNotifier {\n  static final PresetsStorage _storage = PresetsStorage._();\n  static const presetsFile = \"presets.json\";\n  static const presetsVersion = 2;\n\n  static const presetsSingle = \"preset-single\";\n  static const presetsMultiple = \"preset-multiple\";\n\n  //Preset JSON keys\n  static const inactiveEffectsKey = \"inactiveEffects\";\n  static const uuidKey = \"uuid\";\n  final Uuid uuid = const Uuid();\n\n  factory PresetsStorage() {\n    return _storage;\n  }\n\n  String presetsPath = \"\";\n  Directory? storageDirectory;\n  File? _presetsFile;\n  bool _presetsReady = false;\n\n  final List<PresetStorageListener> _changeListeners = [];\n\n  List presetsData = [];\n  List<String> _categoriesCache = <String>[];\n\n  PresetsStorage._();\n\n  Future init() async {\n    _categoriesCache = <String>[];\n    await _getDirectory();\n    await _loadPresets();\n  }\n\n  _getDirectory() async {\n    try {\n      storageDirectory = await PlatformUtils.getAppDataDirectory();\n\n      if (storageDirectory != null) {\n        presetsPath = path.join(storageDirectory!.path, presetsFile);\n        _presetsFile = File(presetsPath);\n      }\n    } catch (_) {}\n  }\n\n  _loadPresets() async {\n    try {\n      if (_presetsFile != null) {\n        var _presetJson = await _presetsFile!.readAsString();\n        var data = json.decode(_presetJson);\n\n        if (data is List) {\n          debugPrint(\"Old preset format\");\n\n          //fix any old compatibility issues\n          for (int i = 0; i < data.length; i++) {\n            data[i] = fixPresetCompatibility(data[i]);\n          }\n\n          data = _convertOldToNewFormat(data);\n          presetsData = data[\"Categories\"];\n          _savePresets();\n        } else {\n          presetsData = data[\"Categories\"];\n          if (data[\"Version\"] < presetsVersion) {\n            upgradeDataVersion(data[\"Version\"]);\n            _savePresets();\n          }\n        }\n\n        _buildCategoryCache();\n        _presetsReady = true;\n      }\n    } catch (e) {\n      _presetsReady = true;\n    }\n  }\n\n  _savePresets() async {\n    _buildCategoryCache();\n\n    Map<String, dynamic> file = _createFileOuterObject(presetsData);\n\n    String jsonData = json.encode(file);\n    await _presetsFile!.writeAsString(jsonData);\n    notifyListeners();\n  }\n\n  _createFileOuterObject(List<dynamic> data) {\n    Map<String, dynamic> file = {\"Version\": presetsVersion, \"Categories\": data};\n    return file;\n  }\n\n  Future waitLoading() async {\n    for (int i = 0; i < 20; i++) {\n      if (_presetsReady) break;\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n  }\n\n  List<String> getCategories() {\n    return _categoriesCache;\n  }\n\n  _buildCategoryCache() {\n    _categoriesCache.clear();\n    for (var element in presetsData) {\n      _categoriesCache.add(element[\"name\"]);\n    }\n  }\n\n  Map<String, dynamic>? _findCategory(String category) {\n    for (Map<String, dynamic> cat in presetsData) {\n      if (cat[\"name\"] == category) return cat;\n    }\n    return null;\n  }\n\n  bool presetExists(String name, String category) =>\n      findPreset(name, category) != null;\n\n  Map<String, dynamic>? findPreset(String name, String category) {\n    var cat = _findCategory(category);\n\n    return findPresetInCategory(name, cat);\n  }\n\n  Map<String, dynamic>? findPresetInCategory(\n      String name, Map<String, dynamic>? category) {\n    if (category != null) {\n      for (Map<String, dynamic> preset in category[\"presets\"]) {\n        if (preset[\"name\"] == name) return preset;\n      }\n    }\n    return null;\n  }\n\n  dynamic findPresetByUuid(String uuid) {\n    for (var cat in presetsData) {\n      for (var preset in cat[\"presets\"]) {\n        if (preset[uuidKey] == uuid) return preset;\n      }\n    }\n    return null;\n  }\n\n  dynamic findAdjacentPreset(\n      String uuid, bool acrossCategories, PresetChangeDirection direction) {\n    int catsCount = presetsData.length;\n    int catIndex = 0;\n\n    if (uuid.isEmpty) {\n      return _getAdjacentPreset(0, -1, direction, acrossCategories);\n    }\n    for (catIndex = 0; catIndex < catsCount; catIndex++) {\n      int pIndex = 0;\n      var cat = presetsData[catIndex];\n      var presets = cat[\"presets\"];\n      int pCount = presets.length;\n      for (pIndex = 0; pIndex < pCount; pIndex++) {\n        if (presets[pIndex]?[\"uuid\"] == uuid) {\n          return _getAdjacentPreset(\n              catIndex, pIndex, direction, acrossCategories);\n        }\n      }\n    }\n    return _getAdjacentPreset(0, -1, direction, acrossCategories);\n  }\n\n  Map<String, dynamic>? findCategoryOfPreset(Map<String, dynamic> preset) {\n    for (var cat in presetsData) {\n      for (var pr in cat[\"presets\"]) {\n        if (pr[uuidKey] == preset[uuidKey]) return cat;\n      }\n    }\n    return null;\n  }\n\n  Map<String, dynamic> _findOrCreateCategory(String name) {\n    var category = _findCategory(name);\n\n    if (category == null) {\n      category = {\"name\": name, \"uuid\": uuid.v4(), \"presets\": []};\n      presetsData.add(category);\n    }\n\n    return category;\n  }\n\n  String savePreset(\n      Map<String, dynamic> preset, String name, String categoryName) {\n    preset[\"name\"] = name;\n    String uuid;\n    bool newPreset = false;\n    var category = _findOrCreateCategory(categoryName);\n\n    var data = findPresetInCategory(name, category);\n    if (data != null) {\n      uuid = data[uuidKey];\n      data.clear();\n      //overwrite preset\n      for (var key in preset.keys) {\n        if (key != uuidKey) data[key] = preset[key];\n      }\n      data[uuidKey] = uuid;\n    } else {\n      _addUuid(preset);\n      category[\"presets\"].add(preset);\n      uuid = preset[uuidKey];\n      newPreset = true;\n    }\n\n    if (newPreset) {\n      _presetCreated(preset);\n    } else {\n      _presetUpdated(preset);\n    }\n    _savePresets();\n    return uuid;\n  }\n\n  Future deletePreset(Map<String, dynamic> preset) {\n    var cat = findCategoryOfPreset(preset);\n\n    if (cat != null) {\n      _presetDeleted(preset[\"uuid\"]);\n      (cat[\"presets\"] as List).remove(preset);\n      return _savePresets();\n    }\n\n    return Future.error(\"Preset not found\");\n  }\n\n  Future duplicatePreset(String category, String name) {\n    var cat = _findCategory(category);\n\n    if (cat != null) {\n      List presets = cat[\"presets\"];\n\n      for (int i = 0; i < presets.length; i++) {\n        if (presets[i][\"name\"] == name) {\n          var clone = json.decode(json.encode(presets[i]));\n\n          //get new uuid\n\n          _addUuid(clone);\n\n          String? lName = _findFreeName(name, category);\n          if (lName != null) {\n            clone[\"name\"] = lName;\n            cat[\"presets\"].insert(i + 1, clone);\n            return _savePresets();\n          }\n        }\n      }\n    }\n    return Future.error(\"Can't clone preset\");\n  }\n\n  Future renamePreset(Map<String, dynamic> preset, String newName) {\n    preset[\"name\"] = newName;\n    _presetUpdated(preset);\n    return _savePresets();\n  }\n\n  void reorderCategories(int oldListIndex, int newListIndex) {\n    var movedList = presetsData.removeAt(oldListIndex);\n    presetsData.insert(newListIndex, movedList);\n    _categoryReordered(oldListIndex, newListIndex);\n    _savePresets();\n  }\n\n  bool reorderPresets(\n      int oldItemIndex, int oldListIndex, int newItemIndex, int newListIndex) {\n    var preset = presetsData[oldListIndex][\"presets\"][oldItemIndex];\n    var newCatName = presetsData[newListIndex];\n\n    //if preset with the same name exists, avoid reordering\n    if (oldListIndex != newListIndex &&\n        findPresetInCategory(preset[\"name\"], newCatName) != null) {\n      return false;\n    }\n\n    var movedItem = presetsData[oldListIndex][\"presets\"].removeAt(oldItemIndex);\n    presetsData[newListIndex][\"presets\"].insert(newItemIndex, movedItem);\n\n    _savePresets();\n    return true;\n  }\n\n  clearNewFlag(Map<String, dynamic> preset) {\n    if (preset.containsKey(\"new\")) {\n      preset.remove(\"new\");\n      _savePresets();\n    }\n  }\n\n  Future changeChannel(Map<String, dynamic> preset, int channel) {\n    preset[\"channel\"] = channel;\n    return _savePresets();\n  }\n\n  Future changePresetCategory(\n      String category, String name, String newCategory) {\n    var cat1 = _findCategory(category);\n    var cat2 = _findCategory(newCategory);\n    if (cat1 != null && cat2 != null) {\n      var p = findPresetInCategory(name, cat1);\n      if (p != null) {\n        (cat1[\"presets\"] as List).remove(p);\n        (cat2[\"presets\"] as List).add(p);\n        return _savePresets();\n      }\n    }\n\n    return Future.error(\"Preset not found\");\n  }\n\n  Future<List<String>> deleteCategory(String category) async {\n    var cat = _findCategory(category);\n\n    if (cat != null) {\n      List<String> uuids = [];\n      List presets = cat[\"presets\"];\n\n      for (var p in presets) {\n        uuids.add(p[uuidKey]);\n      }\n      presetsData.remove(cat);\n\n      for (var uuid in uuids) {\n        _presetDeleted(uuid);\n      }\n\n      await _savePresets();\n      return uuids;\n    }\n\n    return Future.error(\"Category not found\");\n  }\n\n  Future renameCategory(String category, String newName) {\n    var cat = _findCategory(category);\n\n    if (cat != null) {\n      cat[\"name\"] = newName;\n      return _savePresets();\n    }\n\n    return Future.error(\"Category not found\");\n  }\n\n  String? presetToJson(String category, String name) {\n    var finalData = <String, dynamic>{};\n\n    var p = findPreset(name, category);\n\n    if (p != null) {\n      var copy = json.decode(json.encode(p));\n      finalData[\"type\"] = presetsSingle;\n\n      copy[\"category\"] = category;\n      finalData[\"data\"] = copy;\n      return json.encode(finalData);\n    }\n\n    return null;\n  }\n\n  //converts a category to json\n  //if parameter left empty, then the full preset list is converted\n  String? presetsToJson([String? category]) {\n    //TODO: These presets don't have the category key\n    List presets = [];\n    if (category == null || category.isEmpty) {\n      for (var cat in presetsData) {\n        for (var p in cat[\"presets\"]) {\n          var copy = json.decode(json.encode(p));\n          copy[\"category\"] = cat[\"name\"];\n          presets.add(copy);\n        }\n      }\n    } else {\n      for (var p in _findCategory(category)?[\"presets\"]) {\n        var copy = json.decode(json.encode(p));\n        copy[\"category\"] = category;\n        presets.add(copy);\n      }\n    }\n\n    if (presets.isNotEmpty) {\n      var finalData = <String, dynamic>{};\n      finalData[\"type\"] = presetsMultiple;\n      finalData[\"data\"] = presets;\n      return json.encode(finalData);\n    }\n    return null;\n  }\n\n  Future<int> presetsFromJson(String jsonData) async {\n    try {\n      Map<String, dynamic> data = json.decode(jsonData);\n\n      if (!data.containsKey(\"type\")) return Future.error(\"Wrong File\");\n      if (data[\"type\"] == presetsSingle) {\n        //single preset\n        Map<String, dynamic> pr = data[\"data\"];\n        bool loaded = await _presetFromJson(pr[\"category\"], pr[\"name\"], pr);\n        return loaded ? 1 : 0;\n      } else if (data[\"type\"] == presetsMultiple) {\n        int count = 0;\n        //this is array of presets\n        List<dynamic> pr = data[\"data\"];\n        for (Map<String, dynamic> item in pr) {\n          bool loaded =\n              await _presetFromJson(item[\"category\"], item[\"name\"], item);\n          if (loaded) count++;\n        }\n        return count;\n      }\n    } on FormatException {\n      return Future.error(\"Wrong File\");\n    }\n    return 0;\n  }\n\n  Future<bool> _presetFromJson(\n      String category, String name, Map<String, dynamic> presetData) async {\n    var p = findPreset(name, category);\n\n    presetData = fixPresetCompatibility(presetData);\n    presetData.remove(\"category\");\n\n    String? _name = name;\n    //check if exists\n    if (p != null) {\n      if (_presetsEquivalent(presetData, p)) return false;\n\n      //difference - find free name and save as that\n      _name = _findFreeName(name, category);\n    }\n\n    //highlight that the preset is new\n    presetData[\"new\"] = true;\n\n    //save preset\n    if (_name != null) savePreset(presetData, _name, category);\n    return true;\n  }\n\n  dynamic _getAdjacentPreset(int catIndex, int pIndex,\n      PresetChangeDirection direction, bool acrossCategory) {\n    if (presetsData.length <= catIndex) return null;\n    var catLength = presetsData[catIndex][\"presets\"].length;\n    if (direction == PresetChangeDirection.previous) {\n      pIndex--;\n    } else {\n      pIndex++;\n    }\n\n    if (pIndex < 0) {\n      if (!acrossCategory) {\n        pIndex = catLength - 1;\n      } else {\n        do {\n          catIndex--;\n          if (catIndex < 0) {\n            catIndex = presetsData.length - 1;\n          }\n        } while (presetsData[catIndex][\"presets\"].length == 0);\n        pIndex = presetsData[catIndex][\"presets\"].length - 1;\n      }\n    } else if (pIndex >= catLength) {\n      if (!acrossCategory) {\n        pIndex = 0;\n      } else {\n        do {\n          catIndex++;\n          if (catIndex >= presetsData.length) {\n            catIndex = 0;\n          }\n        } while (presetsData[catIndex][\"presets\"].length == 0);\n        pIndex = 0;\n      }\n    }\n    return presetsData[catIndex][\"presets\"][pIndex];\n  }\n\n  String? _findFreeName(String name, String category) {\n    for (int i = 1; i < 1000; i++) {\n      RegExp regex = RegExp(r\"\\((\\d+)\\)$\");\n      String newName = \"\";\n\n      RegExpMatch? match = regex.firstMatch(name);\n      if (match != null) {\n        //already has a number in the name\n        String? numStr = match.group(1);\n        if (numStr != null) {\n          int? num = int.tryParse(numStr);\n          if (num != null) {\n            num++;\n            newName = name.replaceFirst(regex, \"($num)\");\n            name = newName;\n          }\n        }\n      }\n\n      if (newName == \"\") {\n        newName = \"$name ($i)\";\n      }\n      if (findPreset(newName, category) == null) return newName;\n    }\n\n    return null;\n  }\n\n  bool _presetsEquivalent(Map<String, dynamic> p1, Map<String, dynamic> p2) {\n    for (String k in p1.keys) {\n      if (k == \"uuid\") continue;\n      if (k == \"inactiveEffects\") continue;\n      if (!p2.containsKey(k)) return false;\n\n      //check sub-maps\n      if (p1[k] is Map && p2[k] is Map) {\n        bool equal = _presetsEquivalent(p1[k], p2[k]);\n        if (equal == false) return false;\n        continue;\n      }\n\n      if (p1[k] != p2[k]) return false;\n    }\n    return true;\n  }\n\n  Map<String, dynamic> fixPresetCompatibility(Map<String, dynamic> presetData) {\n    //old style preset didn't contain mighty plug\n    if (!presetData.containsKey(\"product_id\")) {\n      presetData[\"product_id\"] = NuxMightyPlug.defaultNuxId;\n    }\n    if (!presetData.containsKey(uuidKey)) {\n      _addUuid(presetData);\n    }\n    return presetData;\n  }\n\n  void upgradeDataVersion(int version) {\n    if (version < 2) {\n      //add guids to categories\n      for (Map cat in presetsData) {\n        if (!cat.containsKey(\"uuid\")) {\n          cat[\"uuid\"] = uuid.v4();\n        }\n      }\n    }\n  }\n\n  List<dynamic> _getPresetsInCategoryOldFormat(\n      List<dynamic> oldPresets, String category) {\n    List<dynamic> presets = [];\n    for (int i = 0; i < oldPresets.length; i++) {\n      if (oldPresets[i][\"category\"] == category) presets.add(oldPresets[i]);\n    }\n    return presets;\n  }\n\n  Map<String, dynamic> _convertOldToNewFormat(List<dynamic> oldFormat) {\n    _buildCategoryCache();\n\n    //build categories list\n    List<String> categoriesList = [];\n    for (var element in oldFormat) {\n      if (!categoriesList.contains(element[\"category\"])) {\n        categoriesList.add(element[\"category\"]);\n      }\n    }\n\n    List<Map<String, dynamic>> categories = [];\n\n    for (var cat in categoriesList) {\n      Map<String, dynamic> category = {};\n      category[\"name\"] = cat;\n      var presets = _getPresetsInCategoryOldFormat(oldFormat, cat);\n\n      for (Map preset in presets) {\n        preset.remove(\"category\");\n      }\n      category[\"presets\"] = presets;\n      categories.add(category);\n    }\n\n    Map<String, dynamic> file = _createFileOuterObject(categories);\n\n    return file;\n  }\n\n  void _addUuid(Map<String, dynamic> preset) {\n    bool unique = true;\n    do {\n      String id = uuid.v4();\n      // check unique\n      for (var cat in presetsData) {\n        for (var p in cat[\"presets\"]) {\n          if (p[uuidKey] == id) unique = false;\n        }\n      }\n      preset[uuidKey] = id;\n    } while (unique == false);\n  }\n\n  void registerPresetStorageListener(PresetStorageListener listener) {\n    _changeListeners.add(listener);\n  }\n\n  void _presetCreated(Map<String, dynamic> preset) {\n    for (var listener in _changeListeners) {\n      listener.onPresetCreated(preset);\n    }\n  }\n\n  void _presetUpdated(Map<String, dynamic> preset) {\n    for (var listener in _changeListeners) {\n      listener.onPresetUpdated(preset);\n    }\n  }\n\n  void _presetDeleted(String uuid) {\n    for (var listener in _changeListeners) {\n      listener.onPresetDeleted(uuid);\n    }\n  }\n\n  void _categoryReordered(int from, int to) {\n    for (var listener in _changeListeners) {\n      listener.onCategoryReordered(from, to);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/platform/simpleSharedPrefs.dart",
    "content": "// (c) 2020-2021 Dian Iliev (Tuntorius)\n// This code is licensed under MIT license (see LICENSE.md for details)\n\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:path/path.dart' as path;\nimport 'package:wakelock_plus/wakelock_plus.dart';\n\nimport 'platformUtils.dart';\n\nclass SettingsKeys {\n  static const String latency = \"audioLatency\";\n  static const String screenAlwaysOn = \"screenAlwaysOn\";\n  static const String timeUnit = \"timeUnit\";\n  static const String changeCabs = \"changeCabs\";\n  static const String device = \"device\";\n  static const String deviceVersion = \"deviceVersion\";\n  static const String masterVolume = \"volume\";\n  static const String customCabinets = \"customCabinets\";\n  static const String legacyDecoder = \"legacyDecoder\";\n  static const String hiddenSources = \"hiddenSources\";\n  static const String hideNotApplicablePresets = \"hideNotApplicablePresets\";\n  static const String tempoTrainerTempoMin = \"trainerTempoMin\";\n  static const String tempoTrainerTempoMax = \"trainerTempoMax\";\n  static const String tempoTrainerStep = \"trainerStep\";\n  static const String tempoTrainerChangeMode = \"trainerChangeMode\";\n  static const String tempoTrainerChangeUnits = \"trainerChangeUnits\";\n  static const String trackGain = \"jamTracksGain\";\n}\n\nclass SharedPrefs {\n  static final SharedPrefs _storage = SharedPrefs._();\n  static const prefsFile = \"prefs.json\";\n\n  factory SharedPrefs() {\n    return _storage;\n  }\n\n  String prefsPath = \"\";\n  Directory? storageDirectory;\n  File? _prefsFile;\n  bool _prefsReady = false;\n\n  Map<String, dynamic> _prefsData = {};\n\n  SharedPrefs._() {\n    _init();\n  }\n\n  _init() async {\n    await _getDirectory();\n    await _loadPrefs();\n\n    bool value = getValue(SettingsKeys.screenAlwaysOn, false);\n    WakelockPlus.toggle(enable: value);\n  }\n\n  _getDirectory() async {\n    storageDirectory = await PlatformUtils.getAppDataDirectory();\n\n    if (storageDirectory != null) {\n      prefsPath = path.join(storageDirectory!.path, prefsFile);\n      _prefsFile = File(prefsPath);\n    }\n  }\n\n  _loadPrefs() async {\n    try {\n      if (_prefsFile != null) {\n        var _presetJson = await _prefsFile!.readAsString();\n        _prefsData = json.decode(_presetJson);\n        _prefsReady = true;\n      }\n    } catch (e) {\n      _prefsReady = true;\n      //   //no file\n      //   print(\"Presets file not available\");\n    }\n  }\n\n  Future waitLoading() async {\n    for (int i = 0; i < 20; i++) {\n      if (_prefsReady) break;\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n  }\n\n  _savePrefs() async {\n    if (_prefsFile != null) {\n      String _json = json.encode(_prefsData);\n      await _prefsFile?.writeAsString(_json);\n    }\n  }\n\n  void setInt(String key, int value) {\n    _prefsData[key] = value;\n    _savePrefs();\n  }\n\n  int getInt(String key, int _default) {\n    if (_prefsData.containsKey(key)) return _prefsData[key];\n    return _default;\n  }\n\n  void setValue(String key, dynamic value) {\n    _prefsData[key] = value;\n    _savePrefs();\n  }\n\n  void remove(String key) {\n    _prefsData.remove(key);\n    _savePrefs();\n  }\n\n  dynamic getValue(String key, dynamic _default) {\n    if (_prefsData.containsKey(key)) return _prefsData[key];\n    return _default;\n  }\n\n  String? getCustomCabinetName(String productId, int cabIndex) {\n    return _prefsData[SettingsKeys.customCabinets]?[productId]\n        ?[cabIndex.toString()];\n  }\n\n  setCustomCabinetName(String productId, int cabIndex, String name) {\n    if (!_prefsData.containsKey(SettingsKeys.customCabinets)) {\n      _prefsData[SettingsKeys.customCabinets] = <String, Map<String, String>>{};\n    }\n    if (!_prefsData[SettingsKeys.customCabinets].containsKey(productId)) {\n      _prefsData[SettingsKeys.customCabinets][productId] = <String, String>{};\n    }\n\n    _prefsData[SettingsKeys.customCabinets][productId][cabIndex.toString()] =\n        name;\n    _savePrefs();\n  }\n}\n"
  },
  {
    "path": "lib/utilities/DelayTapTimer.dart",
    "content": "class DelayTapTimer {\n  DelayTapTimer._();\n\n  static const _timeout = 1800;\n  static const _maxSamples = 20;\n  static List<DateTime> timeArray = <DateTime>[];\n\n  static addClickTime() {\n    var now = DateTime.now();\n\n    if (timeArray.isNotEmpty &&\n        now.difference(timeArray.last).inMilliseconds > _timeout) {\n      timeArray.clear();\n    }\n\n    timeArray.add(now);\n\n    while (timeArray.length > _maxSamples) {\n      timeArray.removeAt(0);\n    }\n  }\n\n  static calculate() {\n    if (timeArray.length < 2) return false;\n\n    int sum = 0;\n    //get the sum of all differences and calculate average\n    for (int i = 0; i < timeArray.length - 1; i++) {\n      sum += timeArray[i + 1].difference(timeArray[i]).inMilliseconds;\n    }\n\n    return sum / (timeArray.length - 1);\n  }\n\n  static calculateBpm() {\n    var result = calculate();\n    if (result != false) result = 60 / (result / 1000);\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/utilities/MathEx.dart",
    "content": "class MathEx {\n  static double map(\n      double x, double inMin, double inMax, double outMin, double outMax) {\n    return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n  }\n}\n"
  },
  {
    "path": "lib/utilities/list_extenstions.dart",
    "content": "extension ListStringExtension on List<String> {\n  bool containsPartial(String partialString) {\n    for (var str in this) {\n      if (partialString.contains(str)) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/utilities/string_extensions.dart",
    "content": "extension StringExtensions on String {\n  bool containsIgnoreCase(String secondString) =>\n      toLowerCase().contains(secondString.toLowerCase());\n}\n"
  },
  {
    "path": "linux/.gitignore",
    "content": "flutter/ephemeral\n"
  },
  {
    "path": "linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.10)\nproject(runner LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"mighty_plug_manager\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"com.tuntori.mighty_plug_manager\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Load bundled libraries from the lib/ directory relative to the binary.\nset(CMAKE_INSTALL_RPATH \"$ORIGIN/lib\")\n\n# Root filesystem for cross-building.\nif(FLUTTER_TARGET_PLATFORM_SYSROOT)\n  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n# Define build configuration options.\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n  set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n    STRING \"Flutter build mode\" FORCE)\n  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n    \"Debug\" \"Profile\" \"Release\")\nendif()\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_14)\n  target_compile_options(${TARGET} PRIVATE -Wall -Werror)\n  target_compile_options(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:-O3>\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:NDEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\n\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\n\n# Define the application target. To change its name, change BINARY_NAME above,\n# not the value here, or `flutter run` will no longer work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME}\n  \"main.cc\"\n  \"my_application.cc\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add dependency libraries. Add any application-specific dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter)\ntarget_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n\n# Only the install-generated bundle's copy of the executable will launch\n# correctly, since the resources must in the right relative locations. To avoid\n# people trying to run the unbundled copy, put it in a subdirectory instead of\n# the default top-level location.\nset_target_properties(${BINARY_NAME}\n  PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/intermediates_do_not_run\"\n)\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# By default, \"installing\" just makes a relocatable bundle in the build\n# directory.\nset(BUILD_BUNDLE_DIR \"${PROJECT_BINARY_DIR}/bundle\")\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\n# Start with a clean build bundle directory every time.\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${BUILD_BUNDLE_DIR}/\\\")\n  \" COMPONENT Runtime)\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nforeach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})\n  install(FILES \"${bundled_library}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendforeach(bundled_library)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\nif(NOT CMAKE_BUILD_TYPE MATCHES \"Debug\")\n  install(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n"
  },
  {
    "path": "linux/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.10)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\n\n# Serves the same purpose as list(TRANSFORM ... PREPEND ...),\n# which isn't available in 3.10.\nfunction(list_prepend LIST_NAME PREFIX)\n    set(NEW_LIST \"\")\n    foreach(element ${${LIST_NAME}})\n        list(APPEND NEW_LIST \"${PREFIX}${element}\")\n    endforeach(element)\n    set(${LIST_NAME} \"${NEW_LIST}\" PARENT_SCOPE)\nendfunction()\n\n# === Flutter Library ===\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\npkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)\npkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)\n\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/libflutter_linux_gtk.so\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/lib/libapp.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"fl_basic_message_channel.h\"\n  \"fl_binary_codec.h\"\n  \"fl_binary_messenger.h\"\n  \"fl_dart_project.h\"\n  \"fl_engine.h\"\n  \"fl_json_message_codec.h\"\n  \"fl_json_method_codec.h\"\n  \"fl_message_codec.h\"\n  \"fl_method_call.h\"\n  \"fl_method_channel.h\"\n  \"fl_method_codec.h\"\n  \"fl_method_response.h\"\n  \"fl_plugin_registrar.h\"\n  \"fl_plugin_registry.h\"\n  \"fl_standard_message_codec.h\"\n  \"fl_standard_method_codec.h\"\n  \"fl_string_codec.h\"\n  \"fl_value.h\"\n  \"fl_view.h\"\n  \"flutter_linux.h\"\n)\nlist_prepend(FLUTTER_LIBRARY_HEADERS \"${EPHEMERAL_DIR}/flutter_linux/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}\")\ntarget_link_libraries(flutter INTERFACE\n  PkgConfig::GTK\n  PkgConfig::GLIB\n  PkgConfig::GIO\n)\nadd_dependencies(flutter flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CMAKE_CURRENT_BINARY_DIR}/_phony_\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh\"\n      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n)\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <url_launcher_linux/url_launcher_plugin.h>\n\nvoid fl_register_plugins(FlPluginRegistry* registry) {\n  g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"UrlLauncherPlugin\");\n  url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);\n}\n"
  },
  {
    "path": "linux/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter_linux/flutter_linux.h>\n\n// Registers Flutter plugins.\nvoid fl_register_plugins(FlPluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "linux/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  url_launcher_linux\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "linux/main.cc",
    "content": "#include \"my_application.h\"\n\nint main(int argc, char** argv) {\n  g_autoptr(MyApplication) app = my_application_new();\n  return g_application_run(G_APPLICATION(app), argc, argv);\n}\n"
  },
  {
    "path": "linux/my_application.cc",
    "content": "#include \"my_application.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#ifdef GDK_WINDOWING_X11\n#include <gdk/gdkx.h>\n#endif\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char** dart_entrypoint_arguments;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\n// Implements GApplication::activate.\nstatic void my_application_activate(GApplication* application) {\n  MyApplication* self = MY_APPLICATION(application);\n  GtkWindow* window =\n      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));\n\n  // Use a header bar when running in GNOME as this is the common style used\n  // by applications and is the setup most users will be using (e.g. Ubuntu\n  // desktop).\n  // If running on X and not using GNOME then just use a traditional title bar\n  // in case the window manager does more exotic layout, e.g. tiling.\n  // If running on Wayland assume the header bar will work (may need changing\n  // if future cases occur).\n  gboolean use_header_bar = TRUE;\n#ifdef GDK_WINDOWING_X11\n  GdkScreen* screen = gtk_window_get_screen(window);\n  if (GDK_IS_X11_SCREEN(screen)) {\n    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);\n    if (g_strcmp0(wm_name, \"GNOME Shell\") != 0) {\n      use_header_bar = FALSE;\n    }\n  }\n#endif\n  if (use_header_bar) {\n    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());\n    gtk_widget_show(GTK_WIDGET(header_bar));\n    gtk_header_bar_set_title(header_bar, \"mighty_plug_manager\");\n    gtk_header_bar_set_show_close_button(header_bar, TRUE);\n    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));\n  } else {\n    gtk_window_set_title(window, \"mighty_plug_manager\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n  gtk_widget_show(GTK_WIDGET(window));\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);\n\n  FlView* view = fl_view_new(project);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\n\n  gtk_widget_grab_focus(GTK_WIDGET(view));\n}\n\n// Implements GApplication::local_command_line.\nstatic gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {\n  MyApplication* self = MY_APPLICATION(application);\n  // Strip out the first argument as it is the binary name.\n  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);\n\n  g_autoptr(GError) error = nullptr;\n  if (!g_application_register(application, nullptr, &error)) {\n     g_warning(\"Failed to register: %s\", error->message);\n     *exit_status = 1;\n     return TRUE;\n  }\n\n  g_application_activate(application);\n  *exit_status = 0;\n\n  return TRUE;\n}\n\n// Implements GObject::dispose.\nstatic void my_application_dispose(GObject* object) {\n  MyApplication* self = MY_APPLICATION(object);\n  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);\n  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);\n}\n\nstatic void my_application_class_init(MyApplicationClass* klass) {\n  G_APPLICATION_CLASS(klass)->activate = my_application_activate;\n  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;\n  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;\n}\n\nstatic void my_application_init(MyApplication* self) {}\n\nMyApplication* my_application_new() {\n  return MY_APPLICATION(g_object_new(my_application_get_type(),\n                                     \"application-id\", APPLICATION_ID,\n                                     \"flags\", G_APPLICATION_NON_UNIQUE,\n                                     nullptr));\n}\n"
  },
  {
    "path": "linux/my_application.h",
    "content": "#ifndef FLUTTER_MY_APPLICATION_H_\n#define FLUTTER_MY_APPLICATION_H_\n\n#include <gtk/gtk.h>\n\nG_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,\n                     GtkApplication)\n\n/**\n * my_application_new:\n *\n * Creates a new Flutter-based application.\n *\n * Returns: a new #MyApplication.\n */\nMyApplication* my_application_new();\n\n#endif  // FLUTTER_MY_APPLICATION_H_\n"
  },
  {
    "path": "mightieramp.code-workspace",
    "content": "{\n\t\"folders\": [\n\t\t{\n\t\t\t\"path\": \".\"\n\t\t}\n\t],\n\t\"settings\": {}\n}"
  },
  {
    "path": "plugins/audio_picker/.gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n\nbuild/\n"
  },
  {
    "path": "plugins/audio_picker/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: cc949a8e8b9cf394b9290a8e80f87af3e207dce5\n  channel: stable\n\nproject_type: plugin\n"
  },
  {
    "path": "plugins/audio_picker/CHANGELOG.md",
    "content": "## [1.0.0] - 2019-10-27\n\n* Initial Release"
  },
  {
    "path": "plugins/audio_picker/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 ChiragShenoy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/audio_picker/README.md",
    "content": "# audio_picker\n\nA Flutter plugin for Android and iOS to pick local Audio files. This supports choosing Audio files from the Music App in iOS, and from the File Explorer in Android.\n\n## Introduction\nThis plugin opens a picker to get the absolute path of Audio files from your phone.\nIf you ever wanted to play songs in your app, or upload audio files to your server, this plugin helps you get the **absolute path** of the audio file that you select.\n\n## Android\nAdd the following line in your AndroidManifest.xml \n\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n\n\n## iOS\nAdd the following line in your Info.plist \n\n    <key>NSAppleMusicUsageDescription</key>\n    <string>Explain why your app uses music</string>\n\nIn the case of iOS, it exports the audio file that you choose from the Music App.\n\n## Usage\n    var path = await AudioPicker.pickAudio();\n\nThat's it ! You now have the absolute path of the audio file that you selected.\n\n<img src=\"https://firebasestorage.googleapis.com/v0/b/electionapp-24b60.appspot.com/o/IMG_3477.PNG?alt=media&token=8eec8fc9-0358-42de-8209-ae09413cbb3d\" width=\"280\" height=\"610\"> <img src=\"https://firebasestorage.googleapis.com/v0/b/electionapp-24b60.appspot.com/o/IMG_67F45460A1AD-1.jpeg?alt=media&token=65172f34-70d6-43f0-9c5a-18aab250d43e\" width=\"280\" height=\"610\">\n<img src=\"https://firebasestorage.googleapis.com/v0/b/electionapp-24b60.appspot.com/o/Screenshot_2019-10-27-00-53-48-63.png?alt=media&token=255a4494-2f7e-4994-8390-e0c051db8ee6\" width=\"280\" height=\"610\">\n\nNote : In the case of iOS, since we are retrieving the file from the Music App, the export operation may take a few seconds to complete. Hence it's advisable to show a loading indicator to the user while the `await` call executes.\nAlso note that DRM protected files won't return a path, and instead will return `null` as the path.\n\n## Upcoming features - \n* Retrieve metadata of the audio file (Name, Duration, etc)\n* Multiselect audio files\n* Filter based on file extension\n\nPull Requests and feature requests are welcome !\n\n## LICENSE\n```\nMIT License\n\nCopyright (c) 2017 ChiragShenoy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n\n"
  },
  {
    "path": "plugins/audio_picker/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "plugins/audio_picker/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java",
    "content": "package io.flutter.plugins;\n\nimport io.flutter.plugin.common.PluginRegistry;\nimport com.audio_picker.audio_picker.AudioPickerPlugin;\n\n/**\n * Generated file. Do not edit.\n */\npublic final class GeneratedPluginRegistrant {\n  public static void registerWith(PluginRegistry registry) {\n    if (alreadyRegisteredWith(registry)) {\n      return;\n    }\n    AudioPickerPlugin.registerWith(registry.registrarFor(\"com.audio_picker.audio_picker.AudioPickerPlugin\"));\n  }\n\n  private static boolean alreadyRegisteredWith(PluginRegistry registry) {\n    final String key = GeneratedPluginRegistrant.class.getCanonicalName();\n    if (registry.hasPlugin(key)) {\n      return true;\n    }\n    registry.registrarFor(key);\n    return false;\n  }\n}\n"
  },
  {
    "path": "plugins/audio_picker/android/build.gradle",
    "content": "group 'com.audio_picker.audio_picker'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    ext.kotlin_version = '1.6.10'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 31\n    namespace 'com.audio_picker.audio_picker'\n\n    kotlinOptions {\n        jvmTarget = \"17\"\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n    defaultConfig {\n        minSdkVersion 16\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.core:core-ktx:1.1.0'\n}\n"
  },
  {
    "path": "plugins/audio_picker/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.2-all.zip\n"
  },
  {
    "path": "plugins/audio_picker/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\norg.gradle.java.home=C:/AndroidSDK/jdk-17.0.9\nandroid.enableR8=true\n"
  },
  {
    "path": "plugins/audio_picker/android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "plugins/audio_picker/android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "plugins/audio_picker/android/settings.gradle",
    "content": "rootProject.name = 'audio_picker'\n"
  },
  {
    "path": "plugins/audio_picker/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.audio_picker.audio_picker\">\n</manifest>\n"
  },
  {
    "path": "plugins/audio_picker/android/src/main/java/com/audio_picker/audio_picker/FileUtils.java",
    "content": "package com.audio_picker.audio_picker;\n\nimport android.annotation.SuppressLint;\nimport android.content.ContentUris;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Environment;\nimport android.provider.DocumentsContract;\nimport android.provider.MediaStore;\nimport android.provider.OpenableColumns;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.InputStream;\nimport java.util.List;\n\npublic class FileUtils {\n    private static Uri contentUri = null;\n\n    @SuppressLint(\"NewApi\")\n    public static String getPath(final Context context, final Uri uri) {\n        // check here to KITKAT or new version\n        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;\n        String selection = null;\n        String[] selectionArgs = null;\n        // DocumentProvider\n        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {\n            Log.i(\"MIGHTIER\", \"Document provider\");\n            // ExternalStorageProvider\n            if (isExternalStorageDocument(uri)) {\n                \n                Log.i(\"MIGHTIER\", \"ExternalStorageProvider\");\n                final String docId = DocumentsContract.getDocumentId(uri);\n                final String[] split = docId.split(\":\");\n                final String type = split[0];\n\n                Log.i(\"MIGHTIER\", docId);\n                String fullPath = getPathFromExtSD(split);\n                if (fullPath != \"\") {\n                    return fullPath;\n                } else {\n                    return null;\n                }\n            }\n\n            // DownloadsProvider\n            else if (isDownloadsDocument(uri)) {\n                Log.i(\"MIGHTIER\", \"DownloadsProvider\");\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n                    final String id;\n                    Cursor cursor = null;\n                    try {\n                        cursor = context.getContentResolver().query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);\n                        if (cursor != null && cursor.moveToFirst()) {\n                            String fileName = cursor.getString(0);\n                            String path = Environment.getExternalStorageDirectory().toString() + \"/Download/\" + fileName;\n                            if (!TextUtils.isEmpty(path)) {\n                                return path;\n                            }\n                        }\n                    } finally {\n                        if (cursor != null)\n                            cursor.close();\n                    }\n                    id = DocumentsContract.getDocumentId(uri);\n                    if (!TextUtils.isEmpty(id)) {\n                        if (id.startsWith(\"raw:\")) {\n                            return id.replaceFirst(\"raw:\", \"\");\n                        }\n                        String[] contentUriPrefixesToTry = new String[]{\n                                \"content://downloads/public_downloads\",\n                                \"content://downloads/my_downloads\"\n                        };\n                        for (String contentUriPrefix : contentUriPrefixesToTry) {\n                            try {\n                                final Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));\n\n\n                                return getDataColumn(context, contentUri, null, null);\n                            } catch (NumberFormatException e) {\n                                //In Android 8 and Android P the id is not a number\n                                return uri.getPath().replaceFirst(\"^/document/raw:\", \"\").replaceFirst(\"^raw:\", \"\");\n                            }\n                        }\n\n\n                    }\n\n                } else {\n                    final String id = DocumentsContract.getDocumentId(uri);\n                    final boolean isOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;\n                    if (id.startsWith(\"raw:\")) {\n                        return id.replaceFirst(\"raw:\", \"\");\n                    }\n                    try {\n                        contentUri = ContentUris.withAppendedId(\n                                Uri.parse(\"content://downloads/public_downloads\"), Long.valueOf(id));\n\n                    } catch (NumberFormatException e) {\n                        e.printStackTrace();\n                    }\n                    if (contentUri != null) {\n                        return getDataColumn(context, contentUri, null, null);\n                    }\n                }\n\n\n            }\n            // MediaProvider\n            else if (isMediaDocument(uri)) {\n                Log.i(\"MIGHTIER\", \"MediaProvider\");\n                return uri.toString();\n                /*final String docId = DocumentsContract.getDocumentId(uri);\n                final String[] split = docId.split(\":\");\n                final String type = split[0];\n\n                Uri contentUri = null;\n\n                if (\"image\".equals(type)) {\n                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;\n                } else if (\"video\".equals(type)) {\n                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;\n                } else if (\"audio\".equals(type)) {\n                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;\n                }\n                  selection = \"_id=?\";\n                 selectionArgs = new String[]{split[1]};\n\n\n                return getDataColumn(context, contentUri, selection,\n                        selectionArgs);*/\n            } else if (isGoogleDriveUri(uri)) {\n                Log.i(\"MIGHTIER\", \"GoogleDrive\");\n                return getDriveFilePath(uri, context);\n            }\n        }\n\n\n        // MediaStore (and general)\n        else if (\"content\".equalsIgnoreCase(uri.getScheme())) {\n            \n            Log.i(\"MIGHTIER\", \"MediaStore provider\");\n            if (isGooglePhotosUri(uri)) {\n                return uri.getLastPathSegment();\n            }\n\n            if (isGoogleDriveUri(uri)) {\n                return getDriveFilePath(uri, context);\n            }\n             if( Build.VERSION.SDK_INT == Build.VERSION_CODES.N)\n             {\n                // return getFilePathFromURI(context,uri);\n                 return getMediaFilePathForN(uri, context);\n                // return getRealPathFromURI(context,uri);\n             }else\n             {\n\n                 return getDataColumn(context, uri, null, null);\n             }\n\n\n        }\n        // File\n        else if (\"file\".equalsIgnoreCase(uri.getScheme())) {\n            return uri.getPath();\n        }\n\n        return null;\n    }\n\n    private static boolean fileExists(String filePath) {\n        File file = new File(filePath);\n\n        return file.exists();\n    }\n\n    private static String getPathFromExtSD(String[] pathData) {\n        final String type = pathData[0];\n        final String relativePath = \"/\" + pathData[1];\n        String fullPath = \"\";\n\n        Log.i(\"MIGHTIER\", \"External:\" + Environment.getExternalStorageDirectory() );\n        // on my Sony devices (4.4.4 & 5.1.1), `type` is a dynamic string\n        // something like \"71F8-2C0A\", some kind of unique id per storage\n        // don't know any API that can get the root path of that storage based on its id.\n        //\n        // so no \"primary\" type, but let the check here for other devices\n        //if (\"primary\".equalsIgnoreCase(type)) {\n            fullPath = Environment.getExternalStorageDirectory() + relativePath;\n            Log.i(\"MIGHTIER\", \"Primary:\" + fullPath);\n            if (fileExists(fullPath)) {\n                return fullPath;\n            }\n        //}\n\n        // Environment.isExternalStorageRemovable() is `true` for external and internal storage\n        // so we cannot relay on it.\n        //\n        // instead, for each possible path, check if file exists\n        // we'll start with secondary storage as this could be our (physically) removable sd card\n        fullPath = System.getenv(\"SECONDARY_STORAGE\") + relativePath;\n        Log.i(\"MIGHTIER\", \"SECONDARY_STORAGE:\" + fullPath);\n        if (fileExists(fullPath)) {\n            return fullPath;\n        }\n\n        fullPath = System.getenv(\"EXTERNAL_STORAGE\") + relativePath;\n        \n            Log.i(\"MIGHTIER\", \"EXTERNAL_STORAGE:\" + fullPath);\n        if (fileExists(fullPath)) {\n            return fullPath;\n        }\n\n        fullPath = type + relativePath;\n        Log.i(\"MIGHTIER\", \"Typed:\" + fullPath);\n        if (fileExists(fullPath))\n        {\n            return fullPath;\n        }\n\n        fullPath = \"/storage/\" + type + relativePath;\n        Log.i(\"MIGHTIER\", \"storage Typed:\" + fullPath);\n        if (fileExists(fullPath))\n        {\n            return fullPath;\n        }\n\n        Log.i(\"MIGHTIER\", \"NONE:\" + fullPath);\n        return relativePath;\n    }\n\n    private static String getDriveFilePath(Uri uri, Context context) {\n        Uri returnUri = uri;\n        Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);\n\n        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);\n        int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);\n        returnCursor.moveToFirst();\n        String name = (returnCursor.getString(nameIndex));\n        String size = (Long.toString(returnCursor.getLong(sizeIndex)));\n        File file = new File(context.getCacheDir(), name);\n        try {\n            InputStream inputStream = context.getContentResolver().openInputStream(uri);\n            FileOutputStream outputStream = new FileOutputStream(file);\n            int read = 0;\n            int maxBufferSize = 1 * 1024 * 1024;\n            int bytesAvailable = inputStream.available();\n\n            //int bufferSize = 1024;\n            int bufferSize = Math.min(bytesAvailable, maxBufferSize);\n\n            final byte[] buffers = new byte[bufferSize];\n            while ((read = inputStream.read(buffers)) != -1) {\n                outputStream.write(buffers, 0, read);\n            }\n            Log.e(\"File Size\", \"Size \" + file.length());\n            inputStream.close();\n            outputStream.close();\n            Log.e(\"File Path\", \"Path \" + file.getPath());\n            Log.e(\"File Size\", \"Size \" + file.length());\n        } catch (Exception e) {\n            Log.e(\"Exception\", e.getMessage());\n        }\n        return file.getPath();\n    }\n\n    private static String getMediaFilePathForN(Uri uri, Context context) {\n        Uri returnUri = uri;\n        Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);\n\n        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);\n        int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);\n        returnCursor.moveToFirst();\n        String name = (returnCursor.getString(nameIndex));\n        String size = (Long.toString(returnCursor.getLong(sizeIndex)));\n        File file = new File(context.getFilesDir(), name);\n        try {\n            InputStream inputStream = context.getContentResolver().openInputStream(uri);\n            FileOutputStream outputStream = new FileOutputStream(file);\n            int read = 0;\n            int maxBufferSize = 1 * 1024 * 1024;\n            int bytesAvailable = inputStream.available();\n\n            //int bufferSize = 1024;\n            int bufferSize = Math.min(bytesAvailable, maxBufferSize);\n\n            final byte[] buffers = new byte[bufferSize];\n            while ((read = inputStream.read(buffers)) != -1) {\n                outputStream.write(buffers, 0, read);\n            }\n            Log.e(\"File Size\", \"Size \" + file.length());\n            inputStream.close();\n            outputStream.close();\n            Log.e(\"File Path\", \"Path \" + file.getPath());\n            Log.e(\"File Size\", \"Size \" + file.length());\n        } catch (Exception e) {\n            Log.e(\"Exception\", e.getMessage());\n        }\n        return file.getPath();\n    }\n\n\n    private static String getDataColumn(Context context, Uri uri,\n                                        String selection, String[] selectionArgs) {\n        Cursor cursor = null;\n        final String column = \"_data\";\n        final String[] projection = {column};\n\n        try {\n            cursor = context.getContentResolver().query(uri, projection,\n                    selection, selectionArgs, null);\n\n            if (cursor != null && cursor.moveToFirst()) {\n                final int index = cursor.getColumnIndexOrThrow(column);\n                return cursor.getString(index);\n            }\n        } finally {\n            if (cursor != null)\n                cursor.close();\n        }\n\n        return null;\n    }\n\n    private static boolean isExternalStorageDocument(Uri uri) {\n        return \"com.android.externalstorage.documents\".equals(uri.getAuthority());\n    }\n\n    private static boolean isDownloadsDocument(Uri uri) {\n        return \"com.android.providers.downloads.documents\".equals(uri.getAuthority());\n    }\n\n    private static boolean isMediaDocument(Uri uri) {\n        return \"com.android.providers.media.documents\".equals(uri.getAuthority());\n    }\n\n    private static boolean isGooglePhotosUri(Uri uri) {\n        return \"com.google.android.apps.photos.content\".equals(uri.getAuthority());\n    }\n\n\n    private static boolean isGoogleDriveUri(Uri uri) {\n        return \"com.google.android.apps.docs.storage\".equals(uri.getAuthority()) || \"com.google.android.apps.docs.storage.legacy\".equals(uri.getAuthority());\n    }\n\n\n}"
  },
  {
    "path": "plugins/audio_picker/android/src/main/kotlin/com/audio_picker/audio_picker/AudioPickerPlugin.kt",
    "content": "package com.audio_picker.audio_picker\n\nimport android.Manifest.permission.READ_EXTERNAL_STORAGE\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Environment\nimport android.util.Log\nimport io.flutter.embedding.engine.plugins.FlutterPlugin\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler\nimport io.flutter.plugin.common.MethodChannel.Result\nimport android.provider.MediaStore\nimport android.media.MediaMetadataRetriever\nimport java.io.File.separator\n\nclass AudioPickerPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {\n    private lateinit var channel: MethodChannel\n    private var activity: Activity? = null\n    private var context: Context? = null\n\n    companion object {\n        private const val CHANNEL_NAME = \"audio_picker\"\n        private const val REQUEST_CODE = 0x2324\n        private const val TAG = \"AudioPicker\"\n        private var pendingResult: Result? = null\n    }\n\n    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {\n        channel = MethodChannel(binding.binaryMessenger, CHANNEL_NAME)\n        channel.setMethodCallHandler(this)\n        context = binding.applicationContext\n    }\n\n    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {\n        channel.setMethodCallHandler(null)\n        context = null\n    }\n\n    override fun onAttachedToActivity(binding: ActivityPluginBinding) {\n        activity = binding.activity\n        binding.addActivityResultListener { requestCode, resultCode, data ->\n            handleActivityResult(requestCode, resultCode, data)\n        }\n    }\n\n    override fun onDetachedFromActivity() {\n        activity = null\n    }\n\n    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {\n        onAttachedToActivity(binding)\n    }\n\n    override fun onDetachedFromActivityForConfigChanges() {\n        onDetachedFromActivity()\n    }\n\n    override fun onMethodCall(call: MethodCall, result: Result) {\n        when (call.method) {\n            \"pick_audio\" -> {\n                pendingResult = result\n                openAudioPicker(false)\n            }\n            \"pick_audio_multiple\" -> {\n                pendingResult = result\n                openAudioPicker(true)\n            }\n            \"get_metadata\" -> {\n                pendingResult = result\n                val uriString = call.argument<String>(\"uri\")\n                val uri = Uri.parse(uriString)\n                context?.let { getAudioMetadata(uri, it) }\n            }\n            else -> result.notImplemented()\n        }\n    }\n\n    private fun openAudioPicker(multiple: Boolean) {\n        val intent = Intent(Intent.ACTION_GET_CONTENT).apply {\n            val uri = Uri.parse(Environment.getExternalStorageDirectory().path + separator)\n            setDataAndType(uri, \"audio/*\")\n            type = \"audio/*\"\n            addCategory(Intent.CATEGORY_OPENABLE)\n            if (multiple) {\n                putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)\n            }\n        }\n\n        activity?.let {\n            if (intent.resolveActivity(it.packageManager) != null) {\n                it.startActivityForResult(intent, REQUEST_CODE)\n            } else {\n                Log.e(TAG, \"Can't find a valid activity to handle the request. Make sure you've a file explorer installed.\")\n                pendingResult?.error(TAG, \"Can't handle the provided file type.\", null)\n            }\n        } ?: run {\n            pendingResult?.error(TAG, \"Activity is not available\", null)\n        }\n    }\n\n    private fun getAudioMetadata(uri: Uri, context: Context) {\n        val metadataRetriever = MediaMetadataRetriever()\n        val metadataMap = HashMap<String, String?>()\n\n        try {\n            metadataRetriever.setDataSource(context, uri)\n            metadataMap[\"title\"] = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)\n            metadataMap[\"artist\"] = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)\n        } catch (e: Exception) {\n            Log.e(TAG, \"Error retrieving audio metadata: ${e.message}\")\n            e.printStackTrace()\n        } finally {\n            metadataRetriever.release()\n            pendingResult?.success(metadataMap)\n        }\n    }\n\n    private fun handleActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {\n        if (requestCode != REQUEST_CODE) return false\n\n        when (resultCode) {\n            Activity.RESULT_OK -> {\n                Thread {\n                    when {\n                        data?.data != null -> handleSingleFile(data.data!!)\n                        data?.clipData != null -> handleMultipleFiles(data)\n                        else -> runOnUiThread(\"Unknown activity error, please file an issue.\", false)\n                    }\n                }.start()\n            }\n            Activity.RESULT_CANCELED -> {\n                pendingResult?.success(null)\n            }\n            else -> {\n                pendingResult?.error(TAG, \"Unknown activity error, please file an issue.\", null)\n            }\n        }\n        return true\n    }\n\n    private fun handleSingleFile(uri: Uri) {\n        val fullPath = context?.let { FileUtils.getPath(it, uri) }\n        if (fullPath != null) {\n            Log.i(TAG, \"Absolute file path: $fullPath\")\n            runOnUiThread(fullPath, true)\n        } else {\n            runOnUiThread(\"Failed to retrieve path.\", false)\n        }\n    }\n\n    private fun handleMultipleFiles(data: Intent) {\n        val list = ArrayList<String>()\n        for (i in 0 until data.clipData!!.itemCount) {\n            val uri = data.clipData!!.getItemAt(i).uri\n            context?.let { FileUtils.getPath(it, uri) }?.let { list.add(it) }\n        }\n        runOnUiThread(list, true)\n    }\n\n    private fun runOnUiThread(result: Any, success: Boolean) {\n        activity?.runOnUiThread {\n            if (success) {\n                pendingResult?.success(result)\n            } else {\n                pendingResult?.error(TAG, result as String, null)\n            }\n        }\n    }\n}"
  },
  {
    "path": "plugins/audio_picker/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "plugins/audio_picker/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/audio_picker/ios/Classes/AudioPickerPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface AudioPickerPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/audio_picker/ios/Classes/AudioPickerPlugin.m",
    "content": "#import \"AudioPickerPlugin.h\"\n#import <audio_picker/audio_picker-Swift.h>\n\n@implementation AudioPickerPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftAudioPickerPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "plugins/audio_picker/ios/Classes/SwiftAudioPickerPlugin.swift",
    "content": "import Flutter\nimport UIKit\nimport AVFoundation\nimport MediaPlayer\n\npublic class SwiftAudioPickerPlugin: NSObject, FlutterPlugin, MPMediaPickerControllerDelegate, UIDocumentPickerDelegate {\n    \n    let bookmarkPrefix = \"iosbm://\"\n\n    var _viewController : UIViewController?\n    var _audioPickerController : MPMediaPickerController?\n    var _flutterResult : FlutterResult?\n    var _channel : FlutterMethodChannel?\n    \n    public static func register(with registrar: FlutterPluginRegistrar) {\n        let channel = FlutterMethodChannel(name: \"audio_picker\", binaryMessenger: registrar.messenger())\n        let viewController = UIApplication.shared.delegate?.window??.rootViewController\n        let instance = SwiftAudioPickerPlugin(viewController: viewController)\n        instance._channel = channel\n        registrar.addMethodCallDelegate(instance, channel: channel)\n    }\n    \n    init(viewController: UIViewController?) {\n        super.init()\n        self._viewController = viewController\n    }\n    \n    \n    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n        if(call.method == \"pick_audio\"){\n            \n            _flutterResult = result\n            openAudioPicker(multiple:false)\n        }\n        if(call.method == \"pick_audio_multiple\") {\n\n            _flutterResult = result\n            openAudioPicker(multiple:true)\n        }\n        if(call.method == \"pick_audio_file\"){\n            \n            _flutterResult = result\n            openFilePicker(multiple:false)\n        }\n        if(call.method == \"pick_audio_file_multiple\"){\n            \n            _flutterResult = result\n            openFilePicker(multiple:true)\n        }\n        if (call.method==\"pick_audio_bookmark_to_url\")\n        {\n            _flutterResult = result;\n            if let args = call.arguments as? [String: Any],\n            let bookmark = args[\"bookmark\"] as? String {\n                bookmarkToUrl(from: bookmark)\n            } else {\n                result(FlutterError(code: \"invalid_argument\", message: \"Invalid arguments\", details: nil))\n            }\n            \n        }\n        if (call.method==\"pick_audio_release_security_scope\")\n        {\n            if let args = call.arguments as? [String: Any],\n            let url = args[\"url\"] as? String {\n                releaseUrlSecurityScopedAccess(from: url)\n                result(true)\n            } else {\n                result(FlutterError(code: \"invalid_argument\", message: \"Invalid arguments\", details: nil))\n            }\n        }\n        if (call.method==\"get_metadata\") {\n            if let args = call.arguments as? [String: Any],\n            let assetUrl = args[\"assetUrl\"] as? String {\n                let metadata = getArtistAndTitle(from: assetUrl)\n                result(metadata)\n            } else {\n                result(FlutterError(code: \"invalid_argument\", message: \"Invalid arguments\", details: nil))\n            }\n        }\n    }\n\n    enum ExportError: Error {\n        case unableToCreateExporter\n    }\n    \n    public func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {\n        mediaPicker.dismiss(animated: true, completion: nil)\n\n        let count = mediaItemCollection.count;\n        if (count == 1) {\n            let mediaItem = mediaItemCollection.items.first\n            if (mediaItem?.assetURL != nil) {\n                self._flutterResult?(mediaItem?.assetURL?.absoluteString)\n            }\n        }\n        else {\n            var uniquePaths = Set<String>()\n            for item in mediaItemCollection.items {\n                if let path = item.assetURL?.absoluteString {\n                    uniquePaths.insert(path)\n                }\n            }\n            let pathList = Array(uniquePaths)\n            self._flutterResult?(pathList)\n        }\n    }\n\n    public func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController)\n    {   _flutterResult?(nil)\n        _flutterResult = nil\n        mediaPicker.dismiss(animated: true, completion: nil)\n    }\n    \n    func openAudioPicker(multiple: Bool) {\n        _audioPickerController = MPMediaPickerController.self(mediaTypes:MPMediaType.music)\n        _audioPickerController?.delegate = self\n        _audioPickerController?.showsCloudItems = true\n        _audioPickerController?.showsItemsWithProtectedAssets = false\n        _audioPickerController?.allowsPickingMultipleItems = multiple\n        _audioPickerController?.modalPresentationStyle = UIModalPresentationStyle.currentContext\n        _viewController?.present(_audioPickerController!, animated: true, completion: nil)\n    }\n\n    func openFilePicker(multiple: Bool) {\n        // Present the UIDocumentPickerViewController\n        let documentPicker = UIDocumentPickerViewController(documentTypes: [\"public.audio\"], in: .open)\n        documentPicker.delegate = self\n        documentPicker.allowsMultipleSelection = multiple\n        documentPicker.modalPresentationStyle = .formSheet\n        _viewController?.present(documentPicker, animated: true, completion: nil)\n    }\n\n    public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {\n\n        var bookmarkURLs: [String] = []\n        \n        for url in urls {\n            do {\n                // Start accessing the security-scoped resource\n                if url.startAccessingSecurityScopedResource() {\n                    // Create a bookmark data for the URL\n                    let bookmarkData = try url.bookmarkData(options: [], includingResourceValuesForKeys: nil, relativeTo: nil)\n                    // Convert the bookmark data to a base64 encoded string\n                    let bookmarkString = bookmarkPrefix + bookmarkData.base64EncodedString()\n                    // Append the bookmark string to the array\n                    bookmarkURLs.append(bookmarkString)\n                    \n                    // Stop accessing the security-scoped resource\n                    url.stopAccessingSecurityScopedResource()\n                } else {\n                    // Handle the case where access to the security-scoped resource is denied\n                    // You can choose to skip this URL or handle the error accordingly\n                }\n            } catch {\n                // Handle error\n                print(error.localizedDescription)\n            }\n        }\n\n        self._flutterResult?(bookmarkURLs)\n    }\n\n    func getArtistAndTitle(from assetUrl: String) -> [String: String] {\n        if assetUrl.hasPrefix(\"iosbm://\") {\n            guard let url = getUrlFromBookmark(from: assetUrl) else {\n                return [\"artist\": \"\", \"title\": \"\"]\n            }\n            \n            if url.startAccessingSecurityScopedResource() {\n                let asset = AVAsset(url: url)\n                let metadata = asset.metadata\n                \n                var artist = \"\"\n                var title = \"\"\n                for item in metadata {\n                    if let key = item.commonKey?.rawValue, let value = item.value {\n                        if key == \"title\" {\n                            title = value as? String ?? \"\"\n                        } else if key == \"artist\" {\n                            artist = value as? String ?? \"\"\n                        }\n                    }\n                }\n                \n                url.stopAccessingSecurityScopedResource()\n                if artist.isEmpty, title.isEmpty {\n                    //if the track has no metadata - return the filename\n                    //cause flutter can't access it and would use the bookmark b64 data\n                    let fileName = url.deletingPathExtension().lastPathComponent\n                    return [\"artist\": fileName, \"title\": \"\"]\n                } else {\n                    return [\"artist\": artist, \"title\": title]\n                }\n            }\n        } else {\n            let query = MPMediaQuery.songs()\n            let predicate = MPMediaPropertyPredicate(value: assetUrl, forProperty: MPMediaItemPropertyPersistentID)\n            query.addFilterPredicate(predicate)\n            if let result = query.items?.first {\n                let title = result.title ?? \"\"\n                let artist = result.artist ?? \"\"\n                return [\"artist\": artist, \"title\": title]\n            }\n        }\n        return [\"artist\": \"\", \"title\": \"\"]\n    }\n\n    func getUrlFromBookmark(from bookmarkB64: String) -> URL? {\n        var bookmarkString = bookmarkB64\n            bookmarkString = bookmarkString.replacingOccurrences(of: bookmarkPrefix, with: \"\")\n        if let bookmarkData = Data(base64Encoded: bookmarkString) {\n            do {\n                var isStale = false\n                let url = try URL(resolvingBookmarkData: bookmarkData, options: [], relativeTo: nil, bookmarkDataIsStale: &isStale)\n                \n                if isStale {\n                    print(\"it's stale - update it\")\n                    let newBookmark = try url.bookmarkData(options: [], includingResourceValuesForKeys: nil, relativeTo: nil)\n                    let newBookmarkString = bookmarkPrefix + newBookmark.base64EncodedString()\n                    _channel?.invokeMethod(\"updateBookmark\", arguments: [bookmarkB64, newBookmarkString])\n                }\n                \n                return url\n            } catch {\n                print(error.localizedDescription)\n            }\n        }\n        \n        return nil\n    }\n\n    func bookmarkToUrl(from bookmarkString: String) {\n        guard let url = getUrlFromBookmark(from: bookmarkString) else {\n            return\n        }\n        \n        if url.startAccessingSecurityScopedResource() {\n            print(\"Obtaining a security scoped access for URL: \\(url.absoluteString)\")\n            self._flutterResult?(url.absoluteString)\n            //url.stopAccessingSecurityScopedResource()\n        }\n    }\n    \n    func releaseUrlSecurityScopedAccess(from urlString: String) {\n        guard let url = URL(string: urlString) else {\n            print(\"Invalid URL string\")\n            return\n        }\n        \n        url.stopAccessingSecurityScopedResource()\n        print(\"Released security scoped access for URL: \\(urlString)\")\n    }\n}\n"
  },
  {
    "path": "plugins/audio_picker/ios/audio_picker.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html\n#\nPod::Spec.new do |s|\n  s.name             = 'audio_picker'\n  s.version          = '0.0.1'\n  s.summary          = 'A new Flutter project.'\n  s.description      = <<-DESC\nA new Flutter project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.public_header_files = 'Classes/**/*.h'\n  s.dependency 'Flutter'\n\n  s.ios.deployment_target = '8.0'\nend\n\n"
  },
  {
    "path": "plugins/audio_picker/lib/audio_picker.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/services.dart';\n\ntypedef StaleBookmarkCallback = void Function(String old, String updated);\n\nclass AudioPicker {\n  static const MethodChannel _channel = MethodChannel('audio_picker');\n  static AudioPicker? _instance;\n\n  StaleBookmarkCallback? _onStaleBookmark;\n\n  factory AudioPicker() {\n    _instance ??= AudioPicker._();\n    return _instance!;\n  }\n\n  AudioPicker._() {\n    // Attach handlers to the platform channel here\n    _channel.setMethodCallHandler((call) async {\n      // Check if the method name is updateBookmark\n      if (call.method == \"updateBookmark\") {\n        // Get the old and new bookmark data from the arguments\n        var oldBookmark = call.arguments[0] as String;\n        var newBookmark = call.arguments[1] as String;\n\n        _onStaleBookmark?.call(oldBookmark, newBookmark);\n      }\n    });\n  }\n\n  void regusterOnStaleBookmark(StaleBookmarkCallback callback) {\n    _onStaleBookmark = callback;\n  }\n\n  Future<String> pickAudio() async {\n    final String absolutePath = await _channel.invokeMethod('pick_audio');\n    return absolutePath;\n  }\n\n  Future<List<String>> pickAudioMultiple() async {\n    final absolutePath = await _channel.invokeMethod('pick_audio_multiple');\n    if (absolutePath is String) return [absolutePath];\n    if (absolutePath != null) return List<String>.from(absolutePath);\n    return [];\n  }\n\n  Future<List<String>> pickAudioFiles() async {\n    final absolutePath =\n        await _channel.invokeMethod('pick_audio_file_multiple');\n\n    if (absolutePath != null) return List<String>.from(absolutePath);\n    return absolutePath;\n  }\n\n  Future<String> iosBookmarkToUrl(String bookmark) async {\n    var url = await _channel\n        .invokeMethod('pick_audio_bookmark_to_url', {'bookmark': bookmark});\n    return url;\n  }\n\n  void iosReleaseSecurityScope(String url) {\n    _channel.invokeMethod('pick_audio_release_security_scope', {'url': url});\n  }\n\n  Future<Map<String, String?>> getMetadata(String assetUrl) async {\n    if (Platform.isIOS) {\n      if (assetUrl.contains(\"ipod-library://\")) {\n        String url = assetUrl;\n        Uri uri = Uri.parse(url);\n        assetUrl = uri.queryParameters[\"id\"] ?? assetUrl;\n      }\n      final result =\n          await _channel.invokeMethod('get_metadata', {'assetUrl': assetUrl});\n      return Map<String, String>.from(result);\n    } else if (Platform.isAndroid) {\n      final result =\n          await _channel.invokeMethod('get_metadata', {'uri': assetUrl});\n      return Map<String, String?>.from(result);\n    }\n    return Future.error(\"Unsupported platform\");\n  }\n}\n"
  },
  {
    "path": "plugins/audio_picker/pubspec.yaml",
    "content": "name: audio_picker\ndescription: This plugin helps open a picker to get the absolute path of Audio files from your phone. If you ever wanted to play songs in your app, or upload audio files to your server, this plugin helps you get the absolute path of the audio file that you select.\nversion: 1.0.0\nhomepage: https://github.com/chiragshenoy/audio_picker\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n  plugin:\n    androidPackage: com.audio_picker.audio_picker\n    pluginClass: AudioPickerPlugin\n"
  },
  {
    "path": "plugins/audio_waveform/.gitignore",
    "content": "# General\nbuild/\n\n# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.project\n.classpath\n.settings/\n.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\ncoverage/\npubspec.lock\n\n# Web related\ngenerated_plugin_registrant.dart\n\n# Android related\n**/gradle-wrapper.jar\n.gradle\ncaptures/\ngradlew\ngradlew.bat\nlocal.properties\n**/GeneratedPluginRegistrant.java\n\n# Android Studio will place build artifacts here\n**/android/app/debug\n**/android/app/profile\n**/android/app/release\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# iOS/macOS/XCode related\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n*sync/\n.sconsign.dblite\n.tags*\n.vagrant/\nDerivedData/\n**/ios/**/Icon?\nPods/\n.symlinks/\nprofile\nxcuserdata\n.generated/\n**/Flutter/App.framework\n**/Flutter/Flutter.podspec\n**/Flutter/Flutter.framework\n**/Flutter/Generated.xcconfig\n**/Flutter/ephemeral\n**/Flutter/app.flx\n**/Flutter/app.zip\n**/Flutter/flutter_assets/\n**/Flutter/flutter_export_environment.sh\nServiceDefinitions.json\nGeneratedPluginRegistrant.*\n\n# Exceptions\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n"
  },
  {
    "path": "plugins/audio_waveform/README.md",
    "content": "# just_waveform\n\nThis plugin extracts waveform data from an audio file that can be used to render waveform visualisations.\n\n<img src=\"https://user-images.githubusercontent.com/19899190/138703227-6263c233-945c-4b60-8f0a-f652fbba9a3f.png\" alt=\"waveform screenshot\" width=\"350\" />\n\n## Usage\n\n```dart\nfinal progressStream = AudiotWaveform.extract(\n  audioInFile: '/path/to/audio.mp3',\n  zoom: const WaveformZoom.pixelsPerSecond(100),\n);\nprogressStream.listen((waveformProgress) {\n  print('Progress: %${(100 * waveformProgress.progress).toInt()}');\n  if (waveformProgress.waveform != null) {\n    // Use the waveform.\n  }\n});\n```\n"
  },
  {
    "path": "plugins/audio_waveform/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "plugins/audio_waveform/android/build.gradle",
    "content": "group 'com.tuntori.audio_waveform'\nversion '1.0'\n\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.1.0'\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n    namespace 'com.tuntori.audio_waveform'\n    compileSdkVersion 31\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        minSdkVersion 16\n    }\n}\n"
  },
  {
    "path": "plugins/audio_waveform/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.7-all.zip\n"
  },
  {
    "path": "plugins/audio_waveform/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "plugins/audio_waveform/android/settings.gradle",
    "content": "rootProject.name = 'audio_waveform'\n"
  },
  {
    "path": "plugins/audio_waveform/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.tuntori.audio_waveform\">\n</manifest>\n"
  },
  {
    "path": "plugins/audio_waveform/android/src/main/java/com/tuntori/audio_waveform/AudioWaveformPlugin.java",
    "content": "package com.tuntori.audio_waveform;\n\nimport androidx.annotation.NonNull;\nimport android.content.Context;\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin;\nimport io.flutter.plugin.common.MethodCall;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler;\nimport io.flutter.plugin.common.MethodChannel.Result;\nimport android.os.Handler;\nimport java.util.List;\n\n/** AudioWaveformPlugin */\npublic class AudioWaveformPlugin implements FlutterPlugin, MethodCallHandler {\n    private MethodChannel channel;\n    private Context context;\n    private WaveformExtractor decoder = new WaveformExtractor();\n\n    @Override\n    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {\n        context = flutterPluginBinding.getApplicationContext();\n        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), \"com.tuntori.audio_waveform\");\n        channel.setMethodCallHandler(this);\n    }\n\n    @Override\n    public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) {\n        switch (call.method) {\n            case \"open\":\n                String audioInPath = call.argument(\"path\");\n                boolean legacy = call.argument(\"legacy\");\n                decoder.open(audioInPath, context, legacy);\n                result.success(null);\n                break;\n            case \"next\":\n                if (decoder != null) {\n                    byte[] buffer = decoder.readShortData();\n                    result.success(buffer);\n                } else {\n                    result.error(\"decoder_unavailable\", \"you must open a file first\", null);\n                }\n                break;\n            case \"close\":\n                if (decoder != null) {\n                    decoder.release();\n                }\n                result.success(null);\n                break;\n            case \"duration\":\n                if (decoder != null) {\n                    long dur = decoder.getDuration();\n                    result.success(dur);\n                } else {\n                    result.error(\"decoder_unavailable\", \"you must open a file first\", null);\n                }\n                break;\n            case \"sampleRate\":\n                if (decoder != null) {\n                    int sr = decoder.getSampleRate();\n                    result.success(sr);\n                } else {\n                    result.error(\"decoder_unavailable\", \"you must open a file first\", null);\n                }\n                break;\n            default:\n                result.notImplemented();\n                break;\n        }\n    }\n\n    @Override\n    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {\n        if (decoder != null) {\n            decoder.release();\n        }\n        channel.setMethodCallHandler(null);\n        channel = null;\n        context = null;\n    }\n}"
  },
  {
    "path": "plugins/audio_waveform/android/src/main/java/com/tuntori/audio_waveform/SimpleEncoder.java",
    "content": "\npackage com.tuntori.audio_waveform;\n\n//https://imnotyourson.com/enhance-poor-performance-of-decoding-audio-with-mediaextractor-and-mediacodec-to-pcm/\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.nio.ShortBuffer;\nimport java.util.Arrays;\nimport java.util.LinkedList;\nimport android.content.Context;\nimport \tandroid.content.res.AssetFileDescriptor;\nimport android.media.MediaCodec;\nimport android.media.MediaExtractor;\nimport android.media.MediaFormat;\nimport android.net.Uri;\nimport android.util.Log;\n\npublic class SimpleEncoder {\n    private Boolean VERBOSE = false;\n    private String TAG = \"SimpleEncoder\";\n    private int DECODE_INPUT_SIZE = 524288; // 524288 Bytes = 0.5 MB\n    private int BUFFER_OVERFLOW_SAFE_GATE = 5000;\n    // Analog audio is recorded by sampling it 44,100 times per second, and then these samples are used to reconstruct the audio signal when playing it back.\n    // ref:https://en.wikipedia.org/wiki/44,100_Hz#Related_rates\n    public static final int DEFAULT_SAMPLE_RATE = 44100;\n    private ProgressListener mProgressListener = null;\n\n    // Member variables representing frame data\n    private int mFileSize;\n    private int mSampleRate;\n    private int mChannels;\n    private long mDuration;\n    private int mNumSamples;  // total number of samples per channel in audio file\n    private ByteBuffer mDecodedBytes;  // Raw audio data\n    private byte[] mDecodedData;  // shared buffer with mDecodedBytes.\n    // mDecodedSamples has the following format:\n    // {s1c1, s1c2, ..., s1cM, s2c1, ..., s2cM, ..., sNc1, ..., sNcM}\n    // where sicj is the ith sample of the jth channel (a sample is a signed short)\n    // M is the number of channels (e.g. 2 for stereo) and N is the number of samples per channel.\n\n    private MediaCodec mAudioDecoder = null;\n    private MediaFormat mDecoderOutputAudioFormat = null;\n    private boolean mAudioExtractorDone = false;\n    private boolean mAudioInputBufferEOF = false;\n    private boolean mAudioDecoderDone = false;\n    private MediaExtractor mAudioExtractor = null;\n    private int mAudioExtractedFrameCount = 0;\n    private int mAudioDecodedFrameCount = 0;\n    private int mAudioExtractedTotalSize = 0;\n    private int decodedSamplesSize = 0;  // size of the output buffer containing decoded samples.\n    private byte[] decodedSamples = null;\n    private int sampleStep = 1;\n\n    private LinkedList<Integer> mPendingAudioDecoderOutputBufferIndices;\n    private LinkedList<MediaCodec.BufferInfo> mPendingAudioDecoderOutputBufferInfos;\n\n    // Progress listener interface.\n    public interface ProgressListener {\n        //\n         // Will be called by the SoundFile class periodically\n         // with values between 0.0 and 1.0.  Return true to continue\n         // loading the file or recording the audio, and false to cancel or stop recording.\n         ///\n        boolean reportProgress(double fractionComplete);\n    }\n\n    // Custom exception for invalid inputs.\n    public class InvalidInputException extends Exception {\n        public InvalidInputException(String message) {\n            super(message);\n        }\n    }\n\n    // Create and return a SimpleEncoder object using the file fileName.\n    public static SimpleEncoder create(String fileName, Context context, \n                                       ProgressListener progressListener)\n            throws FileNotFoundException,\n            java.io.IOException, InvalidInputException {\n\n        SimpleEncoder simpleEncoder = new SimpleEncoder();\n        simpleEncoder.setProgressListener(progressListener);\n        simpleEncoder.ReadFile(fileName, context);\n        return simpleEncoder;\n    }\n\n    public int getFileSizeBytes() {\n        return mFileSize;\n    }\n\n    public int getSampleRate() {\n        return mSampleRate;\n    }\n\n    public int getChannels() {\n        return mChannels;\n    }\n\n    public long getDuration() {\n        return mDuration;\n    }\n\n    public int getNumSamples() {\n        return mNumSamples;  // Number of samples per channel.\n    }\n\n    public byte[] getSamples() {\n        return mDecodedData;\n    }\n\n    private SimpleEncoder() {\n    }\n\n    private void setProgressListener(ProgressListener progressListener) {\n        mProgressListener = progressListener;\n    }\n\n    private void logState() {\n        if (VERBOSE) {\n            Log.d(TAG, String.format(\n                    \"loop: \"\n                            + \"{\"\n                            + \"extracted:%d(done:%b) \"\n                            + \"decoded:%d(done:%b) \",\n\n                    mAudioExtractedFrameCount, mAudioExtractorDone,\n                    mAudioDecodedFrameCount, mAudioDecoderDone\n            ));\n        }\n    }\n\n    private void decodeAudio() {\n        if (mPendingAudioDecoderOutputBufferIndices.size() == 0) {\n            return;\n        }\n        int decoderIndex = mPendingAudioDecoderOutputBufferIndices.poll();\n        MediaCodec.BufferInfo info = mPendingAudioDecoderOutputBufferInfos.poll();\n\n        int size = info.size;\n        long presentationTime = info.presentationTimeUs;\n        if (VERBOSE) {\n            Log.d(TAG, \"audio decoder: processing pending buffer: \"\n                    + decoderIndex);\n            Log.d(TAG, \"audio decoder: pending buffer of size \" + size);\n            Log.d(TAG, \"audio decoder: pending buffer for time \" + presentationTime);\n        }\n        if (size >= 0) {\n            ByteBuffer decoderOutputBuffer = mAudioDecoder.getOutputBuffer(decoderIndex).duplicate();\n            if (decodedSamplesSize < info.size) {\n                decodedSamplesSize = info.size;\n                decodedSamples = new byte[decodedSamplesSize];\n            }\n            decoderOutputBuffer.get(decodedSamples, 0, info.size);\n            mAudioDecoder.releaseOutputBuffer(decoderIndex, false);\n            // Check if buffer is big enough. Resize it if it's too small.\n            if (mDecodedBytes.remaining() < info.size) {\n                // Getting a rough estimate of the total size, allocate 20% more, and\n                // make sure to allocate at least 5MB more than the initial size.\n                int position = mDecodedBytes.position();\n                int newSize = (int) ((position * (1.0 * mFileSize / mAudioExtractedTotalSize)) * 1.2);\n                if (newSize - position < info.size + 5 * (1 << 20)) {\n                    newSize = position + info.size + 5 * (1 << 20);\n                }\n                ByteBuffer newDecodedBytes = null;\n                // Try to allocate memory. If we are OOM, try to run the garbage collector.\n                int retry = 10;\n                while (retry > 0) {\n                    try {\n                        newDecodedBytes = ByteBuffer.allocate(newSize);\n                        break;\n                    } catch (OutOfMemoryError oome) {\n                        // setting android:largeHeap=\"true\" in <application> seem to help not\n                        // reaching this section.\n                        retry--;\n                    }\n                }\n                if (retry == 0) {\n                    // Failed to allocate memory... Stop reading more data and finalize the\n                    // instance with the data decoded so far.\n                    Log.e(TAG, \"Failed to allocate memory... Stop reading more data\");\n                }\n                //ByteBuffer newDecodedBytes = ByteBuffer.allocate(newSize);\n                mDecodedBytes.rewind();\n                newDecodedBytes.put(mDecodedBytes);\n                mDecodedBytes = newDecodedBytes;\n                mDecodedBytes.position(position);\n            }\n            mDecodedBytes.put(decodedSamples, 0, info.size);\n        }\n        if ((info.flags\n                & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {\n            Log.d(TAG, \"audio decoder: EOS\");\n            synchronized (this) {\n                mAudioDecoderDone = true;\n                notifyAll();\n            }\n        }\n        logState();\n    }\n\n    // \n    //   Creates a decoder for the given format.\n    //  \n    //   @param inputFormat the format of the stream to decode\n    //  \n    private MediaCodec createAudioDecoder(MediaFormat inputFormat) throws IOException {\n        inputFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, DECODE_INPUT_SIZE); // huge throughput\n        MediaCodec decoder = MediaCodec.createDecoderByType(inputFormat.getString(MediaFormat.KEY_MIME));\n        decoder.setCallback(new MediaCodec.Callback() {\n            public void onError(MediaCodec codec, MediaCodec.CodecException exception) {\n                Log.e(TAG, exception.toString());\n            }\n            public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {\n                mDecoderOutputAudioFormat = codec.getOutputFormat();\n                if (VERBOSE) {\n                    Log.d(TAG, \"audio decoder: output format changed: \"\n                            + mDecoderOutputAudioFormat);\n                }\n            }\n            public void onInputBufferAvailable(MediaCodec codec, int index) {\n                ByteBuffer decoderInputBuffer = codec.getInputBuffer(index);\n                while (!mAudioExtractorDone && !mAudioInputBufferEOF) {\n                    int bufferChunkSize = 0;\n                    long presentationTime = 0;\n                    while (true) {\n                        ByteBuffer tempBuffer = ByteBuffer.allocate(1 << 10);\n                        int size = mAudioExtractor.readSampleData(tempBuffer, 0);\n                        if (size > 0) {\n                            bufferChunkSize += size;\n                            decoderInputBuffer.put(tempBuffer);\n                            mAudioExtractedTotalSize += size;\n                            presentationTime += mAudioExtractor.getSampleTime();\n                            if (VERBOSE) {\n                                Log.d(TAG, \"audio extractor: returned buffer of size \" + size);\n                                Log.d(TAG, \"audio extractor: returned buffer for time \" + presentationTime);\n                            }\n                        }\n                        mAudioExtractorDone = !mAudioExtractor.advance() && size == -1;\n                        mAudioExtractedFrameCount++;\n                        if (bufferChunkSize > (DECODE_INPUT_SIZE - BUFFER_OVERFLOW_SAFE_GATE) || size == -1 ||  mAudioDecoderDone) {\n                            break;\n                        }\n                    }\n                    if (bufferChunkSize >= 0) {\n                        codec.queueInputBuffer(\n                                index,\n                                0,\n                                bufferChunkSize,\n                                presentationTime,\n                                mAudioExtractor.getSampleFlags());\n                    } else if (mAudioExtractorDone) {\n                        if (VERBOSE) {\n                            Log.d(TAG, \"audio extractor: EOS\");\n                        }\n                        codec.queueInputBuffer(\n                                index,\n                                0,\n                                0,\n                                0,\n                                MediaCodec.BUFFER_FLAG_END_OF_STREAM);\n                    }\n                    if (mProgressListener != null) {\n                        if (!mProgressListener.reportProgress((float) (mAudioExtractedTotalSize) / mFileSize)) {\n                            // We are asked to stop reading the file. Returning immediately. The\n                            // SoundFile object is invalid and should NOT be used afterward!\n                            synchronized (this) {\n                                mAudioDecoderDone = true;\n                                notifyAll();\n                            }\n                        }\n                    }\n                    logState();\n                    if (bufferChunkSize >= 0)\n                        break;\n                }\n            }\n            public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {\n                if (VERBOSE) {\n                    Log.d(TAG, \"audio decoder: returned output buffer: \" + index);\n                }\n                if (VERBOSE) {\n                    Log.d(TAG, \"audio decoder: returned buffer of size \" + info.size);\n                }\n                if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {\n                    if (VERBOSE) {\n                        Log.d(TAG, \"audio decoder: codec config buffer\");\n                    }\n\n                    codec.releaseOutputBuffer(index, false);\n                    return;\n                }\n                if (VERBOSE) {\n                    Log.d(TAG, \"audio decoder: returned buffer for time \"\n                            + info.presentationTimeUs);\n                }\n                mPendingAudioDecoderOutputBufferIndices.add(index);\n                mPendingAudioDecoderOutputBufferInfos.add(info);\n                mAudioDecodedFrameCount++;\n                logState();\n                decodeAudio();\n            }\n        });\n        decoder.configure(inputFormat, null, null, 0);\n        decoder.start();\n\n        int duration = (int)Math.round(getDuration() / 1000000.0);\n        sampleStep = Math.max(duration / 10, 1);\n\n        return decoder;\n    }\n\n    private void ReadFile(String inputFile, Context context)\n            throws FileNotFoundException,\n            java.io.IOException, InvalidInputException {\n        mAudioExtractor = new MediaExtractor();\n        MediaFormat format = null;\n        int i;\n\n        Uri uri = Uri.parse(inputFile);\n\n       //AssetFileDescriptor fileDescriptor = context.getContentResolver().openAssetFileDescriptor(uri , \"r\");\n        mFileSize = 4000000;//(int)fileDescriptor.getLength();\n\n        mAudioExtractor.setDataSource(context, uri, null);\n        int numTracks = mAudioExtractor.getTrackCount();\n        // find and select the first audio track present in the file.\n        for (i = 0; i < numTracks; i++) {\n            format = mAudioExtractor.getTrackFormat(i);\n            if (format.getString(MediaFormat.KEY_MIME).startsWith(\"audio/\")) {\n                mAudioExtractor.selectTrack(i);\n                break;\n            }\n        }\n        if (i == numTracks) {\n            throw new InvalidInputException(\"No audio track found in \" + inputFile);\n        }\n        mChannels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);\n        mSampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);\n        mDuration = format.getLong(MediaFormat.KEY_DURATION);\n\n        // Set the size of the decoded samples buffer to 1MB (~6sec of a stereo stream at 44.1kHz).\n        // For longer streams, the buffer size will be increased later on, calculating a rough\n        // estimate of the total size needed to store all the samples in order to resize the buffer\n        // only once.\n        mDecodedBytes = ByteBuffer.allocate(1 << 20);\n        Log.i(TAG, \"start decoding\");\n\n        mPendingAudioDecoderOutputBufferIndices = new LinkedList<Integer>();\n        mPendingAudioDecoderOutputBufferInfos = new LinkedList<MediaCodec.BufferInfo>();\n        mAudioDecoder = createAudioDecoder(format);\n        synchronized (this) {\n            while (!mAudioDecoderDone) {\n                try {\n                    wait();\n                } catch (InterruptedException ie) {\n                }\n            }\n        }\n\n        Log.i(TAG, \"all set\");\n        mNumSamples = mDecodedBytes.position() / (mChannels * 2);  // One sample = 2 bytes.\n        mDecodedBytes.rewind();\n        mDecodedBytes.order(ByteOrder.LITTLE_ENDIAN);\n        mDecodedData = simplifyData(mDecodedBytes, mDecodedBytes.remaining());\n\n        mAudioExtractor.release();\n        mAudioExtractor = null;\n        mAudioDecoder.stop();\n        mAudioDecoder.release();\n        mAudioDecoder = null;\n\n        Log.i(TAG, \"all done\");\n    }\n\n    public byte[] simplifyData(ByteBuffer buffer, int size) {\n        int cursor = 0;\n        byte[] samples = new byte[size / (4 * sampleStep)];\n        int pos = 0;\n\n        for (int i = 0; i < size; i++) {\n            if (cursor % (sampleStep * 4) == 1) {\n                byte val = (byte) Math.abs(buffer.get(i));\n\n                // do a rudimentary dynamic range expansion\n                if (val < 30) {\n                    val = (byte) Math.round(val * 0.2);\n                }\n                if (val > 40) {\n                    val = (byte) Math.round(val * 1.5);\n                }\n\n                if (pos < samples.length) {\n                    samples[pos++] = val;\n                }\n            }\n            cursor++;\n        }\n\n        return samples;\n    }\n}"
  },
  {
    "path": "plugins/audio_waveform/android/src/main/java/com/tuntori/audio_waveform/WaveformExtractor.java",
    "content": "/* WaveformExtractor\n \n   Author: Andrew Stubbs (based on some examples from the docs)\n \n   This class opens a file, reads the first audio channel it finds, and returns raw audio data.\n   \n   Usage:\n      WaveformExtractor decoder = new WaveformExtractor(\"myfile.m4a\");\n      short[] data;\n      while ((data = decoder.readShortData()) != null) {\n         // process data here\n      }\n  */\n\n//here is a promised faster decoding\n//https://imnotyourson.com/enhance-poor-performance-of-decoding-audio-with-mediaextractor-and-mediacodec-to-pcm/\n\n\npackage com.tuntori.audio_waveform;\n\nimport java.io.Console;\n\nimport java.nio.ByteBuffer;\nimport java.nio.*;\n\nimport android.media.MediaCodec;\nimport android.media.MediaCodec.BufferInfo;\nimport android.media.MediaExtractor;\nimport android.media.MediaFormat;\nimport android.media.AudioFormat;\nimport android.net.Uri;\nimport android.util.Log;\n\nimport android.content.Context;\n\npublic class WaveformExtractor {\n\n    private static final String TAG = \"WaveformExtractor\";\n    private final boolean DEBUG = false;\n    private int DECODE_INPUT_SIZE = 524288; // 524288 Bytes = 0.5 MB\n\n    private MediaExtractor extractor;\n    private MediaCodec decoder;\n\n    private MediaFormat inputFormat;\n    \n    private ByteBuffer[] inputBuffers;\n    private boolean end_of_input_file;\n\n    private ByteBuffer[] outputBuffers;\n    private int outputBufferIndex = -1;\n\n    private int sampleStep = 1;\n    private boolean isMPEG = false;\n    private boolean useLegacy = false;\n\n    public WaveformExtractor(){}\n\n    public void open(String inputFilename, Context context, boolean legacyMode) {\n        \n        useLegacy = legacyMode;\n        extractor = new MediaExtractor();\n\n        try {\n            extractor.setDataSource(context, Uri.parse(inputFilename), null);\n        }\n        catch(Exception e)\n        {\n            System.out.println(\"Extractor.sedDataSource exception\");\n            System.out.println(e); \n            return;\n        }\n        \n        if (DEBUG)\n            System.out.println(\"Decoding track\"); \n        // Select the first audio track we find.\n        int numTracks = extractor.getTrackCount();\n\n        System.out.println(\"tracks \" + numTracks); \n        for (int i = 0; i < numTracks; ++i) {\n            MediaFormat format = extractor.getTrackFormat(i);\n            String mime = format.getString(MediaFormat.KEY_MIME);\n\n            System.out.println(\"mime \" + mime); \n            if (mime.startsWith(\"audio/\")) {\n                isMPEG = mime.endsWith(\"mpeg\");\n\n                extractor.selectTrack(i);\n                try {\n                    decoder = MediaCodec.createDecoderByType(mime);\n                }\n                catch(Exception e)\n                {\n                    System.out.println(\"Extractor.selectTrack exception\");\n                    System.out.println(e); \n                    return;\n                }\n                \n                decoder.configure(format, null, null, 0);\n\n                /* when adding encoder, use these settings\n                format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);\n                format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 8000);\n                format.setInteger(MediaFormat.KEY_PCM_ENCODING, AudioFormat.ENCODING_PCM_8BIT);\n\n                decoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);*/\n                format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, DECODE_INPUT_SIZE); // huge throughput\n                inputFormat = format;\n                break;\n            }\n        }\n        \n        if (decoder == null) {\n            throw new IllegalArgumentException(\"No decoder for file format\");\n        }\n        \n        decoder.start();\n        inputBuffers = decoder.getInputBuffers();\n        outputBuffers = decoder.getOutputBuffers();\n        end_of_input_file = false;\n\n        int duration = (int)Math.round(getDuration() / 1000000.0);\n        sampleStep = Math.max(duration / 10, 1);\n    }\n    \n\n    public void release()\n    {\n        if (decoder!=null) {\n            decoder.stop();\n            decoder.release();\n        }\n        extractor.release();\n    }\n\n    // Read the raw data from MediaCodec.\n    // The caller should copy the data out of the ByteBuffer before calling this again\n    // or else it may get overwritten.\n    private BufferInfo readData() {\n        if (decoder == null)\n            return null;\n\n        BufferInfo info = new BufferInfo();\n\n        while (true) {\n            // Read data from the file into the codec.\n            if (!end_of_input_file) {\n                int inputBufferIndex = decoder.dequeueInputBuffer(10000);\n                if (inputBufferIndex >= 0) {\n                    int bufferChunkSize = 0;\n                    long presentationTime = 0;\n                    for(int b=0;b<50;b++) {\n                        long sSize = extractor.getSampleSize();\n                        if (sSize<0 || inputBuffers[inputBufferIndex].remaining() < sSize)\n                            break;\n                        ByteBuffer tempBuffer = ByteBuffer.allocate((int)sSize);\n                        int size = extractor.readSampleData(tempBuffer, 0);\n\n                        if (size > 0) {\n                            bufferChunkSize += size;\n                            inputBuffers[inputBufferIndex].put(tempBuffer);\n\n                            presentationTime += extractor.getSampleTime();\n                        }\n                        else\n                            break;\n                        extractor.advance();\n                    }\n                    if (bufferChunkSize == 0) {\n                        \n                        // End Of File\n                        decoder.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);\n                        end_of_input_file = true;\n                        if (DEBUG)\n                            System.out.println(\"EndOfFile\");\n                    } else {\n                        decoder.queueInputBuffer(inputBufferIndex, 0, bufferChunkSize, presentationTime, 0);\n                    }\n                }\n            }\n\n            // Read the output from the codec.\n            if (outputBufferIndex >= 0)\n                // Ensure that the data is placed at the start of the buffer\n                outputBuffers[outputBufferIndex].position(0);\n                \n            outputBufferIndex = decoder.dequeueOutputBuffer(info, 10000);\n            if (outputBufferIndex >= 0) {\n                // Handle EOF\n                if (info.flags != 0) {\n                    if (DEBUG)\n                        System.out.println(\"EndOfFile Output\");\n                    decoder.stop();\n                    decoder.release();\n                    decoder = null;\n                    return null;\n                }\n                \n                //release output buffer removed from here!\n                \n                return info;\n                \n            } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {\n                // This usually happens once at the start of the file.\n                if (DEBUG)\n                    System.out.println(\"BuffersChanged\");\n                outputBuffers = decoder.getOutputBuffers();\n            }\n        }\n    }\n\n    // Read the raw data from MediaCodec.\n    // The caller should copy the data out of the ByteBuffer before calling this again\n    // or else it may get overwritten.\n    private BufferInfo readDataLegacy() {\n        if (decoder == null)\n            return null;\n\n        BufferInfo info = new BufferInfo();\n        \n        for (;;) {\n            // Read data from the file into the codec.\n            if (!end_of_input_file) {\n                int inputBufferIndex = decoder.dequeueInputBuffer(10000);\n                //System.out.println(\"DequeueInputBuffer\");\n                if (inputBufferIndex >= 0) {\n                    int size = extractor.readSampleData(inputBuffers[inputBufferIndex], 0);\n                    //System.out.println(\"readSampleData\");\n                    if (size < 0) {\n                        // End Of File\n                        decoder.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);\n                        end_of_input_file = true;\n                        if (DEBUG)\n                            System.out.println(\"EndOfFile\");\n                    } else {\n                        decoder.queueInputBuffer(inputBufferIndex, 0, size, extractor.getSampleTime(), 0);\n                        extractor.advance();\n                        //System.out.println(\"advance\");\n                    }\n                }\n            }\n\n            // Read the output from the codec.\n            if (outputBufferIndex >= 0)\n                // Ensure that the data is placed at the start of the buffer\n                outputBuffers[outputBufferIndex].position(0);\n                \n            outputBufferIndex = decoder.dequeueOutputBuffer(info, 10000);\n            //System.out.println(\"dequeueOutputBuffer\");\n            if (outputBufferIndex >= 0) {\n                // Handle EOF\n                if (info.flags != 0) {\n                    if (DEBUG)\n                        System.out.println(\"EndOfFile Output\");\n                    decoder.stop();\n                    decoder.release();\n                    decoder = null;\n                    return null;\n                }\n                \n                //release output buffer removed from here!\n                \n                return info;\n                \n            } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {\n                // This usually happens once at the start of the file.\n                if (DEBUG)\n                    System.out.println(\"BuffersChanged\");\n                outputBuffers = decoder.getOutputBuffers();\n            }\n        }\n    }\n\n    private ByteBuffer currentBuffer()\n    {\n        return outputBuffers[outputBufferIndex];\n    }\n\n    private void releaseBuffer()\n    {\n        // Release the buffer so MediaCodec can use it again.\n        // The data should stay there until the next time we are called.\n        decoder.releaseOutputBuffer(outputBufferIndex, false);\n    }\n    \n    // Return the Audio sample rate, in samples/sec.\n    public int getSampleRate() {\n        return inputFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);\n    }\n\n    public long getDuration() {\n        return inputFormat.getLong(MediaFormat.KEY_DURATION);\n    }\n    \n    // Read the raw audio data in 16-bit format\n    // Returns null on EOF\n    public byte[] readShortData() {\n        BufferInfo info;\n        \n        if (isMPEG && !useLegacy)\n            info = readData();\n        else\n            info = readDataLegacy();\n            \n        if (info==null)\n            return null;\n\n        ByteBuffer data = currentBuffer();\n        \n        if (data == null)\n            return null;\n        \n        byte[] returnData = null;\n         \n        if (DEBUG) {\n            System.out.println(\"buffer info \" + info.size);\n            System.out.println(\"buffer stuff \" + data.position() + \" \" + data.capacity());\n        }\n\n        if (info.size>0)\n            returnData = simplifyData(data, info.size);\n        else\n            returnData = new byte[0];\n\n        releaseBuffer();\n        return returnData;\n    }\n\n    public byte[] simplifyData(ByteBuffer buffer, int size) {\n        int cursor = 0;\n        byte[] samples = new byte[size / (4 * sampleStep)];\n        int pos = 0;\n\n        for (int i = 0; i < size; i++) {\n            if (cursor % (sampleStep * 4) == 1) {\n                byte val = (byte) Math.abs(buffer.get(i));\n\n                // do a rudimentary dynamic range expansion\n                if (val < 30) {\n                    val = (byte) Math.round(val * 0.2);\n                }\n                if (val > 40) {\n                    val = (byte) Math.round(val * 1.5);\n                }\n\n                if (pos < samples.length) {\n                    samples[pos++] = val;\n                }\n            }\n            cursor++;\n        }\n\n        return samples;\n    }\n}"
  },
  {
    "path": "plugins/audio_waveform/darwin/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/ephemeral/\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "plugins/audio_waveform/darwin/Classes/AudioWaveformPlugin.m",
    "content": "#if 0\n#import \"AudioWaveformPlugin.h\"\n\n@implementation AudioWaveformPlugin {\n    AudioStreamBasicDescription fileFormat;\n    FlutterMethodChannel *_channel;\n    ExtAudioFileRef audioFileRef;\n    SInt64 expectedSampleCount;\n    OSStatus status;\n    int mSampleRate;\n    int mDuration;\n}\n\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n    [[AudioWaveformPlugin alloc] initWithRegistrar:registrar];\n}\n\n- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {\n    self = [super init];\n    NSAssert(self, @\"super init cannot be nil\");\n    _channel = [FlutterMethodChannel\n        methodChannelWithName:@\"com.tuntori.audio_waveform\"\n              binaryMessenger:[registrar messenger]];\n    [registrar addMethodCallDelegate:self channel:_channel];\n    return self;\n}\n\n- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {\n    \n    NSDictionary *request = (NSDictionary *)call.arguments;\n\n    if ([@\"open\" isEqualToString:call.method]) {\n        NSString *audioInPath = (NSString *)request[@\"path\"];\n        //open and prepare the audio here\n        //store duration and sample rate\n        \n        UInt32 size;\n        CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)audioInPath, kCFURLPOSIXPathStyle, false);\n        status = ExtAudioFileOpenURL(url, &audioFileRef);\n        if (status != noErr) {\n            NSLog(@\"ExtAudioOpenURL error: %i\", status);\n            dispatch_async(dispatch_get_main_queue(), ^{\n                result([FlutterError errorWithCode:@\"ExtAudioOpenURL error\" message:@\"ExtAudioOpenURL error\" details:nil]);\n            });\n            return;\n        }\n\n        size = sizeof(fileFormat);\n        status = ExtAudioFileGetProperty(audioFileRef, kExtAudioFileProperty_FileDataFormat, &size, &fileFormat);\n        if (status != noErr) {\n            NSLog(@\"ExtAudioFileGetProperty error: %i\", status);\n            dispatch_async(dispatch_get_main_queue(), ^{\n                result([FlutterError errorWithCode:@\"Error reading file format\" message:@\"Error reading file format\" details:nil]);\n            });\n            return;\n        }\n\n        expectedSampleCount = 0;\n        size = sizeof(expectedSampleCount);\n        status = ExtAudioFileGetProperty(audioFileRef, kExtAudioFileProperty_FileLengthFrames, &size, &expectedSampleCount);\n        if (status != noErr) {\n            NSLog(@\"ExtAudioFileGetProperty error: %i\", status);\n            dispatch_async(dispatch_get_main_queue(), ^{\n                result([FlutterError errorWithCode:@\"Error reading sample count\" message:@\"Error reading sample count\" details:nil]);\n            });\n            return;\n        }\n\n        mSampleRate = (int)fileFormat.mSampleRate;\n        mDuration = (int)(expectedSampleCount / fileFormat.mSampleRate);\n\n    }\n    else if ([@\"next\" isEqualToString:call.method]) {\n        //just get the next buffer here\n\n    }\n    else if ([@\"close\" isEqualToString:call.method]) {\n        \n    }\n    else if ([@\"duration\" isEqualToString:call.method]) {\n        result([NSNumber numberWithInteger:mDuration]);\n    }\n    else if ([@\"sampleRate\" isEqualToString:call.method]) {\n        result([NSNumber numberWithInteger:mSampleRate]);\n    }\n\n    if ([@\"extract\" isEqualToString:call.method]) {\n        NSString *audioInPath = (NSString *)request[@\"audioInPath\"];\n        NSString *waveOutPath = (NSString *)request[@\"waveOutPath\"];\n        NSNumber *samplesPerPixelArg = (NSNumber *)request[@\"samplesPerPixel\"];\n        NSNumber *pixelsPerSecondArg = (NSNumber *)request[@\"pixelsPerSecond\"];\n\n        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n            /*\n            OSStatus status;\n            UInt32 size;\n            CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)audioInPath, kCFURLPOSIXPathStyle, false);\n            status = ExtAudioFileOpenURL(url, &audioFileRef);\n            if (status != noErr) {\n                NSLog(@\"ExtAudioOpenURL error: %i\", status);\n                dispatch_async(dispatch_get_main_queue(), ^{\n                    result([FlutterError errorWithCode:@\"ExtAudioOpenURL error\" message:@\"ExtAudioOpenURL error\" details:nil]);\n                });\n                return;\n            }\n            AudioStreamBasicDescription fileFormat;\n            size = sizeof(fileFormat);\n            status = ExtAudioFileGetProperty(audioFileRef, kExtAudioFileProperty_FileDataFormat, &size, &fileFormat);\n            if (status != noErr) {\n                NSLog(@\"ExtAudioFileGetProperty error: %i\", status);\n                dispatch_async(dispatch_get_main_queue(), ^{\n                    result([FlutterError errorWithCode:@\"Error reading file format\" message:@\"Error reading file format\" details:nil]);\n                });\n                return;\n            }\n\n            \n            SInt64 expectedSampleCount = 0;\n            size = sizeof(expectedSampleCount);\n            status = ExtAudioFileGetProperty(audioFileRef, kExtAudioFileProperty_FileLengthFrames, &size, &expectedSampleCount);\n            if (status != noErr) {\n                NSLog(@\"ExtAudioFileGetProperty error: %i\", status);\n                dispatch_async(dispatch_get_main_queue(), ^{\n                    result([FlutterError errorWithCode:@\"Error reading sample count\" message:@\"Error reading sample count\" details:nil]);\n                });\n                return;\n            }\n            */\n            //NSLog(@\"channel count = %d\", fileFormat.mChannelsPerFrame);\n            //NSLog(@\"Sample rate = %f\", fileFormat.mSampleRate);\n            //NSLog(@\"expected sample count = %d\", expectedSampleCount);\n\n            //NSLog(@\"frames per packet: %d\", fileFormat.mFramesPerPacket);\n\n            int samplesPerPixel;\n            if (samplesPerPixelArg != (id)[NSNull null]) {\n                samplesPerPixel = [samplesPerPixelArg intValue];\n            } else {\n                samplesPerPixel = (int)(fileFormat.mSampleRate / [pixelsPerSecondArg intValue]);\n            }\n\n            // Multiply by 2 since 2 bytes are needed for each short, and multiply by 2 again because for each sample we store a pair of (min,max)\n            UInt32 scaledByteSamplesLength = 2*2*(UInt32)(expectedSampleCount / samplesPerPixel);\n            UInt32 waveLength = (UInt32)(scaledByteSamplesLength / 2); // better name: numPixels?\n            //NSLog(@\"wave length = %d\", waveLength);\n\n            int bytesPerChannel = 2;\n            AudioStreamBasicDescription clientFormat;\n            clientFormat.mSampleRate = fileFormat.mSampleRate;\n            clientFormat.mFormatID = kAudioFormatLinearPCM;\n            clientFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;\n            clientFormat.mBitsPerChannel = bytesPerChannel * 8;\n            clientFormat.mChannelsPerFrame = fileFormat.mChannelsPerFrame;\n            clientFormat.mBytesPerFrame = clientFormat.mChannelsPerFrame * bytesPerChannel;\n            clientFormat.mFramesPerPacket = 1;\n            clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;\n\n            status = ExtAudioFileSetProperty(self->audioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &clientFormat);\n            if (status != noErr) {\n                NSLog(@\"ExtAudioFileSetProperty error: %i\", status);\n                dispatch_async(dispatch_get_main_queue(), ^{\n                    result([FlutterError errorWithCode:@\"Error setting client format\" message:@\"Error setting client format\" details:nil]);\n                });\n                return;\n            }\n\n            UInt32 packetsPerBuffer = 4096; // samples/frames per buffer\n            UInt32 outputBufferSize = packetsPerBuffer * clientFormat.mBytesPerPacket;\n\n            AudioBufferList convertedData;\n            convertedData.mNumberBuffers = 1;\n            convertedData.mBuffers[0].mNumberChannels = clientFormat.mChannelsPerFrame;\n            convertedData.mBuffers[0].mDataByteSize = outputBufferSize;\n            // XXX: Do we need to free this on iOS?\n            convertedData.mBuffers[0].mData = (UInt8 *)malloc(sizeof(UInt8 *) * outputBufferSize);\n\n            UInt32 frameCount = packetsPerBuffer;\n            UInt32 sampleIdx = 0;\n            short minSample = 32767;\n            short maxSample = -32768;\n            int waveHeaderLength = 20;\n            UInt32 waveFileContentLength = waveHeaderLength + sizeof(short *) * waveLength;\n            UInt8 *waveFileContent = (UInt8 *)malloc(waveFileContentLength);\n            UInt32 *waveHeader = (UInt32 *)waveFileContent;\n            short *wave = (short *)(waveFileContent + waveHeaderLength);\n            UInt32 scaledSampleIdx = 0;\n            int progress = 0;\n\n            while (frameCount > 0) {\n                status = ExtAudioFileRead(self->audioFileRef, &frameCount, &convertedData);\n                if (status != noErr) {\n                    NSLog(@\"ExtAudioFileRead error: %i\", status);\n                    dispatch_async(dispatch_get_main_queue(), ^{\n                        result([FlutterError errorWithCode:@\"ExtAudioFileRead error\" message:@\"ExtAudioFileRead error\" details:nil]);\n                    });\n                    break;\n                }\n                if (frameCount > 0) {\n                    AudioBuffer audioBuffer = convertedData.mBuffers[0];\n                    short *samples = (short *)audioBuffer.mData;\n\n                    // Each frame may have two channels making 2*frameCount individual L/R samples.\n                    int sampleCount = clientFormat.mChannelsPerFrame * frameCount;\n                    for (int i = 0; i < sampleCount; i += clientFormat.mChannelsPerFrame) {\n                        long sample = 0;\n                        for (int j = 0; j < clientFormat.mChannelsPerFrame; j++) {\n                            sample += samples[i+j];\n                        }\n                        sample /= clientFormat.mChannelsPerFrame;\n                        if (sample < -32768) sample = -32768;\n                        if (sample > 32767) sample = 32767;\n                        if (sample < minSample) minSample = (short)sample;\n                        if (sample > maxSample) maxSample = (short)sample;\n                        sampleIdx++;\n                        if (sampleIdx % samplesPerPixel == 0) {\n                            if (scaledSampleIdx + 1 < waveLength) {\n                                wave[scaledSampleIdx++] = minSample;\n                                wave[scaledSampleIdx++] = maxSample;\n                                int newProgress = (int)(100 * scaledSampleIdx / waveLength);\n                                if (newProgress != progress && newProgress <= 100) {\n                                    progress = newProgress;\n\n                                    //TODO: send buffer data here, but it looks like it's not a buffer at all, but\n                                    //each single value separately\n                                    //NSLog(@\"Progress: %d percent\", progress);\n                                    dispatch_async(dispatch_get_main_queue(), ^{\n                                        [self->_channel invokeMethod:@\"onProgress\" arguments:@(progress)];\n                                    });\n                                }\n                                //NSLog(@\"pixel[%d] %d: %d\\t%d\", scaledSampleIdx - 2, sampleIdx, minSample, maxSample);\n                                minSample = 32767;\n                                maxSample = -32768;\n                            }\n                        }\n                    }\n                }\n            }\n\n            // Set header, compatible with audiowaveform format.\n            waveHeader[0] = 1; // version\n            waveHeader[1] = 0; // flags - 16 bit\n            waveHeader[2] = (UInt32)fileFormat.mSampleRate;\n            waveHeader[3] = samplesPerPixel;\n            waveHeader[4] = (UInt32)(scaledSampleIdx / 2);\n            //for (int i = 0; i < 5; i++) {\n            //    NSLog(@\"waveHeader[%d] = %d\", i, waveHeader[i]);\n            //}\n            NSData *waveData = [NSData dataWithBytesNoCopy:(void *)waveFileContent length:(waveHeaderLength + 2*scaledSampleIdx)];\n            [waveData writeToFile:waveOutPath atomically:NO];\n            //NSLog(@\"Total scaled samples: %d\", scaledSampleIdx);\n\n            status = ExtAudioFileDispose(self->audioFileRef);\n\n            dispatch_async(dispatch_get_main_queue(), ^{\n                result(nil);\n            });\n        });\n    } else {\n        result(FlutterMethodNotImplemented);\n    }\n}\n\n@end\n#endif"
  },
  {
    "path": "plugins/audio_waveform/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/audio_waveform/ios/Classes/AudioWaveformPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n#import <AudioToolbox/AudioServices.h>\n#import <AudioToolbox/ExtendedAudioFile.h>\n\n@interface AudioWaveformPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/audio_waveform/ios/Classes/AudioWaveformPlugin.m",
    "content": "#import \"AudioWaveformPlugin.h\"\n#if __has_include(<audio_waveform/audio_waveform-Swift.h>)\n#import <audio_waveform/audio_waveform-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"audio_waveform-Swift.h\"\n#endif\n\n@implementation AudioWaveformPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftAudioWaveformPlugin registerWithRegistrar:registrar];\n}\n@end\n "
  },
  {
    "path": "plugins/audio_waveform/ios/Classes/SwiftWaveformPlugin.swift",
    "content": "import Flutter\nimport AVFoundation\n\npublic class SwiftAudioWaveformPlugin: NSObject, FlutterPlugin {\n  private var channel: FlutterMethodChannel?\n  private var waveformExtractor: WaveformExtractor?\n  \n  public static func register(with registrar: FlutterPluginRegistrar) {\n    let channel = FlutterMethodChannel(name: \"com.tuntori.audio_waveform\", binaryMessenger: registrar.messenger())\n    let instance = SwiftAudioWaveformPlugin()\n    instance.channel = channel\n    registrar.addMethodCallDelegate(instance, channel: channel)\n  }\n  \n  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n    switch call.method {\n    case \"open\":\t \n\n\t  guard let args = call.arguments as? Dictionary<String, Any>,\n\t\t\t  let path = args[\"path\"] as? String else {\n\t\t  result(FlutterError(code: \"invalid_arguments\", message: \"Invalid arguments for method 'open'\", details: nil))\n\t\t  return\n\t\t}\n\t  \n    waveformExtractor = WaveformExtractor()\n\n    if let waveformExtractor = waveformExtractor {\n        do {\n            try waveformExtractor.open(inputFilename: path)\n        } catch let error as NSError {\n          let errorMessage = error.localizedDescription\n            result(FlutterError(code: \"decoder_unavailable\", message: \"waveformExtractor open failed\", details: errorMessage))\n            return\n        }\n    } else {\n        result(FlutterError(code: \"decoder_unavailable\", message: \"Error: waveformExtractor is nil.\", details: nil))\n    }\n\n\t  result(nil)\n    case \"next\":\n\t\tguard let args = call.arguments as? Dictionary<String, Any>,\n\t\t\t  let frameCount = args[\"frameCount\"] as? UInt32 else {\n\t\t  result(FlutterError(code: \"invalid_arguments\", message: \"Invalid arguments for method 'next'\", details: nil))\n\t\t  return\n\t\t}\n\t\tguard let waveformExtractor = waveformExtractor else {\n\t\t\tresult(FlutterError(code: \"decoder_unavailable\", message: \"You must open a file first\", details: nil))\n\t\t\treturn\n\t\t}\n      \n\t\tif waveformExtractor != nil {\n\t\t  let buffer = waveformExtractor.readShortData(chunkSize: AVAudioFrameCount(frameCount))\n\t\t  result(buffer)\n\t\t} else {\n\t\t  result(FlutterError(code: \"decoder_unavailable\", message: \"You must open a file first\", details: nil))\n\t\t}\n    case \"close\":\n      waveformExtractor?.release()\n      waveformExtractor = nil\n      result(nil)\n    case \"duration\":\n      guard let waveformExtractor = waveformExtractor else {\n        result(FlutterError(code: \"decoder_unavailable\", message: \"You must open a file first\", details: nil))\n        return\n      }\n      \n      let duration = waveformExtractor.getDuration()\n      result(duration)\n    case \"sampleRate\":\n      guard let waveformExtractor = waveformExtractor else {\n        result(FlutterError(code: \"decoder_unavailable\", message: \"You must open a file first\", details: nil))\n        return\n      }\n      \n      let sampleRate = waveformExtractor.getSampleRate()\n      result(sampleRate)\n    default:\n      result(FlutterMethodNotImplemented)\n    }\n  }\n}"
  },
  {
    "path": "plugins/audio_waveform/ios/Classes/WaveformExtractor.swift",
    "content": "import AVFoundation\nimport MediaPlayer\n\nclass WaveformExtractor {\n    \n    private var audioFile: AVAudioFile?\n    private var audioFileLengthInFrames: AVAudioFramePosition = 0\n    private var audioFileSampleRate: Int = 0\n    private var sampleStep: Int = 0\n    \n    func getFileURL(from mediaLibraryItemID: String) -> URL? {\n        let query = MPMediaQuery.songs()\n        let predicate = MPMediaPropertyPredicate(value: mediaLibraryItemID, forProperty: MPMediaItemPropertyPersistentID)\n        query.addFilterPredicate(predicate)\n        guard let mediaItem = query.items?.first else {\n            return URL(string: mediaLibraryItemID)\n        }\n        return mediaItem.assetURL\n    }\n\n    func open(inputFilename: String) throws {\n        if let url = getFileURL(from: inputFilename) {\n            print(url.description)\n            audioFile = try AVAudioFile(forReading: url)\n            audioFileLengthInFrames = audioFile!.length\n            audioFileSampleRate = Int(audioFile!.processingFormat.sampleRate)\n\n            let duration = Int(round(Double(getDuration()) / 1000000.0))\n            sampleStep = max(duration / 10, 1)\n        } else {\n            print(\"Error: could not create URL from inputFilename\")\n            return\n        }\n    }\n    \n    func release() {\n        audioFile = nil\n        audioFileLengthInFrames = 0\n        audioFileSampleRate = 0\n    }\n    \n    // Read the raw audio data in 16-bit format\n    // This function should return a small chunk of the entire data\n    // and called repeatedly until EOF\n    // Returns nil on EOF\n    func readShortData(chunkSize: AVAudioFrameCount) -> [UInt8]? {\n        guard let audioFile = audioFile else {\n            return nil\n        }\n\n        guard let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFile.processingFormat, frameCapacity: chunkSize) else {\n            return nil\n        }\n        do {\n            try audioFile.read(into: audioFileBuffer)\n        } catch {\n            return nil\n        }\n        \n        guard let audioData = audioFileBuffer.floatChannelData?[0] else {\n            return nil\n        }\n        let audioDataCount = Int(audioFileBuffer.frameLength) * Int(audioFileBuffer.format.channelCount)\n        let audioDataBuffer = UnsafeBufferPointer(start: audioData, count: audioDataCount)\n        let samples = [Float](audioDataBuffer)\n\n        return simplifyData(samples: samples);\n    }\n\n    func simplifyData(samples: [Float]) -> [UInt8] {\n        let finalSize = samples.count / (2 * sampleStep) + 1\n        var simplifiedSamples = [UInt8](repeating: 0, count: finalSize)\n\n        for i in stride(from: 0, to: samples.count/2, by: sampleStep) {\n            var val = UInt16(abs(samples[i])*256)\n\n            // do a rudimentary dynamic range expansion\n           if val < 30 {\n               val = val / 5\n           }\n           else if val > 40 {\n               val = (val * 15) / 10\n               if val>255 {\n                   val=255\n               }\n           }\n\n            //if i / (sampleStep * 2) < simplifiedSamples.count {\n                simplifiedSamples[i / (sampleStep)] = UInt8(truncatingIfNeeded: val)\n            //}\n        }\n\n        return simplifiedSamples\n    }\n    \n    // Return the Audio sample rate, in samples/sec.\n    func getSampleRate() -> Int {\n        return audioFileSampleRate\n    }\n    \n    // Return the duration of the audio file in microseconds.\n    func getDuration() -> Int64 {\n        let duration = Double(audioFileLengthInFrames) / Double(audioFileSampleRate)\n        return Int64(duration * 1_000_000)\n    }\n}\n"
  },
  {
    "path": "plugins/audio_waveform/ios/audio_waveform.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint audio_waveform.podspec` to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'audio_waveform'\n  s.version          = '0.1.0'\n  s.summary          = 'A new flutter plugin project.'\n  s.description      = <<-DESC\nA new flutter plugin project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.public_header_files = 'Classes/**/*.h'\n  s.dependency 'Flutter'\n  s.platform = :ios, '8.0'\n\n  # Flutter.framework does not contain a i386 slice.\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }\nend\n"
  },
  {
    "path": "plugins/audio_waveform/lib/audio_waveform.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:flutter/services.dart';\n\nclass AudioWaveformDecoder {\n  static const platform = const MethodChannel(\"com.tuntori.audio_waveform\");\n  int size = 0;\n  double _durationms = 0;\n  List<int> _samples = <int>[];\n\n  List<int> get samples => _samples;\n  double get duration => _durationms;\n\n  Future<void> open(String path, bool legacy) async {\n    if (Platform.isIOS) {\n      if (path.contains(\"ipod-library://\")) {\n        String url = path;\n        Uri uri = Uri.parse(url);\n        path = uri.queryParameters[\"id\"] ?? path;\n      }\n    }\n    try {\n      print(\"opening $path\");\n      size = 0;\n      var sendMap = <String, dynamic>{\"path\": path, \"legacy\": legacy};\n\n      await platform.invokeMethod(\"open\", sendMap);\n      print(\"File opened\");\n    } catch (e) {\n      print(e);\n    }\n  }\n\n  Future<List<int>?> nextBuffer() async {\n    if (Platform.isIOS) {\n      var result = await platform.invokeMethod(\"next\", {\"frameCount\": 242144});\n      return result?.cast<int>() ?? null;\n    }\n    try {\n      return await platform.invokeMethod(\"next\");\n    } catch (e) {}\n    return null;\n  }\n\n  Future<int> _duration() async {\n    return await platform.invokeMethod(\"duration\");\n  }\n\n  Future<int> _sampleRate() async {\n    return await platform.invokeMethod(\"sampleRate\");\n  }\n\n  Future<void> release() async {\n    try {\n      await platform.invokeMethod(\"close\");\n    } catch (e) {\n      print(e);\n    }\n  }\n\n  void decode(void Function() onStart, bool Function() onProgress,\n      void Function() onFinish) async {\n    //get audio duration\n    _durationms = await _duration() / 1000000;\n    int sampleRate = await _sampleRate();\n    print(\"$_durationms seconds\");\n\n    //calc approx buffer size and create it\n    int bytes = ((_durationms) * sampleRate).ceil();\n    int bufferIndex = 0;\n    int sampleStep = max(_durationms.round() / 10, 1).floor();\n\n    print(\"sample step $sampleStep\");\n    int expectedSize = (bytes / sampleStep).ceil();\n    _samples = List<int>.filled(expectedSize, 0, growable: true);\n\n    int pos = 0;\n\n    onStart();\n    Stopwatch stopwatch = Stopwatch()..start();\n    do {\n      List<int>? list = await nextBuffer();\n      if (list == null) {\n        break;\n      }\n\n      int listEndIndex = pos + list.length;\n      if (listEndIndex > _samples.length) {\n        listEndIndex = _samples.length;\n      }\n\n      _samples.setRange(pos, listEndIndex, list);\n      pos += listEndIndex - pos;\n\n      bufferIndex++;\n\n      //update on every hundredth sample or so\n      var skip = Platform.isAndroid ? 200 : 2;\n      if (bufferIndex % skip == 0) {\n        // inform for progress and check whether to continue\n        if (!onProgress()) {\n          await release();\n          return;\n        }\n      }\n    } while (true);\n\n    print(\"Length: $pos\");\n    print(\n        \"expected length ${(bytes / sampleStep).ceil()}, final length ${_samples.length}\");\n    print('decode executed in ${stopwatch.elapsed}');\n\n    await release();\n    onFinish();\n  }\n}\n"
  },
  {
    "path": "plugins/audio_waveform/macos/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/audio_waveform/macos/Classes/AudioWaveformPlugin.h",
    "content": "#import <FlutterMacOS/FlutterMacOS.h>\n#import <AudioToolbox/AudioServices.h>\n#import <AudioToolbox/ExtendedAudioFile.h>\n\n@interface AudioWaveformPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/audio_waveform/macos/audio_waveform.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint just_waveform.podspec` to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'audio_waveform'\n  s.version          = '0.1.0'\n  s.summary          = 'A new flutter plugin project.'\n  s.description      = <<-DESC\nA new flutter plugin project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files     = 'Classes/**/*'\n  s.public_header_files = 'Classes/**/*.h'\n  s.dependency 'FlutterMacOS'\n\n  s.platform = :osx, '10.11'\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }\nend\n"
  },
  {
    "path": "plugins/audio_waveform/pubspec.yaml",
    "content": "name: audio_waveform\ndescription: Extracts waveform data from an audio file suitable for visually rendering the waveform.\nversion: 0.1.0\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n  flutter: \">=1.20.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n  plugin:\n    platforms:\n      android:\n        package: com.tuntori.audio_waveform\n        pluginClass: AudioWaveformPlugin\n      ios:\n        pluginClass: AudioWaveformPlugin\n      macos:\n        pluginClass: AudioWaveformPlugin\n"
  },
  {
    "path": "plugins/audio_waveform/test/audio_waveform_test.dart",
    "content": "//import 'package:flutter/services.dart';\n//import 'package:flutter_test/flutter_test.dart';\n//import 'package:audio_waveform/audio_waveform.dart';\n//\n//void main() {\n//  const MethodChannel channel = MethodChannel('audio_waveform');\n//\n//  TestWidgetsFlutterBinding.ensureInitialized();\n//\n//  setUp(() {\n//    channel.setMockMethodCallHandler((MethodCall methodCall) async {\n//      return '42';\n//    });\n//  });\n//\n//  tearDown(() {\n//    channel.setMockMethodCallHandler(null);\n//  });\n//\n//  test('getPlatformVersion', () async {\n//    expect(await AudioWaveform.platformVersion, '42');\n//  });\n//}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\npubspec.lock\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Flutter.podspec\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "plugins/drag_and_drop_list/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: f7a6a7906be96d2288f5d63a5a54c515a6e987fe\n  channel: stable\n\nproject_type: package\n"
  },
  {
    "path": "plugins/drag_and_drop_list/CHANGELOG.md",
    "content": "# Changelog\n\n[0.3.3] - 4 August 2022\n\n* Update to flutter 3 (thanks [@mauriceraguseinit](https://github.com/mauriceraguseinit))\n\n[0.3.2+2] - 21 October 2021\n\n* Replace flutter deprecated elements\n\n[0.3.2+1] - 21 October 2021\n\n* Fix last list target for horizontal lists (thanks [@nvloc120](https://github.com/nvloc120)).\n* Add ability to remove top padding when there is a widget before the DragAndDropLists (See [flutter/flutter#14842](https://github.com/flutter/flutter/issues/14842), thanks [@aliasgarlabs](https://github.com/aliasgarlabs))\n\n## [0.3.2] - 20 April 2021\n\n* Add optional feedback widget to items (thanks [@svoza10](https://github.com/svoza10)).\n\n## [0.3.1] - 15 April 2021\n\n* Fix scrolling in wrong direction when text direction is right-to-left.\n* Fix drag-and-drop feedback widget alignment when text direction is right-to-left.\n\n## [0.3.0+1] - 2 April 2021\n\n* Fix null crash and wrong drag handle used (thanks [@vbuberen](https://github.com/vbuberen)).\n\n## [0.3.0] - 30 March 2021\n\n* DragHandle moved to own widget. To create any drag handle, use the new properties `listDragHandle` and `itemDragHandle` in `DragAndDropLists`.\n* Support null safety, see [details on migration](https://dart.dev/null-safety/migration-guide).\n\n## [0.2.10] - 14 December 2020\n\n* Bug fix where `listDecorationWhileDragging` wasn't always being applied.\n* Allow DragAndDropLists to be contained in an external ListView when `disableScrolling` is set to `true`.\n\n## [0.2.9+2] - 17 November 2020\n\n* Prevent individual lists inside of a horizontal DragAndDropLists from scrolling when `disableScrolling` is set to true.\n\n## [0.2.9+1] - 13 November 2020\n\n* Bug fix to also not allow scrolling when `disableScrolling` is set to true when dragging and dropping items.\n\n## [0.2.9] - 9 November 2020\n\n* Added `disableScrolling` parameter to `DragAndDropLists`.\n\n## [0.2.8] - 6 November 2020\n\n* Added `listDividerOnLastChild` parameter to `DragAndDropLists`. This allows not showing a list divider after the last list (thanks [@Zexuz](https://github.com/Zexuz)).\n\n## [0.2.7] - 21 October 2020\n\n* Added `onItemDraggingChanged` and `onListDraggingChanged` parameters to `DragAndDropLists`. This allows certain use cases where it is useful to be notified when dragging starts and ends\n* Refactored `DragAndDropItemWrapper` to accept a `DragAndDropBuilderParameters` instead of all the other parameters independently to allow for simpler and more consistent changes\n\n## [0.2.6] - 20 October 2020\n\n* Always check mounted status when setting state\n\n## [0.2.5] - 15 October 2020\n\n* Added `constrainDraggingAxis` parameter in `DragAndDropLists`. This is useful when setting custom drag targets outside of the DragAndDropLists.\n\n## [0.2.4] - 15 October 2020\n\n* Added drag handle vertical alignment customization. See `listDragHandleVerticalAlignment` and `itemDragHandleVerticalAlignment` parameters in `DragAndDropLists`\n* Added mouse cursor change on web when hovering on drag handle\n* Fixed [itemDecorationWhileDragging only applied when dragHandle is provided?](https://github.com/philip-brink/DragAndDropLists/issues/11) (thanks [kjmj](https://github.com/kjmj))\n* Fixed bug where setState() was called after dispose when dragging items in a long list (See issue [Error in debug console when dragging item in long list](https://github.com/philip-brink/DragAndDropLists/issues/9), thanks [mivoligo](https://github.com/mivoligo))\n* Apply the itemDivider property to items in the DragAndDropListExpansion widget and use the lastItemTargetHeight instead of the constant value of 20 (thanks [kjmj](https://github.com/kjmj))\n\n## [0.2.3] - 8 October 2020\n\n* Added `disableTopAndBottomBorders` parameter to `DragAndDropListExpansion` and `ProgrammaticExpansionTile` to allow for more styling options.\n\n## [0.2.2] - 7 October 2020\n\n* Added function parameters for customizing the criteria for where an item or list can be dropped. See the parameters `listOnWillAccept`, `listTargetOnWillAccept`, `itemOnWillAccept` and `itemTargetOnWillAccept` in `DragAndDropLists`\n* Added function parameters for directly accessing items or lists that have been dropped. See the parameters `listOnAccept`, `listTargetOnAccept`, `itemOnAccept` and `itemTargetOnAccept` in `DragAndDropLists`\n\n## [0.2.1] - 6 October 2020\n\n* Fixed bug where auto scrolling could occur even when not dragging an item (thanks [@ElenaKova](https://github.com/ElenaKova))\n\n## [0.2.0] - 5 October 2020\n\n* Added option for drag handles. See `dragHandle` and `dragHandleOnLeft` parameters in `DragAndDropLists`\n* Added new example for drag handles\n* Added option for item dividers. See the `itemDivider` parameter in `DragAndDropLists`\n* Added option for inner list box decoration. See the `listInnerDecoration` parameter in `DragAndDropLists`\n* Added option for decoration while dragging lists and items. See the `itemDecorationWhileDragging` and `itemDecorationWhileDragging` parameters in `DragAndDropLists`\n* Removed unused `itemDecoration` parameter in `DragAndDropLists`\n* Fixed unused `itemDraggingWidth` parameter in `DragAndDropLists`\n* Configurable bottom padding for list and items. See the `lastItemTargetHeight`, `addLastItemTargetHeightToTop` and `lastListTargetSize` parameters in `DragAndDropLists`\n* Remove `pubspec.lock` (thanks [@freitzzz](https://github.com/freitzzz))\n\n## [0.1.0] - 21 September 2020\n\n* Added canDrag option for lists\n* **Interface Change:** Any classes implementing `DragAndDropListInterface` need to add `canDrag` \n\n## [0.0.6] - 24 July 2020\n\n* Fixed wrong parameter order for onItemAdd (thanks [@khauns](https://github.com/khauns))\n* ProgrammaticExpansionTile: include option for isThreeLine of ListTile\n* ProgrammaticExpansionTile: Remove required annotation for leading\n\n## [0.0.5] - 24 July 2020\n\n* ProgrammaticExpansionTile: ensure that parent widget will always know its expanded/collapsed state\n\n## [0.0.4] - 21 July 2020\n\n* Updated example project for web compatibility\n\n## [0.0.3] - 21 July 2020\n \n* Formatted all with dartfmt\n \n## [0.0.2] - 21 July 2020\n\n* Added API documentation\n\n## [0.0.1] - 21 July 2020\n\n* Initial release\n"
  },
  {
    "path": "plugins/drag_and_drop_list/LICENSE",
    "content": "Copyright 2020 Philip Brink.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "plugins/drag_and_drop_list/README.md",
    "content": "# drag\\_and\\_drop\\_lists\nTwo-level drag and drop reorderable lists.\n\n## Features\n- Reorder elements between multiple lists\n- Reorder lists\n- Drag and drop new elements from outside of the lists\n- Vertical or horizontal layout\n- Use with drag handles, long presses, or short presses\n- Expandable lists\n- Can be used in slivers\n- Prevent individual lists/elements from being able to be dragged\n- Easy to extend with custom layouts\n\n<p>\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/basic.gif\" width=\"180\" title=\"Basic\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/expansion_tiles.gif\" width=\"180\" title=\"Expansion Tiles\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/drag_handle.gif\" width=\"180\" title=\"Drag Handle\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/drag_into_list.gif\" width=\"180\" title=\"Drag Into Lists\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/horizontal.gif\" width=\"180\" title=\"Horizontal\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/list_tiles.gif\" width=\"180\" title=\"List Tiles\">\n<img src=\"https://raw.githubusercontent.com/philip-brink/DragAndDropLists/master/readme_images/slivers.gif\" width=\"180\" title=\"Slivers\">\n</p>\n\n## Known Issues\nThere is currently (as of flutter v. 1.24.0-1.0.pre) an issue only on web where dragging an item with some descendant that includes an InkWell widget with an onTap method will throw an exception. This includes having a ListTile with an onTap method defined.\n\nThis seems to be resolved by using a GestureDetector and its onTap method instead of the InkWell.\n\nSee the following issues:\n* [#14](https://github.com/philip-brink/DragAndDropLists/issues/14)\n* [Flutter #69774](https://github.com/flutter/flutter/issues/69774)\n* [Flutter #67044](https://github.com/flutter/flutter/issues/67044)\n* [Flutter #66887](https://github.com/flutter/flutter/issues/66887)\n\n## Usage\nTo use this plugin, add `drag_and_drop_lists` as a [dependency in your pubspec.yaml file.](https://flutter.dev/docs/development/packages-and-plugins/using-packages)\nFor example:\n\n```\ndependencies:\n  drag_and_drop_lists: ^0.2.1\n``` \n\nNow in your Dart code, you can use: `import 'package:drag_and_drop_lists/drag_and_drop_lists.dart';`\n\nTo add the lists, add a `DragAndDropLists` widget. Set its children to a list of `DragAndDropList`. Likewise, set the children of `DragAndDropList` to a list of `DragAndDropItem`.\nFor example:\n\n```\n  // Outer list\n  List<DragAndDropList> _contents;\n\n  @override\n  void initState() {\n    super.initState();\n\n    // Generate a list\n    _contents = List.generate(10, (index) {\n      return DragAndDropList(\n        header: Text('Header $index'),\n        children: <DragAndDropItem>[\n          DragAndDropItem(\n            child: Text('$index.1'),\n          ),\n          DragAndDropItem(\n            child: Text('$index.2'),\n          ),\n          DragAndDropItem(\n            child: Text('$index.3'),\n          ),\n        ],\n      );\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // Add a DragAndDropLists. The only required parameters are children,\n    // onItemReorder, and onListReorder. All other parameters are used for\n    // styling the lists and changing its behaviour. See the samples in the\n    // example app for many more ways to configure this.\n    return DragAndDropLists(\n      children: _contents,\n      onItemReorder: _onItemReorder,\n      onListReorder: _onListReorder,\n    );\n  }\n\n  _onItemReorder(int oldItemIndex, int oldListIndex, int newItemIndex, int newListIndex) {\n    setState(() {\n      var movedItem = _contents[oldListIndex].children.removeAt(oldItemIndex);\n      _contents[newListIndex].children.insert(newItemIndex, movedItem);\n    });\n  }\n\n  _onListReorder(int oldListIndex, int newListIndex) {\n    setState(() {\n      var movedList = _contents.removeAt(oldListIndex);\n      _contents.insert(newListIndex, movedList);\n    });\n  }\n\n```\n\nFor further examples, see the example app or [view the example code](https://github.com/philip-brink/DragAndDropLists/tree/master/example/lib) directly.\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_builder_parameters.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_lists.dart';\nimport 'package:flutter/widgets.dart';\n\ntypedef OnPointerMove = void Function(PointerMoveEvent event);\ntypedef OnPointerUp = void Function(PointerUpEvent event);\ntypedef OnPointerDown = void Function(PointerDownEvent event);\ntypedef OnItemReordered = void Function(\n  DragAndDropItem reorderedItem,\n  DragAndDropItem receiverItem,\n);\ntypedef OnItemDropOnLastTarget = void Function(\n  DragAndDropItem newOrReorderedItem,\n  DragAndDropListInterface parentList,\n  DragAndDropItemTarget receiver,\n);\ntypedef OnListReordered = void Function(\n  DragAndDropListInterface reorderedList,\n  DragAndDropListInterface receiverList,\n);\n\nclass DragAndDropBuilderParameters {\n  final OnPointerMove? onPointerMove;\n  final OnPointerUp? onPointerUp;\n  final OnPointerDown? onPointerDown;\n  final OnItemReordered? onItemReordered;\n  final OnItemDropOnLastTarget? onItemDropOnLastTarget;\n  final OnListReordered? onListReordered;\n  final ListOnWillAccept? listOnWillAccept;\n  final ListTargetOnWillAccept? listTargetOnWillAccept;\n  final OnListDraggingChanged? onListDraggingChanged;\n  final ItemOnWillAccept? itemOnWillAccept;\n  final ItemTargetOnWillAccept? itemTargetOnWillAccept;\n  final OnItemDraggingChanged? onItemDraggingChanged;\n  final Axis axis;\n  final CrossAxisAlignment verticalAlignment;\n  final double? listDraggingWidth;\n  final bool dragOnLongPress;\n  final int itemSizeAnimationDuration;\n  final Function(Widget)? itemGhost;\n  final double itemGhostOpacity;\n  final Widget? itemDivider;\n  final double? itemDraggingWidth;\n  final Decoration? itemDecorationWhileDragging;\n  final int listSizeAnimationDuration;\n  final Widget? listGhost;\n  final double listGhostOpacity;\n  final EdgeInsets? listPadding;\n  final Decoration? listDecoration;\n  final Decoration? listDecorationWhileDragging;\n  final Decoration? listInnerDecoration;\n  final double listWidth;\n  final double lastItemTargetHeight;\n  final bool addLastItemTargetHeightToTop;\n  final DragHandle? listDragHandle;\n  final DragHandle? itemDragHandle;\n  final Offset? itemDragOffset;\n  final bool constrainDraggingAxis;\n  final bool disableScrolling;\n\n  DragAndDropBuilderParameters({\n    this.onPointerMove,\n    this.onPointerUp,\n    this.onPointerDown,\n    this.onItemReordered,\n    this.onItemDropOnLastTarget,\n    this.onListReordered,\n    this.listDraggingWidth,\n    this.listOnWillAccept,\n    this.listTargetOnWillAccept,\n    this.onListDraggingChanged,\n    this.itemOnWillAccept,\n    this.itemTargetOnWillAccept,\n    this.onItemDraggingChanged,\n    this.dragOnLongPress = true,\n    this.axis = Axis.vertical,\n    this.verticalAlignment = CrossAxisAlignment.start,\n    this.itemSizeAnimationDuration = 150,\n    this.itemGhostOpacity = 0.3,\n    this.itemGhost,\n    this.itemDivider,\n    this.itemDraggingWidth,\n    this.itemDecorationWhileDragging,\n    this.listSizeAnimationDuration = 150,\n    this.listGhostOpacity = 0.3,\n    this.listGhost,\n    this.listPadding,\n    this.listDecoration,\n    this.listDecorationWhileDragging,\n    this.listInnerDecoration,\n    this.listWidth = double.infinity,\n    this.lastItemTargetHeight = 20,\n    this.addLastItemTargetHeightToTop = false,\n    this.listDragHandle,\n    this.itemDragHandle,\n    this.itemDragOffset,\n    this.constrainDraggingAxis = true,\n    this.disableScrolling = false,\n  });\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_interface.dart",
    "content": "abstract class DragAndDropInterface {}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_item.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_interface.dart';\nimport 'package:flutter/widgets.dart';\n\nclass DragAndDropItem implements DragAndDropInterface {\n  /// The child widget of this item.\n  final Widget child;\n\n  /// Widget when draggable\n  final Widget? feedbackWidget;\n\n  /// Whether or not this item can be dragged.\n  /// Set to true if it can be reordered.\n  /// Set to false if it must remain fixed.\n  final bool canDrag;\n\n  DragAndDropItem({\n    required this.child,\n    this.feedbackWidget,\n    this.canDrag = true,\n  });\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_item_target.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_lists.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\n\nclass DragAndDropItemTarget extends StatefulWidget {\n  final Widget child;\n  final DragAndDropListInterface? parent;\n  final DragAndDropBuilderParameters parameters;\n  final OnItemDropOnLastTarget onReorderOrAdd;\n\n  const DragAndDropItemTarget(\n      {required this.child,\n      required this.onReorderOrAdd,\n      required this.parameters,\n      this.parent,\n      Key? key})\n      : super(key: key);\n\n  @override\n  State<StatefulWidget> createState() => _DragAndDropItemTarget();\n}\n\nclass _DragAndDropItemTarget extends State<DragAndDropItemTarget>\n    with TickerProviderStateMixin {\n  DragAndDropItem? _hoveredDraggable;\n\n  @override\n  Widget build(BuildContext context) {\n    return Stack(\n      children: <Widget>[\n        Column(\n          crossAxisAlignment: widget.parameters.verticalAlignment,\n          children: <Widget>[\n            _hoveredDraggable != null\n                ? Opacity(\n                    opacity: widget.parameters.itemGhostOpacity,\n                    child: widget.parameters.itemGhost != null\n                        ? widget.parameters.itemGhost!(_hoveredDraggable!.child)\n                        : _hoveredDraggable!.child,\n                  )\n                : Container(),\n            widget.child,\n          ],\n        ),\n        Positioned.fill(\n          child: DragTarget<DragAndDropItem>(\n            builder: (context, candidateData, rejectedData) {\n              if (candidateData.isNotEmpty) {}\n              return Container();\n            },\n            onWillAccept: (incoming) {\n              bool accept = true;\n              if (widget.parameters.itemTargetOnWillAccept != null) {\n                accept =\n                    widget.parameters.itemTargetOnWillAccept!(incoming, widget);\n              }\n              if (accept && mounted) {\n                setState(() {\n                  _hoveredDraggable = incoming;\n                });\n              }\n              return accept;\n            },\n            onLeave: (incoming) {\n              if (mounted) {\n                setState(() {\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n            onAccept: (incoming) {\n              if (mounted) {\n                setState(() {\n                  widget.onReorderOrAdd(incoming, widget.parent!, widget);\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_item_wrapper.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_lists.dart';\nimport 'package:drag_and_drop_lists/measure_size.dart';\nimport 'package:flutter/material.dart';\n\nclass DragAndDropItemWrapper extends StatefulWidget {\n  final DragAndDropItem child;\n  final DragAndDropBuilderParameters? parameters;\n\n  const DragAndDropItemWrapper(\n      {required this.child, required this.parameters, Key? key})\n      : super(key: key);\n\n  @override\n  State<StatefulWidget> createState() => _DragAndDropItemWrapper();\n}\n\nclass _DragAndDropItemWrapper extends State<DragAndDropItemWrapper>\n    with TickerProviderStateMixin {\n  DragAndDropItem? _hoveredDraggable;\n\n  bool _dragging = false;\n  Size _containerSize = Size.zero;\n  Size _dragHandleSize = Size.zero;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget draggable;\n    if (widget.child.canDrag) {\n      if (widget.parameters!.itemDragHandle != null) {\n        Widget feedback = SizedBox(\n          width: widget.parameters!.itemDraggingWidth ?? _containerSize.width,\n          child: Stack(\n            children: [\n              widget.child.child,\n              Positioned(\n                right: widget.parameters!.itemDragHandle!.onLeft ? null : 0,\n                left: widget.parameters!.itemDragHandle!.onLeft ? 0 : null,\n                top: widget.parameters!.itemDragHandle!.verticalAlignment ==\n                        DragHandleVerticalAlignment.bottom\n                    ? null\n                    : 0,\n                bottom: widget.parameters!.itemDragHandle!.verticalAlignment ==\n                        DragHandleVerticalAlignment.top\n                    ? null\n                    : 0,\n                child: widget.parameters!.itemDragHandle!,\n              ),\n            ],\n          ),\n        );\n\n        var positionedDragHandle = Positioned(\n          right: widget.parameters!.itemDragHandle!.onLeft ? null : 0,\n          left: widget.parameters!.itemDragHandle!.onLeft ? 0 : null,\n          top: widget.parameters!.itemDragHandle!.verticalAlignment ==\n                  DragHandleVerticalAlignment.bottom\n              ? null\n              : 0,\n          bottom: widget.parameters!.itemDragHandle!.verticalAlignment ==\n                  DragHandleVerticalAlignment.top\n              ? null\n              : 0,\n          child: MouseRegion(\n            cursor: SystemMouseCursors.grab,\n            child: Draggable<DragAndDropItem>(\n              data: widget.child,\n              axis: widget.parameters!.axis == Axis.vertical &&\n                      widget.parameters!.constrainDraggingAxis\n                  ? Axis.vertical\n                  : null,\n              feedback: Transform.translate(\n                offset: _feedbackContainerOffset(),\n                child: Material(\n                  color: Colors.transparent,\n                  child: Container(\n                    decoration: widget.parameters!.itemDecorationWhileDragging,\n                    child: Directionality(\n                      textDirection: Directionality.of(context),\n                      child: feedback,\n                    ),\n                  ),\n                ),\n              ),\n              childWhenDragging: Container(),\n              onDragStarted: () => _setDragging(true),\n              onDragCompleted: () => _setDragging(false),\n              onDraggableCanceled: (_, __) => _setDragging(false),\n              onDragEnd: (_) => _setDragging(false),\n              child: MeasureSize(\n                onSizeChange: (size) {\n                  setState(() {\n                    _dragHandleSize = size!;\n                  });\n                },\n                child: widget.parameters!.itemDragHandle,\n              ),\n            ),\n          ),\n        );\n\n        draggable = MeasureSize(\n          onSizeChange: _setContainerSize,\n          child: Stack(\n            children: [\n              Visibility(\n                visible: !_dragging,\n                child: widget.child.child,\n              ),\n              // dragAndDropListContents,\n              positionedDragHandle,\n            ],\n          ),\n        );\n      } else if (widget.parameters!.dragOnLongPress) {\n        draggable = MeasureSize(\n          onSizeChange: _setContainerSize,\n          child: LongPressDraggable<DragAndDropItem>(\n            data: widget.child,\n            axis: widget.parameters!.axis == Axis.vertical &&\n                    widget.parameters!.constrainDraggingAxis\n                ? Axis.vertical\n                : null,\n            feedback: Transform.translate(\n              //Tuntori - item offset\n              offset: widget.parameters!.itemDragOffset ?? Offset(0, 0),\n              child: SizedBox(\n                width: widget.parameters!.itemDraggingWidth ??\n                    _containerSize.width,\n                child: Material(\n                  color: Colors.transparent,\n                  child: Container(\n                    decoration: widget.parameters!.itemDecorationWhileDragging,\n                    child: Directionality(\n                        textDirection: Directionality.of(context),\n                        child:\n                            widget.child.feedbackWidget ?? widget.child.child),\n                  ),\n                ),\n              ),\n            ),\n            childWhenDragging: Container(),\n            onDragStarted: () => _setDragging(true),\n            onDragCompleted: () => _setDragging(false),\n            onDraggableCanceled: (_, __) => _setDragging(false),\n            onDragEnd: (_) => _setDragging(false),\n            child: widget.child.child,\n          ),\n        );\n      } else {\n        draggable = MeasureSize(\n          onSizeChange: _setContainerSize,\n          child: Draggable<DragAndDropItem>(\n            data: widget.child,\n            axis: widget.parameters!.axis == Axis.vertical &&\n                    widget.parameters!.constrainDraggingAxis\n                ? Axis.vertical\n                : null,\n            feedback: SizedBox(\n              width:\n                  widget.parameters!.itemDraggingWidth ?? _containerSize.width,\n              child: Material(\n                color: Colors.transparent,\n                child: Container(\n                  decoration: widget.parameters!.itemDecorationWhileDragging,\n                  child: Directionality(\n                    textDirection: Directionality.of(context),\n                    child: widget.child.feedbackWidget ?? widget.child.child,\n                  ),\n                ),\n              ),\n            ),\n            childWhenDragging: Container(),\n            onDragStarted: () => _setDragging(true),\n            onDragCompleted: () => _setDragging(false),\n            onDraggableCanceled: (_, __) => _setDragging(false),\n            onDragEnd: (_) => _setDragging(false),\n            child: widget.child.child,\n          ),\n        );\n      }\n    } else {\n      draggable = _hoveredDraggable != null ? Container() : widget.child.child;\n    }\n    return Stack(\n      children: <Widget>[\n        Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: widget.parameters!.verticalAlignment,\n          children: <Widget>[\n            _hoveredDraggable != null\n                ? Opacity(\n                    opacity: widget.parameters!.itemGhostOpacity,\n                    child: widget.parameters!.itemGhost != null\n                        ? widget\n                            .parameters!.itemGhost!(_hoveredDraggable!.child)\n                        : _hoveredDraggable!.child,\n                  )\n                : Container(),\n            Listener(\n              onPointerMove: _onPointerMove,\n              onPointerDown: widget.parameters!.onPointerDown,\n              onPointerUp: widget.parameters!.onPointerUp,\n              child: draggable,\n            ),\n          ],\n        ),\n        Positioned.fill(\n          child: DragTarget<DragAndDropItem>(\n            builder: (context, candidateData, rejectedData) {\n              if (candidateData.isNotEmpty) {}\n              return Container();\n            },\n            onWillAccept: (incoming) {\n              bool accept = true;\n              if (widget.parameters!.itemOnWillAccept != null) {\n                accept = widget.parameters!.itemOnWillAccept!(\n                    incoming, widget.child);\n              }\n              if (accept && mounted) {\n                setState(() {\n                  _hoveredDraggable = incoming;\n                });\n              }\n              return accept;\n            },\n            onLeave: (incoming) {\n              if (mounted) {\n                setState(() {\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n            onAccept: (incoming) {\n              if (mounted) {\n                setState(() {\n                  if (widget.parameters!.onItemReordered != null) {\n                    widget.parameters!.onItemReordered!(incoming, widget.child);\n                  }\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n          ),\n        )\n      ],\n    );\n  }\n\n  Offset _feedbackContainerOffset() {\n    double xOffset;\n    double yOffset;\n    if (widget.parameters!.itemDragHandle!.onLeft) {\n      xOffset = 0;\n    } else {\n      xOffset = -_containerSize.width + _dragHandleSize.width;\n    }\n    if (widget.parameters!.itemDragHandle!.verticalAlignment ==\n        DragHandleVerticalAlignment.bottom) {\n      yOffset = -_containerSize.height + _dragHandleSize.width;\n    } else {\n      yOffset = 0;\n    }\n\n    return Offset(xOffset, yOffset);\n  }\n\n  void _setContainerSize(Size? size) {\n    if (mounted) {\n      setState(() {\n        _containerSize = size!;\n      });\n    }\n  }\n\n  void _setDragging(bool dragging) {\n    if (_dragging != dragging && mounted) {\n      setState(() {\n        _dragging = dragging;\n      });\n      if (widget.parameters!.onItemDraggingChanged != null) {\n        widget.parameters!.onItemDraggingChanged!(widget.child, dragging);\n      }\n    }\n  }\n\n  void _onPointerMove(PointerMoveEvent event) {\n    if (_dragging) widget.parameters!.onPointerMove!(event);\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_list.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item_target.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item_wrapper.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\n\nclass DragAndDropList implements DragAndDropListInterface {\n  /// The widget that is displayed at the top of the list.\n  final Widget? header;\n\n  /// The widget that is displayed at the bottom of the list.\n  final Widget? footer;\n\n  /// The widget that is displayed to the left of the list.\n  final Widget? leftSide;\n\n  /// The widget that is displayed to the right of the list.\n  final Widget? rightSide;\n\n  /// The widget to be displayed when a list is empty.\n  /// If this is not null, it will override that set in [DragAndDropLists.contentsWhenEmpty].\n  final Widget? contentsWhenEmpty;\n\n  /// The widget to be displayed as the last element in the list that will accept\n  /// a dragged item.\n  final Widget? lastTarget;\n\n  /// The decoration displayed around a list.\n  /// If this is not null, it will override that set in [DragAndDropLists.listDecoration].\n  final Decoration? decoration;\n\n  /// The vertical alignment of the contents in this list.\n  /// If this is not null, it will override that set in [DragAndDropLists.verticalAlignment].\n  final CrossAxisAlignment verticalAlignment;\n\n  /// The horizontal alignment of the contents in this list.\n  /// If this is not null, it will override that set in [DragAndDropLists.horizontalAlignment].\n  final MainAxisAlignment horizontalAlignment;\n\n  /// The child elements that will be contained in this list.\n  /// It is possible to not provide any children when an empty list is desired.\n  @override\n  final List<DragAndDropItem> children;\n\n  /// Whether or not this item can be dragged.\n  /// Set to true if it can be reordered.\n  /// Set to false if it must remain fixed.\n  @override\n  final bool canDrag;\n\n  DragAndDropList({\n    required this.children,\n    this.header,\n    this.footer,\n    this.leftSide,\n    this.rightSide,\n    this.contentsWhenEmpty,\n    this.lastTarget,\n    this.decoration,\n    this.horizontalAlignment = MainAxisAlignment.start,\n    this.verticalAlignment = CrossAxisAlignment.start,\n    this.canDrag = true,\n  });\n\n  @override\n  Widget generateWidget(DragAndDropBuilderParameters params) {\n    var contents = <Widget>[];\n    if (header != null) {\n      contents.add(Flexible(child: header!));\n    }\n    Widget intrinsicHeight = IntrinsicHeight(\n      child: Row(\n        mainAxisAlignment: horizontalAlignment,\n        mainAxisSize: MainAxisSize.max,\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: _generateDragAndDropListInnerContents(params),\n      ),\n    );\n    if (params.axis == Axis.horizontal) {\n      intrinsicHeight = SizedBox(\n        width: params.listWidth,\n        child: intrinsicHeight,\n      );\n    }\n    if (params.listInnerDecoration != null) {\n      intrinsicHeight = Container(\n        decoration: params.listInnerDecoration,\n        child: intrinsicHeight,\n      );\n    }\n    contents.add(intrinsicHeight);\n\n    if (footer != null) {\n      contents.add(Flexible(child: footer!));\n    }\n\n    return Container(\n      width: params.axis == Axis.vertical\n          ? double.infinity\n          : params.listWidth - params.listPadding!.horizontal,\n      decoration: decoration ?? params.listDecoration,\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: verticalAlignment,\n        children: contents,\n      ),\n    );\n  }\n\n  List<Widget> _generateDragAndDropListInnerContents(\n      DragAndDropBuilderParameters parameters) {\n    var contents = <Widget>[];\n    if (leftSide != null) {\n      contents.add(leftSide!);\n    }\n    if (children.isNotEmpty) {\n      List<Widget> allChildren = <Widget>[];\n      if (parameters.addLastItemTargetHeightToTop) {\n        allChildren.add(Padding(\n          padding: EdgeInsets.only(top: parameters.lastItemTargetHeight),\n        ));\n      }\n      for (int i = 0; i < children.length; i++) {\n        allChildren.add(DragAndDropItemWrapper(\n          child: children[i],\n          parameters: parameters,\n        ));\n        if (parameters.itemDivider != null && i < children.length - 1) {\n          allChildren.add(parameters.itemDivider!);\n        }\n      }\n      allChildren.add(DragAndDropItemTarget(\n        parent: this,\n        parameters: parameters,\n        onReorderOrAdd: parameters.onItemDropOnLastTarget!,\n        child: lastTarget ??\n            Container(\n              height: parameters.lastItemTargetHeight,\n            ),\n      ));\n      contents.add(\n        Expanded(\n          child: SingleChildScrollView(\n            physics: const NeverScrollableScrollPhysics(),\n            child: Column(\n              crossAxisAlignment: verticalAlignment,\n              mainAxisSize: MainAxisSize.max,\n              children: allChildren,\n            ),\n          ),\n        ),\n      );\n    } else {\n      contents.add(\n        Expanded(\n          child: SingleChildScrollView(\n            physics: const NeverScrollableScrollPhysics(),\n            child: Column(\n              mainAxisSize: MainAxisSize.max,\n              children: <Widget>[\n                contentsWhenEmpty ??\n                    const Text(\n                      'Empty list',\n                      style: TextStyle(\n                        fontStyle: FontStyle.italic,\n                      ),\n                    ),\n                DragAndDropItemTarget(\n                  parent: this,\n                  parameters: parameters,\n                  onReorderOrAdd: parameters.onItemDropOnLastTarget!,\n                  child: lastTarget ??\n                      Container(\n                        height: parameters.lastItemTargetHeight,\n                      ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    }\n    if (rightSide != null) {\n      contents.add(rightSide!);\n    }\n    return contents;\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_list_expansion.dart",
    "content": "import 'dart:async';\n\nimport 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item_target.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item_wrapper.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/programmatic_expansion_tile.dart';\nimport 'package:flutter/material.dart';\n\ntypedef OnExpansionChanged = void Function(bool expanded);\n\n/// This class mirrors flutter's [ExpansionTile], with similar options.\nclass DragAndDropListExpansion implements DragAndDropListExpansionInterface {\n  final Widget? title;\n  final Widget? subtitle;\n  final Widget? trailing;\n  final Widget? leading;\n  final bool initiallyExpanded;\n\n  /// Set this to a unique key that will remain unchanged over the lifetime of the list.\n  /// Used to maintain the expanded/collapsed states\n  final Key listKey;\n\n  /// This function will be called when the expansion of a tile is changed.\n  final OnExpansionChanged? onExpansionChanged;\n  final Color? titleColor;\n  final Color? titleColorExpanded;\n  final Color itemsBackgroundColor;\n  @override\n  final List<DragAndDropItem>? children;\n  final Widget? contentsWhenEmpty;\n  final Widget? lastTarget;\n\n  /// Whether or not this item can be dragged.\n  /// Set to true if it can be reordered.\n  /// Set to false if it must remain fixed.\n  @override\n  final bool canDrag;\n\n  /// Disable to borders displayed at the top and bottom when expanded\n  final bool disableTopAndBottomBorders;\n\n  final ValueNotifier<bool> _expanded = ValueNotifier<bool>(true);\n  final GlobalKey<ProgrammaticExpansionTileState> _expansionKey =\n      GlobalKey<ProgrammaticExpansionTileState>();\n\n  DragAndDropListExpansion({\n    this.children,\n    this.title,\n    this.subtitle,\n    this.trailing,\n    this.leading,\n    this.initiallyExpanded = false,\n    this.titleColor,\n    this.titleColorExpanded,\n    this.itemsBackgroundColor = Colors.grey,\n    this.onExpansionChanged,\n    this.contentsWhenEmpty,\n    this.lastTarget,\n    required this.listKey,\n    this.canDrag = true,\n    this.disableTopAndBottomBorders = false,\n  }) {\n    _expanded.value = initiallyExpanded;\n  }\n\n  @override\n  Widget generateWidget(DragAndDropBuilderParameters params) {\n    var contents = _generateDragAndDropListInnerContents(params);\n\n    Widget expandable = ProgrammaticExpansionTile(\n      title: title,\n      listKey: listKey,\n      subtitle: subtitle,\n      trailing: trailing,\n      leading: leading,\n      disableTopAndBottomBorders: disableTopAndBottomBorders,\n      titleColor: titleColor,\n      titleColorExpanded: titleColorExpanded,\n      itemsBackgroundColor: itemsBackgroundColor,\n      initiallyExpanded: initiallyExpanded,\n      onExpansionChanged: _onSetExpansion,\n      key: _expansionKey,\n      children: contents,\n    );\n\n    if (params.listDecoration != null) {\n      expandable = Container(\n        decoration: params.listDecoration,\n        child: expandable,\n      );\n    }\n\n    if (params.listPadding != null) {\n      expandable = Padding(\n        padding: params.listPadding!,\n        child: expandable,\n      );\n    }\n\n    Widget toReturn = ValueListenableBuilder(\n      valueListenable: _expanded,\n      child: expandable,\n      builder: (context, dynamic error, child) {\n        if (!_expanded.value) {\n          return Stack(children: <Widget>[\n            child!,\n            Positioned.fill(\n              child: DragTarget<DragAndDropItem>(\n                builder: (context, candidateData, rejectedData) {\n                  if (candidateData.isNotEmpty) {}\n                  return Container();\n                },\n                onWillAccept: (incoming) {\n                  _startExpansionTimer();\n                  return false;\n                },\n                onLeave: (incoming) {\n                  _stopExpansionTimer();\n                },\n                onAccept: (incoming) {},\n              ),\n            )\n          ]);\n        } else {\n          return child!;\n        }\n      },\n    );\n\n    return toReturn;\n  }\n\n  List<Widget> _generateDragAndDropListInnerContents(\n      DragAndDropBuilderParameters parameters) {\n    var contents = <Widget>[];\n    if (children != null && children!.isNotEmpty) {\n      for (int i = 0; i < children!.length; i++) {\n        contents.add(DragAndDropItemWrapper(\n          child: children![i],\n          parameters: parameters,\n        ));\n        if (parameters.itemDivider != null && i < children!.length - 1) {\n          contents.add(parameters.itemDivider!);\n        }\n      }\n      contents.add(DragAndDropItemTarget(\n        parent: this,\n        parameters: parameters,\n        onReorderOrAdd: parameters.onItemDropOnLastTarget!,\n        child: lastTarget ??\n            SizedBox(\n              height: parameters.lastItemTargetHeight,\n            ),\n      ));\n    } else {\n      /*contents.add(\n        contentsWhenEmpty ??\n            const Text(\n              'Empty list',\n              style: TextStyle(\n                fontStyle: FontStyle.italic,\n              ),\n            ),\n      );*/\n      contents.add(\n        DragAndDropItemTarget(\n          parent: this,\n          parameters: parameters,\n          onReorderOrAdd: parameters.onItemDropOnLastTarget!,\n          child: lastTarget ??\n              SizedBox(\n                height: 58,\n                child: Center(\n                    child: Text(\n                  \"Empty\",\n                  style: TextStyle(color: Colors.grey),\n                )),\n              ),\n        ),\n      );\n    }\n    return contents;\n  }\n\n  @override\n  toggleExpanded() {\n    if (isExpanded) {\n      collapse();\n    } else {\n      expand();\n    }\n  }\n\n  @override\n  collapse() {\n    if (!isExpanded) {\n      _expanded.value = false;\n      _expansionKey.currentState!.collapse();\n    }\n  }\n\n  @override\n  expand() {\n    if (!isExpanded) {\n      _expanded.value = true;\n      _expansionKey.currentState!.expand();\n    }\n  }\n\n  _onSetExpansion(bool expanded) {\n    _expanded.value = expanded;\n\n    if (onExpansionChanged != null) onExpansionChanged!(expanded);\n  }\n\n  @override\n  get isExpanded => _expanded.value;\n\n  late Timer _expansionTimer;\n\n  _startExpansionTimer() async {\n    _expansionTimer =\n        Timer(const Duration(milliseconds: 400), _expansionCallback);\n  }\n\n  _stopExpansionTimer() async {\n    if (_expansionTimer.isActive) {\n      _expansionTimer.cancel();\n    }\n  }\n\n  _expansionCallback() {\n    expand();\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_list_interface.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_interface.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item.dart';\nimport 'package:flutter/material.dart';\n\nabstract class DragAndDropListInterface implements DragAndDropInterface {\n  List<DragAndDropItem>? get children;\n\n  /// Whether or not this item can be dragged.\n  /// Set to true if it can be reordered.\n  /// Set to false if it must remain fixed.\n  bool get canDrag;\n\n  Widget generateWidget(DragAndDropBuilderParameters params);\n}\n\nabstract class DragAndDropListExpansionInterface\n    implements DragAndDropListInterface {\n  @override\n  final List<DragAndDropItem>? children;\n\n  DragAndDropListExpansionInterface({this.children});\n\n  get isExpanded;\n\n  toggleExpanded();\n\n  expand();\n\n  collapse();\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_list_target.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\n\ntypedef OnDropOnLastTarget = void Function(\n  DragAndDropListInterface newOrReordered,\n  DragAndDropListTarget receiver,\n);\n\nclass DragAndDropListTarget extends StatefulWidget {\n  final Widget? child;\n  final DragAndDropBuilderParameters parameters;\n  final OnDropOnLastTarget onDropOnLastTarget;\n  final double lastListTargetSize;\n\n  const DragAndDropListTarget(\n      {this.child,\n      required this.parameters,\n      required this.onDropOnLastTarget,\n      this.lastListTargetSize = 110,\n      Key? key})\n      : super(key: key);\n\n  @override\n  State<StatefulWidget> createState() => _DragAndDropListTarget();\n}\n\nclass _DragAndDropListTarget extends State<DragAndDropListTarget>\n    with TickerProviderStateMixin {\n  DragAndDropListInterface? _hoveredDraggable;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget visibleContents = Column(\n      children: <Widget>[\n        _hoveredDraggable != null\n            ? Opacity(\n                opacity: widget.parameters.listGhostOpacity,\n                child: widget.parameters.listGhost ??\n                    _hoveredDraggable!.generateWidget(widget.parameters),\n              )\n            : Container(),\n        widget.child ??\n            SizedBox(\n              height: widget.parameters.axis == Axis.vertical\n                  ? widget.lastListTargetSize\n                  : null,\n              width: widget.parameters.axis == Axis.horizontal\n                  ? widget.lastListTargetSize\n                  : null,\n            ),\n      ],\n    );\n\n    if (widget.parameters.listPadding != null) {\n      visibleContents = Padding(\n        padding: widget.parameters.listPadding!,\n        child: visibleContents,\n      );\n    }\n\n    if (widget.parameters.axis == Axis.horizontal) {\n      visibleContents = SingleChildScrollView(child: visibleContents);\n    }\n\n    return Stack(\n      children: <Widget>[\n        visibleContents,\n        Positioned.fill(\n          child: DragTarget<DragAndDropListInterface>(\n            builder: (context, candidateData, rejectedData) {\n              if (candidateData.isNotEmpty) {}\n              return Container();\n            },\n            onWillAccept: (incoming) {\n              bool accept = true;\n              if (widget.parameters.listTargetOnWillAccept != null) {\n                accept =\n                    widget.parameters.listTargetOnWillAccept!(incoming, widget);\n              }\n              if (accept && mounted) {\n                setState(() {\n                  _hoveredDraggable = incoming;\n                });\n              }\n              return accept;\n            },\n            onLeave: (incoming) {\n              if (mounted) {\n                setState(() {\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n            onAccept: (incoming) {\n              if (mounted) {\n                setState(() {\n                  widget.onDropOnLastTarget(incoming, widget);\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_list_wrapper.dart",
    "content": "import 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/drag_handle.dart';\nimport 'package:drag_and_drop_lists/measure_size.dart';\nimport 'package:flutter/material.dart';\n\nclass DragAndDropListWrapper extends StatefulWidget {\n  final DragAndDropListInterface dragAndDropList;\n  final DragAndDropBuilderParameters parameters;\n\n  const DragAndDropListWrapper(\n      {required this.dragAndDropList, required this.parameters, Key? key})\n      : super(key: key);\n\n  @override\n  State<StatefulWidget> createState() => _DragAndDropListWrapper();\n}\n\nclass _DragAndDropListWrapper extends State<DragAndDropListWrapper>\n    with TickerProviderStateMixin {\n  DragAndDropListInterface? _hoveredDraggable;\n\n  bool _dragging = false;\n  Size _containerSize = Size.zero;\n  Size _dragHandleSize = Size.zero;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget dragAndDropListContents =\n        widget.dragAndDropList.generateWidget(widget.parameters);\n\n    Widget draggable;\n    if (widget.dragAndDropList.canDrag) {\n      if (widget.parameters.listDragHandle != null) {\n        Widget dragHandle = MouseRegion(\n          cursor: SystemMouseCursors.grab,\n          child: widget.parameters.listDragHandle,\n        );\n\n        Widget feedback =\n            buildFeedbackWithHandle(dragAndDropListContents, dragHandle);\n\n        draggable = MeasureSize(\n          onSizeChange: (size) {\n            setState(() {\n              _containerSize = size!;\n            });\n          },\n          child: Stack(\n            children: [\n              Visibility(\n                visible: !_dragging,\n                child: dragAndDropListContents,\n              ),\n              // dragAndDropListContents,\n              Positioned(\n                right: widget.parameters.listDragHandle!.onLeft ? null : 0,\n                left: widget.parameters.listDragHandle!.onLeft ? 0 : null,\n                top: _dragHandleDistanceFromTop(),\n                child: Draggable<DragAndDropListInterface>(\n                  data: widget.dragAndDropList,\n                  axis: draggableAxis(),\n                  feedback: Transform.translate(\n                    offset: _feedbackContainerOffset(),\n                    child: feedback,\n                  ),\n                  childWhenDragging: Container(),\n                  onDragStarted: () => _setDragging(true),\n                  onDragCompleted: () => _setDragging(false),\n                  onDraggableCanceled: (_, __) => _setDragging(false),\n                  onDragEnd: (_) => _setDragging(false),\n                  child: MeasureSize(\n                    onSizeChange: (size) {\n                      setState(() {\n                        _dragHandleSize = size!;\n                      });\n                    },\n                    child: dragHandle,\n                  ),\n                ),\n              ),\n            ],\n          ),\n        );\n      } else if (widget.parameters.dragOnLongPress) {\n        draggable = LongPressDraggable<DragAndDropListInterface>(\n          data: widget.dragAndDropList,\n          axis: draggableAxis(),\n          feedback:\n              buildFeedbackWithoutHandle(context, dragAndDropListContents),\n          childWhenDragging: Container(),\n          onDragStarted: () => _setDragging(true),\n          onDragCompleted: () => _setDragging(false),\n          onDraggableCanceled: (_, __) => _setDragging(false),\n          onDragEnd: (_) => _setDragging(false),\n          child: dragAndDropListContents,\n        );\n      } else {\n        draggable = Draggable<DragAndDropListInterface>(\n          data: widget.dragAndDropList,\n          axis: draggableAxis(),\n          feedback:\n              buildFeedbackWithoutHandle(context, dragAndDropListContents),\n          childWhenDragging: Container(),\n          onDragStarted: () => _setDragging(true),\n          onDragCompleted: () => _setDragging(false),\n          onDraggableCanceled: (_, __) => _setDragging(false),\n          onDragEnd: (_) => _setDragging(false),\n          child: dragAndDropListContents,\n        );\n      }\n    } else {\n      draggable = dragAndDropListContents;\n    }\n\n    var rowOrColumnChildren = [\n      _hoveredDraggable != null\n          ? Opacity(\n              opacity: widget.parameters.listGhostOpacity,\n              child: widget.parameters.listGhost ??\n                  Container(\n                    padding: widget.parameters.axis == Axis.vertical\n                        ? const EdgeInsets.all(0)\n                        : EdgeInsets.symmetric(\n                            horizontal:\n                                widget.parameters.listPadding!.horizontal),\n                    child: _hoveredDraggable!.generateWidget(widget.parameters),\n                  ),\n            )\n          : const SizedBox(),\n      Listener(\n        onPointerMove: _onPointerMove,\n        onPointerDown: widget.parameters.onPointerDown,\n        onPointerUp: widget.parameters.onPointerUp,\n        child: draggable,\n      ),\n    ];\n\n    var stack = Stack(\n      children: <Widget>[\n        widget.parameters.axis == Axis.vertical\n            ? Column(\n                children: rowOrColumnChildren,\n              )\n            : Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: rowOrColumnChildren,\n              ),\n        Positioned.fill(\n          child: DragTarget<DragAndDropListInterface>(\n            builder: (context, candidateData, rejectedData) {\n              if (candidateData.isNotEmpty) {}\n              return const SizedBox();\n            },\n            onWillAccept: (incoming) {\n              bool accept = true;\n              if (widget.parameters.listOnWillAccept != null) {\n                accept = widget.parameters.listOnWillAccept!(\n                    incoming, widget.dragAndDropList);\n              }\n              if (accept && mounted) {\n                setState(() {\n                  _hoveredDraggable = incoming;\n                });\n              }\n              return accept;\n            },\n            onLeave: (incoming) {\n              if (_hoveredDraggable != null) {\n                if (mounted) {\n                  setState(() {\n                    _hoveredDraggable = null;\n                  });\n                }\n              }\n            },\n            onAccept: (incoming) {\n              if (mounted) {\n                setState(() {\n                  widget.parameters.onListReordered!(\n                      incoming, widget.dragAndDropList);\n                  _hoveredDraggable = null;\n                });\n              }\n            },\n          ),\n        ),\n      ],\n    );\n\n    Widget toReturn = stack;\n    if (widget.parameters.listPadding != null) {\n      toReturn = Padding(\n        padding: widget.parameters.listPadding!,\n        child: stack,\n      );\n    }\n    if (widget.parameters.axis == Axis.horizontal &&\n        !widget.parameters.disableScrolling) {\n      toReturn = SingleChildScrollView(\n        child: Container(\n          child: toReturn,\n        ),\n      );\n    }\n\n    return toReturn;\n  }\n\n  Material buildFeedbackWithHandle(\n      Widget dragAndDropListContents, Widget dragHandle) {\n    return Material(\n      color: Colors.transparent,\n      child: Container(\n        decoration: widget.parameters.listDecorationWhileDragging,\n        child: SizedBox(\n          width: widget.parameters.listDraggingWidth ?? _containerSize.width,\n          child: Stack(\n            children: [\n              Directionality(\n                textDirection: Directionality.of(context),\n                child: dragAndDropListContents,\n              ),\n              Positioned(\n                right: widget.parameters.listDragHandle!.onLeft ? null : 0,\n                left: widget.parameters.listDragHandle!.onLeft ? 0 : null,\n                top: widget.parameters.listDragHandle!.verticalAlignment ==\n                        DragHandleVerticalAlignment.bottom\n                    ? null\n                    : 0,\n                bottom: widget.parameters.listDragHandle!.verticalAlignment ==\n                        DragHandleVerticalAlignment.top\n                    ? null\n                    : 0,\n                child: dragHandle,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildFeedbackWithoutHandle(\n      BuildContext context, Widget dragAndDropListContents) {\n    return Transform.translate(\n      //Tuntori - category offset\n      offset: const Offset(20, -10),\n      child: SizedBox(\n        width: widget.parameters.axis == Axis.vertical\n            ? (widget.parameters.listDraggingWidth ??\n                MediaQuery.of(context).size.width)\n            : (widget.parameters.listDraggingWidth ??\n                widget.parameters.listWidth),\n        child: Material(\n          color: Colors.transparent,\n          child: Container(\n            decoration: widget.parameters.listDecorationWhileDragging,\n            child: Directionality(\n              textDirection: Directionality.of(context),\n              child: dragAndDropListContents,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Axis? draggableAxis() {\n    return widget.parameters.axis == Axis.vertical &&\n            widget.parameters.constrainDraggingAxis\n        ? Axis.vertical\n        : null;\n  }\n\n  double _dragHandleDistanceFromTop() {\n    switch (widget.parameters.listDragHandle!.verticalAlignment) {\n      case DragHandleVerticalAlignment.top:\n        return 0;\n      case DragHandleVerticalAlignment.center:\n        return (_containerSize.height / 2.0) - (_dragHandleSize.height / 2.0);\n      case DragHandleVerticalAlignment.bottom:\n        return _containerSize.height - _dragHandleSize.height;\n      default:\n        return 0;\n    }\n  }\n\n  Offset _feedbackContainerOffset() {\n    double xOffset;\n    double yOffset;\n    if (widget.parameters.listDragHandle!.onLeft) {\n      xOffset = 0;\n    } else {\n      xOffset = -_containerSize.width + _dragHandleSize.width;\n    }\n    if (widget.parameters.listDragHandle!.verticalAlignment ==\n        DragHandleVerticalAlignment.bottom) {\n      yOffset = -_containerSize.height + _dragHandleSize.width;\n    } else {\n      yOffset = 0;\n    }\n\n    return Offset(xOffset, yOffset);\n  }\n\n  //Tuntori: Called when dragging state is started or stopped\n  void _setDragging(bool dragging) {\n    if (_dragging != dragging && mounted) {\n      setState(() {\n        _dragging = dragging;\n      });\n      if (widget.parameters.onListDraggingChanged != null) {\n        widget.parameters.onListDraggingChanged!(\n            widget.dragAndDropList, dragging);\n      }\n    }\n  }\n\n  void _onPointerMove(PointerMoveEvent event) {\n    if (_dragging) widget.parameters.onPointerMove!(event);\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_and_drop_lists.dart",
    "content": "/// Drag and drop list reordering for two level lists.\n///\n/// [DragAndDropLists] is the main widget, and contains numerous options for controlling overall list presentation.\n///\n/// The children of [DragAndDropLists] are [DragAndDropList] or another class that inherits from\n/// [DragAndDropListInterface] such as [DragAndDropListExpansion]. These lists can be reordered at will.\n/// Each list contains its own properties, and can be styled separately if the defaults provided to [DragAndDropLists]\n/// should be overridden.\n///\n/// The children of a [DragAndDropListInterface] are [DragAndDropItem]. These are the individual elements and can be\n/// reordered within their own list and into other lists. If they should not be able to be reordered, they can also\n/// be locked individually.\nlibrary drag_and_drop_lists;\n\nimport 'dart:math';\n\nimport 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_item_target.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_interface.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_target.dart';\nimport 'package:drag_and_drop_lists/drag_and_drop_list_wrapper.dart';\nimport 'package:drag_and_drop_lists/drag_handle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\nexport 'package:drag_and_drop_lists/drag_and_drop_builder_parameters.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_item.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_item_target.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_item_wrapper.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_list.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_list_expansion.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_list_target.dart';\nexport 'package:drag_and_drop_lists/drag_and_drop_list_wrapper.dart';\nexport 'package:drag_and_drop_lists/drag_handle.dart';\n\ntypedef OnItemReorder = void Function(\n  int oldItemIndex,\n  int oldListIndex,\n  int newItemIndex,\n  int newListIndex,\n);\ntypedef OnItemAdd = void Function(\n  DragAndDropItem newItem,\n  int listIndex,\n  int newItemIndex,\n);\ntypedef OnListAdd = void Function(\n    DragAndDropListInterface newList, int newListIndex);\ntypedef OnListReorder = void Function(int oldListIndex, int newListIndex);\ntypedef OnListDraggingChanged = void Function(\n  DragAndDropListInterface? list,\n  bool dragging,\n);\ntypedef ListOnWillAccept = bool Function(\n  DragAndDropListInterface? incoming,\n  DragAndDropListInterface? target,\n);\ntypedef ListOnAccept = void Function(\n  DragAndDropListInterface incoming,\n  DragAndDropListInterface target,\n);\ntypedef ListTargetOnWillAccept = bool Function(\n    DragAndDropListInterface? incoming, DragAndDropListTarget target);\ntypedef ListTargetOnAccept = void Function(\n    DragAndDropListInterface incoming, DragAndDropListTarget target);\ntypedef OnItemDraggingChanged = void Function(\n  DragAndDropItem item,\n  bool dragging,\n);\ntypedef ItemOnWillAccept = bool Function(\n  DragAndDropItem? incoming,\n  DragAndDropItem target,\n);\ntypedef ItemOnAccept = void Function(\n  DragAndDropItem incoming,\n  DragAndDropItem target,\n);\ntypedef ItemTargetOnWillAccept = bool Function(\n    DragAndDropItem? incoming, DragAndDropItemTarget target);\ntypedef ItemTargetOnAccept = void Function(\n  DragAndDropItem incoming,\n  DragAndDropListInterface parentList,\n  DragAndDropItemTarget target,\n);\n\nclass DragAndDropLists extends StatefulWidget {\n  /// The child lists to be displayed.\n  /// If any of these children are [DragAndDropListExpansion] or inherit from\n  /// [DragAndDropListExpansionInterface], [listGhost] must not be null.\n  final List<DragAndDropListInterface> children;\n\n  /// Calls this function when a list element is reordered.\n  /// Takes into account the index change when removing an item, so the\n  /// [newItemIndex] can be used directly when inserting.\n  final OnItemReorder onItemReorder;\n\n  /// Calls this function when a list is reordered.\n  /// Takes into account the index change when removing a list, so the\n  /// [newListIndex] can be used directly when inserting.\n  final OnListReorder onListReorder;\n\n  /// Calls this function when a new item has been added.\n  final OnItemAdd? onItemAdd;\n\n  /// Calls this function when a new list has been added.\n  final OnListAdd? onListAdd;\n\n  /// Set in order to provide custom acceptance criteria for when a list can be\n  /// dropped onto a specific other list\n  final ListOnWillAccept? listOnWillAccept;\n\n  /// Set in order to get the lists involved in a drag and drop operation after\n  /// a list has been accepted. For general use cases where only reordering is\n  /// necessary, only [onListReorder] or [onListAdd] is needed, and this should\n  /// be left null. [onListReorder] or [onListAdd] will be called after this.\n  final ListOnAccept? listOnAccept;\n\n  /// Set in order to provide custom acceptance criteria for when a list can be\n  /// dropped onto a specific target. This target always exists as the last\n  /// target the DragAndDropLists, and also can be used independently.\n  final ListTargetOnWillAccept? listTargetOnWillAccept;\n\n  /// Set in order to get the list and target involved in a drag and drop\n  /// operation after a list has been accepted. For general use cases where only\n  /// reordering is necessary, only [onListReorder] or [onListAdd] is needed,\n  /// and this should be left null. [onListReorder] or [onListAdd] will be\n  /// called after this.\n  final ListTargetOnAccept? listTargetOnAccept;\n\n  /// Called when a list dragging is starting or ending\n  final OnListDraggingChanged? onListDraggingChanged;\n\n  /// Set in order to provide custom acceptance criteria for when a item can be\n  /// dropped onto a specific other item\n  final ItemOnWillAccept? itemOnWillAccept;\n\n  /// Set in order to get the items involved in a drag and drop operation after\n  /// an item has been accepted. For general use cases where only reordering is\n  /// necessary, only [onItemReorder] or [onItemAdd] is needed, and this should\n  /// be left null. [onItemReorder] or [onItemAdd] will be called after this.\n  final ItemOnAccept? itemOnAccept;\n\n  /// Set in order to provide custom acceptance criteria for when a item can be\n  /// dropped onto a specific target. This target always exists as the last\n  /// target for list of items, and also can be used independently.\n  final ItemTargetOnWillAccept? itemTargetOnWillAccept;\n\n  /// Set in order to get the item and target involved in a drag and drop\n  /// operation after a item has been accepted. For general use cases where only\n  /// reordering is necessary, only [onItemReorder] or [onItemAdd] is needed,\n  /// and this should be left null. [onItemReorder] or [onItemAdd] will be\n  /// called after this.\n  final ItemTargetOnAccept? itemTargetOnAccept;\n\n  /// Called when an item dragging is starting or ending\n  final OnItemDraggingChanged? onItemDraggingChanged;\n\n  /// Width of a list item when it is being dragged.\n  final double? itemDraggingWidth;\n\n  /// The widget that will be displayed at a potential drop position in a list\n  /// when an item is being dragged.\n  final Function(Widget)? itemGhost;\n\n  /// The opacity of the [itemGhost]. This must be between 0 and 1.\n  final double itemGhostOpacity;\n\n  /// If true, drag an item after doing a long press. If false, drag immediately.\n  final bool itemDragOnLongPress;\n\n  /// The decoration surrounding an item while it is in the process of being dragged.\n  final Decoration? itemDecorationWhileDragging;\n\n  /// A widget that will be displayed between each individual item.\n  final Widget? itemDivider;\n\n  /// The width of a list when dragging.\n  final double? listDraggingWidth;\n\n  /// The widget to be displayed as the last element in the DragAndDropLists,\n  /// where a list will be accepted as the last list.\n  final Widget? listTarget;\n\n  /// The widget to be displayed at a potential list position while a list is being dragged.\n  /// This must not be null when [children] includes one or more\n  /// [DragAndDropListExpansion] or other class that inherit from [DragAndDropListExpansionInterface].\n  final Widget? listGhost;\n\n  /// The opacity of [listGhost]. It must be between 0 and 1.\n  final double listGhostOpacity;\n\n  /// Whether a list should be dragged on a long or short press.\n  /// When true, the list will be dragged after a long press.\n  /// When false, it will be dragged immediately.\n  final bool listDragOnLongPress;\n\n  /// The decoration surrounding a list.\n  final Decoration? listDecoration;\n\n  /// The decoration surrounding a list while it is in the process of being dragged.\n  final Decoration? listDecorationWhileDragging;\n\n  /// The decoration surrounding the inner list of items.\n  final Decoration? listInnerDecoration;\n\n  /// A widget that will be displayed between each individual list.\n  final Widget? listDivider;\n\n  /// Whether it should put a divider on the last list or not.\n  final bool listDividerOnLastChild;\n\n  /// The padding between each individual list.\n  final EdgeInsets? listPadding;\n\n  /// A widget that will be displayed whenever a list contains no items.\n  final Widget? contentsWhenEmpty;\n\n  /// A widget that will be displayed on top, as a header\n  final Widget? headerWidget;\n\n  /// The width of each individual list. This must be set to a finite value when\n  /// [axis] is set to Axis.horizontal.\n  final double listWidth;\n\n  /// The height of the target for the last item in a list. This should be large\n  /// enough to easily drag an item into the last position of a list.\n  final double lastItemTargetHeight;\n\n  /// Add the same height as the lastItemTargetHeight to the top of the list.\n  /// This is useful when setting the [listInnerDecoration] to maintain visual\n  /// continuity between the top and the bottom\n  final bool addLastItemTargetHeightToTop;\n\n  /// The height of the target for the last list. This should be large\n  /// enough to easily drag a list to the last position in the DragAndDropLists.\n  final double lastListTargetSize;\n\n  /// The default vertical alignment of list contents.\n  final CrossAxisAlignment verticalAlignment;\n\n  /// The default horizontal alignment of list contents.\n  final MainAxisAlignment horizontalAlignment;\n\n  /// Determines whether the DragAndDropLists are displayed in a horizontal or\n  /// vertical manner.\n  /// Set [axis] to Axis.vertical for vertical arrangement of the lists.\n  /// Set [axis] to Axis.horizontal for horizontal arrangement of the lists.\n  /// If [axis] is set to Axis.horizontal, [listWidth] must be set to some finite number.\n  final Axis axis;\n\n  /// Whether or not to return a widget or a sliver-compatible list.\n  /// Set to true if using as a sliver. If true, a [scrollController] must be provided.\n  /// Set to false if using in a widget only.\n  final bool sliverList;\n\n  /// A scroll controller that can be used for the scrolling of the first level lists.\n  /// This must be set if [sliverList] is set to true.\n  final ScrollController? scrollController;\n\n  /// Set to true in order to disable all scrolling of the lists.\n  /// Note: to disable scrolling for sliver lists, it is also necessary in your\n  /// parent CustomScrollView to set physics to NeverScrollableScrollPhysics()\n  final bool disableScrolling;\n\n  /// Set a custom drag handle to use iOS-like handles to drag rather than long\n  /// or short presses\n  final DragHandle? listDragHandle;\n\n  /// Set a custom drag handle to use iOS-like handles to drag rather than long\n  /// or short presses\n  final DragHandle? itemDragHandle;\n\n  /// Offset to shift the dragged item preview\n  final Offset? itemDragOffset;\n\n  /// Constrain the dragging axis in a vertical list to only allow dragging on\n  /// the vertical axis. By default this is set to true. This may be useful to\n  /// disable when setting customDragTargets\n  final bool constrainDraggingAxis;\n\n  /// If you put a widget before DragAndDropLists there's an unexpected padding\n  /// before the list renders. This is the default behaviour for ListView which\n  /// is used internally. To remove the padding, set this field to true\n  /// https://github.com/flutter/flutter/issues/14842#issuecomment-371344881\n  final bool removeTopPadding;\n\n  DragAndDropLists({\n    required this.children,\n    required this.onItemReorder,\n    required this.onListReorder,\n    this.onItemAdd,\n    this.onListAdd,\n    this.onListDraggingChanged,\n    this.listOnWillAccept,\n    this.listOnAccept,\n    this.listTargetOnWillAccept,\n    this.listTargetOnAccept,\n    this.onItemDraggingChanged,\n    this.itemOnWillAccept,\n    this.itemOnAccept,\n    this.itemTargetOnWillAccept,\n    this.itemTargetOnAccept,\n    this.itemDraggingWidth,\n    this.itemGhost,\n    this.itemGhostOpacity = 0.3,\n    this.itemDragOnLongPress = true,\n    this.itemDecorationWhileDragging,\n    this.itemDivider,\n    this.listDraggingWidth,\n    this.listTarget,\n    this.listGhost,\n    this.listGhostOpacity = 0.3,\n    this.listDragOnLongPress = true,\n    this.listDecoration,\n    this.listDecorationWhileDragging,\n    this.listInnerDecoration,\n    this.listDivider,\n    this.listDividerOnLastChild = true,\n    this.listPadding,\n    this.contentsWhenEmpty,\n    this.headerWidget,\n    this.listWidth = double.infinity,\n    this.lastItemTargetHeight = 20,\n    this.addLastItemTargetHeightToTop = false,\n    this.lastListTargetSize = 110,\n    this.verticalAlignment = CrossAxisAlignment.start,\n    this.horizontalAlignment = MainAxisAlignment.start,\n    this.axis = Axis.vertical,\n    this.sliverList = false,\n    this.scrollController,\n    this.disableScrolling = false,\n    this.listDragHandle,\n    this.itemDragHandle,\n    this.itemDragOffset,\n    this.constrainDraggingAxis = true,\n    this.removeTopPadding = false,\n    Key? key,\n  }) : super(key: key) {\n    if (listGhost == null &&\n        children.whereType<DragAndDropListExpansionInterface>().isNotEmpty) {\n      throw Exception(\n          'If using DragAndDropListExpansion, you must provide a non-null listGhost');\n    }\n    if (sliverList && scrollController == null) {\n      throw Exception(\n          'A scroll controller must be provided when using sliver lists');\n    }\n    if (axis == Axis.horizontal && listWidth == double.infinity) {\n      throw Exception(\n          'A finite width must be provided when setting the axis to horizontal');\n    }\n    if (axis == Axis.horizontal && sliverList) {\n      throw Exception(\n          'Combining a sliver list with a horizontal list is currently unsupported');\n    }\n  }\n\n  @override\n  State<StatefulWidget> createState() => DragAndDropListsState();\n}\n\nclass DragAndDropListsState extends State<DragAndDropLists> {\n  ScrollController? _scrollController;\n  bool _pointerDown = false;\n  double? _pointerYPosition;\n  double? _pointerXPosition;\n  bool _scrolling = false;\n  //final PageStorageBucket _pageStorageBucket = PageStorageBucket();\n\n  @override\n  void initState() {\n    if (widget.scrollController != null) {\n      _scrollController = widget.scrollController;\n    } else {\n      _scrollController = ScrollController();\n    }\n\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var parameters = DragAndDropBuilderParameters(\n      listGhost: widget.listGhost,\n      listGhostOpacity: widget.listGhostOpacity,\n      listDraggingWidth: widget.listDraggingWidth,\n      itemDraggingWidth: widget.itemDraggingWidth,\n      dragOnLongPress: widget.listDragOnLongPress,\n      listPadding: widget.listPadding,\n      onPointerDown: _onPointerDown,\n      onPointerUp: _onPointerUp,\n      onPointerMove: _onPointerMove,\n      onItemReordered: _internalOnItemReorder,\n      onItemDropOnLastTarget: _internalOnItemDropOnLastTarget,\n      onListReordered: _internalOnListReorder,\n      onItemDraggingChanged: widget.onItemDraggingChanged,\n      onListDraggingChanged: widget.onListDraggingChanged,\n      listOnWillAccept: widget.listOnWillAccept,\n      listTargetOnWillAccept: widget.listTargetOnWillAccept,\n      itemOnWillAccept: widget.itemOnWillAccept,\n      itemTargetOnWillAccept: widget.itemTargetOnWillAccept,\n      itemGhostOpacity: widget.itemGhostOpacity,\n      itemDivider: widget.itemDivider,\n      itemDecorationWhileDragging: widget.itemDecorationWhileDragging,\n      verticalAlignment: widget.verticalAlignment,\n      axis: widget.axis,\n      itemGhost: widget.itemGhost,\n      listDecoration: widget.listDecoration,\n      listDecorationWhileDragging: widget.listDecorationWhileDragging,\n      listInnerDecoration: widget.listInnerDecoration,\n      listWidth: widget.listWidth,\n      lastItemTargetHeight: widget.lastItemTargetHeight,\n      addLastItemTargetHeightToTop: widget.addLastItemTargetHeightToTop,\n      listDragHandle: widget.listDragHandle,\n      itemDragHandle: widget.itemDragHandle,\n      itemDragOffset: widget.itemDragOffset,\n      constrainDraggingAxis: widget.constrainDraggingAxis,\n      disableScrolling: widget.disableScrolling,\n    );\n\n    DragAndDropListTarget dragAndDropListTarget = DragAndDropListTarget(\n      parameters: parameters,\n      onDropOnLastTarget: _internalOnListDropOnLastTarget,\n      lastListTargetSize: widget.lastListTargetSize,\n      child: widget.listTarget,\n    );\n\n    if (widget.children.isNotEmpty) {\n      Widget outerListHolder;\n\n      if (widget.sliverList) {\n        outerListHolder = _buildSliverList(dragAndDropListTarget, parameters);\n      } else if (widget.disableScrolling) {\n        outerListHolder =\n            _buildUnscrollableList(dragAndDropListTarget, parameters);\n      } else {\n        outerListHolder = _buildListView(parameters, dragAndDropListTarget);\n      }\n\n      // if (widget.children\n      //     .whereType<DragAndDropListExpansionInterface>()\n      //     .isNotEmpty) {\n      //   outerListHolder = PageStorage(\n      //     bucket: _pageStorageBucket,\n      //     child: outerListHolder,\n      //   );\n      // }\n      return outerListHolder;\n    } else {\n      if (widget.sliverList)\n        return widget.contentsWhenEmpty ?? const Text(\"Empty\");\n      return Column(\n        children: [\n          if (widget.headerWidget != null) widget.headerWidget!,\n          Expanded(\n            child: Center(\n              child: widget.contentsWhenEmpty ?? const Text('Empty'),\n            ),\n          ),\n        ],\n      );\n    }\n  }\n\n  SliverList _buildSliverList(DragAndDropListTarget dragAndDropListTarget,\n      DragAndDropBuilderParameters parameters) {\n    bool includeSeparators = widget.listDivider != null;\n    int childrenCount = _calculateChildrenCount(includeSeparators);\n\n    return SliverList(\n      delegate: SliverChildBuilderDelegate(\n        (context, index) {\n          return _buildInnerList(index, childrenCount, dragAndDropListTarget,\n              includeSeparators, parameters);\n        },\n        childCount: childrenCount,\n      ),\n    );\n  }\n\n  Widget _buildUnscrollableList(DragAndDropListTarget dragAndDropListTarget,\n      DragAndDropBuilderParameters parameters) {\n    if (widget.axis == Axis.vertical) {\n      return Column(\n        children: _buildOuterList(dragAndDropListTarget, parameters),\n      );\n    } else {\n      return Row(\n        children: _buildOuterList(dragAndDropListTarget, parameters),\n      );\n    }\n  }\n\n  Widget _buildListView(DragAndDropBuilderParameters parameters,\n      DragAndDropListTarget dragAndDropListTarget) {\n    Widget listView = ListView(\n      scrollDirection: widget.axis,\n      controller: _scrollController,\n      children: _buildOuterList(dragAndDropListTarget, parameters),\n    );\n\n    return widget.removeTopPadding\n        ? MediaQuery.removePadding(\n            removeTop: true,\n            context: context,\n            child: listView,\n          )\n        : listView;\n  }\n\n  List<Widget> _buildOuterList(DragAndDropListTarget dragAndDropListTarget,\n      DragAndDropBuilderParameters parameters) {\n    bool includeSeparators = widget.listDivider != null;\n    int childrenCount = _calculateChildrenCount(includeSeparators);\n\n    var list = List.generate(childrenCount, (index) {\n      return _buildInnerList(index, childrenCount, dragAndDropListTarget,\n          includeSeparators, parameters);\n    });\n\n    if (widget.headerWidget != null) list.insert(0, widget.headerWidget!);\n    return list;\n  }\n\n  int _calculateChildrenCount(bool includeSeparators) {\n    if (includeSeparators) {\n      return (widget.children.length * 2) -\n          (widget.listDividerOnLastChild ? 0 : 1) +\n          1;\n    } else {\n      return widget.children.length + 1;\n    }\n  }\n\n  Widget _buildInnerList(\n      int index,\n      int childrenCount,\n      DragAndDropListTarget dragAndDropListTarget,\n      bool includeSeparators,\n      DragAndDropBuilderParameters parameters) {\n    if (index == childrenCount - 1) {\n      return dragAndDropListTarget;\n    } else if (includeSeparators && index.isOdd) {\n      return widget.listDivider!;\n    } else {\n      return DragAndDropListWrapper(\n        dragAndDropList:\n            widget.children[(includeSeparators ? index / 2 : index).toInt()],\n        parameters: parameters,\n      );\n    }\n  }\n\n  _internalOnItemReorder(DragAndDropItem reordered, DragAndDropItem receiver) {\n    if (widget.itemOnAccept != null) {\n      widget.itemOnAccept!(reordered, receiver);\n    }\n\n    int reorderedListIndex = -1;\n    int reorderedItemIndex = -1;\n    int receiverListIndex = -1;\n    int receiverItemIndex = -1;\n\n    for (int i = 0; i < widget.children.length; i++) {\n      if (reorderedItemIndex == -1) {\n        reorderedItemIndex =\n            widget.children[i].children!.indexWhere((e) => reordered == e);\n        if (reorderedItemIndex != -1) reorderedListIndex = i;\n      }\n      if (receiverItemIndex == -1) {\n        receiverItemIndex =\n            widget.children[i].children!.indexWhere((e) => receiver == e);\n        if (receiverItemIndex != -1) receiverListIndex = i;\n      }\n      if (reorderedItemIndex != -1 && receiverItemIndex != -1) {\n        break;\n      }\n    }\n\n    if (reorderedItemIndex == -1) {\n      // this is a new item\n      if (widget.onItemAdd != null) {\n        widget.onItemAdd!(reordered, receiverListIndex, receiverItemIndex);\n      }\n    } else {\n      if (reorderedListIndex == receiverListIndex &&\n          receiverItemIndex > reorderedItemIndex) {\n        // same list, so if the new position is after the old position, the removal of the old item must be taken into account\n        receiverItemIndex--;\n      }\n\n      widget.onItemReorder(reorderedItemIndex, reorderedListIndex,\n          receiverItemIndex, receiverListIndex);\n    }\n  }\n\n  _internalOnListReorder(\n      DragAndDropListInterface reordered, DragAndDropListInterface receiver) {\n    int reorderedListIndex = widget.children.indexWhere((e) => reordered == e);\n    int receiverListIndex = widget.children.indexWhere((e) => receiver == e);\n\n    int newListIndex = receiverListIndex;\n\n    if (widget.listOnAccept != null) widget.listOnAccept!(reordered, receiver);\n\n    if (reorderedListIndex == -1) {\n      // this is a new list\n      if (widget.onListAdd != null) widget.onListAdd!(reordered, newListIndex);\n    } else {\n      if (newListIndex > reorderedListIndex) {\n        // same list, so if the new position is after the old position, the removal of the old item must be taken into account\n        newListIndex--;\n      }\n      widget.onListReorder(reorderedListIndex, newListIndex);\n    }\n  }\n\n  _internalOnItemDropOnLastTarget(DragAndDropItem newOrReordered,\n      DragAndDropListInterface parentList, DragAndDropItemTarget receiver) {\n    if (widget.itemTargetOnAccept != null) {\n      widget.itemTargetOnAccept!(newOrReordered, parentList, receiver);\n    }\n\n    int reorderedListIndex = -1;\n    int reorderedItemIndex = -1;\n    int receiverListIndex = -1;\n    int receiverItemIndex = -1;\n\n    if (widget.children.isNotEmpty) {\n      for (int i = 0; i < widget.children.length; i++) {\n        if (reorderedItemIndex == -1) {\n          reorderedItemIndex = widget.children[i].children\n                  ?.indexWhere((e) => newOrReordered == e) ??\n              -1;\n          if (reorderedItemIndex != -1) reorderedListIndex = i;\n        }\n\n        if (receiverItemIndex == -1 && widget.children[i] == parentList) {\n          receiverListIndex = i;\n          receiverItemIndex = widget.children[i].children?.length ?? -1;\n        }\n\n        if (reorderedItemIndex != -1 && receiverItemIndex != -1) {\n          break;\n        }\n      }\n    }\n\n    if (reorderedItemIndex == -1) {\n      if (widget.onItemAdd != null) {\n        widget.onItemAdd!(\n            newOrReordered, receiverListIndex, reorderedItemIndex);\n      }\n    } else {\n      if (reorderedListIndex == receiverListIndex &&\n          receiverItemIndex > reorderedItemIndex) {\n        // same list, so if the new position is after the old position, the removal of the old item must be taken into account\n        receiverItemIndex--;\n      }\n      widget.onItemReorder(reorderedItemIndex, reorderedListIndex,\n          receiverItemIndex, receiverListIndex);\n    }\n  }\n\n  _internalOnListDropOnLastTarget(\n      DragAndDropListInterface newOrReordered, DragAndDropListTarget receiver) {\n    // determine if newOrReordered is new or existing\n    int reorderedListIndex =\n        widget.children.indexWhere((e) => newOrReordered == e);\n\n    if (widget.listOnAccept != null) {\n      widget.listTargetOnAccept!(newOrReordered, receiver);\n    }\n\n    if (reorderedListIndex >= 0) {\n      widget.onListReorder(reorderedListIndex, widget.children.length - 1);\n    } else {\n      if (widget.onListAdd != null) {\n        widget.onListAdd!(newOrReordered, reorderedListIndex);\n      }\n    }\n  }\n\n  _onPointerMove(PointerMoveEvent event) {\n    if (_pointerDown) {\n      _pointerYPosition = event.position.dy;\n      _pointerXPosition = event.position.dx;\n\n      _scrollList();\n    }\n  }\n\n  _onPointerDown(PointerDownEvent event) {\n    _pointerDown = true;\n    _pointerYPosition = event.position.dy;\n    _pointerXPosition = event.position.dx;\n  }\n\n  _onPointerUp(PointerUpEvent event) {\n    _pointerDown = false;\n  }\n\n  final int _duration = 30; // in ms\n  final int _scrollAreaSize = 20;\n  final double _overDragMin = 5.0;\n  final double _overDragMax = 20.0;\n  final double _overDragCoefficient = 3.3;\n\n  _scrollList() async {\n    if (!widget.disableScrolling &&\n        !_scrolling &&\n        _pointerDown &&\n        _pointerYPosition != null &&\n        _pointerXPosition != null) {\n      double? newOffset;\n\n      var rb = context.findRenderObject()!;\n      late Size size;\n      if (rb is RenderBox) {\n        size = rb.size;\n      } else if (rb is RenderSliver) {\n        size = rb.paintBounds.size;\n      }\n\n      var topLeftOffset = localToGlobal(rb, Offset.zero);\n      var bottomRightOffset = localToGlobal(rb, size.bottomRight(Offset.zero));\n\n      if (widget.axis == Axis.vertical) {\n        newOffset = _scrollListVertical(topLeftOffset, bottomRightOffset);\n      } else {\n        var directionality = Directionality.of(context);\n        if (directionality == TextDirection.ltr) {\n          newOffset =\n              _scrollListHorizontalLtr(topLeftOffset, bottomRightOffset);\n        } else {\n          newOffset =\n              _scrollListHorizontalRtl(topLeftOffset, bottomRightOffset);\n        }\n      }\n\n      if (newOffset != null) {\n        _scrolling = true;\n        await _scrollController!.animateTo(newOffset,\n            duration: Duration(milliseconds: _duration), curve: Curves.linear);\n        _scrolling = false;\n        if (_pointerDown) _scrollList();\n      }\n    }\n  }\n\n  double? _scrollListVertical(Offset topLeftOffset, Offset bottomRightOffset) {\n    double top = topLeftOffset.dy;\n    double bottom = bottomRightOffset.dy;\n    double? newOffset;\n\n    var pointerYPosition = _pointerYPosition;\n    var scrollController = _scrollController;\n    if (scrollController != null && pointerYPosition != null) {\n      if (pointerYPosition < (top + _scrollAreaSize) &&\n          scrollController.position.pixels >\n              scrollController.position.minScrollExtent) {\n        final overDrag =\n            max((top + _scrollAreaSize) - pointerYPosition, _overDragMax);\n        newOffset = max(scrollController.position.minScrollExtent,\n            scrollController.position.pixels - overDrag / _overDragCoefficient);\n      } else if (pointerYPosition > (bottom - _scrollAreaSize) &&\n          scrollController.position.pixels <\n              scrollController.position.maxScrollExtent) {\n        final overDrag = max<double>(\n            pointerYPosition - (bottom - _scrollAreaSize), _overDragMax);\n        newOffset = min(scrollController.position.maxScrollExtent,\n            scrollController.position.pixels + overDrag / _overDragCoefficient);\n      }\n    }\n\n    return newOffset;\n  }\n\n  double? _scrollListHorizontalLtr(\n      Offset topLeftOffset, Offset bottomRightOffset) {\n    double left = topLeftOffset.dx;\n    double right = bottomRightOffset.dx;\n    double? newOffset;\n\n    var pointerXPosition = _pointerXPosition;\n    var scrollController = _scrollController;\n    if (scrollController != null && pointerXPosition != null) {\n      if (pointerXPosition < (left + _scrollAreaSize) &&\n          scrollController.position.pixels >\n              scrollController.position.minScrollExtent) {\n        // scrolling toward minScrollExtent\n        final overDrag = min(\n            (left + _scrollAreaSize) - pointerXPosition + _overDragMin,\n            _overDragMax);\n        newOffset = max(scrollController.position.minScrollExtent,\n            scrollController.position.pixels - overDrag / _overDragCoefficient);\n      } else if (pointerXPosition > (right - _scrollAreaSize) &&\n          scrollController.position.pixels <\n              scrollController.position.maxScrollExtent) {\n        // scrolling toward maxScrollExtent\n        final overDrag = min(\n            pointerXPosition - (right - _scrollAreaSize) + _overDragMin,\n            _overDragMax);\n        newOffset = min(scrollController.position.maxScrollExtent,\n            scrollController.position.pixels + overDrag / _overDragCoefficient);\n      }\n    }\n\n    return newOffset;\n  }\n\n  double? _scrollListHorizontalRtl(\n      Offset topLeftOffset, Offset bottomRightOffset) {\n    double left = topLeftOffset.dx;\n    double right = bottomRightOffset.dx;\n    double? newOffset;\n\n    var pointerXPosition = _pointerXPosition;\n    var scrollController = _scrollController;\n    if (scrollController != null && pointerXPosition != null) {\n      if (pointerXPosition < (left + _scrollAreaSize) &&\n          scrollController.position.pixels <\n              scrollController.position.maxScrollExtent) {\n        // scrolling toward maxScrollExtent\n        final overDrag = min(\n            (left + _scrollAreaSize) - pointerXPosition + _overDragMin,\n            _overDragMax);\n        newOffset = min(scrollController.position.maxScrollExtent,\n            scrollController.position.pixels + overDrag / _overDragCoefficient);\n      } else if (pointerXPosition > (right - _scrollAreaSize) &&\n          scrollController.position.pixels >\n              scrollController.position.minScrollExtent) {\n        // scrolling toward minScrollExtent\n        final overDrag = min(\n            pointerXPosition - (right - _scrollAreaSize) + _overDragMin,\n            _overDragMax);\n        newOffset = max(scrollController.position.minScrollExtent,\n            scrollController.position.pixels - overDrag / _overDragCoefficient);\n      }\n    }\n\n    return newOffset;\n  }\n\n  static Offset localToGlobal(RenderObject object, Offset point,\n      {RenderObject? ancestor}) {\n    return MatrixUtils.transformPoint(object.getTransformTo(ancestor), point);\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/drag_handle.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nenum DragHandleVerticalAlignment {\n  top,\n  center,\n  bottom,\n}\n\nclass DragHandle extends StatelessWidget {\n  /// Set the drag handle to be on the left side instead of the default right side\n  final bool onLeft;\n\n  /// Align the list drag handle to the top, center, or bottom\n  final DragHandleVerticalAlignment verticalAlignment;\n\n  /// Child widget to displaying the drag handle\n  final Widget child;\n\n  const DragHandle({\n    Key? key,\n    required this.child,\n    this.onLeft = false,\n    this.verticalAlignment = DragHandleVerticalAlignment.center,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return child;\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/measure_size.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\n\ntypedef OnWidgetSizeChange = void Function(Size? size);\n\nclass MeasureSize extends StatefulWidget {\n  final Widget? child;\n  final OnWidgetSizeChange onSizeChange;\n\n  const MeasureSize({\n    Key? key,\n    required this.onSizeChange,\n    required this.child,\n  }) : super(key: key);\n\n  @override\n  State createState() => _MeasureSizeState();\n}\n\nclass _MeasureSizeState extends State<MeasureSize> {\n  @override\n  Widget build(BuildContext context) {\n    SchedulerBinding.instance.addPostFrameCallback(postFrameCallback);\n    return Container(\n      key: widgetKey,\n      child: widget.child,\n    );\n  }\n\n  var widgetKey = GlobalKey();\n  Size? oldSize;\n  var topLeftPosition = Offset.zero;\n\n  void postFrameCallback(_) {\n    var context = widgetKey.currentContext;\n    if (context == null) return;\n\n    var newSize = context.size;\n    if (oldSize != newSize) {\n      widget.onSizeChange(newSize);\n      oldSize = newSize;\n    }\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/lib/programmatic_expansion_tile.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\n\nconst Duration _kExpand = Duration(milliseconds: 200);\n\n/// A single-line [ListTile] with a trailing button that expands or collapses\n/// the tile to reveal or hide the [children].\n///\n/// This widget is typically used with [ListView] to create an\n/// \"expand / collapse\" list entry. When used with scrolling widgets like\n/// [ListView], a unique [PageStorageKey] must be specified to enable the\n/// [ProgrammaticExpansionTile] to save and restore its expanded state when it is scrolled\n/// in and out of view.\n///\n/// See also:\n///\n///  * [ListTile], useful for creating expansion tile [children] when the\n///    expansion tile represents a sublist.\n///  * The \"Expand/collapse\" section of\n///    <https://material.io/guidelines/components/lists-controls.html>.\nclass ProgrammaticExpansionTile extends StatefulWidget {\n  /// Creates a single-line [ListTile] with a trailing button that expands or collapses\n  /// the tile to reveal or hide the [children]. The [initiallyExpanded] property must\n  /// be non-null.\n  const ProgrammaticExpansionTile({\n    required Key key,\n    required this.listKey,\n    this.leading,\n    required this.title,\n    this.subtitle,\n    this.isThreeLine = false,\n    this.titleColor,\n    this.titleColorExpanded,\n    this.itemsBackgroundColor = Colors.grey,\n    this.onExpansionChanged,\n    this.children = const <Widget>[],\n    this.trailing,\n    this.initiallyExpanded = false,\n    this.disableTopAndBottomBorders = false,\n  }) : super(key: key);\n\n  final Key listKey;\n\n  /// A widget to display before the title.\n  ///\n  /// Typically a [CircleAvatar] widget.\n  final Widget? leading;\n\n  /// The primary content of the list item.\n  ///\n  /// Typically a [Text] widget.\n  final Widget? title;\n\n  /// Additional content displayed below the title.\n  ///\n  /// Typically a [Text] widget.\n  final Widget? subtitle;\n\n  /// Additional content displayed below the title.\n  ///\n  /// Typically a [Text] widget.\n  final bool isThreeLine;\n\n  /// Called when the tile expands or collapses.\n  ///\n  /// When the tile starts expanding, this function is called with the value\n  /// true. When the tile starts collapsing, this function is called with\n  /// the value false.\n  final ValueChanged<bool>? onExpansionChanged;\n\n  /// The widgets that are displayed when the tile expands.\n  ///\n  /// Typically [ListTile] widgets.\n  final List<Widget?> children;\n\n  /// The color to display behind the sublist when expanded.\n  final Color? titleColor;\n\n  final Color? titleColorExpanded;\n\n  final Color itemsBackgroundColor;\n\n  /// A widget to display instead of a rotating arrow icon.\n  final Widget? trailing;\n\n  /// Specifies if the list tile is initially expanded (true) or collapsed (false, the default).\n  final bool initiallyExpanded;\n\n  /// Disable to borders displayed at the top and bottom when expanded\n  final bool disableTopAndBottomBorders;\n\n  @override\n  ProgrammaticExpansionTileState createState() =>\n      ProgrammaticExpansionTileState();\n}\n\nclass ProgrammaticExpansionTileState extends State<ProgrammaticExpansionTile>\n    with SingleTickerProviderStateMixin {\n  static final Animatable<double> _easeOutTween =\n      CurveTween(curve: Curves.easeOut);\n  static final Animatable<double> _easeInTween =\n      CurveTween(curve: Curves.easeIn);\n  static final Animatable<double> _halfTween =\n      Tween<double>(begin: 0.0, end: 0.5);\n\n  final ColorTween _borderColorTween = ColorTween();\n  final ColorTween _headerColorTween = ColorTween();\n  final ColorTween _iconColorTween = ColorTween();\n  final ColorTween _titleColorTween = ColorTween();\n\n  late AnimationController _controller;\n  late Animation<double> _iconTurns;\n  late Animation<double> _heightFactor;\n  late Animation<Color?> _borderColor;\n  late Animation<Color?> _headerColor;\n  late Animation<Color?> _iconColor;\n  late Animation<Color?> _titleColor;\n\n  bool _isExpanded = false;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(duration: _kExpand, vsync: this);\n    _heightFactor = _controller.drive(_easeInTween);\n    _iconTurns = _controller.drive(_halfTween.chain(_easeInTween));\n    _borderColor = _controller.drive(_borderColorTween.chain(_easeOutTween));\n    _headerColor = _controller.drive(_headerColorTween.chain(_easeInTween));\n    _iconColor = _controller.drive(_iconColorTween.chain(_easeInTween));\n    _titleColor = _controller.drive(_titleColorTween.chain(_easeOutTween));\n\n    _isExpanded = PageStorage.of(context)\n            .readState(context, identifier: widget.listKey) as bool? ??\n        widget.initiallyExpanded;\n    if (_isExpanded) _controller.value = 1.0;\n\n    // Schedule the notification that widget has changed for after init\n    // to ensure that the parent widget maintains the correct state\n    SchedulerBinding.instance.addPostFrameCallback((Duration duration) {\n      if (widget.onExpansionChanged != null &&\n          _isExpanded != widget.initiallyExpanded) {\n        widget.onExpansionChanged!(_isExpanded);\n      }\n    });\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void expand() {\n    _setExpanded(true);\n  }\n\n  void collapse() {\n    _setExpanded(false);\n  }\n\n  void toggle() {\n    _setExpanded(!_isExpanded);\n  }\n\n  void _setExpanded(bool expanded) {\n    if (_isExpanded != expanded) {\n      setState(() {\n        _isExpanded = expanded;\n        if (_isExpanded) {\n          _controller.forward();\n        } else {\n          _controller.reverse().then<void>((void value) {\n            if (!mounted) return;\n            setState(() {\n              // Rebuild without widget.children.\n            });\n          });\n        }\n\n        PageStorage.of(context)\n            .writeState(context, _isExpanded, identifier: widget.listKey);\n      });\n      if (widget.onExpansionChanged != null) {\n        widget.onExpansionChanged!(_isExpanded);\n      }\n    }\n  }\n\n  Widget _buildChildren(BuildContext context, Widget? child) {\n    final Color borderSideColor = _borderColor.value ?? Colors.transparent;\n    bool setBorder = !widget.disableTopAndBottomBorders;\n\n    return Container(\n      decoration: BoxDecoration(\n        //color: _titleColor.value ?? Colors.transparent,\n        border: setBorder\n            ? Border(\n                top: BorderSide(color: borderSideColor),\n                bottom: BorderSide(color: borderSideColor),\n              )\n            : null,\n      ),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: <Widget>[\n          ListTileTheme.merge(\n            iconColor: _iconColor.value,\n            textColor: _headerColor.value,\n            //Need this container to set the color because\n            //ListTile tileColor has render bugs\n            child: Container(\n              color: _titleColor.value,\n              child: ListTile(\n                contentPadding: const EdgeInsets.only(left: 16, right: 0),\n                onTap: toggle,\n                leading: widget.leading ??\n                    RotationTransition(\n                      turns: _iconTurns,\n                      child: const Icon(Icons.expand_more),\n                    ),\n                minLeadingWidth: 0,\n                title: widget.title,\n                subtitle: widget.subtitle,\n                isThreeLine: widget.isThreeLine,\n                trailing: widget.trailing,\n              ),\n            ),\n          ),\n          ClipRect(\n            child: Align(\n              heightFactor: _heightFactor.value,\n              child:\n                  Container(color: widget.itemsBackgroundColor, child: child),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  void didChangeDependencies() {\n    final ThemeData theme = Theme.of(context);\n    _borderColorTween.end = theme.dividerColor;\n    _headerColorTween\n      ..begin = theme.textTheme.titleMedium!.color\n      ..end = theme.colorScheme.secondary;\n    _iconColorTween\n      ..begin = theme.unselectedWidgetColor\n      ..end = theme.colorScheme.secondary;\n    _titleColorTween\n      ..begin = widget.titleColor\n      ..end = widget.titleColorExpanded;\n    super.didChangeDependencies();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final bool closed = !_isExpanded && _controller.isDismissed;\n    return AnimatedBuilder(\n      animation: _controller.view,\n      builder: _buildChildren,\n      child: closed ? null : Column(children: widget.children as List<Widget>),\n    );\n  }\n}\n"
  },
  {
    "path": "plugins/drag_and_drop_list/pubspec.yaml",
    "content": "name: drag_and_drop_lists\ndescription: A flutter package to allow drag-and-drop reordering of two-level lists.\nversion: 0.3.3\nhomepage: https://github.com/philip-brink/DragAndDropLists\n\nenvironment:\n  sdk: '>=2.17.0 <3.0.0'\n  flutter: '>=3.0.0'\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # To add assets to your package, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  #\n  # For details regarding assets in packages, see\n  # https://flutter.dev/assets-and-images/#from-packages\n  #\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # To add custom fonts to your package, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts in packages, see\n  # https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "plugins/drag_and_drop_list/test/drag_and_drop_lists_test.dart",
    "content": "import 'package:flutter_test/flutter_test.dart';\n\n//import 'package:drag_and_drop_lists/drag_and_drop_lists.dart';\n\nvoid main() {\n  test('adds one to input values', () {\n//    final calculator = Calculator();\n//    expect(calculator.addOne(2), 3);\n//    expect(calculator.addOne(-7), -6);\n//    expect(calculator.addOne(0), 1);\n//    expect(() => calculator.addOne(null), throwsNoSuchMethodError);\n  });\n}\n"
  },
  {
    "path": "plugins/file_picker/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.\n/pubspec.lock\n**/doc/api/\n.dart_tool/\n.packages\nbuild/\n"
  },
  {
    "path": "plugins/file_picker/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled.\n\nversion:\n  revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n  channel: stable\n\nproject_type: plugin\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n      base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n    - platform: android\n      create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n      base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n    - platform: ios\n      create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n      base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "plugins/file_picker/CHANGELOG.md",
    "content": "## 0.0.1\n\n* TODO: Describe initial release.\n"
  },
  {
    "path": "plugins/file_picker/LICENSE",
    "content": "TODO: Add your license here.\n"
  },
  {
    "path": "plugins/file_picker/README.md",
    "content": "# file_picker\n\nA new Flutter plugin project.\n\n## Getting Started\n\nThis project is a starting point for a Flutter\n[plug-in package](https://flutter.dev/developing-packages/),\na specialized package that includes platform-specific implementation code for\nAndroid and/or iOS.\n\nFor help getting started with Flutter development, view the\n[online documentation](https://flutter.dev/docs), which offers tutorials,\nsamples, guidance on mobile development, and a full API reference.\n\n"
  },
  {
    "path": "plugins/file_picker/analysis_options.yaml",
    "content": "include: package:flutter_lints/flutter.yaml\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "plugins/file_picker/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.cxx\n"
  },
  {
    "path": "plugins/file_picker/android/build.gradle",
    "content": "group 'com.example.file_picker'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    ext.kotlin_version = '1.6.10'\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:7.1.2'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 31\n\n    namespace 'com.example.file_picker'\n    \n    kotlinOptions {\n        jvmTarget = \"17\"\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    defaultConfig {\n        minSdkVersion 16\n    }\n}\n"
  },
  {
    "path": "plugins/file_picker/android/settings.gradle",
    "content": "rootProject.name = 'file_picker'\n"
  },
  {
    "path": "plugins/file_picker/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.file_picker\">\n</manifest>\n"
  },
  {
    "path": "plugins/file_picker/android/src/main/kotlin/com/example/file_picker/FilePickerPlugin.kt",
    "content": "package com.example.file_picker\n\nimport androidx.annotation.NonNull\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler\nimport io.flutter.plugin.common.MethodChannel.Result\n\n/** FilePickerPlugin */\nclass FilePickerPlugin: FlutterPlugin, MethodCallHandler {\n  /// The MethodChannel that will the communication between Flutter and native Android\n  ///\n  /// This local reference serves to register the plugin with the Flutter Engine and unregister it\n  /// when the Flutter Engine is detached from the Activity\n  private lateinit var channel : MethodChannel\n\n  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {\n    channel = MethodChannel(flutterPluginBinding.binaryMessenger, \"file_picker\")\n    channel.setMethodCallHandler(this)\n  }\n\n  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {\n    if (call.method == \"getPlatformVersion\") {\n      result.success(\"Android ${android.os.Build.VERSION.RELEASE}\")\n    } else {\n      result.notImplemented()\n    }\n  }\n\n  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {\n    channel.setMethodCallHandler(null)\n  }\n}\n"
  },
  {
    "path": "plugins/file_picker/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/ephemeral/\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "plugins/file_picker/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/file_picker/ios/Classes/FilePickerPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface FilePickerPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/file_picker/ios/Classes/FilePickerPlugin.m",
    "content": "#import \"FilePickerPlugin.h\"\n#if __has_include(<file_picker/file_picker-Swift.h>)\n#import <file_picker/file_picker-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"file_picker-Swift.h\"\n#endif\n\n@implementation FilePickerPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftFilePickerPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "plugins/file_picker/ios/Classes/SwiftFilePickerPlugin.swift",
    "content": "import Flutter\nimport UIKit\n\npublic class SwiftFilePickerPlugin: NSObject, FlutterPlugin, UIDocumentPickerDelegate {\n  var documentPicker: UIDocumentPickerViewController?\n  var result: FlutterResult?\n  var fileContents: String?\n  var isExporting = false\n\n  public static func register(with registrar: FlutterPluginRegistrar) {\n    let channel = FlutterMethodChannel(name: \"file_picker\", binaryMessenger: registrar.messenger())\n    let instance = SwiftFilePickerPlugin()\n    registrar.addMethodCallDelegate(instance, channel: channel)\n  }\n\n  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n    self.result = result\n    \n    if (call.method == \"saveToFile\") {\n        if let args = call.arguments as? [String: Any], let contents = args[\"fileContents\"] as? String, let fileName = args[\"fileName\"] as? String {\n            self.fileContents = contents\n            openDocumentPicker(fileName: fileName)\n        } else {\n            result(FlutterError(code: \"INVALID_ARGUMENTS\", message: \"Invalid arguments\", details: nil))\n        }\n    } else if (call.method == \"readFile\") {\n        readDocument(result: result)\n    } else {\n        result(FlutterMethodNotImplemented)\n    }\n  }\n\n  func openDocumentPicker(fileName: String) {\n    isExporting = true\n    DispatchQueue.main.async {\n        \n        guard let jsonData = self.fileContents?.data(using: .utf8) else {\n            print(\"Error converting string to data\")\n            return\n        }\n        let tempDirectoryURL = FileManager.default.temporaryDirectory\n\n        let fileURL = tempDirectoryURL.appendingPathComponent(fileName).appendingPathExtension(\"nuxpreset\")\n\n        do {\n            try jsonData.write(to: fileURL)\n        } catch {\n            print(\"Error writing JSON data: \\(error)\")\n            return\n        }\n\n        let documentPicker = UIDocumentPickerViewController(urls: [fileURL], in: .moveToService)\n        documentPicker.delegate = self\n\n        UIApplication.shared.keyWindow?.rootViewController?.present(documentPicker, animated: true, completion: nil)\n    }\n  }\n\n  private func readDocument(result: @escaping FlutterResult) {\n    isExporting = false\n    let documentPicker = UIDocumentPickerViewController(documentTypes: [\"public.json\", \"com.tuntori.nuxpreset\"], in: .import)\n    documentPicker.delegate = self\n    documentPicker.modalPresentationStyle = .formSheet\n    UIApplication.shared.keyWindow?.rootViewController?.present(documentPicker, animated: true)\n  }\n\n  public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {\n    if isExporting == false {\n        let fileURL = urls[0]\n        let fileData: Data\n        do {\n            fileData = try Data(contentsOf: fileURL)\n            let fileContents = String(data: fileData, encoding: .utf8)\n            result?(fileContents)\n        } catch {\n            print(\"Error reading file: \\(error.localizedDescription)\")\n            result?(FlutterError(code: \"ERROR\", message: error.localizedDescription, details: nil))\n        }\n    }\n  }\n\n\n  public func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {\n    self.result?(false)\n  }\n}\n"
  },
  {
    "path": "plugins/file_picker/ios/file_picker.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint file_picker.podspec` to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'file_picker'\n  s.version          = '0.0.1'\n  s.summary          = 'A new Flutter plugin project.'\n  s.description      = <<-DESC\nA new Flutter plugin project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.dependency 'Flutter'\n  s.platform = :ios, '9.0'\n\n  # Flutter.framework does not contain a i386 slice.\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }\n  s.swift_version = '5.0'\nend\n"
  },
  {
    "path": "plugins/file_picker/lib/file_picker.dart",
    "content": "import 'file_picker_platform_interface.dart';\n\nclass FilePicker {\n  Future<String?> readFile() {\n    return FilePickerPlatform.instance.readFile();\n  }\n\n  Future saveFile(String fileName, String fileContents) {\n    return FilePickerPlatform.instance.saveFile(fileName, fileContents);\n  }\n}\n"
  },
  {
    "path": "plugins/file_picker/lib/file_picker_method_channel.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\n\nimport 'file_picker_platform_interface.dart';\n\n/// An implementation of [FilePickerPlatform] that uses method channels.\nclass MethodChannelFilePicker extends FilePickerPlatform {\n  /// The method channel used to interact with the native platform.\n  @visibleForTesting\n  final methodChannel = const MethodChannel('file_picker');\n\n  @override\n  Future<String?> readFile() async {\n    final data = await methodChannel.invokeMethod<String>('readFile');\n    return data;\n  }\n\n  @override\n  Future saveFile(String fileName, String fileContents) async {\n    final version = await methodChannel\n        .invokeMethod<String>('saveToFile', {\n          'fileName':fileName,\n          'fileContents': fileContents});\n    return version;\n  }\n}\n"
  },
  {
    "path": "plugins/file_picker/lib/file_picker_platform_interface.dart",
    "content": "import 'package:plugin_platform_interface/plugin_platform_interface.dart';\n\nimport 'file_picker_method_channel.dart';\n\nabstract class FilePickerPlatform extends PlatformInterface {\n  /// Constructs a FilePickerPlatform.\n  FilePickerPlatform() : super(token: _token);\n\n  static final Object _token = Object();\n\n  static FilePickerPlatform _instance = MethodChannelFilePicker();\n\n  /// The default instance of [FilePickerPlatform] to use.\n  ///\n  /// Defaults to [MethodChannelFilePicker].\n  static FilePickerPlatform get instance => _instance;\n\n  /// Platform-specific implementations should set this with their own\n  /// platform-specific class that extends [FilePickerPlatform] when\n  /// they register themselves.\n  static set instance(FilePickerPlatform instance) {\n    PlatformInterface.verifyToken(instance, _token);\n    _instance = instance;\n  }\n\n  Future<String?> readFile() {\n    throw UnimplementedError('readFile() has not been implemented.');\n  }\n\n  Future saveFile(String fileName, String fileContents) {\n    throw UnimplementedError('saveFile() has not been implemented.');\n  }\n}\n"
  },
  {
    "path": "plugins/file_picker/pubspec.yaml",
    "content": "name: file_picker\ndescription: A new Flutter plugin project.\nversion: 0.0.1\nhomepage:\n\nenvironment:\n  sdk: '>=2.18.4 <3.0.0'\n  flutter: \">=2.5.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  plugin_platform_interface: ^2.0.2\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^2.0.0\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter packages.\nflutter:\n  # This section identifies this Flutter project as a plugin project.\n  # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.)\n  # which should be registered in the plugin registry. This is required for\n  # using method channels.\n  # The Android 'package' specifies package in which the registered class is.\n  # This is required for using method channels on Android.\n  # The 'ffiPlugin' specifies that native code should be built and bundled.\n  # This is required for using `dart:ffi`.\n  # All these are used by the tooling to maintain consistency when\n  # adding or updating assets for this project.\n  plugin:\n    platforms:\n      android:\n        package: com.example.file_picker\n        pluginClass: FilePickerPlugin\n      ios:\n        pluginClass: FilePickerPlugin\n\n  # To add assets to your plugin package, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  #\n  # For details regarding assets in packages, see\n  # https://flutter.dev/assets-and-images/#from-packages\n  #\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware\n\n  # To add custom fonts to your plugin package, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts in packages, see\n  # https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "plugins/flutter_blue_plus/CHANGELOG.md",
    "content": "## 1.4.0\n* Android: Add clear gatt cache method #142 (thanks to joistaus)\n* Android: Opt-out of the `neverForLocation` permission flag for the `BLUETOOTH_SCAN` permission. (thanks to navaronbracke)\n\n  If `neverForLocation` is desired,\n  opt back into the old behavior by adding an explicit entry to your Android Manifest:\n  ```\n  <uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"\n    android:usesPermissionFlags=\"neverForLocation\" />\n  ```\n* Android: Scan BLE long range -devices #139 (thanks to jonik-dev)\n* Android: Prevent deprecation warnings #107 (thanks to sqcsabbey)\n* Allow native implementation to handle pairing request #109 (thanks to JRazek)\n\n## 1.3.1\n* Reverted: Ios: fixed manufacturer data parsing #104 (thanks to sqcsabbey)\n\n## 1.3.0\n* Ios: fixed manufacturer data parsing #104 (thanks to sqcsabbey)\n* Ios: Fixed an error when calling the connect method of a connected device #106 (thanks to figureai)\n* Android: Scan Filter by Mac Address #57 (thanks to  Zyr00)\n* Upgrading to linter 2.0.1, excluding generated ProtoBuf files from linting. (thanks to MrCsabaToth)\n\n## 1.2.0\n* connect timeout fixed (thanks to crazy-rodney, sophisticode, SkuggaEdward, MousyBusiness and cthurston)\n* Add timestamp field to ScanResult class #59 (thanks to simon-iversen)\n* Add FlutterBlue.name to get the human readable device name #93 (thanks to mvo5)\n* Fix bug where if there were multiple subscribers to FlutterBlue.state and one cancelled it would accidentally cancel all subscribers (thank to MacMalainey and MrCsabaToth)\n\n## 1.1.3\n* Read RSSI from a connected BLE device #1 (thanks to sophisticode)\n* Fixed a crash on Android OS 12 (added check for BLUETOOTH_CONNECT permission) (fixed by dspells)\n* Added BluetoothDevice constructor from id (MAC address) (thanks to tanguypouriel)\n* The previous version wasn't disconnecting properly and the device could be still connected under the hood as the cancel() was not called. (fixed by killalad)\n* dependencies update (min micro version updating)\n\n## 1.1.2\n* Remove connect to BLE device after BLE device has disconnected #11 (fixed by sophisticode)\n* fixed Dart Analysis warnings\n\n## 1.1.1\n* Copyright reverted to Paul DeMarco\n\n## 1.1.0\n\n* Possible crash fix caused by wrong raw data (fixed by narrit)\n* Ios : try reconnect on unexpected disconnection (fixed by EB-Plum)\n* Android: Add missing break in switch, which causes exceptions (fixed by russelltg)\n* Android: Enforcing maxSdkVersion on the ACCESS_FINE_LOCATION permission will create issues for Android 12 devices that use location for purposes other than Bluetooth (such as using packages that actually need location). (fixed by rickcasson)\n\n## 1.0.0\n\n* First public release\n\n## Versions made while fixing bugs in fork https://github.com/boskokg/flutter_blue:\n\n## 0.12.0\n\nSupporting Android 12 Bluetooth permissions. #940\n\n## 0.12.0\n\nDelay Bluetooth permission & turn-on-Bluetooth system popups on iOS #964\n\n## 0.11.0\n\nThe timeout was throwing out of the Future's scope #941\nExpose onValueChangedStream #882\nAndroid: removed V1Embedding\nAndroid: removed graddle.properties\nAndroid: enable background usage\nAndroid: cannot handle devices that do not set CCCD_ID (2902) includes BLUNO #185 #797\nAndroid: add method for getting bonded devices #586\nIos: remove support only for x86_64 simulators\nIos: Don't initialize CBCentralManager until needed #599\n\n## 0.10.0\n\nmtuRequest returns the negotiated MTU\nAndroid: functions to turn on/off bluetooth\nAndroid: add null check if channel is already teared down\nAndroid: code small refactoring (fixed AS warnings)\nAndroid: add null check if channel is already teared down\nIos: widen protobuf version allowed\n\n## 0.9.0\n\nAndroid migrate to mavenCentral.\nAndroid support build on Macs M1\nAndroid protobuf-gradle-plugin:0.8.15 -> 0.8.17\nIos example upgrade to latest flutter 2.5\ndeprecated/removed widgets fixed in example\n"
  },
  {
    "path": "plugins/flutter_blue_plus/LICENSE",
    "content": "Copyright 2021 Bosko Popovic. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Buffalo PC Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "plugins/flutter_blue_plus/README.md",
    "content": "[![pub package](https://img.shields.io/pub/v/flutter_blue_plus.svg)](https://pub.dartlang.org/packages/flutter_blue_plus)\n\n<br>\n<p align=\"center\">\n<img alt=\"FlutterBlue\" src=\"https://github.com/boskokg/flutter_blue_plus/blob/master/site/flutterblue.png?raw=true\" />\n</p>\n<br><br>\n\n## Introduction\n\nFlutterBluePlus is a bluetooth plugin for [Flutter](https://flutter.dev), a new app SDK to help developers build modern multi-platform apps. Note: this plugin is continuous work from FlutterBlue since maintaince stoped.\n\n## Alpha version\n\n**This package must be tested on a real device.**\n\n## Cross-Platform Bluetooth LE\nFlutterBluePlus aims to offer the most from both platforms (iOS and Android).\n\nUsing the FlutterBluePlus instance, you can scan for and connect to nearby devices ([BluetoothDevice](#bluetoothdevice-api)).\nOnce connected to a device, the BluetoothDevice object can discover services ([BluetoothService](lib/src/bluetooth_service.dart)), characteristics ([BluetoothCharacteristic](lib/src/bluetooth_characteristic.dart)), and descriptors ([BluetoothDescriptor](lib/src/bluetooth_descriptor.dart)).\nThe BluetoothDevice object is then used to directly interact with characteristics and descriptors.\n\n## Usage\n### Obtain an instance\n```dart\nFlutterBluePlus flutterBlue = FlutterBluePlus.instance;\n```\n\n### Scan for devices\n```dart\n// Start scanning\nflutterBlue.startScan(timeout: Duration(seconds: 4));\n\n// Listen to scan results\nvar subscription = flutterBlue.scanResults.listen((results) {\n    // do something with scan results\n    for (ScanResult r in results) {\n        print('${r.device.name} found! rssi: ${r.rssi}');\n    }\n});\n\n// Stop scanning\nflutterBlue.stopScan();\n```\n\n### Connect to a device\n```dart\n// Connect to the device\nawait device.connect();\n\n// Disconnect from device\ndevice.disconnect();\n```\n\n### Discover services\n```dart\nList<BluetoothService> services = await device.discoverServices();\nservices.forEach((service) {\n    // do something with service\n});\n```\n\n### Read and write characteristics\n```dart\n// Reads all characteristics\nvar characteristics = service.characteristics;\nfor(BluetoothCharacteristic c in characteristics) {\n    List<int> value = await c.read();\n    print(value);\n}\n\n// Writes to a characteristic\nawait c.write([0x12, 0x34])\n```\n\n### Read and write descriptors\n```dart\n// Reads all descriptors\nvar descriptors = characteristic.descriptors;\nfor(BluetoothDescriptor d in descriptors) {\n    List<int> value = await d.read();\n    print(value);\n}\n\n// Writes to a descriptor\nawait d.write([0x12, 0x34])\n```\n\n### Set notifications and listen to changes\n```dart\nawait characteristic.setNotifyValue(true);\ncharacteristic.value.listen((value) {\n    // do something with new value\n});\n```\n\n### Read the MTU and request larger size\n```dart\nfinal mtu = await device.mtu.first;\nawait device.requestMtu(512);\n```\nNote that iOS will not allow requests of MTU size, and will always try to negotiate the highest possible MTU (iOS supports up to MTU size 185)\n\n## Getting Started\n### Change the minSdkVersion for Android\n\nflutter_blue_plus is compatible only from version 19 of Android SDK so you should change this in **android/app/build.gradle**:\n```dart\nAndroid {\n  defaultConfig {\n     minSdkVersion: 19\n```\n### Add permissions for Bluetooth\nWe need to add the permission to use Bluetooth and access location:\n\n#### **Android**\nIn the **android/app/src/main/AndroidManifest.xml** let’s add:\n\n```xml \n\t <uses-permission android:name=\"android.permission.BLUETOOTH\" />  \n\t <uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />  \n\t <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>  \n <application\n```\n#### **IOS**\nIn the **ios/Runner/Info.plist** let’s add:\n\n```dart \n\t<dict>  \n\t    <key>NSBluetoothAlwaysUsageDescription</key>  \n\t    <string>Need BLE permission</string>  \n\t    <key>NSBluetoothPeripheralUsageDescription</key>  \n\t    <string>Need BLE permission</string>  \n\t    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>  \n\t    <string>Need Location permission</string>  \n\t    <key>NSLocationAlwaysUsageDescription</key>  \n\t    <string>Need Location permission</string>  \n\t    <key>NSLocationWhenInUseUsageDescription</key>  \n\t    <string>Need Location permission</string>\n```\n\nFor location permissions on iOS see more at: [https://developer.apple.com/documentation/corelocation/requesting_authorization_for_location_services](https://developer.apple.com/documentation/corelocation/requesting_authorization_for_location_services)\n\n\n## Reference\n### FlutterBlue API\n|                  |      Android       |         iOS          |             Description            |\n| :--------------- | :----------------: | :------------------: |  :-------------------------------- |\n| scan             | :white_check_mark: |  :white_check_mark:  | Starts a scan for Bluetooth Low Energy devices. |\n| state            | :white_check_mark: |  :white_check_mark:  | Stream of state changes for the Bluetooth Adapter. |\n| isAvailable      | :white_check_mark: |  :white_check_mark:  | Checks whether the device supports Bluetooth. |\n| isOn             | :white_check_mark: |  :white_check_mark:  | Checks if Bluetooth functionality is turned on. |\n\n### BluetoothDevice API\n|                             |       Android        |         iOS          |             Description            |\n| :-------------------------- | :------------------: | :------------------: |  :-------------------------------- |\n| connect                     |  :white_check_mark:  |  :white_check_mark:  | Establishes a connection to the device. |\n| disconnect                  |  :white_check_mark:  |  :white_check_mark:  | Cancels an active or pending connection to the device. |\n| discoverServices            |  :white_check_mark:  |  :white_check_mark:  | Discovers services offered by the remote device as well as their characteristics and descriptors. |\n| services                    |  :white_check_mark:  |  :white_check_mark:  | Gets a list of services. Requires that discoverServices() has completed. |\n| state                       |  :white_check_mark:  |  :white_check_mark:  | Stream of state changes for the Bluetooth Device. |\n| mtu                         |  :white_check_mark:  |  :white_check_mark:  | Stream of mtu size changes. |\n| requestMtu                  |  :white_check_mark:  |                      | Request to change the MTU for the device. |\n| readRssi                    |  :white_check_mark:  |  :white_check_mark:  | Read RSSI from a connected device. |\n\n### BluetoothCharacteristic API\n|                             |       Android        |         iOS          |             Description            |\n| :-------------------------- | :------------------: | :------------------: |  :-------------------------------- |\n| read                        |  :white_check_mark:  |  :white_check_mark:  | Retrieves the value of the characteristic.  |\n| write                       |  :white_check_mark:  |  :white_check_mark:  | Writes the value of the characteristic. |\n| setNotifyValue              |  :white_check_mark:  |  :white_check_mark:  | Sets notifications or indications on the characteristic. |\n| value                       |  :white_check_mark:  |  :white_check_mark:  | Stream of characteristic's value when changed. |\n\n### BluetoothDescriptor API\n|                             |       Android        |         iOS          |             Description            |\n| :-------------------------- | :------------------: | :------------------: |  :-------------------------------- |\n| read                        |  :white_check_mark:  |  :white_check_mark:  | Retrieves the value of the descriptor.  |\n| write                       |  :white_check_mark:  |  :white_check_mark:  | Writes the value of the descriptor. |\n\n## Troubleshooting\n### When I scan using a service UUID filter, it doesn't find any devices.\nMake sure the device is advertising which service UUID's it supports.  This is found in the advertisement\npacket as **UUID 16 bit complete list** or **UUID 128 bit complete list**.\n"
  },
  {
    "path": "plugins/flutter_blue_plus/analysis_options.yaml",
    "content": "include: package:flutter_lints/flutter.yaml\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n\nanalyzer:\n  exclude:\n    - /**.pbjson.dart\n    - /**.pb.dart\n    - /**.pbenum.dart\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/build.gradle",
    "content": "group 'com.boskokg.flutter_blue_plus'\nversion '1.0'\n\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:8.0.2'\n        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.1'\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'com.google.protobuf'\n\nandroid {\n    compileSdkVersion 34\n    namespace 'com.boskokg.flutter_blue_plus'\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    defaultConfig {\n        minSdkVersion 19\n    }\n    sourceSets {\n        main {\n            proto {\n                srcDir '../protos'\n            }\n        }\n    }\n}\n\nprotobuf {\n    protoc {\n        if (project.hasProperty('protoc_platform')) {\n            artifact = \"com.google.protobuf:protoc:3.18.0:${protoc_platform}\"\n        } else {\n            artifact = \"com.google.protobuf:protoc:3.18.0\"\n        }\n    }\n    generateProtoTasks {\n        all().each { task ->\n            task.builtins {\n                java {\n                    option \"lite\"\n                }\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation 'com.google.protobuf:protobuf-javalite:3.18.0'\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/settings.gradle",
    "content": "rootProject.name = 'flutter_blue_plus'\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.boskokg.flutter_blue_plus\">\n\n    <!-- New Bluetooth permissions in Android 12\n           https://developer.android.com/about/versions/12/features/bluetooth-permissions\n      -->\n    <uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" />\n    <uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" />\n\n    <!-- Request legacy Bluetooth permissions on older devices. -->\n    <uses-permission android:name=\"android.permission.BLUETOOTH\" android:maxSdkVersion=\"30\" />\n    <uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" android:maxSdkVersion=\"30\" />\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n</manifest>\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/src/main/java/com/boskokg/flutter_blue_plus/AdvertisementParser.java",
    "content": "// Copyright 2022, the Flutter project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.boskokg.flutter_blue_plus;\n\nimport com.google.protobuf.ByteString;\nimport com.boskokg.flutter_blue_plus.Protos.AdvertisementData;\n\nimport java.io.UnsupportedEncodingException;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.util.UUID;\n\n/**\n * Parser of Bluetooth Advertisement packets.\n */\nclass AdvertisementParser {\n\n  /**\n   * Parses packet data into {@link AdvertisementData} structure.\n   *\n   * @param rawData The scan record data.\n   * @return An AdvertisementData proto object.\n   * @throws ArrayIndexOutOfBoundsException if the input is truncated.\n   */\n  static AdvertisementData parse(byte[] rawData) {\n    ByteBuffer data = ByteBuffer.wrap(rawData).asReadOnlyBuffer().order(ByteOrder.LITTLE_ENDIAN);\n    AdvertisementData.Builder ret = AdvertisementData.newBuilder();\n    boolean seenLongLocalName = false;\n    do {\n      int length = data.get() & 0xFF;\n      if (length == 0) {\n        break;\n      }\n      if (length > data.remaining()) {\n        throw new ArrayIndexOutOfBoundsException(\"Not enough data.\");\n      }\n\n      int type = data.get() & 0xFF;\n      length--;\n\n      switch (type) {\n        case 0x08: // Short local name.\n        case 0x09: { // Long local name.\n          if (seenLongLocalName) {\n            // Prefer the long name over the short.\n            data.position(data.position() + length);\n            break;\n          }\n          byte[] name = new byte[length];\n          data.get(name);\n          try {\n            ret.setLocalName(new String(name, \"UTF-8\"));\n          } catch (UnsupportedEncodingException e) {\n            throw new RuntimeException(e);\n          }\n          if (type == 0x09) {\n            seenLongLocalName = true;\n          }\n          break;\n        }\n        case 0x0A: { // Power level.\n          ret.setTxPowerLevel(Protos.Int32Value.newBuilder().setValue(data.get()));\n          break;\n        }\n        case 0x16: // Service Data with 16 bit UUID.\n        case 0x20: // Service Data with 32 bit UUID.\n        case 0x21: { // Service Data with 128 bit UUID.\n          UUID uuid;\n          int remainingDataLength = 0;\n          if (type == 0x16 || type == 0x20) {\n            long uuidValue;\n            if (type == 0x16) {\n              uuidValue = data.getShort() & 0xFFFF;\n              remainingDataLength = length - 2;\n            } else {\n              uuidValue = data.getInt() & 0xFFFFFFFF;\n              remainingDataLength = length - 4;\n            }\n            uuid = UUID.fromString(String.format(\"%08x-0000-1000-8000-00805f9b34fb\", uuidValue));\n          } else {\n            long msb = data.getLong();\n            long lsb = data.getLong();\n            uuid = new UUID(msb, lsb);\n            remainingDataLength = length - 16;\n          }\n          byte[] remainingData = new byte[remainingDataLength];\n          data.get(remainingData);\n          ret.putServiceData(uuid.toString(), ByteString.copyFrom(remainingData));\n          break;\n        }\n        case 0xFF: {// Manufacturer specific data.\n          if(length < 2) {\n            throw new ArrayIndexOutOfBoundsException(\"Not enough data for Manufacturer specific data.\");\n          }\n          int manufacturerId = data.getShort();\n          if((length - 2) > 0) {\n            byte[] msd = new byte[length - 2];\n            data.get(msd);\n            ret.putManufacturerData(manufacturerId, ByteString.copyFrom(msd));\n          }\n          break;\n        }\n        default: {\n          data.position(data.position() + length);\n          break;\n        }\n      }\n    } while (true);\n    return ret.build();\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/src/main/java/com/boskokg/flutter_blue_plus/FlutterBluePlusPlugin.java",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npackage com.boskokg.flutter_blue_plus;\n\nimport android.Manifest;\nimport android.annotation.TargetApi;\nimport android.app.Application;\nimport android.bluetooth.BluetoothAdapter;\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothGatt;\nimport android.bluetooth.BluetoothGattCallback;\nimport android.bluetooth.BluetoothGattCharacteristic;\nimport android.bluetooth.BluetoothGattDescriptor;\nimport android.bluetooth.BluetoothGattService;\nimport android.bluetooth.BluetoothManager;\nimport android.bluetooth.BluetoothProfile;\nimport android.bluetooth.le.BluetoothLeScanner;\nimport android.bluetooth.le.ScanCallback;\nimport android.bluetooth.le.ScanFilter;\nimport android.bluetooth.le.ScanResult;\nimport android.bluetooth.le.ScanSettings;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.os.ParcelUuid;\nimport android.util.Log;\n\nimport com.google.protobuf.ByteString;\nimport com.google.protobuf.InvalidProtocolBufferException;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.UUID;\n\nimport java.lang.reflect.Method;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.RequiresApi;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin;\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware;\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;\nimport io.flutter.plugin.common.BinaryMessenger;\nimport io.flutter.plugin.common.EventChannel;\nimport io.flutter.plugin.common.EventChannel.EventSink;\nimport io.flutter.plugin.common.EventChannel.StreamHandler;\nimport io.flutter.plugin.common.MethodCall;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler;\nimport io.flutter.plugin.common.MethodChannel.Result;\nimport io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener;\n\npublic class FlutterBluePlusPlugin implements FlutterPlugin, MethodCallHandler, RequestPermissionsResultListener, ActivityAware {\n\n  private static final String TAG = \"FlutterBluePlugin\";\n  private final Object initializationLock = new Object();\n  private final Object tearDownLock = new Object();\n  private Context context;\n  private MethodChannel channel;\n  private static final String NAMESPACE = \"flutter_blue_plus\";\n\n  private EventChannel stateChannel;\n  private BluetoothManager mBluetoothManager;\n  private BluetoothAdapter mBluetoothAdapter;\n\n  private FlutterPluginBinding pluginBinding;\n  private ActivityPluginBinding activityBinding;\n\n  static final private UUID CCCD_ID = UUID.fromString(\"00002902-0000-1000-8000-00805f9b34fb\");\n  private final Map<String, BluetoothDeviceCache> mDevices = new HashMap<>();\n  private LogLevel logLevel = LogLevel.EMERGENCY;\n\n  private interface OperationOnPermission {\n    void op(boolean granted, String permission);\n  }\n\n  private int lastEventId = 1452;\n  private final Map<Integer, OperationOnPermission> operationsOnPermission = new HashMap<>();\n\n  private final ArrayList<String> macDeviceScanned = new ArrayList<>();\n  private boolean allowDuplicates = false;\n\n  public FlutterBluePlusPlugin() {}\n\n  @Override\n  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {\n    Log.d(TAG, \"onAttachedToEngine\");\n    pluginBinding = flutterPluginBinding;\n    setup(pluginBinding.getBinaryMessenger(),\n            (Application) pluginBinding.getApplicationContext());\n  }\n\n  @Override\n  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {\n    Log.d(TAG, \"onDetachedFromEngine\");\n    pluginBinding = null;\n    tearDown();\n  }\n\n  @Override\n  public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {\n    Log.d(TAG, \"onAttachedToActivity\");\n    activityBinding = binding;\n    activityBinding.addRequestPermissionsResultListener(this);\n  }\n\n  @Override\n  public void onDetachedFromActivityForConfigChanges() {\n    Log.d(TAG, \"onDetachedFromActivityForConfigChanges\");\n    onDetachedFromActivity();\n  }\n\n  @Override\n  public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {\n    Log.d(TAG, \"onReattachedToActivityForConfigChanges\");\n    onAttachedToActivity(binding);\n  }\n\n  @Override\n  public void onDetachedFromActivity() {\n    Log.d(TAG, \"onDetachedFromActivity\");\n    activityBinding.removeRequestPermissionsResultListener(this);\n    activityBinding = null;\n  }\n\n  private void setup(\n          final BinaryMessenger messenger,\n          final Application application) {\n    synchronized (initializationLock) {\n      Log.d(TAG, \"setup\");\n      this.context = application;\n      channel = new MethodChannel(messenger, NAMESPACE + \"/methods\");\n      channel.setMethodCallHandler(this);\n      stateChannel = new EventChannel(messenger, NAMESPACE + \"/state\");\n      stateChannel.setStreamHandler(stateHandler);\n      mBluetoothManager = (BluetoothManager) application.getSystemService(Context.BLUETOOTH_SERVICE);\n      mBluetoothAdapter = mBluetoothManager.getAdapter();\n    }\n  }\n\n  private void tearDown() {\n    synchronized (tearDownLock) {\n      Log.d(TAG, \"teardown\");\n      context = null;\n      channel.setMethodCallHandler(null);\n      channel = null;\n      stateChannel.setStreamHandler(null);\n      stateChannel = null;\n      mBluetoothAdapter = null;\n      mBluetoothManager = null;\n    }\n  }\n\n  @Override\n  public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n    OperationOnPermission operation = operationsOnPermission.get(requestCode);\n    if (operation != null && grantResults.length > 0) {\n      operation.op(grantResults[0] == PackageManager.PERMISSION_GRANTED, permissions[0]);\n      return true;\n    }\n    return false;\n  }\n\n  @Override\n  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {\n    if(mBluetoothAdapter == null && !\"isAvailable\".equals(call.method)) {\n      result.error(\"bluetooth_unavailable\", \"the device does not have bluetooth\", null);\n      return;\n    }\n\n    switch (call.method) {\n      case \"setLogLevel\":\n      {\n        int logLevelIndex = (int)call.arguments;\n        logLevel = LogLevel.values()[logLevelIndex];\n        result.success(null);\n        break;\n      }\n\n      case \"state\":\n      {\n        Protos.BluetoothState.Builder p = Protos.BluetoothState.newBuilder();\n        try {\n          switch(mBluetoothAdapter.getState()) {\n            case BluetoothAdapter.STATE_OFF:\n              p.setState(Protos.BluetoothState.State.OFF);\n              break;\n            case BluetoothAdapter.STATE_ON:\n              p.setState(Protos.BluetoothState.State.ON);\n              break;\n            case BluetoothAdapter.STATE_TURNING_OFF:\n              p.setState(Protos.BluetoothState.State.TURNING_OFF);\n              break;\n            case BluetoothAdapter.STATE_TURNING_ON:\n              p.setState(Protos.BluetoothState.State.TURNING_ON);\n              break;\n            default:\n              p.setState(Protos.BluetoothState.State.UNKNOWN);\n              break;\n          }\n        } catch (SecurityException e) {\n          p.setState(Protos.BluetoothState.State.UNAUTHORIZED);\n        }\n        result.success(p.build().toByteArray());\n        break;\n      }\n\n      case \"isAvailable\":\n      {\n        result.success(mBluetoothAdapter != null);\n        break;\n      }\n\n      case \"isOn\":\n      {\n        result.success(mBluetoothAdapter.isEnabled());\n        break;\n      }\n\n      case \"name\":\n      {\n        String name = mBluetoothAdapter.getName();\n        if (name == null)\n          name = \"\";\n        result.success(name);\n        break;\n      }\n\n      case \"turnOn\":\n      {\n        if (!mBluetoothAdapter.isEnabled()) {\n          result.success(mBluetoothAdapter.enable());\n        }\n        break;\n      }\n\n      case \"turnOff\":\n      {\n        if (mBluetoothAdapter.isEnabled()) {\n          result.success(mBluetoothAdapter.disable());\n        }\n        break;\n      }\n\n      case \"startScan\":\n      {\n        ensurePermissionBeforeAction(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? Manifest.permission.BLUETOOTH_SCAN : Manifest.permission.ACCESS_FINE_LOCATION, (grantedScan, permissionScan) -> {\n          if (grantedScan) {\n            ensurePermissionBeforeAction(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? Manifest.permission.BLUETOOTH_CONNECT : null, (grantedConnect, permissionConnect) -> {\n              if (grantedConnect)\n                startScan(call, result);\n              else\n                result.error(\n                        \"no_permissions\", String.format(\"flutter_blue plugin requires %s for scanning\", permissionConnect), null);\n            });\n          }\n          else\n            result.error(\n                    \"no_permissions\", String.format(\"flutter_blue plugin requires %s for scanning\", permissionScan), null);\n        });\n        break;\n      }\n\n      case \"stopScan\":\n      {\n        stopScan();\n        result.success(null);\n        break;\n      }\n\n      case \"getConnectedDevices\":\n      {\n        ensurePermissionBeforeAction(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? Manifest.permission.BLUETOOTH_CONNECT : null, (granted, permission) -> {\n          if (!granted) {\n            result.error(\n                    \"no_permissions\", String.format(\"flutter_blue plugin requires %s for obtaining connected devices\", permission), null);\n            return;\n          }\n          List<BluetoothDevice> devices = mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT);\n          Protos.ConnectedDevicesResponse.Builder p = Protos.ConnectedDevicesResponse.newBuilder();\n          for (BluetoothDevice d : devices) {\n            p.addDevices(ProtoMaker.from(d));\n          }\n          result.success(p.build().toByteArray());\n          log(LogLevel.EMERGENCY, \"mDevices size: \" + mDevices.size());\n        });\n        break;\n      }\n\n      case \"getBondedDevices\":\n      {\n        final Set<BluetoothDevice> bondedDevices = mBluetoothAdapter.getBondedDevices();\n        Protos.ConnectedDevicesResponse.Builder p = Protos.ConnectedDevicesResponse.newBuilder();\n        for (BluetoothDevice d : bondedDevices) {\n          p.addDevices(ProtoMaker.from(d));\n        }\n        result.success(p.build().toByteArray());\n        log(LogLevel.EMERGENCY, \"mDevices size: \" + mDevices.size());\n        break;\n      }\n\n      case \"connect\":\n      {\n        ensurePermissionBeforeAction(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? Manifest.permission.BLUETOOTH_CONNECT : null, (granted, permission) -> {\n          if (!granted) {\n            result.error(\n                    \"no_permissions\", String.format(\"flutter_blue plugin requires %s for new connection\", permission), null);\n            return;\n          }\n          byte[] data = call.arguments();\n          Protos.ConnectRequest options;\n          try {\n            options = Protos.ConnectRequest.newBuilder().mergeFrom(data).build();\n          } catch (InvalidProtocolBufferException e) {\n            result.error(\"RuntimeException\", e.getMessage(), e);\n            return;\n          }\n          String deviceId = options.getRemoteId();\n          BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceId);\n          boolean isConnected = mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT).contains(device);\n\n          // If device is already connected, return error\n          if(mDevices.containsKey(deviceId) && isConnected) {\n            result.error(\"already_connected\", \"connection with device already exists\", null);\n            return;\n          }\n\n          // If device was connected to previously but is now disconnected, attempt a reconnect\n          BluetoothDeviceCache bluetoothDeviceCache = mDevices.get(deviceId);\n          if(bluetoothDeviceCache != null && !isConnected) {\n            if(bluetoothDeviceCache.gatt.connect()){\n              result.success(null);\n            } else {\n              result.error(\"reconnect_error\", \"error when reconnecting to device\", null);\n            }\n            return;\n          }\n\n          // New request, connect and add gattServer to Map\n          BluetoothGatt gattServer;\n          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            gattServer = device.connectGatt(context, options.getAndroidAutoConnect(), mGattCallback, BluetoothDevice.TRANSPORT_LE);\n          } else {\n            gattServer = device.connectGatt(context, options.getAndroidAutoConnect(), mGattCallback);\n          }\n          mDevices.put(deviceId, new BluetoothDeviceCache(gattServer));\n          result.success(null);\n        });\n        break;\n      }\n\n      case \"pair\":\n      {\n        String deviceId = (String)call.arguments;\n        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceId);\n        device.createBond();\n        result.success(null);\n        break;\n      }\n\n      case \"clearGattCache\":\n      {\n        String deviceId = (String)call.arguments;\n        BluetoothDeviceCache cache = mDevices.get(deviceId);\n\n        Boolean hasCleared = false;\n\n        if (cache != null) {\n          BluetoothGatt gattServer = cache.gatt;\n          try {\n            final Method refresh = gattServer.getClass().getMethod(\"refresh\");\n            if (refresh != null){\n              hasCleared = (Boolean) refresh.invoke(gattServer);\n            }\n          }catch (Exception e){\n            Log.d(\"clearGattCache\", e.toString());\n          }\n\n          Log.d(\"clearGattCache\", \"CLEAR GATT CACHE: \" + hasCleared);\n          result.success(null);\n        } else {\n          result.error(\"clearGattCache\", \"no instance of BluetoothGatt, have you connected first?\", null);\n        }\n\n        break;\n      }\n\n      case \"disconnect\":\n      {\n        String deviceId = (String)call.arguments;\n        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceId);\n        BluetoothDeviceCache cache = mDevices.remove(deviceId);\n        if(cache != null) {\n          BluetoothGatt gattServer = cache.gatt;\n          gattServer.disconnect();\n          int state = mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT);\n          if(state == BluetoothProfile.STATE_DISCONNECTED) {\n            gattServer.close();\n          }\n        }\n        result.success(null);\n        break;\n      }\n\n      case \"deviceState\":\n      {\n        String deviceId = (String)call.arguments;\n        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceId);\n        int state = mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT);\n        try {\n          result.success(ProtoMaker.from(device, state).toByteArray());\n        } catch(Exception e) {\n          result.error(\"device_state_error\", e.getMessage(), e);\n        }\n        break;\n      }\n\n      case \"discoverServices\":\n      {\n        String deviceId = (String)call.arguments;\n        try {\n          BluetoothGatt gatt = locateGatt(deviceId);\n          if(gatt.discoverServices()) {\n            result.success(null);\n          } else {\n            result.error(\"discover_services_error\", \"unknown reason\", null);\n          }\n        } catch(Exception e) {\n          result.error(\"discover_services_error\", e.getMessage(), e);\n        }\n        break;\n      }\n\n      case \"services\":\n      {\n        String deviceId = (String)call.arguments;\n        try {\n          BluetoothGatt gatt = locateGatt(deviceId);\n          Protos.DiscoverServicesResult.Builder p = Protos.DiscoverServicesResult.newBuilder();\n          p.setRemoteId(deviceId);\n          for(BluetoothGattService s : gatt.getServices()){\n            p.addServices(ProtoMaker.from(gatt.getDevice(), s, gatt));\n          }\n          result.success(p.build().toByteArray());\n        } catch(Exception e) {\n          result.error(\"get_services_error\", e.getMessage(), e);\n        }\n        break;\n      }\n\n      case \"readCharacteristic\":\n      {\n        byte[] data = call.arguments();\n        Protos.ReadCharacteristicRequest request;\n        try {\n          request = Protos.ReadCharacteristicRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gattServer;\n        BluetoothGattCharacteristic characteristic;\n        try {\n          gattServer = locateGatt(request.getRemoteId());\n          characteristic = locateCharacteristic(gattServer, request.getServiceUuid(), request.getSecondaryServiceUuid(), request.getCharacteristicUuid());\n        } catch(Exception e) {\n          result.error(\"read_characteristic_error\", e.getMessage(), null);\n          return;\n        }\n\n        if(gattServer.readCharacteristic(characteristic)) {\n          result.success(null);\n        } else {\n          result.error(\"read_characteristic_error\", \"unknown reason, may occur if readCharacteristic was called before last read finished.\", null);\n        }\n        break;\n      }\n\n      case \"readDescriptor\":\n      {\n        byte[] data = call.arguments();\n        Protos.ReadDescriptorRequest request;\n        try {\n          request = Protos.ReadDescriptorRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gattServer;\n        BluetoothGattCharacteristic characteristic;\n        BluetoothGattDescriptor descriptor;\n        try {\n          gattServer = locateGatt(request.getRemoteId());\n          characteristic = locateCharacteristic(gattServer, request.getServiceUuid(), request.getSecondaryServiceUuid(), request.getCharacteristicUuid());\n          descriptor = locateDescriptor(characteristic, request.getDescriptorUuid());\n        } catch(Exception e) {\n          result.error(\"read_descriptor_error\", e.getMessage(), null);\n          return;\n        }\n\n        if(gattServer.readDescriptor(descriptor)) {\n          result.success(null);\n        } else {\n          result.error(\"read_descriptor_error\", \"unknown reason, may occur if readDescriptor was called before last read finished.\", null);\n        }\n        break;\n      }\n\n      case \"writeCharacteristic\":\n      {\n        byte[] data = call.arguments();\n        Protos.WriteCharacteristicRequest request;\n        try {\n          request = Protos.WriteCharacteristicRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gattServer;\n        BluetoothGattCharacteristic characteristic;\n        try {\n          gattServer = locateGatt(request.getRemoteId());\n          characteristic = locateCharacteristic(gattServer, request.getServiceUuid(), request.getSecondaryServiceUuid(), request.getCharacteristicUuid());\n        } catch(Exception e) {\n          result.error(\"write_characteristic_error\", e.getMessage(), null);\n          return;\n        }\n\n        // Set characteristic to new value\n        if(!characteristic.setValue(request.getValue().toByteArray())){\n          result.error(\"write_characteristic_error\", \"could not set the local value of characteristic\", null);\n        }\n\n        // Apply the correct write type\n        if(request.getWriteType() == Protos.WriteCharacteristicRequest.WriteType.WITHOUT_RESPONSE) {\n          characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);\n        } else {\n          characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);\n        }\n\n        if(!gattServer.writeCharacteristic(characteristic)){\n          result.error(\"write_characteristic_error\", \"writeCharacteristic failed\", null);\n          return;\n        }\n\n        result.success(null);\n        break;\n      }\n\n      case \"writeDescriptor\":\n      {\n        byte[] data = call.arguments();\n        Protos.WriteDescriptorRequest request;\n        try {\n          request = Protos.WriteDescriptorRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gattServer;\n        BluetoothGattCharacteristic characteristic;\n        BluetoothGattDescriptor descriptor;\n        try {\n          gattServer = locateGatt(request.getRemoteId());\n          characteristic = locateCharacteristic(gattServer, request.getServiceUuid(), request.getSecondaryServiceUuid(), request.getCharacteristicUuid());\n          descriptor = locateDescriptor(characteristic, request.getDescriptorUuid());\n        } catch(Exception e) {\n          result.error(\"write_descriptor_error\", e.getMessage(), null);\n          return;\n        }\n\n        // Set descriptor to new value\n        if(!descriptor.setValue(request.getValue().toByteArray())){\n          result.error(\"write_descriptor_error\", \"could not set the local value for descriptor\", null);\n        }\n\n        if(!gattServer.writeDescriptor(descriptor)){\n          result.error(\"write_descriptor_error\", \"writeCharacteristic failed\", null);\n          return;\n        }\n\n        result.success(null);\n        break;\n      }\n\n      case \"setNotification\":\n      {\n        byte[] data = call.arguments();\n        Protos.SetNotificationRequest request;\n        try {\n          request = Protos.SetNotificationRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gattServer;\n        BluetoothGattCharacteristic characteristic;\n        BluetoothGattDescriptor cccDescriptor;\n        try {\n          gattServer = locateGatt(request.getRemoteId());\n          characteristic = locateCharacteristic(gattServer, request.getServiceUuid(), request.getSecondaryServiceUuid(), request.getCharacteristicUuid());\n          cccDescriptor = characteristic.getDescriptor(CCCD_ID);\n          if(cccDescriptor == null) {\n            //Some devices - including the widely used Bluno do not actually set the CCCD_ID.\n            //thus setNotifications works perfectly (tested on Bluno) without cccDescriptor\n            log(LogLevel.INFO, \"could not locate CCCD descriptor for characteristic: \" + characteristic.getUuid().toString());\n          }\n        } catch(Exception e) {\n          result.error(\"set_notification_error\", e.getMessage(), null);\n          return;\n        }\n\n        byte[] value = null;\n\n        if(request.getEnable()) {\n          boolean canNotify = (characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0;\n          boolean canIndicate = (characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_INDICATE) > 0;\n          if(!canIndicate && !canNotify) {\n            result.error(\"set_notification_error\", \"the characteristic cannot notify or indicate\", null);\n            return;\n          }\n          if(canIndicate) {\n            value = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE;\n          }\n          if(canNotify) {\n            value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE;\n          }\n        } else {\n          value = BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE;\n        }\n\n        if(!gattServer.setCharacteristicNotification(characteristic, request.getEnable())){\n          result.error(\"set_notification_error\", \"could not set characteristic notifications to :\" + request.getEnable(), null);\n          return;\n        }\n\n        if(cccDescriptor != null) {\n          if (!cccDescriptor.setValue(value)) {\n            result.error(\"set_notification_error\", \"error when setting the descriptor value to: \" + Arrays.toString(value), null);\n            return;\n          }\n\n          if (!gattServer.writeDescriptor(cccDescriptor)) {\n            result.error(\"set_notification_error\", \"error when writing the descriptor\", null);\n            return;\n          }\n        }\n\n        result.success(null);\n        break;\n      }\n\n      case \"mtu\":\n      {\n        String deviceId = (String)call.arguments;\n        BluetoothDeviceCache cache = mDevices.get(deviceId);\n        if(cache != null) {\n          Protos.MtuSizeResponse.Builder p = Protos.MtuSizeResponse.newBuilder();\n          p.setRemoteId(deviceId);\n          p.setMtu(cache.mtu);\n          result.success(p.build().toByteArray());\n        } else {\n          result.error(\"mtu\", \"no instance of BluetoothGatt, have you connected first?\", null);\n        }\n        break;\n      }\n\n      case \"requestMtu\":\n      {\n        byte[] data = call.arguments();\n        Protos.MtuSizeRequest request;\n        try {\n          request = Protos.MtuSizeRequest.newBuilder().mergeFrom(data).build();\n        } catch (InvalidProtocolBufferException e) {\n          result.error(\"RuntimeException\", e.getMessage(), e);\n          break;\n        }\n\n        BluetoothGatt gatt;\n        try {\n          gatt = locateGatt(request.getRemoteId());\n          int mtu = request.getMtu();\n          if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            if(gatt.requestMtu(mtu)) {\n              result.success(null);\n            } else {\n              result.error(\"requestMtu\", \"gatt.requestMtu returned false\", null);\n            }\n          } else {\n            result.error(\"requestMtu\", \"Only supported on devices >= API 21 (Lollipop). This device == \" + Build.VERSION.SDK_INT, null);\n          }\n        } catch(Exception e) {\n          result.error(\"requestMtu\", e.getMessage(), e);\n        }\n\n        break;\n      }\n\n      case \"readRssi\":\n      {\n        String remoteId = (String)call.arguments;\n        BluetoothGatt gatt;\n        try {\n          gatt = locateGatt(remoteId);\n          if(gatt.readRemoteRssi()) {\n            result.success(null);\n          } else {\n            result.error(\"readRssi\", \"gatt.readRemoteRssi returned false\", null);\n          }\n        } catch(Exception e) {\n          result.error(\"readRssi\", e.getMessage(), e);\n        }\n\n        break;\n      }\n\n      default:\n      {\n        result.notImplemented();\n        break;\n      }\n    }\n  }\n\n  private void ensurePermissionBeforeAction(String permission, OperationOnPermission operation) {\n    if (permission != null &&\n            ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {\n      operationsOnPermission.put(lastEventId, (granted, perm) -> {\n        operationsOnPermission.remove(lastEventId);\n        operation.op(granted, perm);\n      });\n      ActivityCompat.requestPermissions(\n              activityBinding.getActivity(),\n              new String[]{permission},\n              lastEventId);\n      lastEventId++;\n    } else {\n      operation.op(true, permission);\n    }\n  }\n\n  private BluetoothGatt locateGatt(String remoteId) throws Exception {\n    BluetoothDeviceCache cache = mDevices.get(remoteId);\n    if(cache == null || cache.gatt == null) {\n      throw new Exception(\"no instance of BluetoothGatt, have you connected first?\");\n    } else {\n      return cache.gatt;\n    }\n  }\n\n  private BluetoothGattCharacteristic locateCharacteristic(BluetoothGatt gattServer, String serviceId, String secondaryServiceId, String characteristicId) throws Exception {\n    BluetoothGattService primaryService = gattServer.getService(UUID.fromString(serviceId));\n    if(primaryService == null) {\n      throw new Exception(\"service (\" + serviceId + \") could not be located on the device\");\n    }\n    BluetoothGattService secondaryService = null;\n    if(secondaryServiceId.length() > 0) {\n      for(BluetoothGattService s : primaryService.getIncludedServices()){\n        if(s.getUuid().equals(UUID.fromString(secondaryServiceId))){\n          secondaryService = s;\n        }\n      }\n      if(secondaryService == null) {\n        throw new Exception(\"secondary service (\" + secondaryServiceId + \") could not be located on the device\");\n      }\n    }\n    BluetoothGattService service = (secondaryService != null) ? secondaryService : primaryService;\n    BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString(characteristicId));\n    if(characteristic == null) {\n      throw new Exception(\"characteristic (\" + characteristicId + \") could not be located in the service (\"+service.getUuid().toString()+\")\");\n    }\n    return characteristic;\n  }\n\n  private BluetoothGattDescriptor locateDescriptor(BluetoothGattCharacteristic characteristic, String descriptorId) throws Exception {\n    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(descriptorId));\n    if(descriptor == null) {\n      throw new Exception(\"descriptor (\" + descriptorId + \") could not be located in the characteristic (\"+characteristic.getUuid().toString()+\")\");\n    }\n    return descriptor;\n  }\n\n  private final StreamHandler stateHandler = new StreamHandler() {\n    private EventSink sink;\n\n    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {\n      @Override\n      public void onReceive(Context context, Intent intent) {\n        final String action = intent.getAction();\n\n        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {\n          final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,\n                  BluetoothAdapter.ERROR);\n          switch (state) {\n            case BluetoothAdapter.STATE_OFF:\n              sink.success(Protos.BluetoothState.newBuilder().setState(Protos.BluetoothState.State.OFF).build().toByteArray());\n              break;\n            case BluetoothAdapter.STATE_TURNING_OFF:\n              sink.success(Protos.BluetoothState.newBuilder().setState(Protos.BluetoothState.State.TURNING_OFF).build().toByteArray());\n              break;\n            case BluetoothAdapter.STATE_ON:\n              sink.success(Protos.BluetoothState.newBuilder().setState(Protos.BluetoothState.State.ON).build().toByteArray());\n              break;\n            case BluetoothAdapter.STATE_TURNING_ON:\n              sink.success(Protos.BluetoothState.newBuilder().setState(Protos.BluetoothState.State.TURNING_ON).build().toByteArray());\n              break;\n          }\n        }\n      }\n    };\n\n    @Override\n    public void onListen(Object o, EventChannel.EventSink eventSink) {\n      sink = eventSink;\n      IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);\n      context.registerReceiver(mReceiver, filter);\n    }\n\n    @Override\n    public void onCancel(Object o) {\n      sink = null;\n      context.unregisterReceiver(mReceiver);\n    }\n  };\n\n  private void startScan(MethodCall call, Result result) {\n    byte[] data = call.arguments();\n    Protos.ScanSettings settings;\n    try {\n      settings = Protos.ScanSettings.newBuilder().mergeFrom(data).build();\n      allowDuplicates = settings.getAllowDuplicates();\n      macDeviceScanned.clear();\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n        startScan21(settings);\n      } else {\n        startScan18(settings);\n      }\n      result.success(null);\n    } catch (Exception e) {\n      result.error(\"startScan\", e.getMessage(), e);\n    }\n  }\n\n  private void stopScan() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n      stopScan21();\n    } else {\n      stopScan18();\n    }\n  }\n\n  private ScanCallback scanCallback21;\n\n  @TargetApi(21)\n  private ScanCallback getScanCallback21() {\n    if(scanCallback21 == null){\n      scanCallback21 = new ScanCallback() {\n\n        @Override\n        public void onScanResult(int callbackType, ScanResult result) {\n          super.onScanResult(callbackType, result);\n          if(result != null){\n            if (!allowDuplicates && result.getDevice() != null && result.getDevice().getAddress() != null) {\n              if (macDeviceScanned.contains(result.getDevice().getAddress())) {\n                return;\n              }\n              macDeviceScanned.add(result.getDevice().getAddress());\n            }\n            Protos.ScanResult scanResult = ProtoMaker.from(result.getDevice(), result);\n            invokeMethodUIThread(\"ScanResult\", scanResult.toByteArray());\n          }\n        }\n\n        @Override\n        public void onBatchScanResults(List<ScanResult> results) {\n          super.onBatchScanResults(results);\n\n        }\n\n        @Override\n        public void onScanFailed(int errorCode) {\n          super.onScanFailed(errorCode);\n        }\n      };\n    }\n    return scanCallback21;\n  }\n\n  @TargetApi(21)\n  private void startScan21(Protos.ScanSettings proto) throws IllegalStateException {\n    BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();\n    if(scanner == null) throw new IllegalStateException(\"getBluetoothLeScanner() is null. Is the Adapter on?\");\n    int scanMode = proto.getAndroidScanMode();\n    List<ScanFilter> filters = fetchFilters(proto);\n    ScanSettings settings;\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      settings = new ScanSettings.Builder()\n              .setPhy(ScanSettings.PHY_LE_ALL_SUPPORTED)\n              .setLegacy(false)\n              .setScanMode(scanMode)\n              .build();\n    } else {\n      settings = new ScanSettings.Builder().setScanMode(scanMode).build();\n    }\n    scanner.startScan(filters, settings, getScanCallback21());\n  }\n\n  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)\n  private List<ScanFilter> fetchFilters(Protos.ScanSettings proto) {\n    List<ScanFilter> filters;\n\n    int macCount = proto.getMacAddressesCount();\n    int serviceCount = proto.getServiceUuidsCount();\n    int count = macCount > 0 ? macCount : serviceCount;\n    filters = new ArrayList<>(count);\n\n    for (int i = 0; i < count; i++) {\n      ScanFilter f;\n      if (macCount > 0) {\n        String macAddress = proto.getMacAddresses(i);\n        f = new ScanFilter.Builder().setDeviceAddress(macAddress).build();\n      } else {\n        String uuid = proto.getServiceUuids(i);\n        f = new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(uuid)).build();\n      }\n      filters.add(f);\n    }\n\n    return filters;\n  }\n\n  @TargetApi(21)\n  private void stopScan21() {\n    BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();\n    if(scanner != null) scanner.stopScan(getScanCallback21());\n  }\n\n  private BluetoothAdapter.LeScanCallback scanCallback18;\n\n  private BluetoothAdapter.LeScanCallback getScanCallback18() {\n    if(scanCallback18 == null) {\n      scanCallback18 = (bluetoothDevice, rssi, scanRecord) -> {\n        if (!allowDuplicates && bluetoothDevice != null && bluetoothDevice.getAddress() != null) {\n          if (macDeviceScanned.contains(bluetoothDevice.getAddress())) return;\n          macDeviceScanned.add(bluetoothDevice.getAddress());\n        }\n\n        Protos.ScanResult scanResult = ProtoMaker.from(bluetoothDevice, scanRecord, rssi);\n        invokeMethodUIThread(\"ScanResult\", scanResult.toByteArray());\n      };\n    }\n    return scanCallback18;\n  }\n\n  @SuppressWarnings(\"deprecation\")\n  private void startScan18(Protos.ScanSettings proto) throws IllegalStateException {\n    List<String> serviceUuids = proto.getServiceUuidsList();\n    UUID[] uuids = new UUID[serviceUuids.size()];\n    for(int i = 0; i < serviceUuids.size(); i++) {\n      uuids[i] = UUID.fromString(serviceUuids.get(i));\n    }\n    boolean success = mBluetoothAdapter.startLeScan(uuids, getScanCallback18());\n    if(!success) throw new IllegalStateException(\"getBluetoothLeScanner() is null. Is the Adapter on?\");\n  }\n\n  @SuppressWarnings(\"deprecation\")\n  private void stopScan18() {\n    mBluetoothAdapter.stopLeScan(getScanCallback18());\n  }\n\n  private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {\n    @Override\n    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {\n      log(LogLevel.DEBUG, \"[onConnectionStateChange] status: \" + status + \" newState: \" + newState);\n      if(newState == BluetoothProfile.STATE_DISCONNECTED) {\n        if(!mDevices.containsKey(gatt.getDevice().getAddress())) {\n          gatt.close();\n        }\n      }\n      invokeMethodUIThread(\"DeviceState\", ProtoMaker.from(gatt.getDevice(), newState).toByteArray());\n    }\n\n    @Override\n    public void onServicesDiscovered(BluetoothGatt gatt, int status) {\n      log(LogLevel.DEBUG, \"[onServicesDiscovered] count: \" + gatt.getServices().size() + \" status: \" + status);\n      Protos.DiscoverServicesResult.Builder p = Protos.DiscoverServicesResult.newBuilder();\n      p.setRemoteId(gatt.getDevice().getAddress());\n      for(BluetoothGattService s : gatt.getServices()) {\n        p.addServices(ProtoMaker.from(gatt.getDevice(), s, gatt));\n      }\n      invokeMethodUIThread(\"DiscoverServicesResult\", p.build().toByteArray());\n    }\n\n    @Override\n    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {\n      log(LogLevel.DEBUG, \"[onCharacteristicRead] uuid: \" + characteristic.getUuid().toString() + \" status: \" + status);\n      Protos.ReadCharacteristicResponse.Builder p = Protos.ReadCharacteristicResponse.newBuilder();\n      p.setRemoteId(gatt.getDevice().getAddress());\n      p.setCharacteristic(ProtoMaker.from(gatt.getDevice(), characteristic, gatt));\n      invokeMethodUIThread(\"ReadCharacteristicResponse\", p.build().toByteArray());\n    }\n\n    @Override\n    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {\n      log(LogLevel.DEBUG, \"[onCharacteristicWrite] uuid: \" + characteristic.getUuid().toString() + \" status: \" + status);\n      Protos.WriteCharacteristicRequest.Builder request = Protos.WriteCharacteristicRequest.newBuilder();\n      request.setRemoteId(gatt.getDevice().getAddress());\n      request.setCharacteristicUuid(characteristic.getUuid().toString());\n      request.setServiceUuid(characteristic.getService().getUuid().toString());\n      Protos.WriteCharacteristicResponse.Builder p = Protos.WriteCharacteristicResponse.newBuilder();\n      p.setRequest(request);\n      p.setSuccess(status == BluetoothGatt.GATT_SUCCESS);\n      invokeMethodUIThread(\"WriteCharacteristicResponse\", p.build().toByteArray());\n    }\n\n    @Override\n    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {\n      log(LogLevel.DEBUG, \"[onCharacteristicChanged] uuid: \" + characteristic.getUuid().toString());\n      Protos.OnCharacteristicChanged.Builder p = Protos.OnCharacteristicChanged.newBuilder();\n      p.setRemoteId(gatt.getDevice().getAddress());\n      p.setCharacteristic(ProtoMaker.from(gatt.getDevice(), characteristic, gatt));\n      invokeMethodUIThread(\"OnCharacteristicChanged\", p.build().toByteArray());\n    }\n\n    @Override\n    public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {\n      log(LogLevel.DEBUG, \"[onDescriptorRead] uuid: \" + descriptor.getUuid().toString() + \" status: \" + status);\n      // Rebuild the ReadAttributeRequest and send back along with response\n      Protos.ReadDescriptorRequest.Builder q = Protos.ReadDescriptorRequest.newBuilder();\n      q.setRemoteId(gatt.getDevice().getAddress());\n      q.setCharacteristicUuid(descriptor.getCharacteristic().getUuid().toString());\n      q.setDescriptorUuid(descriptor.getUuid().toString());\n      if(descriptor.getCharacteristic().getService().getType() == BluetoothGattService.SERVICE_TYPE_PRIMARY) {\n        q.setServiceUuid(descriptor.getCharacteristic().getService().getUuid().toString());\n      } else {\n        // Reverse search to find service\n        for(BluetoothGattService s : gatt.getServices()) {\n          for(BluetoothGattService ss : s.getIncludedServices()) {\n            if(ss.getUuid().equals(descriptor.getCharacteristic().getService().getUuid())){\n              q.setServiceUuid(s.getUuid().toString());\n              q.setSecondaryServiceUuid(ss.getUuid().toString());\n              break;\n            }\n          }\n        }\n      }\n      Protos.ReadDescriptorResponse.Builder p = Protos.ReadDescriptorResponse.newBuilder();\n      p.setRequest(q);\n      p.setValue(ByteString.copyFrom(descriptor.getValue()));\n      invokeMethodUIThread(\"ReadDescriptorResponse\", p.build().toByteArray());\n    }\n\n    @Override\n    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {\n      log(LogLevel.DEBUG, \"[onDescriptorWrite] uuid: \" + descriptor.getUuid().toString() + \" status: \" + status);\n      Protos.WriteDescriptorRequest.Builder request = Protos.WriteDescriptorRequest.newBuilder();\n      request.setRemoteId(gatt.getDevice().getAddress());\n      request.setDescriptorUuid(descriptor.getUuid().toString());\n      request.setCharacteristicUuid(descriptor.getCharacteristic().getUuid().toString());\n      request.setServiceUuid(descriptor.getCharacteristic().getService().getUuid().toString());\n      Protos.WriteDescriptorResponse.Builder p = Protos.WriteDescriptorResponse.newBuilder();\n      p.setRequest(request);\n      p.setSuccess(status == BluetoothGatt.GATT_SUCCESS);\n      invokeMethodUIThread(\"WriteDescriptorResponse\", p.build().toByteArray());\n\n      if(descriptor.getUuid().compareTo(CCCD_ID) == 0) {\n        // SetNotificationResponse\n        Protos.SetNotificationResponse.Builder q = Protos.SetNotificationResponse.newBuilder();\n        q.setRemoteId(gatt.getDevice().getAddress());\n        q.setCharacteristic(ProtoMaker.from(gatt.getDevice(), descriptor.getCharacteristic(), gatt));\n        invokeMethodUIThread(\"SetNotificationResponse\", q.build().toByteArray());\n      }\n    }\n\n    @Override\n    public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {\n      log(LogLevel.DEBUG, \"[onReliableWriteCompleted] status: \" + status);\n    }\n\n    @Override\n    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {\n      log(LogLevel.DEBUG, \"[onReadRemoteRssi] rssi: \" + rssi + \" status: \" + status);\n      if(status == BluetoothGatt.GATT_SUCCESS) {\n        Protos.ReadRssiResult.Builder p = Protos.ReadRssiResult.newBuilder();\n        p.setRemoteId(gatt.getDevice().getAddress());\n        p.setRssi(rssi);\n        invokeMethodUIThread(\"ReadRssiResult\", p.build().toByteArray());\n      }\n    }\n\n    @Override\n    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {\n      log(LogLevel.DEBUG, \"[onMtuChanged] mtu: \" + mtu + \" status: \" + status);\n      if(status == BluetoothGatt.GATT_SUCCESS) {\n        if(mDevices.containsKey(gatt.getDevice().getAddress())) {\n          BluetoothDeviceCache cache = mDevices.get(gatt.getDevice().getAddress());\n          if (cache != null) {\n            cache.mtu = mtu;\n          }\n          Protos.MtuSizeResponse.Builder p = Protos.MtuSizeResponse.newBuilder();\n          p.setRemoteId(gatt.getDevice().getAddress());\n          p.setMtu(mtu);\n          invokeMethodUIThread(\"MtuSize\", p.build().toByteArray());\n        }\n      }\n    }\n  };\n\n  private void log(LogLevel level, String message) {\n    if(level.ordinal() <= logLevel.ordinal()) {\n      Log.d(TAG, message);\n    }\n  }\n\n  private void invokeMethodUIThread(final String name, final byte[] byteArray)\n  {\n    new Handler(Looper.getMainLooper()).post(() -> {\n      synchronized (tearDownLock) {\n        //Could already be teared down at this moment\n        if (channel != null) {\n          channel.invokeMethod(name, byteArray);\n        } else {\n          Log.w(TAG, \"Tried to call \" + name + \" on closed channel\");\n        }\n      }\n    });\n  }\n\n  enum LogLevel\n  {\n    EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG\n  }\n\n  // BluetoothDeviceCache contains any other cached information not stored in Android Bluetooth API\n  // but still needed Dart side.\n  static class BluetoothDeviceCache {\n    final BluetoothGatt gatt;\n    int mtu;\n\n    BluetoothDeviceCache(BluetoothGatt gatt) {\n      this.gatt = gatt;\n      mtu = 20;\n    }\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/android/src/main/java/com/boskokg/flutter_blue_plus/ProtoMaker.java",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npackage com.boskokg.flutter_blue_plus;\n\nimport android.annotation.TargetApi;\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothGatt;\nimport android.bluetooth.BluetoothGattCharacteristic;\nimport android.bluetooth.BluetoothGattDescriptor;\nimport android.bluetooth.BluetoothGattService;\nimport android.bluetooth.BluetoothProfile;\nimport android.bluetooth.le.ScanRecord;\nimport android.bluetooth.le.ScanResult;\nimport android.os.Build;\nimport android.os.Parcel;\nimport android.os.ParcelUuid;\nimport android.util.Log;\nimport android.util.SparseArray;\n\nimport com.google.protobuf.ByteString;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\n\n/**\n * Created by bosko on 30/01/22.\n */\n\npublic class ProtoMaker {\n\n    private static final UUID CCCD_UUID = UUID.fromString(\"00002902-0000-1000-8000-00805f9b34fb\");\n\n    static Protos.ScanResult from(BluetoothDevice device, byte[] advertisementData, int rssi) {\n        Protos.ScanResult.Builder p = Protos.ScanResult.newBuilder();\n        p.setDevice(from(device));\n        if(advertisementData != null && advertisementData.length > 0)\n            p.setAdvertisementData(AdvertisementParser.parse(advertisementData));\n        p.setRssi(rssi);\n        return p.build();\n    }\n\n    @TargetApi(21)\n    static Protos.ScanResult from(BluetoothDevice device, ScanResult scanResult) {\n        Protos.ScanResult.Builder p = Protos.ScanResult.newBuilder();\n        p.setDevice(from(device));\n        Protos.AdvertisementData.Builder a = Protos.AdvertisementData.newBuilder();\n        ScanRecord scanRecord = scanResult.getScanRecord();\n        if(Build.VERSION.SDK_INT >= 26) {\n            a.setConnectable(scanResult.isConnectable());\n        } else {\n            if(scanRecord != null) {\n                int flags = scanRecord.getAdvertiseFlags();\n                a.setConnectable((flags & 0x2) > 0);\n            }\n        }\n        if(scanRecord != null) {\n            String deviceName = scanRecord.getDeviceName();\n            if(deviceName != null) {\n                a.setLocalName(deviceName);\n            }\n            int txPower = scanRecord.getTxPowerLevel();\n            if(txPower != Integer.MIN_VALUE) {\n                a.setTxPowerLevel(Protos.Int32Value.newBuilder().setValue(txPower));\n            }\n            // Manufacturer Specific Data\n            SparseArray<byte[]> msd = scanRecord.getManufacturerSpecificData();\n            if(msd != null) {\n                for (int i = 0; i < msd.size(); i++) {\n                    int key = msd.keyAt(i);\n                    byte[] value = msd.valueAt(i);\n                    a.putManufacturerData(key, ByteString.copyFrom(value));\n                }\n            }\n            // Service Data\n            Map<ParcelUuid, byte[]> serviceData = scanRecord.getServiceData();\n            if(serviceData != null) {\n                for (Map.Entry<ParcelUuid, byte[]> entry : serviceData.entrySet()) {\n                    ParcelUuid key = entry.getKey();\n                    byte[] value = entry.getValue();\n                    a.putServiceData(key.getUuid().toString(), ByteString.copyFrom(value));\n                }\n            }\n            // Service UUIDs\n            List<ParcelUuid> serviceUuids = scanRecord.getServiceUuids();\n            if(serviceUuids != null) {\n                for (ParcelUuid s : serviceUuids) {\n                    a.addServiceUuids(s.getUuid().toString());\n                }\n            }\n        }\n        p.setRssi(scanResult.getRssi());\n        p.setAdvertisementData(a.build());\n        return p.build();\n    }\n\n    static Protos.BluetoothDevice from(BluetoothDevice device) {\n        Protos.BluetoothDevice.Builder p = Protos.BluetoothDevice.newBuilder();\n        p.setRemoteId(device.getAddress());\n        String name = device.getName();\n        if(name != null) {\n            p.setName(name);\n        }\n        switch(device.getType()){\n            case BluetoothDevice.DEVICE_TYPE_LE:\n                p.setType(Protos.BluetoothDevice.Type.LE);\n                break;\n            case BluetoothDevice.DEVICE_TYPE_CLASSIC:\n                p.setType(Protos.BluetoothDevice.Type.CLASSIC);\n                break;\n            case BluetoothDevice.DEVICE_TYPE_DUAL:\n                p.setType(Protos.BluetoothDevice.Type.DUAL);\n                break;\n            default:\n                p.setType(Protos.BluetoothDevice.Type.UNKNOWN);\n                break;\n        }\n        return p.build();\n    }\n\n    static Protos.BluetoothService from(BluetoothDevice device, BluetoothGattService service, BluetoothGatt gatt) {\n        Protos.BluetoothService.Builder p = Protos.BluetoothService.newBuilder();\n        p.setRemoteId(device.getAddress());\n        p.setUuid(service.getUuid().toString());\n        p.setIsPrimary(service.getType() == BluetoothGattService.SERVICE_TYPE_PRIMARY);\n        for(BluetoothGattCharacteristic c : service.getCharacteristics()) {\n            p.addCharacteristics(from(device, c, gatt));\n        }\n        for(BluetoothGattService s : service.getIncludedServices()) {\n            p.addIncludedServices(from(device, s, gatt));\n        }\n        return p.build();\n    }\n\n    static Protos.BluetoothCharacteristic from(BluetoothDevice device, BluetoothGattCharacteristic characteristic, BluetoothGatt gatt) {\n        Protos.BluetoothCharacteristic.Builder p = Protos.BluetoothCharacteristic.newBuilder();\n        p.setRemoteId(device.getAddress());\n        p.setUuid(characteristic.getUuid().toString());\n        p.setProperties(from(characteristic.getProperties()));\n        if(characteristic.getValue() != null)\n            p.setValue(ByteString.copyFrom(characteristic.getValue()));\n        for(BluetoothGattDescriptor d : characteristic.getDescriptors()) {\n            p.addDescriptors(from(device, d));\n        }\n        if(characteristic.getService().getType() == BluetoothGattService.SERVICE_TYPE_PRIMARY) {\n            p.setServiceUuid(characteristic.getService().getUuid().toString());\n        } else {\n            // Reverse search to find service\n            for(BluetoothGattService s : gatt.getServices()) {\n                for(BluetoothGattService ss : s.getIncludedServices()) {\n                    if(ss.getUuid().equals(characteristic.getService().getUuid())){\n                        p.setServiceUuid(s.getUuid().toString());\n                        p.setSecondaryServiceUuid(ss.getUuid().toString());\n                        break;\n                    }\n                }\n            }\n        }\n        return p.build();\n    }\n\n    static Protos.BluetoothDescriptor from(BluetoothDevice device, BluetoothGattDescriptor descriptor) {\n        Protos.BluetoothDescriptor.Builder p = Protos.BluetoothDescriptor.newBuilder();\n        p.setRemoteId(device.getAddress());\n        p.setUuid(descriptor.getUuid().toString());\n        p.setCharacteristicUuid(descriptor.getCharacteristic().getUuid().toString());\n        p.setServiceUuid(descriptor.getCharacteristic().getService().getUuid().toString());\n        if(descriptor.getValue() != null)\n            p.setValue(ByteString.copyFrom(descriptor.getValue()));\n        return p.build();\n    }\n\n    static Protos.CharacteristicProperties from(int properties) {\n        return Protos.CharacteristicProperties.newBuilder()\n                .setBroadcast((properties & 1) != 0)\n                .setRead((properties & 2) != 0)\n                .setWriteWithoutResponse((properties & 4) != 0)\n                .setWrite((properties & 8) != 0)\n                .setNotify((properties & 16) != 0)\n                .setIndicate((properties & 32) != 0)\n                .setAuthenticatedSignedWrites((properties & 64) != 0)\n                .setExtendedProperties((properties & 128) != 0)\n                .setNotifyEncryptionRequired((properties & 256) != 0)\n                .setIndicateEncryptionRequired((properties & 512) != 0)\n                .build();\n    }\n\n    static Protos.DeviceStateResponse from(BluetoothDevice device, int state) {\n        Protos.DeviceStateResponse.Builder p = Protos.DeviceStateResponse.newBuilder();\n        switch(state) {\n            case BluetoothProfile.STATE_DISCONNECTING:\n                p.setState(Protos.DeviceStateResponse.BluetoothDeviceState.DISCONNECTING);\n                break;\n            case BluetoothProfile.STATE_CONNECTED:\n                p.setState(Protos.DeviceStateResponse.BluetoothDeviceState.CONNECTED);\n                break;\n            case BluetoothProfile.STATE_CONNECTING:\n                p.setState(Protos.DeviceStateResponse.BluetoothDeviceState.CONNECTING);\n                break;\n            case BluetoothProfile.STATE_DISCONNECTED:\n                p.setState(Protos.DeviceStateResponse.BluetoothDeviceState.DISCONNECTED);\n                break;\n            default:\n                break;\n        }\n        p.setRemoteId(device.getAddress());\n        return p.build();\n    }\n}"
  },
  {
    "path": "plugins/flutter_blue_plus/ios/Classes/FlutterBluePlusPlugin.h",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\n#import <Flutter/Flutter.h>\n#import <CoreBluetooth/CoreBluetooth.h>\n\n#define NAMESPACE @\"flutter_blue_plus\"\n\n@interface FlutterBluePlusPlugin : NSObject<FlutterPlugin, CBCentralManagerDelegate, CBPeripheralDelegate>\n@end\n\n@interface FlutterBluePlusStreamHandler : NSObject<FlutterStreamHandler>\n@property FlutterEventSink sink;\n@end\n"
  },
  {
    "path": "plugins/flutter_blue_plus/ios/Classes/FlutterBluePlusPlugin.m",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\n#import \"FlutterBluePlusPlugin.h\"\n#import \"Flutterblueplus.pbobjc.h\"\n\n@interface CBUUID (CBUUIDAdditionsFlutterBluePlus)\n- (NSString *)fullUUIDString;\n@end\n\n@implementation CBUUID (CBUUIDAdditionsFlutterBluePlus)\n- (NSString *)fullUUIDString {\n  if(self.UUIDString.length == 4) {\n    return [[NSString stringWithFormat:@\"0000%@-0000-1000-8000-00805F9B34FB\", self.UUIDString] lowercaseString];\n  }\n  return [self.UUIDString lowercaseString];\n}\n@end\n\ntypedef NS_ENUM(NSUInteger, LogLevel) {\n  emergency = 0,\n  alert = 1,\n  critical = 2,\n  error = 3,\n  warning = 4,\n  notice = 5,\n  info = 6,\n  debug = 7\n};\n\n@interface FlutterBluePlusPlugin ()\n@property(nonatomic, retain) NSObject<FlutterPluginRegistrar> *registrar;\n@property(nonatomic, retain) FlutterMethodChannel *channel;\n@property(nonatomic, retain) FlutterBluePlusStreamHandler *stateStreamHandler;\n@property(nonatomic, retain) CBCentralManager *centralManager;\n@property(nonatomic) NSMutableDictionary *scannedPeripherals;\n@property(nonatomic) NSMutableArray *servicesThatNeedDiscovered;\n@property(nonatomic) NSMutableArray *characteristicsThatNeedDiscovered;\n@property(nonatomic) LogLevel logLevel;\n@end\n\n@implementation FlutterBluePlusPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  FlutterMethodChannel* channel = [FlutterMethodChannel\n                                   methodChannelWithName:NAMESPACE @\"/methods\"\n                                   binaryMessenger:[registrar messenger]];\n  FlutterEventChannel* stateChannel = [FlutterEventChannel eventChannelWithName:NAMESPACE @\"/state\" binaryMessenger:[registrar messenger]];\n  FlutterBluePlusPlugin* instance = [[FlutterBluePlusPlugin alloc] init];\n  instance.channel = channel;\n  instance.scannedPeripherals = [NSMutableDictionary new];\n  instance.servicesThatNeedDiscovered = [NSMutableArray new];\n  instance.characteristicsThatNeedDiscovered = [NSMutableArray new];\n  instance.logLevel = emergency;\n\n  // STATE\n  FlutterBluePlusStreamHandler* stateStreamHandler = [[FlutterBluePlusStreamHandler alloc] init];\n  [stateChannel setStreamHandler:stateStreamHandler];\n  instance.stateStreamHandler = stateStreamHandler;\n\n  [registrar addMethodCallDelegate:instance channel:channel];\n}\n\n- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {\n  if ([@\"setLogLevel\" isEqualToString:call.method]) {\n    NSNumber *logLevelIndex = [call arguments];\n    _logLevel = (LogLevel)[logLevelIndex integerValue];\n    result(nil);\n    return;\n  }\n  if (self.centralManager == nil) {\n    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];\n  }\n  if ([@\"state\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [self toFlutterData:[self toBluetoothStateProto:self->_centralManager.state]];\n    result(data);\n  } else if([@\"isAvailable\" isEqualToString:call.method]) {\n    if(self.centralManager.state != CBManagerStateUnsupported && self.centralManager.state != CBManagerStateUnknown) {\n      result(@(YES));\n    } else {\n      result(@(NO));\n    }\n  } else if([@\"isOn\" isEqualToString:call.method]) {\n    if(self.centralManager.state == CBManagerStatePoweredOn) {\n      result(@(YES));\n    } else {\n      result(@(NO));\n    }\n  } else if([@\"name\" isEqualToString:call.method]) {\n    result([[UIDevice currentDevice] name]);\n  } else if([@\"startScan\" isEqualToString:call.method]) {\n    // Clear any existing scan results\n    [self.scannedPeripherals removeAllObjects];\n    // TODO: Request Permission?\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosScanSettings *request = [[ProtosScanSettings alloc] initWithData:[data data] error:nil];\n    // UUID Service filter\n    NSArray *uuids = [NSArray array];\n    for (int i = 0; i < [request serviceUuidsArray_Count]; i++) {\n      NSString *u = [request.serviceUuidsArray objectAtIndex:i];\n      uuids = [uuids arrayByAddingObject:[CBUUID UUIDWithString:u]];\n    }\n    NSMutableDictionary<NSString *, id> *scanOpts = [NSMutableDictionary new];\n    if (request.allowDuplicates) {\n        [scanOpts setObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];\n    }\n    [self->_centralManager scanForPeripheralsWithServices:uuids options:scanOpts];\n    result(nil);\n  } else if([@\"stopScan\" isEqualToString:call.method]) {\n    [self->_centralManager stopScan];\n    result(nil);\n  } else if([@\"getConnectedDevices\" isEqualToString:call.method]) {\n    // Cannot pass blank UUID list for security reasons. Assume all devices have the Generic Access service 0x1800\n    NSArray *periphs = [self->_centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:@\"1800\"]]];\n    NSLog(@\"getConnectedDevices periphs size: %lu\", [periphs count]);\n    result([self toFlutterData:[self toConnectedDeviceResponseProto:periphs]]);\n  } else if([@\"connect\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosConnectRequest *request = [[ProtosConnectRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      CBPeripheral *peripheral = [_scannedPeripherals objectForKey:remoteId];\n      if(peripheral == nil) {\n        NSArray *periphs = [self->_centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:@\"1800\"]]];\n        for (CBPeripheral *p in periphs) {\n          NSString *uuid = [[p identifier] UUIDString];\n          p.delegate = self;\n          [_scannedPeripherals setObject:p forKey:uuid];\n        }\n        peripheral = [_scannedPeripherals objectForKey:remoteId];\n      }\n      if(peripheral == nil) {\n        @throw [FlutterError errorWithCode:@\"connect\"\n                                   message:@\"Peripheral not found\"\n                                   details:nil];\n      }\n      // TODO: Implement Connect options (#36)\n      [_centralManager connectPeripheral:peripheral options:nil];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"disconnect\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      [_centralManager cancelPeripheralConnection:peripheral];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"deviceState\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      result([self toFlutterData:[self toDeviceStateProto:peripheral state:peripheral.state]]);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"discoverServices\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Clear helper arrays\n      [_servicesThatNeedDiscovered removeAllObjects];\n      [_characteristicsThatNeedDiscovered removeAllObjects ];\n      [peripheral discoverServices:nil];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"services\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      result([self toFlutterData:[self toServicesResultProto:peripheral]]);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"readCharacteristic\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosReadCharacteristicRequest *request = [[ProtosReadCharacteristicRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      // Find peripheral\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Find characteristic\n      CBCharacteristic *characteristic = [self locateCharacteristic:[request characteristicUuid] peripheral:peripheral serviceId:[request serviceUuid] secondaryServiceId:[request secondaryServiceUuid]];\n      // Trigger a read\n      [peripheral readValueForCharacteristic:characteristic];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"readDescriptor\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosReadDescriptorRequest *request = [[ProtosReadDescriptorRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      // Find peripheral\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Find characteristic\n      CBCharacteristic *characteristic = [self locateCharacteristic:[request characteristicUuid] peripheral:peripheral serviceId:[request serviceUuid] secondaryServiceId:[request secondaryServiceUuid]];\n      // Find descriptor\n      CBDescriptor *descriptor = [self locateDescriptor:[request descriptorUuid] characteristic:characteristic];\n      [peripheral readValueForDescriptor:descriptor];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"writeCharacteristic\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosWriteCharacteristicRequest *request = [[ProtosWriteCharacteristicRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      // Find peripheral\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Find characteristic\n      CBCharacteristic *characteristic = [self locateCharacteristic:[request characteristicUuid] peripheral:peripheral serviceId:[request serviceUuid] secondaryServiceId:[request secondaryServiceUuid]];\n      // Get correct write type\n      CBCharacteristicWriteType type = ([request writeType] == ProtosWriteCharacteristicRequest_WriteType_WithoutResponse) ? CBCharacteristicWriteWithoutResponse : CBCharacteristicWriteWithResponse;\n      // Write to characteristic\n      [peripheral writeValue:[request value] forCharacteristic:characteristic type:type];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"writeDescriptor\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosWriteDescriptorRequest *request = [[ProtosWriteDescriptorRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      // Find peripheral\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Find characteristic\n      CBCharacteristic *characteristic = [self locateCharacteristic:[request characteristicUuid] peripheral:peripheral serviceId:[request serviceUuid] secondaryServiceId:[request secondaryServiceUuid]];\n      // Find descriptor\n      CBDescriptor *descriptor = [self locateDescriptor:[request descriptorUuid] characteristic:characteristic];\n      // Write descriptor\n      [peripheral writeValue:[request value] forDescriptor:descriptor];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"setNotification\" isEqualToString:call.method]) {\n    FlutterStandardTypedData *data = [call arguments];\n    ProtosSetNotificationRequest *request = [[ProtosSetNotificationRequest alloc] initWithData:[data data] error:nil];\n    NSString *remoteId = [request remoteId];\n    @try {\n      // Find peripheral\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      // Find characteristic\n      CBCharacteristic *characteristic = [self locateCharacteristic:[request characteristicUuid] peripheral:peripheral serviceId:[request serviceUuid] secondaryServiceId:[request secondaryServiceUuid]];\n      // Set notification value\n      [peripheral setNotifyValue:[request enable] forCharacteristic:characteristic];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"mtu\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      uint32_t mtu = [self getMtu:peripheral];\n      result([self toFlutterData:[self toMtuSizeResponseProto:peripheral mtu:mtu]]);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else if([@\"requestMtu\" isEqualToString:call.method]) {\n    result([FlutterError errorWithCode:@\"requestMtu\" message:@\"iOS does not allow mtu requests to the peripheral\" details:NULL]);\n  } else if([@\"readRssi\" isEqualToString:call.method]) {\n    NSString *remoteId = [call arguments];\n    @try {\n      CBPeripheral *peripheral = [self findPeripheral:remoteId];\n      [peripheral readRSSI];\n      result(nil);\n    } @catch(FlutterError *e) {\n      result(e);\n    }\n  } else {\n    result(FlutterMethodNotImplemented);\n  }\n}\n\n- (CBPeripheral*)findPeripheral:(NSString*)remoteId {\n  NSArray<CBPeripheral*> *peripherals = [_centralManager retrievePeripheralsWithIdentifiers:@[[[NSUUID alloc] initWithUUIDString:remoteId]]];\n  CBPeripheral *peripheral;\n  for(CBPeripheral *p in peripherals) {\n    if([[p.identifier UUIDString] isEqualToString:remoteId]) {\n      peripheral = p;\n      break;\n    }\n  }\n  if(peripheral == nil) {\n    @throw [FlutterError errorWithCode:@\"findPeripheral\"\n                               message:@\"Peripheral not found\"\n                               details:nil];\n  }\n  return peripheral;\n}\n\n- (CBCharacteristic*)locateCharacteristic:(NSString*)characteristicId peripheral:(CBPeripheral*)peripheral serviceId:(NSString*)serviceId secondaryServiceId:(NSString*)secondaryServiceId {\n  CBService *primaryService = [self getServiceFromArray:serviceId array:[peripheral services]];\n  if(primaryService == nil || [primaryService isPrimary] == false) {\n    @throw [FlutterError errorWithCode:@\"locateCharacteristic\"\n                               message:@\"service could not be located on the device\"\n                               details:nil];\n  }\n  CBService *secondaryService;\n  if(secondaryServiceId.length) {\n    secondaryService = [self getServiceFromArray:secondaryServiceId array:[primaryService includedServices]];\n    @throw [FlutterError errorWithCode:@\"locateCharacteristic\"\n                               message:@\"secondary service could not be located on the device\"\n                               details:secondaryServiceId];\n  }\n  CBService *service = (secondaryService != nil) ? secondaryService : primaryService;\n  CBCharacteristic *characteristic = [self getCharacteristicFromArray:characteristicId array:[service characteristics]];\n  if(characteristic == nil) {\n    @throw [FlutterError errorWithCode:@\"locateCharacteristic\"\n                               message:@\"characteristic could not be located on the device\"\n                               details:nil];\n  }\n  return characteristic;\n}\n\n- (CBDescriptor*)locateDescriptor:(NSString*)descriptorId characteristic:(CBCharacteristic*)characteristic {\n  CBDescriptor *descriptor = [self getDescriptorFromArray:descriptorId array:[characteristic descriptors]];\n  if(descriptor == nil) {\n    @throw [FlutterError errorWithCode:@\"locateDescriptor\"\n                               message:@\"descriptor could not be located on the device\"\n                               details:nil];\n  }\n  return descriptor;\n}\n\n// Reverse search to find primary service\n- (CBService*)findPrimaryService:(CBService*)secondaryService peripheral:(CBPeripheral*)peripheral {\n  for(CBService *s in [peripheral services]) {\n    for(CBService *ss in [s includedServices]) {\n      if([[ss.UUID UUIDString] isEqualToString:[secondaryService.UUID UUIDString]]) {\n        return s;\n      }\n    }\n  }\n  return nil;\n}\n\n- (CBDescriptor*)findCCCDescriptor:(CBCharacteristic*)characteristic {\n  for(CBDescriptor *d in characteristic.descriptors) {\n    if([d.UUID.UUIDString isEqualToString:@\"2902\"]) {\n      return d;\n    }\n  }\n  return nil;\n}\n\n- (CBService*)getServiceFromArray:(NSString*)uuidString array:(NSArray<CBService*>*)array {\n  for(CBService *s in array) {\n    if([[s UUID] isEqual:[CBUUID UUIDWithString:uuidString]]) {\n      return s;\n    }\n  }\n  return nil;\n}\n\n- (CBCharacteristic*)getCharacteristicFromArray:(NSString*)uuidString array:(NSArray<CBCharacteristic*>*)array {\n  for(CBCharacteristic *c in array) {\n    if([[c UUID] isEqual:[CBUUID UUIDWithString:uuidString]]) {\n      return c;\n    }\n  }\n  return nil;\n}\n\n- (CBDescriptor*)getDescriptorFromArray:(NSString*)uuidString array:(NSArray<CBDescriptor*>*)array {\n  for(CBDescriptor *d in array) {\n    if([[d UUID] isEqual:[CBUUID UUIDWithString:uuidString]]) {\n      return d;\n    }\n  }\n  return nil;\n}\n\n//\n// CBCentralManagerDelegate methods\n//\n- (void)centralManagerDidUpdateState:(nonnull CBCentralManager *)central {\n  if(_stateStreamHandler.sink != nil) {\n    FlutterStandardTypedData *data = [self toFlutterData:[self toBluetoothStateProto:self->_centralManager.state]];\n    self.stateStreamHandler.sink(data);\n  }\n}\n\n- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {\n  [self.scannedPeripherals setObject:peripheral\n                              forKey:[[peripheral identifier] UUIDString]];\n  ProtosScanResult *result = [self toScanResultProto:peripheral advertisementData:advertisementData RSSI:RSSI];\n  [_channel invokeMethod:@\"ScanResult\" arguments:[self toFlutterData:result]];\n}\n\n- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {\n  NSLog(@\"didConnectPeripheral\");\n  // Register self as delegate for peripheral\n  peripheral.delegate = self;\n\n  // Send initial mtu size\n  uint32_t mtu = [self getMtu:peripheral];\n  [_channel invokeMethod:@\"MtuSize\" arguments:[self toFlutterData:[self toMtuSizeResponseProto:peripheral mtu:mtu]]];\n\n  // Send connection state\n  [_channel invokeMethod:@\"DeviceState\" arguments:[self toFlutterData:[self toDeviceStateProto:peripheral state:peripheral.state]]];\n}\n\n- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {\n  NSLog(@\"didDisconnectPeripheral\");\n  // Unregister self as delegate for peripheral, not working #42\n  peripheral.delegate = nil;\n\n  // Send connection state\n  [_channel invokeMethod:@\"DeviceState\" arguments:[self toFlutterData:[self toDeviceStateProto:peripheral state:peripheral.state]]];\n}\n\n- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {\n  // TODO:?\n}\n\n//\n// CBPeripheralDelegate methods\n//\n- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {\n  NSLog(@\"didDiscoverServices\");\n  // Send negotiated mtu size\n  uint32_t mtu = [self getMtu:peripheral];\n  [_channel invokeMethod:@\"MtuSize\" arguments:[self toFlutterData:[self toMtuSizeResponseProto:peripheral mtu:mtu]]];\n\n  // Loop through and discover characteristics and secondary services\n  [_servicesThatNeedDiscovered addObjectsFromArray:peripheral.services];\n  for(CBService *s in [peripheral services]) {\n    NSLog(@\"Found service: %@\", [s.UUID UUIDString]);\n    [peripheral discoverCharacteristics:nil forService:s];\n    // [peripheral discoverIncludedServices:nil forService:s]; // Secondary services in the future (#8)\n  }\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {\n  NSLog(@\"didDiscoverCharacteristicsForService\");\n  // Loop through and discover descriptors for characteristics\n  [_servicesThatNeedDiscovered removeObject:service];\n  [_characteristicsThatNeedDiscovered addObjectsFromArray:service.characteristics];\n  for(CBCharacteristic *c in [service characteristics]) {\n    [peripheral discoverDescriptorsForCharacteristic:c];\n  }\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {\n  NSLog(@\"didDiscoverDescriptorsForCharacteristic\");\n  [_characteristicsThatNeedDiscovered removeObject:characteristic];\n  if(_servicesThatNeedDiscovered.count > 0 || _characteristicsThatNeedDiscovered.count > 0) {\n    // Still discovering\n    return;\n  }\n  // Send updated tree\n  ProtosDiscoverServicesResult *result = [self toServicesResultProto:peripheral];\n  [_channel invokeMethod:@\"DiscoverServicesResult\" arguments:[self toFlutterData:result]];\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didDiscoverIncludedServicesForService:(CBService *)service error:(NSError *)error {\n  NSLog(@\"didDiscoverIncludedServicesForService\");\n  // Loop through and discover characteristics for secondary services\n  for(CBService *ss in [service includedServices]) {\n    [peripheral discoverCharacteristics:nil forService:ss];\n  }\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {\n  NSLog(@\"didUpdateValueForCharacteristic %@\", [peripheral.identifier UUIDString]);\n  ProtosReadCharacteristicResponse *result = [[ProtosReadCharacteristicResponse alloc] init];\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  [result setCharacteristic:[self toCharacteristicProto:peripheral characteristic:characteristic]];\n  [_channel invokeMethod:@\"ReadCharacteristicResponse\" arguments:[self toFlutterData:result]];\n\n  // on iOS, this method also handles notification values\n  ProtosOnCharacteristicChanged *onChangedResult = [[ProtosOnCharacteristicChanged alloc] init];\n  [onChangedResult setRemoteId:[peripheral.identifier UUIDString]];\n  [onChangedResult setCharacteristic:[self toCharacteristicProto:peripheral characteristic:characteristic]];\n  [_channel invokeMethod:@\"OnCharacteristicChanged\" arguments:[self toFlutterData:onChangedResult]];\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {\n  NSLog(@\"didWriteValueForCharacteristic\");\n  ProtosWriteCharacteristicRequest *request = [[ProtosWriteCharacteristicRequest alloc] init];\n  [request setRemoteId:[peripheral.identifier UUIDString]];\n  [request setCharacteristicUuid:[characteristic.UUID fullUUIDString]];\n  [request setServiceUuid:[characteristic.service.UUID fullUUIDString]];\n  ProtosWriteCharacteristicResponse *result = [[ProtosWriteCharacteristicResponse alloc] init];\n  [result setRequest:request];\n  [result setSuccess:(error == nil)];\n  [_channel invokeMethod:@\"WriteCharacteristicResponse\" arguments:[self toFlutterData:result]];\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {\n  NSLog(@\"didUpdateNotificationStateForCharacteristic\");\n  // Read CCC descriptor of characteristic\n  CBDescriptor *cccd = [self findCCCDescriptor:characteristic];\n  if(cccd == nil || error != nil) {\n    // Send error\n    ProtosSetNotificationResponse *response = [[ProtosSetNotificationResponse alloc] init];\n    [response setRemoteId:[peripheral.identifier UUIDString]];\n    [response setCharacteristic:[self toCharacteristicProto:peripheral characteristic:characteristic]];\n    [response setSuccess:false];\n    [_channel invokeMethod:@\"SetNotificationResponse\" arguments:[self toFlutterData:response]];\n    return;\n  }\n\n  // Request a read\n  [peripheral readValueForDescriptor:cccd];\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error {\n  ProtosReadDescriptorRequest *q = [[ProtosReadDescriptorRequest alloc] init];\n  [q setRemoteId:[peripheral.identifier UUIDString]];\n  [q setCharacteristicUuid:[descriptor.characteristic.UUID fullUUIDString]];\n  [q setDescriptorUuid:[descriptor.UUID fullUUIDString]];\n  if([descriptor.characteristic.service isPrimary]) {\n    [q setServiceUuid:[descriptor.characteristic.service.UUID fullUUIDString]];\n  } else {\n    [q setSecondaryServiceUuid:[descriptor.characteristic.service.UUID fullUUIDString]];\n    CBService *primaryService = [self findPrimaryService:[descriptor.characteristic service] peripheral:[descriptor.characteristic.service peripheral]];\n    [q setServiceUuid:[primaryService.UUID fullUUIDString]];\n  }\n  ProtosReadDescriptorResponse *result = [[ProtosReadDescriptorResponse alloc] init];\n  [result setRequest:q];\n  int value = [descriptor.value intValue];\n  [result setValue:[NSData dataWithBytes:&value length:sizeof(value)]];\n  [_channel invokeMethod:@\"ReadDescriptorResponse\" arguments:[self toFlutterData:result]];\n\n  // If descriptor is CCCD, send a SetNotificationResponse in case anything is awaiting\n  if([descriptor.UUID.UUIDString isEqualToString:@\"2902\"]){\n    ProtosSetNotificationResponse *response = [[ProtosSetNotificationResponse alloc] init];\n    [response setRemoteId:[peripheral.identifier UUIDString]];\n    [response setCharacteristic:[self toCharacteristicProto:peripheral characteristic:descriptor.characteristic]];\n    [response setSuccess:true];\n    [_channel invokeMethod:@\"SetNotificationResponse\" arguments:[self toFlutterData:response]];\n  }\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error {\n  ProtosWriteDescriptorRequest *request = [[ProtosWriteDescriptorRequest alloc] init];\n  [request setRemoteId:[peripheral.identifier UUIDString]];\n  [request setCharacteristicUuid:[descriptor.characteristic.UUID fullUUIDString]];\n  [request setDescriptorUuid:[descriptor.UUID fullUUIDString]];\n  if([descriptor.characteristic.service isPrimary]) {\n    [request setServiceUuid:[descriptor.characteristic.service.UUID fullUUIDString]];\n  } else {\n    [request setSecondaryServiceUuid:[descriptor.characteristic.service.UUID fullUUIDString]];\n    CBService *primaryService = [self findPrimaryService:[descriptor.characteristic service] peripheral:[descriptor.characteristic.service peripheral]];\n    [request setServiceUuid:[primaryService.UUID fullUUIDString]];\n  }\n  ProtosWriteDescriptorResponse *result = [[ProtosWriteDescriptorResponse alloc] init];\n  [result setRequest:request];\n  [result setSuccess:(error == nil)];\n  [_channel invokeMethod:@\"WriteDescriptorResponse\" arguments:[self toFlutterData:result]];\n}\n\n- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)rssi error:(NSError *)error {\n  ProtosReadRssiResult *result = [[ProtosReadRssiResult alloc] init];\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  [result setRssi:[rssi intValue]];\n  [_channel invokeMethod:@\"ReadRssiResult\" arguments:[self toFlutterData:result]];\n}\n\n//\n// Proto Helper methods\n//\n- (FlutterStandardTypedData*)toFlutterData:(GPBMessage*)proto {\n  FlutterStandardTypedData *data = [FlutterStandardTypedData typedDataWithBytes:[[proto data] copy]];\n  return data;\n}\n\n- (ProtosBluetoothState*)toBluetoothStateProto:(CBManagerState)state {\n  ProtosBluetoothState *result = [[ProtosBluetoothState alloc] init];\n  switch(state) {\n    case CBManagerStateResetting:\n      [result setState:ProtosBluetoothState_State_TurningOn];\n      break;\n    case CBManagerStateUnsupported:\n      [result setState:ProtosBluetoothState_State_Unavailable];\n      break;\n    case CBManagerStateUnauthorized:\n      [result setState:ProtosBluetoothState_State_Unauthorized];\n      break;\n    case CBManagerStatePoweredOff:\n      [result setState:ProtosBluetoothState_State_Off];\n      break;\n    case CBManagerStatePoweredOn:\n      [result setState:ProtosBluetoothState_State_On];\n      break;\n    default:\n      [result setState:ProtosBluetoothState_State_Unknown];\n      break;\n  }\n  return result;\n}\n\n- (ProtosScanResult*)toScanResultProto:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {\n  ProtosScanResult *result = [[ProtosScanResult alloc] init];\n  [result setDevice:[self toDeviceProto:peripheral]];\n  [result setRssi:[RSSI intValue]];\n  ProtosAdvertisementData *ads = [[ProtosAdvertisementData alloc] init];\n  [ads setConnectable:[advertisementData[CBAdvertisementDataIsConnectable] boolValue]];\n  [ads setLocalName:advertisementData[CBAdvertisementDataLocalNameKey]];\n  // Tx Power Level\n  NSNumber *txPower = advertisementData[CBAdvertisementDataTxPowerLevelKey];\n  if(txPower != nil) {\n    ProtosInt32Value *txPowerWrapper = [[ProtosInt32Value alloc] init];\n    [txPowerWrapper setValue:[txPower intValue]];\n    [ads setTxPowerLevel:txPowerWrapper];\n  }\n  // Manufacturer Specific Data\n  NSData *manufData = advertisementData[CBAdvertisementDataManufacturerDataKey];\n  if(manufData != nil && manufData.length > 2) {\n    unsigned short manufacturerId;\n    [manufData getBytes:&manufacturerId length:2];\n    [[ads manufacturerData] setObject:[manufData subdataWithRange:NSMakeRange(2, manufData.length - 2)] forKey:manufacturerId];\n  }\n  // Service Data\n  NSDictionary *serviceData = advertisementData[CBAdvertisementDataServiceDataKey];\n  if(serviceData != nil) {\n    for (CBUUID *uuid in serviceData) {\n      [[ads serviceData] setObject:serviceData[uuid] forKey:uuid.UUIDString];\n    }\n  }\n  // Service Uuids\n  NSArray *serviceUuids = advertisementData[CBAdvertisementDataServiceUUIDsKey];\n  if(serviceUuids != nil) {\n    for (CBUUID *uuid in serviceUuids) {\n      [[ads serviceUuidsArray] addObject:uuid.UUIDString];\n    }\n  }\n  [result setAdvertisementData:ads];\n  return result;\n}\n\n- (ProtosBluetoothDevice*)toDeviceProto:(CBPeripheral *)peripheral {\n  ProtosBluetoothDevice *result = [[ProtosBluetoothDevice alloc] init];\n  [result setName:[peripheral name]];\n  [result setRemoteId:[[peripheral identifier] UUIDString]];\n  [result setType:ProtosBluetoothDevice_Type_Le]; // TODO: Does iOS differentiate?\n  return result;\n}\n\n- (ProtosDeviceStateResponse*)toDeviceStateProto:(CBPeripheral *)peripheral state:(CBPeripheralState)state {\n  ProtosDeviceStateResponse *result = [[ProtosDeviceStateResponse alloc] init];\n  switch(state) {\n    case CBPeripheralStateDisconnected:\n      [result setState:ProtosDeviceStateResponse_BluetoothDeviceState_Disconnected];\n      break;\n    case CBPeripheralStateConnecting:\n      [result setState:ProtosDeviceStateResponse_BluetoothDeviceState_Connecting];\n      break;\n    case CBPeripheralStateConnected:\n      [result setState:ProtosDeviceStateResponse_BluetoothDeviceState_Connected];\n      break;\n    case CBPeripheralStateDisconnecting:\n      [result setState:ProtosDeviceStateResponse_BluetoothDeviceState_Disconnecting];\n      break;\n  }\n  [result setRemoteId:[[peripheral identifier] UUIDString]];\n  return result;\n}\n\n- (ProtosDiscoverServicesResult*)toServicesResultProto:(CBPeripheral *)peripheral {\n  ProtosDiscoverServicesResult *result = [[ProtosDiscoverServicesResult alloc] init];\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  NSMutableArray *servicesProtos = [NSMutableArray new];\n  for(CBService *s in [peripheral services]) {\n    [servicesProtos addObject:[self toServiceProto:peripheral service:s]];\n  }\n  [result setServicesArray:servicesProtos];\n  return result;\n}\n\n- (ProtosConnectedDevicesResponse*)toConnectedDeviceResponseProto:(NSArray<CBPeripheral*>*)periphs {\n  ProtosConnectedDevicesResponse *result = [[ProtosConnectedDevicesResponse alloc] init];\n  NSMutableArray *deviceProtos = [NSMutableArray new];\n  for(CBPeripheral *p in periphs) {\n    [deviceProtos addObject:[self toDeviceProto:p]];\n  }\n  [result setDevicesArray:deviceProtos];\n  return result;\n}\n\n- (ProtosBluetoothService*)toServiceProto:(CBPeripheral *)peripheral service:(CBService *)service  {\n  ProtosBluetoothService *result = [[ProtosBluetoothService alloc] init];\n  NSLog(@\"peripheral uuid:%@\", [peripheral.identifier UUIDString]);\n  NSLog(@\"service uuid:%@\", [service.UUID fullUUIDString]);\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  [result setUuid:[service.UUID fullUUIDString]];\n  [result setIsPrimary:[service isPrimary]];\n\n  // Characteristic Array\n  NSMutableArray *characteristicProtos = [NSMutableArray new];\n  for(CBCharacteristic *c in [service characteristics]) {\n    [characteristicProtos addObject:[self toCharacteristicProto:peripheral characteristic:c]];\n  }\n  [result setCharacteristicsArray:characteristicProtos];\n\n  // Included Services Array\n  NSMutableArray *includedServicesProtos = [NSMutableArray new];\n  for(CBService *s in [service includedServices]) {\n    [includedServicesProtos addObject:[self toServiceProto:peripheral service:s]];\n  }\n  [result setIncludedServicesArray:includedServicesProtos];\n\n  return result;\n}\n\n- (ProtosBluetoothCharacteristic*)toCharacteristicProto:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic {\n  ProtosBluetoothCharacteristic *result = [[ProtosBluetoothCharacteristic alloc] init];\n  [result setUuid:[characteristic.UUID fullUUIDString]];\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  [result setProperties:[self toCharacteristicPropsProto:characteristic.properties]];\n  [result setValue:[characteristic value]];\n  NSLog(@\"uuid: %@ value: %@\", [characteristic.UUID fullUUIDString], [characteristic value]);\n  NSMutableArray *descriptorProtos = [NSMutableArray new];\n  for(CBDescriptor *d in [characteristic descriptors]) {\n    [descriptorProtos addObject:[self toDescriptorProto:peripheral descriptor:d]];\n  }\n  [result setDescriptorsArray:descriptorProtos];\n  if([characteristic.service isPrimary]) {\n    [result setServiceUuid:[characteristic.service.UUID fullUUIDString]];\n  } else {\n    // Reverse search to find service and secondary service UUID\n    [result setSecondaryServiceUuid:[characteristic.service.UUID fullUUIDString]];\n    CBService *primaryService = [self findPrimaryService:[characteristic service] peripheral:[characteristic.service peripheral]];\n    [result setServiceUuid:[primaryService.UUID fullUUIDString]];\n  }\n  return result;\n}\n\n- (ProtosBluetoothDescriptor*)toDescriptorProto:(CBPeripheral *)peripheral descriptor:(CBDescriptor *)descriptor {\n  ProtosBluetoothDescriptor *result = [[ProtosBluetoothDescriptor alloc] init];\n  [result setUuid:[descriptor.UUID fullUUIDString]];\n  [result setRemoteId:[peripheral.identifier UUIDString]];\n  [result setCharacteristicUuid:[descriptor.characteristic.UUID fullUUIDString]];\n  [result setServiceUuid:[descriptor.characteristic.service.UUID fullUUIDString]];\n  int value = [descriptor.value intValue];\n  [result setValue:[NSData dataWithBytes:&value length:sizeof(value)]];\n  return result;\n}\n\n- (ProtosCharacteristicProperties*)toCharacteristicPropsProto:(CBCharacteristicProperties)props {\n  ProtosCharacteristicProperties *result = [[ProtosCharacteristicProperties alloc] init];\n  [result setBroadcast:(props & CBCharacteristicPropertyBroadcast) != 0];\n  [result setRead:(props & CBCharacteristicPropertyRead) != 0];\n  [result setWriteWithoutResponse:(props & CBCharacteristicPropertyWriteWithoutResponse) != 0];\n  [result setWrite:(props & CBCharacteristicPropertyWrite) != 0];\n  [result setNotify:(props & CBCharacteristicPropertyNotify) != 0];\n  [result setIndicate:(props & CBCharacteristicPropertyIndicate) != 0];\n  [result setAuthenticatedSignedWrites:(props & CBCharacteristicPropertyAuthenticatedSignedWrites) != 0];\n  [result setExtendedProperties:(props & CBCharacteristicPropertyExtendedProperties) != 0];\n  [result setNotifyEncryptionRequired:(props & CBCharacteristicPropertyNotifyEncryptionRequired) != 0];\n  [result setIndicateEncryptionRequired:(props & CBCharacteristicPropertyIndicateEncryptionRequired) != 0];\n  return result;\n}\n\n- (ProtosMtuSizeResponse*)toMtuSizeResponseProto:(CBPeripheral *)peripheral mtu:(uint32_t)mtu {\n  ProtosMtuSizeResponse *result = [[ProtosMtuSizeResponse alloc] init];\n  [result setRemoteId:[[peripheral identifier] UUIDString]];\n  [result setMtu:mtu];\n  return result;\n}\n\n- (void)log:(LogLevel)level format:(NSString *)format, ... {\n  if(level <= _logLevel) {\n    va_list args;\n    va_start(args, format);\n//    NSString* formattedMessage = [[NSString alloc] initWithFormat:format arguments:args];\n    NSLog(format, args);\n    va_end(args);\n  }\n}\n\n- (uint32_t)getMtu:(CBPeripheral *)peripheral {\n  if (@available(iOS 9.0, *)) {\n    // Which type should we use? (issue #365)\n    return (uint32_t)[peripheral maximumWriteValueLengthForType:CBCharacteristicWriteWithoutResponse];\n  } else {\n    // Fallback to minimum on earlier versions. (issue #364)\n    return 20;\n  }\n}\n\n@end\n\n@implementation FlutterBluePlusStreamHandler\n\n- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink {\n  self.sink = eventSink;\n  return nil;\n}\n\n- (FlutterError*)onCancelWithArguments:(id)arguments {\n  self.sink = nil;\n  return nil;\n}\n\n@end\n\n"
  },
  {
    "path": "plugins/flutter_blue_plus/ios/flutter_blue_plus.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint flutter_blue_plus.podspec` to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'flutter_blue_plus'\n  s.version          = '0.0.1'\n  s.summary          = 'Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS'\n  s.description      = <<-DESC\nFlutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS\n                       DESC\n  s.homepage         = 'https://github.com/boskokg/flutter_blue_plus'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Bosko Popovic' => 'boskokg@gmail.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*', 'gen/**/*'\n  s.public_header_files = 'Classes/**/*.h', 'gen/**/*.h'\n  s.dependency 'Flutter'\n  s.platform = :ios, '9.0'\n  s.framework = 'CoreBluetooth'\n\n  s.subspec \"Protos\" do |ss|\n    ss.source_files = \"gen/*.pbobjc.{h,m}\", \"gen/**/*.pbobjc.{h,m}\"\n    ss.header_mappings_dir = \"gen\"\n    ss.requires_arc = false\n    ss.dependency \"Protobuf\", '~> 3.11'\n  end\n\n  # Flutter.framework does not contain a i386 slice.\n  # s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', }\n\nend\n"
  },
  {
    "path": "plugins/flutter_blue_plus/ios/gen/Flutterblueplus.pbobjc.h",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: flutterblueplus.proto\n\n// This CPP symbol can be defined to use imports that match up to the framework\n// imports needed when using CocoaPods.\n#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)\n #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0\n#endif\n\n#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS\n #import <Protobuf/GPBProtocolBuffers.h>\n#else\n #import \"GPBProtocolBuffers.h\"\n#endif\n\n#if GOOGLE_PROTOBUF_OBJC_VERSION < 30004\n#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.\n#endif\n#if 30004 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION\n#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.\n#endif\n\n// @@protoc_insertion_point(imports)\n\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n\nCF_EXTERN_C_BEGIN\n\n@class ProtosAdvertisementData;\n@class ProtosBluetoothCharacteristic;\n@class ProtosBluetoothDescriptor;\n@class ProtosBluetoothDevice;\n@class ProtosBluetoothService;\n@class ProtosCharacteristicProperties;\n@class ProtosInt32Value;\n@class ProtosReadDescriptorRequest;\n@class ProtosWriteCharacteristicRequest;\n@class ProtosWriteDescriptorRequest;\n\nNS_ASSUME_NONNULL_BEGIN\n\n#pragma mark - Enum ProtosBluetoothState_State\n\ntypedef GPB_ENUM(ProtosBluetoothState_State) {\n  /**\n   * Value used if any message's field encounters a value that is not defined\n   * by this enum. The message will also have C functions to get/set the rawValue\n   * of the field.\n   **/\n  ProtosBluetoothState_State_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n  ProtosBluetoothState_State_Unknown = 0,\n  ProtosBluetoothState_State_Unavailable = 1,\n  ProtosBluetoothState_State_Unauthorized = 2,\n  ProtosBluetoothState_State_TurningOn = 3,\n  ProtosBluetoothState_State_On = 4,\n  ProtosBluetoothState_State_TurningOff = 5,\n  ProtosBluetoothState_State_Off = 6,\n};\n\nGPBEnumDescriptor *ProtosBluetoothState_State_EnumDescriptor(void);\n\n/**\n * Checks to see if the given value is defined by the enum or was not known at\n * the time this source was generated.\n **/\nBOOL ProtosBluetoothState_State_IsValidValue(int32_t value);\n\n#pragma mark - Enum ProtosBluetoothDevice_Type\n\ntypedef GPB_ENUM(ProtosBluetoothDevice_Type) {\n  /**\n   * Value used if any message's field encounters a value that is not defined\n   * by this enum. The message will also have C functions to get/set the rawValue\n   * of the field.\n   **/\n  ProtosBluetoothDevice_Type_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n  ProtosBluetoothDevice_Type_Unknown = 0,\n  ProtosBluetoothDevice_Type_Classic = 1,\n  ProtosBluetoothDevice_Type_Le = 2,\n  ProtosBluetoothDevice_Type_Dual = 3,\n};\n\nGPBEnumDescriptor *ProtosBluetoothDevice_Type_EnumDescriptor(void);\n\n/**\n * Checks to see if the given value is defined by the enum or was not known at\n * the time this source was generated.\n **/\nBOOL ProtosBluetoothDevice_Type_IsValidValue(int32_t value);\n\n#pragma mark - Enum ProtosWriteCharacteristicRequest_WriteType\n\ntypedef GPB_ENUM(ProtosWriteCharacteristicRequest_WriteType) {\n  /**\n   * Value used if any message's field encounters a value that is not defined\n   * by this enum. The message will also have C functions to get/set the rawValue\n   * of the field.\n   **/\n  ProtosWriteCharacteristicRequest_WriteType_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n  ProtosWriteCharacteristicRequest_WriteType_WithResponse = 0,\n  ProtosWriteCharacteristicRequest_WriteType_WithoutResponse = 1,\n};\n\nGPBEnumDescriptor *ProtosWriteCharacteristicRequest_WriteType_EnumDescriptor(void);\n\n/**\n * Checks to see if the given value is defined by the enum or was not known at\n * the time this source was generated.\n **/\nBOOL ProtosWriteCharacteristicRequest_WriteType_IsValidValue(int32_t value);\n\n#pragma mark - Enum ProtosDeviceStateResponse_BluetoothDeviceState\n\ntypedef GPB_ENUM(ProtosDeviceStateResponse_BluetoothDeviceState) {\n  /**\n   * Value used if any message's field encounters a value that is not defined\n   * by this enum. The message will also have C functions to get/set the rawValue\n   * of the field.\n   **/\n  ProtosDeviceStateResponse_BluetoothDeviceState_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n  ProtosDeviceStateResponse_BluetoothDeviceState_Disconnected = 0,\n  ProtosDeviceStateResponse_BluetoothDeviceState_Connecting = 1,\n  ProtosDeviceStateResponse_BluetoothDeviceState_Connected = 2,\n  ProtosDeviceStateResponse_BluetoothDeviceState_Disconnecting = 3,\n};\n\nGPBEnumDescriptor *ProtosDeviceStateResponse_BluetoothDeviceState_EnumDescriptor(void);\n\n/**\n * Checks to see if the given value is defined by the enum or was not known at\n * the time this source was generated.\n **/\nBOOL ProtosDeviceStateResponse_BluetoothDeviceState_IsValidValue(int32_t value);\n\n#pragma mark - ProtosFlutterblueplusRoot\n\n/**\n * Exposes the extension registry for this file.\n *\n * The base class provides:\n * @code\n *   + (GPBExtensionRegistry *)extensionRegistry;\n * @endcode\n * which is a @c GPBExtensionRegistry that includes all the extensions defined by\n * this file and all files that it depends on.\n **/\nGPB_FINAL @interface ProtosFlutterblueplusRoot : GPBRootObject\n@end\n\n#pragma mark - ProtosInt32Value\n\ntypedef GPB_ENUM(ProtosInt32Value_FieldNumber) {\n  ProtosInt32Value_FieldNumber_Value = 1,\n};\n\n/**\n * Wrapper message for `int32`.\n *\n * Allows for nullability of fields in messages\n **/\nGPB_FINAL @interface ProtosInt32Value : GPBMessage\n\n/** The int32 value. */\n@property(nonatomic, readwrite) int32_t value;\n\n@end\n\n#pragma mark - ProtosBluetoothState\n\ntypedef GPB_ENUM(ProtosBluetoothState_FieldNumber) {\n  ProtosBluetoothState_FieldNumber_State = 1,\n};\n\nGPB_FINAL @interface ProtosBluetoothState : GPBMessage\n\n@property(nonatomic, readwrite) ProtosBluetoothState_State state;\n\n@end\n\n/**\n * Fetches the raw value of a @c ProtosBluetoothState's @c state property, even\n * if the value was not defined by the enum at the time the code was generated.\n **/\nint32_t ProtosBluetoothState_State_RawValue(ProtosBluetoothState *message);\n/**\n * Sets the raw value of an @c ProtosBluetoothState's @c state property, allowing\n * it to be set to a value that was not defined by the enum at the time the code\n * was generated.\n **/\nvoid SetProtosBluetoothState_State_RawValue(ProtosBluetoothState *message, int32_t value);\n\n#pragma mark - ProtosAdvertisementData\n\ntypedef GPB_ENUM(ProtosAdvertisementData_FieldNumber) {\n  ProtosAdvertisementData_FieldNumber_LocalName = 1,\n  ProtosAdvertisementData_FieldNumber_TxPowerLevel = 2,\n  ProtosAdvertisementData_FieldNumber_Connectable = 3,\n  ProtosAdvertisementData_FieldNumber_ManufacturerData = 4,\n  ProtosAdvertisementData_FieldNumber_ServiceData = 5,\n  ProtosAdvertisementData_FieldNumber_ServiceUuidsArray = 6,\n};\n\nGPB_FINAL @interface ProtosAdvertisementData : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *localName;\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosInt32Value *txPowerLevel;\n/** Test to see if @c txPowerLevel has been set. */\n@property(nonatomic, readwrite) BOOL hasTxPowerLevel;\n\n@property(nonatomic, readwrite) BOOL connectable;\n\n/** Map of manufacturers to their data */\n@property(nonatomic, readwrite, strong, null_resettable) GPBInt32ObjectDictionary<NSData*> *manufacturerData;\n/** The number of items in @c manufacturerData without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger manufacturerData_Count;\n\n/** Map of service UUIDs to their data. */\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableDictionary<NSString*, NSData*> *serviceData;\n/** The number of items in @c serviceData without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger serviceData_Count;\n\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *serviceUuidsArray;\n/** The number of items in @c serviceUuidsArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger serviceUuidsArray_Count;\n\n@end\n\n#pragma mark - ProtosScanSettings\n\ntypedef GPB_ENUM(ProtosScanSettings_FieldNumber) {\n  ProtosScanSettings_FieldNumber_AndroidScanMode = 1,\n  ProtosScanSettings_FieldNumber_ServiceUuidsArray = 2,\n  ProtosScanSettings_FieldNumber_AllowDuplicates = 3,\n};\n\nGPB_FINAL @interface ProtosScanSettings : GPBMessage\n\n@property(nonatomic, readwrite) int32_t androidScanMode;\n\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *serviceUuidsArray;\n/** The number of items in @c serviceUuidsArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger serviceUuidsArray_Count;\n\n@property(nonatomic, readwrite) BOOL allowDuplicates;\n\n@end\n\n#pragma mark - ProtosScanResult\n\ntypedef GPB_ENUM(ProtosScanResult_FieldNumber) {\n  ProtosScanResult_FieldNumber_Device = 1,\n  ProtosScanResult_FieldNumber_AdvertisementData = 2,\n  ProtosScanResult_FieldNumber_Rssi = 3,\n};\n\nGPB_FINAL @interface ProtosScanResult : GPBMessage\n\n/** The received peer's ID. */\n@property(nonatomic, readwrite, strong, null_resettable) ProtosBluetoothDevice *device;\n/** Test to see if @c device has been set. */\n@property(nonatomic, readwrite) BOOL hasDevice;\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosAdvertisementData *advertisementData;\n/** Test to see if @c advertisementData has been set. */\n@property(nonatomic, readwrite) BOOL hasAdvertisementData;\n\n@property(nonatomic, readwrite) int32_t rssi;\n\n@end\n\n#pragma mark - ProtosConnectRequest\n\ntypedef GPB_ENUM(ProtosConnectRequest_FieldNumber) {\n  ProtosConnectRequest_FieldNumber_RemoteId = 1,\n  ProtosConnectRequest_FieldNumber_AndroidAutoConnect = 2,\n};\n\nGPB_FINAL @interface ProtosConnectRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite) BOOL androidAutoConnect;\n\n@end\n\n#pragma mark - ProtosBluetoothDevice\n\ntypedef GPB_ENUM(ProtosBluetoothDevice_FieldNumber) {\n  ProtosBluetoothDevice_FieldNumber_RemoteId = 1,\n  ProtosBluetoothDevice_FieldNumber_Name = 2,\n  ProtosBluetoothDevice_FieldNumber_Type = 3,\n};\n\nGPB_FINAL @interface ProtosBluetoothDevice : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *name;\n\n@property(nonatomic, readwrite) ProtosBluetoothDevice_Type type;\n\n@end\n\n/**\n * Fetches the raw value of a @c ProtosBluetoothDevice's @c type property, even\n * if the value was not defined by the enum at the time the code was generated.\n **/\nint32_t ProtosBluetoothDevice_Type_RawValue(ProtosBluetoothDevice *message);\n/**\n * Sets the raw value of an @c ProtosBluetoothDevice's @c type property, allowing\n * it to be set to a value that was not defined by the enum at the time the code\n * was generated.\n **/\nvoid SetProtosBluetoothDevice_Type_RawValue(ProtosBluetoothDevice *message, int32_t value);\n\n#pragma mark - ProtosBluetoothService\n\ntypedef GPB_ENUM(ProtosBluetoothService_FieldNumber) {\n  ProtosBluetoothService_FieldNumber_Uuid = 1,\n  ProtosBluetoothService_FieldNumber_RemoteId = 2,\n  ProtosBluetoothService_FieldNumber_IsPrimary = 3,\n  ProtosBluetoothService_FieldNumber_CharacteristicsArray = 4,\n  ProtosBluetoothService_FieldNumber_IncludedServicesArray = 5,\n};\n\nGPB_FINAL @interface ProtosBluetoothService : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *uuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n/** Indicates whether the type of service is primary or secondary. */\n@property(nonatomic, readwrite) BOOL isPrimary;\n\n/** A list of characteristics that have been discovered in this service. */\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<ProtosBluetoothCharacteristic*> *characteristicsArray;\n/** The number of items in @c characteristicsArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger characteristicsArray_Count;\n\n/** A list of included services that have been discovered in this service. */\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<ProtosBluetoothService*> *includedServicesArray;\n/** The number of items in @c includedServicesArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger includedServicesArray_Count;\n\n@end\n\n#pragma mark - ProtosBluetoothCharacteristic\n\ntypedef GPB_ENUM(ProtosBluetoothCharacteristic_FieldNumber) {\n  ProtosBluetoothCharacteristic_FieldNumber_Uuid = 1,\n  ProtosBluetoothCharacteristic_FieldNumber_RemoteId = 2,\n  ProtosBluetoothCharacteristic_FieldNumber_ServiceUuid = 3,\n  ProtosBluetoothCharacteristic_FieldNumber_SecondaryServiceUuid = 4,\n  ProtosBluetoothCharacteristic_FieldNumber_DescriptorsArray = 5,\n  ProtosBluetoothCharacteristic_FieldNumber_Properties = 6,\n  ProtosBluetoothCharacteristic_FieldNumber_Value = 7,\n};\n\nGPB_FINAL @interface ProtosBluetoothCharacteristic : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *uuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n/** The service that this characteristic belongs to. */\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n/** The secondary service if nested */\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n/** A list of descriptors that have been discovered in this characteristic. */\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<ProtosBluetoothDescriptor*> *descriptorsArray;\n/** The number of items in @c descriptorsArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger descriptorsArray_Count;\n\n/** The properties of the characteristic. */\n@property(nonatomic, readwrite, strong, null_resettable) ProtosCharacteristicProperties *properties;\n/** Test to see if @c properties has been set. */\n@property(nonatomic, readwrite) BOOL hasProperties;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSData *value;\n\n@end\n\n#pragma mark - ProtosBluetoothDescriptor\n\ntypedef GPB_ENUM(ProtosBluetoothDescriptor_FieldNumber) {\n  ProtosBluetoothDescriptor_FieldNumber_Uuid = 1,\n  ProtosBluetoothDescriptor_FieldNumber_RemoteId = 2,\n  ProtosBluetoothDescriptor_FieldNumber_ServiceUuid = 3,\n  ProtosBluetoothDescriptor_FieldNumber_CharacteristicUuid = 4,\n  ProtosBluetoothDescriptor_FieldNumber_Value = 5,\n};\n\nGPB_FINAL @interface ProtosBluetoothDescriptor : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *uuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n/** The service that this descriptor belongs to. */\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n/** The characteristic that this descriptor belongs to. */\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSData *value;\n\n@end\n\n#pragma mark - ProtosCharacteristicProperties\n\ntypedef GPB_ENUM(ProtosCharacteristicProperties_FieldNumber) {\n  ProtosCharacteristicProperties_FieldNumber_Broadcast = 1,\n  ProtosCharacteristicProperties_FieldNumber_Read = 2,\n  ProtosCharacteristicProperties_FieldNumber_WriteWithoutResponse = 3,\n  ProtosCharacteristicProperties_FieldNumber_Write = 4,\n  ProtosCharacteristicProperties_FieldNumber_Notify = 5,\n  ProtosCharacteristicProperties_FieldNumber_Indicate = 6,\n  ProtosCharacteristicProperties_FieldNumber_AuthenticatedSignedWrites = 7,\n  ProtosCharacteristicProperties_FieldNumber_ExtendedProperties = 8,\n  ProtosCharacteristicProperties_FieldNumber_NotifyEncryptionRequired = 9,\n  ProtosCharacteristicProperties_FieldNumber_IndicateEncryptionRequired = 10,\n};\n\nGPB_FINAL @interface ProtosCharacteristicProperties : GPBMessage\n\n@property(nonatomic, readwrite) BOOL broadcast;\n\n@property(nonatomic, readwrite) BOOL read;\n\n@property(nonatomic, readwrite) BOOL writeWithoutResponse;\n\n@property(nonatomic, readwrite) BOOL write;\n\n@property(nonatomic, readwrite) BOOL notify;\n\n@property(nonatomic, readwrite) BOOL indicate;\n\n@property(nonatomic, readwrite) BOOL authenticatedSignedWrites;\n\n@property(nonatomic, readwrite) BOOL extendedProperties;\n\n@property(nonatomic, readwrite) BOOL notifyEncryptionRequired;\n\n@property(nonatomic, readwrite) BOOL indicateEncryptionRequired;\n\n@end\n\n#pragma mark - ProtosDiscoverServicesResult\n\ntypedef GPB_ENUM(ProtosDiscoverServicesResult_FieldNumber) {\n  ProtosDiscoverServicesResult_FieldNumber_RemoteId = 1,\n  ProtosDiscoverServicesResult_FieldNumber_ServicesArray = 2,\n};\n\nGPB_FINAL @interface ProtosDiscoverServicesResult : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<ProtosBluetoothService*> *servicesArray;\n/** The number of items in @c servicesArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger servicesArray_Count;\n\n@end\n\n#pragma mark - ProtosReadCharacteristicRequest\n\ntypedef GPB_ENUM(ProtosReadCharacteristicRequest_FieldNumber) {\n  ProtosReadCharacteristicRequest_FieldNumber_RemoteId = 1,\n  ProtosReadCharacteristicRequest_FieldNumber_CharacteristicUuid = 2,\n  ProtosReadCharacteristicRequest_FieldNumber_ServiceUuid = 3,\n  ProtosReadCharacteristicRequest_FieldNumber_SecondaryServiceUuid = 4,\n};\n\nGPB_FINAL @interface ProtosReadCharacteristicRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n@end\n\n#pragma mark - ProtosReadCharacteristicResponse\n\ntypedef GPB_ENUM(ProtosReadCharacteristicResponse_FieldNumber) {\n  ProtosReadCharacteristicResponse_FieldNumber_RemoteId = 1,\n  ProtosReadCharacteristicResponse_FieldNumber_Characteristic = 2,\n};\n\nGPB_FINAL @interface ProtosReadCharacteristicResponse : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosBluetoothCharacteristic *characteristic;\n/** Test to see if @c characteristic has been set. */\n@property(nonatomic, readwrite) BOOL hasCharacteristic;\n\n@end\n\n#pragma mark - ProtosReadDescriptorRequest\n\ntypedef GPB_ENUM(ProtosReadDescriptorRequest_FieldNumber) {\n  ProtosReadDescriptorRequest_FieldNumber_RemoteId = 1,\n  ProtosReadDescriptorRequest_FieldNumber_DescriptorUuid = 2,\n  ProtosReadDescriptorRequest_FieldNumber_ServiceUuid = 3,\n  ProtosReadDescriptorRequest_FieldNumber_SecondaryServiceUuid = 4,\n  ProtosReadDescriptorRequest_FieldNumber_CharacteristicUuid = 5,\n};\n\nGPB_FINAL @interface ProtosReadDescriptorRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *descriptorUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@end\n\n#pragma mark - ProtosReadDescriptorResponse\n\ntypedef GPB_ENUM(ProtosReadDescriptorResponse_FieldNumber) {\n  ProtosReadDescriptorResponse_FieldNumber_Request = 1,\n  ProtosReadDescriptorResponse_FieldNumber_Value = 2,\n};\n\nGPB_FINAL @interface ProtosReadDescriptorResponse : GPBMessage\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosReadDescriptorRequest *request;\n/** Test to see if @c request has been set. */\n@property(nonatomic, readwrite) BOOL hasRequest;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSData *value;\n\n@end\n\n#pragma mark - ProtosWriteCharacteristicRequest\n\ntypedef GPB_ENUM(ProtosWriteCharacteristicRequest_FieldNumber) {\n  ProtosWriteCharacteristicRequest_FieldNumber_RemoteId = 1,\n  ProtosWriteCharacteristicRequest_FieldNumber_CharacteristicUuid = 2,\n  ProtosWriteCharacteristicRequest_FieldNumber_ServiceUuid = 3,\n  ProtosWriteCharacteristicRequest_FieldNumber_SecondaryServiceUuid = 4,\n  ProtosWriteCharacteristicRequest_FieldNumber_WriteType = 5,\n  ProtosWriteCharacteristicRequest_FieldNumber_Value = 6,\n};\n\nGPB_FINAL @interface ProtosWriteCharacteristicRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n@property(nonatomic, readwrite) ProtosWriteCharacteristicRequest_WriteType writeType;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSData *value;\n\n@end\n\n/**\n * Fetches the raw value of a @c ProtosWriteCharacteristicRequest's @c writeType property, even\n * if the value was not defined by the enum at the time the code was generated.\n **/\nint32_t ProtosWriteCharacteristicRequest_WriteType_RawValue(ProtosWriteCharacteristicRequest *message);\n/**\n * Sets the raw value of an @c ProtosWriteCharacteristicRequest's @c writeType property, allowing\n * it to be set to a value that was not defined by the enum at the time the code\n * was generated.\n **/\nvoid SetProtosWriteCharacteristicRequest_WriteType_RawValue(ProtosWriteCharacteristicRequest *message, int32_t value);\n\n#pragma mark - ProtosWriteCharacteristicResponse\n\ntypedef GPB_ENUM(ProtosWriteCharacteristicResponse_FieldNumber) {\n  ProtosWriteCharacteristicResponse_FieldNumber_Request = 1,\n  ProtosWriteCharacteristicResponse_FieldNumber_Success = 2,\n};\n\nGPB_FINAL @interface ProtosWriteCharacteristicResponse : GPBMessage\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosWriteCharacteristicRequest *request;\n/** Test to see if @c request has been set. */\n@property(nonatomic, readwrite) BOOL hasRequest;\n\n@property(nonatomic, readwrite) BOOL success;\n\n@end\n\n#pragma mark - ProtosWriteDescriptorRequest\n\ntypedef GPB_ENUM(ProtosWriteDescriptorRequest_FieldNumber) {\n  ProtosWriteDescriptorRequest_FieldNumber_RemoteId = 1,\n  ProtosWriteDescriptorRequest_FieldNumber_DescriptorUuid = 2,\n  ProtosWriteDescriptorRequest_FieldNumber_ServiceUuid = 3,\n  ProtosWriteDescriptorRequest_FieldNumber_SecondaryServiceUuid = 4,\n  ProtosWriteDescriptorRequest_FieldNumber_CharacteristicUuid = 5,\n  ProtosWriteDescriptorRequest_FieldNumber_Value = 6,\n};\n\nGPB_FINAL @interface ProtosWriteDescriptorRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *descriptorUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSData *value;\n\n@end\n\n#pragma mark - ProtosWriteDescriptorResponse\n\ntypedef GPB_ENUM(ProtosWriteDescriptorResponse_FieldNumber) {\n  ProtosWriteDescriptorResponse_FieldNumber_Request = 1,\n  ProtosWriteDescriptorResponse_FieldNumber_Success = 2,\n};\n\nGPB_FINAL @interface ProtosWriteDescriptorResponse : GPBMessage\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosWriteDescriptorRequest *request;\n/** Test to see if @c request has been set. */\n@property(nonatomic, readwrite) BOOL hasRequest;\n\n@property(nonatomic, readwrite) BOOL success;\n\n@end\n\n#pragma mark - ProtosSetNotificationRequest\n\ntypedef GPB_ENUM(ProtosSetNotificationRequest_FieldNumber) {\n  ProtosSetNotificationRequest_FieldNumber_RemoteId = 1,\n  ProtosSetNotificationRequest_FieldNumber_ServiceUuid = 2,\n  ProtosSetNotificationRequest_FieldNumber_SecondaryServiceUuid = 3,\n  ProtosSetNotificationRequest_FieldNumber_CharacteristicUuid = 4,\n  ProtosSetNotificationRequest_FieldNumber_Enable = 5,\n};\n\nGPB_FINAL @interface ProtosSetNotificationRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *serviceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *secondaryServiceUuid;\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *characteristicUuid;\n\n@property(nonatomic, readwrite) BOOL enable;\n\n@end\n\n#pragma mark - ProtosSetNotificationResponse\n\ntypedef GPB_ENUM(ProtosSetNotificationResponse_FieldNumber) {\n  ProtosSetNotificationResponse_FieldNumber_RemoteId = 1,\n  ProtosSetNotificationResponse_FieldNumber_Characteristic = 2,\n  ProtosSetNotificationResponse_FieldNumber_Success = 3,\n};\n\nGPB_FINAL @interface ProtosSetNotificationResponse : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosBluetoothCharacteristic *characteristic;\n/** Test to see if @c characteristic has been set. */\n@property(nonatomic, readwrite) BOOL hasCharacteristic;\n\n@property(nonatomic, readwrite) BOOL success;\n\n@end\n\n#pragma mark - ProtosOnCharacteristicChanged\n\ntypedef GPB_ENUM(ProtosOnCharacteristicChanged_FieldNumber) {\n  ProtosOnCharacteristicChanged_FieldNumber_RemoteId = 1,\n  ProtosOnCharacteristicChanged_FieldNumber_Characteristic = 2,\n};\n\nGPB_FINAL @interface ProtosOnCharacteristicChanged : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite, strong, null_resettable) ProtosBluetoothCharacteristic *characteristic;\n/** Test to see if @c characteristic has been set. */\n@property(nonatomic, readwrite) BOOL hasCharacteristic;\n\n@end\n\n#pragma mark - ProtosDeviceStateResponse\n\ntypedef GPB_ENUM(ProtosDeviceStateResponse_FieldNumber) {\n  ProtosDeviceStateResponse_FieldNumber_RemoteId = 1,\n  ProtosDeviceStateResponse_FieldNumber_State = 2,\n};\n\nGPB_FINAL @interface ProtosDeviceStateResponse : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite) ProtosDeviceStateResponse_BluetoothDeviceState state;\n\n@end\n\n/**\n * Fetches the raw value of a @c ProtosDeviceStateResponse's @c state property, even\n * if the value was not defined by the enum at the time the code was generated.\n **/\nint32_t ProtosDeviceStateResponse_State_RawValue(ProtosDeviceStateResponse *message);\n/**\n * Sets the raw value of an @c ProtosDeviceStateResponse's @c state property, allowing\n * it to be set to a value that was not defined by the enum at the time the code\n * was generated.\n **/\nvoid SetProtosDeviceStateResponse_State_RawValue(ProtosDeviceStateResponse *message, int32_t value);\n\n#pragma mark - ProtosConnectedDevicesResponse\n\ntypedef GPB_ENUM(ProtosConnectedDevicesResponse_FieldNumber) {\n  ProtosConnectedDevicesResponse_FieldNumber_DevicesArray = 1,\n};\n\nGPB_FINAL @interface ProtosConnectedDevicesResponse : GPBMessage\n\n@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<ProtosBluetoothDevice*> *devicesArray;\n/** The number of items in @c devicesArray without causing the array to be created. */\n@property(nonatomic, readonly) NSUInteger devicesArray_Count;\n\n@end\n\n#pragma mark - ProtosMtuSizeRequest\n\ntypedef GPB_ENUM(ProtosMtuSizeRequest_FieldNumber) {\n  ProtosMtuSizeRequest_FieldNumber_RemoteId = 1,\n  ProtosMtuSizeRequest_FieldNumber_Mtu = 2,\n};\n\nGPB_FINAL @interface ProtosMtuSizeRequest : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite) uint32_t mtu;\n\n@end\n\n#pragma mark - ProtosMtuSizeResponse\n\ntypedef GPB_ENUM(ProtosMtuSizeResponse_FieldNumber) {\n  ProtosMtuSizeResponse_FieldNumber_RemoteId = 1,\n  ProtosMtuSizeResponse_FieldNumber_Mtu = 2,\n};\n\nGPB_FINAL @interface ProtosMtuSizeResponse : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite) uint32_t mtu;\n\n@end\n\n#pragma mark - ProtosReadRssiResult\n\ntypedef GPB_ENUM(ProtosReadRssiResult_FieldNumber) {\n  ProtosReadRssiResult_FieldNumber_RemoteId = 1,\n  ProtosReadRssiResult_FieldNumber_Rssi = 2,\n};\n\nGPB_FINAL @interface ProtosReadRssiResult : GPBMessage\n\n@property(nonatomic, readwrite, copy, null_resettable) NSString *remoteId;\n\n@property(nonatomic, readwrite) int32_t rssi;\n\n@end\n\nNS_ASSUME_NONNULL_END\n\nCF_EXTERN_C_END\n\n#pragma clang diagnostic pop\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "plugins/flutter_blue_plus/ios/gen/Flutterblueplus.pbobjc.m",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: flutterblueplus.proto\n\n// This CPP symbol can be defined to use imports that match up to the framework\n// imports needed when using CocoaPods.\n#if !defined(GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS)\n #define GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS 0\n#endif\n\n#if GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS\n #import <Protobuf/GPBProtocolBuffers_RuntimeSupport.h>\n#else\n #import \"GPBProtocolBuffers_RuntimeSupport.h\"\n#endif\n\n#import <stdatomic.h>\n\n#import \"Flutterblueplus.pbobjc.h\"\n// @@protoc_insertion_point(imports)\n\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n#pragma clang diagnostic ignored \"-Wdollar-in-identifier-extension\"\n\n#pragma mark - Objective C Class declarations\n// Forward declarations of Objective C classes that we can use as\n// static values in struct initializers.\n// We don't use [Foo class] because it is not a static value.\nGPBObjCClassDeclaration(ProtosAdvertisementData);\nGPBObjCClassDeclaration(ProtosBluetoothCharacteristic);\nGPBObjCClassDeclaration(ProtosBluetoothDescriptor);\nGPBObjCClassDeclaration(ProtosBluetoothDevice);\nGPBObjCClassDeclaration(ProtosBluetoothService);\nGPBObjCClassDeclaration(ProtosCharacteristicProperties);\nGPBObjCClassDeclaration(ProtosInt32Value);\nGPBObjCClassDeclaration(ProtosReadDescriptorRequest);\nGPBObjCClassDeclaration(ProtosWriteCharacteristicRequest);\nGPBObjCClassDeclaration(ProtosWriteDescriptorRequest);\n\n#pragma mark - ProtosFlutterblueplusRoot\n\n@implementation ProtosFlutterblueplusRoot\n\n// No extensions in the file and no imports, so no need to generate\n// +extensionRegistry.\n\n@end\n\n#pragma mark - ProtosFlutterblueplusRoot_FileDescriptor\n\nstatic GPBFileDescriptor *ProtosFlutterblueplusRoot_FileDescriptor(void) {\n  // This is called by +initialize so there is no need to worry\n  // about thread safety of the singleton.\n  static GPBFileDescriptor *descriptor = NULL;\n  if (!descriptor) {\n    GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"\"\n                                                 objcPrefix:@\"Protos\"\n                                                     syntax:GPBFileSyntaxProto3];\n  }\n  return descriptor;\n}\n\n#pragma mark - ProtosInt32Value\n\n@implementation ProtosInt32Value\n\n@dynamic value;\n\ntypedef struct ProtosInt32Value__storage_ {\n  uint32_t _has_storage_[1];\n  int32_t value;\n} ProtosInt32Value__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosInt32Value_FieldNumber_Value,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosInt32Value__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeInt32,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosInt32Value class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosInt32Value__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosBluetoothState\n\n@implementation ProtosBluetoothState\n\n@dynamic state;\n\ntypedef struct ProtosBluetoothState__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosBluetoothState_State state;\n} ProtosBluetoothState__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"state\",\n        .dataTypeSpecific.enumDescFunc = ProtosBluetoothState_State_EnumDescriptor,\n        .number = ProtosBluetoothState_FieldNumber_State,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosBluetoothState__storage_, state),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeEnum,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosBluetoothState class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosBluetoothState__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\nint32_t ProtosBluetoothState_State_RawValue(ProtosBluetoothState *message) {\n  GPBDescriptor *descriptor = [ProtosBluetoothState descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosBluetoothState_FieldNumber_State];\n  return GPBGetMessageRawEnumField(message, field);\n}\n\nvoid SetProtosBluetoothState_State_RawValue(ProtosBluetoothState *message, int32_t value) {\n  GPBDescriptor *descriptor = [ProtosBluetoothState descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosBluetoothState_FieldNumber_State];\n  GPBSetMessageRawEnumField(message, field, value);\n}\n\n#pragma mark - Enum ProtosBluetoothState_State\n\nGPBEnumDescriptor *ProtosBluetoothState_State_EnumDescriptor(void) {\n  static _Atomic(GPBEnumDescriptor*) descriptor = nil;\n  if (!descriptor) {\n    static const char *valueNames =\n        \"Unknown\\000Unavailable\\000Unauthorized\\000Turning\"\n        \"On\\000On\\000TurningOff\\000Off\\000\";\n    static const int32_t values[] = {\n        ProtosBluetoothState_State_Unknown,\n        ProtosBluetoothState_State_Unavailable,\n        ProtosBluetoothState_State_Unauthorized,\n        ProtosBluetoothState_State_TurningOn,\n        ProtosBluetoothState_State_On,\n        ProtosBluetoothState_State_TurningOff,\n        ProtosBluetoothState_State_Off,\n    };\n    GPBEnumDescriptor *worker =\n        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(ProtosBluetoothState_State)\n                                       valueNames:valueNames\n                                           values:values\n                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n                                     enumVerifier:ProtosBluetoothState_State_IsValidValue];\n    GPBEnumDescriptor *expected = nil;\n    if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) {\n      [worker release];\n    }\n  }\n  return descriptor;\n}\n\nBOOL ProtosBluetoothState_State_IsValidValue(int32_t value__) {\n  switch (value__) {\n    case ProtosBluetoothState_State_Unknown:\n    case ProtosBluetoothState_State_Unavailable:\n    case ProtosBluetoothState_State_Unauthorized:\n    case ProtosBluetoothState_State_TurningOn:\n    case ProtosBluetoothState_State_On:\n    case ProtosBluetoothState_State_TurningOff:\n    case ProtosBluetoothState_State_Off:\n      return YES;\n    default:\n      return NO;\n  }\n}\n\n#pragma mark - ProtosAdvertisementData\n\n@implementation ProtosAdvertisementData\n\n@dynamic localName;\n@dynamic hasTxPowerLevel, txPowerLevel;\n@dynamic connectable;\n@dynamic manufacturerData, manufacturerData_Count;\n@dynamic serviceData, serviceData_Count;\n@dynamic serviceUuidsArray, serviceUuidsArray_Count;\n\ntypedef struct ProtosAdvertisementData__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *localName;\n  ProtosInt32Value *txPowerLevel;\n  GPBInt32ObjectDictionary *manufacturerData;\n  NSMutableDictionary *serviceData;\n  NSMutableArray *serviceUuidsArray;\n} ProtosAdvertisementData__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"localName\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosAdvertisementData_FieldNumber_LocalName,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosAdvertisementData__storage_, localName),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"txPowerLevel\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosInt32Value),\n        .number = ProtosAdvertisementData_FieldNumber_TxPowerLevel,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosAdvertisementData__storage_, txPowerLevel),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"connectable\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosAdvertisementData_FieldNumber_Connectable,\n        .hasIndex = 2,\n        .offset = 3,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"manufacturerData\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosAdvertisementData_FieldNumber_ManufacturerData,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosAdvertisementData__storage_, manufacturerData),\n        .flags = GPBFieldMapKeyInt32,\n        .dataType = GPBDataTypeBytes,\n      },\n      {\n        .name = \"serviceData\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosAdvertisementData_FieldNumber_ServiceData,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosAdvertisementData__storage_, serviceData),\n        .flags = GPBFieldMapKeyString,\n        .dataType = GPBDataTypeBytes,\n      },\n      {\n        .name = \"serviceUuidsArray\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosAdvertisementData_FieldNumber_ServiceUuidsArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosAdvertisementData__storage_, serviceUuidsArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeString,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosAdvertisementData class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosAdvertisementData__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosScanSettings\n\n@implementation ProtosScanSettings\n\n@dynamic androidScanMode;\n@dynamic serviceUuidsArray, serviceUuidsArray_Count;\n@dynamic allowDuplicates;\n\ntypedef struct ProtosScanSettings__storage_ {\n  uint32_t _has_storage_[1];\n  int32_t androidScanMode;\n  NSMutableArray *serviceUuidsArray;\n} ProtosScanSettings__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"androidScanMode\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosScanSettings_FieldNumber_AndroidScanMode,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosScanSettings__storage_, androidScanMode),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeInt32,\n      },\n      {\n        .name = \"serviceUuidsArray\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosScanSettings_FieldNumber_ServiceUuidsArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosScanSettings__storage_, serviceUuidsArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"allowDuplicates\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosScanSettings_FieldNumber_AllowDuplicates,\n        .hasIndex = 1,\n        .offset = 2,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosScanSettings class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosScanSettings__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosScanResult\n\n@implementation ProtosScanResult\n\n@dynamic hasDevice, device;\n@dynamic hasAdvertisementData, advertisementData;\n@dynamic rssi;\n\ntypedef struct ProtosScanResult__storage_ {\n  uint32_t _has_storage_[1];\n  int32_t rssi;\n  ProtosBluetoothDevice *device;\n  ProtosAdvertisementData *advertisementData;\n} ProtosScanResult__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"device\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothDevice),\n        .number = ProtosScanResult_FieldNumber_Device,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosScanResult__storage_, device),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"advertisementData\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosAdvertisementData),\n        .number = ProtosScanResult_FieldNumber_AdvertisementData,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosScanResult__storage_, advertisementData),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"rssi\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosScanResult_FieldNumber_Rssi,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosScanResult__storage_, rssi),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeInt32,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosScanResult class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosScanResult__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosConnectRequest\n\n@implementation ProtosConnectRequest\n\n@dynamic remoteId;\n@dynamic androidAutoConnect;\n\ntypedef struct ProtosConnectRequest__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n} ProtosConnectRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosConnectRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosConnectRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"androidAutoConnect\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosConnectRequest_FieldNumber_AndroidAutoConnect,\n        .hasIndex = 1,\n        .offset = 2,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosConnectRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosConnectRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosBluetoothDevice\n\n@implementation ProtosBluetoothDevice\n\n@dynamic remoteId;\n@dynamic name;\n@dynamic type;\n\ntypedef struct ProtosBluetoothDevice__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosBluetoothDevice_Type type;\n  NSString *remoteId;\n  NSString *name;\n} ProtosBluetoothDevice__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDevice_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDevice__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"name\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDevice_FieldNumber_Name,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDevice__storage_, name),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"type\",\n        .dataTypeSpecific.enumDescFunc = ProtosBluetoothDevice_Type_EnumDescriptor,\n        .number = ProtosBluetoothDevice_FieldNumber_Type,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDevice__storage_, type),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeEnum,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosBluetoothDevice class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosBluetoothDevice__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\nint32_t ProtosBluetoothDevice_Type_RawValue(ProtosBluetoothDevice *message) {\n  GPBDescriptor *descriptor = [ProtosBluetoothDevice descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosBluetoothDevice_FieldNumber_Type];\n  return GPBGetMessageRawEnumField(message, field);\n}\n\nvoid SetProtosBluetoothDevice_Type_RawValue(ProtosBluetoothDevice *message, int32_t value) {\n  GPBDescriptor *descriptor = [ProtosBluetoothDevice descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosBluetoothDevice_FieldNumber_Type];\n  GPBSetMessageRawEnumField(message, field, value);\n}\n\n#pragma mark - Enum ProtosBluetoothDevice_Type\n\nGPBEnumDescriptor *ProtosBluetoothDevice_Type_EnumDescriptor(void) {\n  static _Atomic(GPBEnumDescriptor*) descriptor = nil;\n  if (!descriptor) {\n    static const char *valueNames =\n        \"Unknown\\000Classic\\000Le\\000Dual\\000\";\n    static const int32_t values[] = {\n        ProtosBluetoothDevice_Type_Unknown,\n        ProtosBluetoothDevice_Type_Classic,\n        ProtosBluetoothDevice_Type_Le,\n        ProtosBluetoothDevice_Type_Dual,\n    };\n    GPBEnumDescriptor *worker =\n        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(ProtosBluetoothDevice_Type)\n                                       valueNames:valueNames\n                                           values:values\n                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n                                     enumVerifier:ProtosBluetoothDevice_Type_IsValidValue];\n    GPBEnumDescriptor *expected = nil;\n    if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) {\n      [worker release];\n    }\n  }\n  return descriptor;\n}\n\nBOOL ProtosBluetoothDevice_Type_IsValidValue(int32_t value__) {\n  switch (value__) {\n    case ProtosBluetoothDevice_Type_Unknown:\n    case ProtosBluetoothDevice_Type_Classic:\n    case ProtosBluetoothDevice_Type_Le:\n    case ProtosBluetoothDevice_Type_Dual:\n      return YES;\n    default:\n      return NO;\n  }\n}\n\n#pragma mark - ProtosBluetoothService\n\n@implementation ProtosBluetoothService\n\n@dynamic uuid;\n@dynamic remoteId;\n@dynamic isPrimary;\n@dynamic characteristicsArray, characteristicsArray_Count;\n@dynamic includedServicesArray, includedServicesArray_Count;\n\ntypedef struct ProtosBluetoothService__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *uuid;\n  NSString *remoteId;\n  NSMutableArray *characteristicsArray;\n  NSMutableArray *includedServicesArray;\n} ProtosBluetoothService__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"uuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothService_FieldNumber_Uuid,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosBluetoothService__storage_, uuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothService_FieldNumber_RemoteId,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosBluetoothService__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"isPrimary\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothService_FieldNumber_IsPrimary,\n        .hasIndex = 2,\n        .offset = 3,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"characteristicsArray\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothCharacteristic),\n        .number = ProtosBluetoothService_FieldNumber_CharacteristicsArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosBluetoothService__storage_, characteristicsArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"includedServicesArray\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothService),\n        .number = ProtosBluetoothService_FieldNumber_IncludedServicesArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosBluetoothService__storage_, includedServicesArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeMessage,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosBluetoothService class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosBluetoothService__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosBluetoothCharacteristic\n\n@implementation ProtosBluetoothCharacteristic\n\n@dynamic uuid;\n@dynamic remoteId;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n@dynamic descriptorsArray, descriptorsArray_Count;\n@dynamic hasProperties, properties;\n@dynamic value;\n\ntypedef struct ProtosBluetoothCharacteristic__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *uuid;\n  NSString *remoteId;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n  NSMutableArray *descriptorsArray;\n  ProtosCharacteristicProperties *properties;\n  NSData *value;\n} ProtosBluetoothCharacteristic__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"uuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothCharacteristic_FieldNumber_Uuid,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, uuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothCharacteristic_FieldNumber_RemoteId,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothCharacteristic_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothCharacteristic_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"descriptorsArray\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothDescriptor),\n        .number = ProtosBluetoothCharacteristic_FieldNumber_DescriptorsArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, descriptorsArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"properties\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosCharacteristicProperties),\n        .number = ProtosBluetoothCharacteristic_FieldNumber_Properties,\n        .hasIndex = 4,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, properties),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothCharacteristic_FieldNumber_Value,\n        .hasIndex = 5,\n        .offset = (uint32_t)offsetof(ProtosBluetoothCharacteristic__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBytes,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosBluetoothCharacteristic class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosBluetoothCharacteristic__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n    static const char *extraTextFormatInfo =\n        \"\\002\\003\\013\\000\\004\\024\\000\";\n    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];\n#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosBluetoothDescriptor\n\n@implementation ProtosBluetoothDescriptor\n\n@dynamic uuid;\n@dynamic remoteId;\n@dynamic serviceUuid;\n@dynamic characteristicUuid;\n@dynamic value;\n\ntypedef struct ProtosBluetoothDescriptor__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *uuid;\n  NSString *remoteId;\n  NSString *serviceUuid;\n  NSString *characteristicUuid;\n  NSData *value;\n} ProtosBluetoothDescriptor__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"uuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDescriptor_FieldNumber_Uuid,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDescriptor__storage_, uuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDescriptor_FieldNumber_RemoteId,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDescriptor__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDescriptor_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDescriptor__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDescriptor_FieldNumber_CharacteristicUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDescriptor__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldTextFormatNameCustom | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosBluetoothDescriptor_FieldNumber_Value,\n        .hasIndex = 4,\n        .offset = (uint32_t)offsetof(ProtosBluetoothDescriptor__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBytes,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosBluetoothDescriptor class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosBluetoothDescriptor__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n    static const char *extraTextFormatInfo =\n        \"\\002\\003\\013\\000\\004\\022\\000\";\n    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];\n#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosCharacteristicProperties\n\n@implementation ProtosCharacteristicProperties\n\n@dynamic broadcast;\n@dynamic read;\n@dynamic writeWithoutResponse;\n@dynamic write;\n@dynamic notify;\n@dynamic indicate;\n@dynamic authenticatedSignedWrites;\n@dynamic extendedProperties;\n@dynamic notifyEncryptionRequired;\n@dynamic indicateEncryptionRequired;\n\ntypedef struct ProtosCharacteristicProperties__storage_ {\n  uint32_t _has_storage_[1];\n} ProtosCharacteristicProperties__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"broadcast\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_Broadcast,\n        .hasIndex = 0,\n        .offset = 1,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"read\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_Read,\n        .hasIndex = 2,\n        .offset = 3,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"writeWithoutResponse\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_WriteWithoutResponse,\n        .hasIndex = 4,\n        .offset = 5,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"write\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_Write,\n        .hasIndex = 6,\n        .offset = 7,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"notify\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_Notify,\n        .hasIndex = 8,\n        .offset = 9,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"indicate\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_Indicate,\n        .hasIndex = 10,\n        .offset = 11,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"authenticatedSignedWrites\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_AuthenticatedSignedWrites,\n        .hasIndex = 12,\n        .offset = 13,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"extendedProperties\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_ExtendedProperties,\n        .hasIndex = 14,\n        .offset = 15,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"notifyEncryptionRequired\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_NotifyEncryptionRequired,\n        .hasIndex = 16,\n        .offset = 17,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n      {\n        .name = \"indicateEncryptionRequired\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosCharacteristicProperties_FieldNumber_IndicateEncryptionRequired,\n        .hasIndex = 18,\n        .offset = 19,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosCharacteristicProperties class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosCharacteristicProperties__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosDiscoverServicesResult\n\n@implementation ProtosDiscoverServicesResult\n\n@dynamic remoteId;\n@dynamic servicesArray, servicesArray_Count;\n\ntypedef struct ProtosDiscoverServicesResult__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  NSMutableArray *servicesArray;\n} ProtosDiscoverServicesResult__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosDiscoverServicesResult_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosDiscoverServicesResult__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"servicesArray\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothService),\n        .number = ProtosDiscoverServicesResult_FieldNumber_ServicesArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosDiscoverServicesResult__storage_, servicesArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeMessage,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosDiscoverServicesResult class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosDiscoverServicesResult__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosReadCharacteristicRequest\n\n@implementation ProtosReadCharacteristicRequest\n\n@dynamic remoteId;\n@dynamic characteristicUuid;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n\ntypedef struct ProtosReadCharacteristicRequest__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  NSString *characteristicUuid;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n} ProtosReadCharacteristicRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadCharacteristicRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadCharacteristicRequest_FieldNumber_CharacteristicUuid,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicRequest__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadCharacteristicRequest_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicRequest__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadCharacteristicRequest_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicRequest__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosReadCharacteristicRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosReadCharacteristicRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosReadCharacteristicResponse\n\n@implementation ProtosReadCharacteristicResponse\n\n@dynamic remoteId;\n@dynamic hasCharacteristic, characteristic;\n\ntypedef struct ProtosReadCharacteristicResponse__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  ProtosBluetoothCharacteristic *characteristic;\n} ProtosReadCharacteristicResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadCharacteristicResponse_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicResponse__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristic\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothCharacteristic),\n        .number = ProtosReadCharacteristicResponse_FieldNumber_Characteristic,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosReadCharacteristicResponse__storage_, characteristic),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosReadCharacteristicResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosReadCharacteristicResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosReadDescriptorRequest\n\n@implementation ProtosReadDescriptorRequest\n\n@dynamic remoteId;\n@dynamic descriptorUuid;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n@dynamic characteristicUuid;\n\ntypedef struct ProtosReadDescriptorRequest__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  NSString *descriptorUuid;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n  NSString *characteristicUuid;\n} ProtosReadDescriptorRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"descriptorUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorRequest_FieldNumber_DescriptorUuid,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorRequest__storage_, descriptorUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorRequest_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorRequest__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorRequest_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorRequest__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorRequest_FieldNumber_CharacteristicUuid,\n        .hasIndex = 4,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorRequest__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosReadDescriptorRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosReadDescriptorRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosReadDescriptorResponse\n\n@implementation ProtosReadDescriptorResponse\n\n@dynamic hasRequest, request;\n@dynamic value;\n\ntypedef struct ProtosReadDescriptorResponse__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosReadDescriptorRequest *request;\n  NSData *value;\n} ProtosReadDescriptorResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"request\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosReadDescriptorRequest),\n        .number = ProtosReadDescriptorResponse_FieldNumber_Request,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorResponse__storage_, request),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadDescriptorResponse_FieldNumber_Value,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosReadDescriptorResponse__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBytes,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosReadDescriptorResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosReadDescriptorResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosWriteCharacteristicRequest\n\n@implementation ProtosWriteCharacteristicRequest\n\n@dynamic remoteId;\n@dynamic characteristicUuid;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n@dynamic writeType;\n@dynamic value;\n\ntypedef struct ProtosWriteCharacteristicRequest__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosWriteCharacteristicRequest_WriteType writeType;\n  NSString *remoteId;\n  NSString *characteristicUuid;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n  NSData *value;\n} ProtosWriteCharacteristicRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_CharacteristicUuid,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"writeType\",\n        .dataTypeSpecific.enumDescFunc = ProtosWriteCharacteristicRequest_WriteType_EnumDescriptor,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_WriteType,\n        .hasIndex = 4,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, writeType),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeEnum,\n      },\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicRequest_FieldNumber_Value,\n        .hasIndex = 5,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicRequest__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBytes,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosWriteCharacteristicRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosWriteCharacteristicRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\nint32_t ProtosWriteCharacteristicRequest_WriteType_RawValue(ProtosWriteCharacteristicRequest *message) {\n  GPBDescriptor *descriptor = [ProtosWriteCharacteristicRequest descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosWriteCharacteristicRequest_FieldNumber_WriteType];\n  return GPBGetMessageRawEnumField(message, field);\n}\n\nvoid SetProtosWriteCharacteristicRequest_WriteType_RawValue(ProtosWriteCharacteristicRequest *message, int32_t value) {\n  GPBDescriptor *descriptor = [ProtosWriteCharacteristicRequest descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosWriteCharacteristicRequest_FieldNumber_WriteType];\n  GPBSetMessageRawEnumField(message, field, value);\n}\n\n#pragma mark - Enum ProtosWriteCharacteristicRequest_WriteType\n\nGPBEnumDescriptor *ProtosWriteCharacteristicRequest_WriteType_EnumDescriptor(void) {\n  static _Atomic(GPBEnumDescriptor*) descriptor = nil;\n  if (!descriptor) {\n    static const char *valueNames =\n        \"WithResponse\\000WithoutResponse\\000\";\n    static const int32_t values[] = {\n        ProtosWriteCharacteristicRequest_WriteType_WithResponse,\n        ProtosWriteCharacteristicRequest_WriteType_WithoutResponse,\n    };\n    GPBEnumDescriptor *worker =\n        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(ProtosWriteCharacteristicRequest_WriteType)\n                                       valueNames:valueNames\n                                           values:values\n                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n                                     enumVerifier:ProtosWriteCharacteristicRequest_WriteType_IsValidValue];\n    GPBEnumDescriptor *expected = nil;\n    if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) {\n      [worker release];\n    }\n  }\n  return descriptor;\n}\n\nBOOL ProtosWriteCharacteristicRequest_WriteType_IsValidValue(int32_t value__) {\n  switch (value__) {\n    case ProtosWriteCharacteristicRequest_WriteType_WithResponse:\n    case ProtosWriteCharacteristicRequest_WriteType_WithoutResponse:\n      return YES;\n    default:\n      return NO;\n  }\n}\n\n#pragma mark - ProtosWriteCharacteristicResponse\n\n@implementation ProtosWriteCharacteristicResponse\n\n@dynamic hasRequest, request;\n@dynamic success;\n\ntypedef struct ProtosWriteCharacteristicResponse__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosWriteCharacteristicRequest *request;\n} ProtosWriteCharacteristicResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"request\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosWriteCharacteristicRequest),\n        .number = ProtosWriteCharacteristicResponse_FieldNumber_Request,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosWriteCharacteristicResponse__storage_, request),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"success\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteCharacteristicResponse_FieldNumber_Success,\n        .hasIndex = 1,\n        .offset = 2,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosWriteCharacteristicResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosWriteCharacteristicResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosWriteDescriptorRequest\n\n@implementation ProtosWriteDescriptorRequest\n\n@dynamic remoteId;\n@dynamic descriptorUuid;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n@dynamic characteristicUuid;\n@dynamic value;\n\ntypedef struct ProtosWriteDescriptorRequest__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  NSString *descriptorUuid;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n  NSString *characteristicUuid;\n  NSData *value;\n} ProtosWriteDescriptorRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"descriptorUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_DescriptorUuid,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, descriptorUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_ServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_CharacteristicUuid,\n        .hasIndex = 4,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"value\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorRequest_FieldNumber_Value,\n        .hasIndex = 5,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorRequest__storage_, value),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBytes,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosWriteDescriptorRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosWriteDescriptorRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosWriteDescriptorResponse\n\n@implementation ProtosWriteDescriptorResponse\n\n@dynamic hasRequest, request;\n@dynamic success;\n\ntypedef struct ProtosWriteDescriptorResponse__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosWriteDescriptorRequest *request;\n} ProtosWriteDescriptorResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"request\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosWriteDescriptorRequest),\n        .number = ProtosWriteDescriptorResponse_FieldNumber_Request,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosWriteDescriptorResponse__storage_, request),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"success\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosWriteDescriptorResponse_FieldNumber_Success,\n        .hasIndex = 1,\n        .offset = 2,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosWriteDescriptorResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosWriteDescriptorResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosSetNotificationRequest\n\n@implementation ProtosSetNotificationRequest\n\n@dynamic remoteId;\n@dynamic serviceUuid;\n@dynamic secondaryServiceUuid;\n@dynamic characteristicUuid;\n@dynamic enable;\n\ntypedef struct ProtosSetNotificationRequest__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  NSString *serviceUuid;\n  NSString *secondaryServiceUuid;\n  NSString *characteristicUuid;\n} ProtosSetNotificationRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"serviceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationRequest_FieldNumber_ServiceUuid,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationRequest__storage_, serviceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"secondaryServiceUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationRequest_FieldNumber_SecondaryServiceUuid,\n        .hasIndex = 2,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationRequest__storage_, secondaryServiceUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristicUuid\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationRequest_FieldNumber_CharacteristicUuid,\n        .hasIndex = 3,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationRequest__storage_, characteristicUuid),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"enable\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationRequest_FieldNumber_Enable,\n        .hasIndex = 4,\n        .offset = 5,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosSetNotificationRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosSetNotificationRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosSetNotificationResponse\n\n@implementation ProtosSetNotificationResponse\n\n@dynamic remoteId;\n@dynamic hasCharacteristic, characteristic;\n@dynamic success;\n\ntypedef struct ProtosSetNotificationResponse__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  ProtosBluetoothCharacteristic *characteristic;\n} ProtosSetNotificationResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationResponse_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationResponse__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristic\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothCharacteristic),\n        .number = ProtosSetNotificationResponse_FieldNumber_Characteristic,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosSetNotificationResponse__storage_, characteristic),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n      {\n        .name = \"success\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosSetNotificationResponse_FieldNumber_Success,\n        .hasIndex = 2,\n        .offset = 3,  // Stored in _has_storage_ to save space.\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeBool,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosSetNotificationResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosSetNotificationResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosOnCharacteristicChanged\n\n@implementation ProtosOnCharacteristicChanged\n\n@dynamic remoteId;\n@dynamic hasCharacteristic, characteristic;\n\ntypedef struct ProtosOnCharacteristicChanged__storage_ {\n  uint32_t _has_storage_[1];\n  NSString *remoteId;\n  ProtosBluetoothCharacteristic *characteristic;\n} ProtosOnCharacteristicChanged__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosOnCharacteristicChanged_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosOnCharacteristicChanged__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"characteristic\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothCharacteristic),\n        .number = ProtosOnCharacteristicChanged_FieldNumber_Characteristic,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosOnCharacteristicChanged__storage_, characteristic),\n        .flags = GPBFieldOptional,\n        .dataType = GPBDataTypeMessage,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosOnCharacteristicChanged class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosOnCharacteristicChanged__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosDeviceStateResponse\n\n@implementation ProtosDeviceStateResponse\n\n@dynamic remoteId;\n@dynamic state;\n\ntypedef struct ProtosDeviceStateResponse__storage_ {\n  uint32_t _has_storage_[1];\n  ProtosDeviceStateResponse_BluetoothDeviceState state;\n  NSString *remoteId;\n} ProtosDeviceStateResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosDeviceStateResponse_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosDeviceStateResponse__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"state\",\n        .dataTypeSpecific.enumDescFunc = ProtosDeviceStateResponse_BluetoothDeviceState_EnumDescriptor,\n        .number = ProtosDeviceStateResponse_FieldNumber_State,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosDeviceStateResponse__storage_, state),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeEnum,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosDeviceStateResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosDeviceStateResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\nint32_t ProtosDeviceStateResponse_State_RawValue(ProtosDeviceStateResponse *message) {\n  GPBDescriptor *descriptor = [ProtosDeviceStateResponse descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosDeviceStateResponse_FieldNumber_State];\n  return GPBGetMessageRawEnumField(message, field);\n}\n\nvoid SetProtosDeviceStateResponse_State_RawValue(ProtosDeviceStateResponse *message, int32_t value) {\n  GPBDescriptor *descriptor = [ProtosDeviceStateResponse descriptor];\n  GPBFieldDescriptor *field = [descriptor fieldWithNumber:ProtosDeviceStateResponse_FieldNumber_State];\n  GPBSetMessageRawEnumField(message, field, value);\n}\n\n#pragma mark - Enum ProtosDeviceStateResponse_BluetoothDeviceState\n\nGPBEnumDescriptor *ProtosDeviceStateResponse_BluetoothDeviceState_EnumDescriptor(void) {\n  static _Atomic(GPBEnumDescriptor*) descriptor = nil;\n  if (!descriptor) {\n    static const char *valueNames =\n        \"Disconnected\\000Connecting\\000Connected\\000Discon\"\n        \"necting\\000\";\n    static const int32_t values[] = {\n        ProtosDeviceStateResponse_BluetoothDeviceState_Disconnected,\n        ProtosDeviceStateResponse_BluetoothDeviceState_Connecting,\n        ProtosDeviceStateResponse_BluetoothDeviceState_Connected,\n        ProtosDeviceStateResponse_BluetoothDeviceState_Disconnecting,\n    };\n    GPBEnumDescriptor *worker =\n        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(ProtosDeviceStateResponse_BluetoothDeviceState)\n                                       valueNames:valueNames\n                                           values:values\n                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n                                     enumVerifier:ProtosDeviceStateResponse_BluetoothDeviceState_IsValidValue];\n    GPBEnumDescriptor *expected = nil;\n    if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) {\n      [worker release];\n    }\n  }\n  return descriptor;\n}\n\nBOOL ProtosDeviceStateResponse_BluetoothDeviceState_IsValidValue(int32_t value__) {\n  switch (value__) {\n    case ProtosDeviceStateResponse_BluetoothDeviceState_Disconnected:\n    case ProtosDeviceStateResponse_BluetoothDeviceState_Connecting:\n    case ProtosDeviceStateResponse_BluetoothDeviceState_Connected:\n    case ProtosDeviceStateResponse_BluetoothDeviceState_Disconnecting:\n      return YES;\n    default:\n      return NO;\n  }\n}\n\n#pragma mark - ProtosConnectedDevicesResponse\n\n@implementation ProtosConnectedDevicesResponse\n\n@dynamic devicesArray, devicesArray_Count;\n\ntypedef struct ProtosConnectedDevicesResponse__storage_ {\n  uint32_t _has_storage_[1];\n  NSMutableArray *devicesArray;\n} ProtosConnectedDevicesResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"devicesArray\",\n        .dataTypeSpecific.clazz = GPBObjCClass(ProtosBluetoothDevice),\n        .number = ProtosConnectedDevicesResponse_FieldNumber_DevicesArray,\n        .hasIndex = GPBNoHasBit,\n        .offset = (uint32_t)offsetof(ProtosConnectedDevicesResponse__storage_, devicesArray),\n        .flags = GPBFieldRepeated,\n        .dataType = GPBDataTypeMessage,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosConnectedDevicesResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosConnectedDevicesResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosMtuSizeRequest\n\n@implementation ProtosMtuSizeRequest\n\n@dynamic remoteId;\n@dynamic mtu;\n\ntypedef struct ProtosMtuSizeRequest__storage_ {\n  uint32_t _has_storage_[1];\n  uint32_t mtu;\n  NSString *remoteId;\n} ProtosMtuSizeRequest__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosMtuSizeRequest_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosMtuSizeRequest__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"mtu\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosMtuSizeRequest_FieldNumber_Mtu,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosMtuSizeRequest__storage_, mtu),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeUInt32,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosMtuSizeRequest class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosMtuSizeRequest__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosMtuSizeResponse\n\n@implementation ProtosMtuSizeResponse\n\n@dynamic remoteId;\n@dynamic mtu;\n\ntypedef struct ProtosMtuSizeResponse__storage_ {\n  uint32_t _has_storage_[1];\n  uint32_t mtu;\n  NSString *remoteId;\n} ProtosMtuSizeResponse__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosMtuSizeResponse_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosMtuSizeResponse__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"mtu\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosMtuSizeResponse_FieldNumber_Mtu,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosMtuSizeResponse__storage_, mtu),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeUInt32,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosMtuSizeResponse class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosMtuSizeResponse__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n#pragma mark - ProtosReadRssiResult\n\n@implementation ProtosReadRssiResult\n\n@dynamic remoteId;\n@dynamic rssi;\n\ntypedef struct ProtosReadRssiResult__storage_ {\n  uint32_t _has_storage_[1];\n  int32_t rssi;\n  NSString *remoteId;\n} ProtosReadRssiResult__storage_;\n\n// This method is threadsafe because it is initially called\n// in +initialize for each subclass.\n+ (GPBDescriptor *)descriptor {\n  static GPBDescriptor *descriptor = nil;\n  if (!descriptor) {\n    static GPBMessageFieldDescription fields[] = {\n      {\n        .name = \"remoteId\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadRssiResult_FieldNumber_RemoteId,\n        .hasIndex = 0,\n        .offset = (uint32_t)offsetof(ProtosReadRssiResult__storage_, remoteId),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeString,\n      },\n      {\n        .name = \"rssi\",\n        .dataTypeSpecific.clazz = Nil,\n        .number = ProtosReadRssiResult_FieldNumber_Rssi,\n        .hasIndex = 1,\n        .offset = (uint32_t)offsetof(ProtosReadRssiResult__storage_, rssi),\n        .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero),\n        .dataType = GPBDataTypeInt32,\n      },\n    };\n    GPBDescriptor *localDescriptor =\n        [GPBDescriptor allocDescriptorForClass:[ProtosReadRssiResult class]\n                                     rootClass:[ProtosFlutterblueplusRoot class]\n                                          file:ProtosFlutterblueplusRoot_FileDescriptor()\n                                        fields:fields\n                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))\n                                   storageSize:sizeof(ProtosReadRssiResult__storage_)\n                                         flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)];\n    #if defined(DEBUG) && DEBUG\n      NSAssert(descriptor == nil, @\"Startup recursed!\");\n    #endif  // DEBUG\n    descriptor = localDescriptor;\n  }\n  return descriptor;\n}\n\n@end\n\n\n#pragma clang diagnostic pop\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/flutter_blue_plus.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nlibrary flutter_blue_plus;\n\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:collection/collection.dart';\nimport 'package:convert/convert.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\nimport 'package:rxdart/rxdart.dart';\n\nimport 'gen/flutterblueplus.pb.dart' as protos;\n\npart 'src/bluetooth_characteristic.dart';\npart 'src/bluetooth_descriptor.dart';\npart 'src/bluetooth_device.dart';\npart 'src/bluetooth_service.dart';\npart 'src/flutter_blue_plus.dart';\npart 'src/guid.dart';\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/gen/flutterblueplus.pb.dart",
    "content": "///\n//  Generated code. Do not modify.\n//  source: flutterblueplus.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'flutterblueplus.pbenum.dart';\n\nexport 'flutterblueplus.pbenum.dart';\n\nclass Int32Value extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Int32Value', createEmptyInstance: create)\n    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.O3)\n    ..hasRequiredFields = false\n  ;\n\n  Int32Value._() : super();\n  factory Int32Value({\n    $core.int? value,\n  }) {\n    final _result = create();\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory Int32Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Int32Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Int32Value clone() => Int32Value()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Int32Value copyWith(void Function(Int32Value) updates) => super.copyWith((message) => updates(message as Int32Value)) as Int32Value; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static Int32Value create() => Int32Value._();\n  Int32Value createEmptyInstance() => create();\n  static $pb.PbList<Int32Value> createRepeated() => $pb.PbList<Int32Value>();\n  @$core.pragma('dart2js:noInline')\n  static Int32Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Int32Value>(create);\n  static Int32Value? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int v) { $_setSignedInt32(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => clearField(1);\n}\n\nclass BluetoothState extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BluetoothState', createEmptyInstance: create)\n    ..e<BluetoothState_State>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE, defaultOrMaker: BluetoothState_State.UNKNOWN, valueOf: BluetoothState_State.valueOf, enumValues: BluetoothState_State.values)\n    ..hasRequiredFields = false\n  ;\n\n  BluetoothState._() : super();\n  factory BluetoothState({\n    BluetoothState_State? state,\n  }) {\n    final _result = create();\n    if (state != null) {\n      _result.state = state;\n    }\n    return _result;\n  }\n  factory BluetoothState.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory BluetoothState.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  BluetoothState clone() => BluetoothState()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  BluetoothState copyWith(void Function(BluetoothState) updates) => super.copyWith((message) => updates(message as BluetoothState)) as BluetoothState; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static BluetoothState create() => BluetoothState._();\n  BluetoothState createEmptyInstance() => create();\n  static $pb.PbList<BluetoothState> createRepeated() => $pb.PbList<BluetoothState>();\n  @$core.pragma('dart2js:noInline')\n  static BluetoothState getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BluetoothState>(create);\n  static BluetoothState? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BluetoothState_State get state => $_getN(0);\n  @$pb.TagNumber(1)\n  set state(BluetoothState_State v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasState() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearState() => clearField(1);\n}\n\nclass AdvertisementData extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AdvertisementData', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'localName')\n    ..aOM<Int32Value>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'txPowerLevel', subBuilder: Int32Value.create)\n    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'connectable')\n    ..m<$core.int, $core.List<$core.int>>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'manufacturerData', entryClassName: 'AdvertisementData.ManufacturerDataEntry', keyFieldType: $pb.PbFieldType.O3, valueFieldType: $pb.PbFieldType.OY)\n    ..m<$core.String, $core.List<$core.int>>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceData', entryClassName: 'AdvertisementData.ServiceDataEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OY)\n    ..pPS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuids')\n    ..hasRequiredFields = false\n  ;\n\n  AdvertisementData._() : super();\n  factory AdvertisementData({\n    $core.String? localName,\n    Int32Value? txPowerLevel,\n    $core.bool? connectable,\n    $core.Map<$core.int, $core.List<$core.int>>? manufacturerData,\n    $core.Map<$core.String, $core.List<$core.int>>? serviceData,\n    $core.Iterable<$core.String>? serviceUuids,\n  }) {\n    final _result = create();\n    if (localName != null) {\n      _result.localName = localName;\n    }\n    if (txPowerLevel != null) {\n      _result.txPowerLevel = txPowerLevel;\n    }\n    if (connectable != null) {\n      _result.connectable = connectable;\n    }\n    if (manufacturerData != null) {\n      _result.manufacturerData.addAll(manufacturerData);\n    }\n    if (serviceData != null) {\n      _result.serviceData.addAll(serviceData);\n    }\n    if (serviceUuids != null) {\n      _result.serviceUuids.addAll(serviceUuids);\n    }\n    return _result;\n  }\n  factory AdvertisementData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory AdvertisementData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  AdvertisementData clone() => AdvertisementData()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  AdvertisementData copyWith(void Function(AdvertisementData) updates) => super.copyWith((message) => updates(message as AdvertisementData)) as AdvertisementData; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static AdvertisementData create() => AdvertisementData._();\n  AdvertisementData createEmptyInstance() => create();\n  static $pb.PbList<AdvertisementData> createRepeated() => $pb.PbList<AdvertisementData>();\n  @$core.pragma('dart2js:noInline')\n  static AdvertisementData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AdvertisementData>(create);\n  static AdvertisementData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get localName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set localName($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasLocalName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLocalName() => clearField(1);\n\n  @$pb.TagNumber(2)\n  Int32Value get txPowerLevel => $_getN(1);\n  @$pb.TagNumber(2)\n  set txPowerLevel(Int32Value v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasTxPowerLevel() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTxPowerLevel() => clearField(2);\n  @$pb.TagNumber(2)\n  Int32Value ensureTxPowerLevel() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get connectable => $_getBF(2);\n  @$pb.TagNumber(3)\n  set connectable($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasConnectable() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearConnectable() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.Map<$core.int, $core.List<$core.int>> get manufacturerData => $_getMap(3);\n\n  @$pb.TagNumber(5)\n  $core.Map<$core.String, $core.List<$core.int>> get serviceData => $_getMap(4);\n\n  @$pb.TagNumber(6)\n  $core.List<$core.String> get serviceUuids => $_getList(5);\n}\n\nclass ScanSettings extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ScanSettings', createEmptyInstance: create)\n    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'androidScanMode', $pb.PbFieldType.O3)\n    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuids')\n    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'allowDuplicates')\n    ..pPS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'macAddresses')\n    ..hasRequiredFields = false\n  ;\n\n  ScanSettings._() : super();\n  factory ScanSettings({\n    $core.int? androidScanMode,\n    $core.Iterable<$core.String>? serviceUuids,\n    $core.bool? allowDuplicates,\n    $core.Iterable<$core.String>? macAddresses,\n  }) {\n    final _result = create();\n    if (androidScanMode != null) {\n      _result.androidScanMode = androidScanMode;\n    }\n    if (serviceUuids != null) {\n      _result.serviceUuids.addAll(serviceUuids);\n    }\n    if (allowDuplicates != null) {\n      _result.allowDuplicates = allowDuplicates;\n    }\n    if (macAddresses != null) {\n      _result.macAddresses.addAll(macAddresses);\n    }\n    return _result;\n  }\n  factory ScanSettings.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ScanSettings.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ScanSettings clone() => ScanSettings()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ScanSettings copyWith(void Function(ScanSettings) updates) => super.copyWith((message) => updates(message as ScanSettings)) as ScanSettings; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ScanSettings create() => ScanSettings._();\n  ScanSettings createEmptyInstance() => create();\n  static $pb.PbList<ScanSettings> createRepeated() => $pb.PbList<ScanSettings>();\n  @$core.pragma('dart2js:noInline')\n  static ScanSettings getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ScanSettings>(create);\n  static ScanSettings? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get androidScanMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set androidScanMode($core.int v) { $_setSignedInt32(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasAndroidScanMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAndroidScanMode() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.List<$core.String> get serviceUuids => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get allowDuplicates => $_getBF(2);\n  @$pb.TagNumber(3)\n  set allowDuplicates($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasAllowDuplicates() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAllowDuplicates() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.List<$core.String> get macAddresses => $_getList(3);\n}\n\nclass ScanResult extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ScanResult', createEmptyInstance: create)\n    ..aOM<BluetoothDevice>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'device', subBuilder: BluetoothDevice.create)\n    ..aOM<AdvertisementData>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'advertisementData', subBuilder: AdvertisementData.create)\n    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rssi', $pb.PbFieldType.O3)\n    ..hasRequiredFields = false\n  ;\n\n  ScanResult._() : super();\n  factory ScanResult({\n    BluetoothDevice? device,\n    AdvertisementData? advertisementData,\n    $core.int? rssi,\n  }) {\n    final _result = create();\n    if (device != null) {\n      _result.device = device;\n    }\n    if (advertisementData != null) {\n      _result.advertisementData = advertisementData;\n    }\n    if (rssi != null) {\n      _result.rssi = rssi;\n    }\n    return _result;\n  }\n  factory ScanResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ScanResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ScanResult clone() => ScanResult()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ScanResult copyWith(void Function(ScanResult) updates) => super.copyWith((message) => updates(message as ScanResult)) as ScanResult; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ScanResult create() => ScanResult._();\n  ScanResult createEmptyInstance() => create();\n  static $pb.PbList<ScanResult> createRepeated() => $pb.PbList<ScanResult>();\n  @$core.pragma('dart2js:noInline')\n  static ScanResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ScanResult>(create);\n  static ScanResult? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BluetoothDevice get device => $_getN(0);\n  @$pb.TagNumber(1)\n  set device(BluetoothDevice v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasDevice() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDevice() => clearField(1);\n  @$pb.TagNumber(1)\n  BluetoothDevice ensureDevice() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  AdvertisementData get advertisementData => $_getN(1);\n  @$pb.TagNumber(2)\n  set advertisementData(AdvertisementData v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasAdvertisementData() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdvertisementData() => clearField(2);\n  @$pb.TagNumber(2)\n  AdvertisementData ensureAdvertisementData() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get rssi => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set rssi($core.int v) { $_setSignedInt32(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasRssi() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRssi() => clearField(3);\n}\n\nclass ConnectRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ConnectRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'androidAutoConnect')\n    ..hasRequiredFields = false\n  ;\n\n  ConnectRequest._() : super();\n  factory ConnectRequest({\n    $core.String? remoteId,\n    $core.bool? androidAutoConnect,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (androidAutoConnect != null) {\n      _result.androidAutoConnect = androidAutoConnect;\n    }\n    return _result;\n  }\n  factory ConnectRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ConnectRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ConnectRequest clone() => ConnectRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ConnectRequest copyWith(void Function(ConnectRequest) updates) => super.copyWith((message) => updates(message as ConnectRequest)) as ConnectRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ConnectRequest create() => ConnectRequest._();\n  ConnectRequest createEmptyInstance() => create();\n  static $pb.PbList<ConnectRequest> createRepeated() => $pb.PbList<ConnectRequest>();\n  @$core.pragma('dart2js:noInline')\n  static ConnectRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ConnectRequest>(create);\n  static ConnectRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get androidAutoConnect => $_getBF(1);\n  @$pb.TagNumber(2)\n  set androidAutoConnect($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasAndroidAutoConnect() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAndroidAutoConnect() => clearField(2);\n}\n\nclass BluetoothDevice extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BluetoothDevice', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')\n    ..e<BluetoothDevice_Type>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: BluetoothDevice_Type.UNKNOWN, valueOf: BluetoothDevice_Type.valueOf, enumValues: BluetoothDevice_Type.values)\n    ..hasRequiredFields = false\n  ;\n\n  BluetoothDevice._() : super();\n  factory BluetoothDevice({\n    $core.String? remoteId,\n    $core.String? name,\n    BluetoothDevice_Type? type,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (name != null) {\n      _result.name = name;\n    }\n    if (type != null) {\n      _result.type = type;\n    }\n    return _result;\n  }\n  factory BluetoothDevice.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory BluetoothDevice.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  BluetoothDevice clone() => BluetoothDevice()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  BluetoothDevice copyWith(void Function(BluetoothDevice) updates) => super.copyWith((message) => updates(message as BluetoothDevice)) as BluetoothDevice; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static BluetoothDevice create() => BluetoothDevice._();\n  BluetoothDevice createEmptyInstance() => create();\n  static $pb.PbList<BluetoothDevice> createRepeated() => $pb.PbList<BluetoothDevice>();\n  @$core.pragma('dart2js:noInline')\n  static BluetoothDevice getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BluetoothDevice>(create);\n  static BluetoothDevice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => clearField(2);\n\n  @$pb.TagNumber(3)\n  BluetoothDevice_Type get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(BluetoothDevice_Type v) { setField(3, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => clearField(3);\n}\n\nclass BluetoothService extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BluetoothService', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'uuid')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isPrimary')\n    ..pc<BluetoothCharacteristic>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristics', $pb.PbFieldType.PM, subBuilder: BluetoothCharacteristic.create)\n    ..pc<BluetoothService>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'includedServices', $pb.PbFieldType.PM, subBuilder: BluetoothService.create)\n    ..hasRequiredFields = false\n  ;\n\n  BluetoothService._() : super();\n  factory BluetoothService({\n    $core.String? uuid,\n    $core.String? remoteId,\n    $core.bool? isPrimary,\n    $core.Iterable<BluetoothCharacteristic>? characteristics,\n    $core.Iterable<BluetoothService>? includedServices,\n  }) {\n    final _result = create();\n    if (uuid != null) {\n      _result.uuid = uuid;\n    }\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (isPrimary != null) {\n      _result.isPrimary = isPrimary;\n    }\n    if (characteristics != null) {\n      _result.characteristics.addAll(characteristics);\n    }\n    if (includedServices != null) {\n      _result.includedServices.addAll(includedServices);\n    }\n    return _result;\n  }\n  factory BluetoothService.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory BluetoothService.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  BluetoothService clone() => BluetoothService()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  BluetoothService copyWith(void Function(BluetoothService) updates) => super.copyWith((message) => updates(message as BluetoothService)) as BluetoothService; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static BluetoothService create() => BluetoothService._();\n  BluetoothService createEmptyInstance() => create();\n  static $pb.PbList<BluetoothService> createRepeated() => $pb.PbList<BluetoothService>();\n  @$core.pragma('dart2js:noInline')\n  static BluetoothService getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BluetoothService>(create);\n  static BluetoothService? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get uuid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set uuid($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasUuid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUuid() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get remoteId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set remoteId($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRemoteId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRemoteId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isPrimary => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isPrimary($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasIsPrimary() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsPrimary() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.List<BluetoothCharacteristic> get characteristics => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $core.List<BluetoothService> get includedServices => $_getList(4);\n}\n\nclass BluetoothCharacteristic extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BluetoothCharacteristic', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'uuid')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid', protoName: 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid', protoName: 'secondaryServiceUuid')\n    ..pc<BluetoothDescriptor>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'descriptors', $pb.PbFieldType.PM, subBuilder: BluetoothDescriptor.create)\n    ..aOM<CharacteristicProperties>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'properties', subBuilder: CharacteristicProperties.create)\n    ..a<$core.List<$core.int>>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  BluetoothCharacteristic._() : super();\n  factory BluetoothCharacteristic({\n    $core.String? uuid,\n    $core.String? remoteId,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n    $core.Iterable<BluetoothDescriptor>? descriptors,\n    CharacteristicProperties? properties,\n    $core.List<$core.int>? value,\n  }) {\n    final _result = create();\n    if (uuid != null) {\n      _result.uuid = uuid;\n    }\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    if (descriptors != null) {\n      _result.descriptors.addAll(descriptors);\n    }\n    if (properties != null) {\n      _result.properties = properties;\n    }\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory BluetoothCharacteristic.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory BluetoothCharacteristic.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  BluetoothCharacteristic clone() => BluetoothCharacteristic()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  BluetoothCharacteristic copyWith(void Function(BluetoothCharacteristic) updates) => super.copyWith((message) => updates(message as BluetoothCharacteristic)) as BluetoothCharacteristic; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static BluetoothCharacteristic create() => BluetoothCharacteristic._();\n  BluetoothCharacteristic createEmptyInstance() => create();\n  static $pb.PbList<BluetoothCharacteristic> createRepeated() => $pb.PbList<BluetoothCharacteristic>();\n  @$core.pragma('dart2js:noInline')\n  static BluetoothCharacteristic getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BluetoothCharacteristic>(create);\n  static BluetoothCharacteristic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get uuid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set uuid($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasUuid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUuid() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get remoteId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set remoteId($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRemoteId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRemoteId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get secondaryServiceUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set secondaryServiceUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasSecondaryServiceUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSecondaryServiceUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.List<BluetoothDescriptor> get descriptors => $_getList(4);\n\n  @$pb.TagNumber(6)\n  CharacteristicProperties get properties => $_getN(5);\n  @$pb.TagNumber(6)\n  set properties(CharacteristicProperties v) { setField(6, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasProperties() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearProperties() => clearField(6);\n  @$pb.TagNumber(6)\n  CharacteristicProperties ensureProperties() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.List<$core.int> get value => $_getN(6);\n  @$pb.TagNumber(7)\n  set value($core.List<$core.int> v) { $_setBytes(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasValue() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearValue() => clearField(7);\n}\n\nclass BluetoothDescriptor extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BluetoothDescriptor', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'uuid')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid', protoName: 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid', protoName: 'characteristicUuid')\n    ..a<$core.List<$core.int>>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  BluetoothDescriptor._() : super();\n  factory BluetoothDescriptor({\n    $core.String? uuid,\n    $core.String? remoteId,\n    $core.String? serviceUuid,\n    $core.String? characteristicUuid,\n    $core.List<$core.int>? value,\n  }) {\n    final _result = create();\n    if (uuid != null) {\n      _result.uuid = uuid;\n    }\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory BluetoothDescriptor.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory BluetoothDescriptor.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  BluetoothDescriptor clone() => BluetoothDescriptor()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  BluetoothDescriptor copyWith(void Function(BluetoothDescriptor) updates) => super.copyWith((message) => updates(message as BluetoothDescriptor)) as BluetoothDescriptor; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static BluetoothDescriptor create() => BluetoothDescriptor._();\n  BluetoothDescriptor createEmptyInstance() => create();\n  static $pb.PbList<BluetoothDescriptor> createRepeated() => $pb.PbList<BluetoothDescriptor>();\n  @$core.pragma('dart2js:noInline')\n  static BluetoothDescriptor getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BluetoothDescriptor>(create);\n  static BluetoothDescriptor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get uuid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set uuid($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasUuid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUuid() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get remoteId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set remoteId($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRemoteId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRemoteId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get characteristicUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set characteristicUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasCharacteristicUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCharacteristicUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.List<$core.int> get value => $_getN(4);\n  @$pb.TagNumber(5)\n  set value($core.List<$core.int> v) { $_setBytes(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasValue() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearValue() => clearField(5);\n}\n\nclass CharacteristicProperties extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CharacteristicProperties', createEmptyInstance: create)\n    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'broadcast')\n    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'read')\n    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'writeWithoutResponse')\n    ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'write')\n    ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'notify')\n    ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'indicate')\n    ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'authenticatedSignedWrites')\n    ..aOB(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'extendedProperties')\n    ..aOB(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'notifyEncryptionRequired')\n    ..aOB(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'indicateEncryptionRequired')\n    ..hasRequiredFields = false\n  ;\n\n  CharacteristicProperties._() : super();\n  factory CharacteristicProperties({\n    $core.bool? broadcast,\n    $core.bool? read,\n    $core.bool? writeWithoutResponse,\n    $core.bool? write,\n    $core.bool? notify,\n    $core.bool? indicate,\n    $core.bool? authenticatedSignedWrites,\n    $core.bool? extendedProperties,\n    $core.bool? notifyEncryptionRequired,\n    $core.bool? indicateEncryptionRequired,\n  }) {\n    final _result = create();\n    if (broadcast != null) {\n      _result.broadcast = broadcast;\n    }\n    if (read != null) {\n      _result.read = read;\n    }\n    if (writeWithoutResponse != null) {\n      _result.writeWithoutResponse = writeWithoutResponse;\n    }\n    if (write != null) {\n      _result.write = write;\n    }\n    if (notify != null) {\n      _result.notify = notify;\n    }\n    if (indicate != null) {\n      _result.indicate = indicate;\n    }\n    if (authenticatedSignedWrites != null) {\n      _result.authenticatedSignedWrites = authenticatedSignedWrites;\n    }\n    if (extendedProperties != null) {\n      _result.extendedProperties = extendedProperties;\n    }\n    if (notifyEncryptionRequired != null) {\n      _result.notifyEncryptionRequired = notifyEncryptionRequired;\n    }\n    if (indicateEncryptionRequired != null) {\n      _result.indicateEncryptionRequired = indicateEncryptionRequired;\n    }\n    return _result;\n  }\n  factory CharacteristicProperties.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory CharacteristicProperties.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  CharacteristicProperties clone() => CharacteristicProperties()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  CharacteristicProperties copyWith(void Function(CharacteristicProperties) updates) => super.copyWith((message) => updates(message as CharacteristicProperties)) as CharacteristicProperties; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static CharacteristicProperties create() => CharacteristicProperties._();\n  CharacteristicProperties createEmptyInstance() => create();\n  static $pb.PbList<CharacteristicProperties> createRepeated() => $pb.PbList<CharacteristicProperties>();\n  @$core.pragma('dart2js:noInline')\n  static CharacteristicProperties getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CharacteristicProperties>(create);\n  static CharacteristicProperties? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get broadcast => $_getBF(0);\n  @$pb.TagNumber(1)\n  set broadcast($core.bool v) { $_setBool(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasBroadcast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBroadcast() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get read => $_getBF(1);\n  @$pb.TagNumber(2)\n  set read($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRead() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRead() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get writeWithoutResponse => $_getBF(2);\n  @$pb.TagNumber(3)\n  set writeWithoutResponse($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasWriteWithoutResponse() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWriteWithoutResponse() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get write => $_getBF(3);\n  @$pb.TagNumber(4)\n  set write($core.bool v) { $_setBool(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasWrite() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearWrite() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get notify => $_getBF(4);\n  @$pb.TagNumber(5)\n  set notify($core.bool v) { $_setBool(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasNotify() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNotify() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get indicate => $_getBF(5);\n  @$pb.TagNumber(6)\n  set indicate($core.bool v) { $_setBool(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasIndicate() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIndicate() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get authenticatedSignedWrites => $_getBF(6);\n  @$pb.TagNumber(7)\n  set authenticatedSignedWrites($core.bool v) { $_setBool(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasAuthenticatedSignedWrites() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAuthenticatedSignedWrites() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get extendedProperties => $_getBF(7);\n  @$pb.TagNumber(8)\n  set extendedProperties($core.bool v) { $_setBool(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasExtendedProperties() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearExtendedProperties() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get notifyEncryptionRequired => $_getBF(8);\n  @$pb.TagNumber(9)\n  set notifyEncryptionRequired($core.bool v) { $_setBool(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasNotifyEncryptionRequired() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNotifyEncryptionRequired() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get indicateEncryptionRequired => $_getBF(9);\n  @$pb.TagNumber(10)\n  set indicateEncryptionRequired($core.bool v) { $_setBool(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasIndicateEncryptionRequired() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIndicateEncryptionRequired() => clearField(10);\n}\n\nclass DiscoverServicesResult extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DiscoverServicesResult', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..pc<BluetoothService>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'services', $pb.PbFieldType.PM, subBuilder: BluetoothService.create)\n    ..hasRequiredFields = false\n  ;\n\n  DiscoverServicesResult._() : super();\n  factory DiscoverServicesResult({\n    $core.String? remoteId,\n    $core.Iterable<BluetoothService>? services,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (services != null) {\n      _result.services.addAll(services);\n    }\n    return _result;\n  }\n  factory DiscoverServicesResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory DiscoverServicesResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  DiscoverServicesResult clone() => DiscoverServicesResult()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  DiscoverServicesResult copyWith(void Function(DiscoverServicesResult) updates) => super.copyWith((message) => updates(message as DiscoverServicesResult)) as DiscoverServicesResult; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static DiscoverServicesResult create() => DiscoverServicesResult._();\n  DiscoverServicesResult createEmptyInstance() => create();\n  static $pb.PbList<DiscoverServicesResult> createRepeated() => $pb.PbList<DiscoverServicesResult>();\n  @$core.pragma('dart2js:noInline')\n  static DiscoverServicesResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DiscoverServicesResult>(create);\n  static DiscoverServicesResult? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.List<BluetoothService> get services => $_getList(1);\n}\n\nclass ReadCharacteristicRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ReadCharacteristicRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid')\n    ..hasRequiredFields = false\n  ;\n\n  ReadCharacteristicRequest._() : super();\n  factory ReadCharacteristicRequest({\n    $core.String? remoteId,\n    $core.String? characteristicUuid,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    return _result;\n  }\n  factory ReadCharacteristicRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ReadCharacteristicRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ReadCharacteristicRequest clone() => ReadCharacteristicRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ReadCharacteristicRequest copyWith(void Function(ReadCharacteristicRequest) updates) => super.copyWith((message) => updates(message as ReadCharacteristicRequest)) as ReadCharacteristicRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ReadCharacteristicRequest create() => ReadCharacteristicRequest._();\n  ReadCharacteristicRequest createEmptyInstance() => create();\n  static $pb.PbList<ReadCharacteristicRequest> createRepeated() => $pb.PbList<ReadCharacteristicRequest>();\n  @$core.pragma('dart2js:noInline')\n  static ReadCharacteristicRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReadCharacteristicRequest>(create);\n  static ReadCharacteristicRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get characteristicUuid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set characteristicUuid($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCharacteristicUuid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCharacteristicUuid() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get secondaryServiceUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set secondaryServiceUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasSecondaryServiceUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSecondaryServiceUuid() => clearField(4);\n}\n\nclass ReadCharacteristicResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ReadCharacteristicResponse', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOM<BluetoothCharacteristic>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristic', subBuilder: BluetoothCharacteristic.create)\n    ..hasRequiredFields = false\n  ;\n\n  ReadCharacteristicResponse._() : super();\n  factory ReadCharacteristicResponse({\n    $core.String? remoteId,\n    BluetoothCharacteristic? characteristic,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (characteristic != null) {\n      _result.characteristic = characteristic;\n    }\n    return _result;\n  }\n  factory ReadCharacteristicResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ReadCharacteristicResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ReadCharacteristicResponse clone() => ReadCharacteristicResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ReadCharacteristicResponse copyWith(void Function(ReadCharacteristicResponse) updates) => super.copyWith((message) => updates(message as ReadCharacteristicResponse)) as ReadCharacteristicResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ReadCharacteristicResponse create() => ReadCharacteristicResponse._();\n  ReadCharacteristicResponse createEmptyInstance() => create();\n  static $pb.PbList<ReadCharacteristicResponse> createRepeated() => $pb.PbList<ReadCharacteristicResponse>();\n  @$core.pragma('dart2js:noInline')\n  static ReadCharacteristicResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReadCharacteristicResponse>(create);\n  static ReadCharacteristicResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic get characteristic => $_getN(1);\n  @$pb.TagNumber(2)\n  set characteristic(BluetoothCharacteristic v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCharacteristic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCharacteristic() => clearField(2);\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic ensureCharacteristic() => $_ensure(1);\n}\n\nclass ReadDescriptorRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ReadDescriptorRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'descriptorUuid')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid')\n    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid')\n    ..hasRequiredFields = false\n  ;\n\n  ReadDescriptorRequest._() : super();\n  factory ReadDescriptorRequest({\n    $core.String? remoteId,\n    $core.String? descriptorUuid,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n    $core.String? characteristicUuid,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (descriptorUuid != null) {\n      _result.descriptorUuid = descriptorUuid;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    return _result;\n  }\n  factory ReadDescriptorRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ReadDescriptorRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ReadDescriptorRequest clone() => ReadDescriptorRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ReadDescriptorRequest copyWith(void Function(ReadDescriptorRequest) updates) => super.copyWith((message) => updates(message as ReadDescriptorRequest)) as ReadDescriptorRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ReadDescriptorRequest create() => ReadDescriptorRequest._();\n  ReadDescriptorRequest createEmptyInstance() => create();\n  static $pb.PbList<ReadDescriptorRequest> createRepeated() => $pb.PbList<ReadDescriptorRequest>();\n  @$core.pragma('dart2js:noInline')\n  static ReadDescriptorRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReadDescriptorRequest>(create);\n  static ReadDescriptorRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get descriptorUuid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set descriptorUuid($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDescriptorUuid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescriptorUuid() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get secondaryServiceUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set secondaryServiceUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasSecondaryServiceUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSecondaryServiceUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get characteristicUuid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set characteristicUuid($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasCharacteristicUuid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCharacteristicUuid() => clearField(5);\n}\n\nclass ReadDescriptorResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ReadDescriptorResponse', createEmptyInstance: create)\n    ..aOM<ReadDescriptorRequest>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'request', subBuilder: ReadDescriptorRequest.create)\n    ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  ReadDescriptorResponse._() : super();\n  factory ReadDescriptorResponse({\n    ReadDescriptorRequest? request,\n    $core.List<$core.int>? value,\n  }) {\n    final _result = create();\n    if (request != null) {\n      _result.request = request;\n    }\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory ReadDescriptorResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ReadDescriptorResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ReadDescriptorResponse clone() => ReadDescriptorResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ReadDescriptorResponse copyWith(void Function(ReadDescriptorResponse) updates) => super.copyWith((message) => updates(message as ReadDescriptorResponse)) as ReadDescriptorResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ReadDescriptorResponse create() => ReadDescriptorResponse._();\n  ReadDescriptorResponse createEmptyInstance() => create();\n  static $pb.PbList<ReadDescriptorResponse> createRepeated() => $pb.PbList<ReadDescriptorResponse>();\n  @$core.pragma('dart2js:noInline')\n  static ReadDescriptorResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReadDescriptorResponse>(create);\n  static ReadDescriptorResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReadDescriptorRequest get request => $_getN(0);\n  @$pb.TagNumber(1)\n  set request(ReadDescriptorRequest v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRequest() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRequest() => clearField(1);\n  @$pb.TagNumber(1)\n  ReadDescriptorRequest ensureRequest() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.List<$core.int> get value => $_getN(1);\n  @$pb.TagNumber(2)\n  set value($core.List<$core.int> v) { $_setBytes(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasValue() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValue() => clearField(2);\n}\n\nclass WriteCharacteristicRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'WriteCharacteristicRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid')\n    ..e<WriteCharacteristicRequest_WriteType>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'writeType', $pb.PbFieldType.OE, defaultOrMaker: WriteCharacteristicRequest_WriteType.WITH_RESPONSE, valueOf: WriteCharacteristicRequest_WriteType.valueOf, enumValues: WriteCharacteristicRequest_WriteType.values)\n    ..a<$core.List<$core.int>>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  WriteCharacteristicRequest._() : super();\n  factory WriteCharacteristicRequest({\n    $core.String? remoteId,\n    $core.String? characteristicUuid,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n    WriteCharacteristicRequest_WriteType? writeType,\n    $core.List<$core.int>? value,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    if (writeType != null) {\n      _result.writeType = writeType;\n    }\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory WriteCharacteristicRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory WriteCharacteristicRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  WriteCharacteristicRequest clone() => WriteCharacteristicRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  WriteCharacteristicRequest copyWith(void Function(WriteCharacteristicRequest) updates) => super.copyWith((message) => updates(message as WriteCharacteristicRequest)) as WriteCharacteristicRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static WriteCharacteristicRequest create() => WriteCharacteristicRequest._();\n  WriteCharacteristicRequest createEmptyInstance() => create();\n  static $pb.PbList<WriteCharacteristicRequest> createRepeated() => $pb.PbList<WriteCharacteristicRequest>();\n  @$core.pragma('dart2js:noInline')\n  static WriteCharacteristicRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WriteCharacteristicRequest>(create);\n  static WriteCharacteristicRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get characteristicUuid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set characteristicUuid($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCharacteristicUuid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCharacteristicUuid() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get secondaryServiceUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set secondaryServiceUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasSecondaryServiceUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSecondaryServiceUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  WriteCharacteristicRequest_WriteType get writeType => $_getN(4);\n  @$pb.TagNumber(5)\n  set writeType(WriteCharacteristicRequest_WriteType v) { setField(5, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasWriteType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearWriteType() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.List<$core.int> get value => $_getN(5);\n  @$pb.TagNumber(6)\n  set value($core.List<$core.int> v) { $_setBytes(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasValue() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearValue() => clearField(6);\n}\n\nclass WriteCharacteristicResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'WriteCharacteristicResponse', createEmptyInstance: create)\n    ..aOM<WriteCharacteristicRequest>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'request', subBuilder: WriteCharacteristicRequest.create)\n    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'success')\n    ..hasRequiredFields = false\n  ;\n\n  WriteCharacteristicResponse._() : super();\n  factory WriteCharacteristicResponse({\n    WriteCharacteristicRequest? request,\n    $core.bool? success,\n  }) {\n    final _result = create();\n    if (request != null) {\n      _result.request = request;\n    }\n    if (success != null) {\n      _result.success = success;\n    }\n    return _result;\n  }\n  factory WriteCharacteristicResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory WriteCharacteristicResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  WriteCharacteristicResponse clone() => WriteCharacteristicResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  WriteCharacteristicResponse copyWith(void Function(WriteCharacteristicResponse) updates) => super.copyWith((message) => updates(message as WriteCharacteristicResponse)) as WriteCharacteristicResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static WriteCharacteristicResponse create() => WriteCharacteristicResponse._();\n  WriteCharacteristicResponse createEmptyInstance() => create();\n  static $pb.PbList<WriteCharacteristicResponse> createRepeated() => $pb.PbList<WriteCharacteristicResponse>();\n  @$core.pragma('dart2js:noInline')\n  static WriteCharacteristicResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WriteCharacteristicResponse>(create);\n  static WriteCharacteristicResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WriteCharacteristicRequest get request => $_getN(0);\n  @$pb.TagNumber(1)\n  set request(WriteCharacteristicRequest v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRequest() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRequest() => clearField(1);\n  @$pb.TagNumber(1)\n  WriteCharacteristicRequest ensureRequest() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get success => $_getBF(1);\n  @$pb.TagNumber(2)\n  set success($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasSuccess() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSuccess() => clearField(2);\n}\n\nclass WriteDescriptorRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'WriteDescriptorRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'descriptorUuid')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid')\n    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid')\n    ..a<$core.List<$core.int>>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  WriteDescriptorRequest._() : super();\n  factory WriteDescriptorRequest({\n    $core.String? remoteId,\n    $core.String? descriptorUuid,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n    $core.String? characteristicUuid,\n    $core.List<$core.int>? value,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (descriptorUuid != null) {\n      _result.descriptorUuid = descriptorUuid;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    if (value != null) {\n      _result.value = value;\n    }\n    return _result;\n  }\n  factory WriteDescriptorRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory WriteDescriptorRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  WriteDescriptorRequest clone() => WriteDescriptorRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  WriteDescriptorRequest copyWith(void Function(WriteDescriptorRequest) updates) => super.copyWith((message) => updates(message as WriteDescriptorRequest)) as WriteDescriptorRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static WriteDescriptorRequest create() => WriteDescriptorRequest._();\n  WriteDescriptorRequest createEmptyInstance() => create();\n  static $pb.PbList<WriteDescriptorRequest> createRepeated() => $pb.PbList<WriteDescriptorRequest>();\n  @$core.pragma('dart2js:noInline')\n  static WriteDescriptorRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WriteDescriptorRequest>(create);\n  static WriteDescriptorRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get descriptorUuid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set descriptorUuid($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDescriptorUuid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescriptorUuid() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get secondaryServiceUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set secondaryServiceUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasSecondaryServiceUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSecondaryServiceUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get characteristicUuid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set characteristicUuid($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasCharacteristicUuid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCharacteristicUuid() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.List<$core.int> get value => $_getN(5);\n  @$pb.TagNumber(6)\n  set value($core.List<$core.int> v) { $_setBytes(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasValue() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearValue() => clearField(6);\n}\n\nclass WriteDescriptorResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'WriteDescriptorResponse', createEmptyInstance: create)\n    ..aOM<WriteDescriptorRequest>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'request', subBuilder: WriteDescriptorRequest.create)\n    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'success')\n    ..hasRequiredFields = false\n  ;\n\n  WriteDescriptorResponse._() : super();\n  factory WriteDescriptorResponse({\n    WriteDescriptorRequest? request,\n    $core.bool? success,\n  }) {\n    final _result = create();\n    if (request != null) {\n      _result.request = request;\n    }\n    if (success != null) {\n      _result.success = success;\n    }\n    return _result;\n  }\n  factory WriteDescriptorResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory WriteDescriptorResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  WriteDescriptorResponse clone() => WriteDescriptorResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  WriteDescriptorResponse copyWith(void Function(WriteDescriptorResponse) updates) => super.copyWith((message) => updates(message as WriteDescriptorResponse)) as WriteDescriptorResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static WriteDescriptorResponse create() => WriteDescriptorResponse._();\n  WriteDescriptorResponse createEmptyInstance() => create();\n  static $pb.PbList<WriteDescriptorResponse> createRepeated() => $pb.PbList<WriteDescriptorResponse>();\n  @$core.pragma('dart2js:noInline')\n  static WriteDescriptorResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WriteDescriptorResponse>(create);\n  static WriteDescriptorResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WriteDescriptorRequest get request => $_getN(0);\n  @$pb.TagNumber(1)\n  set request(WriteDescriptorRequest v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRequest() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRequest() => clearField(1);\n  @$pb.TagNumber(1)\n  WriteDescriptorRequest ensureRequest() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get success => $_getBF(1);\n  @$pb.TagNumber(2)\n  set success($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasSuccess() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSuccess() => clearField(2);\n}\n\nclass SetNotificationRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetNotificationRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceUuid')\n    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'secondaryServiceUuid')\n    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristicUuid')\n    ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enable')\n    ..hasRequiredFields = false\n  ;\n\n  SetNotificationRequest._() : super();\n  factory SetNotificationRequest({\n    $core.String? remoteId,\n    $core.String? serviceUuid,\n    $core.String? secondaryServiceUuid,\n    $core.String? characteristicUuid,\n    $core.bool? enable,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (serviceUuid != null) {\n      _result.serviceUuid = serviceUuid;\n    }\n    if (secondaryServiceUuid != null) {\n      _result.secondaryServiceUuid = secondaryServiceUuid;\n    }\n    if (characteristicUuid != null) {\n      _result.characteristicUuid = characteristicUuid;\n    }\n    if (enable != null) {\n      _result.enable = enable;\n    }\n    return _result;\n  }\n  factory SetNotificationRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory SetNotificationRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  SetNotificationRequest clone() => SetNotificationRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  SetNotificationRequest copyWith(void Function(SetNotificationRequest) updates) => super.copyWith((message) => updates(message as SetNotificationRequest)) as SetNotificationRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static SetNotificationRequest create() => SetNotificationRequest._();\n  SetNotificationRequest createEmptyInstance() => create();\n  static $pb.PbList<SetNotificationRequest> createRepeated() => $pb.PbList<SetNotificationRequest>();\n  @$core.pragma('dart2js:noInline')\n  static SetNotificationRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetNotificationRequest>(create);\n  static SetNotificationRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get serviceUuid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set serviceUuid($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasServiceUuid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearServiceUuid() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get secondaryServiceUuid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set secondaryServiceUuid($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasSecondaryServiceUuid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSecondaryServiceUuid() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get characteristicUuid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set characteristicUuid($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasCharacteristicUuid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCharacteristicUuid() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get enable => $_getBF(4);\n  @$pb.TagNumber(5)\n  set enable($core.bool v) { $_setBool(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasEnable() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearEnable() => clearField(5);\n}\n\nclass SetNotificationResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetNotificationResponse', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOM<BluetoothCharacteristic>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristic', subBuilder: BluetoothCharacteristic.create)\n    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'success')\n    ..hasRequiredFields = false\n  ;\n\n  SetNotificationResponse._() : super();\n  factory SetNotificationResponse({\n    $core.String? remoteId,\n    BluetoothCharacteristic? characteristic,\n    $core.bool? success,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (characteristic != null) {\n      _result.characteristic = characteristic;\n    }\n    if (success != null) {\n      _result.success = success;\n    }\n    return _result;\n  }\n  factory SetNotificationResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory SetNotificationResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  SetNotificationResponse clone() => SetNotificationResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  SetNotificationResponse copyWith(void Function(SetNotificationResponse) updates) => super.copyWith((message) => updates(message as SetNotificationResponse)) as SetNotificationResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static SetNotificationResponse create() => SetNotificationResponse._();\n  SetNotificationResponse createEmptyInstance() => create();\n  static $pb.PbList<SetNotificationResponse> createRepeated() => $pb.PbList<SetNotificationResponse>();\n  @$core.pragma('dart2js:noInline')\n  static SetNotificationResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SetNotificationResponse>(create);\n  static SetNotificationResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic get characteristic => $_getN(1);\n  @$pb.TagNumber(2)\n  set characteristic(BluetoothCharacteristic v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCharacteristic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCharacteristic() => clearField(2);\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic ensureCharacteristic() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get success => $_getBF(2);\n  @$pb.TagNumber(3)\n  set success($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasSuccess() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSuccess() => clearField(3);\n}\n\nclass OnCharacteristicChanged extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'OnCharacteristicChanged', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..aOM<BluetoothCharacteristic>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'characteristic', subBuilder: BluetoothCharacteristic.create)\n    ..hasRequiredFields = false\n  ;\n\n  OnCharacteristicChanged._() : super();\n  factory OnCharacteristicChanged({\n    $core.String? remoteId,\n    BluetoothCharacteristic? characteristic,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (characteristic != null) {\n      _result.characteristic = characteristic;\n    }\n    return _result;\n  }\n  factory OnCharacteristicChanged.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory OnCharacteristicChanged.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  OnCharacteristicChanged clone() => OnCharacteristicChanged()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  OnCharacteristicChanged copyWith(void Function(OnCharacteristicChanged) updates) => super.copyWith((message) => updates(message as OnCharacteristicChanged)) as OnCharacteristicChanged; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static OnCharacteristicChanged create() => OnCharacteristicChanged._();\n  OnCharacteristicChanged createEmptyInstance() => create();\n  static $pb.PbList<OnCharacteristicChanged> createRepeated() => $pb.PbList<OnCharacteristicChanged>();\n  @$core.pragma('dart2js:noInline')\n  static OnCharacteristicChanged getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OnCharacteristicChanged>(create);\n  static OnCharacteristicChanged? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic get characteristic => $_getN(1);\n  @$pb.TagNumber(2)\n  set characteristic(BluetoothCharacteristic v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCharacteristic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCharacteristic() => clearField(2);\n  @$pb.TagNumber(2)\n  BluetoothCharacteristic ensureCharacteristic() => $_ensure(1);\n}\n\nclass DeviceStateResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DeviceStateResponse', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..e<DeviceStateResponse_BluetoothDeviceState>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE, defaultOrMaker: DeviceStateResponse_BluetoothDeviceState.DISCONNECTED, valueOf: DeviceStateResponse_BluetoothDeviceState.valueOf, enumValues: DeviceStateResponse_BluetoothDeviceState.values)\n    ..hasRequiredFields = false\n  ;\n\n  DeviceStateResponse._() : super();\n  factory DeviceStateResponse({\n    $core.String? remoteId,\n    DeviceStateResponse_BluetoothDeviceState? state,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (state != null) {\n      _result.state = state;\n    }\n    return _result;\n  }\n  factory DeviceStateResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory DeviceStateResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  DeviceStateResponse clone() => DeviceStateResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  DeviceStateResponse copyWith(void Function(DeviceStateResponse) updates) => super.copyWith((message) => updates(message as DeviceStateResponse)) as DeviceStateResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static DeviceStateResponse create() => DeviceStateResponse._();\n  DeviceStateResponse createEmptyInstance() => create();\n  static $pb.PbList<DeviceStateResponse> createRepeated() => $pb.PbList<DeviceStateResponse>();\n  @$core.pragma('dart2js:noInline')\n  static DeviceStateResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DeviceStateResponse>(create);\n  static DeviceStateResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  DeviceStateResponse_BluetoothDeviceState get state => $_getN(1);\n  @$pb.TagNumber(2)\n  set state(DeviceStateResponse_BluetoothDeviceState v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearState() => clearField(2);\n}\n\nclass ConnectedDevicesResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ConnectedDevicesResponse', createEmptyInstance: create)\n    ..pc<BluetoothDevice>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'devices', $pb.PbFieldType.PM, subBuilder: BluetoothDevice.create)\n    ..hasRequiredFields = false\n  ;\n\n  ConnectedDevicesResponse._() : super();\n  factory ConnectedDevicesResponse({\n    $core.Iterable<BluetoothDevice>? devices,\n  }) {\n    final _result = create();\n    if (devices != null) {\n      _result.devices.addAll(devices);\n    }\n    return _result;\n  }\n  factory ConnectedDevicesResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ConnectedDevicesResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ConnectedDevicesResponse clone() => ConnectedDevicesResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ConnectedDevicesResponse copyWith(void Function(ConnectedDevicesResponse) updates) => super.copyWith((message) => updates(message as ConnectedDevicesResponse)) as ConnectedDevicesResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ConnectedDevicesResponse create() => ConnectedDevicesResponse._();\n  ConnectedDevicesResponse createEmptyInstance() => create();\n  static $pb.PbList<ConnectedDevicesResponse> createRepeated() => $pb.PbList<ConnectedDevicesResponse>();\n  @$core.pragma('dart2js:noInline')\n  static ConnectedDevicesResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ConnectedDevicesResponse>(create);\n  static ConnectedDevicesResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.List<BluetoothDevice> get devices => $_getList(0);\n}\n\nclass MtuSizeRequest extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MtuSizeRequest', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mtu', $pb.PbFieldType.OU3)\n    ..hasRequiredFields = false\n  ;\n\n  MtuSizeRequest._() : super();\n  factory MtuSizeRequest({\n    $core.String? remoteId,\n    $core.int? mtu,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (mtu != null) {\n      _result.mtu = mtu;\n    }\n    return _result;\n  }\n  factory MtuSizeRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory MtuSizeRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  MtuSizeRequest clone() => MtuSizeRequest()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  MtuSizeRequest copyWith(void Function(MtuSizeRequest) updates) => super.copyWith((message) => updates(message as MtuSizeRequest)) as MtuSizeRequest; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static MtuSizeRequest create() => MtuSizeRequest._();\n  MtuSizeRequest createEmptyInstance() => create();\n  static $pb.PbList<MtuSizeRequest> createRepeated() => $pb.PbList<MtuSizeRequest>();\n  @$core.pragma('dart2js:noInline')\n  static MtuSizeRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MtuSizeRequest>(create);\n  static MtuSizeRequest? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get mtu => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set mtu($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasMtu() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMtu() => clearField(2);\n}\n\nclass MtuSizeResponse extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MtuSizeResponse', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mtu', $pb.PbFieldType.OU3)\n    ..hasRequiredFields = false\n  ;\n\n  MtuSizeResponse._() : super();\n  factory MtuSizeResponse({\n    $core.String? remoteId,\n    $core.int? mtu,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (mtu != null) {\n      _result.mtu = mtu;\n    }\n    return _result;\n  }\n  factory MtuSizeResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory MtuSizeResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  MtuSizeResponse clone() => MtuSizeResponse()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  MtuSizeResponse copyWith(void Function(MtuSizeResponse) updates) => super.copyWith((message) => updates(message as MtuSizeResponse)) as MtuSizeResponse; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static MtuSizeResponse create() => MtuSizeResponse._();\n  MtuSizeResponse createEmptyInstance() => create();\n  static $pb.PbList<MtuSizeResponse> createRepeated() => $pb.PbList<MtuSizeResponse>();\n  @$core.pragma('dart2js:noInline')\n  static MtuSizeResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MtuSizeResponse>(create);\n  static MtuSizeResponse? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get mtu => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set mtu($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasMtu() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMtu() => clearField(2);\n}\n\nclass ReadRssiResult extends $pb.GeneratedMessage {\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ReadRssiResult', createEmptyInstance: create)\n    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'remoteId')\n    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rssi', $pb.PbFieldType.O3)\n    ..hasRequiredFields = false\n  ;\n\n  ReadRssiResult._() : super();\n  factory ReadRssiResult({\n    $core.String? remoteId,\n    $core.int? rssi,\n  }) {\n    final _result = create();\n    if (remoteId != null) {\n      _result.remoteId = remoteId;\n    }\n    if (rssi != null) {\n      _result.rssi = rssi;\n    }\n    return _result;\n  }\n  factory ReadRssiResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ReadRssiResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ReadRssiResult clone() => ReadRssiResult()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ReadRssiResult copyWith(void Function(ReadRssiResult) updates) => super.copyWith((message) => updates(message as ReadRssiResult)) as ReadRssiResult; // ignore: deprecated_member_use\n  $pb.BuilderInfo get info_ => _i;\n  @$core.pragma('dart2js:noInline')\n  static ReadRssiResult create() => ReadRssiResult._();\n  ReadRssiResult createEmptyInstance() => create();\n  static $pb.PbList<ReadRssiResult> createRepeated() => $pb.PbList<ReadRssiResult>();\n  @$core.pragma('dart2js:noInline')\n  static ReadRssiResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReadRssiResult>(create);\n  static ReadRssiResult? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get remoteId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set remoteId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasRemoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRemoteId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get rssi => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set rssi($core.int v) { $_setSignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRssi() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRssi() => clearField(2);\n}\n\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/gen/flutterblueplus.pbenum.dart",
    "content": "///\n//  Generated code. Do not modify.\n//  source: flutterblueplus.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields\n\n// ignore_for_file: UNDEFINED_SHOWN_NAME\nimport 'dart:core' as $core;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass BluetoothState_State extends $pb.ProtobufEnum {\n  static const BluetoothState_State UNKNOWN = BluetoothState_State._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNKNOWN');\n  static const BluetoothState_State UNAVAILABLE = BluetoothState_State._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNAVAILABLE');\n  static const BluetoothState_State UNAUTHORIZED = BluetoothState_State._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNAUTHORIZED');\n  static const BluetoothState_State TURNING_ON = BluetoothState_State._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TURNING_ON');\n  static const BluetoothState_State ON = BluetoothState_State._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ON');\n  static const BluetoothState_State TURNING_OFF = BluetoothState_State._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TURNING_OFF');\n  static const BluetoothState_State OFF = BluetoothState_State._(6, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'OFF');\n\n  static const $core.List<BluetoothState_State> values = <BluetoothState_State> [\n    UNKNOWN,\n    UNAVAILABLE,\n    UNAUTHORIZED,\n    TURNING_ON,\n    ON,\n    TURNING_OFF,\n    OFF,\n  ];\n\n  static final $core.Map<$core.int, BluetoothState_State> _byValue = $pb.ProtobufEnum.initByValue(values);\n  static BluetoothState_State? valueOf($core.int value) => _byValue[value];\n\n  const BluetoothState_State._($core.int v, $core.String n) : super(v, n);\n}\n\nclass BluetoothDevice_Type extends $pb.ProtobufEnum {\n  static const BluetoothDevice_Type UNKNOWN = BluetoothDevice_Type._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNKNOWN');\n  static const BluetoothDevice_Type CLASSIC = BluetoothDevice_Type._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CLASSIC');\n  static const BluetoothDevice_Type LE = BluetoothDevice_Type._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LE');\n  static const BluetoothDevice_Type DUAL = BluetoothDevice_Type._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DUAL');\n\n  static const $core.List<BluetoothDevice_Type> values = <BluetoothDevice_Type> [\n    UNKNOWN,\n    CLASSIC,\n    LE,\n    DUAL,\n  ];\n\n  static final $core.Map<$core.int, BluetoothDevice_Type> _byValue = $pb.ProtobufEnum.initByValue(values);\n  static BluetoothDevice_Type? valueOf($core.int value) => _byValue[value];\n\n  const BluetoothDevice_Type._($core.int v, $core.String n) : super(v, n);\n}\n\nclass WriteCharacteristicRequest_WriteType extends $pb.ProtobufEnum {\n  static const WriteCharacteristicRequest_WriteType WITH_RESPONSE = WriteCharacteristicRequest_WriteType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WITH_RESPONSE');\n  static const WriteCharacteristicRequest_WriteType WITHOUT_RESPONSE = WriteCharacteristicRequest_WriteType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WITHOUT_RESPONSE');\n\n  static const $core.List<WriteCharacteristicRequest_WriteType> values = <WriteCharacteristicRequest_WriteType> [\n    WITH_RESPONSE,\n    WITHOUT_RESPONSE,\n  ];\n\n  static final $core.Map<$core.int, WriteCharacteristicRequest_WriteType> _byValue = $pb.ProtobufEnum.initByValue(values);\n  static WriteCharacteristicRequest_WriteType? valueOf($core.int value) => _byValue[value];\n\n  const WriteCharacteristicRequest_WriteType._($core.int v, $core.String n) : super(v, n);\n}\n\nclass DeviceStateResponse_BluetoothDeviceState extends $pb.ProtobufEnum {\n  static const DeviceStateResponse_BluetoothDeviceState DISCONNECTED = DeviceStateResponse_BluetoothDeviceState._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTED');\n  static const DeviceStateResponse_BluetoothDeviceState CONNECTING = DeviceStateResponse_BluetoothDeviceState._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CONNECTING');\n  static const DeviceStateResponse_BluetoothDeviceState CONNECTED = DeviceStateResponse_BluetoothDeviceState._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CONNECTED');\n  static const DeviceStateResponse_BluetoothDeviceState DISCONNECTING = DeviceStateResponse_BluetoothDeviceState._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTING');\n\n  static const $core.List<DeviceStateResponse_BluetoothDeviceState> values = <DeviceStateResponse_BluetoothDeviceState> [\n    DISCONNECTED,\n    CONNECTING,\n    CONNECTED,\n    DISCONNECTING,\n  ];\n\n  static final $core.Map<$core.int, DeviceStateResponse_BluetoothDeviceState> _byValue = $pb.ProtobufEnum.initByValue(values);\n  static DeviceStateResponse_BluetoothDeviceState? valueOf($core.int value) => _byValue[value];\n\n  const DeviceStateResponse_BluetoothDeviceState._($core.int v, $core.String n) : super(v, n);\n}\n\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/gen/flutterblueplus.pbjson.dart",
    "content": "///\n//  Generated code. Do not modify.\n//  source: flutterblueplus.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package\n\nimport 'dart:core' as $core;\nimport 'dart:convert' as $convert;\nimport 'dart:typed_data' as $typed_data;\n@$core.Deprecated('Use int32ValueDescriptor instead')\nconst Int32Value$json = const {\n  '1': 'Int32Value',\n  '2': const [\n    const {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `Int32Value`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List int32ValueDescriptor = $convert.base64Decode('CgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZQ==');\n@$core.Deprecated('Use bluetoothStateDescriptor instead')\nconst BluetoothState$json = const {\n  '1': 'BluetoothState',\n  '2': const [\n    const {'1': 'state', '3': 1, '4': 1, '5': 14, '6': '.BluetoothState.State', '10': 'state'},\n  ],\n  '4': const [BluetoothState_State$json],\n};\n\n@$core.Deprecated('Use bluetoothStateDescriptor instead')\nconst BluetoothState_State$json = const {\n  '1': 'State',\n  '2': const [\n    const {'1': 'UNKNOWN', '2': 0},\n    const {'1': 'UNAVAILABLE', '2': 1},\n    const {'1': 'UNAUTHORIZED', '2': 2},\n    const {'1': 'TURNING_ON', '2': 3},\n    const {'1': 'ON', '2': 4},\n    const {'1': 'TURNING_OFF', '2': 5},\n    const {'1': 'OFF', '2': 6},\n  ],\n};\n\n/// Descriptor for `BluetoothState`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bluetoothStateDescriptor = $convert.base64Decode('Cg5CbHVldG9vdGhTdGF0ZRIrCgVzdGF0ZRgBIAEoDjIVLkJsdWV0b290aFN0YXRlLlN0YXRlUgVzdGF0ZSJpCgVTdGF0ZRILCgdVTktOT1dOEAASDwoLVU5BVkFJTEFCTEUQARIQCgxVTkFVVEhPUklaRUQQAhIOCgpUVVJOSU5HX09OEAMSBgoCT04QBBIPCgtUVVJOSU5HX09GRhAFEgcKA09GRhAG');\n@$core.Deprecated('Use advertisementDataDescriptor instead')\nconst AdvertisementData$json = const {\n  '1': 'AdvertisementData',\n  '2': const [\n    const {'1': 'local_name', '3': 1, '4': 1, '5': 9, '10': 'localName'},\n    const {'1': 'tx_power_level', '3': 2, '4': 1, '5': 11, '6': '.Int32Value', '10': 'txPowerLevel'},\n    const {'1': 'connectable', '3': 3, '4': 1, '5': 8, '10': 'connectable'},\n    const {'1': 'manufacturer_data', '3': 4, '4': 3, '5': 11, '6': '.AdvertisementData.ManufacturerDataEntry', '10': 'manufacturerData'},\n    const {'1': 'service_data', '3': 5, '4': 3, '5': 11, '6': '.AdvertisementData.ServiceDataEntry', '10': 'serviceData'},\n    const {'1': 'service_uuids', '3': 6, '4': 3, '5': 9, '10': 'serviceUuids'},\n  ],\n  '3': const [AdvertisementData_ManufacturerDataEntry$json, AdvertisementData_ServiceDataEntry$json],\n};\n\n@$core.Deprecated('Use advertisementDataDescriptor instead')\nconst AdvertisementData_ManufacturerDataEntry$json = const {\n  '1': 'ManufacturerDataEntry',\n  '2': const [\n    const {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'},\n  ],\n  '7': const {'7': true},\n};\n\n@$core.Deprecated('Use advertisementDataDescriptor instead')\nconst AdvertisementData_ServiceDataEntry$json = const {\n  '1': 'ServiceDataEntry',\n  '2': const [\n    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'},\n  ],\n  '7': const {'7': true},\n};\n\n/// Descriptor for `AdvertisementData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List advertisementDataDescriptor = $convert.base64Decode('ChFBZHZlcnRpc2VtZW50RGF0YRIdCgpsb2NhbF9uYW1lGAEgASgJUglsb2NhbE5hbWUSMQoOdHhfcG93ZXJfbGV2ZWwYAiABKAsyCy5JbnQzMlZhbHVlUgx0eFBvd2VyTGV2ZWwSIAoLY29ubmVjdGFibGUYAyABKAhSC2Nvbm5lY3RhYmxlElUKEW1hbnVmYWN0dXJlcl9kYXRhGAQgAygLMiguQWR2ZXJ0aXNlbWVudERhdGEuTWFudWZhY3R1cmVyRGF0YUVudHJ5UhBtYW51ZmFjdHVyZXJEYXRhEkYKDHNlcnZpY2VfZGF0YRgFIAMoCzIjLkFkdmVydGlzZW1lbnREYXRhLlNlcnZpY2VEYXRhRW50cnlSC3NlcnZpY2VEYXRhEiMKDXNlcnZpY2VfdXVpZHMYBiADKAlSDHNlcnZpY2VVdWlkcxpDChVNYW51ZmFjdHVyZXJEYXRhRW50cnkSEAoDa2V5GAEgASgFUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ARo+ChBTZXJ2aWNlRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAE=');\n@$core.Deprecated('Use scanSettingsDescriptor instead')\nconst ScanSettings$json = const {\n  '1': 'ScanSettings',\n  '2': const [\n    const {'1': 'android_scan_mode', '3': 1, '4': 1, '5': 5, '10': 'androidScanMode'},\n    const {'1': 'service_uuids', '3': 2, '4': 3, '5': 9, '10': 'serviceUuids'},\n    const {'1': 'allow_duplicates', '3': 3, '4': 1, '5': 8, '10': 'allowDuplicates'},\n    const {'1': 'mac_addresses', '3': 4, '4': 3, '5': 9, '10': 'macAddresses'},\n  ],\n};\n\n/// Descriptor for `ScanSettings`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List scanSettingsDescriptor = $convert.base64Decode('CgxTY2FuU2V0dGluZ3MSKgoRYW5kcm9pZF9zY2FuX21vZGUYASABKAVSD2FuZHJvaWRTY2FuTW9kZRIjCg1zZXJ2aWNlX3V1aWRzGAIgAygJUgxzZXJ2aWNlVXVpZHMSKQoQYWxsb3dfZHVwbGljYXRlcxgDIAEoCFIPYWxsb3dEdXBsaWNhdGVzEiMKDW1hY19hZGRyZXNzZXMYBCADKAlSDG1hY0FkZHJlc3Nlcw==');\n@$core.Deprecated('Use scanResultDescriptor instead')\nconst ScanResult$json = const {\n  '1': 'ScanResult',\n  '2': const [\n    const {'1': 'device', '3': 1, '4': 1, '5': 11, '6': '.BluetoothDevice', '10': 'device'},\n    const {'1': 'advertisement_data', '3': 2, '4': 1, '5': 11, '6': '.AdvertisementData', '10': 'advertisementData'},\n    const {'1': 'rssi', '3': 3, '4': 1, '5': 5, '10': 'rssi'},\n  ],\n};\n\n/// Descriptor for `ScanResult`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List scanResultDescriptor = $convert.base64Decode('CgpTY2FuUmVzdWx0EigKBmRldmljZRgBIAEoCzIQLkJsdWV0b290aERldmljZVIGZGV2aWNlEkEKEmFkdmVydGlzZW1lbnRfZGF0YRgCIAEoCzISLkFkdmVydGlzZW1lbnREYXRhUhFhZHZlcnRpc2VtZW50RGF0YRISCgRyc3NpGAMgASgFUgRyc3Np');\n@$core.Deprecated('Use connectRequestDescriptor instead')\nconst ConnectRequest$json = const {\n  '1': 'ConnectRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'android_auto_connect', '3': 2, '4': 1, '5': 8, '10': 'androidAutoConnect'},\n  ],\n};\n\n/// Descriptor for `ConnectRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List connectRequestDescriptor = $convert.base64Decode('Cg5Db25uZWN0UmVxdWVzdBIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEjAKFGFuZHJvaWRfYXV0b19jb25uZWN0GAIgASgIUhJhbmRyb2lkQXV0b0Nvbm5lY3Q=');\n@$core.Deprecated('Use bluetoothDeviceDescriptor instead')\nconst BluetoothDevice$json = const {\n  '1': 'BluetoothDevice',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    const {'1': 'type', '3': 3, '4': 1, '5': 14, '6': '.BluetoothDevice.Type', '10': 'type'},\n  ],\n  '4': const [BluetoothDevice_Type$json],\n};\n\n@$core.Deprecated('Use bluetoothDeviceDescriptor instead')\nconst BluetoothDevice_Type$json = const {\n  '1': 'Type',\n  '2': const [\n    const {'1': 'UNKNOWN', '2': 0},\n    const {'1': 'CLASSIC', '2': 1},\n    const {'1': 'LE', '2': 2},\n    const {'1': 'DUAL', '2': 3},\n  ],\n};\n\n/// Descriptor for `BluetoothDevice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bluetoothDeviceDescriptor = $convert.base64Decode('Cg9CbHVldG9vdGhEZXZpY2USGwoJcmVtb3RlX2lkGAEgASgJUghyZW1vdGVJZBISCgRuYW1lGAIgASgJUgRuYW1lEikKBHR5cGUYAyABKA4yFS5CbHVldG9vdGhEZXZpY2UuVHlwZVIEdHlwZSIyCgRUeXBlEgsKB1VOS05PV04QABILCgdDTEFTU0lDEAESBgoCTEUQAhIICgREVUFMEAM=');\n@$core.Deprecated('Use bluetoothServiceDescriptor instead')\nconst BluetoothService$json = const {\n  '1': 'BluetoothService',\n  '2': const [\n    const {'1': 'uuid', '3': 1, '4': 1, '5': 9, '10': 'uuid'},\n    const {'1': 'remote_id', '3': 2, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'is_primary', '3': 3, '4': 1, '5': 8, '10': 'isPrimary'},\n    const {'1': 'characteristics', '3': 4, '4': 3, '5': 11, '6': '.BluetoothCharacteristic', '10': 'characteristics'},\n    const {'1': 'included_services', '3': 5, '4': 3, '5': 11, '6': '.BluetoothService', '10': 'includedServices'},\n  ],\n};\n\n/// Descriptor for `BluetoothService`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bluetoothServiceDescriptor = $convert.base64Decode('ChBCbHVldG9vdGhTZXJ2aWNlEhIKBHV1aWQYASABKAlSBHV1aWQSGwoJcmVtb3RlX2lkGAIgASgJUghyZW1vdGVJZBIdCgppc19wcmltYXJ5GAMgASgIUglpc1ByaW1hcnkSQgoPY2hhcmFjdGVyaXN0aWNzGAQgAygLMhguQmx1ZXRvb3RoQ2hhcmFjdGVyaXN0aWNSD2NoYXJhY3RlcmlzdGljcxI+ChFpbmNsdWRlZF9zZXJ2aWNlcxgFIAMoCzIRLkJsdWV0b290aFNlcnZpY2VSEGluY2x1ZGVkU2VydmljZXM=');\n@$core.Deprecated('Use bluetoothCharacteristicDescriptor instead')\nconst BluetoothCharacteristic$json = const {\n  '1': 'BluetoothCharacteristic',\n  '2': const [\n    const {'1': 'uuid', '3': 1, '4': 1, '5': 9, '10': 'uuid'},\n    const {'1': 'remote_id', '3': 2, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'serviceUuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondaryServiceUuid', '3': 4, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n    const {'1': 'descriptors', '3': 5, '4': 3, '5': 11, '6': '.BluetoothDescriptor', '10': 'descriptors'},\n    const {'1': 'properties', '3': 6, '4': 1, '5': 11, '6': '.CharacteristicProperties', '10': 'properties'},\n    const {'1': 'value', '3': 7, '4': 1, '5': 12, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `BluetoothCharacteristic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bluetoothCharacteristicDescriptor = $convert.base64Decode('ChdCbHVldG9vdGhDaGFyYWN0ZXJpc3RpYxISCgR1dWlkGAEgASgJUgR1dWlkEhsKCXJlbW90ZV9pZBgCIAEoCVIIcmVtb3RlSWQSIAoLc2VydmljZVV1aWQYAyABKAlSC3NlcnZpY2VVdWlkEjIKFHNlY29uZGFyeVNlcnZpY2VVdWlkGAQgASgJUhRzZWNvbmRhcnlTZXJ2aWNlVXVpZBI2CgtkZXNjcmlwdG9ycxgFIAMoCzIULkJsdWV0b290aERlc2NyaXB0b3JSC2Rlc2NyaXB0b3JzEjkKCnByb3BlcnRpZXMYBiABKAsyGS5DaGFyYWN0ZXJpc3RpY1Byb3BlcnRpZXNSCnByb3BlcnRpZXMSFAoFdmFsdWUYByABKAxSBXZhbHVl');\n@$core.Deprecated('Use bluetoothDescriptorDescriptor instead')\nconst BluetoothDescriptor$json = const {\n  '1': 'BluetoothDescriptor',\n  '2': const [\n    const {'1': 'uuid', '3': 1, '4': 1, '5': 9, '10': 'uuid'},\n    const {'1': 'remote_id', '3': 2, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'serviceUuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'characteristicUuid', '3': 4, '4': 1, '5': 9, '10': 'characteristicUuid'},\n    const {'1': 'value', '3': 5, '4': 1, '5': 12, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `BluetoothDescriptor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bluetoothDescriptorDescriptor = $convert.base64Decode('ChNCbHVldG9vdGhEZXNjcmlwdG9yEhIKBHV1aWQYASABKAlSBHV1aWQSGwoJcmVtb3RlX2lkGAIgASgJUghyZW1vdGVJZBIgCgtzZXJ2aWNlVXVpZBgDIAEoCVILc2VydmljZVV1aWQSLgoSY2hhcmFjdGVyaXN0aWNVdWlkGAQgASgJUhJjaGFyYWN0ZXJpc3RpY1V1aWQSFAoFdmFsdWUYBSABKAxSBXZhbHVl');\n@$core.Deprecated('Use characteristicPropertiesDescriptor instead')\nconst CharacteristicProperties$json = const {\n  '1': 'CharacteristicProperties',\n  '2': const [\n    const {'1': 'broadcast', '3': 1, '4': 1, '5': 8, '10': 'broadcast'},\n    const {'1': 'read', '3': 2, '4': 1, '5': 8, '10': 'read'},\n    const {'1': 'write_without_response', '3': 3, '4': 1, '5': 8, '10': 'writeWithoutResponse'},\n    const {'1': 'write', '3': 4, '4': 1, '5': 8, '10': 'write'},\n    const {'1': 'notify', '3': 5, '4': 1, '5': 8, '10': 'notify'},\n    const {'1': 'indicate', '3': 6, '4': 1, '5': 8, '10': 'indicate'},\n    const {'1': 'authenticated_signed_writes', '3': 7, '4': 1, '5': 8, '10': 'authenticatedSignedWrites'},\n    const {'1': 'extended_properties', '3': 8, '4': 1, '5': 8, '10': 'extendedProperties'},\n    const {'1': 'notify_encryption_required', '3': 9, '4': 1, '5': 8, '10': 'notifyEncryptionRequired'},\n    const {'1': 'indicate_encryption_required', '3': 10, '4': 1, '5': 8, '10': 'indicateEncryptionRequired'},\n  ],\n};\n\n/// Descriptor for `CharacteristicProperties`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List characteristicPropertiesDescriptor = $convert.base64Decode('ChhDaGFyYWN0ZXJpc3RpY1Byb3BlcnRpZXMSHAoJYnJvYWRjYXN0GAEgASgIUglicm9hZGNhc3QSEgoEcmVhZBgCIAEoCFIEcmVhZBI0ChZ3cml0ZV93aXRob3V0X3Jlc3BvbnNlGAMgASgIUhR3cml0ZVdpdGhvdXRSZXNwb25zZRIUCgV3cml0ZRgEIAEoCFIFd3JpdGUSFgoGbm90aWZ5GAUgASgIUgZub3RpZnkSGgoIaW5kaWNhdGUYBiABKAhSCGluZGljYXRlEj4KG2F1dGhlbnRpY2F0ZWRfc2lnbmVkX3dyaXRlcxgHIAEoCFIZYXV0aGVudGljYXRlZFNpZ25lZFdyaXRlcxIvChNleHRlbmRlZF9wcm9wZXJ0aWVzGAggASgIUhJleHRlbmRlZFByb3BlcnRpZXMSPAoabm90aWZ5X2VuY3J5cHRpb25fcmVxdWlyZWQYCSABKAhSGG5vdGlmeUVuY3J5cHRpb25SZXF1aXJlZBJAChxpbmRpY2F0ZV9lbmNyeXB0aW9uX3JlcXVpcmVkGAogASgIUhppbmRpY2F0ZUVuY3J5cHRpb25SZXF1aXJlZA==');\n@$core.Deprecated('Use discoverServicesResultDescriptor instead')\nconst DiscoverServicesResult$json = const {\n  '1': 'DiscoverServicesResult',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'services', '3': 2, '4': 3, '5': 11, '6': '.BluetoothService', '10': 'services'},\n  ],\n};\n\n/// Descriptor for `DiscoverServicesResult`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List discoverServicesResultDescriptor = $convert.base64Decode('ChZEaXNjb3ZlclNlcnZpY2VzUmVzdWx0EhsKCXJlbW90ZV9pZBgBIAEoCVIIcmVtb3RlSWQSLQoIc2VydmljZXMYAiADKAsyES5CbHVldG9vdGhTZXJ2aWNlUghzZXJ2aWNlcw==');\n@$core.Deprecated('Use readCharacteristicRequestDescriptor instead')\nconst ReadCharacteristicRequest$json = const {\n  '1': 'ReadCharacteristicRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'characteristic_uuid', '3': 2, '4': 1, '5': 9, '10': 'characteristicUuid'},\n    const {'1': 'service_uuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondary_service_uuid', '3': 4, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n  ],\n};\n\n/// Descriptor for `ReadCharacteristicRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List readCharacteristicRequestDescriptor = $convert.base64Decode('ChlSZWFkQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0EhsKCXJlbW90ZV9pZBgBIAEoCVIIcmVtb3RlSWQSLwoTY2hhcmFjdGVyaXN0aWNfdXVpZBgCIAEoCVISY2hhcmFjdGVyaXN0aWNVdWlkEiEKDHNlcnZpY2VfdXVpZBgDIAEoCVILc2VydmljZVV1aWQSNAoWc2Vjb25kYXJ5X3NlcnZpY2VfdXVpZBgEIAEoCVIUc2Vjb25kYXJ5U2VydmljZVV1aWQ=');\n@$core.Deprecated('Use readCharacteristicResponseDescriptor instead')\nconst ReadCharacteristicResponse$json = const {\n  '1': 'ReadCharacteristicResponse',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'characteristic', '3': 2, '4': 1, '5': 11, '6': '.BluetoothCharacteristic', '10': 'characteristic'},\n  ],\n};\n\n/// Descriptor for `ReadCharacteristicResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List readCharacteristicResponseDescriptor = $convert.base64Decode('ChpSZWFkQ2hhcmFjdGVyaXN0aWNSZXNwb25zZRIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEkAKDmNoYXJhY3RlcmlzdGljGAIgASgLMhguQmx1ZXRvb3RoQ2hhcmFjdGVyaXN0aWNSDmNoYXJhY3RlcmlzdGlj');\n@$core.Deprecated('Use readDescriptorRequestDescriptor instead')\nconst ReadDescriptorRequest$json = const {\n  '1': 'ReadDescriptorRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'descriptor_uuid', '3': 2, '4': 1, '5': 9, '10': 'descriptorUuid'},\n    const {'1': 'service_uuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondary_service_uuid', '3': 4, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n    const {'1': 'characteristic_uuid', '3': 5, '4': 1, '5': 9, '10': 'characteristicUuid'},\n  ],\n};\n\n/// Descriptor for `ReadDescriptorRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List readDescriptorRequestDescriptor = $convert.base64Decode('ChVSZWFkRGVzY3JpcHRvclJlcXVlc3QSGwoJcmVtb3RlX2lkGAEgASgJUghyZW1vdGVJZBInCg9kZXNjcmlwdG9yX3V1aWQYAiABKAlSDmRlc2NyaXB0b3JVdWlkEiEKDHNlcnZpY2VfdXVpZBgDIAEoCVILc2VydmljZVV1aWQSNAoWc2Vjb25kYXJ5X3NlcnZpY2VfdXVpZBgEIAEoCVIUc2Vjb25kYXJ5U2VydmljZVV1aWQSLwoTY2hhcmFjdGVyaXN0aWNfdXVpZBgFIAEoCVISY2hhcmFjdGVyaXN0aWNVdWlk');\n@$core.Deprecated('Use readDescriptorResponseDescriptor instead')\nconst ReadDescriptorResponse$json = const {\n  '1': 'ReadDescriptorResponse',\n  '2': const [\n    const {'1': 'request', '3': 1, '4': 1, '5': 11, '6': '.ReadDescriptorRequest', '10': 'request'},\n    const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `ReadDescriptorResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List readDescriptorResponseDescriptor = $convert.base64Decode('ChZSZWFkRGVzY3JpcHRvclJlc3BvbnNlEjAKB3JlcXVlc3QYASABKAsyFi5SZWFkRGVzY3JpcHRvclJlcXVlc3RSB3JlcXVlc3QSFAoFdmFsdWUYAiABKAxSBXZhbHVl');\n@$core.Deprecated('Use writeCharacteristicRequestDescriptor instead')\nconst WriteCharacteristicRequest$json = const {\n  '1': 'WriteCharacteristicRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'characteristic_uuid', '3': 2, '4': 1, '5': 9, '10': 'characteristicUuid'},\n    const {'1': 'service_uuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondary_service_uuid', '3': 4, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n    const {'1': 'write_type', '3': 5, '4': 1, '5': 14, '6': '.WriteCharacteristicRequest.WriteType', '10': 'writeType'},\n    const {'1': 'value', '3': 6, '4': 1, '5': 12, '10': 'value'},\n  ],\n  '4': const [WriteCharacteristicRequest_WriteType$json],\n};\n\n@$core.Deprecated('Use writeCharacteristicRequestDescriptor instead')\nconst WriteCharacteristicRequest_WriteType$json = const {\n  '1': 'WriteType',\n  '2': const [\n    const {'1': 'WITH_RESPONSE', '2': 0},\n    const {'1': 'WITHOUT_RESPONSE', '2': 1},\n  ],\n};\n\n/// Descriptor for `WriteCharacteristicRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List writeCharacteristicRequestDescriptor = $convert.base64Decode('ChpXcml0ZUNoYXJhY3RlcmlzdGljUmVxdWVzdBIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEi8KE2NoYXJhY3RlcmlzdGljX3V1aWQYAiABKAlSEmNoYXJhY3RlcmlzdGljVXVpZBIhCgxzZXJ2aWNlX3V1aWQYAyABKAlSC3NlcnZpY2VVdWlkEjQKFnNlY29uZGFyeV9zZXJ2aWNlX3V1aWQYBCABKAlSFHNlY29uZGFyeVNlcnZpY2VVdWlkEkQKCndyaXRlX3R5cGUYBSABKA4yJS5Xcml0ZUNoYXJhY3RlcmlzdGljUmVxdWVzdC5Xcml0ZVR5cGVSCXdyaXRlVHlwZRIUCgV2YWx1ZRgGIAEoDFIFdmFsdWUiNAoJV3JpdGVUeXBlEhEKDVdJVEhfUkVTUE9OU0UQABIUChBXSVRIT1VUX1JFU1BPTlNFEAE=');\n@$core.Deprecated('Use writeCharacteristicResponseDescriptor instead')\nconst WriteCharacteristicResponse$json = const {\n  '1': 'WriteCharacteristicResponse',\n  '2': const [\n    const {'1': 'request', '3': 1, '4': 1, '5': 11, '6': '.WriteCharacteristicRequest', '10': 'request'},\n    const {'1': 'success', '3': 2, '4': 1, '5': 8, '10': 'success'},\n  ],\n};\n\n/// Descriptor for `WriteCharacteristicResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List writeCharacteristicResponseDescriptor = $convert.base64Decode('ChtXcml0ZUNoYXJhY3RlcmlzdGljUmVzcG9uc2USNQoHcmVxdWVzdBgBIAEoCzIbLldyaXRlQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0UgdyZXF1ZXN0EhgKB3N1Y2Nlc3MYAiABKAhSB3N1Y2Nlc3M=');\n@$core.Deprecated('Use writeDescriptorRequestDescriptor instead')\nconst WriteDescriptorRequest$json = const {\n  '1': 'WriteDescriptorRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'descriptor_uuid', '3': 2, '4': 1, '5': 9, '10': 'descriptorUuid'},\n    const {'1': 'service_uuid', '3': 3, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondary_service_uuid', '3': 4, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n    const {'1': 'characteristic_uuid', '3': 5, '4': 1, '5': 9, '10': 'characteristicUuid'},\n    const {'1': 'value', '3': 6, '4': 1, '5': 12, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `WriteDescriptorRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List writeDescriptorRequestDescriptor = $convert.base64Decode('ChZXcml0ZURlc2NyaXB0b3JSZXF1ZXN0EhsKCXJlbW90ZV9pZBgBIAEoCVIIcmVtb3RlSWQSJwoPZGVzY3JpcHRvcl91dWlkGAIgASgJUg5kZXNjcmlwdG9yVXVpZBIhCgxzZXJ2aWNlX3V1aWQYAyABKAlSC3NlcnZpY2VVdWlkEjQKFnNlY29uZGFyeV9zZXJ2aWNlX3V1aWQYBCABKAlSFHNlY29uZGFyeVNlcnZpY2VVdWlkEi8KE2NoYXJhY3RlcmlzdGljX3V1aWQYBSABKAlSEmNoYXJhY3RlcmlzdGljVXVpZBIUCgV2YWx1ZRgGIAEoDFIFdmFsdWU=');\n@$core.Deprecated('Use writeDescriptorResponseDescriptor instead')\nconst WriteDescriptorResponse$json = const {\n  '1': 'WriteDescriptorResponse',\n  '2': const [\n    const {'1': 'request', '3': 1, '4': 1, '5': 11, '6': '.WriteDescriptorRequest', '10': 'request'},\n    const {'1': 'success', '3': 2, '4': 1, '5': 8, '10': 'success'},\n  ],\n};\n\n/// Descriptor for `WriteDescriptorResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List writeDescriptorResponseDescriptor = $convert.base64Decode('ChdXcml0ZURlc2NyaXB0b3JSZXNwb25zZRIxCgdyZXF1ZXN0GAEgASgLMhcuV3JpdGVEZXNjcmlwdG9yUmVxdWVzdFIHcmVxdWVzdBIYCgdzdWNjZXNzGAIgASgIUgdzdWNjZXNz');\n@$core.Deprecated('Use setNotificationRequestDescriptor instead')\nconst SetNotificationRequest$json = const {\n  '1': 'SetNotificationRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'service_uuid', '3': 2, '4': 1, '5': 9, '10': 'serviceUuid'},\n    const {'1': 'secondary_service_uuid', '3': 3, '4': 1, '5': 9, '10': 'secondaryServiceUuid'},\n    const {'1': 'characteristic_uuid', '3': 4, '4': 1, '5': 9, '10': 'characteristicUuid'},\n    const {'1': 'enable', '3': 5, '4': 1, '5': 8, '10': 'enable'},\n  ],\n};\n\n/// Descriptor for `SetNotificationRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setNotificationRequestDescriptor = $convert.base64Decode('ChZTZXROb3RpZmljYXRpb25SZXF1ZXN0EhsKCXJlbW90ZV9pZBgBIAEoCVIIcmVtb3RlSWQSIQoMc2VydmljZV91dWlkGAIgASgJUgtzZXJ2aWNlVXVpZBI0ChZzZWNvbmRhcnlfc2VydmljZV91dWlkGAMgASgJUhRzZWNvbmRhcnlTZXJ2aWNlVXVpZBIvChNjaGFyYWN0ZXJpc3RpY191dWlkGAQgASgJUhJjaGFyYWN0ZXJpc3RpY1V1aWQSFgoGZW5hYmxlGAUgASgIUgZlbmFibGU=');\n@$core.Deprecated('Use setNotificationResponseDescriptor instead')\nconst SetNotificationResponse$json = const {\n  '1': 'SetNotificationResponse',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'characteristic', '3': 2, '4': 1, '5': 11, '6': '.BluetoothCharacteristic', '10': 'characteristic'},\n    const {'1': 'success', '3': 3, '4': 1, '5': 8, '10': 'success'},\n  ],\n};\n\n/// Descriptor for `SetNotificationResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setNotificationResponseDescriptor = $convert.base64Decode('ChdTZXROb3RpZmljYXRpb25SZXNwb25zZRIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEkAKDmNoYXJhY3RlcmlzdGljGAIgASgLMhguQmx1ZXRvb3RoQ2hhcmFjdGVyaXN0aWNSDmNoYXJhY3RlcmlzdGljEhgKB3N1Y2Nlc3MYAyABKAhSB3N1Y2Nlc3M=');\n@$core.Deprecated('Use onCharacteristicChangedDescriptor instead')\nconst OnCharacteristicChanged$json = const {\n  '1': 'OnCharacteristicChanged',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'characteristic', '3': 2, '4': 1, '5': 11, '6': '.BluetoothCharacteristic', '10': 'characteristic'},\n  ],\n};\n\n/// Descriptor for `OnCharacteristicChanged`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onCharacteristicChangedDescriptor = $convert.base64Decode('ChdPbkNoYXJhY3RlcmlzdGljQ2hhbmdlZBIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEkAKDmNoYXJhY3RlcmlzdGljGAIgASgLMhguQmx1ZXRvb3RoQ2hhcmFjdGVyaXN0aWNSDmNoYXJhY3RlcmlzdGlj');\n@$core.Deprecated('Use deviceStateResponseDescriptor instead')\nconst DeviceStateResponse$json = const {\n  '1': 'DeviceStateResponse',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'state', '3': 2, '4': 1, '5': 14, '6': '.DeviceStateResponse.BluetoothDeviceState', '10': 'state'},\n  ],\n  '4': const [DeviceStateResponse_BluetoothDeviceState$json],\n};\n\n@$core.Deprecated('Use deviceStateResponseDescriptor instead')\nconst DeviceStateResponse_BluetoothDeviceState$json = const {\n  '1': 'BluetoothDeviceState',\n  '2': const [\n    const {'1': 'DISCONNECTED', '2': 0},\n    const {'1': 'CONNECTING', '2': 1},\n    const {'1': 'CONNECTED', '2': 2},\n    const {'1': 'DISCONNECTING', '2': 3},\n  ],\n};\n\n/// Descriptor for `DeviceStateResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deviceStateResponseDescriptor = $convert.base64Decode('ChNEZXZpY2VTdGF0ZVJlc3BvbnNlEhsKCXJlbW90ZV9pZBgBIAEoCVIIcmVtb3RlSWQSPwoFc3RhdGUYAiABKA4yKS5EZXZpY2VTdGF0ZVJlc3BvbnNlLkJsdWV0b290aERldmljZVN0YXRlUgVzdGF0ZSJaChRCbHVldG9vdGhEZXZpY2VTdGF0ZRIQCgxESVNDT05ORUNURUQQABIOCgpDT05ORUNUSU5HEAESDQoJQ09OTkVDVEVEEAISEQoNRElTQ09OTkVDVElORxAD');\n@$core.Deprecated('Use connectedDevicesResponseDescriptor instead')\nconst ConnectedDevicesResponse$json = const {\n  '1': 'ConnectedDevicesResponse',\n  '2': const [\n    const {'1': 'devices', '3': 1, '4': 3, '5': 11, '6': '.BluetoothDevice', '10': 'devices'},\n  ],\n};\n\n/// Descriptor for `ConnectedDevicesResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List connectedDevicesResponseDescriptor = $convert.base64Decode('ChhDb25uZWN0ZWREZXZpY2VzUmVzcG9uc2USKgoHZGV2aWNlcxgBIAMoCzIQLkJsdWV0b290aERldmljZVIHZGV2aWNlcw==');\n@$core.Deprecated('Use mtuSizeRequestDescriptor instead')\nconst MtuSizeRequest$json = const {\n  '1': 'MtuSizeRequest',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'mtu', '3': 2, '4': 1, '5': 13, '10': 'mtu'},\n  ],\n};\n\n/// Descriptor for `MtuSizeRequest`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mtuSizeRequestDescriptor = $convert.base64Decode('Cg5NdHVTaXplUmVxdWVzdBIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEhAKA210dRgCIAEoDVIDbXR1');\n@$core.Deprecated('Use mtuSizeResponseDescriptor instead')\nconst MtuSizeResponse$json = const {\n  '1': 'MtuSizeResponse',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'mtu', '3': 2, '4': 1, '5': 13, '10': 'mtu'},\n  ],\n};\n\n/// Descriptor for `MtuSizeResponse`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mtuSizeResponseDescriptor = $convert.base64Decode('Cg9NdHVTaXplUmVzcG9uc2USGwoJcmVtb3RlX2lkGAEgASgJUghyZW1vdGVJZBIQCgNtdHUYAiABKA1SA210dQ==');\n@$core.Deprecated('Use readRssiResultDescriptor instead')\nconst ReadRssiResult$json = const {\n  '1': 'ReadRssiResult',\n  '2': const [\n    const {'1': 'remote_id', '3': 1, '4': 1, '5': 9, '10': 'remoteId'},\n    const {'1': 'rssi', '3': 2, '4': 1, '5': 5, '10': 'rssi'},\n  ],\n};\n\n/// Descriptor for `ReadRssiResult`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List readRssiResultDescriptor = $convert.base64Decode('Cg5SZWFkUnNzaVJlc3VsdBIbCglyZW1vdGVfaWQYASABKAlSCHJlbW90ZUlkEhIKBHJzc2kYAiABKAVSBHJzc2k=');\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/gen/flutterblueplus.pbserver.dart",
    "content": "///\n//  Generated code. Do not modify.\n//  source: flutterblueplus.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package\n\nexport 'flutterblueplus.pb.dart';\n\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/bluetooth_characteristic.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass BluetoothCharacteristic {\n  final Guid uuid;\n  final DeviceIdentifier deviceId;\n  final Guid serviceUuid;\n  final Guid? secondaryServiceUuid;\n  final CharacteristicProperties properties;\n  final List<BluetoothDescriptor> descriptors;\n  bool get isNotifying {\n    try {\n      var cccd =\n          descriptors.singleWhere((d) => d.uuid == BluetoothDescriptor.cccd);\n      return ((cccd.lastValue[0] & 0x01) > 0 || (cccd.lastValue[0] & 0x02) > 0);\n    } catch (e) {\n      return false;\n    }\n  }\n\n  final BehaviorSubject<List<int>> _value;\n  Stream<List<int>> get value => Rx.merge([\n        _value.stream,\n        onValueChangedStream,\n      ]);\n\n  List<int> get lastValue => _value.value;\n\n  BluetoothCharacteristic.fromProto(protos.BluetoothCharacteristic p)\n      : uuid = Guid(p.uuid),\n        deviceId = DeviceIdentifier(p.remoteId),\n        serviceUuid = Guid(p.serviceUuid),\n        secondaryServiceUuid = (p.secondaryServiceUuid.isNotEmpty)\n            ? Guid(p.secondaryServiceUuid)\n            : null,\n        descriptors =\n            p.descriptors.map((d) => BluetoothDescriptor.fromProto(d)).toList(),\n        properties = CharacteristicProperties.fromProto(p.properties),\n        _value = BehaviorSubject.seeded(p.value);\n\n  Stream<BluetoothCharacteristic> get _onCharacteristicChangedStream =>\n      FlutterBluePlus.instance._methodStream\n          .where((m) => m.method == \"OnCharacteristicChanged\")\n          .map((m) => m.arguments)\n          .map((buffer) => protos.OnCharacteristicChanged.fromBuffer(buffer))\n          .where((p) => p.remoteId == deviceId.toString())\n          .map((p) => BluetoothCharacteristic.fromProto(p.characteristic))\n          .where((c) => c.uuid == uuid)\n          .map((c) {\n        // Update the characteristic with the new values\n        _updateDescriptors(c.descriptors);\n        return c;\n      });\n\n  Stream<List<int>> get onValueChangedStream =>\n      _onCharacteristicChangedStream.map((c) => c.lastValue);\n\n  void _updateDescriptors(List<BluetoothDescriptor> newDescriptors) {\n    for (var d in descriptors) {\n      for (var newD in newDescriptors) {\n        if (d.uuid == newD.uuid) {\n          d._value.add(newD.lastValue);\n        }\n      }\n    }\n  }\n\n  /// Retrieves the value of the characteristic\n  Future<List<int>> read() async {\n    var request = protos.ReadCharacteristicRequest.create()\n      ..remoteId = deviceId.toString()\n      ..characteristicUuid = uuid.toString()\n      ..serviceUuid = serviceUuid.toString();\n    FlutterBluePlus.instance._log(LogLevel.info,\n        'remoteId: ${deviceId.toString()} characteristicUuid: ${uuid.toString()} serviceUuid: ${serviceUuid.toString()}');\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('readCharacteristic', request.writeToBuffer());\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"ReadCharacteristicResponse\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.ReadCharacteristicResponse.fromBuffer(buffer))\n        .where((p) =>\n            (p.remoteId == request.remoteId) &&\n            (p.characteristic.uuid == request.characteristicUuid) &&\n            (p.characteristic.serviceUuid == request.serviceUuid))\n        .map((p) => p.characteristic.value)\n        .first\n        .then((d) {\n      _value.add(d);\n      return d;\n    });\n  }\n\n  /// Writes the value of a characteristic.\n  /// [CharacteristicWriteType.withoutResponse]: the write is not\n  /// guaranteed and will return immediately with success.\n  /// [CharacteristicWriteType.withResponse]: the method will return after the\n  /// write operation has either passed or failed.\n  Future<Null> write(List<int> value, {bool withoutResponse = false}) async {\n    final type = withoutResponse\n        ? CharacteristicWriteType.withoutResponse\n        : CharacteristicWriteType.withResponse;\n\n    var request = protos.WriteCharacteristicRequest.create()\n      ..remoteId = deviceId.toString()\n      ..characteristicUuid = uuid.toString()\n      ..serviceUuid = serviceUuid.toString()\n      ..writeType =\n          protos.WriteCharacteristicRequest_WriteType.valueOf(type.index)!\n      ..value = value;\n\n    var result = await FlutterBluePlus.instance._channel\n        .invokeMethod('writeCharacteristic', request.writeToBuffer());\n\n    if (type == CharacteristicWriteType.withoutResponse) {\n      return result;\n    }\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"WriteCharacteristicResponse\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.WriteCharacteristicResponse.fromBuffer(buffer))\n        .where((p) =>\n            (p.request.remoteId == request.remoteId) &&\n            (p.request.characteristicUuid == request.characteristicUuid) &&\n            (p.request.serviceUuid == request.serviceUuid))\n        .first\n        .then((w) => w.success)\n        .then((success) => (!success)\n            ? throw Exception('Failed to write the characteristic')\n            : null)\n        .then((_) => null);\n  }\n\n  /// Sets notifications or indications for the value of a specified characteristic\n  Future<bool> setNotifyValue(bool notify) async {\n    var request = protos.SetNotificationRequest.create()\n      ..remoteId = deviceId.toString()\n      ..serviceUuid = serviceUuid.toString()\n      ..characteristicUuid = uuid.toString()\n      ..enable = notify;\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('setNotification', request.writeToBuffer());\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"SetNotificationResponse\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.SetNotificationResponse.fromBuffer(buffer))\n        .where((p) =>\n            (p.remoteId == request.remoteId) &&\n            (p.characteristic.uuid == request.characteristicUuid) &&\n            (p.characteristic.serviceUuid == request.serviceUuid))\n        .first\n        .then((p) => BluetoothCharacteristic.fromProto(p.characteristic))\n        .then((c) {\n      _updateDescriptors(c.descriptors);\n      return (c.isNotifying == notify);\n    });\n  }\n\n  @override\n  String toString() {\n    return 'BluetoothCharacteristic{uuid: $uuid, deviceId: $deviceId, serviceUuid: $serviceUuid, secondaryServiceUuid: $secondaryServiceUuid, properties: $properties, descriptors: $descriptors, value: ${_value.value}';\n  }\n}\n\nenum CharacteristicWriteType { withResponse, withoutResponse }\n\n@immutable\nclass CharacteristicProperties {\n  final bool broadcast;\n  final bool read;\n  final bool writeWithoutResponse;\n  final bool write;\n  final bool notify;\n  final bool indicate;\n  final bool authenticatedSignedWrites;\n  final bool extendedProperties;\n  final bool notifyEncryptionRequired;\n  final bool indicateEncryptionRequired;\n\n  const CharacteristicProperties(\n      {this.broadcast = false,\n      this.read = false,\n      this.writeWithoutResponse = false,\n      this.write = false,\n      this.notify = false,\n      this.indicate = false,\n      this.authenticatedSignedWrites = false,\n      this.extendedProperties = false,\n      this.notifyEncryptionRequired = false,\n      this.indicateEncryptionRequired = false});\n\n  CharacteristicProperties.fromProto(protos.CharacteristicProperties p)\n      : broadcast = p.broadcast,\n        read = p.read,\n        writeWithoutResponse = p.writeWithoutResponse,\n        write = p.write,\n        notify = p.notify,\n        indicate = p.indicate,\n        authenticatedSignedWrites = p.authenticatedSignedWrites,\n        extendedProperties = p.extendedProperties,\n        notifyEncryptionRequired = p.notifyEncryptionRequired,\n        indicateEncryptionRequired = p.indicateEncryptionRequired;\n\n  @override\n  String toString() {\n    return 'CharacteristicProperties{broadcast: $broadcast, read: $read, writeWithoutResponse: $writeWithoutResponse, write: $write, notify: $notify, indicate: $indicate, authenticatedSignedWrites: $authenticatedSignedWrites, extendedProperties: $extendedProperties, notifyEncryptionRequired: $notifyEncryptionRequired, indicateEncryptionRequired: $indicateEncryptionRequired}';\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/bluetooth_descriptor.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass BluetoothDescriptor {\n  static final Guid cccd = Guid(\"00002902-0000-1000-8000-00805f9b34fb\");\n\n  final Guid uuid;\n  final DeviceIdentifier deviceId;\n  final Guid serviceUuid;\n  final Guid characteristicUuid;\n\n  final BehaviorSubject<List<int>> _value;\n  Stream<List<int>> get value => _value.stream;\n\n  List<int> get lastValue => _value.value;\n\n  BluetoothDescriptor.fromProto(protos.BluetoothDescriptor p)\n      : uuid = Guid(p.uuid),\n        deviceId = DeviceIdentifier(p.remoteId),\n        serviceUuid = Guid(p.serviceUuid),\n        characteristicUuid = Guid(p.characteristicUuid),\n        _value = BehaviorSubject.seeded(p.value);\n\n  /// Retrieves the value of a specified descriptor\n  Future<List<int>> read() async {\n    var request = protos.ReadDescriptorRequest.create()\n      ..remoteId = deviceId.toString()\n      ..descriptorUuid = uuid.toString()\n      ..characteristicUuid = characteristicUuid.toString()\n      ..serviceUuid = serviceUuid.toString();\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('readDescriptor', request.writeToBuffer());\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"ReadDescriptorResponse\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.ReadDescriptorResponse.fromBuffer(buffer))\n        .where((p) =>\n            (p.request.remoteId == request.remoteId) &&\n            (p.request.descriptorUuid == request.descriptorUuid) &&\n            (p.request.characteristicUuid == request.characteristicUuid) &&\n            (p.request.serviceUuid == request.serviceUuid))\n        .map((d) => d.value)\n        .first\n        .then((d) {\n      _value.add(d);\n      return d;\n    });\n  }\n\n  /// Writes the value of a descriptor\n  Future<Null> write(List<int> value) async {\n    var request = protos.WriteDescriptorRequest.create()\n      ..remoteId = deviceId.toString()\n      ..descriptorUuid = uuid.toString()\n      ..characteristicUuid = characteristicUuid.toString()\n      ..serviceUuid = serviceUuid.toString()\n      ..value = value;\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('writeDescriptor', request.writeToBuffer());\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"WriteDescriptorResponse\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.WriteDescriptorResponse.fromBuffer(buffer))\n        .where((p) =>\n            (p.request.remoteId == request.remoteId) &&\n            (p.request.descriptorUuid == request.descriptorUuid) &&\n            (p.request.characteristicUuid == request.characteristicUuid) &&\n            (p.request.serviceUuid == request.serviceUuid))\n        .first\n        .then((w) => w.success)\n        .then((success) => (!success)\n            ? throw Exception('Failed to write the descriptor')\n            : null)\n        .then((_) => _value.add(value))\n        .then((_) => null);\n  }\n\n  @override\n  String toString() {\n    return 'BluetoothDescriptor{uuid: $uuid, deviceId: $deviceId, serviceUuid: $serviceUuid, characteristicUuid: $characteristicUuid, value: ${_value.value}}';\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/bluetooth_device.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass BluetoothDevice {\n  final DeviceIdentifier id;\n  final String name;\n  final BluetoothDeviceType type;\n\n  BluetoothDevice.fromProto(protos.BluetoothDevice p)\n      : id = DeviceIdentifier(p.remoteId),\n        name = p.name,\n        type = BluetoothDeviceType.values[p.type.value];\n\n  /// Use on Android when the MAC address is known.\n  ///\n  /// This constructor enables the Android to connect to a specific device\n  /// as soon as it becomes available on the bluetooth \"network\".\n  BluetoothDevice.fromId(String id, {String? name, BluetoothDeviceType? type})\n      : id = DeviceIdentifier(id),\n        name = name ?? \"Unknown name\",\n        type = type ?? BluetoothDeviceType.unknown;\n\n  final BehaviorSubject<bool> _isDiscoveringServices =\n      BehaviorSubject.seeded(false);\n  Stream<bool> get isDiscoveringServices => _isDiscoveringServices.stream;\n\n  /// Establishes a connection to the Bluetooth Device.\n  Future<void> connect({\n    Duration? timeout,\n    bool autoConnect = true,\n  }) async {\n    var request = protos.ConnectRequest.create()\n      ..remoteId = id.toString()\n      ..androidAutoConnect = autoConnect;\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('connect', request.writeToBuffer());\n\n    if (timeout == null) {\n      await state.firstWhere((s) => s == BluetoothDeviceState.connected);\n    } else {\n      await state\n          .firstWhere((s) => s == BluetoothDeviceState.connected)\n          .timeout(\n        timeout,\n        onTimeout: () {\n          disconnect();\n          throw TimeoutException('Failed to connect in time.', timeout);\n        },\n      );\n    }\n  }\n\n  /// Send a pairing request to the device.\n  /// Currently only implemented on Android.\n  Future<void> pair() async {\n    return FlutterBluePlus.instance._channel\n        .invokeMethod('pair', id.toString());\n  }\n\n  /// Refresh Gatt Device Cache\n  /// Emergency method to reload ble services & characteristics\n  /// Currently only implemented on Android.\n  Future<void> clearGattCache() async {\n    if (Platform.isAndroid) {\n      return FlutterBluePlus.instance._channel\n          .invokeMethod('clearGattCache', id.toString());\n    }\n  }\n\n  /// Cancels connection to the Bluetooth Device\n  Future disconnect() => FlutterBluePlus.instance._channel\n      .invokeMethod('disconnect', id.toString());\n\n  final BehaviorSubject<List<BluetoothService>> _services =\n      BehaviorSubject.seeded([]);\n\n  /// Discovers services offered by the remote device as well as their characteristics and descriptors\n  Future<List<BluetoothService>> discoverServices() async {\n    final s = await state.first;\n    if (s != BluetoothDeviceState.connected) {\n      return Future.error(Exception(\n          'Cannot discoverServices while device is not connected. State == $s'));\n    }\n    var response = FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"DiscoverServicesResult\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.DiscoverServicesResult.fromBuffer(buffer))\n        .where((p) => p.remoteId == id.toString())\n        .map((p) => p.services)\n        .map((s) => s.map((p) => BluetoothService.fromProto(p)).toList())\n        .first\n        .then((list) {\n      _services.add(list);\n      _isDiscoveringServices.add(false);\n      return list;\n    });\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('discoverServices', id.toString());\n\n    _isDiscoveringServices.add(true);\n\n    return response;\n  }\n\n  /// Returns a list of Bluetooth GATT services offered by the remote device\n  /// This function requires that discoverServices has been completed for this device\n  Stream<List<BluetoothService>> get services async* {\n    yield await FlutterBluePlus.instance._channel\n        .invokeMethod('services', id.toString())\n        .then((buffer) =>\n            protos.DiscoverServicesResult.fromBuffer(buffer).services)\n        .then((i) => i.map((s) => BluetoothService.fromProto(s)).toList());\n    yield* _services.stream;\n  }\n\n  /// The current connection state of the device\n  Stream<BluetoothDeviceState> get state async* {\n    yield await FlutterBluePlus.instance._channel\n        .invokeMethod('deviceState', id.toString())\n        .then((buffer) => protos.DeviceStateResponse.fromBuffer(buffer))\n        .then((p) => BluetoothDeviceState.values[p.state.value]);\n\n    yield* FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"DeviceState\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.DeviceStateResponse.fromBuffer(buffer))\n        .where((p) => p.remoteId == id.toString())\n        .map((p) => BluetoothDeviceState.values[p.state.value]);\n  }\n\n  /// The MTU size in bytes\n  Stream<int> get mtu async* {\n    yield await FlutterBluePlus.instance._channel\n        .invokeMethod('mtu', id.toString())\n        .then((buffer) => protos.MtuSizeResponse.fromBuffer(buffer))\n        .then((p) => p.mtu);\n\n    yield* FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"MtuSize\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.MtuSizeResponse.fromBuffer(buffer))\n        .where((p) => p.remoteId == id.toString())\n        .map((p) => p.mtu);\n  }\n\n  /// Request to change the MTU Size\n  /// Throws error if request did not complete successfully\n  /// Request to change the MTU Size and returns the response back\n  /// Throws error if request did not complete successfully\n  Future<int> requestMtu(int desiredMtu) async {\n    var request = protos.MtuSizeRequest.create()\n      ..remoteId = id.toString()\n      ..mtu = desiredMtu;\n\n    var response = FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"MtuSize\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.MtuSizeResponse.fromBuffer(buffer))\n        .where((p) => p.remoteId == id.toString())\n        .map((p) => p.mtu)\n        .first;\n\n    await FlutterBluePlus.instance._channel\n        .invokeMethod('requestMtu', request.writeToBuffer());\n\n    return response;\n  }\n\n  /// Indicates whether the Bluetooth Device can send a write without response\n  Future<bool> get canSendWriteWithoutResponse =>\n      Future.error(UnimplementedError());\n\n  /// Read the RSSI for a connected remote device\n  Future<int> readRssi() async {\n    final remoteId = id.toString();\n    await FlutterBluePlus.instance._channel.invokeMethod('readRssi', remoteId);\n\n    return FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"ReadRssiResult\")\n        .map((m) => m.arguments)\n        .map((buffer) => protos.ReadRssiResult.fromBuffer(buffer))\n        .where((p) => (p.remoteId == remoteId))\n        .first\n        .then((c) {\n      return (c.rssi);\n    });\n  }\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is BluetoothDevice &&\n          runtimeType == other.runtimeType &&\n          id == other.id;\n\n  @override\n  int get hashCode => id.hashCode;\n\n  @override\n  String toString() {\n    return 'BluetoothDevice{id: $id, name: $name, type: $type, isDiscoveringServices: ${_isDiscoveringServices.value}, _services: ${_services.value}';\n  }\n}\n\nenum BluetoothDeviceType { unknown, classic, le, dual }\n\nenum BluetoothDeviceState { disconnected, connecting, connected, disconnecting }\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/bluetooth_service.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass BluetoothService {\n  final Guid uuid;\n  final DeviceIdentifier deviceId;\n  final bool isPrimary;\n  final List<BluetoothCharacteristic> characteristics;\n  final List<BluetoothService> includedServices;\n\n  BluetoothService.fromProto(protos.BluetoothService p)\n      : uuid = Guid(p.uuid),\n        deviceId = DeviceIdentifier(p.remoteId),\n        isPrimary = p.isPrimary,\n        characteristics = p.characteristics\n            .map((c) => BluetoothCharacteristic.fromProto(c))\n            .toList(),\n        includedServices = p.includedServices\n            .map((s) => BluetoothService.fromProto(s))\n            .toList();\n\n  @override\n  String toString() {\n    return 'BluetoothService{uuid: $uuid, deviceId: $deviceId, isPrimary: $isPrimary, characteristics: $characteristics, includedServices: $includedServices}';\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/flutter_blue_plus.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass FlutterBluePlus {\n  final MethodChannel _channel =\n      const MethodChannel('flutter_blue_plus/methods');\n  final EventChannel _stateChannel =\n      const EventChannel('flutter_blue_plus/state');\n  final StreamController<MethodCall> _methodStreamController =\n      StreamController.broadcast(); // ignore: close_sinks\n  Stream<MethodCall> get _methodStream => _methodStreamController\n      .stream; // Used internally to dispatch methods from platform.\n\n  /// Cached broadcast stream for FlutterBlue.state events\n  /// Caching this stream allows for more than one listener to subscribe\n  /// and unsubscribe apart from each other,\n  /// while allowing events to still be sent to others that are subscribed\n  Stream<BluetoothState>? _stateStream;\n\n  /// Singleton boilerplate\n  FlutterBluePlus._() {\n    _channel.setMethodCallHandler((MethodCall call) async {\n      _methodStreamController.add(call);\n    });\n\n    setLogLevel(logLevel);\n  }\n\n  static final FlutterBluePlus _instance = FlutterBluePlus._();\n  static FlutterBluePlus get instance => _instance;\n\n  /// Log level of the instance, default is all messages (debug).\n  LogLevel _logLevel = LogLevel.debug;\n  LogLevel get logLevel => _logLevel;\n\n  /// Checks whether the device supports Bluetooth\n  Future<bool> get isAvailable =>\n      _channel.invokeMethod('isAvailable').then<bool>((d) => d);\n\n  /// Return the friendly Bluetooth name of the local Bluetooth adapter\n  Future<String> get name =>\n      _channel.invokeMethod('name').then<String>((d) => d);\n\n  /// Checks if Bluetooth functionality is turned on\n  Future<bool> get isOn => _channel.invokeMethod('isOn').then<bool>((d) => d);\n\n  /// Tries to turn on Bluetooth (Android only),\n  ///\n  /// Returns true if bluetooth is being turned on.\n  /// You have to listen for a stateChange to ON to ensure bluetooth is already running\n  ///\n  /// Returns false if an error occured or bluetooth is already running\n  ///\n  Future<bool> turnOn() {\n    return _channel.invokeMethod('turnOn').then<bool>((d) => d);\n  }\n\n  /// Tries to turn off Bluetooth (Android only),\n  ///\n  /// Returns true if bluetooth is being turned off.\n  /// You have to listen for a stateChange to OFF to ensure bluetooth is turned off\n  ///\n  /// Returns false if an error occured\n  ///\n  Future<bool> turnOff() {\n    return _channel.invokeMethod('turnOff').then<bool>((d) => d);\n  }\n\n  final BehaviorSubject<bool> _isScanning = BehaviorSubject.seeded(false);\n  Stream<bool> get isScanning => _isScanning.stream;\n\n  final BehaviorSubject<List<ScanResult>> _scanResults =\n      BehaviorSubject.seeded([]);\n\n  /// Returns a stream that is a list of [ScanResult] results while a scan is in progress.\n  ///\n  /// The list emitted is all the scanned results as of the last initiated scan. When a scan is\n  /// first started, an empty list is emitted. The returned stream is never closed.\n  ///\n  /// One use for [scanResults] is as the stream in a StreamBuilder to display the\n  /// results of a scan in real time while the scan is in progress.\n  Stream<List<ScanResult>> get scanResults => _scanResults.stream;\n\n  final PublishSubject _stopScanPill = PublishSubject();\n\n  /// Gets the current state of the Bluetooth module\n  Stream<BluetoothState> get state async* {\n    yield await _channel\n        .invokeMethod('state')\n        .then((buffer) => protos.BluetoothState.fromBuffer(buffer))\n        .then((s) => BluetoothState.values[s.state.value]);\n\n    _stateStream ??= _stateChannel\n        .receiveBroadcastStream()\n        .map((buffer) => protos.BluetoothState.fromBuffer(buffer))\n        .map((s) => BluetoothState.values[s.state.value])\n        .doOnCancel(() => _stateStream = null);\n\n    yield* _stateStream!;\n  }\n\n  /// Retrieve a list of connected devices\n  Future<List<BluetoothDevice>> get connectedDevices {\n    return _channel\n        .invokeMethod('getConnectedDevices')\n        .then((buffer) => protos.ConnectedDevicesResponse.fromBuffer(buffer))\n        .then((p) => p.devices)\n        .then((p) => p.map((d) => BluetoothDevice.fromProto(d)).toList());\n  }\n\n  /// Retrieve a list of bonded devices (Android only)\n  Future<List<BluetoothDevice>> get bondedDevices {\n    return _channel\n        .invokeMethod('getBondedDevices')\n        .then((buffer) => protos.ConnectedDevicesResponse.fromBuffer(buffer))\n        .then((p) => p.devices)\n        .then((p) => p.map((d) => BluetoothDevice.fromProto(d)).toList());\n  }\n\n  /// Starts a scan for Bluetooth Low Energy devices and returns a stream\n  /// of the [ScanResult] results as they are received.\n  ///\n  /// timeout calls stopStream after a specified [Duration].\n  /// You can also get a list of ongoing results in the [scanResults] stream.\n  /// If scanning is already in progress, this will throw an [Exception].\n  Stream<ScanResult> scan({\n    ScanMode scanMode = ScanMode.lowLatency,\n    List<Guid> withServices = const [],\n    List<Guid> withDevices = const [],\n    List<String> macAddresses = const [],\n    Duration? timeout,\n    bool allowDuplicates = false,\n  }) async* {\n    var settings = protos.ScanSettings.create()\n      ..androidScanMode = scanMode.value\n      ..allowDuplicates = allowDuplicates\n      ..macAddresses.addAll(macAddresses)\n      ..serviceUuids.addAll(withServices.map((g) => g.toString()).toList());\n\n    if (_isScanning.value == true) {\n      throw Exception('Another scan is already in progress.');\n    }\n\n    // Emit to isScanning\n    _isScanning.add(true);\n\n    final killStreams = <Stream>[];\n    killStreams.add(_stopScanPill);\n    if (timeout != null) {\n      killStreams.add(Rx.timer(null, timeout));\n    }\n\n    // Clear scan results list\n    _scanResults.add(<ScanResult>[]);\n\n    try {\n      await _channel.invokeMethod('startScan', settings.writeToBuffer());\n    } catch (e) {\n      if (kDebugMode) {\n        print('Error starting scan.');\n      }\n      _stopScanPill.add(null);\n      _isScanning.add(false);\n      rethrow;\n    }\n\n    yield* FlutterBluePlus.instance._methodStream\n        .where((m) => m.method == \"ScanResult\")\n        .map((m) => m.arguments)\n        .takeUntil(Rx.merge(killStreams))\n        .doOnDone(stopScan)\n        .map((buffer) => protos.ScanResult.fromBuffer(buffer))\n        .map((p) {\n      final result = ScanResult.fromProto(p);\n      final list = _scanResults.value;\n      int index = list.indexOf(result);\n      if (index != -1) {\n        list[index] = result;\n      } else {\n        list.add(result);\n      }\n      _scanResults.add(list);\n      return result;\n    });\n  }\n\n  /// Starts a scan and returns a future that will complete once the scan has finished.\n  ///\n  /// Once a scan is started, call [stopScan] to stop the scan and complete the returned future.\n  ///\n  /// timeout automatically stops the scan after a specified [Duration].\n  ///\n  /// To observe the results while the scan is in progress, listen to the [scanResults] stream,\n  /// or call [scan] instead.\n  Future startScan({\n    ScanMode scanMode = ScanMode.lowLatency,\n    List<Guid> withServices = const [],\n    List<Guid> withDevices = const [],\n    List<String> macAddresses = const [],\n    Duration? timeout,\n    bool allowDuplicates = false,\n  }) async {\n    await scan(\n            scanMode: scanMode,\n            withServices: withServices,\n            withDevices: withDevices,\n            macAddresses: macAddresses,\n            timeout: timeout,\n            allowDuplicates: allowDuplicates)\n        .drain();\n    return _scanResults.value;\n  }\n\n  /// Stops a scan for Bluetooth Low Energy devices\n  Future stopScan() async {\n    await _channel.invokeMethod('stopScan');\n    _stopScanPill.add(null);\n    _isScanning.add(false);\n  }\n\n  /// The list of connected peripherals can include those that are connected\n  /// by other apps and that will need to be connected locally using the\n  /// device.connect() method before they can be used.\n//  Stream<List<BluetoothDevice>> connectedDevices({\n//    List<Guid> withServices = const [],\n//  }) =>\n//      throw UnimplementedError();\n\n  /// Sets the log level of the FlutterBlue instance\n  /// Messages equal or below the log level specified are stored/forwarded,\n  /// messages above are dropped.\n  void setLogLevel(LogLevel level) async {\n    await _channel.invokeMethod('setLogLevel', level.index);\n    _logLevel = level;\n  }\n\n  void _log(LogLevel level, String message) {\n    if (level.index <= _logLevel.index) {\n      if (kDebugMode) {\n        print(message);\n      }\n    }\n  }\n}\n\n/// Log levels for FlutterBlue\nenum LogLevel {\n  emergency,\n  alert,\n  critical,\n  error,\n  warning,\n  notice,\n  info,\n  debug,\n}\n\n/// State of the bluetooth adapter.\nenum BluetoothState {\n  unknown,\n  unavailable,\n  unauthorized,\n  turningOn,\n  on,\n  turningOff,\n  off\n}\n\nclass ScanMode {\n  const ScanMode(this.value);\n  static const lowPower = ScanMode(0);\n  static const balanced = ScanMode(1);\n  static const lowLatency = ScanMode(2);\n  static const opportunistic = ScanMode(-1);\n  final int value;\n}\n\nclass DeviceIdentifier {\n  final String id;\n  const DeviceIdentifier(this.id);\n\n  @override\n  String toString() => id;\n\n  @override\n  int get hashCode => id.hashCode;\n\n  @override\n  bool operator ==(other) =>\n      other is DeviceIdentifier && compareAsciiLowerCase(id, other.id) == 0;\n}\n\nclass ScanResult {\n  ScanResult.fromProto(protos.ScanResult p)\n      : device = BluetoothDevice.fromProto(p.device),\n        advertisementData = AdvertisementData.fromProto(p.advertisementData),\n        rssi = p.rssi,\n        timeStamp = DateTime.now();\n\n  final BluetoothDevice device;\n  final AdvertisementData advertisementData;\n  final int rssi;\n  final DateTime timeStamp;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is ScanResult &&\n          runtimeType == other.runtimeType &&\n          device == other.device;\n\n  @override\n  int get hashCode => device.hashCode;\n\n  @override\n  String toString() {\n    return 'ScanResult{device: $device, advertisementData: $advertisementData, rssi: $rssi, timeStamp: $timeStamp}';\n  }\n}\n\nclass AdvertisementData {\n  final String localName;\n  final int? txPowerLevel;\n  final bool connectable;\n  final Map<int, List<int>> manufacturerData;\n  final Map<String, List<int>> serviceData;\n  final List<String> serviceUuids;\n\n  AdvertisementData.fromProto(protos.AdvertisementData p)\n      : localName = p.localName,\n        txPowerLevel =\n            (p.txPowerLevel.hasValue()) ? p.txPowerLevel.value : null,\n        connectable = p.connectable,\n        manufacturerData = p.manufacturerData,\n        serviceData = p.serviceData,\n        serviceUuids = p.serviceUuids;\n\n  @override\n  String toString() {\n    return 'AdvertisementData{localName: $localName, txPowerLevel: $txPowerLevel, connectable: $connectable, manufacturerData: $manufacturerData, serviceData: $serviceData, serviceUuids: $serviceUuids}';\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/lib/src/guid.dart",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\npart of flutter_blue_plus;\n\nclass Guid {\n  final List<int> _bytes;\n  final int _hashCode;\n\n  Guid._internal(List<int> bytes)\n      : _bytes = bytes,\n        _hashCode = _calcHashCode(bytes);\n\n  Guid(String input) : this._internal(_fromString(input));\n\n  Guid.fromMac(String input) : this._internal(_fromMacString(input));\n\n  Guid.empty() : this._internal(List.filled(16, 0));\n\n  static List<int> _fromMacString(String input) {\n    input = _removeNonHexCharacters(input);\n    final bytes = hex.decode(input);\n\n    if (bytes.length != 6) {\n      throw FormatException(\"The format is invalid: $input\");\n    }\n\n    return bytes + List<int>.filled(10, 0);\n  }\n\n  static List<int> _fromString(String input) {\n    input = _removeNonHexCharacters(input);\n    final bytes = hex.decode(input);\n\n    if (bytes.length != 16) {\n      throw const FormatException(\"The format is invalid\");\n    }\n\n    return bytes;\n  }\n\n  static String _removeNonHexCharacters(String sourceString) {\n    return String.fromCharCodes(sourceString.runes.where((r) =>\n            (r >= 48 && r <= 57) // characters 0 to 9\n            ||\n            (r >= 65 && r <= 70) // characters A to F\n            ||\n            (r >= 97 && r <= 102) // characters a to f\n        ));\n  }\n\n  static int _calcHashCode(List<int> bytes) {\n    const equality = ListEquality<int>();\n    return equality.hash(bytes);\n  }\n\n  @override\n  String toString() {\n    String one = hex.encode(_bytes.sublist(0, 4));\n    String two = hex.encode(_bytes.sublist(4, 6));\n    String three = hex.encode(_bytes.sublist(6, 8));\n    String four = hex.encode(_bytes.sublist(8, 10));\n    String five = hex.encode(_bytes.sublist(10, 16));\n    return \"$one-$two-$three-$four-$five\";\n  }\n\n  String toMac() {\n    String one = hex.encode(_bytes.sublist(0, 1));\n    String two = hex.encode(_bytes.sublist(1, 2));\n    String three = hex.encode(_bytes.sublist(2, 3));\n    String four = hex.encode(_bytes.sublist(3, 4));\n    String five = hex.encode(_bytes.sublist(4, 5));\n    String six = hex.encode(_bytes.sublist(5, 6));\n    return \"$one:$two:$three:$four:$five:$six\".toUpperCase();\n  }\n\n  List<int> toByteArray() {\n    return _bytes;\n  }\n\n  @override\n  operator ==(other) => other is Guid && hashCode == other.hashCode;\n\n  @override\n  int get hashCode => _hashCode;\n}\n"
  },
  {
    "path": "plugins/flutter_blue_plus/protos/flutterblueplus.proto",
    "content": "// Copyright 2017, Paul DeMarco.\n// All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nsyntax = \"proto3\";\n\noption java_package = \"com.boskokg.flutter_blue_plus\";\noption java_outer_classname = \"Protos\";\noption objc_class_prefix = \"Protos\";\n\n// Wrapper message for `int32`.\n//\n// Allows for nullability of fields in messages\nmessage Int32Value {\n  // The int32 value.\n  int32 value = 1;\n}\n\nmessage BluetoothState {\n  enum State {\n    UNKNOWN = 0;\n    UNAVAILABLE = 1;\n    UNAUTHORIZED = 2;\n    TURNING_ON = 3;\n    ON = 4;\n    TURNING_OFF = 5;\n    OFF = 6;\n  };\n  State state = 1;\n}\n\nmessage AdvertisementData {\n  string local_name = 1;\n  Int32Value tx_power_level = 2;\n  bool connectable = 3;\n  map<int32, bytes> manufacturer_data = 4; // Map of manufacturers to their data\n  map<string, bytes> service_data = 5;  // Map of service UUIDs to their data.\n  repeated string service_uuids = 6;\n}\n\nmessage ScanSettings {\n  int32 android_scan_mode = 1;\n  repeated string service_uuids = 2;\n  bool allow_duplicates = 3;\n  repeated string mac_addresses = 4;\n}\n\nmessage ScanResult {\n  BluetoothDevice device = 1;  // The received peer's ID.\n  AdvertisementData advertisement_data = 2;\n  int32 rssi = 3;\n}\n\nmessage ConnectRequest {\n  string remote_id = 1;\n  bool android_auto_connect = 2;\n}\n\nmessage BluetoothDevice {\n  enum Type {\n    UNKNOWN = 0;\n    CLASSIC = 1;\n    LE = 2;\n    DUAL = 3;\n  };\n\n  string remote_id = 1;\n  string name = 2;\n  Type type = 3;\n}\n\nmessage BluetoothService {\n  string uuid = 1;\n  string remote_id = 2;\n  bool is_primary = 3; // Indicates whether the type of service is primary or secondary.\n  repeated BluetoothCharacteristic characteristics = 4; // A list of characteristics that have been discovered in this service.\n  repeated BluetoothService included_services = 5; // A list of included services that have been discovered in this service.\n}\n\nmessage BluetoothCharacteristic {\n  string uuid = 1;\n  string remote_id = 2;\n  string serviceUuid = 3; // The service that this characteristic belongs to.\n  string secondaryServiceUuid = 4; // The secondary service if nested\n  repeated BluetoothDescriptor descriptors = 5; // A list of descriptors that have been discovered in this characteristic.\n  CharacteristicProperties properties = 6; // The properties of the characteristic.\n  bytes value = 7;\n}\n\nmessage BluetoothDescriptor {\n  string uuid = 1;\n  string remote_id = 2;\n  string serviceUuid = 3; // The service that this descriptor belongs to.\n  string characteristicUuid = 4; // The characteristic that this descriptor belongs to.\n  bytes value = 5;\n}\n\nmessage CharacteristicProperties {\n  bool broadcast = 1;\n  bool read = 2;\n  bool write_without_response = 3;\n  bool write = 4;\n  bool notify = 5;\n  bool indicate = 6;\n  bool authenticated_signed_writes = 7;\n  bool extended_properties = 8;\n  bool notify_encryption_required = 9;\n  bool indicate_encryption_required = 10;\n}\n\nmessage DiscoverServicesResult {\n  string remote_id = 1;\n  repeated BluetoothService services = 2;\n}\n\nmessage ReadCharacteristicRequest {\n  string remote_id = 1;\n  string characteristic_uuid = 2;\n  string service_uuid = 3;\n  string secondary_service_uuid = 4;\n}\n\nmessage ReadCharacteristicResponse {\n  string remote_id = 1;\n  BluetoothCharacteristic characteristic = 2;\n}\n\nmessage ReadDescriptorRequest {\n  string remote_id = 1;\n  string descriptor_uuid = 2;\n  string service_uuid = 3;\n  string secondary_service_uuid = 4;\n  string characteristic_uuid = 5;\n}\n\nmessage ReadDescriptorResponse {\n  ReadDescriptorRequest request = 1;\n  bytes value = 2;\n}\n\nmessage WriteCharacteristicRequest {\n  enum WriteType {\n    WITH_RESPONSE = 0;\n    WITHOUT_RESPONSE = 1;\n  }\n  string remote_id = 1;\n  string characteristic_uuid = 2;\n  string service_uuid = 3;\n  string secondary_service_uuid = 4;\n  WriteType write_type = 5;\n  bytes value = 6;\n}\n\nmessage WriteCharacteristicResponse {\n  WriteCharacteristicRequest request = 1;\n  bool success = 2;\n}\n\nmessage WriteDescriptorRequest {\n  string remote_id = 1;\n  string descriptor_uuid = 2;\n  string service_uuid = 3;\n  string secondary_service_uuid = 4;\n  string characteristic_uuid = 5;\n  bytes value = 6;\n}\n\nmessage WriteDescriptorResponse {\n  WriteDescriptorRequest request = 1;\n  bool success = 2;\n}\n\nmessage SetNotificationRequest {\n  string remote_id = 1;\n  string service_uuid = 2;\n  string secondary_service_uuid = 3;\n  string characteristic_uuid = 4;\n  bool enable = 5;\n}\n\nmessage SetNotificationResponse {\n  string remote_id = 1;\n  BluetoothCharacteristic characteristic = 2;\n  bool success = 3;\n}\n\nmessage OnCharacteristicChanged {\n  string remote_id = 1;\n  BluetoothCharacteristic characteristic = 2;\n}\n\nmessage DeviceStateResponse {\n  enum BluetoothDeviceState {\n    DISCONNECTED = 0;\n    CONNECTING = 1;\n    CONNECTED = 2;\n    DISCONNECTING = 3;\n  }\n  string remote_id = 1;\n  BluetoothDeviceState state = 2;\n}\n\nmessage ConnectedDevicesResponse {\n  repeated BluetoothDevice devices = 1;\n}\n\nmessage MtuSizeRequest {\n  string remote_id = 1;\n  uint32 mtu = 2;\n}\n\nmessage MtuSizeResponse {\n  string remote_id = 1;\n  uint32 mtu = 2;\n}\n\nmessage ReadRssiResult {\n  string remote_id = 1;\n  int32 rssi = 2;\n}"
  },
  {
    "path": "plugins/flutter_blue_plus/protos/regenerate.md",
    "content": "// Copyright 2017, Paul DeMarco.\\\n// All rights reserved. Use of this source code is governed by a\\\n// BSD-style license that can be found in the LICENSE file.\n\n# Generate protobuf files in Dart\n1. If upgrading, delete all proto files from /home/.pub-cache/bin\n1. Clone the latest dart-protoc-plugin from https://github.com/dart-lang/protobuf\n1. Run `dart pub install` inside protobuf/protoc_plugin\n1. Run `dart pub global activate protoc_plugin` to get .dart files into /home/.pub-cache/bin/\n1. Get the latest linux protoc compiler from https://github.com/google/protobuf/releases/ (protoc-X.X.X-linux-x86_64.zip)\n1. Copy /bin/protoc into /home/.pub-cache/bin/\n1. Run the following commands from this project's protos folder\n```protoc --dart_out=../lib/gen ./flutterblueplus.proto```\n```protoc --objc_out=../ios/gen ./flutterblueplus.proto```"
  },
  {
    "path": "plugins/flutter_blue_plus/pubspec.yaml",
    "content": "name: flutter_blue_plus\ndescription: Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS\nversion: 1.4.0\nhomepage: https://github.com/boskokg/flutter_blue_plus\n\nenvironment:\n  sdk: \">=2.15.1 <3.0.0\"\n  flutter: \">=2.5.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  convert: ^3.0.1\n  protobuf: ^2.0.1\n  rxdart: ^0.27.5\n  collection: ^1.15.0\n  meta: ^1.7.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^2.0.1\n\nflutter:\n  plugin:\n    platforms:\n      android:\n        package: com.boskokg.flutter_blue_plus\n        pluginClass: FlutterBluePlusPlugin\n      ios:\n        pluginClass: FlutterBluePlusPlugin\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/.gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\npubspec.lock\n\nbuild/\n.last_build_id\nPodfile.lock\nlocal.properties\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: e6b34c2b5c96bb95325269a29a84e83ed8909b5f\n  channel: stable\n\nproject_type: plugin\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/CHANGELOG.md",
    "content": "## 0.3.7\nBetter workaround for an issue with receiving sysex messages on Android via BLE\n\n## 0.3.6\nWorkaround for an issue with receiving long sysex messages on Android via BLE\n\n## 0.3.5\nFixed an issue with BLE device IDs on Android\nFixed an issue where BLE devices would appear in device list as native devices as well as bluetooth devices after being connected\n\n## 0.3.4\nChanged permissions to fine location for BLE on Android, required when targeting sdk 29+\n\n## 0.3.3\nFixed nullable error in kotlin\n\n## 0.3.2\nFixed BLE timestamp on iOS\n\n## 0.3.1\nFixed device disconnect on iOS\n\n## 0.3.0\nAdded linux support\n\n## 0.2.6\nFix example app on macos\n\n## 0.2.5\nFix MIDI Session Support on iOS Simulator\n\n## 0.2.4\niOS Pod fix\n\n## 0.2.3\nAndroid compile fix\n\n## 0.2.2\nCleanup and docs\n\n## 0.2.1\nAdded macOS implementation.\nCleaned iOS code (shared with macOS).\n\n## 0.2.0\nMigrated to federated plugin using platform interface. \n\n## 0.1.7\nBugfix - sending cabled MIDI on iOS \n\n## 0.1.6\nBugfix, android setup/plugin init\n\n## 0.1.5\n\nUpdated Android plugin structure\nFixed iOS compilation error, with latest Dart\nFixed BLE Midi parsing on iOS\n\n\n## 0.1.4\n\nUpdated Gradle version\nMerge PR #8\n\n## 0.1.3\n\nBetter handling of broadcast receiver on Android.\n\n## 0.1.2\n\nFixed message splitting on iOS Bluetooth MIDI\nThanks to https://github.com/TheKashe for the contribution.\n\n## 0.1.2\n\nBetter handling of disabled Bluetooth \n\n## 0.1.1\n\nAdded missing entitlement in iOS plist for bluetooth access\n\n## 0.1.0\n\nMoved Message Types into separate file: flutter_midi_command_messages.dart.\nFixed threading issue. https://github.com/InvisibleWrench/FlutterMidiCommand/issues/4\nAdded teardown function to disconnect and close all ports and devices.\nGradle dependency raised to 3.4.2\nminSDKversion raised to 24\nVersion bumped to 0.1.0\n\n## 0.0.8\n\nGradle and Kotlin update.\nAndroidX\n\n## 0.0.7\n\nUpdated readme\n\n## 0.0.6\n\nAdded missing stopScanForDevices function on iOS\n\n## 0.0.5\n\nUpdated kotlin version.\nSpecific MidiMessage type now exist as separate subtypes of MidiMessage.\nAdded StopScanning function.\nUpdated example.\n\n## 0.0.4\n\nFixed stream broadcast bug\n\n## 0.0.3\n\nAdded Support for BLE MIDI devices on iOS\n\n## 0.0.2\n\nReadme and formatting\n\n## 0.0.1\n\nInitial Release.\nFunctioning discovery and connection to MIDI devices on Android and iOS, as well as BLE MIDI devices on Android.\nFunctioning sending and receiving of MIDI data\n\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/LICENSE",
    "content": "Copyright 2020 InvisibleWrench. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Invisible Wrench ApS nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/README.md",
    "content": "# flutter_midi_command\n\nA Flutter plugin for sending and receiving MIDI messages between Flutter and physical and virtual MIDI devices. \n\nWraps CoreMIDI/android.media.midi/ALSA in a thin dart/flutter layer.\nSupports\n- USB and BLE MIDI connections on Android\n- USB, network(session) and BLE MIDI connections on iOS and macOS.\n- ALSA Midi on Linux\n\n## To install\n\n- Make sure your project is created with Kotlin and Swift support.\n- Add flutter_midi_command: ^0.3.0 to your pubspec.yaml file.\n- In ios/Podfile uncomment and change the platform to 10.0 `platform :ios, '10.0'`\n- After building, Add a NSBluetoothAlwaysUsageDescription to info.plist in the generated Xcode project.\n- On Linux, make sure ALSA is installed.\n\n\n## Getting Started\n\nThis plugin is build using Swift and Kotlin on the native side, so make sure your project supports this.\n\nImport flutter_midi_command\n\n`import 'package:flutter_midi_command/flutter_midi_command.dart';`\n\n- Get a list of available MIDI devices by calling `MidiCommand().devices` which returns a list of `MidiDevice`\n- Start scanning for BLE MIDI devices by calling `MidiCommand().startScanningForBluetoothDevices()`\n- Connect to a specific `MidiDevice` by calling `MidiCommand.connectToDevice(selectedDevice)`\n- Stop scanning for BLE MIDI devices by calling `MidiCommand().stopScanningForBluetoothDevices()`\n- Disconnect from the current device by calling `MidiCommand.disconnectDevice()`\n- Listen for updates in the MIDI setup by subscribing to `MidiCommand().onMidiSetupChanged`\n- Listen for incoming MIDI messages on from the current device by subscribing to `MidiCommand().onMidiDataReceived`, after which the listener will recieve inbound MIDI messages as an UInt8List of variable length.\n- Send a MIDI message by calling `MidiCommand.sendData(data)`, where data is an UInt8List of bytes following the MIDI spec.\n- Or use the various `MidiCommand` subtypes to send PC, CC, NoteOn and NoteOff messages.\n\nSee example folder for how to use.\n\nFor help getting started with Flutter, view our online\n[documentation](https://flutter.io/).\n\nFor help on editing plugin code, view the [documentation](https://flutter.io/developing-packages/#edit-plugin-package).\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\nandroid {\n    compileSdkVersion 31\n    namespace 'com.invisiblewrench.flutter_midi_command'\n    \n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.invisiblewrench.flutter_midi_command\"\n        minSdkVersion 16\n        targetSdkVersion 31\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.debug\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.invisiblewrench.flutter_midi_command\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.invisiblewrench.flutter_midi_command\">\n</manifest>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java",
    "content": "package io.flutter.plugins;\n\nimport androidx.annotation.Keep;\nimport androidx.annotation.NonNull;\n\nimport io.flutter.embedding.engine.FlutterEngine;\n\n/**\n * Generated file. Do not edit.\n * This file is generated by the Flutter tool based on the\n * plugins that support the Android platform.\n */\n@Keep\npublic final class GeneratedPluginRegistrant {\n  public static void registerWith(@NonNull FlutterEngine flutterEngine) {\n    flutterEngine.getPlugins().add(new com.invisiblewrench.fluttermidicommand.FlutterMidiCommandPlugin());\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/main/kotlin/com/invisiblewrench/flutter_midi_command/MainActivity.kt",
    "content": "package com.invisiblewrench.flutter_midi_command\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity() {\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n         \n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">@android:color/white</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.invisiblewrench.flutter_midi_command\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/build.gradle",
    "content": "group 'com.invisiblewrench.fluttermidicommand'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    ext.kotlin_version = '1.6.10'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.0'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 31\n    namespace 'com.invisiblewrench.fluttermidicommand'\n\n    kotlinOptions {\n        jvmTarget = \"17\"\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    \n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n    defaultConfig {\n        minSdkVersion 19\n    }\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.2-all.zip\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.enableR8=true\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.java.home=C:/AndroidSDK/jdk-17.0.9"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/settings.gradle",
    "content": "rootProject.name = 'flutter_midi_command'\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.invisiblewrench.fluttermidicommand\">\n\n    <uses-feature android:name=\"android.software.midi\" android:required=\"false\"/>\n    <uses-feature android:name=\"android.hardware.bluetooth_le\" android:required=\"true\"/>\n\n    <uses-permission android:name=\"android.permission.BLUETOOTH\"/>\n    <uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>\n</manifest>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/android/src/main/kotlin/com/invisiblewrench/fluttermidicommand/FlutterMidiCommandPlugin.kt",
    "content": "package com.invisiblewrench.fluttermidicommand\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler\nimport io.flutter.plugin.common.MethodChannel.Result\nimport io.flutter.plugin.common.PluginRegistry.Registrar\nimport io.flutter.plugin.common.EventChannel\n\nimport android.app.Activity\nimport android.os.Handler\nimport android.media.midi.*\nimport android.content.Context.MIDI_SERVICE\nimport android.bluetooth.BluetoothAdapter\nimport android.bluetooth.BluetoothDevice\nimport android.bluetooth.BluetoothManager\nimport android.bluetooth.le.*\nimport android.content.pm.PackageManager\nimport android.os.ParcelUuid\nimport android.Manifest\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport io.flutter.plugin.common.BinaryMessenger\n\nimport android.util.Log\n\n\n/** FlutterMidiCommandPlugin */\npublic class FlutterMidiCommandPlugin : FlutterPlugin, ActivityAware, MethodCallHandler {\n\n  lateinit var context: Context\n  private var activity:Activity? = null\n  lateinit var  messenger:BinaryMessenger\n\n  private lateinit var midiManager:MidiManager\n  private lateinit var handler: Handler\n\n  private var connectedDevices = mutableMapOf<String, ConnectedDevice>()\n\n  lateinit var rxChannel:EventChannel\n  lateinit var rxStreamHandler:FlutterStreamHandler\n  lateinit var setupChannel:EventChannel\n  lateinit var setupStreamHandler:FlutterStreamHandler\n\n  lateinit var bluetoothAdapter:BluetoothAdapter\n  var bluetoothScanner:BluetoothLeScanner? = null\n  private val PERMISSIONS_REQUEST_ACCESS_LOCATION = 95453 // arbitrary\n\n  var discoveredDevices = mutableSetOf<BluetoothDevice>()\n\n  lateinit var blManager:BluetoothManager\n\n  override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {\n    messenger = flutterPluginBinding.binaryMessenger\n    context = flutterPluginBinding.applicationContext\n  }\n\n  override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {\n    print(\"detached from engine\")\n  }\n\n  override fun onAttachedToActivity(p0: ActivityPluginBinding) {\n    print(\"onAttachedToActivity\")\n    // TODO: your plugin is now attached to an Activity\n    activity = p0?.activity\n    setup()\n  }\n\n  override fun onDetachedFromActivityForConfigChanges() {\n    print(\"onDetachedFromActivityForConfigChanges\")\n    // TODO: the Activity your plugin was attached to was\n// destroyed to change configuration.\n// This call will be followed by onReattachedToActivityForConfigChanges().\n  }\n\n  override fun onReattachedToActivityForConfigChanges(p0: ActivityPluginBinding) {\n    // TODO: your plugin is now attached to a new Activity\n\n// after a configuration change.\n    print(\"onReattachedToActivityForConfigChanges\")\n  }\n\n  override fun onDetachedFromActivity() { // TODO: your plugin is no longer associated with an Activity.\n// Clean up references.\n    print(\"onDetachedFromActivity\")\n    activity = null\n  }\n\n\n  // This static function is optional and equivalent to onAttachedToEngine. It supports the old\n  // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting\n  // plugin registration via this function while apps migrate to use the new Android APIs\n  // post-flutter-1.12 via https://flutter.dev/go/android-project-migration.\n  //\n  // It is encouraged to share logic between onAttachedToEngine and registerWith to keep\n  // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called\n  // depending on the user's project. onAttachedToEngine or registerWith must both be defined\n  // in the same class.\n  companion object {\n    @JvmStatic\n    fun registerWith(registrar: Registrar) {\n//      val channel = MethodChannel(registrar.messenger(), \"fluttermidicommand\")\n      var instance = FlutterMidiCommandPlugin()\n      instance.messenger = registrar.messenger()\n      instance.context = registrar.activeContext()\n      instance.activity = registrar.activity()\n      instance.setup()\n    }\n  }\n\n  private inner class MidiDeviceOpenedListener : MidiManager.OnDeviceOpenedListener {\n    override fun onDeviceOpened(it: MidiDevice?) {\n      Log.d(\"FlutterMIDICommand\", \"onDeviceOpened\")\n      it?.also {\n        val id = it.info.id.toString()\n        Log.d(\"FlutterMIDICommand\", \"Opened\\n${it.info}\")\n\n        val device = ConnectedDevice(it)\n        device.connectWithReceiver(RXReceiver(rxStreamHandler, it))\n        connectedDevices[id] = device\n\n        this@FlutterMidiCommandPlugin.setupStreamHandler.send(\"deviceOpened\")\n      }\n    }\n  }\n\n  private lateinit var deviceOpenedListener: MidiDeviceOpenedListener\n\n  private inner class MidiDeviceCallback : MidiManager.DeviceCallback() {\n    override fun onDeviceAdded(device: MidiDeviceInfo?) {\n      super.onDeviceAdded(device)\n      device?.also {\n        Log.d(\"FlutterMIDICommand\", \"device added $it\")\n        this@FlutterMidiCommandPlugin.setupStreamHandler.send(\"deviceFound\")\n      }\n    }\n\n    override fun onDeviceRemoved(device: MidiDeviceInfo?) {\n      super.onDeviceRemoved(device)\n      device?.also {\n        Log.d(\"FlutterMIDICommand\",\"device removed $it\")\n        connectedDevices[it.id.toString()]?.also {\n          Log.d(\"FlutterMIDICommand\",\"remove removed device $it\")\n          connectedDevices.remove(it.id)\n        }\n        this@FlutterMidiCommandPlugin.setupStreamHandler.send(\"deviceLost\")\n      }\n    }\n\n    override fun onDeviceStatusChanged(status: MidiDeviceStatus?) {\n      super.onDeviceStatusChanged(status)\n      Log.d(\"FlutterMIDICommand\",\"device status changed ${status.toString()}\")\n\n      status?.also {\n        connectedDevices[status.deviceInfo.id.toString()]?.also {\n          Log.d(\"FlutterMIDICommand\", \"update device status\")\n          it.status = status\n        }\n      }\n      this@FlutterMidiCommandPlugin.setupStreamHandler.send(\"onDeviceStatusChanged\")\n    }\n  }\n\n  private lateinit var deviceConnectionCallback: MidiDeviceCallback\n\n  fun setup() {\n    //TODO: Better?\n    if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI))\n      return;\n\n     deviceOpenedListener = MidiDeviceOpenedListener()\n     deviceConnectionCallback = MidiDeviceCallback()\n\n    print(\"setup\")\n    val channel = MethodChannel(messenger, \"plugins.invisiblewrench.com/flutter_midi_command\")\n    channel.setMethodCallHandler(this)\n\n    handler = Handler(context.mainLooper)\n    midiManager = context.getSystemService(Context.MIDI_SERVICE) as MidiManager\n    midiManager.registerDeviceCallback(deviceConnectionCallback, handler)\n\n    rxStreamHandler = FlutterStreamHandler(handler)\n    rxChannel = EventChannel(messenger, \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\")\n    rxChannel.setStreamHandler( rxStreamHandler )\n\n    setupStreamHandler = FlutterStreamHandler(handler)\n    setupChannel = EventChannel(messenger, \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\")\n    setupChannel.setStreamHandler( setupStreamHandler )\n  }\n\n\n  override fun onMethodCall(call: MethodCall, result: Result): Unit {\n//    Log.d(\"FlutterMIDICommand\",\"call method ${call.method}\")\n    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {\n      result.error(\"ERROR\", \"Needs at least Android M\", null);\n      return;\n    }\n    when (call.method) {\n      \"sendData\" -> {\n        var args : Map<String,Any>? = call.arguments()\n        sendData(args?.get(\"data\") as ByteArray, args[\"timestamp\"] as? Long, args[\"deviceId\"]?.toString())\n        result.success(null)\n      }\n      \"getDevices\" -> {\n        result.success(listOfDevices())\n      }\n      \"scanForDevices\" -> {\n        val errorMsg = startScanningLeDevices()\n        if (errorMsg != null) {\n          result.error(\"ERROR\", errorMsg, null)\n        } else {\n          result.success(null)\n        }\n      }\n      \"stopScanForDevices\" -> {\n        stopScanningLeDevices()\n        result.success(null)\n      }\n      \"connectToDevice\" -> {\n        var args : Map<String,Any>? = call.arguments()\n        var device = (args?.get(\"device\") as Map<String, Any>)\n//        var portList = (args[\"ports\"] as List<Map<String, Any>>).map{\n//          Port(if (it[\"id\"].toString() is String) it[\"id\"].toString().toInt() else 0 , it[\"type\"].toString())\n//        }\n        connectToDevice(device[\"id\"].toString(), device[\"type\"].toString())\n        result.success(null)\n      }\n      \"disconnectDevice\" -> {\n        var args = call.arguments<Map<String, Any>>()\n        args?.get(\"id\")?.let { disconnectDevice(it.toString()) }\n        result.success(null)\n      }\n      \"teardown\" -> {\n        teardown()\n        result.success(null)\n      }\n      else -> {\n        result.notImplemented()\n      }\n    }\n  }\n\n  private fun tryToInitBT() : String? {\n    Log.d(\"FlutterMIDICommand\", \"tryToInitBT\")\n\n    if (context.checkSelfPermission(Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED ||\n            context.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {\n\n      if (activity != null) {\n        var activity = activity!!\n        if (activity.shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_ADMIN) || activity.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {\n          Log.d(\"FlutterMIDICommand\", \"Show rationale for Location\")\n          return \"showRationaleForPermission\"\n        } else {\n          activity.requestPermissions(arrayOf(Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.ACCESS_FINE_LOCATION), PERMISSIONS_REQUEST_ACCESS_LOCATION)\n        }\n      }\n    } else {\n      Log.d(\"FlutterMIDICommand\", \"Already permitted\")\n\n      blManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager\n      bluetoothAdapter = blManager.adapter\n      if (bluetoothAdapter != null) {\n        bluetoothScanner = bluetoothAdapter.bluetoothLeScanner\n\n        if (bluetoothScanner != null) {\n          // Listen for changes in Bluetooth state\n          context.registerReceiver(broadcastReceiver, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED))\n\n          startScanningLeDevices()\n        } else {\n          Log.d(\"FlutterMIDICommand\", \"bluetoothScanner is null\")\n          return \"bluetoothNotAvailable\"\n        }\n      } else {\n        Log.d(\"FlutterMIDICommand\", \"bluetoothAdapter is null\")\n      }\n    }\n    return null\n  }\n\n  private val broadcastReceiver = object : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) {\n      val action = intent.action\n\n      if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {\n        val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)\n\n        when (state) {\n          BluetoothAdapter.STATE_OFF -> {\n            Log.d(\"FlutterMIDICommand\", \"BT is now off\")\n            bluetoothScanner = null\n          }\n\n          BluetoothAdapter.STATE_TURNING_OFF -> {\n            Log.d(\"FlutterMIDICommand\", \"BT is now turning off\")\n          }\n\n          BluetoothAdapter.STATE_ON -> {\n            Log.d(\"FlutterMIDICommand\", \"BT is now on\")\n          }\n        }\n      }\n    }\n  }\n\n\n  private fun startScanningLeDevices() : String? {\n\n    //Removed to enable support for Kitkat\n    return null\n  }\n\n  private fun stopScanningLeDevices() {\n    //Removed to enable support for Kitkat\n  }\n\n  fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,\n                                 grantResults: IntArray) {\n    Log.d(\"FlutterMIDICommand\", \"Permissions code: $requestCode grantResults: $grantResults\")\n    if (requestCode == PERMISSIONS_REQUEST_ACCESS_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n      startScanningLeDevices()\n    } else {\n      Log.d(\"FlutterMIDICommand\", \"Perms failed\")\n    }\n  }\n\n  private fun connectToDevice(deviceId:String, type:String) {\n    Log.d(\"FlutterMIDICommand\", \"connect to $type device: $deviceId\")\n\n    if (type == \"BLE\") {\n      val bleDevices = discoveredDevices.filter { it.address == deviceId }\n      if (bleDevices.count() == 0) {\n        Log.d(\"FlutterMIDICommand\", \"Device not found ${deviceId}\")\n      } else {\n        Log.d(\"FlutterMIDICommand\", \"Stop BLE Scan - Open device\")\n        midiManager.openBluetoothDevice(bleDevices.first(), deviceOpenedListener, handler)\n      }\n    } else if (type == \"native\") {\n      val devices =  midiManager.devices.filter { d -> d.id.toString() == deviceId }\n      if (devices.count() == 0) {\n        Log.d(\"FlutterMIDICommand\", \"not found device $devices\")\n      } else {\n        Log.d(\"FlutterMIDICommand\", \"open device ${devices[0]}\")\n        midiManager.openDevice(devices[0], deviceOpenedListener, handler)\n      }\n    }\n  }\n\n  fun teardown() {\n    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M)\n      return;\n\n    Log.d(\"FlutterMIDICommand\", \"teardown\")\n\n    connectedDevices.forEach { s, connectedDevice -> connectedDevice.close() }\n    connectedDevices.clear()\n\n    Log.d(\"FlutterMIDICommand\", \"unregisterDeviceCallback\")\n    midiManager.unregisterDeviceCallback(deviceConnectionCallback)\n    Log.d(\"FlutterMIDICommand\", \"unregister broadcastReceiver\")\n    try {\n      context.unregisterReceiver(broadcastReceiver)\n    } catch (e: Exception) {\n      // The receiver was not registered.\n      // There is nothing to do in that case.\n      // Everything is fine.\n    }\n  }\n\n  fun disconnectDevice(deviceId: String) {\n    connectedDevices[deviceId]?.also {\n      it.close()\n      connectedDevices.remove(deviceId)\n    }\n  }\n\n  fun sendData(data: ByteArray, timestamp: Long?, deviceId: String?) {\n    if (deviceId != null && connectedDevices.containsKey(deviceId)) {\n      connectedDevices[deviceId]?.let {\n        it.send(data, timestamp)\n      }\n    } else {\n      connectedDevices.values.forEach {\n        it.send(data, timestamp)\n      }\n    }\n  }\n\n  fun listOfPorts(count: Int) :  List<Map<String, Any>> {\n    Log.d(\"FlutterMIDICommand\", \"number of ports $count\")\n    return (0 until count).map { mapOf(\"id\" to it, \"connected\" to false) }\n  }\n\n  fun listOfDevices() : List<Map<String, Any>> {\n    var list = mutableListOf<Map<String, Any>>()\n\n    val devs:Array<MidiDeviceInfo> = midiManager.devices\n    Log.d(\"FlutterMIDICommand\", \"devices $devs\")\n\n    var connectedBleDeviceIds = mutableListOf<String>()\n\n    devs.forEach {\n      if (it.type == MidiDeviceInfo.TYPE_BLUETOOTH) {\n        connectedBleDeviceIds.add(it.properties.get(MidiDeviceInfo.PROPERTY_BLUETOOTH_DEVICE).toString())\n      }\n\n      list.add(mapOf(\n            \"name\" to (it.properties.getString(MidiDeviceInfo.PROPERTY_NAME) ?: \"-\"),\n            \"id\" to it.id.toString(),\n            \"type\" to \"native\",\n            \"connected\" to if (connectedDevices.contains(it.id.toString())) \"true\" else \"false\",\n            \"inputs\" to listOfPorts(it.inputPortCount),\n            \"outputs\" to listOfPorts(it.outputPortCount)\n          )\n    )}\n\n    discoveredDevices.forEach {\n      if (!connectedBleDeviceIds.contains(it.address)) {\n        list.add(mapOf(\n                \"name\" to it.name,\n                \"id\" to it.address,\n                \"type\" to \"BLE\",\n                \"connected\" to if (connectedDevices.contains(it.address)) \"true\" else \"false\",\n                \"inputs\" to listOf(mapOf(\"id\" to 0, \"connected\" to false)),\n                \"outputs\" to listOf(mapOf(\"id\" to 0, \"connected\" to false))\n        ))\n      }\n    }\n\n    Log.d(\"FlutterMIDICommand\", \"list $list\")\n\n    return list.toList()\n  }\n\n  class RXReceiver(stream: FlutterStreamHandler, device: MidiDevice) : MidiReceiver() {\n    val stream = stream\n    var isBluetoothDevice = device.info.type == MidiDeviceInfo.TYPE_BLUETOOTH\n\n    val deviceInfo = mapOf(\"id\" to if(isBluetoothDevice) device.info.properties.get(MidiDeviceInfo.PROPERTY_BLUETOOTH_DEVICE).toString() else device.info.id.toString(), \"name\" to device.info.properties.getString(MidiDeviceInfo.PROPERTY_NAME), \"type\" to if(isBluetoothDevice) \"BLE\" else \"native\")\n\n    var sysexPart:MutableList<Byte> = mutableListOf()\n\n    override fun onSend(msg: ByteArray?, offset: Int, count: Int, timestamp: Long) {\n      msg?.also {\n        var data = it.slice(IntRange(offset, offset+count-1))\n\n//        Log.d(\"FlutterMIDICommand\", \"data sliced $data offset $offset count $count first ${data.first()} last ${data.last()}\")\n\n        if (sysexPart.isNotEmpty()) {\n          // does data contain a start byte?\n          var startIndex = data.indexOf(0xF0.toByte())\n          if (startIndex > -1) { // new sysex incoming, cap old one\n//            Log.d(\"FlutterMIDICommand\", \"new sysex message starting, ending last one from startindex $startIndex\")\n\n            var tailEnd = data.subList(0, startIndex)\n            sysexPart.addAll(tailEnd)\n            if (sysexPart.indexOf(0xF7.toByte()) == -1) {\n              sysexPart.add(0xF7.toByte()) // Sometimes android drops the last byte of a BLE Midi message, so this workaround tries to save that situation\n            }\n            stream.send( mapOf(\"data\" to sysexPart.toList(), \"timestamp\" to timestamp, \"device\" to deviceInfo))\n\n            // insert start of new message\n            sysexPart.clear()\n            sysexPart.addAll(data.subList(startIndex, data.size))\n          } else {\n            // add more data to part\n            sysexPart.addAll(data)\n          }\n\n//          Log.d(\"FlutterMIDICommand\", \"data $sysexPart\")\n\n          // is the message complete\n          var endIndex = sysexPart.indexOf(0xF7.toByte())\n          if (endIndex > -1) {\n            var sysexData = sysexPart.subList(0, endIndex+1)\n//            Log.d(\"FlutterMIDICommand\", \"complete sysex message, send to app\")\n            stream.send(mapOf(\"data\" to sysexData, \"timestamp\" to timestamp, \"device\" to deviceInfo))\n            sysexPart = sysexPart.subList(endIndex+1, sysexPart.size)\n//            Log.d(\"FlutterMIDICommand\", \"remainng sysex part, $sysexPart\")\n          }\n\n        } else {\n          // Start of new sysex message\n          if (data.first() == 0xF0.toByte()) {\n            var endIndex = data.indexOf(0xF7.toByte())\n//            Log.d(\"FlutterMIDICommand\", \"sysex end index $endIndex\")\n            if (endIndex > -1) { // Has end byte\n                var sysexData = data.subList(0, endIndex+1);\n//              Log.d(\"FlutterMIDICommand\", \"complete sysex message $sysexData, send to app\")\n                stream.send(mapOf(\"data\" to sysexData, \"timestamp\" to timestamp, \"device\" to deviceInfo))\n\n                if (endIndex < data.size-1) {\n//                  Log.d(\"FlutterMIDICommand\", \"start of new sysex message in tail, save...\")\n                  sysexPart.clear()\n                  sysexPart.addAll(data.subList(endIndex+1, data.size))\n                }\n            } else { // no end byte, save for later\n              sysexPart.clear()\n              sysexPart.addAll(data)\n            }\n          } else {\n            // regular midi message\n            stream.send(mapOf(\"data\" to data, \"timestamp\" to timestamp, \"device\" to deviceInfo))\n          }\n        }\n      }\n    }\n  }\n\n  class FlutterStreamHandler(handler: Handler) : EventChannel.StreamHandler {\n    val handler = handler\n    private var eventSink: EventChannel.EventSink? = null\n\n    // EventChannel.StreamHandler methods\n    override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink?) {\n      Log.d(\"FlutterMIDICommand\",\"FlutterStreamHandler onListen\")\n      this.eventSink = eventSink\n    }\n\n    override fun onCancel(arguments: Any?) {\n      Log.d(\"FlutterMIDICommand\",\"FlutterStreamHandler onCancel\")\n      eventSink = null\n    }\n\n    fun send(data: Any) {\n//      Log.d(\"FlutterMIDICommand\",\"FlutterStreamHandler send ${data}\")\n      handler.post {\n        eventSink?.success(data)\n      }\n    }\n  }\n\n  class Port {\n    var id:Int\n    var type:String\n\n    constructor(id:Int, type:String) {\n      this.id = id\n      this.type = type\n    }\n  }\n\n  class ConnectedDevice {\n    var id:String\n    var type:String\n    lateinit var midiDevice:MidiDevice\n    var inputPort:MidiInputPort? = null\n    var outputPort:MidiOutputPort? = null\n    var status:MidiDeviceStatus? = null\n    private var receiver:MidiReceiver? = null\n\n    constructor(device:MidiDevice) {\n      this.midiDevice = device\n      this.id = device.info.id.toString()\n      this.type = device.info.type.toString()\n      device.info.ports.forEach {\n        Log.d(\"FlutterMIDICommand\", \"port on device: ${it.name} ${it.type} ${it.portNumber}\")\n      }\n    }\n\n    fun connectWithReceiver(receiver: MidiReceiver) {\n      Log.d(\"FlutterMIDICommand\",\"connectWithHandler\")\n\n      this.midiDevice?.info?.let {\n\n//        Log.d(\"FlutterMIDICommand\",\"inputPorts ${it.inputPortCount} outputPorts ${it.outputPortCount}\")\n\n//        it.ports.forEach {\n//          Log.d(\"FlutterMIDICommand\", \"${it.name} ${it.type} ${it.portNumber}\")\n//        }\n\n//        Log.d(\"FlutterMIDICommand\", \"is binder alive? ${this.midiDevice?.info?.properties?.getBinder(null)?.isBinderAlive}\")\n\n        if(it.inputPortCount > 0) {\n          Log.d(\"FlutterMIDICommand\", \"Open input port\")\n          this.inputPort = this.midiDevice?.openInputPort(0)\n        }\n        if (it.outputPortCount > 0) {\n          Log.d(\"FlutterMIDICommand\", \"Open output port\")\n          this.outputPort = this.midiDevice?.openOutputPort(0)\n          this.outputPort?.connect(receiver)\n        }\n      }\n\n      this.receiver = receiver\n    }\n\n//    fun openPorts(ports: List<Port>) {\n//      this.midiDevice.info?.let { deviceInfo ->\n//        Log.d(\"FlutterMIDICommand\",\"inputPorts ${deviceInfo.inputPortCount} outputPorts ${deviceInfo.outputPortCount}\")\n//\n//        ports.forEach { port ->\n//          Log.d(\"FlutterMIDICommand\", \"Open port ${port.type} ${port.id}\")\n//          when (port.type) {\n//            \"MidiPortType.IN\" -> {\n//              if (deviceInfo.inputPortCount > port.id) {\n//                Log.d(\"FlutterMIDICommand\", \"Open input port ${port.id}\")\n//                this.inputPort = this.midiDevice.openInputPort(port.id)\n//              }\n//            }\n//            \"MidiPortType.OUT\" -> {\n//              if (deviceInfo.outputPortCount > port.id) {\n//                Log.d(\"FlutterMIDICommand\", \"Open output port ${port.id}\")\n//                this.outputPort = this.midiDevice.openOutputPort(port.id)\n//                this.outputPort?.connect(receiver)\n//              }\n//            }\n//            else -> {\n//              Log.d(\"FlutterMIDICommand\", \"Unknown MIDI port type ${port.type}. Not opening.\")\n//            }\n//          }\n//        }\n//      }\n//    }\n\n    fun send(data: ByteArray, timestamp: Long?) {\n      this.inputPort?.send(data, 0, data.count(), if (timestamp is Long) timestamp else 0);\n    }\n\n    fun close() {\n      Log.d(\"FlutterMIDICommand\", \"Flush input port ${this.inputPort}\")\n      this.inputPort?.flush()\n      Log.d(\"FlutterMIDICommand\", \"Close input port ${this.inputPort}\")\n      this.inputPort?.close()\n      Log.d(\"FlutterMIDICommand\", \"Close output port ${this.outputPort}\")\n      this.outputPort?.close()\n      Log.d(\"FlutterMIDICommand\", \"Disconnect receiver ${this.receiver}\")\n      this.outputPort?.disconnect(this.receiver)\n      this.receiver = null\n      Log.d(\"FlutterMIDICommand\", \"Close device ${this.midiDevice}\")\n      this.midiDevice?.close()\n    }\n\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Classes/FlutterMidiCommandPlugin.h",
    "content": "#if TARGET_OS_OSX\n  #import <FlutterMacOS/FlutterMacOS.h>\n #else\n  #import <Flutter/Flutter.h>\n #endif\n\n@interface FlutterMidiCommandPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Classes/FlutterMidiCommandPlugin.m",
    "content": "#import \"FlutterMidiCommandPlugin.h\"\n#if __has_include(<flutter_midi_command/flutter_midi_command-Swift.h>)\n#import <flutter_midi_command/flutter_midi_command-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"flutter_midi_command-Swift.h\"\n#endif\n\n\n\n@implementation FlutterMidiCommandPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftFlutterMidiCommandPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Classes/SwiftFlutterMidiCommandPlugin.swift",
    "content": "\n#if os(macOS)\n    import FlutterMacOS\n #else\n    import Flutter\n #endif\n\nimport CoreMIDI\nimport os.log\nimport CoreBluetooth\nimport Foundation\n\n///\n/// Credit to\n/// http://mattg411.com/coremidi-swift-programming/\n/// https://github.com/genedelisa/Swift3MIDI\n/// http://www.gneuron.com/?p=96\n/// https://learn.sparkfun.com/tutorials/midi-ble-tutorial/all\n\n\npublic class SwiftFlutterMidiCommandPlugin: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate, FlutterPlugin {\n\n    // MIDI\n    var midiClient = MIDIClientRef()\n    var connectedDevices = Dictionary<String, ConnectedDevice>()\n    \n    // Flutter\n    var midiRXChannel:FlutterEventChannel?\n    var rxStreamHandler = StreamHandler()\n    var midiSetupChannel:FlutterEventChannel?\n    var setupStreamHandler = StreamHandler()\n\n    #if os(iOS)\n    // Network Session\n    var session:MIDINetworkSession?\n    #endif\n\n    // BLE\n    var manager:CBCentralManager!\n    var discoveredDevices:Set<CBPeripheral> = []\n    \n\n    let midiLog = OSLog(subsystem: \"com.invisiblewrench.FlutterMidiCommand\", category: \"MIDI\")\n\n    public static func register(with registrar: FlutterPluginRegistrar) {\n        #if os(macOS)\n            let channel = FlutterMethodChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command\", binaryMessenger: registrar.messenger)\n        #else\n            let channel = FlutterMethodChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command\", binaryMessenger: registrar.messenger())\n        #endif\n        let instance = SwiftFlutterMidiCommandPlugin()\n        registrar.addMethodCallDelegate(instance, channel: channel)\n\n        instance.setup(registrar)\n    }\n\n    deinit {\n        NotificationCenter.default.removeObserver(self)\n        MIDIClientDispose(midiClient)\n    }\n\n    func setup(_ registrar: FlutterPluginRegistrar) {\n        // Stream setup\n        #if os(macOS)\n            midiRXChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\", binaryMessenger: registrar.messenger)\n        #else\n            midiRXChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\", binaryMessenger: registrar.messenger())\n        #endif\n        midiRXChannel?.setStreamHandler(rxStreamHandler)\n\n\n        #if os(macOS)\n            midiSetupChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\", binaryMessenger: registrar.messenger)\n        #else\n            midiSetupChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\", binaryMessenger: registrar.messenger())\n        #endif\n        midiSetupChannel?.setStreamHandler(setupStreamHandler)\n\n        // MIDI client with notification handler\n        MIDIClientCreateWithBlock(\"plugins.invisiblewrench.com.FlutterMidiCommand\" as CFString, &midiClient) { (notification) in\n            self.handleMIDINotification(notification)\n        }\n\n        manager = CBCentralManager.init(delegate: self, queue: DispatchQueue.global(qos: .userInteractive))\n\n#if os(iOS)\n         session = MIDINetworkSession.default()\n         session?.isEnabled = true\n         session?.connectionPolicy = MIDINetworkConnectionPolicy.anyone\n         #endif\n    }\n\n    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n//        print(\"call method \\(call.method)\")\n        switch call.method {\n        case \"scanForDevices\":\n            print(\"\\(manager.state.rawValue)\")\n            if manager.state == CBManagerState.poweredOn {\n                print(\"Start discovery\")\n                discoveredDevices.removeAll()\n                manager.scanForPeripherals(withServices: [CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")], options: nil)\n                result(nil)\n            } else {\n                print(\"BT not ready\")\n                result(FlutterError(code: \"MESSAGEERROR\", message: \"bluetoothNotAvailable\", details: call.arguments))\n            }\n            break\n        case \"stopScanForDevices\":\n            manager.stopScan()\n            break\n        case \"getDevices\":\n            let devices = getDevices()\n            print(\"--- devices ---\\n\\(devices)\")\n            result(devices)\n            break\n        case \"connectToDevice\":\n            if let args = call.arguments as? Dictionary<String, Any> {\n                if let deviceInfo = args[\"device\"] as? Dictionary<String, Any> {\n                    if let deviceId = deviceInfo[\"id\"] as? String {\n                        if connectedDevices[deviceId] != nil {\n                            result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Device already connected\", details: call.arguments))\n                        } else {\n                            connectToDevice(deviceId: deviceInfo[\"id\"] as! String, type: deviceInfo[\"type\"] as! String, ports: nil)\n                        }\n                        result(nil)\n                    } else {\n                        result(FlutterError.init(code: \"MESSAGEERROR\", message: \"No device Id\", details: deviceInfo))\n                    }\n                } else {\n                    result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse deviceInfo\", details: call.arguments))\n                }\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse args\", details: call.arguments))\n            }\n            break\n        case \"disconnectDevice\":\n            if let deviceInfo = call.arguments as? Dictionary<String, Any> {\n                if let deviceId = deviceInfo[\"id\"] as? String {\n                    disconnectDevice(deviceId: deviceId)\n                } else {\n                    result(FlutterError.init(code: \"MESSAGEERROR\", message: \"No device Id\", details: call.arguments))\n                }\n                result(nil)\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse device id\", details: call.arguments))\n            }\n            result(nil)\n            break\n\n        case \"sendData\":\n            if let packet = call.arguments as? Dictionary<String, Any> {\n                sendData(packet[\"data\"] as! FlutterStandardTypedData, deviceId: packet[\"deviceId\"] as? String, timestamp: packet[\"timestamp\"] as? UInt64)\n                result(nil)\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not form midi packet\", details: call.arguments))\n            }\n            break\n        case \"teardown\":\n            teardown()\n            break\n        default:\n            result(FlutterMethodNotImplemented)\n        }\n    }\n    \n    func teardown() {\n        for device in connectedDevices {\n            disconnectDevice(deviceId: device.value.id)\n        }\n        #if os(iOS)\n        session?.isEnabled = false\n        #endif\n    }\n\n\n    func connectToDevice(deviceId:String, type:String, ports:[Port]?) {\n        print(\"connect \\(deviceId) \\(type)\")\n                \n        if type == \"BLE\" {\n            if let periph = discoveredDevices.filter({ (p) -> Bool in p.identifier.uuidString == deviceId }).first {\n                let device = ConnectedBLEDevice(id: deviceId, type: type, streamHandler: rxStreamHandler, peripheral: periph, ports:ports)\n                connectedDevices[deviceId] = device\n                manager.stopScan()\n                manager.connect(periph, options: nil)\n            } else {\n                print(\"error connecting to device \\(deviceId) [\\(type)]\")\n            }\n        } else if type == \"native\" {\n            let device = ConnectedNativeDevice(id: deviceId, type: type, streamHandler: rxStreamHandler, client: midiClient, ports:ports)\n            connectedDevices[deviceId] = device\n            setupStreamHandler.send(data: \"deviceConnected\")\n        }\n    }\n\n    func disconnectDevice(deviceId:String) {\n        let device = connectedDevices[deviceId]\n        print(\"disconnect \\(String(describing: device)) for id \\(deviceId)\")\n        if let device = device {\n            if device.deviceType == \"BLE\" {\n                //let p = (device as! ConnectedBLEDevice).peripheral\n                //manager.cancelPeripheralConnection(p)\n                device.close()\n            } else {\n                print(\"disconmmected MIDI\")\n                device.close()\n                setupStreamHandler.send(data: \"deviceDisconnected\")\n            }\n            connectedDevices.removeValue(forKey: deviceId)\n        }\n    }\n\n\n    func sendData(_ data:FlutterStandardTypedData, deviceId: String?, timestamp: UInt64?) {\n        let bytes = [UInt8](data.data)\n        \n        if let deviceId = deviceId {\n            if let device = connectedDevices[deviceId] {\n                device.send(bytes: bytes, timestamp: timestamp)\n//                _sendDataToDevice(device: device, data: data, timestamp: timestamp)\n            }\n        } else {\n            connectedDevices.values.forEach({ (device) in\n                device.send(bytes: bytes, timestamp: timestamp)\n//                _sendDataToDevice(device: device, data: data, timestamp: timestamp)\n            })\n        }\n    }\n    \n\n    static func getMIDIProperty(_ prop:CFString, fromObject obj:MIDIObjectRef) -> String {\n        var param: Unmanaged<CFString>?\n        var result: String = \"Error\"\n        let err: OSStatus = MIDIObjectGetStringProperty(obj, prop, &param)\n        if err == OSStatus(noErr) { result = param!.takeRetainedValue() as String }\n        return result\n    }\n    \n\n    func createPortDict(count:Int) -> Array<Dictionary<String, Any>> {\n        return (0..<count).map { (id) -> Dictionary<String, Any> in\n            return [\"id\": id, \"connected\" : false]\n        }\n    }\n\n    \n    func getDevices() -> [Dictionary<String, Any>] {\n        var devices:[Dictionary<String, Any>] = []\n\n        //  Native\n        var nativeDevices = Dictionary<MIDIEntityRef, Dictionary<String, Any>>()\n        \n        let destinationCount = MIDIGetNumberOfDestinations()\n        for d in 0..<destinationCount {\n            let destination = MIDIGetDestination(d)\n//            print(\"dest \\(destination) \\(SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: destination))\")\n            \n            var entity : MIDIEntityRef = 0\n            var status = MIDIEndpointGetEntity(destination, &entity)\n            let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: entity)\n//            print(\"entity \\(entity) status \\(status) \\(entityName)\")\n            \n            var device : MIDIDeviceRef = 0\n            status = MIDIEntityGetDevice(entity, &device)\n            let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n//            print(\"device \\(device) status \\(status) \\(deviceName)\")\n            \n            let entityCount = MIDIDeviceGetNumberOfEntities(device)\n//            print(\"entityCount \\(entityCount)\")\n            \n            var entityIndex = 0;\n            for e in 0..<entityCount {\n                let ent = MIDIDeviceGetEntity(device, e)\n//                print(\"ent \\(ent)\")\n                if (ent == entity) {\n                    entityIndex = e\n                }\n            }\n//            print(\"entityIndex \\(entityIndex)\")\n            let deviceId = \"\\(device):\\(entityIndex)\"\n            \n            let entityDestinationCount = MIDIEntityGetNumberOfDestinations(entity)\n//            print(\"entiry dest count \\(entityDestinationCount)\")\n            \n            nativeDevices[entity] = [\n                \"name\" : \"\\(deviceName) \\(entityName)\",\n                \"id\" : \"\\(device):\\(entityIndex)\",\n                \"type\" : \"native\",\n                \"connected\":(connectedDevices.keys.contains(deviceId) ? \"true\" : \"false\"),\n                \"outputs\" : createPortDict(count: entityDestinationCount)\n                ]\n        }\n        \n        \n        let sourceCount = MIDIGetNumberOfSources()\n        for s in 0..<sourceCount {\n            let source = MIDIGetSource(s)\n//            print(\"src \\(source) \\(SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: source))\")\n            \n            var entity : MIDIEntityRef = 0\n\t            var status = MIDIEndpointGetEntity(source, &entity)\n            let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: entity)\n//            print(\"entity \\(entity) status \\(status) \\(entityName)\")\n            \n            var device : MIDIDeviceRef = 0\n            status = MIDIEntityGetDevice(entity, &device)\n            let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n//            print(\"device \\(device) status \\(status) \\(deviceName)\")\n            \n            let entityCount = MIDIDeviceGetNumberOfEntities(device)\n//            print(\"entityCount \\(entityCount)\")\n            \n            var entityIndex = 0;\n            for e in 0..<entityCount {\n                let ent = MIDIDeviceGetEntity(device, e)\n//                print(\"ent \\(ent)\")\n                if (ent == entity) {\n                    entityIndex = e\n                }\n            }\n//            print(\"entityIndex \\(entityIndex)\")\n            \n            let entitySourceCount = MIDIEntityGetNumberOfSources(entity)\n//            print(\"entiry source count \\(entitySourceCount)\")\n            let deviceId = \"\\(device):\\(entityIndex)\"\n            \n            if var deviceDict = nativeDevices[entity] {\n//                print(\"add inputs to dict\")\n                deviceDict[\"inputs\"] = createPortDict(count: entitySourceCount)\n//                print(type(of: createPortDict(count: entitySourceCount)))\n                nativeDevices[entity] = deviceDict\n            } else {\n//                print(\"create inputs dict\")\n                nativeDevices[entity] = [\n                    \"name\" : \"\\(deviceName) \\(entityName)\",\n                    \"id\" : \"\\(device):\\(entityIndex)\",\n                    \"type\" : \"native\",\n                    \"connected\":(connectedDevices.keys.contains(deviceId) ? \"true\" : \"false\"),\n                    \"inputs\" : createPortDict(count: entitySourceCount)\n                    ]\n            }\n        }\n        \n        devices.append(contentsOf: nativeDevices.values)\n        \n        // BLE\n        for periph:CBPeripheral in discoveredDevices {\n            let id = periph.identifier.uuidString\n            devices.append([\n                \"name\" : periph.name ?? \"Unknown\",\n                \"id\" : id,\n                \"type\" : \"BLE\",\n                \"connected\":(connectedDevices.keys.contains(id) ? \"true\" : \"false\"),\n                \"inputs\" : [[\"id\":0, \"connected\":false]],\n                \"outputs\" : [[\"id\":0, \"connected\":false]]\n                ])\n        }\n\n        return devices;\n    }\n\n\n    func handleMIDINotification(_ midiNotification: UnsafePointer<MIDINotification>) {\n        print(\"\\ngot a MIDINotification!\")\n\n        let notification = midiNotification.pointee\n        print(\"MIDI Notify, messageId= \\(notification.messageID)\")\n        print(\"MIDI Notify, messageSize= \\(notification.messageSize)\")\n\n        setupStreamHandler.send(data: \"\\(notification.messageID)\")\n\n        switch notification.messageID {\n\n        // Some aspect of the current MIDISetup has changed.  No data.  Should ignore this  message if messages 2-6 are handled.\n        case .msgSetupChanged:\n            print(\"MIDI setup changed\")\n            let ptr = UnsafeMutablePointer<MIDINotification>(mutating: midiNotification)\n            //            let ptr = UnsafeMutablePointer<MIDINotification>(midiNotification)\n            let m = ptr.pointee\n            print(m)\n            print(\"id \\(m.messageID)\")\n            print(\"size \\(m.messageSize)\")\n            break\n\n\n        // A device, entity or endpoint was added. Structure is MIDIObjectAddRemoveNotification.\n        case .msgObjectAdded:\n\n            print(\"added\")\n            //            let ptr = UnsafeMutablePointer<MIDIObjectAddRemoveNotification>(midiNotification)\n\n            midiNotification.withMemoryRebound(to: MIDIObjectAddRemoveNotification.self, capacity: 1) {\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"child \\(m.child)\")\n                print(\"child type \\(m.childType)\")\n                showMIDIObjectType(m.childType)\n                print(\"parent \\(m.parent)\")\n                print(\"parentType \\(m.parentType)\")\n                showMIDIObjectType(m.parentType)\n                //                print(\"childName \\(String(describing: getDisplayName(m.child)))\")\n            }\n\n\n            break\n\n        // A device, entity or endpoint was removed. Structure is MIDIObjectAddRemoveNotification.\n        case .msgObjectRemoved:\n            print(\"kMIDIMsgObjectRemoved\")\n            //            let ptr = UnsafeMutablePointer<MIDIObjectAddRemoveNotification>(midiNotification)\n            midiNotification.withMemoryRebound(to: MIDIObjectAddRemoveNotification.self, capacity: 1) {\n\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"child \\(m.child)\")\n                print(\"child type \\(m.childType)\")\n                print(\"parent \\(m.parent)\")\n                print(\"parentType \\(m.parentType)\")\n\n                //                print(\"childName \\(String(describing: getDisplayName(m.child)))\")\n            }\n            break\n\n        // An object's property was changed. Structure is MIDIObjectPropertyChangeNotification.\n        case .msgPropertyChanged:\n            print(\"kMIDIMsgPropertyChanged\")\n            midiNotification.withMemoryRebound(to: MIDIObjectPropertyChangeNotification.self, capacity: 1) {\n\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"object \\(m.object)\")\n                print(\"objectType  \\(m.objectType)\")\n                print(\"propertyName  \\(m.propertyName)\")\n                print(\"propertyName  \\(m.propertyName.takeUnretainedValue())\")\n\n                if m.propertyName.takeUnretainedValue() as String == \"apple.midirtp.session\" {\n                    print(\"connected\")\n                }\n            }\n\n            break\n\n        //     A persistent MIDI Thru connection wasor destroyed.  No data.\n        case .msgThruConnectionsChanged:\n            print(\"MIDI thru connections changed.\")\n            break\n\n        //A persistent MIDI Thru connection was created or destroyed.  No data.\n        case .msgSerialPortOwnerChanged:\n            print(\"MIDI serial port owner changed.\")\n            break\n\n        case .msgIOError:\n            print(\"MIDI I/O error.\")\n\n            //let ptr = UnsafeMutablePointer<MIDIIOErrorNotification>(midiNotification)\n            midiNotification.withMemoryRebound(to: MIDIIOErrorNotification.self, capacity: 1) {\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"driverDevice \\(m.driverDevice)\")\n                print(\"errorCode \\(m.errorCode)\")\n            }\n            break\n        @unknown default:\n            break\n        }\n    }\n\n    func showMIDIObjectType(_ ot: MIDIObjectType) {\n        switch ot {\n        case .other:\n            os_log(\"midiObjectType: Other\", log: midiLog, type: .debug)\n            break\n\n        case .device:\n            os_log(\"midiObjectType: Device\", log: midiLog, type: .debug)\n            break\n\n        case .entity:\n            os_log(\"midiObjectType: Entity\", log: midiLog, type: .debug)\n            break\n\n        case .source:\n            os_log(\"midiObjectType: Source\", log: midiLog, type: .debug)\n            break\n\n        case .destination:\n            os_log(\"midiObjectType: Destination\", log: midiLog, type: .debug)\n            break\n\n        case .externalDevice:\n            os_log(\"midiObjectType: ExternalDevice\", log: midiLog, type: .debug)\n            break\n\n        case .externalEntity:\n            print(\"midiObjectType: ExternalEntity\")\n            os_log(\"midiObjectType: ExternalEntity\", log: midiLog, type: .debug)\n            break\n\n        case .externalSource:\n            os_log(\"midiObjectType: ExternalSource\", log: midiLog, type: .debug)\n            break\n\n        case .externalDestination:\n            os_log(\"midiObjectType: ExternalDestination\", log: midiLog, type: .debug)\n            break\n        @unknown default:\n            break\n        }\n\n    }\n\n    #if os(iOS)\n    /// MIDI Network Session\n     @objc func midiNetworkChanged(notification:NSNotification) {\n            print(\"\\(#function)\")\n            print(\"\\(notification)\")\n            if let session = notification.object as? MIDINetworkSession {\n                print(\"session \\(session)\")\n                for con in session.connections() {\n                    print(\"con \\(con)\")\n                }\n                print(\"isEnabled \\(session.isEnabled)\")\n                print(\"sourceEndpoint \\(session.sourceEndpoint())\")\n                print(\"destinationEndpoint \\(session.destinationEndpoint())\")\n                print(\"networkName \\(session.networkName)\")\n                print(\"localName \\(session.localName)\")\n\n                //            if let name = getDeviceName(session.sourceEndpoint()) {\n                //                print(\"source name \\(name)\")\n                //            }\n                //\n                //            if let name = getDeviceName(session.destinationEndpoint()) {\n                //                print(\"destination name \\(name)\")\n                //            }\n            }\n            setupStreamHandler.send(data: \"\\(#function) \\(notification)\")\n        }\n\n    @objc func midiNetworkContactsChanged(notification:NSNotification) {\n        print(\"\\(#function)\")\n        print(\"\\(notification)\")\n        if let session = notification.object as? MIDINetworkSession {\n            print(\"session \\(session)\")\n            for con in session.contacts() {\n                print(\"contact \\(con)\")\n            }\n        }\n        setupStreamHandler.send(data: \"\\(#function) \\(notification)\")\n    }\n    #endif\n\n    /// BLE handling\n\n    // Central\n    public func centralManagerDidUpdateState(_ central: CBCentralManager) {\n        print(\"central did update state \\(central.state.rawValue)\")\n    }\n\n    public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {\n        print(\"central didDiscover \\(peripheral)\")\n        if !discoveredDevices.contains(peripheral) {\n            discoveredDevices.insert(peripheral)\n            setupStreamHandler.send(data: \"deviceFound\")\n        }\n    }\n\n    public func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {\n        print(\"central did connect \\(peripheral)\")\n//        connectedPeripheral = peripheral\n//        peripheral.delegate = self\n//        peripheral.discoverServices([CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")])\n        setupStreamHandler.send(data: \"deviceConnected\")\n        \n        (connectedDevices[peripheral.identifier.uuidString] as! ConnectedBLEDevice).setupBLE()\n    }\n\n    public func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {\n        print(\"central did fail to connect state \\(peripheral)\")\n//        connectingDevice = nil\n        \n        setupStreamHandler.send(data: \"connectionFailed\")\n        connectedDevices.removeValue(forKey: peripheral.identifier.uuidString)\n    }\n\n    public func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {\n        print(\"central didDisconnectPeripheral \\(peripheral)\")\n        \n//        connectedPeripheral = nil\n//        connectedCharacteristic = nil\n        setupStreamHandler.send(data: \"deviceDisconnected\")\n    }    \n}\n\nclass StreamHandler : NSObject, FlutterStreamHandler {\n\n    var sink:FlutterEventSink?\n\n    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {\n        sink = events\n        return nil\n    }\n\n    func onCancel(withArguments arguments: Any?) -> FlutterError? {\n        sink = nil\n        return nil\n    }\n\n    func send(data: Any) {\n        if let sink = sink {\n            sink(data)\n//        } else {\n//            print(\"no sink\")\n        }\n    }\n}\n\nclass Port {\n    var id:Int\n    var type:String\n    \n    init(id:Int, type:String) {\n        self.id = id;\n        self.type = type\n    }\n}\n\nclass ConnectedDevice : NSObject {\n    var id:String\n    var deviceType:String\n    var streamHandler : StreamHandler\n    \n    init(id:String, type:String, streamHandler:StreamHandler) {\n        self.id = id\n        self.deviceType = type\n        self.streamHandler = streamHandler\n    }\n    \n    func openPorts() {}\n    \n    func send(bytes:[UInt8], timestamp: UInt64?) {}\n    \n    func close() {}\n}\n\nclass ConnectedNativeDevice : ConnectedDevice {\n    var outputPort = MIDIPortRef()\n    var inputPort = MIDIPortRef()\n    var client : MIDIClientRef\n    var name : String?\n    var outEndpoint : MIDIEndpointRef?\n    var inSource : MIDIEndpointRef?\n    var entity : MIDIEntityRef?\n    var ports:[Port]?\n    \n    init(id:String, type:String, streamHandler:StreamHandler, client: MIDIClientRef, ports:[Port]?) {\n        self.client = client\n        self.ports = ports\n        let idParts = id.split(separator: \":\")\n        \n        // Store entity and get device/entity name\n        if let deviceId = MIDIDeviceRef(idParts[0]) {\n            if let entityId = Int(idParts[1]) {\n                entity = MIDIDeviceGetEntity(deviceId, entityId)\n                if let e = entity {\n                    let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: e)\n                    \n                    var device:MIDIDeviceRef = 0\n                    MIDIEntityGetDevice(e, &device)\n                    let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n                    \n                    name = \"\\(deviceName) \\(entityName)\"\n                } else {\n                    print(\"no entity\")\n                }\n            } else {\n                print(\"no entityId\")\n            }\n        } else {\n            print(\"no deviceId\")\n        }\n        \n        super.init(id: id, type: type, streamHandler: streamHandler)\n        \n        // MIDI Input with handler\n         MIDIInputPortCreateWithBlock(client, \"FlutterMidiCommand_InPort\" as CFString, &inputPort) { (packetList, srcConnRefCon) in\n             self.handlePacketList(packetList, srcConnRefCon: srcConnRefCon)\n         }\n        \n        // MIDI output\n        MIDIOutputPortCreate(client, \"FlutterMidiCommand_OutPort\" as CFString, &outputPort);\n\n        openPorts()\n    }\n        \n    override func send(bytes: [UInt8], timestamp: UInt64?) {\n        if let ep = outEndpoint {\n            let packetList = UnsafeMutablePointer<MIDIPacketList>.allocate(capacity: 1)\n            var packet = MIDIPacketListInit(packetList)\n            let time = timestamp ?? mach_absolute_time()\n            packet = MIDIPacketListAdd(packetList, 1024, packet, time, bytes.count, bytes)\n\n            let status = MIDISend(outputPort, ep, packetList)\n            //print(\"send bytes \\(bytes) on port \\(outputPort) \\(ep) status \\(status)\")\n            packetList.deallocate()\n        } else {\n            print(\"No MIDI destination for id \\(name!)\")\n        }\n    }\n    \n    override func openPorts() {\n        print(\"open native ports\")\n        \n        if let e = entity {\n\n            if let ps = ports {\n                for port in ps {\n                    inSource = MIDIEntityGetSource(e, port.id)\n\n                    switch port.type {\n                    case \"MidiPortType.IN\":\n                        let status = MIDIPortConnectSource(inputPort, inSource!, &name)\n                        print(\"port open status \\(status)\")\n                    case \"MidiPortType.OUT\":\n                        outEndpoint = MIDIEntityGetDestination(e, port.id)\n    //                    print(\"port endpoint \\(endpoint)\")\n                        break\n                    default:\n                        print(\"unknown port type \\(port.type)\")\n                    }\n                }\n            } else {\n                print(\"open default ports\")\n                inSource = MIDIEntityGetSource(e, 0)\n                let status = MIDIPortConnectSource(inputPort, inSource!, &name)\n                outEndpoint = MIDIEntityGetDestination(e, 0)\n            }\n        }\n    }\n    \n    override func close() {\n        if let oEP = outEndpoint {\n            MIDIEndpointDispose(oEP)\n        }\n        \n        if let iS = inSource {\n            MIDIPortDisconnectSource(inputPort, iS)\n        }\n        \n        MIDIPortDispose(inputPort)\n        MIDIPortDispose(outputPort)\n    }\n    \n    func handlePacketList(_ packetList:UnsafePointer<MIDIPacketList>, srcConnRefCon:UnsafeMutableRawPointer?) {\n        let packets = packetList.pointee\n        let packet:MIDIPacket = packets.packet\n        var ap = UnsafeMutablePointer<MIDIPacket>.allocate(capacity: 1)\n        ap.initialize(to:packet)\n\n        let deviceInfo = [\"name\" : name,\n                          \"id\": String(id),\n                          \"type\":\"native\"]\n        \n        for _ in 0 ..< packets.numPackets {\n            let p = ap.pointee\n            var tmp = p.data\n            let data = Data(bytes: &tmp, count: Int(p.length))\n            let timestamp = p.timeStamp\n//            print(\"data \\(data) timestamp \\(timestamp)\")\n            streamHandler.send(data: [\"data\": data, \"timestamp\":timestamp, \"device\":deviceInfo])\n            ap = MIDIPacketNext(ap)\n        }\n        \n//        ap.deallocate()\n    }\n}\n\nclass ConnectedBLEDevice : ConnectedDevice, CBPeripheralDelegate {\n    var peripheral:CBPeripheral\n    var characteristic:CBCharacteristic?\n    \n    // BLE MIDI parsing\n    enum BLE_HANDLER_STATE\n    {\n        case HEADER\n        case TIMESTAMP\n        case STATUS\n        case STATUS_RUNNING\n        case PARAMS\n        case SYSTEM_RT\n        case SYSEX\n        case SYSEX_END\n        case SYSEX_INT\n    }\n\n    var bleHandlerState = BLE_HANDLER_STATE.HEADER\n\n    var sysExBuffer: [UInt8] = []\n    var timestamp: UInt64 = 0\n    var bleMidiBuffer:[UInt8] = []\n    var bleMidiPacketLength:UInt8 = 0\n    var bleSysExHasFinished = true\n    \n    init(id:String, type:String, streamHandler:StreamHandler, peripheral:CBPeripheral, ports:[Port]?) {\n        self.peripheral = peripheral\n        super.init(id: id, type: type, streamHandler: streamHandler)\n    }\n    \n    func setupBLE() {\n        peripheral.delegate = self\n        peripheral.discoverServices([CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")])\n    }\n\n    \n    override func close() {\n        CBCentralManager().cancelPeripheralConnection(peripheral)\n        characteristic = nil\n    }\n    \n    override func send(bytes:[UInt8], timestamp: UInt64?) {\n//        print(\"ble send \\(id) \\(bytes)\")\n        if (characteristic != nil) {\n            let packetSize = 20\n            \n            var dataBytes = Data(bytes)\n            \n            if bytes.first == 0xF0 && bytes.last == 0xF7 { //  this is a sysex message, handle carefully\n                if bytes.count > 17 { // Split into multiple messages of 20 bytes total\n                    \n                    \n                    // First packet\n                    var packet = dataBytes.subdata(in: 0..<packetSize-2)\n                    \n                    print(\"count \\(dataBytes.count)\")\n                    \n                    // Insert header(and empty timstamp high) and timestamp low in front Sysex Start\n                    packet.insert(0x80, at: 0)\n                    packet.insert(0x80, at: 0)\n                    \n//                        print(\"packet \\(packet)\")\n//                        print(\"packet \\(hexEncodedString(packet))\")\n                    \n                    peripheral.writeValue(packet, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                    \n                    dataBytes = dataBytes.advanced(by: packetSize-2)\n                    \n                    // More packets\n                    while dataBytes.count > 0 {\n                        \n                        print(\"count \\(dataBytes.count)\")\n                        \n                        let pickCount = min(dataBytes.count, packetSize-1)\n//                            print(\"pickCount \\(pickCount)\")\n                        packet = dataBytes.subdata(in: 0..<pickCount) // Pick bytes for packet\n                        \n                        // Insert header\n                        packet.insert(0x80, at: 0)\n                        \n                        if (packet.count < packetSize) { // Last packet\n                            // Timestamp before Sysex End byte\n                            print(\"insert end\")\n                            packet.insert(0x80, at: packet.count-1)\n                        }\n                        \n//                            print(\"packet \\(hexEncodedString(packet))\")\n                        \n\n                        peripheral.writeValue(packet, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                        \n                        if (dataBytes.count > packetSize-2) {\n                            dataBytes = dataBytes.advanced(by: pickCount) // Advance buffer\n                        }\n                        else {\n                            print(\"done\")\n                            return\n                        }\n                    }\n                } else {\n                    // Insert timestamp low in front of Sysex End-byte\n                    dataBytes.insert(0x80, at: bytes.count-1)\n                    \n                    // Insert header(and empty timstamp high) and timestamp low in front of BLE Midi message\n                    dataBytes.insert(0x80, at: 0)\n                    dataBytes.insert(0x80, at: 0)\n                    \n                    peripheral.writeValue(dataBytes, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                }\n                return\n            }\n            \n            // Insert header(and empty timstamp high) and timestamp low in front of BLE Midi message\n            dataBytes.insert(0x80, at: 0)\n            dataBytes.insert(0x80, at: 0)\n            \n            peripheral.writeValue(dataBytes, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n        } else {\n            print(\"No peripheral/characteristic in device\")\n        }\n    }\n    \n    public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {\n        print(\"perif didDiscoverServices  \\(String(describing: peripheral.services))\")\n        for service:CBService in peripheral.services! {\n            peripheral.discoverCharacteristics(nil, for: service)\n        }\n    }\n\n    public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {\n        print(\"perif didDiscoverCharacteristicsFor  \\(String(describing: service.characteristics))\")\n        for characteristic:CBCharacteristic in service.characteristics! {\n            if characteristic.uuid.uuidString == \"7772E5DB-3868-4112-A1A9-F2669D106BF3\" {\n                self.characteristic = characteristic\n                peripheral.setNotifyValue(true, for: characteristic)\n                print(\"set up characteristic for device\")\n            }\n        }\n    }\n    \n    func createMessageEvent(_ bytes:[UInt8], timestamp:UInt64, peripheral:CBPeripheral) {\n//        print(\"send rx event \\(bytes)\")\n        let data = Data(bytes: bytes, count: Int(bytes.count))\n        streamHandler.send(data: [\"data\": data, \"timestamp\":timestamp, \"device\":[\n                                                            \"name\" : peripheral.name ?? \"-\",\n                                        \"id\":peripheral.identifier.uuidString,\n                                                                    \"type\":\"BLE\"]])\n    }\n\n    public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {\n//        print(\"perif didUpdateValueFor  \\(String(describing: characteristic))\")\n        if let value = characteristic.value {\n            parseBLEPacket(value, peripheral:peripheral)\n        }\n    }\n    \n    func parseBLEPacket(_ packet:Data, peripheral:CBPeripheral) -> Void {\n//        print(\"parse \\(packet)\")\n        \n        if (packet.count > 1)\n          {\n            // parse BLE message\n            bleHandlerState = BLE_HANDLER_STATE.HEADER\n\n            let header = packet[0]\n            var statusByte:UInt8 = 0\n\n            for i in 1...packet.count-1 {\n                let midiByte:UInt8 = packet[i]\n//              print (\"bleHandlerState \\(bleHandlerState) byte \\(midiByte)\")\n                \n                if ((midiByte & 0x80) == 0x80 && bleHandlerState != BLE_HANDLER_STATE.TIMESTAMP && bleHandlerState != BLE_HANDLER_STATE.SYSEX_INT) {\n                    if (!bleSysExHasFinished) {\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX_INT\n                    } else {\n                        bleHandlerState = BLE_HANDLER_STATE.TIMESTAMP\n                    }\n                } else {\n\n                  // State handling\n                  switch (bleHandlerState)\n                  {\n                  case BLE_HANDLER_STATE.HEADER:\n                    if (!bleSysExHasFinished)\n                    {\n                      if ((midiByte & 0x80) == 0x80)\n                      { // System messages can interrupt ongoing sysex\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX_INT\n                      }\n                      else\n                      {\n                        // Sysex continue\n                        //print(\"sysex continue\")\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                      }\n                    }\n                    break\n\n                  case BLE_HANDLER_STATE.TIMESTAMP:\n                    if ((midiByte & 0xFF) == 0xF0)\n                    { // Sysex start\n                      bleSysExHasFinished = false\n                        sysExBuffer.removeAll()\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                    }\n                    else if ((midiByte & 0x80) == 0x80)\n                    { // Status/System start\n                      bleHandlerState = BLE_HANDLER_STATE.STATUS\n                    }\n                    else\n                    {\n                      bleHandlerState = BLE_HANDLER_STATE.STATUS_RUNNING\n                    }\n                    break\n\n                  case BLE_HANDLER_STATE.STATUS:\n                      bleHandlerState = BLE_HANDLER_STATE.PARAMS\n                    break\n\n                  case BLE_HANDLER_STATE.STATUS_RUNNING:\n                    bleHandlerState = BLE_HANDLER_STATE.PARAMS\n                    break;\n\n                  case BLE_HANDLER_STATE.PARAMS: // After params can come TSlow or more params\n                    break\n\n                  case BLE_HANDLER_STATE.SYSEX:\n                    break\n\n                  case BLE_HANDLER_STATE.SYSEX_INT:\n                    if ((midiByte & 0xF7) == 0xF7)\n                    { // Sysex end\n//                        print(\"sysex end\")\n                      bleSysExHasFinished = true\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX_END\n                    }\n                    else\n                    {\n                        bleHandlerState = BLE_HANDLER_STATE.SYSTEM_RT\n                    }\n                    break;\n\n                  case BLE_HANDLER_STATE.SYSTEM_RT:\n                    if (!bleSysExHasFinished)\n                    { // Continue incomplete Sysex\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                    }\n                    break\n\n                  default:\n                    print (\"Unhandled state \\(bleHandlerState)\")\n                    break\n                  }\n                }\n\n//                print (\"\\(bleHandlerState) - \\(midiByte) [\\(String(format:\"%02X\", midiByte))]\")\n\n              // Data handling\n              switch (bleHandlerState)\n              {\n              case BLE_HANDLER_STATE.TIMESTAMP:\n//                print (\"set timestamp\")\n                let tsHigh = header & 0x3f\n                let tsLow = midiByte & 0x7f\n                timestamp = UInt64(tsHigh) << 7 | UInt64(tsLow)\n//                print (\"timestamp is \\(timestamp)\")\n                break\n\n              case BLE_HANDLER_STATE.STATUS:\n\n                bleMidiPacketLength = lengthOfMessageType(midiByte)\n//                print(\"message length \\(bleMidiPacketLength)\")\n                bleMidiBuffer.removeAll()\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == 1 {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral) // TODO Add timestamp\n                } else {\n//                    print (\"set status\")\n                    statusByte = midiByte\n                }\n                break\n\n              case BLE_HANDLER_STATE.STATUS_RUNNING:\n//                print(\"set running status\")\n                bleMidiPacketLength = lengthOfMessageType(statusByte)\n                bleMidiBuffer.removeAll()\n                bleMidiBuffer.append(statusByte)\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == 2 {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral)\n                }\n                break\n\n              case BLE_HANDLER_STATE.PARAMS:\n//                print (\"add param \\(midiByte)\")\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == bleMidiBuffer.count {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral)\n                    bleMidiBuffer.removeLast(Int(bleMidiPacketLength)-1) // Remove all but status, which might be used for running msgs\n                }\n                break\n\n              case BLE_HANDLER_STATE.SYSTEM_RT:\n//                print(\"handle RT\")\n                createMessageEvent([midiByte], timestamp: timestamp, peripheral:peripheral)\n                break\n\n              case BLE_HANDLER_STATE.SYSEX:\n//                print(\"add sysex\")\n                sysExBuffer.append(midiByte)\n                break\n\n              case BLE_HANDLER_STATE.SYSEX_INT:\n//                print(\"sysex int\")\n                break\n\n              case BLE_HANDLER_STATE.SYSEX_END:\n//                print(\"finalize sysex\")\n                sysExBuffer.append(midiByte)\n                createMessageEvent(sysExBuffer, timestamp: 0, peripheral:peripheral)\n                break\n\n              default:\n                print (\"Unhandled state (data) \\(bleHandlerState)\")\n                break\n              }\n            }\n          }\n        }\n    \n    func lengthOfMessageType(_ type:UInt8) -> UInt8 {\n        let midiType:UInt8 = type & 0xF0\n        \n        switch (type) {\n            case 0xF6, 0xF8, 0xFA, 0xFB, 0xFC, 0xFF, 0xFE:\n                return 1\n            case 0xF1, 0xF3:\n                    return 2\n            default:\n                break\n        }\n        \n        switch (midiType) {\n            case 0xC0, 0xD0:\n                return 2\n            case 0xF2, 0x80, 0x90, 0xA0, 0xB0, 0xE0:\n                return 3\n            default:\n                break\n        }\n        return 0\n    }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>$(DEVELOPMENT_LANGUAGE)</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>9.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '10.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>flutter_midi_command</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.invisiblewrench.flutterMidiCommand;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.invisiblewrench.flutterMidiCommand;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.invisiblewrench.flutterMidiCommand;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/ios/flutter_midi_command.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint flutter_midi_command.podspec' to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'flutter_midi_command'\n  s.version          = '0.3.6'\n  s.summary          = 'A Flutter plugin for sending and receiving MIDI messages'\n  s.description      = <<-DESC\n  'A Flutter plugin for sending and receiving MIDI messages'\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.dependency 'Flutter'\n  s.platform = :ios, '10.0'\n\n  # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }\n  s.swift_version = '5.0'\nend\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/lib/flutter_midi_command.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'dart:typed_data';\nimport 'flutter_midi_command_linux_stub.dart'\n    if (dart.library.ffi) 'package:flutter_midi_command_linux/flutter_midi_command_linux.dart';\nimport 'package:flutter_midi_command_platform_interface/flutter_midi_command_platform_interface.dart';\nexport 'package:flutter_midi_command_platform_interface/flutter_midi_command_platform_interface.dart'\n    show MidiDevice, MidiPacket, MidiPort;\n\nclass MidiCommand {\n  factory MidiCommand() {\n    if (_instance == null) {\n      _instance = MidiCommand._();\n    }\n    return _instance!;\n  }\n\n  MidiCommand._();\n\n  static MidiCommand? _instance;\n\n  static MidiCommandPlatform? __platform;\n\n  StreamController<Uint8List> _txStreamCtrl = StreamController.broadcast();\n\n  /// Get the platform specific implementation\n  static MidiCommandPlatform get _platform {\n    if (__platform != null) return __platform!;\n    try {\n      if (Platform.isLinux) {\n        __platform = FlutterMidiCommandLinux();\n      } else {\n        __platform = MidiCommandPlatform.instance;\n      }\n    } finally {\n      __platform = MidiCommandPlatform.instance;\n    }\n    return __platform!;\n  }\n\n  /// Gets a list of available MIDI devices and returns it\n  Future<List<MidiDevice>?> get devices async {\n    return _platform.devices;\n  }\n\n  /// Starts scanning for BLE MIDI devices\n  ///\n  /// Found devices will be included in the list returned by [devices]\n  Future<void> startScanningForBluetoothDevices() async {\n    return _platform.startScanningForBluetoothDevices();\n  }\n\n  /// Stop scanning for BLE MIDI devices\n  void stopScanningForBluetoothDevices() {\n    _platform.stopScanningForBluetoothDevices();\n  }\n\n  /// Connects to the device\n  void connectToDevice(MidiDevice device) {\n    _platform.connectToDevice(device);\n  }\n\n  /// Disconnects from the device\n  void disconnectDevice(MidiDevice device) {\n    _platform.disconnectDevice(device);\n  }\n\n  /// Disconnects from all devices\n  void teardown() {\n    _platform.teardown();\n  }\n\n  /// Sends data to the currently connected device\n  ///\n  /// Data is an UInt8List of individual MIDI command bytes\n  void sendData(Uint8List data, {String? deviceId, int? timestamp}) {\n    _platform.sendData(data, deviceId: deviceId, timestamp: timestamp);\n    _txStreamCtrl.add(data);\n  }\n\n  /// Stream firing events whenever a midi package is received\n  ///\n  /// The event contains the raw bytes contained in the MIDI package\n  Stream<MidiPacket>? get onMidiDataReceived {\n    return _platform.onMidiDataReceived;\n  }\n\n  /// Stream firing events whenever a change in the MIDI setup occurs\n  ///\n  /// For example, when a new BLE devices is discovered\n  Stream<String>? get onMidiSetupChanged {\n    return _platform.onMidiSetupChanged;\n  }\n\n  /// Stream firing events whenever a midi package is sent\n  ///\n  /// The event contains the raw bytes contained in the MIDI package\n  Stream<Uint8List> get onMidiDataSent {\n    return _txStreamCtrl.stream;\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/lib/flutter_midi_command_linux_stub.dart",
    "content": "import 'package:flutter_midi_command_platform_interface/flutter_midi_command_platform_interface.dart';\n\nclass FlutterMidiCommandLinux extends MidiCommandPlatform {}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/lib/flutter_midi_command_messages.dart",
    "content": "import 'dart:typed_data';\nimport 'flutter_midi_command.dart';\n\nenum MessageType { CC, PC, NoteOn, NoteOff, NRPN, SYSEX, Beat }\n\n/// Base class for MIDI message types\nclass MidiMessage {\n  /// Byte data of the message\n  Uint8List data = Uint8List(0);\n\n  MidiMessage();\n\n  /// Send the message bytes to all connected devices\n  void send() {\n    MidiCommand().sendData(data);\n  }\n}\n\n/// Continuous Control Message\nclass CCMessage extends MidiMessage {\n  int channel = 0;\n  int controller = 0;\n  int value = 0;\n\n  CCMessage({this.channel = 0, this.controller = 0, this.value = 0});\n\n  @override\n  void send() {\n    data = Uint8List(3);\n    data[0] = 0xB0 + channel;\n    data[1] = controller;\n    data[2] = value;\n    super.send();\n  }\n}\n\n/// Program Change Message\nclass PCMessage extends MidiMessage {\n  int channel = 0;\n  int program = 0;\n\n  PCMessage({this.channel = 0, this.program = 0});\n\n  @override\n  void send() {\n    data = Uint8List(2);\n    data[0] = 0xC0 + channel;\n    data[1] = program;\n    super.send();\n  }\n}\n\n/// Note On Message\nclass NoteOnMessage extends MidiMessage {\n  int channel = 0;\n  int note = 0;\n  int velocity = 0;\n\n  NoteOnMessage({this.channel = 0, this.note = 0, this.velocity = 0});\n\n  @override\n  void send() {\n    data = Uint8List(3);\n    data[0] = 0x90 + channel;\n    data[1] = note;\n    data[2] = velocity;\n    super.send();\n  }\n}\n\n/// Note Off Message\nclass NoteOffMessage extends MidiMessage {\n  int channel = 0;\n  int note = 0;\n  int velocity = 0;\n\n  NoteOffMessage({this.channel = 0, this.note = 0, this.velocity = 0});\n\n  @override\n  void send() {\n    data = Uint8List(3);\n    data[0] = 0x80 + channel;\n    data[1] = note;\n    data[2] = velocity;\n    super.send();\n  }\n}\n\n/// System Exclusive Message\nclass SysExMessage extends MidiMessage {\n  List<int> headerData = [];\n  int value = 0;\n\n  SysExMessage({this.headerData = const [], this.value = 0});\n\n  @override\n  void send() {\n    data = Uint8List.fromList(headerData);\n    data.insert(0, 0xF0); // Start byte\n    data.addAll(_bytesForValue(value));\n    data.add(0xF7); // End byte\n    super.send();\n  }\n\n  Int8List _bytesForValue(int value) {\n    print(\"bytes for value $value\");\n    var bytes = Int8List(5);\n\n    int absValue = value.abs();\n\n    int base256 = (absValue ~/ 256);\n    int left = absValue - (base256 * 256);\n    int base1 = left % 128;\n    left -= base1;\n    int base2 = left ~/ 2;\n\n    if (value < 0) {\n      bytes[0] = 0x7F;\n      bytes[1] = 0x7F;\n      bytes[2] = 0x7F - base256;\n      bytes[3] = 0x7F - base2;\n      bytes[4] = 0x7F - base1;\n    } else {\n      bytes[2] = base256;\n      bytes[3] = base2;\n      bytes[4] = base1;\n    }\n    return bytes;\n  }\n}\n\n/// NRPN Message\nclass NRPNMessage extends MidiMessage {\n  int channel = 0;\n  int parameter = 0;\n  int value = 0;\n\n  NRPNMessage({this.channel = 0, this.parameter = 0, this.value = 0});\n\n  @override\n  void send() {\n    data = Uint8List(12);\n    // Data Entry MSB\n    data[0] = 0xB0 + channel;\n    data[1] = 0x63;\n    data[2] = parameter ~/ 128;\n\n    // Data Entry LSB\n    data[3] = 0xB0 + channel;\n    data[4] = 0x62;\n    data[5] = parameter - (data[2] * 128);\n\n    // Data Value MSB\n    data[6] = 0xB0 + channel;\n    data[7] = 0x06;\n    data[8] = value & 0x7F;\n\n    // Data Value LSB\n    data[9] = 0xB0 + channel;\n    data[10] = 0x38;\n    data[11] = value & 0x3F80;\n\n    super.send();\n  }\n}\n\n/// NRPN Message with data separated in MSB, LSB\nclass NRPNHexMessage extends MidiMessage {\n  int channel = 0;\n  int parameterMSB = 0;\n  int parameterLSB = 0;\n  int valueMSB = 0;\n  int valueLSB = -1;\n\n  NRPNHexMessage({\n    this.channel = 0,\n    this.parameterMSB = 0,\n    this.parameterLSB = 0,\n    this.valueMSB = 0,\n    this.valueLSB = 0,\n  });\n\n  @override\n  void send() {\n    var length = valueLSB > -1 ? 12 : 9;\n    data = Uint8List(length);\n    // Data Entry MSB\n    data[0] = 0xB0 + channel;\n    data[1] = 0x63;\n    data[2] = parameterMSB;\n\n    // Data Entry LSB\n    data[3] = 0xB0 + channel;\n    data[4] = 0x62;\n    data[5] = parameterLSB;\n\n    // Data Value MSB\n    data[6] = 0xB0 + channel;\n    data[7] = 0x06;\n    data[8] = valueMSB;\n\n    // Data Value LSB\n    if (valueLSB > -1) {\n      data[9] = 0xB0 + channel;\n      data[10] = 0x38;\n      data[11] = valueLSB;\n    }\n\n    super.send();\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/macos/Classes/SwiftFlutterMidiCommandPlugin.swift",
    "content": "\n#if os(macOS)\n    import FlutterMacOS\n #else\n    import Flutter\n #endif\n\nimport CoreMIDI\nimport os.log\nimport CoreBluetooth\nimport Foundation\n\n///\n/// Credit to\n/// http://mattg411.com/coremidi-swift-programming/\n/// https://github.com/genedelisa/Swift3MIDI\n/// http://www.gneuron.com/?p=96\n/// https://learn.sparkfun.com/tutorials/midi-ble-tutorial/all\n\n\npublic class SwiftFlutterMidiCommandPlugin: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate, FlutterPlugin {\n\n    // MIDI\n    var midiClient = MIDIClientRef()\n    var connectedDevices = Dictionary<String, ConnectedDevice>()\n    \n    // Flutter\n    var midiRXChannel:FlutterEventChannel?\n    var rxStreamHandler = StreamHandler()\n    var midiSetupChannel:FlutterEventChannel?\n    var setupStreamHandler = StreamHandler()\n\n    #if os(iOS)\n    // Network Session\n    var session:MIDINetworkSession?\n    #endif\n\n    // BLE\n    var manager:CBCentralManager!\n    var discoveredDevices:Set<CBPeripheral> = []\n    \n\n    let midiLog = OSLog(subsystem: \"com.invisiblewrench.FlutterMidiCommand\", category: \"MIDI\")\n\n    public static func register(with registrar: FlutterPluginRegistrar) {\n        #if os(macOS)\n            let channel = FlutterMethodChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command\", binaryMessenger: registrar.messenger)\n        #else\n            let channel = FlutterMethodChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command\", binaryMessenger: registrar.messenger())\n        #endif\n        let instance = SwiftFlutterMidiCommandPlugin()\n        registrar.addMethodCallDelegate(instance, channel: channel)\n\n        instance.setup(registrar)\n    }\n\n    deinit {\n        NotificationCenter.default.removeObserver(self)\n        MIDIClientDispose(midiClient)\n    }\n\n    func setup(_ registrar: FlutterPluginRegistrar) {\n        // Stream setup\n        #if os(macOS)\n            midiRXChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\", binaryMessenger: registrar.messenger)\n        #else\n            midiRXChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\", binaryMessenger: registrar.messenger())\n        #endif\n        midiRXChannel?.setStreamHandler(rxStreamHandler)\n\n\n        #if os(macOS)\n            midiSetupChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\", binaryMessenger: registrar.messenger)\n        #else\n            midiSetupChannel = FlutterEventChannel(name: \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\", binaryMessenger: registrar.messenger())\n        #endif\n        midiSetupChannel?.setStreamHandler(setupStreamHandler)\n\n        // MIDI client with notification handler\n        MIDIClientCreateWithBlock(\"plugins.invisiblewrench.com.FlutterMidiCommand\" as CFString, &midiClient) { (notification) in\n            self.handleMIDINotification(notification)\n        }\n\n        manager = CBCentralManager.init(delegate: self, queue: DispatchQueue.global(qos: .userInteractive))\n\n#if os(iOS)\n         session = MIDINetworkSession.default()\n         session?.isEnabled = true\n         session?.connectionPolicy = MIDINetworkConnectionPolicy.anyone\n         #endif\n    }\n\n    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n//        print(\"call method \\(call.method)\")\n        switch call.method {\n        case \"scanForDevices\":\n            print(\"\\(manager.state.rawValue)\")\n            if manager.state == CBManagerState.poweredOn {\n                print(\"Start discovery\")\n                discoveredDevices.removeAll()\n                manager.scanForPeripherals(withServices: [CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")], options: nil)\n                result(nil)\n            } else {\n                print(\"BT not ready\")\n                result(FlutterError(code: \"MESSAGEERROR\", message: \"bluetoothNotAvailable\", details: call.arguments))\n            }\n            break\n        case \"stopScanForDevices\":\n            manager.stopScan()\n            break\n        case \"getDevices\":\n            let devices = getDevices()\n            print(\"--- devices ---\\n\\(devices)\")\n            result(devices)\n            break\n        case \"connectToDevice\":\n            if let args = call.arguments as? Dictionary<String, Any> {\n                if let deviceInfo = args[\"device\"] as? Dictionary<String, Any> {\n                    if let deviceId = deviceInfo[\"id\"] as? String {\n                        if connectedDevices[deviceId] != nil {\n                            result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Device already connected\", details: call.arguments))\n                        } else {\n                            connectToDevice(deviceId: deviceInfo[\"id\"] as! String, type: deviceInfo[\"type\"] as! String, ports: nil)\n                        }\n                        result(nil)\n                    } else {\n                        result(FlutterError.init(code: \"MESSAGEERROR\", message: \"No device Id\", details: deviceInfo))\n                    }\n                } else {\n                    result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse deviceInfo\", details: call.arguments))\n                }\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse args\", details: call.arguments))\n            }\n            break\n        case \"disconnectDevice\":\n            if let deviceInfo = call.arguments as? Dictionary<String, Any> {\n                if let deviceId = deviceInfo[\"id\"] as? String {\n                    disconnectDevice(deviceId: deviceId)\n                } else {\n                    result(FlutterError.init(code: \"MESSAGEERROR\", message: \"No device Id\", details: call.arguments))\n                }\n                result(nil)\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not parse device id\", details: call.arguments))\n            }\n            result(nil)\n            break\n\n        case \"sendData\":\n            if let packet = call.arguments as? Dictionary<String, Any> {\n                sendData(packet[\"data\"] as! FlutterStandardTypedData, deviceId: packet[\"deviceId\"] as? String, timestamp: packet[\"timestamp\"] as? UInt64)\n                result(nil)\n            } else {\n                result(FlutterError.init(code: \"MESSAGEERROR\", message: \"Could not form midi packet\", details: call.arguments))\n            }\n            break\n        case \"teardown\":\n            teardown()\n            break\n        default:\n            result(FlutterMethodNotImplemented)\n        }\n    }\n    \n    func teardown() {\n        for device in connectedDevices {\n            disconnectDevice(deviceId: device.value.id)\n        }\n        #if os(iOS)\n        session?.isEnabled = false\n        #endif\n    }\n\n\n    func connectToDevice(deviceId:String, type:String, ports:[Port]?) {\n        print(\"connect \\(deviceId) \\(type)\")\n                \n        if type == \"BLE\" {\n            if let periph = discoveredDevices.filter({ (p) -> Bool in p.identifier.uuidString == deviceId }).first {\n                let device = ConnectedBLEDevice(id: deviceId, type: type, streamHandler: rxStreamHandler, peripheral: periph, ports:ports)\n                connectedDevices[deviceId] = device\n                manager.stopScan()\n                manager.connect(periph, options: nil)\n            } else {\n                print(\"error connecting to device \\(deviceId) [\\(type)]\")\n            }\n        } else if type == \"native\" {\n            let device = ConnectedNativeDevice(id: deviceId, type: type, streamHandler: rxStreamHandler, client: midiClient, ports:ports)\n            connectedDevices[deviceId] = device\n            setupStreamHandler.send(data: \"deviceConnected\")\n        }\n    }\n\n    func disconnectDevice(deviceId:String) {\n        let device = connectedDevices[deviceId]\n        print(\"disconnect \\(String(describing: device)) for id \\(deviceId)\")\n        if let device = device {\n            if device.deviceType == \"BLE\" {\n                //let p = (device as! ConnectedBLEDevice).peripheral\n                //manager.cancelPeripheralConnection(p)\n                device.close()\n            } else {\n                print(\"disconmmected MIDI\")\n                device.close()\n                setupStreamHandler.send(data: \"deviceDisconnected\")\n            }\n            connectedDevices.removeValue(forKey: deviceId)\n        }\n    }\n\n\n    func sendData(_ data:FlutterStandardTypedData, deviceId: String?, timestamp: UInt64?) {\n        let bytes = [UInt8](data.data)\n        \n        if let deviceId = deviceId {\n            if let device = connectedDevices[deviceId] {\n                device.send(bytes: bytes, timestamp: timestamp)\n//                _sendDataToDevice(device: device, data: data, timestamp: timestamp)\n            }\n        } else {\n            connectedDevices.values.forEach({ (device) in\n                device.send(bytes: bytes, timestamp: timestamp)\n//                _sendDataToDevice(device: device, data: data, timestamp: timestamp)\n            })\n        }\n    }\n    \n\n    static func getMIDIProperty(_ prop:CFString, fromObject obj:MIDIObjectRef) -> String {\n        var param: Unmanaged<CFString>?\n        var result: String = \"Error\"\n        let err: OSStatus = MIDIObjectGetStringProperty(obj, prop, &param)\n        if err == OSStatus(noErr) { result = param!.takeRetainedValue() as String }\n        return result\n    }\n    \n\n    func createPortDict(count:Int) -> Array<Dictionary<String, Any>> {\n        return (0..<count).map { (id) -> Dictionary<String, Any> in\n            return [\"id\": id, \"connected\" : false]\n        }\n    }\n\n    \n    func getDevices() -> [Dictionary<String, Any>] {\n        var devices:[Dictionary<String, Any>] = []\n\n        //  Native\n        var nativeDevices = Dictionary<MIDIEntityRef, Dictionary<String, Any>>()\n        \n        let destinationCount = MIDIGetNumberOfDestinations()\n        for d in 0..<destinationCount {\n            let destination = MIDIGetDestination(d)\n//            print(\"dest \\(destination) \\(SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: destination))\")\n            \n            var entity : MIDIEntityRef = 0\n            var status = MIDIEndpointGetEntity(destination, &entity)\n            let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: entity)\n//            print(\"entity \\(entity) status \\(status) \\(entityName)\")\n            \n            var device : MIDIDeviceRef = 0\n            status = MIDIEntityGetDevice(entity, &device)\n            let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n//            print(\"device \\(device) status \\(status) \\(deviceName)\")\n            \n            let entityCount = MIDIDeviceGetNumberOfEntities(device)\n//            print(\"entityCount \\(entityCount)\")\n            \n            var entityIndex = 0;\n            for e in 0..<entityCount {\n                let ent = MIDIDeviceGetEntity(device, e)\n//                print(\"ent \\(ent)\")\n                if (ent == entity) {\n                    entityIndex = e\n                }\n            }\n//            print(\"entityIndex \\(entityIndex)\")\n            \n            let entityDestinationCount = MIDIEntityGetNumberOfDestinations(entity)\n//            print(\"entiry dest count \\(entityDestinationCount)\")\n            \n            nativeDevices[entity] = [\n                \"name\" : \"\\(deviceName) \\(entityName)\",\n                \"id\" : \"\\(device):\\(entityIndex)\",\n                \"type\" : \"native\",\n                \"connected\":(connectedDevices.keys.contains(String(entity)) ? \"true\" : \"false\"),\n                \"outputs\" : createPortDict(count: entityDestinationCount)\n                ]\n        }\n        \n        \n        let sourceCount = MIDIGetNumberOfSources()\n        for s in 0..<sourceCount {\n            let source = MIDIGetSource(s)\n//            print(\"src \\(source) \\(SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: source))\")\n            \n            var entity : MIDIEntityRef = 0\n            var status = MIDIEndpointGetEntity(source, &entity)\n            let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: entity)\n//            print(\"entity \\(entity) status \\(status) \\(entityName)\")\n            \n            var device : MIDIDeviceRef = 0\n            status = MIDIEntityGetDevice(entity, &device)\n            let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n//            print(\"device \\(device) status \\(status) \\(deviceName)\")\n            \n            let entityCount = MIDIDeviceGetNumberOfEntities(device)\n//            print(\"entityCount \\(entityCount)\")\n            \n            var entityIndex = 0;\n            for e in 0..<entityCount {\n                let ent = MIDIDeviceGetEntity(device, e)\n//                print(\"ent \\(ent)\")\n                if (ent == entity) {\n                    entityIndex = e\n                }\n            }\n//            print(\"entityIndex \\(entityIndex)\")\n            \n            let entitySourceCount = MIDIEntityGetNumberOfSources(entity)\n//            print(\"entiry source count \\(entitySourceCount)\")\n            \n            if var deviceDict = nativeDevices[entity] {\n//                print(\"add inputs to dict\")\n                deviceDict[\"inputs\"] = createPortDict(count: entitySourceCount)\n//                print(type(of: createPortDict(count: entitySourceCount)))\n                nativeDevices[entity] = deviceDict\n            } else {\n//                print(\"create inputs dict\")\n                nativeDevices[entity] = [\n                    \"name\" : \"\\(deviceName) \\(entityName)\",\n                    \"id\" : \"\\(device):\\(entityIndex)\",\n                    \"type\" : \"native\",\n                    \"connected\":(connectedDevices.keys.contains(String(entity)) ? \"true\" : \"false\"),\n                    \"inputs\" : createPortDict(count: entitySourceCount)\n                    ]\n            }\n        }\n        \n        devices.append(contentsOf: nativeDevices.values)\n        \n        // BLE\n        for periph:CBPeripheral in discoveredDevices {\n            let id = periph.identifier.uuidString\n            devices.append([\n                \"name\" : periph.name ?? \"Unknown\",\n                \"id\" : id,\n                \"type\" : \"BLE\",\n                \"connected\":(connectedDevices.keys.contains(id) ? \"true\" : \"false\"),\n                \"inputs\" : [[\"id\":0, \"connected\":false]],\n                \"outputs\" : [[\"id\":0, \"connected\":false]]\n                ])\n        }\n\n        return devices;\n    }\n\n\n    func handleMIDINotification(_ midiNotification: UnsafePointer<MIDINotification>) {\n        print(\"\\ngot a MIDINotification!\")\n\n        let notification = midiNotification.pointee\n        print(\"MIDI Notify, messageId= \\(notification.messageID)\")\n        print(\"MIDI Notify, messageSize= \\(notification.messageSize)\")\n\n        setupStreamHandler.send(data: \"\\(notification.messageID)\")\n\n        switch notification.messageID {\n\n        // Some aspect of the current MIDISetup has changed.  No data.  Should ignore this  message if messages 2-6 are handled.\n        case .msgSetupChanged:\n            print(\"MIDI setup changed\")\n            let ptr = UnsafeMutablePointer<MIDINotification>(mutating: midiNotification)\n            //            let ptr = UnsafeMutablePointer<MIDINotification>(midiNotification)\n            let m = ptr.pointee\n            print(m)\n            print(\"id \\(m.messageID)\")\n            print(\"size \\(m.messageSize)\")\n            break\n\n\n        // A device, entity or endpoint was added. Structure is MIDIObjectAddRemoveNotification.\n        case .msgObjectAdded:\n\n            print(\"added\")\n            //            let ptr = UnsafeMutablePointer<MIDIObjectAddRemoveNotification>(midiNotification)\n\n            midiNotification.withMemoryRebound(to: MIDIObjectAddRemoveNotification.self, capacity: 1) {\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"child \\(m.child)\")\n                print(\"child type \\(m.childType)\")\n                showMIDIObjectType(m.childType)\n                print(\"parent \\(m.parent)\")\n                print(\"parentType \\(m.parentType)\")\n                showMIDIObjectType(m.parentType)\n                //                print(\"childName \\(String(describing: getDisplayName(m.child)))\")\n            }\n\n\n            break\n\n        // A device, entity or endpoint was removed. Structure is MIDIObjectAddRemoveNotification.\n        case .msgObjectRemoved:\n            print(\"kMIDIMsgObjectRemoved\")\n            //            let ptr = UnsafeMutablePointer<MIDIObjectAddRemoveNotification>(midiNotification)\n            midiNotification.withMemoryRebound(to: MIDIObjectAddRemoveNotification.self, capacity: 1) {\n\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"child \\(m.child)\")\n                print(\"child type \\(m.childType)\")\n                print(\"parent \\(m.parent)\")\n                print(\"parentType \\(m.parentType)\")\n\n                //                print(\"childName \\(String(describing: getDisplayName(m.child)))\")\n            }\n            break\n\n        // An object's property was changed. Structure is MIDIObjectPropertyChangeNotification.\n        case .msgPropertyChanged:\n            print(\"kMIDIMsgPropertyChanged\")\n            midiNotification.withMemoryRebound(to: MIDIObjectPropertyChangeNotification.self, capacity: 1) {\n\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"object \\(m.object)\")\n                print(\"objectType  \\(m.objectType)\")\n                print(\"propertyName  \\(m.propertyName)\")\n                print(\"propertyName  \\(m.propertyName.takeUnretainedValue())\")\n\n                if m.propertyName.takeUnretainedValue() as String == \"apple.midirtp.session\" {\n                    print(\"connected\")\n                }\n            }\n\n            break\n\n        //     A persistent MIDI Thru connection wasor destroyed.  No data.\n        case .msgThruConnectionsChanged:\n            print(\"MIDI thru connections changed.\")\n            break\n\n        //A persistent MIDI Thru connection was created or destroyed.  No data.\n        case .msgSerialPortOwnerChanged:\n            print(\"MIDI serial port owner changed.\")\n            break\n\n        case .msgIOError:\n            print(\"MIDI I/O error.\")\n\n            //let ptr = UnsafeMutablePointer<MIDIIOErrorNotification>(midiNotification)\n            midiNotification.withMemoryRebound(to: MIDIIOErrorNotification.self, capacity: 1) {\n                let m = $0.pointee\n                print(m)\n                print(\"id \\(m.messageID)\")\n                print(\"size \\(m.messageSize)\")\n                print(\"driverDevice \\(m.driverDevice)\")\n                print(\"errorCode \\(m.errorCode)\")\n            }\n            break\n        @unknown default:\n            break\n        }\n    }\n\n    func showMIDIObjectType(_ ot: MIDIObjectType) {\n        switch ot {\n        case .other:\n            os_log(\"midiObjectType: Other\", log: midiLog, type: .debug)\n            break\n\n        case .device:\n            os_log(\"midiObjectType: Device\", log: midiLog, type: .debug)\n            break\n\n        case .entity:\n            os_log(\"midiObjectType: Entity\", log: midiLog, type: .debug)\n            break\n\n        case .source:\n            os_log(\"midiObjectType: Source\", log: midiLog, type: .debug)\n            break\n\n        case .destination:\n            os_log(\"midiObjectType: Destination\", log: midiLog, type: .debug)\n            break\n\n        case .externalDevice:\n            os_log(\"midiObjectType: ExternalDevice\", log: midiLog, type: .debug)\n            break\n\n        case .externalEntity:\n            print(\"midiObjectType: ExternalEntity\")\n            os_log(\"midiObjectType: ExternalEntity\", log: midiLog, type: .debug)\n            break\n\n        case .externalSource:\n            os_log(\"midiObjectType: ExternalSource\", log: midiLog, type: .debug)\n            break\n\n        case .externalDestination:\n            os_log(\"midiObjectType: ExternalDestination\", log: midiLog, type: .debug)\n            break\n        @unknown default:\n            break\n        }\n\n    }\n\n    #if os(iOS)\n    /// MIDI Network Session\n     @objc func midiNetworkChanged(notification:NSNotification) {\n            print(\"\\(#function)\")\n            print(\"\\(notification)\")\n            if let session = notification.object as? MIDINetworkSession {\n                print(\"session \\(session)\")\n                for con in session.connections() {\n                    print(\"con \\(con)\")\n                }\n                print(\"isEnabled \\(session.isEnabled)\")\n                print(\"sourceEndpoint \\(session.sourceEndpoint())\")\n                print(\"destinationEndpoint \\(session.destinationEndpoint())\")\n                print(\"networkName \\(session.networkName)\")\n                print(\"localName \\(session.localName)\")\n\n                //            if let name = getDeviceName(session.sourceEndpoint()) {\n                //                print(\"source name \\(name)\")\n                //            }\n                //\n                //            if let name = getDeviceName(session.destinationEndpoint()) {\n                //                print(\"destination name \\(name)\")\n                //            }\n            }\n            setupStreamHandler.send(data: \"\\(#function) \\(notification)\")\n        }\n\n    @objc func midiNetworkContactsChanged(notification:NSNotification) {\n        print(\"\\(#function)\")\n        print(\"\\(notification)\")\n        if let session = notification.object as? MIDINetworkSession {\n            print(\"session \\(session)\")\n            for con in session.contacts() {\n                print(\"contact \\(con)\")\n            }\n        }\n        setupStreamHandler.send(data: \"\\(#function) \\(notification)\")\n    }\n    #endif\n\n    /// BLE handling\n\n    // Central\n    public func centralManagerDidUpdateState(_ central: CBCentralManager) {\n        print(\"central did update state \\(central.state.rawValue)\")\n    }\n\n    public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {\n        print(\"central didDiscover \\(peripheral)\")\n        if !discoveredDevices.contains(peripheral) {\n            discoveredDevices.insert(peripheral)\n            setupStreamHandler.send(data: \"deviceFound\")\n        }\n    }\n\n    public func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {\n        print(\"central did connect \\(peripheral)\")\n//        connectedPeripheral = peripheral\n//        peripheral.delegate = self\n//        peripheral.discoverServices([CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")])\n        setupStreamHandler.send(data: \"deviceConnected\")\n        \n        (connectedDevices[peripheral.identifier.uuidString] as! ConnectedBLEDevice).setupBLE()\n    }\n\n    public func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {\n        print(\"central did fail to connect state \\(peripheral)\")\n//        connectingDevice = nil\n        \n        setupStreamHandler.send(data: \"connectionFailed\")\n        connectedDevices.removeValue(forKey: peripheral.identifier.uuidString)\n    }\n\n    public func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {\n        print(\"central didDisconnectPeripheral \\(peripheral)\")\n        \n//        connectedPeripheral = nil\n//        connectedCharacteristic = nil\n        setupStreamHandler.send(data: \"deviceDisconnected\")\n    }    \n}\n\nclass StreamHandler : NSObject, FlutterStreamHandler {\n\n    var sink:FlutterEventSink?\n\n    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {\n        sink = events\n        return nil\n    }\n\n    func onCancel(withArguments arguments: Any?) -> FlutterError? {\n        sink = nil\n        return nil\n    }\n\n    func send(data: Any) {\n        if let sink = sink {\n            sink(data)\n//        } else {\n//            print(\"no sink\")\n        }\n    }\n}\n\nclass Port {\n    var id:Int\n    var type:String\n    \n    init(id:Int, type:String) {\n        self.id = id;\n        self.type = type\n    }\n}\n\nclass ConnectedDevice : NSObject {\n    var id:String\n    var deviceType:String\n    var streamHandler : StreamHandler\n    \n    init(id:String, type:String, streamHandler:StreamHandler) {\n        self.id = id\n        self.deviceType = type\n        self.streamHandler = streamHandler\n    }\n    \n    func openPorts() {}\n    \n    func send(bytes:[UInt8], timestamp: UInt64?) {}\n    \n    func close() {}\n}\n\nclass ConnectedNativeDevice : ConnectedDevice {\n    var outputPort = MIDIPortRef()\n    var inputPort = MIDIPortRef()\n    var client : MIDIClientRef\n    var name : String?\n    var outEndpoint : MIDIEndpointRef?\n    var inSource : MIDIEndpointRef?\n    var entity : MIDIEntityRef?\n    var ports:[Port]?\n    \n    init(id:String, type:String, streamHandler:StreamHandler, client: MIDIClientRef, ports:[Port]?) {\n        self.client = client\n        self.ports = ports\n        let idParts = id.split(separator: \":\")\n        \n        // Store entity and get device/entity name\n        if let deviceId = MIDIDeviceRef(idParts[0]) {\n            if let entityId = Int(idParts[1]) {\n                entity = MIDIDeviceGetEntity(deviceId, entityId)\n                if let e = entity {\n                    let entityName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: e)\n                    \n                    var device:MIDIDeviceRef = 0\n                    MIDIEntityGetDevice(e, &device)\n                    let deviceName = SwiftFlutterMidiCommandPlugin.getMIDIProperty(kMIDIPropertyName, fromObject: device)\n                    \n                    name = \"\\(deviceName) \\(entityName)\"\n                } else {\n                    print(\"no entity\")\n                }\n            } else {\n                print(\"no entityId\")\n            }\n        } else {\n            print(\"no deviceId\")\n        }\n        \n        super.init(id: id, type: type, streamHandler: streamHandler)\n        \n        // MIDI Input with handler\n         MIDIInputPortCreateWithBlock(client, \"FlutterMidiCommand_InPort\" as CFString, &inputPort) { (packetList, srcConnRefCon) in\n             self.handlePacketList(packetList, srcConnRefCon: srcConnRefCon)\n         }\n        \n        // MIDI output\n        MIDIOutputPortCreate(client, \"FlutterMidiCommand_OutPort\" as CFString, &outputPort);\n\n        openPorts()\n    }\n        \n    override func send(bytes: [UInt8], timestamp: UInt64?) {\n        if let ep = outEndpoint {\n            let packetList = UnsafeMutablePointer<MIDIPacketList>.allocate(capacity: 1)\n            var packet = MIDIPacketListInit(packetList)\n            let time = timestamp ?? mach_absolute_time()\n            packet = MIDIPacketListAdd(packetList, 1024, packet, time, bytes.count, bytes)\n\n            let status = MIDISend(outputPort, ep, packetList)\n            //print(\"send bytes \\(bytes) on port \\(outputPort) \\(ep) status \\(status)\")\n            packetList.deallocate()\n        } else {\n            print(\"No MIDI destination for id \\(name!)\")\n        }\n    }\n    \n    override func openPorts() {\n        print(\"open native ports\")\n        \n        if let e = entity {\n\n            if let ps = ports {\n                for port in ps {\n                    inSource = MIDIEntityGetSource(e, port.id)\n\n                    switch port.type {\n                    case \"MidiPortType.IN\":\n                        let status = MIDIPortConnectSource(inputPort, inSource!, &name)\n                        print(\"port open status \\(status)\")\n                    case \"MidiPortType.OUT\":\n                        outEndpoint = MIDIEntityGetDestination(e, port.id)\n    //                    print(\"port endpoint \\(endpoint)\")\n                        break\n                    default:\n                        print(\"unknown port type \\(port.type)\")\n                    }\n                }\n            } else {\n                print(\"open default ports\")\n                inSource = MIDIEntityGetSource(e, 0)\n                let status = MIDIPortConnectSource(inputPort, inSource!, &name)\n                outEndpoint = MIDIEntityGetDestination(e, 0)\n            }\n        }\n    }\n    \n    override func close() {\n        if let oEP = outEndpoint {\n            MIDIEndpointDispose(oEP)\n        }\n        \n        if let iS = inSource {\n            MIDIPortDisconnectSource(inputPort, iS)\n        }\n        \n        MIDIPortDispose(inputPort)\n        MIDIPortDispose(outputPort)\n    }\n    \n    func handlePacketList(_ packetList:UnsafePointer<MIDIPacketList>, srcConnRefCon:UnsafeMutableRawPointer?) {\n        let packets = packetList.pointee\n        let packet:MIDIPacket = packets.packet\n        var ap = UnsafeMutablePointer<MIDIPacket>.allocate(capacity: 1)\n        ap.initialize(to:packet)\n\n        let deviceInfo = [\"name\" : name,\n                          \"id\": String(id),\n                          \"type\":\"native\"]\n        \n        for _ in 0 ..< packets.numPackets {\n            let p = ap.pointee\n            var tmp = p.data\n            let data = Data(bytes: &tmp, count: Int(p.length))\n            let timestamp = p.timeStamp\n//            print(\"data \\(data) timestamp \\(timestamp)\")\n            streamHandler.send(data: [\"data\": data, \"timestamp\":timestamp, \"device\":deviceInfo])\n            ap = MIDIPacketNext(ap)\n        }\n        \n//        ap.deallocate()\n    }\n}\n\nclass ConnectedBLEDevice : ConnectedDevice, CBPeripheralDelegate {\n    var peripheral:CBPeripheral\n    var characteristic:CBCharacteristic?\n    \n    // BLE MIDI parsing\n    enum BLE_HANDLER_STATE\n    {\n        case HEADER\n        case TIMESTAMP\n        case STATUS\n        case STATUS_RUNNING\n        case PARAMS\n        case SYSTEM_RT\n        case SYSEX\n        case SYSEX_END\n        case SYSEX_INT\n    }\n\n    var bleHandlerState = BLE_HANDLER_STATE.HEADER\n\n    var sysExBuffer: [UInt8] = []\n    var timestamp: UInt64 = 0\n    var bleMidiBuffer:[UInt8] = []\n    var bleMidiPacketLength:UInt8 = 0\n    var bleSysExHasFinished = true\n    \n    init(id:String, type:String, streamHandler:StreamHandler, peripheral:CBPeripheral, ports:[Port]?) {\n        self.peripheral = peripheral\n        super.init(id: id, type: type, streamHandler: streamHandler)\n    }\n    \n    func setupBLE() {\n        peripheral.delegate = self\n        peripheral.discoverServices([CBUUID(string: \"03B80E5A-EDE8-4B33-A751-6CE34EC4C700\")])\n    }\n\n    \n    override func close() {\n        CBCentralManager().cancelPeripheralConnection(peripheral)\n        characteristic = nil\n    }\n    \n    override func send(bytes:[UInt8], timestamp: UInt64?) {\n//        print(\"ble send \\(id) \\(bytes)\")\n        if (characteristic != nil) {\n            let packetSize = 20\n            \n            var dataBytes = Data(bytes)\n            \n            if bytes.first == 0xF0 && bytes.last == 0xF7 { //  this is a sysex message, handle carefully\n                if bytes.count > 17 { // Split into multiple messages of 20 bytes total\n                    \n                    \n                    // First packet\n                    var packet = dataBytes.subdata(in: 0..<packetSize-2)\n                    \n                    print(\"count \\(dataBytes.count)\")\n                    \n                    // Insert header(and empty timstamp high) and timestamp low in front Sysex Start\n                    packet.insert(0x80, at: 0)\n                    packet.insert(0x80, at: 0)\n                    \n//                        print(\"packet \\(packet)\")\n//                        print(\"packet \\(hexEncodedString(packet))\")\n                    \n                    peripheral.writeValue(packet, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                    \n                    dataBytes = dataBytes.advanced(by: packetSize-2)\n                    \n                    // More packets\n                    while dataBytes.count > 0 {\n                        \n                        print(\"count \\(dataBytes.count)\")\n                        \n                        let pickCount = min(dataBytes.count, packetSize-1)\n//                            print(\"pickCount \\(pickCount)\")\n                        packet = dataBytes.subdata(in: 0..<pickCount) // Pick bytes for packet\n                        \n                        // Insert header\n                        packet.insert(0x80, at: 0)\n                        \n                        if (packet.count < packetSize) { // Last packet\n                            // Timestamp before Sysex End byte\n                            print(\"insert end\")\n                            packet.insert(0x80, at: packet.count-1)\n                        }\n                        \n//                            print(\"packet \\(hexEncodedString(packet))\")\n                        \n\n                        peripheral.writeValue(packet, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                        \n                        if (dataBytes.count > packetSize-2) {\n                            dataBytes = dataBytes.advanced(by: pickCount) // Advance buffer\n                        }\n                        else {\n                            print(\"done\")\n                            return\n                        }\n                    }\n                } else {\n                    // Insert timestamp low in front of Sysex End-byte\n                    dataBytes.insert(0x80, at: bytes.count-1)\n                    \n                    // Insert header(and empty timstamp high) and timestamp low in front of BLE Midi message\n                    dataBytes.insert(0x80, at: 0)\n                    dataBytes.insert(0x80, at: 0)\n                    \n                    peripheral.writeValue(dataBytes, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n                }\n                return\n            }\n            \n            // Insert header(and empty timstamp high) and timestamp low in front of BLE Midi message\n            dataBytes.insert(0x80, at: 0)\n            dataBytes.insert(0x80, at: 0)\n            \n            peripheral.writeValue(dataBytes, for: characteristic!, type: CBCharacteristicWriteType.withoutResponse)\n        } else {\n            print(\"No peripheral/characteristic in device\")\n        }\n    }\n    \n    public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {\n        print(\"perif didDiscoverServices  \\(String(describing: peripheral.services))\")\n        for service:CBService in peripheral.services! {\n            peripheral.discoverCharacteristics(nil, for: service)\n        }\n    }\n\n    public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {\n        print(\"perif didDiscoverCharacteristicsFor  \\(String(describing: service.characteristics))\")\n        for characteristic:CBCharacteristic in service.characteristics! {\n            if characteristic.uuid.uuidString == \"7772E5DB-3868-4112-A1A9-F2669D106BF3\" {\n                self.characteristic = characteristic\n                peripheral.setNotifyValue(true, for: characteristic)\n                print(\"set up characteristic for device\")\n            }\n        }\n    }\n    \n    func createMessageEvent(_ bytes:[UInt8], timestamp:UInt64, peripheral:CBPeripheral) {\n//        print(\"send rx event \\(bytes)\")\n        let data = Data(bytes: bytes, count: Int(bytes.count))\n        streamHandler.send(data: [\"data\": data, \"timestamp\":timestamp, \"device\":[\n                                                            \"name\" : peripheral.name ?? \"-\",\n                                        \"id\":peripheral.identifier.uuidString,\n                                                                    \"type\":\"BLE\"]])\n    }\n\n    public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {\n//        print(\"perif didUpdateValueFor  \\(String(describing: characteristic))\")\n        if let value = characteristic.value {\n            parseBLEPacket(value, peripheral:peripheral)\n        }\n    }\n    \n    func parseBLEPacket(_ packet:Data, peripheral:CBPeripheral) -> Void {\n//        print(\"parse \\(packet)\")\n        \n        if (packet.count > 1)\n          {\n            // parse BLE message\n            bleHandlerState = BLE_HANDLER_STATE.HEADER\n\n            let header = packet[0]\n            var statusByte:UInt8 = 0\n\n            for i in 1...packet.count-1 {\n                let midiByte:UInt8 = packet[i]\n//              print (\"bleHandlerState \\(bleHandlerState) byte \\(midiByte)\")\n                \n                if ((midiByte & 0x80) == 0x80 && bleHandlerState != BLE_HANDLER_STATE.TIMESTAMP && bleHandlerState != BLE_HANDLER_STATE.SYSEX_INT) {\n                    if (!bleSysExHasFinished) {\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX_INT\n                    } else {\n                        bleHandlerState = BLE_HANDLER_STATE.TIMESTAMP\n                    }\n                } else {\n\n                  // State handling\n                  switch (bleHandlerState)\n                  {\n                  case BLE_HANDLER_STATE.HEADER:\n                    if (!bleSysExHasFinished)\n                    {\n                      if ((midiByte & 0x80) == 0x80)\n                      { // System messages can interrupt ongoing sysex\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX_INT\n                      }\n                      else\n                      {\n                        // Sysex continue\n                        //print(\"sysex continue\")\n                        bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                      }\n                    }\n                    break\n\n                  case BLE_HANDLER_STATE.TIMESTAMP:\n                    if ((midiByte & 0xFF) == 0xF0)\n                    { // Sysex start\n                      bleSysExHasFinished = false\n                        sysExBuffer.removeAll()\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                    }\n                    else if ((midiByte & 0x80) == 0x80)\n                    { // Status/System start\n                      bleHandlerState = BLE_HANDLER_STATE.STATUS\n                    }\n                    else\n                    {\n                      bleHandlerState = BLE_HANDLER_STATE.STATUS_RUNNING\n                    }\n                    break\n\n                  case BLE_HANDLER_STATE.STATUS:\n                      bleHandlerState = BLE_HANDLER_STATE.PARAMS\n                    break\n\n                  case BLE_HANDLER_STATE.STATUS_RUNNING:\n                    bleHandlerState = BLE_HANDLER_STATE.PARAMS\n                    break;\n\n                  case BLE_HANDLER_STATE.PARAMS: // After params can come TSlow or more params\n                    break\n\n                  case BLE_HANDLER_STATE.SYSEX:\n                    break\n\n                  case BLE_HANDLER_STATE.SYSEX_INT:\n                    if ((midiByte & 0xF7) == 0xF7)\n                    { // Sysex end\n//                        print(\"sysex end\")\n                      bleSysExHasFinished = true\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX_END\n                    }\n                    else\n                    {\n                        bleHandlerState = BLE_HANDLER_STATE.SYSTEM_RT\n                    }\n                    break;\n\n                  case BLE_HANDLER_STATE.SYSTEM_RT:\n                    if (!bleSysExHasFinished)\n                    { // Continue incomplete Sysex\n                      bleHandlerState = BLE_HANDLER_STATE.SYSEX\n                    }\n                    break\n\n                  default:\n                    print (\"Unhandled state \\(bleHandlerState)\")\n                    break\n                  }\n                }\n\n//                print (\"\\(bleHandlerState) - \\(midiByte) [\\(String(format:\"%02X\", midiByte))]\")\n\n              // Data handling\n              switch (bleHandlerState)\n              {\n              case BLE_HANDLER_STATE.TIMESTAMP:\n//                print (\"set timestamp\")\n                let tsHigh = header & 0x3f\n                let tsLow = midiByte & 0x7f\n                timestamp = UInt64(tsHigh) << 7 | UInt64(tsLow)\n//                print (\"timestamp is \\(timestamp)\")\n                break\n\n              case BLE_HANDLER_STATE.STATUS:\n\n                bleMidiPacketLength = lengthOfMessageType(midiByte)\n//                print(\"message length \\(bleMidiPacketLength)\")\n                bleMidiBuffer.removeAll()\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == 1 {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral) // TODO Add timestamp\n                } else {\n//                    print (\"set status\")\n                    statusByte = midiByte\n                }\n                break\n\n              case BLE_HANDLER_STATE.STATUS_RUNNING:\n//                print(\"set running status\")\n                bleMidiPacketLength = lengthOfMessageType(statusByte)\n                bleMidiBuffer.removeAll()\n                bleMidiBuffer.append(statusByte)\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == 2 {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral)\n                }\n                break\n\n              case BLE_HANDLER_STATE.PARAMS:\n//                print (\"add param \\(midiByte)\")\n                bleMidiBuffer.append(midiByte)\n                \n                if bleMidiPacketLength == bleMidiBuffer.count {\n                    createMessageEvent(bleMidiBuffer, timestamp: timestamp, peripheral:peripheral)\n                    bleMidiBuffer.removeLast(Int(bleMidiPacketLength)-1) // Remove all but status, which might be used for running msgs\n                }\n                break\n\n              case BLE_HANDLER_STATE.SYSTEM_RT:\n//                print(\"handle RT\")\n                createMessageEvent([midiByte], timestamp: timestamp, peripheral:peripheral)\n                break\n\n              case BLE_HANDLER_STATE.SYSEX:\n//                print(\"add sysex\")\n                sysExBuffer.append(midiByte)\n                break\n\n              case BLE_HANDLER_STATE.SYSEX_INT:\n//                print(\"sysex int\")\n                break\n\n              case BLE_HANDLER_STATE.SYSEX_END:\n//                print(\"finalize sysex\")\n                sysExBuffer.append(midiByte)\n                createMessageEvent(sysExBuffer, timestamp: 0, peripheral:peripheral)\n                break\n\n              default:\n                print (\"Unhandled state (data) \\(bleHandlerState)\")\n                break\n              }\n            }\n          }\n        }\n    \n    func lengthOfMessageType(_ type:UInt8) -> UInt8 {\n        let midiType:UInt8 = type & 0xF0\n        \n        switch (type) {\n            case 0xF6, 0xF8, 0xFA, 0xFB, 0xFC, 0xFF, 0xFE:\n                return 1\n            case 0xF1, 0xF3:\n                    return 2\n            default:\n                break\n        }\n        \n        switch (midiType) {\n            case 0xC0, 0xD0:\n                return 2\n            case 0xF2, 0x80, 0x90, 0xA0, 0xB0, 0xE0:\n                return 3\n            default:\n                break\n        }\n        return 0\n    }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/macos/flutter_midi_command.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint flutter_midi_command.podspec' to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'flutter_midi_command'\n  s.version          = '0.0.1'\n  s.summary          = 'A new flutter plugin project.'\n  s.description      = <<-DESC\nA new flutter plugin project.\n                       DESC\n  s.homepage         = 'https://github.com/InvisibleWrench/FlutterMidiCommand'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Invisible Wrench' => 'hello@invisiblewrench.com' }\n  s.source           = { :path => '.' }\n  s.source_files     = 'Classes/**/*'\n  s.dependency 'FlutterMacOS'\n\n  s.platform = :osx, '10.13'\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }\n  s.swift_version = '5.0'\nend\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/pubspec.yaml",
    "content": "name: flutter_midi_command\ndescription: A Flutter plugin for sending and receiving MIDI messages between Flutter and physical and virtual MIDI devices. Wraps CoreMIDI and android.media.midi in a thin dart/flutter layer.\nversion: 0.3.7\nhomepage: https://github.com/InvisibleWrench/FlutterMidiCommand\npublish_to: none\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n  flutter: \">=1.20.0\"\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n  # This section identifies this Flutter project as a plugin project.\n  # The 'pluginClass' and Android 'package' identifiers should not ordinarily\n  # be modified. They are used by the tooling to maintain consistency when\n  # adding or updating assets for this project.\n  plugin:\n    platforms:\n      android:\n        package: com.invisiblewrench.fluttermidicommand\n        pluginClass: FlutterMidiCommandPlugin\n      ios:\n        pluginClass: FlutterMidiCommandPlugin\n      macos:\n        pluginClass: SwiftFlutterMidiCommandPlugin\n      linux:\n        default_package: flutter_midi_command_linux\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_midi_command_platform_interface:\n    path: ../flutter_midi_command_platform_interface-0.3.3\n  flutter_midi_command_linux: \n    path: ../flutter_midi_command_linux-0.1.3\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n    \n  # To add assets to your plugin package, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  #\n  # For details regarding assets in packages, see\n  # https://flutter.dev/assets-and-images/#from-packages\n  #\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # To add custom fonts to your plugin package, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts in packages, see\n  # https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command-0.3.7/test/flutter_midi_command_test.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  const MethodChannel channel = MethodChannel('fluttermidicommand');\n\n  TestWidgetsFlutterBinding.ensureInitialized();\n\n  setUp(() {\n    channel.setMockMethodCallHandler((MethodCall methodCall) async {\n      return '42';\n    });\n  });\n\n  tearDown(() {\n    channel.setMockMethodCallHandler(null);\n  });\n\n  test('getPlatformVersion', () async {\n//    expect(await MidiCommand.platformVersion, '42');\n  });\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/.gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\npubspec.lock\n\nbuild/\npubspec.lock\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 8b3760638a189741cd9ca881aa2dd237c1df1be5\n  channel: beta\n\nproject_type: plugin\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/.vscode/c_cpp_properties.json",
    "content": "{\n    \"configurations\": [\n        {\n            \"name\": \"Linux\",\n            \"includePath\": [\n                \"${workspaceFolder}/**\"\n            ],\n            \"defines\": [],\n            \"compilerPath\": \"/usr/bin/gcc\",\n            \"cStandard\": \"gnu18\",\n            \"cppStandard\": \"gnu++14\",\n            \"intelliSenseMode\": \"gcc-x64\"\n        }\n    ],\n    \"version\": 4\n}"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/.vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"flutter_midi_command_linux\",\n            \"request\": \"launch\",\n            \"type\": \"dart\"\n        }\n    ]\n}"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/.vscode/settings.json",
    "content": "{\n    \"cmake.configureOnOpen\": true\n}"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/CHANGELOG.md",
    "content": "## 0.1.3\nFixed buffer allocation\n\n## 0.1.2\nIsolate port close\n\n## 0.1.1\nFixed notification on device disconnect\n\n## 0.1.0\nFirst release with linux support\n\n## 0.0.1\nInitial Linux support"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/LICENSE",
    "content": "Copyright 2020 InvisibleWrench. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/README.md",
    "content": "# flutter_midi_command_linux\n\nA new Flutter plugin.\n\n## Getting Started\n\nThis project is a starting point for a Flutter\n[plug-in package](https://flutter.dev/developing-packages/),\na specialized package that includes platform-specific implementation code for\nAndroid and/or iOS.\n\nFor help getting started with Flutter, view our\n[online documentation](https://flutter.dev/docs), which offers tutorials,\nsamples, guidance on mobile development, and a full API reference.\n\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/lib/alsa_generated_bindings.dart",
    "content": "// AUTO GENERATED FILE, DO NOT EDIT.\n//\n// Generated by `package:ffigen`.\nimport 'dart:ffi' as ffi;\n\nclass ALSA {\n  /// Holds the symbol lookup function.\n  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)\n      _lookup;\n\n  /// The symbols are looked up in [dynamicLibrary].\n  ALSA(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup;\n\n  /// The symbols are looked up with [lookup].\n  ALSA.fromLookup(\n      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)\n          lookup)\n      : _lookup = lookup;\n\n  int access(\n    ffi.Pointer<ffi.Int8> __name,\n    int __type,\n  ) {\n    return _access(\n      __name,\n      __type,\n    );\n  }\n\n  late final _access_ptr = _lookup<ffi.NativeFunction<_c_access>>('access');\n  late final _dart_access _access = _access_ptr.asFunction<_dart_access>();\n\n  int faccessat(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __file,\n    int __type,\n    int __flag,\n  ) {\n    return _faccessat(\n      __fd,\n      __file,\n      __type,\n      __flag,\n    );\n  }\n\n  late final _faccessat_ptr =\n      _lookup<ffi.NativeFunction<_c_faccessat>>('faccessat');\n  late final _dart_faccessat _faccessat =\n      _faccessat_ptr.asFunction<_dart_faccessat>();\n\n  int lseek(\n    int __fd,\n    int __offset,\n    int __whence,\n  ) {\n    return _lseek(\n      __fd,\n      __offset,\n      __whence,\n    );\n  }\n\n  late final _lseek_ptr = _lookup<ffi.NativeFunction<_c_lseek>>('lseek');\n  late final _dart_lseek _lseek = _lseek_ptr.asFunction<_dart_lseek>();\n\n  int close(\n    int __fd,\n  ) {\n    return _close(\n      __fd,\n    );\n  }\n\n  late final _close_ptr = _lookup<ffi.NativeFunction<_c_close>>('close');\n  late final _dart_close _close = _close_ptr.asFunction<_dart_close>();\n\n  int read(\n    int __fd,\n    ffi.Pointer<ffi.Void> __buf,\n    int __nbytes,\n  ) {\n    return _read(\n      __fd,\n      __buf,\n      __nbytes,\n    );\n  }\n\n  late final _read_ptr = _lookup<ffi.NativeFunction<_c_read>>('read');\n  late final _dart_read _read = _read_ptr.asFunction<_dart_read>();\n\n  int write(\n    int __fd,\n    ffi.Pointer<ffi.Void> __buf,\n    int __n,\n  ) {\n    return _write(\n      __fd,\n      __buf,\n      __n,\n    );\n  }\n\n  late final _write_ptr = _lookup<ffi.NativeFunction<_c_write>>('write');\n  late final _dart_write _write = _write_ptr.asFunction<_dart_write>();\n\n  int pread(\n    int __fd,\n    ffi.Pointer<ffi.Void> __buf,\n    int __nbytes,\n    int __offset,\n  ) {\n    return _pread(\n      __fd,\n      __buf,\n      __nbytes,\n      __offset,\n    );\n  }\n\n  late final _pread_ptr = _lookup<ffi.NativeFunction<_c_pread>>('pread');\n  late final _dart_pread _pread = _pread_ptr.asFunction<_dart_pread>();\n\n  int pwrite(\n    int __fd,\n    ffi.Pointer<ffi.Void> __buf,\n    int __n,\n    int __offset,\n  ) {\n    return _pwrite(\n      __fd,\n      __buf,\n      __n,\n      __offset,\n    );\n  }\n\n  late final _pwrite_ptr = _lookup<ffi.NativeFunction<_c_pwrite>>('pwrite');\n  late final _dart_pwrite _pwrite = _pwrite_ptr.asFunction<_dart_pwrite>();\n\n  int pipe(\n    ffi.Pointer<ffi.Int32> __pipedes,\n  ) {\n    return _pipe(\n      __pipedes,\n    );\n  }\n\n  late final _pipe_ptr = _lookup<ffi.NativeFunction<_c_pipe>>('pipe');\n  late final _dart_pipe _pipe = _pipe_ptr.asFunction<_dart_pipe>();\n\n  int alarm(\n    int __seconds,\n  ) {\n    return _alarm(\n      __seconds,\n    );\n  }\n\n  late final _alarm_ptr = _lookup<ffi.NativeFunction<_c_alarm>>('alarm');\n  late final _dart_alarm _alarm = _alarm_ptr.asFunction<_dart_alarm>();\n\n  int sleep(\n    int __seconds,\n  ) {\n    return _sleep(\n      __seconds,\n    );\n  }\n\n  late final _sleep_ptr = _lookup<ffi.NativeFunction<_c_sleep>>('sleep');\n  late final _dart_sleep _sleep = _sleep_ptr.asFunction<_dart_sleep>();\n\n  int ualarm(\n    int __value,\n    int __interval,\n  ) {\n    return _ualarm(\n      __value,\n      __interval,\n    );\n  }\n\n  late final _ualarm_ptr = _lookup<ffi.NativeFunction<_c_ualarm>>('ualarm');\n  late final _dart_ualarm _ualarm = _ualarm_ptr.asFunction<_dart_ualarm>();\n\n  int usleep(\n    int __useconds,\n  ) {\n    return _usleep(\n      __useconds,\n    );\n  }\n\n  late final _usleep_ptr = _lookup<ffi.NativeFunction<_c_usleep>>('usleep');\n  late final _dart_usleep _usleep = _usleep_ptr.asFunction<_dart_usleep>();\n\n  int pause() {\n    return _pause();\n  }\n\n  late final _pause_ptr = _lookup<ffi.NativeFunction<_c_pause>>('pause');\n  late final _dart_pause _pause = _pause_ptr.asFunction<_dart_pause>();\n\n  int chown(\n    ffi.Pointer<ffi.Int8> __file,\n    int __owner,\n    int __group,\n  ) {\n    return _chown(\n      __file,\n      __owner,\n      __group,\n    );\n  }\n\n  late final _chown_ptr = _lookup<ffi.NativeFunction<_c_chown>>('chown');\n  late final _dart_chown _chown = _chown_ptr.asFunction<_dart_chown>();\n\n  int fchown(\n    int __fd,\n    int __owner,\n    int __group,\n  ) {\n    return _fchown(\n      __fd,\n      __owner,\n      __group,\n    );\n  }\n\n  late final _fchown_ptr = _lookup<ffi.NativeFunction<_c_fchown>>('fchown');\n  late final _dart_fchown _fchown = _fchown_ptr.asFunction<_dart_fchown>();\n\n  int lchown(\n    ffi.Pointer<ffi.Int8> __file,\n    int __owner,\n    int __group,\n  ) {\n    return _lchown(\n      __file,\n      __owner,\n      __group,\n    );\n  }\n\n  late final _lchown_ptr = _lookup<ffi.NativeFunction<_c_lchown>>('lchown');\n  late final _dart_lchown _lchown = _lchown_ptr.asFunction<_dart_lchown>();\n\n  int fchownat(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __file,\n    int __owner,\n    int __group,\n    int __flag,\n  ) {\n    return _fchownat(\n      __fd,\n      __file,\n      __owner,\n      __group,\n      __flag,\n    );\n  }\n\n  late final _fchownat_ptr =\n      _lookup<ffi.NativeFunction<_c_fchownat>>('fchownat');\n  late final _dart_fchownat _fchownat =\n      _fchownat_ptr.asFunction<_dart_fchownat>();\n\n  int chdir(\n    ffi.Pointer<ffi.Int8> __path,\n  ) {\n    return _chdir(\n      __path,\n    );\n  }\n\n  late final _chdir_ptr = _lookup<ffi.NativeFunction<_c_chdir>>('chdir');\n  late final _dart_chdir _chdir = _chdir_ptr.asFunction<_dart_chdir>();\n\n  int fchdir(\n    int __fd,\n  ) {\n    return _fchdir(\n      __fd,\n    );\n  }\n\n  late final _fchdir_ptr = _lookup<ffi.NativeFunction<_c_fchdir>>('fchdir');\n  late final _dart_fchdir _fchdir = _fchdir_ptr.asFunction<_dart_fchdir>();\n\n  ffi.Pointer<ffi.Int8> getcwd(\n    ffi.Pointer<ffi.Int8> __buf,\n    int __size,\n  ) {\n    return _getcwd(\n      __buf,\n      __size,\n    );\n  }\n\n  late final _getcwd_ptr = _lookup<ffi.NativeFunction<_c_getcwd>>('getcwd');\n  late final _dart_getcwd _getcwd = _getcwd_ptr.asFunction<_dart_getcwd>();\n\n  ffi.Pointer<ffi.Int8> getwd(\n    ffi.Pointer<ffi.Int8> __buf,\n  ) {\n    return _getwd(\n      __buf,\n    );\n  }\n\n  late final _getwd_ptr = _lookup<ffi.NativeFunction<_c_getwd>>('getwd');\n  late final _dart_getwd _getwd = _getwd_ptr.asFunction<_dart_getwd>();\n\n  int dup(\n    int __fd,\n  ) {\n    return _dup(\n      __fd,\n    );\n  }\n\n  late final _dup_ptr = _lookup<ffi.NativeFunction<_c_dup>>('dup');\n  late final _dart_dup _dup = _dup_ptr.asFunction<_dart_dup>();\n\n  int dup2(\n    int __fd,\n    int __fd2,\n  ) {\n    return _dup2(\n      __fd,\n      __fd2,\n    );\n  }\n\n  late final _dup2_ptr = _lookup<ffi.NativeFunction<_c_dup2>>('dup2');\n  late final _dart_dup2 _dup2 = _dup2_ptr.asFunction<_dart_dup2>();\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> ___environ =\n      _lookup<ffi.Pointer<ffi.Pointer<ffi.Int8>>>('__environ');\n\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> get __environ => ___environ.value;\n\n  set __environ(ffi.Pointer<ffi.Pointer<ffi.Int8>> value) =>\n      ___environ.value = value;\n\n  int execve(\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n  ) {\n    return _execve(\n      __path,\n      __argv,\n      __envp,\n    );\n  }\n\n  late final _execve_ptr = _lookup<ffi.NativeFunction<_c_execve>>('execve');\n  late final _dart_execve _execve = _execve_ptr.asFunction<_dart_execve>();\n\n  int fexecve(\n    int __fd,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n  ) {\n    return _fexecve(\n      __fd,\n      __argv,\n      __envp,\n    );\n  }\n\n  late final _fexecve_ptr = _lookup<ffi.NativeFunction<_c_fexecve>>('fexecve');\n  late final _dart_fexecve _fexecve = _fexecve_ptr.asFunction<_dart_fexecve>();\n\n  int execv(\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ) {\n    return _execv(\n      __path,\n      __argv,\n    );\n  }\n\n  late final _execv_ptr = _lookup<ffi.NativeFunction<_c_execv>>('execv');\n  late final _dart_execv _execv = _execv_ptr.asFunction<_dart_execv>();\n\n  int execle(\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Int8> __arg,\n  ) {\n    return _execle(\n      __path,\n      __arg,\n    );\n  }\n\n  late final _execle_ptr = _lookup<ffi.NativeFunction<_c_execle>>('execle');\n  late final _dart_execle _execle = _execle_ptr.asFunction<_dart_execle>();\n\n  int execl(\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Int8> __arg,\n  ) {\n    return _execl(\n      __path,\n      __arg,\n    );\n  }\n\n  late final _execl_ptr = _lookup<ffi.NativeFunction<_c_execl>>('execl');\n  late final _dart_execl _execl = _execl_ptr.asFunction<_dart_execl>();\n\n  int execvp(\n    ffi.Pointer<ffi.Int8> __file,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ) {\n    return _execvp(\n      __file,\n      __argv,\n    );\n  }\n\n  late final _execvp_ptr = _lookup<ffi.NativeFunction<_c_execvp>>('execvp');\n  late final _dart_execvp _execvp = _execvp_ptr.asFunction<_dart_execvp>();\n\n  int execlp(\n    ffi.Pointer<ffi.Int8> __file,\n    ffi.Pointer<ffi.Int8> __arg,\n  ) {\n    return _execlp(\n      __file,\n      __arg,\n    );\n  }\n\n  late final _execlp_ptr = _lookup<ffi.NativeFunction<_c_execlp>>('execlp');\n  late final _dart_execlp _execlp = _execlp_ptr.asFunction<_dart_execlp>();\n\n  int nice(\n    int __inc,\n  ) {\n    return _nice(\n      __inc,\n    );\n  }\n\n  late final _nice_ptr = _lookup<ffi.NativeFunction<_c_nice>>('nice');\n  late final _dart_nice _nice = _nice_ptr.asFunction<_dart_nice>();\n\n  void _exit(\n    int __status,\n  ) {\n    return __exit(\n      __status,\n    );\n  }\n\n  late final __exit_ptr = _lookup<ffi.NativeFunction<_c__exit>>('_exit');\n  late final _dart__exit __exit = __exit_ptr.asFunction<_dart__exit>();\n\n  int pathconf(\n    ffi.Pointer<ffi.Int8> __path,\n    int __name,\n  ) {\n    return _pathconf(\n      __path,\n      __name,\n    );\n  }\n\n  late final _pathconf_ptr =\n      _lookup<ffi.NativeFunction<_c_pathconf>>('pathconf');\n  late final _dart_pathconf _pathconf =\n      _pathconf_ptr.asFunction<_dart_pathconf>();\n\n  int fpathconf(\n    int __fd,\n    int __name,\n  ) {\n    return _fpathconf(\n      __fd,\n      __name,\n    );\n  }\n\n  late final _fpathconf_ptr =\n      _lookup<ffi.NativeFunction<_c_fpathconf>>('fpathconf');\n  late final _dart_fpathconf _fpathconf =\n      _fpathconf_ptr.asFunction<_dart_fpathconf>();\n\n  int sysconf(\n    int __name,\n  ) {\n    return _sysconf(\n      __name,\n    );\n  }\n\n  late final _sysconf_ptr = _lookup<ffi.NativeFunction<_c_sysconf>>('sysconf');\n  late final _dart_sysconf _sysconf = _sysconf_ptr.asFunction<_dart_sysconf>();\n\n  int confstr(\n    int __name,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __len,\n  ) {\n    return _confstr(\n      __name,\n      __buf,\n      __len,\n    );\n  }\n\n  late final _confstr_ptr = _lookup<ffi.NativeFunction<_c_confstr>>('confstr');\n  late final _dart_confstr _confstr = _confstr_ptr.asFunction<_dart_confstr>();\n\n  int getpid() {\n    return _getpid();\n  }\n\n  late final _getpid_ptr = _lookup<ffi.NativeFunction<_c_getpid>>('getpid');\n  late final _dart_getpid _getpid = _getpid_ptr.asFunction<_dart_getpid>();\n\n  int getppid() {\n    return _getppid();\n  }\n\n  late final _getppid_ptr = _lookup<ffi.NativeFunction<_c_getppid>>('getppid');\n  late final _dart_getppid _getppid = _getppid_ptr.asFunction<_dart_getppid>();\n\n  int getpgrp() {\n    return _getpgrp();\n  }\n\n  late final _getpgrp_ptr = _lookup<ffi.NativeFunction<_c_getpgrp>>('getpgrp');\n  late final _dart_getpgrp _getpgrp = _getpgrp_ptr.asFunction<_dart_getpgrp>();\n\n  int __getpgid(\n    int __pid,\n  ) {\n    return ___getpgid(\n      __pid,\n    );\n  }\n\n  late final ___getpgid_ptr =\n      _lookup<ffi.NativeFunction<_c___getpgid>>('__getpgid');\n  late final _dart___getpgid ___getpgid =\n      ___getpgid_ptr.asFunction<_dart___getpgid>();\n\n  int getpgid(\n    int __pid,\n  ) {\n    return _getpgid(\n      __pid,\n    );\n  }\n\n  late final _getpgid_ptr = _lookup<ffi.NativeFunction<_c_getpgid>>('getpgid');\n  late final _dart_getpgid _getpgid = _getpgid_ptr.asFunction<_dart_getpgid>();\n\n  int setpgid(\n    int __pid,\n    int __pgid,\n  ) {\n    return _setpgid(\n      __pid,\n      __pgid,\n    );\n  }\n\n  late final _setpgid_ptr = _lookup<ffi.NativeFunction<_c_setpgid>>('setpgid');\n  late final _dart_setpgid _setpgid = _setpgid_ptr.asFunction<_dart_setpgid>();\n\n  int setpgrp() {\n    return _setpgrp();\n  }\n\n  late final _setpgrp_ptr = _lookup<ffi.NativeFunction<_c_setpgrp>>('setpgrp');\n  late final _dart_setpgrp _setpgrp = _setpgrp_ptr.asFunction<_dart_setpgrp>();\n\n  int setsid() {\n    return _setsid();\n  }\n\n  late final _setsid_ptr = _lookup<ffi.NativeFunction<_c_setsid>>('setsid');\n  late final _dart_setsid _setsid = _setsid_ptr.asFunction<_dart_setsid>();\n\n  int getsid(\n    int __pid,\n  ) {\n    return _getsid(\n      __pid,\n    );\n  }\n\n  late final _getsid_ptr = _lookup<ffi.NativeFunction<_c_getsid>>('getsid');\n  late final _dart_getsid _getsid = _getsid_ptr.asFunction<_dart_getsid>();\n\n  int getuid() {\n    return _getuid();\n  }\n\n  late final _getuid_ptr = _lookup<ffi.NativeFunction<_c_getuid>>('getuid');\n  late final _dart_getuid _getuid = _getuid_ptr.asFunction<_dart_getuid>();\n\n  int geteuid() {\n    return _geteuid();\n  }\n\n  late final _geteuid_ptr = _lookup<ffi.NativeFunction<_c_geteuid>>('geteuid');\n  late final _dart_geteuid _geteuid = _geteuid_ptr.asFunction<_dart_geteuid>();\n\n  int getgid() {\n    return _getgid();\n  }\n\n  late final _getgid_ptr = _lookup<ffi.NativeFunction<_c_getgid>>('getgid');\n  late final _dart_getgid _getgid = _getgid_ptr.asFunction<_dart_getgid>();\n\n  int getegid() {\n    return _getegid();\n  }\n\n  late final _getegid_ptr = _lookup<ffi.NativeFunction<_c_getegid>>('getegid');\n  late final _dart_getegid _getegid = _getegid_ptr.asFunction<_dart_getegid>();\n\n  int getgroups(\n    int __size,\n    ffi.Pointer<ffi.Uint32> __list,\n  ) {\n    return _getgroups(\n      __size,\n      __list,\n    );\n  }\n\n  late final _getgroups_ptr =\n      _lookup<ffi.NativeFunction<_c_getgroups>>('getgroups');\n  late final _dart_getgroups _getgroups =\n      _getgroups_ptr.asFunction<_dart_getgroups>();\n\n  int setuid(\n    int __uid,\n  ) {\n    return _setuid(\n      __uid,\n    );\n  }\n\n  late final _setuid_ptr = _lookup<ffi.NativeFunction<_c_setuid>>('setuid');\n  late final _dart_setuid _setuid = _setuid_ptr.asFunction<_dart_setuid>();\n\n  int setreuid(\n    int __ruid,\n    int __euid,\n  ) {\n    return _setreuid(\n      __ruid,\n      __euid,\n    );\n  }\n\n  late final _setreuid_ptr =\n      _lookup<ffi.NativeFunction<_c_setreuid>>('setreuid');\n  late final _dart_setreuid _setreuid =\n      _setreuid_ptr.asFunction<_dart_setreuid>();\n\n  int seteuid(\n    int __uid,\n  ) {\n    return _seteuid(\n      __uid,\n    );\n  }\n\n  late final _seteuid_ptr = _lookup<ffi.NativeFunction<_c_seteuid>>('seteuid');\n  late final _dart_seteuid _seteuid = _seteuid_ptr.asFunction<_dart_seteuid>();\n\n  int setgid(\n    int __gid,\n  ) {\n    return _setgid(\n      __gid,\n    );\n  }\n\n  late final _setgid_ptr = _lookup<ffi.NativeFunction<_c_setgid>>('setgid');\n  late final _dart_setgid _setgid = _setgid_ptr.asFunction<_dart_setgid>();\n\n  int setregid(\n    int __rgid,\n    int __egid,\n  ) {\n    return _setregid(\n      __rgid,\n      __egid,\n    );\n  }\n\n  late final _setregid_ptr =\n      _lookup<ffi.NativeFunction<_c_setregid>>('setregid');\n  late final _dart_setregid _setregid =\n      _setregid_ptr.asFunction<_dart_setregid>();\n\n  int setegid(\n    int __gid,\n  ) {\n    return _setegid(\n      __gid,\n    );\n  }\n\n  late final _setegid_ptr = _lookup<ffi.NativeFunction<_c_setegid>>('setegid');\n  late final _dart_setegid _setegid = _setegid_ptr.asFunction<_dart_setegid>();\n\n  int fork() {\n    return _fork();\n  }\n\n  late final _fork_ptr = _lookup<ffi.NativeFunction<_c_fork>>('fork');\n  late final _dart_fork _fork = _fork_ptr.asFunction<_dart_fork>();\n\n  int vfork() {\n    return _vfork();\n  }\n\n  late final _vfork_ptr = _lookup<ffi.NativeFunction<_c_vfork>>('vfork');\n  late final _dart_vfork _vfork = _vfork_ptr.asFunction<_dart_vfork>();\n\n  ffi.Pointer<ffi.Int8> ttyname(\n    int __fd,\n  ) {\n    return _ttyname(\n      __fd,\n    );\n  }\n\n  late final _ttyname_ptr = _lookup<ffi.NativeFunction<_c_ttyname>>('ttyname');\n  late final _dart_ttyname _ttyname = _ttyname_ptr.asFunction<_dart_ttyname>();\n\n  int ttyname_r(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __buflen,\n  ) {\n    return _ttyname_r(\n      __fd,\n      __buf,\n      __buflen,\n    );\n  }\n\n  late final _ttyname_r_ptr =\n      _lookup<ffi.NativeFunction<_c_ttyname_r>>('ttyname_r');\n  late final _dart_ttyname_r _ttyname_r =\n      _ttyname_r_ptr.asFunction<_dart_ttyname_r>();\n\n  int isatty(\n    int __fd,\n  ) {\n    return _isatty(\n      __fd,\n    );\n  }\n\n  late final _isatty_ptr = _lookup<ffi.NativeFunction<_c_isatty>>('isatty');\n  late final _dart_isatty _isatty = _isatty_ptr.asFunction<_dart_isatty>();\n\n  int ttyslot() {\n    return _ttyslot();\n  }\n\n  late final _ttyslot_ptr = _lookup<ffi.NativeFunction<_c_ttyslot>>('ttyslot');\n  late final _dart_ttyslot _ttyslot = _ttyslot_ptr.asFunction<_dart_ttyslot>();\n\n  int link(\n    ffi.Pointer<ffi.Int8> __from,\n    ffi.Pointer<ffi.Int8> __to,\n  ) {\n    return _link(\n      __from,\n      __to,\n    );\n  }\n\n  late final _link_ptr = _lookup<ffi.NativeFunction<_c_link>>('link');\n  late final _dart_link _link = _link_ptr.asFunction<_dart_link>();\n\n  int linkat(\n    int __fromfd,\n    ffi.Pointer<ffi.Int8> __from,\n    int __tofd,\n    ffi.Pointer<ffi.Int8> __to,\n    int __flags,\n  ) {\n    return _linkat(\n      __fromfd,\n      __from,\n      __tofd,\n      __to,\n      __flags,\n    );\n  }\n\n  late final _linkat_ptr = _lookup<ffi.NativeFunction<_c_linkat>>('linkat');\n  late final _dart_linkat _linkat = _linkat_ptr.asFunction<_dart_linkat>();\n\n  int symlink(\n    ffi.Pointer<ffi.Int8> __from,\n    ffi.Pointer<ffi.Int8> __to,\n  ) {\n    return _symlink(\n      __from,\n      __to,\n    );\n  }\n\n  late final _symlink_ptr = _lookup<ffi.NativeFunction<_c_symlink>>('symlink');\n  late final _dart_symlink _symlink = _symlink_ptr.asFunction<_dart_symlink>();\n\n  int readlink(\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __len,\n  ) {\n    return _readlink(\n      __path,\n      __buf,\n      __len,\n    );\n  }\n\n  late final _readlink_ptr =\n      _lookup<ffi.NativeFunction<_c_readlink>>('readlink');\n  late final _dart_readlink _readlink =\n      _readlink_ptr.asFunction<_dart_readlink>();\n\n  int symlinkat(\n    ffi.Pointer<ffi.Int8> __from,\n    int __tofd,\n    ffi.Pointer<ffi.Int8> __to,\n  ) {\n    return _symlinkat(\n      __from,\n      __tofd,\n      __to,\n    );\n  }\n\n  late final _symlinkat_ptr =\n      _lookup<ffi.NativeFunction<_c_symlinkat>>('symlinkat');\n  late final _dart_symlinkat _symlinkat =\n      _symlinkat_ptr.asFunction<_dart_symlinkat>();\n\n  int readlinkat(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __path,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __len,\n  ) {\n    return _readlinkat(\n      __fd,\n      __path,\n      __buf,\n      __len,\n    );\n  }\n\n  late final _readlinkat_ptr =\n      _lookup<ffi.NativeFunction<_c_readlinkat>>('readlinkat');\n  late final _dart_readlinkat _readlinkat =\n      _readlinkat_ptr.asFunction<_dart_readlinkat>();\n\n  int unlink(\n    ffi.Pointer<ffi.Int8> __name,\n  ) {\n    return _unlink(\n      __name,\n    );\n  }\n\n  late final _unlink_ptr = _lookup<ffi.NativeFunction<_c_unlink>>('unlink');\n  late final _dart_unlink _unlink = _unlink_ptr.asFunction<_dart_unlink>();\n\n  int unlinkat(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __name,\n    int __flag,\n  ) {\n    return _unlinkat(\n      __fd,\n      __name,\n      __flag,\n    );\n  }\n\n  late final _unlinkat_ptr =\n      _lookup<ffi.NativeFunction<_c_unlinkat>>('unlinkat');\n  late final _dart_unlinkat _unlinkat =\n      _unlinkat_ptr.asFunction<_dart_unlinkat>();\n\n  int rmdir(\n    ffi.Pointer<ffi.Int8> __path,\n  ) {\n    return _rmdir(\n      __path,\n    );\n  }\n\n  late final _rmdir_ptr = _lookup<ffi.NativeFunction<_c_rmdir>>('rmdir');\n  late final _dart_rmdir _rmdir = _rmdir_ptr.asFunction<_dart_rmdir>();\n\n  int tcgetpgrp(\n    int __fd,\n  ) {\n    return _tcgetpgrp(\n      __fd,\n    );\n  }\n\n  late final _tcgetpgrp_ptr =\n      _lookup<ffi.NativeFunction<_c_tcgetpgrp>>('tcgetpgrp');\n  late final _dart_tcgetpgrp _tcgetpgrp =\n      _tcgetpgrp_ptr.asFunction<_dart_tcgetpgrp>();\n\n  int tcsetpgrp(\n    int __fd,\n    int __pgrp_id,\n  ) {\n    return _tcsetpgrp(\n      __fd,\n      __pgrp_id,\n    );\n  }\n\n  late final _tcsetpgrp_ptr =\n      _lookup<ffi.NativeFunction<_c_tcsetpgrp>>('tcsetpgrp');\n  late final _dart_tcsetpgrp _tcsetpgrp =\n      _tcsetpgrp_ptr.asFunction<_dart_tcsetpgrp>();\n\n  ffi.Pointer<ffi.Int8> getlogin() {\n    return _getlogin();\n  }\n\n  late final _getlogin_ptr =\n      _lookup<ffi.NativeFunction<_c_getlogin>>('getlogin');\n  late final _dart_getlogin _getlogin =\n      _getlogin_ptr.asFunction<_dart_getlogin>();\n\n  int getlogin_r(\n    ffi.Pointer<ffi.Int8> __name,\n    int __name_len,\n  ) {\n    return _getlogin_r(\n      __name,\n      __name_len,\n    );\n  }\n\n  late final _getlogin_r_ptr =\n      _lookup<ffi.NativeFunction<_c_getlogin_r>>('getlogin_r');\n  late final _dart_getlogin_r _getlogin_r =\n      _getlogin_r_ptr.asFunction<_dart_getlogin_r>();\n\n  int setlogin(\n    ffi.Pointer<ffi.Int8> __name,\n  ) {\n    return _setlogin(\n      __name,\n    );\n  }\n\n  late final _setlogin_ptr =\n      _lookup<ffi.NativeFunction<_c_setlogin>>('setlogin');\n  late final _dart_setlogin _setlogin =\n      _setlogin_ptr.asFunction<_dart_setlogin>();\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Int8>> _optarg =\n      _lookup<ffi.Pointer<ffi.Int8>>('optarg');\n\n  ffi.Pointer<ffi.Int8> get optarg => _optarg.value;\n\n  set optarg(ffi.Pointer<ffi.Int8> value) => _optarg.value = value;\n\n  late final ffi.Pointer<ffi.Int32> _optind = _lookup<ffi.Int32>('optind');\n\n  int get optind => _optind.value;\n\n  set optind(int value) => _optind.value = value;\n\n  late final ffi.Pointer<ffi.Int32> _opterr = _lookup<ffi.Int32>('opterr');\n\n  int get opterr => _opterr.value;\n\n  set opterr(int value) => _opterr.value = value;\n\n  late final ffi.Pointer<ffi.Int32> _optopt = _lookup<ffi.Int32>('optopt');\n\n  int get optopt => _optopt.value;\n\n  set optopt(int value) => _optopt.value = value;\n\n  int getopt(\n    int ___argc,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> ___argv,\n    ffi.Pointer<ffi.Int8> __shortopts,\n  ) {\n    return _getopt(\n      ___argc,\n      ___argv,\n      __shortopts,\n    );\n  }\n\n  late final _getopt_ptr = _lookup<ffi.NativeFunction<_c_getopt>>('getopt');\n  late final _dart_getopt _getopt = _getopt_ptr.asFunction<_dart_getopt>();\n\n  int gethostname(\n    ffi.Pointer<ffi.Int8> __name,\n    int __len,\n  ) {\n    return _gethostname(\n      __name,\n      __len,\n    );\n  }\n\n  late final _gethostname_ptr =\n      _lookup<ffi.NativeFunction<_c_gethostname>>('gethostname');\n  late final _dart_gethostname _gethostname =\n      _gethostname_ptr.asFunction<_dart_gethostname>();\n\n  int sethostname(\n    ffi.Pointer<ffi.Int8> __name,\n    int __len,\n  ) {\n    return _sethostname(\n      __name,\n      __len,\n    );\n  }\n\n  late final _sethostname_ptr =\n      _lookup<ffi.NativeFunction<_c_sethostname>>('sethostname');\n  late final _dart_sethostname _sethostname =\n      _sethostname_ptr.asFunction<_dart_sethostname>();\n\n  int sethostid(\n    int __id,\n  ) {\n    return _sethostid(\n      __id,\n    );\n  }\n\n  late final _sethostid_ptr =\n      _lookup<ffi.NativeFunction<_c_sethostid>>('sethostid');\n  late final _dart_sethostid _sethostid =\n      _sethostid_ptr.asFunction<_dart_sethostid>();\n\n  int getdomainname(\n    ffi.Pointer<ffi.Int8> __name,\n    int __len,\n  ) {\n    return _getdomainname(\n      __name,\n      __len,\n    );\n  }\n\n  late final _getdomainname_ptr =\n      _lookup<ffi.NativeFunction<_c_getdomainname>>('getdomainname');\n  late final _dart_getdomainname _getdomainname =\n      _getdomainname_ptr.asFunction<_dart_getdomainname>();\n\n  int setdomainname(\n    ffi.Pointer<ffi.Int8> __name,\n    int __len,\n  ) {\n    return _setdomainname(\n      __name,\n      __len,\n    );\n  }\n\n  late final _setdomainname_ptr =\n      _lookup<ffi.NativeFunction<_c_setdomainname>>('setdomainname');\n  late final _dart_setdomainname _setdomainname =\n      _setdomainname_ptr.asFunction<_dart_setdomainname>();\n\n  int vhangup() {\n    return _vhangup();\n  }\n\n  late final _vhangup_ptr = _lookup<ffi.NativeFunction<_c_vhangup>>('vhangup');\n  late final _dart_vhangup _vhangup = _vhangup_ptr.asFunction<_dart_vhangup>();\n\n  int revoke(\n    ffi.Pointer<ffi.Int8> __file,\n  ) {\n    return _revoke(\n      __file,\n    );\n  }\n\n  late final _revoke_ptr = _lookup<ffi.NativeFunction<_c_revoke>>('revoke');\n  late final _dart_revoke _revoke = _revoke_ptr.asFunction<_dart_revoke>();\n\n  int profil(\n    ffi.Pointer<ffi.Uint16> __sample_buffer,\n    int __size,\n    int __offset,\n    int __scale,\n  ) {\n    return _profil(\n      __sample_buffer,\n      __size,\n      __offset,\n      __scale,\n    );\n  }\n\n  late final _profil_ptr = _lookup<ffi.NativeFunction<_c_profil>>('profil');\n  late final _dart_profil _profil = _profil_ptr.asFunction<_dart_profil>();\n\n  int acct(\n    ffi.Pointer<ffi.Int8> __name,\n  ) {\n    return _acct(\n      __name,\n    );\n  }\n\n  late final _acct_ptr = _lookup<ffi.NativeFunction<_c_acct>>('acct');\n  late final _dart_acct _acct = _acct_ptr.asFunction<_dart_acct>();\n\n  ffi.Pointer<ffi.Int8> getusershell() {\n    return _getusershell();\n  }\n\n  late final _getusershell_ptr =\n      _lookup<ffi.NativeFunction<_c_getusershell>>('getusershell');\n  late final _dart_getusershell _getusershell =\n      _getusershell_ptr.asFunction<_dart_getusershell>();\n\n  void endusershell() {\n    return _endusershell();\n  }\n\n  late final _endusershell_ptr =\n      _lookup<ffi.NativeFunction<_c_endusershell>>('endusershell');\n  late final _dart_endusershell _endusershell =\n      _endusershell_ptr.asFunction<_dart_endusershell>();\n\n  void setusershell() {\n    return _setusershell();\n  }\n\n  late final _setusershell_ptr =\n      _lookup<ffi.NativeFunction<_c_setusershell>>('setusershell');\n  late final _dart_setusershell _setusershell =\n      _setusershell_ptr.asFunction<_dart_setusershell>();\n\n  int daemon(\n    int __nochdir,\n    int __noclose,\n  ) {\n    return _daemon(\n      __nochdir,\n      __noclose,\n    );\n  }\n\n  late final _daemon_ptr = _lookup<ffi.NativeFunction<_c_daemon>>('daemon');\n  late final _dart_daemon _daemon = _daemon_ptr.asFunction<_dart_daemon>();\n\n  int chroot(\n    ffi.Pointer<ffi.Int8> __path,\n  ) {\n    return _chroot(\n      __path,\n    );\n  }\n\n  late final _chroot_ptr = _lookup<ffi.NativeFunction<_c_chroot>>('chroot');\n  late final _dart_chroot _chroot = _chroot_ptr.asFunction<_dart_chroot>();\n\n  ffi.Pointer<ffi.Int8> getpass(\n    ffi.Pointer<ffi.Int8> __prompt,\n  ) {\n    return _getpass(\n      __prompt,\n    );\n  }\n\n  late final _getpass_ptr = _lookup<ffi.NativeFunction<_c_getpass>>('getpass');\n  late final _dart_getpass _getpass = _getpass_ptr.asFunction<_dart_getpass>();\n\n  int fsync(\n    int __fd,\n  ) {\n    return _fsync(\n      __fd,\n    );\n  }\n\n  late final _fsync_ptr = _lookup<ffi.NativeFunction<_c_fsync>>('fsync');\n  late final _dart_fsync _fsync = _fsync_ptr.asFunction<_dart_fsync>();\n\n  int gethostid() {\n    return _gethostid();\n  }\n\n  late final _gethostid_ptr =\n      _lookup<ffi.NativeFunction<_c_gethostid>>('gethostid');\n  late final _dart_gethostid _gethostid =\n      _gethostid_ptr.asFunction<_dart_gethostid>();\n\n  void sync_1() {\n    return _sync_1();\n  }\n\n  late final _sync_1_ptr = _lookup<ffi.NativeFunction<_c_sync_1>>('sync');\n  late final _dart_sync_1 _sync_1 = _sync_1_ptr.asFunction<_dart_sync_1>();\n\n  int getpagesize() {\n    return _getpagesize();\n  }\n\n  late final _getpagesize_ptr =\n      _lookup<ffi.NativeFunction<_c_getpagesize>>('getpagesize');\n  late final _dart_getpagesize _getpagesize =\n      _getpagesize_ptr.asFunction<_dart_getpagesize>();\n\n  int getdtablesize() {\n    return _getdtablesize();\n  }\n\n  late final _getdtablesize_ptr =\n      _lookup<ffi.NativeFunction<_c_getdtablesize>>('getdtablesize');\n  late final _dart_getdtablesize _getdtablesize =\n      _getdtablesize_ptr.asFunction<_dart_getdtablesize>();\n\n  int truncate(\n    ffi.Pointer<ffi.Int8> __file,\n    int __length,\n  ) {\n    return _truncate(\n      __file,\n      __length,\n    );\n  }\n\n  late final _truncate_ptr =\n      _lookup<ffi.NativeFunction<_c_truncate>>('truncate');\n  late final _dart_truncate _truncate =\n      _truncate_ptr.asFunction<_dart_truncate>();\n\n  int ftruncate(\n    int __fd,\n    int __length,\n  ) {\n    return _ftruncate(\n      __fd,\n      __length,\n    );\n  }\n\n  late final _ftruncate_ptr =\n      _lookup<ffi.NativeFunction<_c_ftruncate>>('ftruncate');\n  late final _dart_ftruncate _ftruncate =\n      _ftruncate_ptr.asFunction<_dart_ftruncate>();\n\n  int brk(\n    ffi.Pointer<ffi.Void> __addr,\n  ) {\n    return _brk(\n      __addr,\n    );\n  }\n\n  late final _brk_ptr = _lookup<ffi.NativeFunction<_c_brk>>('brk');\n  late final _dart_brk _brk = _brk_ptr.asFunction<_dart_brk>();\n\n  ffi.Pointer<ffi.Void> sbrk(\n    int __delta,\n  ) {\n    return _sbrk(\n      __delta,\n    );\n  }\n\n  late final _sbrk_ptr = _lookup<ffi.NativeFunction<_c_sbrk>>('sbrk');\n  late final _dart_sbrk _sbrk = _sbrk_ptr.asFunction<_dart_sbrk>();\n\n  int syscall(\n    int __sysno,\n  ) {\n    return _syscall(\n      __sysno,\n    );\n  }\n\n  late final _syscall_ptr = _lookup<ffi.NativeFunction<_c_syscall>>('syscall');\n  late final _dart_syscall _syscall = _syscall_ptr.asFunction<_dart_syscall>();\n\n  int lockf(\n    int __fd,\n    int __cmd,\n    int __len,\n  ) {\n    return _lockf(\n      __fd,\n      __cmd,\n      __len,\n    );\n  }\n\n  late final _lockf_ptr = _lookup<ffi.NativeFunction<_c_lockf>>('lockf');\n  late final _dart_lockf _lockf = _lockf_ptr.asFunction<_dart_lockf>();\n\n  int fdatasync(\n    int __fildes,\n  ) {\n    return _fdatasync(\n      __fildes,\n    );\n  }\n\n  late final _fdatasync_ptr =\n      _lookup<ffi.NativeFunction<_c_fdatasync>>('fdatasync');\n  late final _dart_fdatasync _fdatasync =\n      _fdatasync_ptr.asFunction<_dart_fdatasync>();\n\n  ffi.Pointer<ffi.Int8> crypt(\n    ffi.Pointer<ffi.Int8> __key,\n    ffi.Pointer<ffi.Int8> __salt,\n  ) {\n    return _crypt(\n      __key,\n      __salt,\n    );\n  }\n\n  late final _crypt_ptr = _lookup<ffi.NativeFunction<_c_crypt>>('crypt');\n  late final _dart_crypt _crypt = _crypt_ptr.asFunction<_dart_crypt>();\n\n  int getentropy(\n    ffi.Pointer<ffi.Void> __buffer,\n    int __length,\n  ) {\n    return _getentropy(\n      __buffer,\n      __length,\n    );\n  }\n\n  late final _getentropy_ptr =\n      _lookup<ffi.NativeFunction<_c_getentropy>>('getentropy');\n  late final _dart_getentropy _getentropy =\n      _getentropy_ptr.asFunction<_dart_getentropy>();\n\n  late final ffi.Pointer<ffi.Pointer<IO_FILE_>> _stdin =\n      _lookup<ffi.Pointer<IO_FILE_>>('stdin');\n\n  ffi.Pointer<IO_FILE_> get stdin => _stdin.value;\n\n  set stdin(ffi.Pointer<IO_FILE_> value) => _stdin.value = value;\n\n  late final ffi.Pointer<ffi.Pointer<IO_FILE_>> _stdout =\n      _lookup<ffi.Pointer<IO_FILE_>>('stdout');\n\n  ffi.Pointer<IO_FILE_> get stdout => _stdout.value;\n\n  set stdout(ffi.Pointer<IO_FILE_> value) => _stdout.value = value;\n\n  late final ffi.Pointer<ffi.Pointer<IO_FILE_>> _stderr =\n      _lookup<ffi.Pointer<IO_FILE_>>('stderr');\n\n  ffi.Pointer<IO_FILE_> get stderr => _stderr.value;\n\n  set stderr(ffi.Pointer<IO_FILE_> value) => _stderr.value = value;\n\n  int remove(\n    ffi.Pointer<ffi.Int8> __filename,\n  ) {\n    return _remove(\n      __filename,\n    );\n  }\n\n  late final _remove_ptr = _lookup<ffi.NativeFunction<_c_remove>>('remove');\n  late final _dart_remove _remove = _remove_ptr.asFunction<_dart_remove>();\n\n  int rename(\n    ffi.Pointer<ffi.Int8> __old,\n    ffi.Pointer<ffi.Int8> __new,\n  ) {\n    return _rename(\n      __old,\n      __new,\n    );\n  }\n\n  late final _rename_ptr = _lookup<ffi.NativeFunction<_c_rename>>('rename');\n  late final _dart_rename _rename = _rename_ptr.asFunction<_dart_rename>();\n\n  int renameat(\n    int __oldfd,\n    ffi.Pointer<ffi.Int8> __old,\n    int __newfd,\n    ffi.Pointer<ffi.Int8> __new,\n  ) {\n    return _renameat(\n      __oldfd,\n      __old,\n      __newfd,\n      __new,\n    );\n  }\n\n  late final _renameat_ptr =\n      _lookup<ffi.NativeFunction<_c_renameat>>('renameat');\n  late final _dart_renameat _renameat =\n      _renameat_ptr.asFunction<_dart_renameat>();\n\n  ffi.Pointer<IO_FILE_> tmpfile() {\n    return _tmpfile();\n  }\n\n  late final _tmpfile_ptr = _lookup<ffi.NativeFunction<_c_tmpfile>>('tmpfile');\n  late final _dart_tmpfile _tmpfile = _tmpfile_ptr.asFunction<_dart_tmpfile>();\n\n  ffi.Pointer<ffi.Int8> tmpnam(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _tmpnam(\n      __s,\n    );\n  }\n\n  late final _tmpnam_ptr = _lookup<ffi.NativeFunction<_c_tmpnam>>('tmpnam');\n  late final _dart_tmpnam _tmpnam = _tmpnam_ptr.asFunction<_dart_tmpnam>();\n\n  ffi.Pointer<ffi.Int8> tmpnam_r(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _tmpnam_r(\n      __s,\n    );\n  }\n\n  late final _tmpnam_r_ptr =\n      _lookup<ffi.NativeFunction<_c_tmpnam_r>>('tmpnam_r');\n  late final _dart_tmpnam_r _tmpnam_r =\n      _tmpnam_r_ptr.asFunction<_dart_tmpnam_r>();\n\n  ffi.Pointer<ffi.Int8> tempnam(\n    ffi.Pointer<ffi.Int8> __dir,\n    ffi.Pointer<ffi.Int8> __pfx,\n  ) {\n    return _tempnam(\n      __dir,\n      __pfx,\n    );\n  }\n\n  late final _tempnam_ptr = _lookup<ffi.NativeFunction<_c_tempnam>>('tempnam');\n  late final _dart_tempnam _tempnam = _tempnam_ptr.asFunction<_dart_tempnam>();\n\n  int fclose(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fclose(\n      __stream,\n    );\n  }\n\n  late final _fclose_ptr = _lookup<ffi.NativeFunction<_c_fclose>>('fclose');\n  late final _dart_fclose _fclose = _fclose_ptr.asFunction<_dart_fclose>();\n\n  int fflush(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fflush(\n      __stream,\n    );\n  }\n\n  late final _fflush_ptr = _lookup<ffi.NativeFunction<_c_fflush>>('fflush');\n  late final _dart_fflush _fflush = _fflush_ptr.asFunction<_dart_fflush>();\n\n  int fflush_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fflush_unlocked(\n      __stream,\n    );\n  }\n\n  late final _fflush_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fflush_unlocked>>('fflush_unlocked');\n  late final _dart_fflush_unlocked _fflush_unlocked =\n      _fflush_unlocked_ptr.asFunction<_dart_fflush_unlocked>();\n\n  ffi.Pointer<IO_FILE_> fopen(\n    ffi.Pointer<ffi.Int8> __filename,\n    ffi.Pointer<ffi.Int8> __modes,\n  ) {\n    return _fopen(\n      __filename,\n      __modes,\n    );\n  }\n\n  late final _fopen_ptr = _lookup<ffi.NativeFunction<_c_fopen>>('fopen');\n  late final _dart_fopen _fopen = _fopen_ptr.asFunction<_dart_fopen>();\n\n  ffi.Pointer<IO_FILE_> freopen(\n    ffi.Pointer<ffi.Int8> __filename,\n    ffi.Pointer<ffi.Int8> __modes,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _freopen(\n      __filename,\n      __modes,\n      __stream,\n    );\n  }\n\n  late final _freopen_ptr = _lookup<ffi.NativeFunction<_c_freopen>>('freopen');\n  late final _dart_freopen _freopen = _freopen_ptr.asFunction<_dart_freopen>();\n\n  ffi.Pointer<IO_FILE_> fdopen(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __modes,\n  ) {\n    return _fdopen(\n      __fd,\n      __modes,\n    );\n  }\n\n  late final _fdopen_ptr = _lookup<ffi.NativeFunction<_c_fdopen>>('fdopen');\n  late final _dart_fdopen _fdopen = _fdopen_ptr.asFunction<_dart_fdopen>();\n\n  ffi.Pointer<IO_FILE_> fmemopen(\n    ffi.Pointer<ffi.Void> __s,\n    int __len,\n    ffi.Pointer<ffi.Int8> __modes,\n  ) {\n    return _fmemopen(\n      __s,\n      __len,\n      __modes,\n    );\n  }\n\n  late final _fmemopen_ptr =\n      _lookup<ffi.NativeFunction<_c_fmemopen>>('fmemopen');\n  late final _dart_fmemopen _fmemopen =\n      _fmemopen_ptr.asFunction<_dart_fmemopen>();\n\n  ffi.Pointer<IO_FILE_> open_memstream(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __bufloc,\n    ffi.Pointer<ffi.Uint64> __sizeloc,\n  ) {\n    return _open_memstream(\n      __bufloc,\n      __sizeloc,\n    );\n  }\n\n  late final _open_memstream_ptr =\n      _lookup<ffi.NativeFunction<_c_open_memstream>>('open_memstream');\n  late final _dart_open_memstream _open_memstream =\n      _open_memstream_ptr.asFunction<_dart_open_memstream>();\n\n  void setbuf(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<ffi.Int8> __buf,\n  ) {\n    return _setbuf(\n      __stream,\n      __buf,\n    );\n  }\n\n  late final _setbuf_ptr = _lookup<ffi.NativeFunction<_c_setbuf>>('setbuf');\n  late final _dart_setbuf _setbuf = _setbuf_ptr.asFunction<_dart_setbuf>();\n\n  int setvbuf(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __modes,\n    int __n,\n  ) {\n    return _setvbuf(\n      __stream,\n      __buf,\n      __modes,\n      __n,\n    );\n  }\n\n  late final _setvbuf_ptr = _lookup<ffi.NativeFunction<_c_setvbuf>>('setvbuf');\n  late final _dart_setvbuf _setvbuf = _setvbuf_ptr.asFunction<_dart_setvbuf>();\n\n  void setbuffer(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __size,\n  ) {\n    return _setbuffer(\n      __stream,\n      __buf,\n      __size,\n    );\n  }\n\n  late final _setbuffer_ptr =\n      _lookup<ffi.NativeFunction<_c_setbuffer>>('setbuffer');\n  late final _dart_setbuffer _setbuffer =\n      _setbuffer_ptr.asFunction<_dart_setbuffer>();\n\n  void setlinebuf(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _setlinebuf(\n      __stream,\n    );\n  }\n\n  late final _setlinebuf_ptr =\n      _lookup<ffi.NativeFunction<_c_setlinebuf>>('setlinebuf');\n  late final _dart_setlinebuf _setlinebuf =\n      _setlinebuf_ptr.asFunction<_dart_setlinebuf>();\n\n  int fprintf(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _fprintf(\n      __stream,\n      __format,\n    );\n  }\n\n  late final _fprintf_ptr = _lookup<ffi.NativeFunction<_c_fprintf>>('fprintf');\n  late final _dart_fprintf _fprintf = _fprintf_ptr.asFunction<_dart_fprintf>();\n\n  int printf(\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _printf(\n      __format,\n    );\n  }\n\n  late final _printf_ptr = _lookup<ffi.NativeFunction<_c_printf>>('printf');\n  late final _dart_printf _printf = _printf_ptr.asFunction<_dart_printf>();\n\n  int sprintf(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _sprintf(\n      __s,\n      __format,\n    );\n  }\n\n  late final _sprintf_ptr = _lookup<ffi.NativeFunction<_c_sprintf>>('sprintf');\n  late final _dart_sprintf _sprintf = _sprintf_ptr.asFunction<_dart_sprintf>();\n\n  int vfprintf(\n    ffi.Pointer<IO_FILE_> __s,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vfprintf(\n      __s,\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vfprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_vfprintf>>('vfprintf');\n  late final _dart_vfprintf _vfprintf =\n      _vfprintf_ptr.asFunction<_dart_vfprintf>();\n\n  int vprintf(\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vprintf(\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vprintf_ptr = _lookup<ffi.NativeFunction<_c_vprintf>>('vprintf');\n  late final _dart_vprintf _vprintf = _vprintf_ptr.asFunction<_dart_vprintf>();\n\n  int vsprintf(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vsprintf(\n      __s,\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vsprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_vsprintf>>('vsprintf');\n  late final _dart_vsprintf _vsprintf =\n      _vsprintf_ptr.asFunction<_dart_vsprintf>();\n\n  int snprintf(\n    ffi.Pointer<ffi.Int8> __s,\n    int __maxlen,\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _snprintf(\n      __s,\n      __maxlen,\n      __format,\n    );\n  }\n\n  late final _snprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_snprintf>>('snprintf');\n  late final _dart_snprintf _snprintf =\n      _snprintf_ptr.asFunction<_dart_snprintf>();\n\n  int vsnprintf(\n    ffi.Pointer<ffi.Int8> __s,\n    int __maxlen,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vsnprintf(\n      __s,\n      __maxlen,\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vsnprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_vsnprintf>>('vsnprintf');\n  late final _dart_vsnprintf _vsnprintf =\n      _vsnprintf_ptr.asFunction<_dart_vsnprintf>();\n\n  int vdprintf(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __fmt,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vdprintf(\n      __fd,\n      __fmt,\n      __arg,\n    );\n  }\n\n  late final _vdprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_vdprintf>>('vdprintf');\n  late final _dart_vdprintf _vdprintf =\n      _vdprintf_ptr.asFunction<_dart_vdprintf>();\n\n  int dprintf(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __fmt,\n  ) {\n    return _dprintf(\n      __fd,\n      __fmt,\n    );\n  }\n\n  late final _dprintf_ptr = _lookup<ffi.NativeFunction<_c_dprintf>>('dprintf');\n  late final _dart_dprintf _dprintf = _dprintf_ptr.asFunction<_dart_dprintf>();\n\n  int fscanf(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _fscanf(\n      __stream,\n      __format,\n    );\n  }\n\n  late final _fscanf_ptr = _lookup<ffi.NativeFunction<_c_fscanf>>('fscanf');\n  late final _dart_fscanf _fscanf = _fscanf_ptr.asFunction<_dart_fscanf>();\n\n  int scanf(\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _scanf(\n      __format,\n    );\n  }\n\n  late final _scanf_ptr = _lookup<ffi.NativeFunction<_c_scanf>>('scanf');\n  late final _dart_scanf _scanf = _scanf_ptr.asFunction<_dart_scanf>();\n\n  int sscanf(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __format,\n  ) {\n    return _sscanf(\n      __s,\n      __format,\n    );\n  }\n\n  late final _sscanf_ptr = _lookup<ffi.NativeFunction<_c_sscanf>>('sscanf');\n  late final _dart_sscanf _sscanf = _sscanf_ptr.asFunction<_dart_sscanf>();\n\n  int vfscanf(\n    ffi.Pointer<IO_FILE_> __s,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vfscanf(\n      __s,\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vfscanf_ptr = _lookup<ffi.NativeFunction<_c_vfscanf>>('vfscanf');\n  late final _dart_vfscanf _vfscanf = _vfscanf_ptr.asFunction<_dart_vfscanf>();\n\n  int vscanf(\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vscanf(\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vscanf_ptr = _lookup<ffi.NativeFunction<_c_vscanf>>('vscanf');\n  late final _dart_vscanf _vscanf = _vscanf_ptr.asFunction<_dart_vscanf>();\n\n  int vsscanf(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<_va_list_tag_> __arg,\n  ) {\n    return _vsscanf(\n      __s,\n      __format,\n      __arg,\n    );\n  }\n\n  late final _vsscanf_ptr = _lookup<ffi.NativeFunction<_c_vsscanf>>('vsscanf');\n  late final _dart_vsscanf _vsscanf = _vsscanf_ptr.asFunction<_dart_vsscanf>();\n\n  int fgetc(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fgetc(\n      __stream,\n    );\n  }\n\n  late final _fgetc_ptr = _lookup<ffi.NativeFunction<_c_fgetc>>('fgetc');\n  late final _dart_fgetc _fgetc = _fgetc_ptr.asFunction<_dart_fgetc>();\n\n  int getc(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _getc(\n      __stream,\n    );\n  }\n\n  late final _getc_ptr = _lookup<ffi.NativeFunction<_c_getc>>('getc');\n  late final _dart_getc _getc = _getc_ptr.asFunction<_dart_getc>();\n\n  int getchar() {\n    return _getchar();\n  }\n\n  late final _getchar_ptr = _lookup<ffi.NativeFunction<_c_getchar>>('getchar');\n  late final _dart_getchar _getchar = _getchar_ptr.asFunction<_dart_getchar>();\n\n  int getc_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _getc_unlocked(\n      __stream,\n    );\n  }\n\n  late final _getc_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_getc_unlocked>>('getc_unlocked');\n  late final _dart_getc_unlocked _getc_unlocked =\n      _getc_unlocked_ptr.asFunction<_dart_getc_unlocked>();\n\n  int getchar_unlocked() {\n    return _getchar_unlocked();\n  }\n\n  late final _getchar_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_getchar_unlocked>>('getchar_unlocked');\n  late final _dart_getchar_unlocked _getchar_unlocked =\n      _getchar_unlocked_ptr.asFunction<_dart_getchar_unlocked>();\n\n  int fgetc_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fgetc_unlocked(\n      __stream,\n    );\n  }\n\n  late final _fgetc_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fgetc_unlocked>>('fgetc_unlocked');\n  late final _dart_fgetc_unlocked _fgetc_unlocked =\n      _fgetc_unlocked_ptr.asFunction<_dart_fgetc_unlocked>();\n\n  int fputc(\n    int __c,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fputc(\n      __c,\n      __stream,\n    );\n  }\n\n  late final _fputc_ptr = _lookup<ffi.NativeFunction<_c_fputc>>('fputc');\n  late final _dart_fputc _fputc = _fputc_ptr.asFunction<_dart_fputc>();\n\n  int putc(\n    int __c,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _putc(\n      __c,\n      __stream,\n    );\n  }\n\n  late final _putc_ptr = _lookup<ffi.NativeFunction<_c_putc>>('putc');\n  late final _dart_putc _putc = _putc_ptr.asFunction<_dart_putc>();\n\n  int putchar(\n    int __c,\n  ) {\n    return _putchar(\n      __c,\n    );\n  }\n\n  late final _putchar_ptr = _lookup<ffi.NativeFunction<_c_putchar>>('putchar');\n  late final _dart_putchar _putchar = _putchar_ptr.asFunction<_dart_putchar>();\n\n  int fputc_unlocked(\n    int __c,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fputc_unlocked(\n      __c,\n      __stream,\n    );\n  }\n\n  late final _fputc_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fputc_unlocked>>('fputc_unlocked');\n  late final _dart_fputc_unlocked _fputc_unlocked =\n      _fputc_unlocked_ptr.asFunction<_dart_fputc_unlocked>();\n\n  int putc_unlocked(\n    int __c,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _putc_unlocked(\n      __c,\n      __stream,\n    );\n  }\n\n  late final _putc_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_putc_unlocked>>('putc_unlocked');\n  late final _dart_putc_unlocked _putc_unlocked =\n      _putc_unlocked_ptr.asFunction<_dart_putc_unlocked>();\n\n  int putchar_unlocked(\n    int __c,\n  ) {\n    return _putchar_unlocked(\n      __c,\n    );\n  }\n\n  late final _putchar_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_putchar_unlocked>>('putchar_unlocked');\n  late final _dart_putchar_unlocked _putchar_unlocked =\n      _putchar_unlocked_ptr.asFunction<_dart_putchar_unlocked>();\n\n  int getw(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _getw(\n      __stream,\n    );\n  }\n\n  late final _getw_ptr = _lookup<ffi.NativeFunction<_c_getw>>('getw');\n  late final _dart_getw _getw = _getw_ptr.asFunction<_dart_getw>();\n\n  int putw(\n    int __w,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _putw(\n      __w,\n      __stream,\n    );\n  }\n\n  late final _putw_ptr = _lookup<ffi.NativeFunction<_c_putw>>('putw');\n  late final _dart_putw _putw = _putw_ptr.asFunction<_dart_putw>();\n\n  ffi.Pointer<ffi.Int8> fgets(\n    ffi.Pointer<ffi.Int8> __s,\n    int __n,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fgets(\n      __s,\n      __n,\n      __stream,\n    );\n  }\n\n  late final _fgets_ptr = _lookup<ffi.NativeFunction<_c_fgets>>('fgets');\n  late final _dart_fgets _fgets = _fgets_ptr.asFunction<_dart_fgets>();\n\n  int __getdelim(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n    ffi.Pointer<ffi.Uint64> __n,\n    int __delimiter,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return ___getdelim(\n      __lineptr,\n      __n,\n      __delimiter,\n      __stream,\n    );\n  }\n\n  late final ___getdelim_ptr =\n      _lookup<ffi.NativeFunction<_c___getdelim>>('__getdelim');\n  late final _dart___getdelim ___getdelim =\n      ___getdelim_ptr.asFunction<_dart___getdelim>();\n\n  int getdelim(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n    ffi.Pointer<ffi.Uint64> __n,\n    int __delimiter,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _getdelim(\n      __lineptr,\n      __n,\n      __delimiter,\n      __stream,\n    );\n  }\n\n  late final _getdelim_ptr =\n      _lookup<ffi.NativeFunction<_c_getdelim>>('getdelim');\n  late final _dart_getdelim _getdelim =\n      _getdelim_ptr.asFunction<_dart_getdelim>();\n\n  int getline(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n    ffi.Pointer<ffi.Uint64> __n,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _getline(\n      __lineptr,\n      __n,\n      __stream,\n    );\n  }\n\n  late final _getline_ptr = _lookup<ffi.NativeFunction<_c_getline>>('getline');\n  late final _dart_getline _getline = _getline_ptr.asFunction<_dart_getline>();\n\n  int fputs(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fputs(\n      __s,\n      __stream,\n    );\n  }\n\n  late final _fputs_ptr = _lookup<ffi.NativeFunction<_c_fputs>>('fputs');\n  late final _dart_fputs _fputs = _fputs_ptr.asFunction<_dart_fputs>();\n\n  int puts(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _puts(\n      __s,\n    );\n  }\n\n  late final _puts_ptr = _lookup<ffi.NativeFunction<_c_puts>>('puts');\n  late final _dart_puts _puts = _puts_ptr.asFunction<_dart_puts>();\n\n  int ungetc(\n    int __c,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ungetc(\n      __c,\n      __stream,\n    );\n  }\n\n  late final _ungetc_ptr = _lookup<ffi.NativeFunction<_c_ungetc>>('ungetc');\n  late final _dart_ungetc _ungetc = _ungetc_ptr.asFunction<_dart_ungetc>();\n\n  int fread(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __size,\n    int __n,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fread(\n      __ptr,\n      __size,\n      __n,\n      __stream,\n    );\n  }\n\n  late final _fread_ptr = _lookup<ffi.NativeFunction<_c_fread>>('fread');\n  late final _dart_fread _fread = _fread_ptr.asFunction<_dart_fread>();\n\n  int fwrite(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __size,\n    int __n,\n    ffi.Pointer<IO_FILE_> __s,\n  ) {\n    return _fwrite(\n      __ptr,\n      __size,\n      __n,\n      __s,\n    );\n  }\n\n  late final _fwrite_ptr = _lookup<ffi.NativeFunction<_c_fwrite>>('fwrite');\n  late final _dart_fwrite _fwrite = _fwrite_ptr.asFunction<_dart_fwrite>();\n\n  int fread_unlocked(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __size,\n    int __n,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fread_unlocked(\n      __ptr,\n      __size,\n      __n,\n      __stream,\n    );\n  }\n\n  late final _fread_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fread_unlocked>>('fread_unlocked');\n  late final _dart_fread_unlocked _fread_unlocked =\n      _fread_unlocked_ptr.asFunction<_dart_fread_unlocked>();\n\n  int fwrite_unlocked(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __size,\n    int __n,\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fwrite_unlocked(\n      __ptr,\n      __size,\n      __n,\n      __stream,\n    );\n  }\n\n  late final _fwrite_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fwrite_unlocked>>('fwrite_unlocked');\n  late final _dart_fwrite_unlocked _fwrite_unlocked =\n      _fwrite_unlocked_ptr.asFunction<_dart_fwrite_unlocked>();\n\n  int fseek(\n    ffi.Pointer<IO_FILE_> __stream,\n    int __off,\n    int __whence,\n  ) {\n    return _fseek(\n      __stream,\n      __off,\n      __whence,\n    );\n  }\n\n  late final _fseek_ptr = _lookup<ffi.NativeFunction<_c_fseek>>('fseek');\n  late final _dart_fseek _fseek = _fseek_ptr.asFunction<_dart_fseek>();\n\n  int ftell(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ftell(\n      __stream,\n    );\n  }\n\n  late final _ftell_ptr = _lookup<ffi.NativeFunction<_c_ftell>>('ftell');\n  late final _dart_ftell _ftell = _ftell_ptr.asFunction<_dart_ftell>();\n\n  void rewind(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _rewind(\n      __stream,\n    );\n  }\n\n  late final _rewind_ptr = _lookup<ffi.NativeFunction<_c_rewind>>('rewind');\n  late final _dart_rewind _rewind = _rewind_ptr.asFunction<_dart_rewind>();\n\n  int fseeko(\n    ffi.Pointer<IO_FILE_> __stream,\n    int __off,\n    int __whence,\n  ) {\n    return _fseeko(\n      __stream,\n      __off,\n      __whence,\n    );\n  }\n\n  late final _fseeko_ptr = _lookup<ffi.NativeFunction<_c_fseeko>>('fseeko');\n  late final _dart_fseeko _fseeko = _fseeko_ptr.asFunction<_dart_fseeko>();\n\n  int ftello(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ftello(\n      __stream,\n    );\n  }\n\n  late final _ftello_ptr = _lookup<ffi.NativeFunction<_c_ftello>>('ftello');\n  late final _dart_ftello _ftello = _ftello_ptr.asFunction<_dart_ftello>();\n\n  int fgetpos(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<_fpos_t_> __pos,\n  ) {\n    return _fgetpos(\n      __stream,\n      __pos,\n    );\n  }\n\n  late final _fgetpos_ptr = _lookup<ffi.NativeFunction<_c_fgetpos>>('fgetpos');\n  late final _dart_fgetpos _fgetpos = _fgetpos_ptr.asFunction<_dart_fgetpos>();\n\n  int fsetpos(\n    ffi.Pointer<IO_FILE_> __stream,\n    ffi.Pointer<_fpos_t_> __pos,\n  ) {\n    return _fsetpos(\n      __stream,\n      __pos,\n    );\n  }\n\n  late final _fsetpos_ptr = _lookup<ffi.NativeFunction<_c_fsetpos>>('fsetpos');\n  late final _dart_fsetpos _fsetpos = _fsetpos_ptr.asFunction<_dart_fsetpos>();\n\n  void clearerr(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _clearerr(\n      __stream,\n    );\n  }\n\n  late final _clearerr_ptr =\n      _lookup<ffi.NativeFunction<_c_clearerr>>('clearerr');\n  late final _dart_clearerr _clearerr =\n      _clearerr_ptr.asFunction<_dart_clearerr>();\n\n  int feof(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _feof(\n      __stream,\n    );\n  }\n\n  late final _feof_ptr = _lookup<ffi.NativeFunction<_c_feof>>('feof');\n  late final _dart_feof _feof = _feof_ptr.asFunction<_dart_feof>();\n\n  int ferror(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ferror(\n      __stream,\n    );\n  }\n\n  late final _ferror_ptr = _lookup<ffi.NativeFunction<_c_ferror>>('ferror');\n  late final _dart_ferror _ferror = _ferror_ptr.asFunction<_dart_ferror>();\n\n  void clearerr_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _clearerr_unlocked(\n      __stream,\n    );\n  }\n\n  late final _clearerr_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_clearerr_unlocked>>('clearerr_unlocked');\n  late final _dart_clearerr_unlocked _clearerr_unlocked =\n      _clearerr_unlocked_ptr.asFunction<_dart_clearerr_unlocked>();\n\n  int feof_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _feof_unlocked(\n      __stream,\n    );\n  }\n\n  late final _feof_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_feof_unlocked>>('feof_unlocked');\n  late final _dart_feof_unlocked _feof_unlocked =\n      _feof_unlocked_ptr.asFunction<_dart_feof_unlocked>();\n\n  int ferror_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ferror_unlocked(\n      __stream,\n    );\n  }\n\n  late final _ferror_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_ferror_unlocked>>('ferror_unlocked');\n  late final _dart_ferror_unlocked _ferror_unlocked =\n      _ferror_unlocked_ptr.asFunction<_dart_ferror_unlocked>();\n\n  void perror(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _perror(\n      __s,\n    );\n  }\n\n  late final _perror_ptr = _lookup<ffi.NativeFunction<_c_perror>>('perror');\n  late final _dart_perror _perror = _perror_ptr.asFunction<_dart_perror>();\n\n  late final ffi.Pointer<ffi.Int32> _sys_nerr = _lookup<ffi.Int32>('sys_nerr');\n\n  int get sys_nerr => _sys_nerr.value;\n\n  set sys_nerr(int value) => _sys_nerr.value = value;\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> _sys_errlist =\n      _lookup<ffi.Pointer<ffi.Pointer<ffi.Int8>>>('sys_errlist');\n\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> get sys_errlist => _sys_errlist.value;\n\n  set sys_errlist(ffi.Pointer<ffi.Pointer<ffi.Int8>> value) =>\n      _sys_errlist.value = value;\n\n  int fileno(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fileno(\n      __stream,\n    );\n  }\n\n  late final _fileno_ptr = _lookup<ffi.NativeFunction<_c_fileno>>('fileno');\n  late final _dart_fileno _fileno = _fileno_ptr.asFunction<_dart_fileno>();\n\n  int fileno_unlocked(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _fileno_unlocked(\n      __stream,\n    );\n  }\n\n  late final _fileno_unlocked_ptr =\n      _lookup<ffi.NativeFunction<_c_fileno_unlocked>>('fileno_unlocked');\n  late final _dart_fileno_unlocked _fileno_unlocked =\n      _fileno_unlocked_ptr.asFunction<_dart_fileno_unlocked>();\n\n  ffi.Pointer<IO_FILE_> popen(\n    ffi.Pointer<ffi.Int8> __command,\n    ffi.Pointer<ffi.Int8> __modes,\n  ) {\n    return _popen(\n      __command,\n      __modes,\n    );\n  }\n\n  late final _popen_ptr = _lookup<ffi.NativeFunction<_c_popen>>('popen');\n  late final _dart_popen _popen = _popen_ptr.asFunction<_dart_popen>();\n\n  int pclose(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _pclose(\n      __stream,\n    );\n  }\n\n  late final _pclose_ptr = _lookup<ffi.NativeFunction<_c_pclose>>('pclose');\n  late final _dart_pclose _pclose = _pclose_ptr.asFunction<_dart_pclose>();\n\n  ffi.Pointer<ffi.Int8> ctermid(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _ctermid(\n      __s,\n    );\n  }\n\n  late final _ctermid_ptr = _lookup<ffi.NativeFunction<_c_ctermid>>('ctermid');\n  late final _dart_ctermid _ctermid = _ctermid_ptr.asFunction<_dart_ctermid>();\n\n  void flockfile(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _flockfile(\n      __stream,\n    );\n  }\n\n  late final _flockfile_ptr =\n      _lookup<ffi.NativeFunction<_c_flockfile>>('flockfile');\n  late final _dart_flockfile _flockfile =\n      _flockfile_ptr.asFunction<_dart_flockfile>();\n\n  int ftrylockfile(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _ftrylockfile(\n      __stream,\n    );\n  }\n\n  late final _ftrylockfile_ptr =\n      _lookup<ffi.NativeFunction<_c_ftrylockfile>>('ftrylockfile');\n  late final _dart_ftrylockfile _ftrylockfile =\n      _ftrylockfile_ptr.asFunction<_dart_ftrylockfile>();\n\n  void funlockfile(\n    ffi.Pointer<IO_FILE_> __stream,\n  ) {\n    return _funlockfile(\n      __stream,\n    );\n  }\n\n  late final _funlockfile_ptr =\n      _lookup<ffi.NativeFunction<_c_funlockfile>>('funlockfile');\n  late final _dart_funlockfile _funlockfile =\n      _funlockfile_ptr.asFunction<_dart_funlockfile>();\n\n  int __uflow(\n    ffi.Pointer<IO_FILE_> arg0,\n  ) {\n    return ___uflow(\n      arg0,\n    );\n  }\n\n  late final ___uflow_ptr = _lookup<ffi.NativeFunction<_c___uflow>>('__uflow');\n  late final _dart___uflow ___uflow = ___uflow_ptr.asFunction<_dart___uflow>();\n\n  int __overflow(\n    ffi.Pointer<IO_FILE_> arg0,\n    int arg1,\n  ) {\n    return ___overflow(\n      arg0,\n      arg1,\n    );\n  }\n\n  late final ___overflow_ptr =\n      _lookup<ffi.NativeFunction<_c___overflow>>('__overflow');\n  late final _dart___overflow ___overflow =\n      ___overflow_ptr.asFunction<_dart___overflow>();\n\n  int __ctype_get_mb_cur_max() {\n    return ___ctype_get_mb_cur_max();\n  }\n\n  late final ___ctype_get_mb_cur_max_ptr =\n      _lookup<ffi.NativeFunction<_c___ctype_get_mb_cur_max>>(\n          '__ctype_get_mb_cur_max');\n  late final _dart___ctype_get_mb_cur_max ___ctype_get_mb_cur_max =\n      ___ctype_get_mb_cur_max_ptr.asFunction<_dart___ctype_get_mb_cur_max>();\n\n  double atof(\n    ffi.Pointer<ffi.Int8> __nptr,\n  ) {\n    return _atof(\n      __nptr,\n    );\n  }\n\n  late final _atof_ptr = _lookup<ffi.NativeFunction<_c_atof>>('atof');\n  late final _dart_atof _atof = _atof_ptr.asFunction<_dart_atof>();\n\n  int atoi(\n    ffi.Pointer<ffi.Int8> __nptr,\n  ) {\n    return _atoi(\n      __nptr,\n    );\n  }\n\n  late final _atoi_ptr = _lookup<ffi.NativeFunction<_c_atoi>>('atoi');\n  late final _dart_atoi _atoi = _atoi_ptr.asFunction<_dart_atoi>();\n\n  int atol(\n    ffi.Pointer<ffi.Int8> __nptr,\n  ) {\n    return _atol(\n      __nptr,\n    );\n  }\n\n  late final _atol_ptr = _lookup<ffi.NativeFunction<_c_atol>>('atol');\n  late final _dart_atol _atol = _atol_ptr.asFunction<_dart_atol>();\n\n  int atoll(\n    ffi.Pointer<ffi.Int8> __nptr,\n  ) {\n    return _atoll(\n      __nptr,\n    );\n  }\n\n  late final _atoll_ptr = _lookup<ffi.NativeFunction<_c_atoll>>('atoll');\n  late final _dart_atoll _atoll = _atoll_ptr.asFunction<_dart_atoll>();\n\n  double strtod(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ) {\n    return _strtod(\n      __nptr,\n      __endptr,\n    );\n  }\n\n  late final _strtod_ptr = _lookup<ffi.NativeFunction<_c_strtod>>('strtod');\n  late final _dart_strtod _strtod = _strtod_ptr.asFunction<_dart_strtod>();\n\n  double strtof(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ) {\n    return _strtof(\n      __nptr,\n      __endptr,\n    );\n  }\n\n  late final _strtof_ptr = _lookup<ffi.NativeFunction<_c_strtof>>('strtof');\n  late final _dart_strtof _strtof = _strtof_ptr.asFunction<_dart_strtof>();\n\n  int strtol(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtol(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtol_ptr = _lookup<ffi.NativeFunction<_c_strtol>>('strtol');\n  late final _dart_strtol _strtol = _strtol_ptr.asFunction<_dart_strtol>();\n\n  int strtoul(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtoul(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtoul_ptr = _lookup<ffi.NativeFunction<_c_strtoul>>('strtoul');\n  late final _dart_strtoul _strtoul = _strtoul_ptr.asFunction<_dart_strtoul>();\n\n  int strtoq(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtoq(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtoq_ptr = _lookup<ffi.NativeFunction<_c_strtoq>>('strtoq');\n  late final _dart_strtoq _strtoq = _strtoq_ptr.asFunction<_dart_strtoq>();\n\n  int strtouq(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtouq(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtouq_ptr = _lookup<ffi.NativeFunction<_c_strtouq>>('strtouq');\n  late final _dart_strtouq _strtouq = _strtouq_ptr.asFunction<_dart_strtouq>();\n\n  int strtoll(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtoll(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtoll_ptr = _lookup<ffi.NativeFunction<_c_strtoll>>('strtoll');\n  late final _dart_strtoll _strtoll = _strtoll_ptr.asFunction<_dart_strtoll>();\n\n  int strtoull(\n    ffi.Pointer<ffi.Int8> __nptr,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n    int __base,\n  ) {\n    return _strtoull(\n      __nptr,\n      __endptr,\n      __base,\n    );\n  }\n\n  late final _strtoull_ptr =\n      _lookup<ffi.NativeFunction<_c_strtoull>>('strtoull');\n  late final _dart_strtoull _strtoull =\n      _strtoull_ptr.asFunction<_dart_strtoull>();\n\n  ffi.Pointer<ffi.Int8> l64a(\n    int __n,\n  ) {\n    return _l64a(\n      __n,\n    );\n  }\n\n  late final _l64a_ptr = _lookup<ffi.NativeFunction<_c_l64a>>('l64a');\n  late final _dart_l64a _l64a = _l64a_ptr.asFunction<_dart_l64a>();\n\n  int a64l(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _a64l(\n      __s,\n    );\n  }\n\n  late final _a64l_ptr = _lookup<ffi.NativeFunction<_c_a64l>>('a64l');\n  late final _dart_a64l _a64l = _a64l_ptr.asFunction<_dart_a64l>();\n\n  int select(\n    int __nfds,\n    ffi.Pointer<fd_set> __readfds,\n    ffi.Pointer<fd_set> __writefds,\n    ffi.Pointer<fd_set> __exceptfds,\n    ffi.Pointer<timeval> __timeout,\n  ) {\n    return _select(\n      __nfds,\n      __readfds,\n      __writefds,\n      __exceptfds,\n      __timeout,\n    );\n  }\n\n  late final _select_ptr = _lookup<ffi.NativeFunction<_c_select>>('select');\n  late final _dart_select _select = _select_ptr.asFunction<_dart_select>();\n\n  int pselect(\n    int __nfds,\n    ffi.Pointer<fd_set> __readfds,\n    ffi.Pointer<fd_set> __writefds,\n    ffi.Pointer<fd_set> __exceptfds,\n    ffi.Pointer<timespec> __timeout,\n    ffi.Pointer<_sigset_t_> __sigmask,\n  ) {\n    return _pselect(\n      __nfds,\n      __readfds,\n      __writefds,\n      __exceptfds,\n      __timeout,\n      __sigmask,\n    );\n  }\n\n  late final _pselect_ptr = _lookup<ffi.NativeFunction<_c_pselect>>('pselect');\n  late final _dart_pselect _pselect = _pselect_ptr.asFunction<_dart_pselect>();\n\n  int random() {\n    return _random();\n  }\n\n  late final _random_ptr = _lookup<ffi.NativeFunction<_c_random>>('random');\n  late final _dart_random _random = _random_ptr.asFunction<_dart_random>();\n\n  void srandom(\n    int __seed,\n  ) {\n    return _srandom(\n      __seed,\n    );\n  }\n\n  late final _srandom_ptr = _lookup<ffi.NativeFunction<_c_srandom>>('srandom');\n  late final _dart_srandom _srandom = _srandom_ptr.asFunction<_dart_srandom>();\n\n  ffi.Pointer<ffi.Int8> initstate(\n    int __seed,\n    ffi.Pointer<ffi.Int8> __statebuf,\n    int __statelen,\n  ) {\n    return _initstate(\n      __seed,\n      __statebuf,\n      __statelen,\n    );\n  }\n\n  late final _initstate_ptr =\n      _lookup<ffi.NativeFunction<_c_initstate>>('initstate');\n  late final _dart_initstate _initstate =\n      _initstate_ptr.asFunction<_dart_initstate>();\n\n  ffi.Pointer<ffi.Int8> setstate(\n    ffi.Pointer<ffi.Int8> __statebuf,\n  ) {\n    return _setstate(\n      __statebuf,\n    );\n  }\n\n  late final _setstate_ptr =\n      _lookup<ffi.NativeFunction<_c_setstate>>('setstate');\n  late final _dart_setstate _setstate =\n      _setstate_ptr.asFunction<_dart_setstate>();\n\n  int random_r(\n    ffi.Pointer<random_data> __buf,\n    ffi.Pointer<ffi.Int32> __result,\n  ) {\n    return _random_r(\n      __buf,\n      __result,\n    );\n  }\n\n  late final _random_r_ptr =\n      _lookup<ffi.NativeFunction<_c_random_r>>('random_r');\n  late final _dart_random_r _random_r =\n      _random_r_ptr.asFunction<_dart_random_r>();\n\n  int srandom_r(\n    int __seed,\n    ffi.Pointer<random_data> __buf,\n  ) {\n    return _srandom_r(\n      __seed,\n      __buf,\n    );\n  }\n\n  late final _srandom_r_ptr =\n      _lookup<ffi.NativeFunction<_c_srandom_r>>('srandom_r');\n  late final _dart_srandom_r _srandom_r =\n      _srandom_r_ptr.asFunction<_dart_srandom_r>();\n\n  int initstate_r(\n    int __seed,\n    ffi.Pointer<ffi.Int8> __statebuf,\n    int __statelen,\n    ffi.Pointer<random_data> __buf,\n  ) {\n    return _initstate_r(\n      __seed,\n      __statebuf,\n      __statelen,\n      __buf,\n    );\n  }\n\n  late final _initstate_r_ptr =\n      _lookup<ffi.NativeFunction<_c_initstate_r>>('initstate_r');\n  late final _dart_initstate_r _initstate_r =\n      _initstate_r_ptr.asFunction<_dart_initstate_r>();\n\n  int setstate_r(\n    ffi.Pointer<ffi.Int8> __statebuf,\n    ffi.Pointer<random_data> __buf,\n  ) {\n    return _setstate_r(\n      __statebuf,\n      __buf,\n    );\n  }\n\n  late final _setstate_r_ptr =\n      _lookup<ffi.NativeFunction<_c_setstate_r>>('setstate_r');\n  late final _dart_setstate_r _setstate_r =\n      _setstate_r_ptr.asFunction<_dart_setstate_r>();\n\n  int rand() {\n    return _rand();\n  }\n\n  late final _rand_ptr = _lookup<ffi.NativeFunction<_c_rand>>('rand');\n  late final _dart_rand _rand = _rand_ptr.asFunction<_dart_rand>();\n\n  void srand(\n    int __seed,\n  ) {\n    return _srand(\n      __seed,\n    );\n  }\n\n  late final _srand_ptr = _lookup<ffi.NativeFunction<_c_srand>>('srand');\n  late final _dart_srand _srand = _srand_ptr.asFunction<_dart_srand>();\n\n  int rand_r(\n    ffi.Pointer<ffi.Uint32> __seed,\n  ) {\n    return _rand_r(\n      __seed,\n    );\n  }\n\n  late final _rand_r_ptr = _lookup<ffi.NativeFunction<_c_rand_r>>('rand_r');\n  late final _dart_rand_r _rand_r = _rand_r_ptr.asFunction<_dart_rand_r>();\n\n  double drand48() {\n    return _drand48();\n  }\n\n  late final _drand48_ptr = _lookup<ffi.NativeFunction<_c_drand48>>('drand48');\n  late final _dart_drand48 _drand48 = _drand48_ptr.asFunction<_dart_drand48>();\n\n  double erand48(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n  ) {\n    return _erand48(\n      __xsubi,\n    );\n  }\n\n  late final _erand48_ptr = _lookup<ffi.NativeFunction<_c_erand48>>('erand48');\n  late final _dart_erand48 _erand48 = _erand48_ptr.asFunction<_dart_erand48>();\n\n  int lrand48() {\n    return _lrand48();\n  }\n\n  late final _lrand48_ptr = _lookup<ffi.NativeFunction<_c_lrand48>>('lrand48');\n  late final _dart_lrand48 _lrand48 = _lrand48_ptr.asFunction<_dart_lrand48>();\n\n  int nrand48(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n  ) {\n    return _nrand48(\n      __xsubi,\n    );\n  }\n\n  late final _nrand48_ptr = _lookup<ffi.NativeFunction<_c_nrand48>>('nrand48');\n  late final _dart_nrand48 _nrand48 = _nrand48_ptr.asFunction<_dart_nrand48>();\n\n  int mrand48() {\n    return _mrand48();\n  }\n\n  late final _mrand48_ptr = _lookup<ffi.NativeFunction<_c_mrand48>>('mrand48');\n  late final _dart_mrand48 _mrand48 = _mrand48_ptr.asFunction<_dart_mrand48>();\n\n  int jrand48(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n  ) {\n    return _jrand48(\n      __xsubi,\n    );\n  }\n\n  late final _jrand48_ptr = _lookup<ffi.NativeFunction<_c_jrand48>>('jrand48');\n  late final _dart_jrand48 _jrand48 = _jrand48_ptr.asFunction<_dart_jrand48>();\n\n  void srand48(\n    int __seedval,\n  ) {\n    return _srand48(\n      __seedval,\n    );\n  }\n\n  late final _srand48_ptr = _lookup<ffi.NativeFunction<_c_srand48>>('srand48');\n  late final _dart_srand48 _srand48 = _srand48_ptr.asFunction<_dart_srand48>();\n\n  ffi.Pointer<ffi.Uint16> seed48(\n    ffi.Pointer<ffi.Uint16> __seed16v,\n  ) {\n    return _seed48(\n      __seed16v,\n    );\n  }\n\n  late final _seed48_ptr = _lookup<ffi.NativeFunction<_c_seed48>>('seed48');\n  late final _dart_seed48 _seed48 = _seed48_ptr.asFunction<_dart_seed48>();\n\n  void lcong48(\n    ffi.Pointer<ffi.Uint16> __param,\n  ) {\n    return _lcong48(\n      __param,\n    );\n  }\n\n  late final _lcong48_ptr = _lookup<ffi.NativeFunction<_c_lcong48>>('lcong48');\n  late final _dart_lcong48 _lcong48 = _lcong48_ptr.asFunction<_dart_lcong48>();\n\n  int drand48_r(\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Double> __result,\n  ) {\n    return _drand48_r(\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _drand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_drand48_r>>('drand48_r');\n  late final _dart_drand48_r _drand48_r =\n      _drand48_r_ptr.asFunction<_dart_drand48_r>();\n\n  int erand48_r(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Double> __result,\n  ) {\n    return _erand48_r(\n      __xsubi,\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _erand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_erand48_r>>('erand48_r');\n  late final _dart_erand48_r _erand48_r =\n      _erand48_r_ptr.asFunction<_dart_erand48_r>();\n\n  int lrand48_r(\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Int64> __result,\n  ) {\n    return _lrand48_r(\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _lrand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_lrand48_r>>('lrand48_r');\n  late final _dart_lrand48_r _lrand48_r =\n      _lrand48_r_ptr.asFunction<_dart_lrand48_r>();\n\n  int nrand48_r(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Int64> __result,\n  ) {\n    return _nrand48_r(\n      __xsubi,\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _nrand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_nrand48_r>>('nrand48_r');\n  late final _dart_nrand48_r _nrand48_r =\n      _nrand48_r_ptr.asFunction<_dart_nrand48_r>();\n\n  int mrand48_r(\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Int64> __result,\n  ) {\n    return _mrand48_r(\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _mrand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_mrand48_r>>('mrand48_r');\n  late final _dart_mrand48_r _mrand48_r =\n      _mrand48_r_ptr.asFunction<_dart_mrand48_r>();\n\n  int jrand48_r(\n    ffi.Pointer<ffi.Uint16> __xsubi,\n    ffi.Pointer<drand48_data> __buffer,\n    ffi.Pointer<ffi.Int64> __result,\n  ) {\n    return _jrand48_r(\n      __xsubi,\n      __buffer,\n      __result,\n    );\n  }\n\n  late final _jrand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_jrand48_r>>('jrand48_r');\n  late final _dart_jrand48_r _jrand48_r =\n      _jrand48_r_ptr.asFunction<_dart_jrand48_r>();\n\n  int srand48_r(\n    int __seedval,\n    ffi.Pointer<drand48_data> __buffer,\n  ) {\n    return _srand48_r(\n      __seedval,\n      __buffer,\n    );\n  }\n\n  late final _srand48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_srand48_r>>('srand48_r');\n  late final _dart_srand48_r _srand48_r =\n      _srand48_r_ptr.asFunction<_dart_srand48_r>();\n\n  int seed48_r(\n    ffi.Pointer<ffi.Uint16> __seed16v,\n    ffi.Pointer<drand48_data> __buffer,\n  ) {\n    return _seed48_r(\n      __seed16v,\n      __buffer,\n    );\n  }\n\n  late final _seed48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_seed48_r>>('seed48_r');\n  late final _dart_seed48_r _seed48_r =\n      _seed48_r_ptr.asFunction<_dart_seed48_r>();\n\n  int lcong48_r(\n    ffi.Pointer<ffi.Uint16> __param,\n    ffi.Pointer<drand48_data> __buffer,\n  ) {\n    return _lcong48_r(\n      __param,\n      __buffer,\n    );\n  }\n\n  late final _lcong48_r_ptr =\n      _lookup<ffi.NativeFunction<_c_lcong48_r>>('lcong48_r');\n  late final _dart_lcong48_r _lcong48_r =\n      _lcong48_r_ptr.asFunction<_dart_lcong48_r>();\n\n  ffi.Pointer<ffi.Void> malloc(\n    int __size,\n  ) {\n    return _malloc(\n      __size,\n    );\n  }\n\n  late final _malloc_ptr = _lookup<ffi.NativeFunction<_c_malloc>>('malloc');\n  late final _dart_malloc _malloc = _malloc_ptr.asFunction<_dart_malloc>();\n\n  ffi.Pointer<ffi.Void> calloc(\n    int __nmemb,\n    int __size,\n  ) {\n    return _calloc(\n      __nmemb,\n      __size,\n    );\n  }\n\n  late final _calloc_ptr = _lookup<ffi.NativeFunction<_c_calloc>>('calloc');\n  late final _dart_calloc _calloc = _calloc_ptr.asFunction<_dart_calloc>();\n\n  ffi.Pointer<ffi.Void> realloc(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __size,\n  ) {\n    return _realloc(\n      __ptr,\n      __size,\n    );\n  }\n\n  late final _realloc_ptr = _lookup<ffi.NativeFunction<_c_realloc>>('realloc');\n  late final _dart_realloc _realloc = _realloc_ptr.asFunction<_dart_realloc>();\n\n  ffi.Pointer<ffi.Void> reallocarray(\n    ffi.Pointer<ffi.Void> __ptr,\n    int __nmemb,\n    int __size,\n  ) {\n    return _reallocarray(\n      __ptr,\n      __nmemb,\n      __size,\n    );\n  }\n\n  late final _reallocarray_ptr =\n      _lookup<ffi.NativeFunction<_c_reallocarray>>('reallocarray');\n  late final _dart_reallocarray _reallocarray =\n      _reallocarray_ptr.asFunction<_dart_reallocarray>();\n\n  void free(\n    ffi.Pointer<ffi.Void> __ptr,\n  ) {\n    return _free(\n      __ptr,\n    );\n  }\n\n  late final _free_ptr = _lookup<ffi.NativeFunction<_c_free>>('free');\n  late final _dart_free _free = _free_ptr.asFunction<_dart_free>();\n\n  ffi.Pointer<ffi.Void> alloca(\n    int __size,\n  ) {\n    return _alloca(\n      __size,\n    );\n  }\n\n  late final _alloca_ptr = _lookup<ffi.NativeFunction<_c_alloca>>('alloca');\n  late final _dart_alloca _alloca = _alloca_ptr.asFunction<_dart_alloca>();\n\n  ffi.Pointer<ffi.Void> valloc(\n    int __size,\n  ) {\n    return _valloc(\n      __size,\n    );\n  }\n\n  late final _valloc_ptr = _lookup<ffi.NativeFunction<_c_valloc>>('valloc');\n  late final _dart_valloc _valloc = _valloc_ptr.asFunction<_dart_valloc>();\n\n  int posix_memalign(\n    ffi.Pointer<ffi.Pointer<ffi.Void>> __memptr,\n    int __alignment,\n    int __size,\n  ) {\n    return _posix_memalign(\n      __memptr,\n      __alignment,\n      __size,\n    );\n  }\n\n  late final _posix_memalign_ptr =\n      _lookup<ffi.NativeFunction<_c_posix_memalign>>('posix_memalign');\n  late final _dart_posix_memalign _posix_memalign =\n      _posix_memalign_ptr.asFunction<_dart_posix_memalign>();\n\n  ffi.Pointer<ffi.Void> aligned_alloc(\n    int __alignment,\n    int __size,\n  ) {\n    return _aligned_alloc(\n      __alignment,\n      __size,\n    );\n  }\n\n  late final _aligned_alloc_ptr =\n      _lookup<ffi.NativeFunction<_c_aligned_alloc>>('aligned_alloc');\n  late final _dart_aligned_alloc _aligned_alloc =\n      _aligned_alloc_ptr.asFunction<_dart_aligned_alloc>();\n\n  void abort() {\n    return _abort();\n  }\n\n  late final _abort_ptr = _lookup<ffi.NativeFunction<_c_abort>>('abort');\n  late final _dart_abort _abort = _abort_ptr.asFunction<_dart_abort>();\n\n  int atexit(\n    ffi.Pointer<ffi.NativeFunction<_typedefC_1>> __func,\n  ) {\n    return _atexit(\n      __func,\n    );\n  }\n\n  late final _atexit_ptr = _lookup<ffi.NativeFunction<_c_atexit>>('atexit');\n  late final _dart_atexit _atexit = _atexit_ptr.asFunction<_dart_atexit>();\n\n  int at_quick_exit(\n    ffi.Pointer<ffi.NativeFunction<_typedefC_2>> __func,\n  ) {\n    return _at_quick_exit(\n      __func,\n    );\n  }\n\n  late final _at_quick_exit_ptr =\n      _lookup<ffi.NativeFunction<_c_at_quick_exit>>('at_quick_exit');\n  late final _dart_at_quick_exit _at_quick_exit =\n      _at_quick_exit_ptr.asFunction<_dart_at_quick_exit>();\n\n  int on_exit(\n    ffi.Pointer<ffi.NativeFunction<_typedefC_3>> __func,\n    ffi.Pointer<ffi.Void> __arg,\n  ) {\n    return _on_exit(\n      __func,\n      __arg,\n    );\n  }\n\n  late final _on_exit_ptr = _lookup<ffi.NativeFunction<_c_on_exit>>('on_exit');\n  late final _dart_on_exit _on_exit = _on_exit_ptr.asFunction<_dart_on_exit>();\n\n  void exit(\n    int __status,\n  ) {\n    return _exit_1(\n      __status,\n    );\n  }\n\n  late final _exit_ptr = _lookup<ffi.NativeFunction<_c_exit>>('exit');\n  late final _dart_exit _exit_1 = _exit_ptr.asFunction<_dart_exit>();\n\n  void quick_exit(\n    int __status,\n  ) {\n    return _quick_exit(\n      __status,\n    );\n  }\n\n  late final _quick_exit_ptr =\n      _lookup<ffi.NativeFunction<_c_quick_exit>>('quick_exit');\n  late final _dart_quick_exit _quick_exit =\n      _quick_exit_ptr.asFunction<_dart_quick_exit>();\n\n  void _Exit(\n    int __status,\n  ) {\n    return __Exit(\n      __status,\n    );\n  }\n\n  late final __Exit_ptr = _lookup<ffi.NativeFunction<_c__Exit>>('_Exit');\n  late final _dart__Exit __Exit = __Exit_ptr.asFunction<_dart__Exit>();\n\n  ffi.Pointer<ffi.Int8> getenv(\n    ffi.Pointer<ffi.Int8> __name,\n  ) {\n    return _getenv(\n      __name,\n    );\n  }\n\n  late final _getenv_ptr = _lookup<ffi.NativeFunction<_c_getenv>>('getenv');\n  late final _dart_getenv _getenv = _getenv_ptr.asFunction<_dart_getenv>();\n\n  int putenv(\n    ffi.Pointer<ffi.Int8> __string,\n  ) {\n    return _putenv(\n      __string,\n    );\n  }\n\n  late final _putenv_ptr = _lookup<ffi.NativeFunction<_c_putenv>>('putenv');\n  late final _dart_putenv _putenv = _putenv_ptr.asFunction<_dart_putenv>();\n\n  int setenv(\n    ffi.Pointer<ffi.Int8> __name,\n    ffi.Pointer<ffi.Int8> __value,\n    int __replace,\n  ) {\n    return _setenv(\n      __name,\n      __value,\n      __replace,\n    );\n  }\n\n  late final _setenv_ptr = _lookup<ffi.NativeFunction<_c_setenv>>('setenv');\n  late final _dart_setenv _setenv = _setenv_ptr.asFunction<_dart_setenv>();\n\n  int unsetenv(\n    ffi.Pointer<ffi.Int8> __name,\n  ) {\n    return _unsetenv(\n      __name,\n    );\n  }\n\n  late final _unsetenv_ptr =\n      _lookup<ffi.NativeFunction<_c_unsetenv>>('unsetenv');\n  late final _dart_unsetenv _unsetenv =\n      _unsetenv_ptr.asFunction<_dart_unsetenv>();\n\n  int clearenv() {\n    return _clearenv();\n  }\n\n  late final _clearenv_ptr =\n      _lookup<ffi.NativeFunction<_c_clearenv>>('clearenv');\n  late final _dart_clearenv _clearenv =\n      _clearenv_ptr.asFunction<_dart_clearenv>();\n\n  ffi.Pointer<ffi.Int8> mktemp(\n    ffi.Pointer<ffi.Int8> __template,\n  ) {\n    return _mktemp(\n      __template,\n    );\n  }\n\n  late final _mktemp_ptr = _lookup<ffi.NativeFunction<_c_mktemp>>('mktemp');\n  late final _dart_mktemp _mktemp = _mktemp_ptr.asFunction<_dart_mktemp>();\n\n  int mkstemp(\n    ffi.Pointer<ffi.Int8> __template,\n  ) {\n    return _mkstemp(\n      __template,\n    );\n  }\n\n  late final _mkstemp_ptr = _lookup<ffi.NativeFunction<_c_mkstemp>>('mkstemp');\n  late final _dart_mkstemp _mkstemp = _mkstemp_ptr.asFunction<_dart_mkstemp>();\n\n  int mkstemps(\n    ffi.Pointer<ffi.Int8> __template,\n    int __suffixlen,\n  ) {\n    return _mkstemps(\n      __template,\n      __suffixlen,\n    );\n  }\n\n  late final _mkstemps_ptr =\n      _lookup<ffi.NativeFunction<_c_mkstemps>>('mkstemps');\n  late final _dart_mkstemps _mkstemps =\n      _mkstemps_ptr.asFunction<_dart_mkstemps>();\n\n  ffi.Pointer<ffi.Int8> mkdtemp(\n    ffi.Pointer<ffi.Int8> __template,\n  ) {\n    return _mkdtemp(\n      __template,\n    );\n  }\n\n  late final _mkdtemp_ptr = _lookup<ffi.NativeFunction<_c_mkdtemp>>('mkdtemp');\n  late final _dart_mkdtemp _mkdtemp = _mkdtemp_ptr.asFunction<_dart_mkdtemp>();\n\n  int system(\n    ffi.Pointer<ffi.Int8> __command,\n  ) {\n    return _system(\n      __command,\n    );\n  }\n\n  late final _system_ptr = _lookup<ffi.NativeFunction<_c_system>>('system');\n  late final _dart_system _system = _system_ptr.asFunction<_dart_system>();\n\n  ffi.Pointer<ffi.Int8> realpath(\n    ffi.Pointer<ffi.Int8> __name,\n    ffi.Pointer<ffi.Int8> __resolved,\n  ) {\n    return _realpath(\n      __name,\n      __resolved,\n    );\n  }\n\n  late final _realpath_ptr =\n      _lookup<ffi.NativeFunction<_c_realpath>>('realpath');\n  late final _dart_realpath _realpath =\n      _realpath_ptr.asFunction<_dart_realpath>();\n\n  ffi.Pointer<ffi.Void> bsearch(\n    ffi.Pointer<ffi.Void> __key,\n    ffi.Pointer<ffi.Void> __base,\n    int __nmemb,\n    int __size,\n    ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n  ) {\n    return _bsearch(\n      __key,\n      __base,\n      __nmemb,\n      __size,\n      __compar,\n    );\n  }\n\n  late final _bsearch_ptr = _lookup<ffi.NativeFunction<_c_bsearch>>('bsearch');\n  late final _dart_bsearch _bsearch = _bsearch_ptr.asFunction<_dart_bsearch>();\n\n  void qsort(\n    ffi.Pointer<ffi.Void> __base,\n    int __nmemb,\n    int __size,\n    ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n  ) {\n    return _qsort(\n      __base,\n      __nmemb,\n      __size,\n      __compar,\n    );\n  }\n\n  late final _qsort_ptr = _lookup<ffi.NativeFunction<_c_qsort>>('qsort');\n  late final _dart_qsort _qsort = _qsort_ptr.asFunction<_dart_qsort>();\n\n  int abs(\n    int __x,\n  ) {\n    return _abs(\n      __x,\n    );\n  }\n\n  late final _abs_ptr = _lookup<ffi.NativeFunction<_c_abs>>('abs');\n  late final _dart_abs _abs = _abs_ptr.asFunction<_dart_abs>();\n\n  int labs(\n    int __x,\n  ) {\n    return _labs(\n      __x,\n    );\n  }\n\n  late final _labs_ptr = _lookup<ffi.NativeFunction<_c_labs>>('labs');\n  late final _dart_labs _labs = _labs_ptr.asFunction<_dart_labs>();\n\n  int llabs(\n    int __x,\n  ) {\n    return _llabs(\n      __x,\n    );\n  }\n\n  late final _llabs_ptr = _lookup<ffi.NativeFunction<_c_llabs>>('llabs');\n  late final _dart_llabs _llabs = _llabs_ptr.asFunction<_dart_llabs>();\n\n  div_t div(\n    int __numer,\n    int __denom,\n  ) {\n    return _div(\n      __numer,\n      __denom,\n    );\n  }\n\n  late final _div_ptr = _lookup<ffi.NativeFunction<_c_div>>('div');\n  late final _dart_div _div = _div_ptr.asFunction<_dart_div>();\n\n  ldiv_t ldiv(\n    int __numer,\n    int __denom,\n  ) {\n    return _ldiv(\n      __numer,\n      __denom,\n    );\n  }\n\n  late final _ldiv_ptr = _lookup<ffi.NativeFunction<_c_ldiv>>('ldiv');\n  late final _dart_ldiv _ldiv = _ldiv_ptr.asFunction<_dart_ldiv>();\n\n  lldiv_t lldiv(\n    int __numer,\n    int __denom,\n  ) {\n    return _lldiv(\n      __numer,\n      __denom,\n    );\n  }\n\n  late final _lldiv_ptr = _lookup<ffi.NativeFunction<_c_lldiv>>('lldiv');\n  late final _dart_lldiv _lldiv = _lldiv_ptr.asFunction<_dart_lldiv>();\n\n  ffi.Pointer<ffi.Int8> ecvt(\n    double __value,\n    int __ndigit,\n    ffi.Pointer<ffi.Int32> __decpt,\n    ffi.Pointer<ffi.Int32> __sign,\n  ) {\n    return _ecvt(\n      __value,\n      __ndigit,\n      __decpt,\n      __sign,\n    );\n  }\n\n  late final _ecvt_ptr = _lookup<ffi.NativeFunction<_c_ecvt>>('ecvt');\n  late final _dart_ecvt _ecvt = _ecvt_ptr.asFunction<_dart_ecvt>();\n\n  ffi.Pointer<ffi.Int8> fcvt(\n    double __value,\n    int __ndigit,\n    ffi.Pointer<ffi.Int32> __decpt,\n    ffi.Pointer<ffi.Int32> __sign,\n  ) {\n    return _fcvt(\n      __value,\n      __ndigit,\n      __decpt,\n      __sign,\n    );\n  }\n\n  late final _fcvt_ptr = _lookup<ffi.NativeFunction<_c_fcvt>>('fcvt');\n  late final _dart_fcvt _fcvt = _fcvt_ptr.asFunction<_dart_fcvt>();\n\n  ffi.Pointer<ffi.Int8> gcvt(\n    double __value,\n    int __ndigit,\n    ffi.Pointer<ffi.Int8> __buf,\n  ) {\n    return _gcvt(\n      __value,\n      __ndigit,\n      __buf,\n    );\n  }\n\n  late final _gcvt_ptr = _lookup<ffi.NativeFunction<_c_gcvt>>('gcvt');\n  late final _dart_gcvt _gcvt = _gcvt_ptr.asFunction<_dart_gcvt>();\n\n  int ecvt_r(\n    double __value,\n    int __ndigit,\n    ffi.Pointer<ffi.Int32> __decpt,\n    ffi.Pointer<ffi.Int32> __sign,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __len,\n  ) {\n    return _ecvt_r(\n      __value,\n      __ndigit,\n      __decpt,\n      __sign,\n      __buf,\n      __len,\n    );\n  }\n\n  late final _ecvt_r_ptr = _lookup<ffi.NativeFunction<_c_ecvt_r>>('ecvt_r');\n  late final _dart_ecvt_r _ecvt_r = _ecvt_r_ptr.asFunction<_dart_ecvt_r>();\n\n  int fcvt_r(\n    double __value,\n    int __ndigit,\n    ffi.Pointer<ffi.Int32> __decpt,\n    ffi.Pointer<ffi.Int32> __sign,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __len,\n  ) {\n    return _fcvt_r(\n      __value,\n      __ndigit,\n      __decpt,\n      __sign,\n      __buf,\n      __len,\n    );\n  }\n\n  late final _fcvt_r_ptr = _lookup<ffi.NativeFunction<_c_fcvt_r>>('fcvt_r');\n  late final _dart_fcvt_r _fcvt_r = _fcvt_r_ptr.asFunction<_dart_fcvt_r>();\n\n  int mblen(\n    ffi.Pointer<ffi.Int8> __s,\n    int __n,\n  ) {\n    return _mblen(\n      __s,\n      __n,\n    );\n  }\n\n  late final _mblen_ptr = _lookup<ffi.NativeFunction<_c_mblen>>('mblen');\n  late final _dart_mblen _mblen = _mblen_ptr.asFunction<_dart_mblen>();\n\n  int mbtowc(\n    ffi.Pointer<ffi.Int32> __pwc,\n    ffi.Pointer<ffi.Int8> __s,\n    int __n,\n  ) {\n    return _mbtowc(\n      __pwc,\n      __s,\n      __n,\n    );\n  }\n\n  late final _mbtowc_ptr = _lookup<ffi.NativeFunction<_c_mbtowc>>('mbtowc');\n  late final _dart_mbtowc _mbtowc = _mbtowc_ptr.asFunction<_dart_mbtowc>();\n\n  int wctomb(\n    ffi.Pointer<ffi.Int8> __s,\n    int __wchar,\n  ) {\n    return _wctomb(\n      __s,\n      __wchar,\n    );\n  }\n\n  late final _wctomb_ptr = _lookup<ffi.NativeFunction<_c_wctomb>>('wctomb');\n  late final _dart_wctomb _wctomb = _wctomb_ptr.asFunction<_dart_wctomb>();\n\n  int mbstowcs(\n    ffi.Pointer<ffi.Int32> __pwcs,\n    ffi.Pointer<ffi.Int8> __s,\n    int __n,\n  ) {\n    return _mbstowcs(\n      __pwcs,\n      __s,\n      __n,\n    );\n  }\n\n  late final _mbstowcs_ptr =\n      _lookup<ffi.NativeFunction<_c_mbstowcs>>('mbstowcs');\n  late final _dart_mbstowcs _mbstowcs =\n      _mbstowcs_ptr.asFunction<_dart_mbstowcs>();\n\n  int wcstombs(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int32> __pwcs,\n    int __n,\n  ) {\n    return _wcstombs(\n      __s,\n      __pwcs,\n      __n,\n    );\n  }\n\n  late final _wcstombs_ptr =\n      _lookup<ffi.NativeFunction<_c_wcstombs>>('wcstombs');\n  late final _dart_wcstombs _wcstombs =\n      _wcstombs_ptr.asFunction<_dart_wcstombs>();\n\n  int rpmatch(\n    ffi.Pointer<ffi.Int8> __response,\n  ) {\n    return _rpmatch(\n      __response,\n    );\n  }\n\n  late final _rpmatch_ptr = _lookup<ffi.NativeFunction<_c_rpmatch>>('rpmatch');\n  late final _dart_rpmatch _rpmatch = _rpmatch_ptr.asFunction<_dart_rpmatch>();\n\n  int getsubopt(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __optionp,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __tokens,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __valuep,\n  ) {\n    return _getsubopt(\n      __optionp,\n      __tokens,\n      __valuep,\n    );\n  }\n\n  late final _getsubopt_ptr =\n      _lookup<ffi.NativeFunction<_c_getsubopt>>('getsubopt');\n  late final _dart_getsubopt _getsubopt =\n      _getsubopt_ptr.asFunction<_dart_getsubopt>();\n\n  int getloadavg(\n    ffi.Pointer<ffi.Double> __loadavg,\n    int __nelem,\n  ) {\n    return _getloadavg(\n      __loadavg,\n      __nelem,\n    );\n  }\n\n  late final _getloadavg_ptr =\n      _lookup<ffi.NativeFunction<_c_getloadavg>>('getloadavg');\n  late final _dart_getloadavg _getloadavg =\n      _getloadavg_ptr.asFunction<_dart_getloadavg>();\n\n  ffi.Pointer<ffi.Void> memcpy(\n    ffi.Pointer<ffi.Void> __dest,\n    ffi.Pointer<ffi.Void> __src,\n    int __n,\n  ) {\n    return _memcpy(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _memcpy_ptr = _lookup<ffi.NativeFunction<_c_memcpy>>('memcpy');\n  late final _dart_memcpy _memcpy = _memcpy_ptr.asFunction<_dart_memcpy>();\n\n  ffi.Pointer<ffi.Void> memmove(\n    ffi.Pointer<ffi.Void> __dest,\n    ffi.Pointer<ffi.Void> __src,\n    int __n,\n  ) {\n    return _memmove(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _memmove_ptr = _lookup<ffi.NativeFunction<_c_memmove>>('memmove');\n  late final _dart_memmove _memmove = _memmove_ptr.asFunction<_dart_memmove>();\n\n  ffi.Pointer<ffi.Void> memccpy(\n    ffi.Pointer<ffi.Void> __dest,\n    ffi.Pointer<ffi.Void> __src,\n    int __c,\n    int __n,\n  ) {\n    return _memccpy(\n      __dest,\n      __src,\n      __c,\n      __n,\n    );\n  }\n\n  late final _memccpy_ptr = _lookup<ffi.NativeFunction<_c_memccpy>>('memccpy');\n  late final _dart_memccpy _memccpy = _memccpy_ptr.asFunction<_dart_memccpy>();\n\n  ffi.Pointer<ffi.Void> memset(\n    ffi.Pointer<ffi.Void> __s,\n    int __c,\n    int __n,\n  ) {\n    return _memset(\n      __s,\n      __c,\n      __n,\n    );\n  }\n\n  late final _memset_ptr = _lookup<ffi.NativeFunction<_c_memset>>('memset');\n  late final _dart_memset _memset = _memset_ptr.asFunction<_dart_memset>();\n\n  int memcmp(\n    ffi.Pointer<ffi.Void> __s1,\n    ffi.Pointer<ffi.Void> __s2,\n    int __n,\n  ) {\n    return _memcmp(\n      __s1,\n      __s2,\n      __n,\n    );\n  }\n\n  late final _memcmp_ptr = _lookup<ffi.NativeFunction<_c_memcmp>>('memcmp');\n  late final _dart_memcmp _memcmp = _memcmp_ptr.asFunction<_dart_memcmp>();\n\n  ffi.Pointer<ffi.Void> memchr(\n    ffi.Pointer<ffi.Void> __s,\n    int __c,\n    int __n,\n  ) {\n    return _memchr(\n      __s,\n      __c,\n      __n,\n    );\n  }\n\n  late final _memchr_ptr = _lookup<ffi.NativeFunction<_c_memchr>>('memchr');\n  late final _dart_memchr _memchr = _memchr_ptr.asFunction<_dart_memchr>();\n\n  ffi.Pointer<ffi.Int8> strcpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n  ) {\n    return _strcpy(\n      __dest,\n      __src,\n    );\n  }\n\n  late final _strcpy_ptr = _lookup<ffi.NativeFunction<_c_strcpy>>('strcpy');\n  late final _dart_strcpy _strcpy = _strcpy_ptr.asFunction<_dart_strcpy>();\n\n  ffi.Pointer<ffi.Int8> strncpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n  ) {\n    return _strncpy(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _strncpy_ptr = _lookup<ffi.NativeFunction<_c_strncpy>>('strncpy');\n  late final _dart_strncpy _strncpy = _strncpy_ptr.asFunction<_dart_strncpy>();\n\n  ffi.Pointer<ffi.Int8> strcat(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n  ) {\n    return _strcat(\n      __dest,\n      __src,\n    );\n  }\n\n  late final _strcat_ptr = _lookup<ffi.NativeFunction<_c_strcat>>('strcat');\n  late final _dart_strcat _strcat = _strcat_ptr.asFunction<_dart_strcat>();\n\n  ffi.Pointer<ffi.Int8> strncat(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n  ) {\n    return _strncat(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _strncat_ptr = _lookup<ffi.NativeFunction<_c_strncat>>('strncat');\n  late final _dart_strncat _strncat = _strncat_ptr.asFunction<_dart_strncat>();\n\n  int strcmp(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n  ) {\n    return _strcmp(\n      __s1,\n      __s2,\n    );\n  }\n\n  late final _strcmp_ptr = _lookup<ffi.NativeFunction<_c_strcmp>>('strcmp');\n  late final _dart_strcmp _strcmp = _strcmp_ptr.asFunction<_dart_strcmp>();\n\n  int strncmp(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n    int __n,\n  ) {\n    return _strncmp(\n      __s1,\n      __s2,\n      __n,\n    );\n  }\n\n  late final _strncmp_ptr = _lookup<ffi.NativeFunction<_c_strncmp>>('strncmp');\n  late final _dart_strncmp _strncmp = _strncmp_ptr.asFunction<_dart_strncmp>();\n\n  int strcoll(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n  ) {\n    return _strcoll(\n      __s1,\n      __s2,\n    );\n  }\n\n  late final _strcoll_ptr = _lookup<ffi.NativeFunction<_c_strcoll>>('strcoll');\n  late final _dart_strcoll _strcoll = _strcoll_ptr.asFunction<_dart_strcoll>();\n\n  int strxfrm(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n  ) {\n    return _strxfrm(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _strxfrm_ptr = _lookup<ffi.NativeFunction<_c_strxfrm>>('strxfrm');\n  late final _dart_strxfrm _strxfrm = _strxfrm_ptr.asFunction<_dart_strxfrm>();\n\n  int strcoll_l(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n    ffi.Pointer<_locale_struct_> __l,\n  ) {\n    return _strcoll_l(\n      __s1,\n      __s2,\n      __l,\n    );\n  }\n\n  late final _strcoll_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strcoll_l>>('strcoll_l');\n  late final _dart_strcoll_l _strcoll_l =\n      _strcoll_l_ptr.asFunction<_dart_strcoll_l>();\n\n  int strxfrm_l(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n    ffi.Pointer<_locale_struct_> __l,\n  ) {\n    return _strxfrm_l(\n      __dest,\n      __src,\n      __n,\n      __l,\n    );\n  }\n\n  late final _strxfrm_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strxfrm_l>>('strxfrm_l');\n  late final _dart_strxfrm_l _strxfrm_l =\n      _strxfrm_l_ptr.asFunction<_dart_strxfrm_l>();\n\n  ffi.Pointer<ffi.Int8> strdup(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _strdup(\n      __s,\n    );\n  }\n\n  late final _strdup_ptr = _lookup<ffi.NativeFunction<_c_strdup>>('strdup');\n  late final _dart_strdup _strdup = _strdup_ptr.asFunction<_dart_strdup>();\n\n  ffi.Pointer<ffi.Int8> strndup(\n    ffi.Pointer<ffi.Int8> __string,\n    int __n,\n  ) {\n    return _strndup(\n      __string,\n      __n,\n    );\n  }\n\n  late final _strndup_ptr = _lookup<ffi.NativeFunction<_c_strndup>>('strndup');\n  late final _dart_strndup _strndup = _strndup_ptr.asFunction<_dart_strndup>();\n\n  ffi.Pointer<ffi.Int8> strchr(\n    ffi.Pointer<ffi.Int8> __s,\n    int __c,\n  ) {\n    return _strchr(\n      __s,\n      __c,\n    );\n  }\n\n  late final _strchr_ptr = _lookup<ffi.NativeFunction<_c_strchr>>('strchr');\n  late final _dart_strchr _strchr = _strchr_ptr.asFunction<_dart_strchr>();\n\n  ffi.Pointer<ffi.Int8> strrchr(\n    ffi.Pointer<ffi.Int8> __s,\n    int __c,\n  ) {\n    return _strrchr(\n      __s,\n      __c,\n    );\n  }\n\n  late final _strrchr_ptr = _lookup<ffi.NativeFunction<_c_strrchr>>('strrchr');\n  late final _dart_strrchr _strrchr = _strrchr_ptr.asFunction<_dart_strrchr>();\n\n  int strcspn(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __reject,\n  ) {\n    return _strcspn(\n      __s,\n      __reject,\n    );\n  }\n\n  late final _strcspn_ptr = _lookup<ffi.NativeFunction<_c_strcspn>>('strcspn');\n  late final _dart_strcspn _strcspn = _strcspn_ptr.asFunction<_dart_strcspn>();\n\n  int strspn(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __accept,\n  ) {\n    return _strspn(\n      __s,\n      __accept,\n    );\n  }\n\n  late final _strspn_ptr = _lookup<ffi.NativeFunction<_c_strspn>>('strspn');\n  late final _dart_strspn _strspn = _strspn_ptr.asFunction<_dart_strspn>();\n\n  ffi.Pointer<ffi.Int8> strpbrk(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __accept,\n  ) {\n    return _strpbrk(\n      __s,\n      __accept,\n    );\n  }\n\n  late final _strpbrk_ptr = _lookup<ffi.NativeFunction<_c_strpbrk>>('strpbrk');\n  late final _dart_strpbrk _strpbrk = _strpbrk_ptr.asFunction<_dart_strpbrk>();\n\n  ffi.Pointer<ffi.Int8> strstr(\n    ffi.Pointer<ffi.Int8> __haystack,\n    ffi.Pointer<ffi.Int8> __needle,\n  ) {\n    return _strstr(\n      __haystack,\n      __needle,\n    );\n  }\n\n  late final _strstr_ptr = _lookup<ffi.NativeFunction<_c_strstr>>('strstr');\n  late final _dart_strstr _strstr = _strstr_ptr.asFunction<_dart_strstr>();\n\n  ffi.Pointer<ffi.Int8> strtok(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __delim,\n  ) {\n    return _strtok(\n      __s,\n      __delim,\n    );\n  }\n\n  late final _strtok_ptr = _lookup<ffi.NativeFunction<_c_strtok>>('strtok');\n  late final _dart_strtok _strtok = _strtok_ptr.asFunction<_dart_strtok>();\n\n  ffi.Pointer<ffi.Int8> __strtok_r(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __delim,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n  ) {\n    return ___strtok_r(\n      __s,\n      __delim,\n      __save_ptr,\n    );\n  }\n\n  late final ___strtok_r_ptr =\n      _lookup<ffi.NativeFunction<_c___strtok_r>>('__strtok_r');\n  late final _dart___strtok_r ___strtok_r =\n      ___strtok_r_ptr.asFunction<_dart___strtok_r>();\n\n  ffi.Pointer<ffi.Int8> strtok_r(\n    ffi.Pointer<ffi.Int8> __s,\n    ffi.Pointer<ffi.Int8> __delim,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n  ) {\n    return _strtok_r(\n      __s,\n      __delim,\n      __save_ptr,\n    );\n  }\n\n  late final _strtok_r_ptr =\n      _lookup<ffi.NativeFunction<_c_strtok_r>>('strtok_r');\n  late final _dart_strtok_r _strtok_r =\n      _strtok_r_ptr.asFunction<_dart_strtok_r>();\n\n  int strlen(\n    ffi.Pointer<ffi.Int8> __s,\n  ) {\n    return _strlen(\n      __s,\n    );\n  }\n\n  late final _strlen_ptr = _lookup<ffi.NativeFunction<_c_strlen>>('strlen');\n  late final _dart_strlen _strlen = _strlen_ptr.asFunction<_dart_strlen>();\n\n  int strnlen(\n    ffi.Pointer<ffi.Int8> __string,\n    int __maxlen,\n  ) {\n    return _strnlen(\n      __string,\n      __maxlen,\n    );\n  }\n\n  late final _strnlen_ptr = _lookup<ffi.NativeFunction<_c_strnlen>>('strnlen');\n  late final _dart_strnlen _strnlen = _strnlen_ptr.asFunction<_dart_strnlen>();\n\n  ffi.Pointer<ffi.Int8> strerror(\n    int __errnum,\n  ) {\n    return _strerror(\n      __errnum,\n    );\n  }\n\n  late final _strerror_ptr =\n      _lookup<ffi.NativeFunction<_c_strerror>>('strerror');\n  late final _dart_strerror _strerror =\n      _strerror_ptr.asFunction<_dart_strerror>();\n\n  int strerror_r(\n    int __errnum,\n    ffi.Pointer<ffi.Int8> __buf,\n    int __buflen,\n  ) {\n    return _strerror_r(\n      __errnum,\n      __buf,\n      __buflen,\n    );\n  }\n\n  late final _strerror_r_ptr =\n      _lookup<ffi.NativeFunction<_c_strerror_r>>('strerror_r');\n  late final _dart_strerror_r _strerror_r =\n      _strerror_r_ptr.asFunction<_dart_strerror_r>();\n\n  ffi.Pointer<ffi.Int8> strerror_l(\n    int __errnum,\n    ffi.Pointer<_locale_struct_> __l,\n  ) {\n    return _strerror_l(\n      __errnum,\n      __l,\n    );\n  }\n\n  late final _strerror_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strerror_l>>('strerror_l');\n  late final _dart_strerror_l _strerror_l =\n      _strerror_l_ptr.asFunction<_dart_strerror_l>();\n\n  int bcmp(\n    ffi.Pointer<ffi.Void> __s1,\n    ffi.Pointer<ffi.Void> __s2,\n    int __n,\n  ) {\n    return _bcmp(\n      __s1,\n      __s2,\n      __n,\n    );\n  }\n\n  late final _bcmp_ptr = _lookup<ffi.NativeFunction<_c_bcmp>>('bcmp');\n  late final _dart_bcmp _bcmp = _bcmp_ptr.asFunction<_dart_bcmp>();\n\n  void bcopy(\n    ffi.Pointer<ffi.Void> __src,\n    ffi.Pointer<ffi.Void> __dest,\n    int __n,\n  ) {\n    return _bcopy(\n      __src,\n      __dest,\n      __n,\n    );\n  }\n\n  late final _bcopy_ptr = _lookup<ffi.NativeFunction<_c_bcopy>>('bcopy');\n  late final _dart_bcopy _bcopy = _bcopy_ptr.asFunction<_dart_bcopy>();\n\n  void bzero(\n    ffi.Pointer<ffi.Void> __s,\n    int __n,\n  ) {\n    return _bzero(\n      __s,\n      __n,\n    );\n  }\n\n  late final _bzero_ptr = _lookup<ffi.NativeFunction<_c_bzero>>('bzero');\n  late final _dart_bzero _bzero = _bzero_ptr.asFunction<_dart_bzero>();\n\n  ffi.Pointer<ffi.Int8> index(\n    ffi.Pointer<ffi.Int8> __s,\n    int __c,\n  ) {\n    return _index(\n      __s,\n      __c,\n    );\n  }\n\n  late final _index_ptr = _lookup<ffi.NativeFunction<_c_index>>('index');\n  late final _dart_index _index = _index_ptr.asFunction<_dart_index>();\n\n  ffi.Pointer<ffi.Int8> rindex(\n    ffi.Pointer<ffi.Int8> __s,\n    int __c,\n  ) {\n    return _rindex(\n      __s,\n      __c,\n    );\n  }\n\n  late final _rindex_ptr = _lookup<ffi.NativeFunction<_c_rindex>>('rindex');\n  late final _dart_rindex _rindex = _rindex_ptr.asFunction<_dart_rindex>();\n\n  int ffs(\n    int __i,\n  ) {\n    return _ffs(\n      __i,\n    );\n  }\n\n  late final _ffs_ptr = _lookup<ffi.NativeFunction<_c_ffs>>('ffs');\n  late final _dart_ffs _ffs = _ffs_ptr.asFunction<_dart_ffs>();\n\n  int ffsl(\n    int __l,\n  ) {\n    return _ffsl(\n      __l,\n    );\n  }\n\n  late final _ffsl_ptr = _lookup<ffi.NativeFunction<_c_ffsl>>('ffsl');\n  late final _dart_ffsl _ffsl = _ffsl_ptr.asFunction<_dart_ffsl>();\n\n  int ffsll(\n    int __ll,\n  ) {\n    return _ffsll(\n      __ll,\n    );\n  }\n\n  late final _ffsll_ptr = _lookup<ffi.NativeFunction<_c_ffsll>>('ffsll');\n  late final _dart_ffsll _ffsll = _ffsll_ptr.asFunction<_dart_ffsll>();\n\n  int strcasecmp(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n  ) {\n    return _strcasecmp(\n      __s1,\n      __s2,\n    );\n  }\n\n  late final _strcasecmp_ptr =\n      _lookup<ffi.NativeFunction<_c_strcasecmp>>('strcasecmp');\n  late final _dart_strcasecmp _strcasecmp =\n      _strcasecmp_ptr.asFunction<_dart_strcasecmp>();\n\n  int strncasecmp(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n    int __n,\n  ) {\n    return _strncasecmp(\n      __s1,\n      __s2,\n      __n,\n    );\n  }\n\n  late final _strncasecmp_ptr =\n      _lookup<ffi.NativeFunction<_c_strncasecmp>>('strncasecmp');\n  late final _dart_strncasecmp _strncasecmp =\n      _strncasecmp_ptr.asFunction<_dart_strncasecmp>();\n\n  int strcasecmp_l(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n    ffi.Pointer<_locale_struct_> __loc,\n  ) {\n    return _strcasecmp_l(\n      __s1,\n      __s2,\n      __loc,\n    );\n  }\n\n  late final _strcasecmp_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strcasecmp_l>>('strcasecmp_l');\n  late final _dart_strcasecmp_l _strcasecmp_l =\n      _strcasecmp_l_ptr.asFunction<_dart_strcasecmp_l>();\n\n  int strncasecmp_l(\n    ffi.Pointer<ffi.Int8> __s1,\n    ffi.Pointer<ffi.Int8> __s2,\n    int __n,\n    ffi.Pointer<_locale_struct_> __loc,\n  ) {\n    return _strncasecmp_l(\n      __s1,\n      __s2,\n      __n,\n      __loc,\n    );\n  }\n\n  late final _strncasecmp_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strncasecmp_l>>('strncasecmp_l');\n  late final _dart_strncasecmp_l _strncasecmp_l =\n      _strncasecmp_l_ptr.asFunction<_dart_strncasecmp_l>();\n\n  void explicit_bzero(\n    ffi.Pointer<ffi.Void> __s,\n    int __n,\n  ) {\n    return _explicit_bzero(\n      __s,\n      __n,\n    );\n  }\n\n  late final _explicit_bzero_ptr =\n      _lookup<ffi.NativeFunction<_c_explicit_bzero>>('explicit_bzero');\n  late final _dart_explicit_bzero _explicit_bzero =\n      _explicit_bzero_ptr.asFunction<_dart_explicit_bzero>();\n\n  ffi.Pointer<ffi.Int8> strsep(\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> __stringp,\n    ffi.Pointer<ffi.Int8> __delim,\n  ) {\n    return _strsep(\n      __stringp,\n      __delim,\n    );\n  }\n\n  late final _strsep_ptr = _lookup<ffi.NativeFunction<_c_strsep>>('strsep');\n  late final _dart_strsep _strsep = _strsep_ptr.asFunction<_dart_strsep>();\n\n  ffi.Pointer<ffi.Int8> strsignal(\n    int __sig,\n  ) {\n    return _strsignal(\n      __sig,\n    );\n  }\n\n  late final _strsignal_ptr =\n      _lookup<ffi.NativeFunction<_c_strsignal>>('strsignal');\n  late final _dart_strsignal _strsignal =\n      _strsignal_ptr.asFunction<_dart_strsignal>();\n\n  ffi.Pointer<ffi.Int8> __stpcpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n  ) {\n    return ___stpcpy(\n      __dest,\n      __src,\n    );\n  }\n\n  late final ___stpcpy_ptr =\n      _lookup<ffi.NativeFunction<_c___stpcpy>>('__stpcpy');\n  late final _dart___stpcpy ___stpcpy =\n      ___stpcpy_ptr.asFunction<_dart___stpcpy>();\n\n  ffi.Pointer<ffi.Int8> stpcpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n  ) {\n    return _stpcpy(\n      __dest,\n      __src,\n    );\n  }\n\n  late final _stpcpy_ptr = _lookup<ffi.NativeFunction<_c_stpcpy>>('stpcpy');\n  late final _dart_stpcpy _stpcpy = _stpcpy_ptr.asFunction<_dart_stpcpy>();\n\n  ffi.Pointer<ffi.Int8> __stpncpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n  ) {\n    return ___stpncpy(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final ___stpncpy_ptr =\n      _lookup<ffi.NativeFunction<_c___stpncpy>>('__stpncpy');\n  late final _dart___stpncpy ___stpncpy =\n      ___stpncpy_ptr.asFunction<_dart___stpncpy>();\n\n  ffi.Pointer<ffi.Int8> stpncpy(\n    ffi.Pointer<ffi.Int8> __dest,\n    ffi.Pointer<ffi.Int8> __src,\n    int __n,\n  ) {\n    return _stpncpy(\n      __dest,\n      __src,\n      __n,\n    );\n  }\n\n  late final _stpncpy_ptr = _lookup<ffi.NativeFunction<_c_stpncpy>>('stpncpy');\n  late final _dart_stpncpy _stpncpy = _stpncpy_ptr.asFunction<_dart_stpncpy>();\n\n  int fcntl(\n    int __fd,\n    int __cmd,\n  ) {\n    return _fcntl(\n      __fd,\n      __cmd,\n    );\n  }\n\n  late final _fcntl_ptr = _lookup<ffi.NativeFunction<_c_fcntl>>('fcntl');\n  late final _dart_fcntl _fcntl = _fcntl_ptr.asFunction<_dart_fcntl>();\n\n  int open(\n    ffi.Pointer<ffi.Int8> __file,\n    int __oflag,\n  ) {\n    return _open(\n      __file,\n      __oflag,\n    );\n  }\n\n  late final _open_ptr = _lookup<ffi.NativeFunction<_c_open>>('open');\n  late final _dart_open _open = _open_ptr.asFunction<_dart_open>();\n\n  int openat(\n    int __fd,\n    ffi.Pointer<ffi.Int8> __file,\n    int __oflag,\n  ) {\n    return _openat(\n      __fd,\n      __file,\n      __oflag,\n    );\n  }\n\n  late final _openat_ptr = _lookup<ffi.NativeFunction<_c_openat>>('openat');\n  late final _dart_openat _openat = _openat_ptr.asFunction<_dart_openat>();\n\n  int creat(\n    ffi.Pointer<ffi.Int8> __file,\n    int __mode,\n  ) {\n    return _creat(\n      __file,\n      __mode,\n    );\n  }\n\n  late final _creat_ptr = _lookup<ffi.NativeFunction<_c_creat>>('creat');\n  late final _dart_creat _creat = _creat_ptr.asFunction<_dart_creat>();\n\n  int posix_fadvise(\n    int __fd,\n    int __offset,\n    int __len,\n    int __advise,\n  ) {\n    return _posix_fadvise(\n      __fd,\n      __offset,\n      __len,\n      __advise,\n    );\n  }\n\n  late final _posix_fadvise_ptr =\n      _lookup<ffi.NativeFunction<_c_posix_fadvise>>('posix_fadvise');\n  late final _dart_posix_fadvise _posix_fadvise =\n      _posix_fadvise_ptr.asFunction<_dart_posix_fadvise>();\n\n  int posix_fallocate(\n    int __fd,\n    int __offset,\n    int __len,\n  ) {\n    return _posix_fallocate(\n      __fd,\n      __offset,\n      __len,\n    );\n  }\n\n  late final _posix_fallocate_ptr =\n      _lookup<ffi.NativeFunction<_c_posix_fallocate>>('posix_fallocate');\n  late final _dart_posix_fallocate _posix_fallocate =\n      _posix_fallocate_ptr.asFunction<_dart_posix_fallocate>();\n\n  void __assert_fail(\n    ffi.Pointer<ffi.Int8> __assertion,\n    ffi.Pointer<ffi.Int8> __file,\n    int __line,\n    ffi.Pointer<ffi.Int8> __function,\n  ) {\n    return ___assert_fail(\n      __assertion,\n      __file,\n      __line,\n      __function,\n    );\n  }\n\n  late final ___assert_fail_ptr =\n      _lookup<ffi.NativeFunction<_c___assert_fail>>('__assert_fail');\n  late final _dart___assert_fail ___assert_fail =\n      ___assert_fail_ptr.asFunction<_dart___assert_fail>();\n\n  void __assert_perror_fail(\n    int __errnum,\n    ffi.Pointer<ffi.Int8> __file,\n    int __line,\n    ffi.Pointer<ffi.Int8> __function,\n  ) {\n    return ___assert_perror_fail(\n      __errnum,\n      __file,\n      __line,\n      __function,\n    );\n  }\n\n  late final ___assert_perror_fail_ptr =\n      _lookup<ffi.NativeFunction<_c___assert_perror_fail>>(\n          '__assert_perror_fail');\n  late final _dart___assert_perror_fail ___assert_perror_fail =\n      ___assert_perror_fail_ptr.asFunction<_dart___assert_perror_fail>();\n\n  void __assert(\n    ffi.Pointer<ffi.Int8> __assertion,\n    ffi.Pointer<ffi.Int8> __file,\n    int __line,\n  ) {\n    return ___assert(\n      __assertion,\n      __file,\n      __line,\n    );\n  }\n\n  late final ___assert_ptr =\n      _lookup<ffi.NativeFunction<_c___assert>>('__assert');\n  late final _dart___assert ___assert =\n      ___assert_ptr.asFunction<_dart___assert>();\n\n  int poll(\n    ffi.Pointer<pollfd> __fds,\n    int __nfds,\n    int __timeout,\n  ) {\n    return _poll(\n      __fds,\n      __nfds,\n      __timeout,\n    );\n  }\n\n  late final _poll_ptr = _lookup<ffi.NativeFunction<_c_poll>>('poll');\n  late final _dart_poll _poll = _poll_ptr.asFunction<_dart_poll>();\n\n  ffi.Pointer<ffi.Int32> __errno_location() {\n    return ___errno_location();\n  }\n\n  late final ___errno_location_ptr =\n      _lookup<ffi.NativeFunction<_c___errno_location>>('__errno_location');\n  late final _dart___errno_location ___errno_location =\n      ___errno_location_ptr.asFunction<_dart___errno_location>();\n\n  int clock() {\n    return _clock();\n  }\n\n  late final _clock_ptr = _lookup<ffi.NativeFunction<_c_clock>>('clock');\n  late final _dart_clock _clock = _clock_ptr.asFunction<_dart_clock>();\n\n  int time(\n    ffi.Pointer<ffi.Int64> __timer,\n  ) {\n    return _time(\n      __timer,\n    );\n  }\n\n  late final _time_ptr = _lookup<ffi.NativeFunction<_c_time>>('time');\n  late final _dart_time _time = _time_ptr.asFunction<_dart_time>();\n\n  double difftime(\n    int __time1,\n    int __time0,\n  ) {\n    return _difftime(\n      __time1,\n      __time0,\n    );\n  }\n\n  late final _difftime_ptr =\n      _lookup<ffi.NativeFunction<_c_difftime>>('difftime');\n  late final _dart_difftime _difftime =\n      _difftime_ptr.asFunction<_dart_difftime>();\n\n  int mktime(\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _mktime(\n      __tp,\n    );\n  }\n\n  late final _mktime_ptr = _lookup<ffi.NativeFunction<_c_mktime>>('mktime');\n  late final _dart_mktime _mktime = _mktime_ptr.asFunction<_dart_mktime>();\n\n  int strftime(\n    ffi.Pointer<ffi.Int8> __s,\n    int __maxsize,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _strftime(\n      __s,\n      __maxsize,\n      __format,\n      __tp,\n    );\n  }\n\n  late final _strftime_ptr =\n      _lookup<ffi.NativeFunction<_c_strftime>>('strftime');\n  late final _dart_strftime _strftime =\n      _strftime_ptr.asFunction<_dart_strftime>();\n\n  int strftime_l(\n    ffi.Pointer<ffi.Int8> __s,\n    int __maxsize,\n    ffi.Pointer<ffi.Int8> __format,\n    ffi.Pointer<tm> __tp,\n    ffi.Pointer<_locale_struct_> __loc,\n  ) {\n    return _strftime_l(\n      __s,\n      __maxsize,\n      __format,\n      __tp,\n      __loc,\n    );\n  }\n\n  late final _strftime_l_ptr =\n      _lookup<ffi.NativeFunction<_c_strftime_l>>('strftime_l');\n  late final _dart_strftime_l _strftime_l =\n      _strftime_l_ptr.asFunction<_dart_strftime_l>();\n\n  ffi.Pointer<tm> gmtime(\n    ffi.Pointer<ffi.Int64> __timer,\n  ) {\n    return _gmtime(\n      __timer,\n    );\n  }\n\n  late final _gmtime_ptr = _lookup<ffi.NativeFunction<_c_gmtime>>('gmtime');\n  late final _dart_gmtime _gmtime = _gmtime_ptr.asFunction<_dart_gmtime>();\n\n  ffi.Pointer<tm> localtime(\n    ffi.Pointer<ffi.Int64> __timer,\n  ) {\n    return _localtime(\n      __timer,\n    );\n  }\n\n  late final _localtime_ptr =\n      _lookup<ffi.NativeFunction<_c_localtime>>('localtime');\n  late final _dart_localtime _localtime =\n      _localtime_ptr.asFunction<_dart_localtime>();\n\n  ffi.Pointer<tm> gmtime_r(\n    ffi.Pointer<ffi.Int64> __timer,\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _gmtime_r(\n      __timer,\n      __tp,\n    );\n  }\n\n  late final _gmtime_r_ptr =\n      _lookup<ffi.NativeFunction<_c_gmtime_r>>('gmtime_r');\n  late final _dart_gmtime_r _gmtime_r =\n      _gmtime_r_ptr.asFunction<_dart_gmtime_r>();\n\n  ffi.Pointer<tm> localtime_r(\n    ffi.Pointer<ffi.Int64> __timer,\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _localtime_r(\n      __timer,\n      __tp,\n    );\n  }\n\n  late final _localtime_r_ptr =\n      _lookup<ffi.NativeFunction<_c_localtime_r>>('localtime_r');\n  late final _dart_localtime_r _localtime_r =\n      _localtime_r_ptr.asFunction<_dart_localtime_r>();\n\n  ffi.Pointer<ffi.Int8> asctime(\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _asctime(\n      __tp,\n    );\n  }\n\n  late final _asctime_ptr = _lookup<ffi.NativeFunction<_c_asctime>>('asctime');\n  late final _dart_asctime _asctime = _asctime_ptr.asFunction<_dart_asctime>();\n\n  ffi.Pointer<ffi.Int8> ctime(\n    ffi.Pointer<ffi.Int64> __timer,\n  ) {\n    return _ctime(\n      __timer,\n    );\n  }\n\n  late final _ctime_ptr = _lookup<ffi.NativeFunction<_c_ctime>>('ctime');\n  late final _dart_ctime _ctime = _ctime_ptr.asFunction<_dart_ctime>();\n\n  ffi.Pointer<ffi.Int8> asctime_r(\n    ffi.Pointer<tm> __tp,\n    ffi.Pointer<ffi.Int8> __buf,\n  ) {\n    return _asctime_r(\n      __tp,\n      __buf,\n    );\n  }\n\n  late final _asctime_r_ptr =\n      _lookup<ffi.NativeFunction<_c_asctime_r>>('asctime_r');\n  late final _dart_asctime_r _asctime_r =\n      _asctime_r_ptr.asFunction<_dart_asctime_r>();\n\n  ffi.Pointer<ffi.Int8> ctime_r(\n    ffi.Pointer<ffi.Int64> __timer,\n    ffi.Pointer<ffi.Int8> __buf,\n  ) {\n    return _ctime_r(\n      __timer,\n      __buf,\n    );\n  }\n\n  late final _ctime_r_ptr = _lookup<ffi.NativeFunction<_c_ctime_r>>('ctime_r');\n  late final _dart_ctime_r _ctime_r = _ctime_r_ptr.asFunction<_dart_ctime_r>();\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> ___tzname =\n      _lookup<ffi.Pointer<ffi.Pointer<ffi.Int8>>>('__tzname');\n\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> get __tzname => ___tzname.value;\n\n  set __tzname(ffi.Pointer<ffi.Pointer<ffi.Int8>> value) =>\n      ___tzname.value = value;\n\n  late final ffi.Pointer<ffi.Int32> ___daylight =\n      _lookup<ffi.Int32>('__daylight');\n\n  int get __daylight => ___daylight.value;\n\n  set __daylight(int value) => ___daylight.value = value;\n\n  late final ffi.Pointer<ffi.Int64> ___timezone =\n      _lookup<ffi.Int64>('__timezone');\n\n  int get __timezone => ___timezone.value;\n\n  set __timezone(int value) => ___timezone.value = value;\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int8>>> _tzname =\n      _lookup<ffi.Pointer<ffi.Pointer<ffi.Int8>>>('tzname');\n\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> get tzname => _tzname.value;\n\n  set tzname(ffi.Pointer<ffi.Pointer<ffi.Int8>> value) => _tzname.value = value;\n\n  void tzset() {\n    return _tzset();\n  }\n\n  late final _tzset_ptr = _lookup<ffi.NativeFunction<_c_tzset>>('tzset');\n  late final _dart_tzset _tzset = _tzset_ptr.asFunction<_dart_tzset>();\n\n  late final ffi.Pointer<ffi.Int32> _daylight = _lookup<ffi.Int32>('daylight');\n\n  int get daylight => _daylight.value;\n\n  set daylight(int value) => _daylight.value = value;\n\n  late final ffi.Pointer<ffi.Int64> _timezone = _lookup<ffi.Int64>('timezone');\n\n  int get timezone => _timezone.value;\n\n  set timezone(int value) => _timezone.value = value;\n\n  int timegm(\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _timegm(\n      __tp,\n    );\n  }\n\n  late final _timegm_ptr = _lookup<ffi.NativeFunction<_c_timegm>>('timegm');\n  late final _dart_timegm _timegm = _timegm_ptr.asFunction<_dart_timegm>();\n\n  int timelocal(\n    ffi.Pointer<tm> __tp,\n  ) {\n    return _timelocal(\n      __tp,\n    );\n  }\n\n  late final _timelocal_ptr =\n      _lookup<ffi.NativeFunction<_c_timelocal>>('timelocal');\n  late final _dart_timelocal _timelocal =\n      _timelocal_ptr.asFunction<_dart_timelocal>();\n\n  int dysize(\n    int __year,\n  ) {\n    return _dysize(\n      __year,\n    );\n  }\n\n  late final _dysize_ptr = _lookup<ffi.NativeFunction<_c_dysize>>('dysize');\n  late final _dart_dysize _dysize = _dysize_ptr.asFunction<_dart_dysize>();\n\n  int nanosleep(\n    ffi.Pointer<timespec> __requested_time,\n    ffi.Pointer<timespec> __remaining,\n  ) {\n    return _nanosleep(\n      __requested_time,\n      __remaining,\n    );\n  }\n\n  late final _nanosleep_ptr =\n      _lookup<ffi.NativeFunction<_c_nanosleep>>('nanosleep');\n  late final _dart_nanosleep _nanosleep =\n      _nanosleep_ptr.asFunction<_dart_nanosleep>();\n\n  int clock_getres(\n    int __clock_id,\n    ffi.Pointer<timespec> __res,\n  ) {\n    return _clock_getres(\n      __clock_id,\n      __res,\n    );\n  }\n\n  late final _clock_getres_ptr =\n      _lookup<ffi.NativeFunction<_c_clock_getres>>('clock_getres');\n  late final _dart_clock_getres _clock_getres =\n      _clock_getres_ptr.asFunction<_dart_clock_getres>();\n\n  int clock_gettime(\n    int __clock_id,\n    ffi.Pointer<timespec> __tp,\n  ) {\n    return _clock_gettime(\n      __clock_id,\n      __tp,\n    );\n  }\n\n  late final _clock_gettime_ptr =\n      _lookup<ffi.NativeFunction<_c_clock_gettime>>('clock_gettime');\n  late final _dart_clock_gettime _clock_gettime =\n      _clock_gettime_ptr.asFunction<_dart_clock_gettime>();\n\n  int clock_settime(\n    int __clock_id,\n    ffi.Pointer<timespec> __tp,\n  ) {\n    return _clock_settime(\n      __clock_id,\n      __tp,\n    );\n  }\n\n  late final _clock_settime_ptr =\n      _lookup<ffi.NativeFunction<_c_clock_settime>>('clock_settime');\n  late final _dart_clock_settime _clock_settime =\n      _clock_settime_ptr.asFunction<_dart_clock_settime>();\n\n  int clock_nanosleep(\n    int __clock_id,\n    int __flags,\n    ffi.Pointer<timespec> __req,\n    ffi.Pointer<timespec> __rem,\n  ) {\n    return _clock_nanosleep(\n      __clock_id,\n      __flags,\n      __req,\n      __rem,\n    );\n  }\n\n  late final _clock_nanosleep_ptr =\n      _lookup<ffi.NativeFunction<_c_clock_nanosleep>>('clock_nanosleep');\n  late final _dart_clock_nanosleep _clock_nanosleep =\n      _clock_nanosleep_ptr.asFunction<_dart_clock_nanosleep>();\n\n  int clock_getcpuclockid(\n    int __pid,\n    ffi.Pointer<ffi.Int32> __clock_id,\n  ) {\n    return _clock_getcpuclockid(\n      __pid,\n      __clock_id,\n    );\n  }\n\n  late final _clock_getcpuclockid_ptr =\n      _lookup<ffi.NativeFunction<_c_clock_getcpuclockid>>(\n          'clock_getcpuclockid');\n  late final _dart_clock_getcpuclockid _clock_getcpuclockid =\n      _clock_getcpuclockid_ptr.asFunction<_dart_clock_getcpuclockid>();\n\n  int timer_create(\n    int __clock_id,\n    ffi.Pointer<sigevent> __evp,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> __timerid,\n  ) {\n    return _timer_create(\n      __clock_id,\n      __evp,\n      __timerid,\n    );\n  }\n\n  late final _timer_create_ptr =\n      _lookup<ffi.NativeFunction<_c_timer_create>>('timer_create');\n  late final _dart_timer_create _timer_create =\n      _timer_create_ptr.asFunction<_dart_timer_create>();\n\n  int timer_delete(\n    ffi.Pointer<ffi.Void> __timerid,\n  ) {\n    return _timer_delete(\n      __timerid,\n    );\n  }\n\n  late final _timer_delete_ptr =\n      _lookup<ffi.NativeFunction<_c_timer_delete>>('timer_delete');\n  late final _dart_timer_delete _timer_delete =\n      _timer_delete_ptr.asFunction<_dart_timer_delete>();\n\n  int timer_settime(\n    ffi.Pointer<ffi.Void> __timerid,\n    int __flags,\n    ffi.Pointer<itimerspec> __value,\n    ffi.Pointer<itimerspec> __ovalue,\n  ) {\n    return _timer_settime(\n      __timerid,\n      __flags,\n      __value,\n      __ovalue,\n    );\n  }\n\n  late final _timer_settime_ptr =\n      _lookup<ffi.NativeFunction<_c_timer_settime>>('timer_settime');\n  late final _dart_timer_settime _timer_settime =\n      _timer_settime_ptr.asFunction<_dart_timer_settime>();\n\n  int timer_gettime(\n    ffi.Pointer<ffi.Void> __timerid,\n    ffi.Pointer<itimerspec> __value,\n  ) {\n    return _timer_gettime(\n      __timerid,\n      __value,\n    );\n  }\n\n  late final _timer_gettime_ptr =\n      _lookup<ffi.NativeFunction<_c_timer_gettime>>('timer_gettime');\n  late final _dart_timer_gettime _timer_gettime =\n      _timer_gettime_ptr.asFunction<_dart_timer_gettime>();\n\n  int timer_getoverrun(\n    ffi.Pointer<ffi.Void> __timerid,\n  ) {\n    return _timer_getoverrun(\n      __timerid,\n    );\n  }\n\n  late final _timer_getoverrun_ptr =\n      _lookup<ffi.NativeFunction<_c_timer_getoverrun>>('timer_getoverrun');\n  late final _dart_timer_getoverrun _timer_getoverrun =\n      _timer_getoverrun_ptr.asFunction<_dart_timer_getoverrun>();\n\n  int timespec_get(\n    ffi.Pointer<timespec> __ts,\n    int __base,\n  ) {\n    return _timespec_get(\n      __ts,\n      __base,\n    );\n  }\n\n  late final _timespec_get_ptr =\n      _lookup<ffi.NativeFunction<_c_timespec_get>>('timespec_get');\n  late final _dart_timespec_get _timespec_get =\n      _timespec_get_ptr.asFunction<_dart_timespec_get>();\n\n  ffi.Pointer<ffi.Int8> snd_asoundlib_version() {\n    return _snd_asoundlib_version();\n  }\n\n  late final _snd_asoundlib_version_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_asoundlib_version>>(\n          'snd_asoundlib_version');\n  late final _dart_snd_asoundlib_version _snd_asoundlib_version =\n      _snd_asoundlib_version_ptr.asFunction<_dart_snd_asoundlib_version>();\n\n  late final ffi.Pointer<ffi.Pointer<snd_dlsym_link>> _snd_dlsym_start =\n      _lookup<ffi.Pointer<snd_dlsym_link>>('snd_dlsym_start');\n\n  ffi.Pointer<snd_dlsym_link> get snd_dlsym_start => _snd_dlsym_start.value;\n\n  set snd_dlsym_start(ffi.Pointer<snd_dlsym_link> value) =>\n      _snd_dlsym_start.value = value;\n\n  ffi.Pointer<ffi.Void> snd_dlopen(\n    ffi.Pointer<ffi.Int8> file,\n    int mode,\n    ffi.Pointer<ffi.Int8> errbuf,\n    int errbuflen,\n  ) {\n    return _snd_dlopen(\n      file,\n      mode,\n      errbuf,\n      errbuflen,\n    );\n  }\n\n  late final _snd_dlopen_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_dlopen>>('snd_dlopen');\n  late final _dart_snd_dlopen _snd_dlopen =\n      _snd_dlopen_ptr.asFunction<_dart_snd_dlopen>();\n\n  ffi.Pointer<ffi.Void> snd_dlsym(\n    ffi.Pointer<ffi.Void> handle,\n    ffi.Pointer<ffi.Int8> name,\n    ffi.Pointer<ffi.Int8> version,\n  ) {\n    return _snd_dlsym(\n      handle,\n      name,\n      version,\n    );\n  }\n\n  late final _snd_dlsym_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_dlsym>>('snd_dlsym');\n  late final _dart_snd_dlsym _snd_dlsym =\n      _snd_dlsym_ptr.asFunction<_dart_snd_dlsym>();\n\n  int snd_dlclose(\n    ffi.Pointer<ffi.Void> handle,\n  ) {\n    return _snd_dlclose(\n      handle,\n    );\n  }\n\n  late final _snd_dlclose_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_dlclose>>('snd_dlclose');\n  late final _dart_snd_dlclose _snd_dlclose =\n      _snd_dlclose_ptr.asFunction<_dart_snd_dlclose>();\n\n  int snd_async_add_handler(\n    ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n    int fd,\n    ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_async_add_handler(\n      handler,\n      fd,\n      callback,\n      private_data,\n    );\n  }\n\n  late final _snd_async_add_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_add_handler>>(\n          'snd_async_add_handler');\n  late final _dart_snd_async_add_handler _snd_async_add_handler =\n      _snd_async_add_handler_ptr.asFunction<_dart_snd_async_add_handler>();\n\n  int snd_async_del_handler(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_del_handler(\n      handler,\n    );\n  }\n\n  late final _snd_async_del_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_del_handler>>(\n          'snd_async_del_handler');\n  late final _dart_snd_async_del_handler _snd_async_del_handler =\n      _snd_async_del_handler_ptr.asFunction<_dart_snd_async_del_handler>();\n\n  int snd_async_handler_get_fd(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_fd(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_fd_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_fd>>(\n          'snd_async_handler_get_fd');\n  late final _dart_snd_async_handler_get_fd _snd_async_handler_get_fd =\n      _snd_async_handler_get_fd_ptr\n          .asFunction<_dart_snd_async_handler_get_fd>();\n\n  int snd_async_handler_get_signo(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_signo(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_signo_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_signo>>(\n          'snd_async_handler_get_signo');\n  late final _dart_snd_async_handler_get_signo _snd_async_handler_get_signo =\n      _snd_async_handler_get_signo_ptr\n          .asFunction<_dart_snd_async_handler_get_signo>();\n\n  ffi.Pointer<ffi.Void> snd_async_handler_get_callback_private(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_callback_private(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_callback_private>>(\n          'snd_async_handler_get_callback_private');\n  late final _dart_snd_async_handler_get_callback_private\n      _snd_async_handler_get_callback_private =\n      _snd_async_handler_get_callback_private_ptr\n          .asFunction<_dart_snd_async_handler_get_callback_private>();\n\n  ffi.Pointer<snd_shm_area> snd_shm_area_create(\n    int shmid,\n    ffi.Pointer<ffi.Void> ptr,\n  ) {\n    return _snd_shm_area_create(\n      shmid,\n      ptr,\n    );\n  }\n\n  late final _snd_shm_area_create_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_shm_area_create>>(\n          'snd_shm_area_create');\n  late final _dart_snd_shm_area_create _snd_shm_area_create =\n      _snd_shm_area_create_ptr.asFunction<_dart_snd_shm_area_create>();\n\n  ffi.Pointer<snd_shm_area> snd_shm_area_share(\n    ffi.Pointer<snd_shm_area> area,\n  ) {\n    return _snd_shm_area_share(\n      area,\n    );\n  }\n\n  late final _snd_shm_area_share_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_shm_area_share>>('snd_shm_area_share');\n  late final _dart_snd_shm_area_share _snd_shm_area_share =\n      _snd_shm_area_share_ptr.asFunction<_dart_snd_shm_area_share>();\n\n  int snd_shm_area_destroy(\n    ffi.Pointer<snd_shm_area> area,\n  ) {\n    return _snd_shm_area_destroy(\n      area,\n    );\n  }\n\n  late final _snd_shm_area_destroy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_shm_area_destroy>>(\n          'snd_shm_area_destroy');\n  late final _dart_snd_shm_area_destroy _snd_shm_area_destroy =\n      _snd_shm_area_destroy_ptr.asFunction<_dart_snd_shm_area_destroy>();\n\n  int snd_user_file(\n    ffi.Pointer<ffi.Int8> file,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> result,\n  ) {\n    return _snd_user_file(\n      file,\n      result,\n    );\n  }\n\n  late final _snd_user_file_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_user_file>>('snd_user_file');\n  late final _dart_snd_user_file _snd_user_file =\n      _snd_user_file_ptr.asFunction<_dart_snd_user_file>();\n\n  int snd_input_stdio_open(\n    ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n    ffi.Pointer<ffi.Int8> file,\n    ffi.Pointer<ffi.Int8> mode,\n  ) {\n    return _snd_input_stdio_open(\n      inputp,\n      file,\n      mode,\n    );\n  }\n\n  late final _snd_input_stdio_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_stdio_open>>(\n          'snd_input_stdio_open');\n  late final _dart_snd_input_stdio_open _snd_input_stdio_open =\n      _snd_input_stdio_open_ptr.asFunction<_dart_snd_input_stdio_open>();\n\n  int snd_input_stdio_attach(\n    ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n    ffi.Pointer<IO_FILE_> fp,\n    int _close,\n  ) {\n    return _snd_input_stdio_attach(\n      inputp,\n      fp,\n      _close,\n    );\n  }\n\n  late final _snd_input_stdio_attach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_stdio_attach>>(\n          'snd_input_stdio_attach');\n  late final _dart_snd_input_stdio_attach _snd_input_stdio_attach =\n      _snd_input_stdio_attach_ptr.asFunction<_dart_snd_input_stdio_attach>();\n\n  int snd_input_buffer_open(\n    ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n    ffi.Pointer<ffi.Int8> buffer,\n    int size,\n  ) {\n    return _snd_input_buffer_open(\n      inputp,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_input_buffer_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_buffer_open>>(\n          'snd_input_buffer_open');\n  late final _dart_snd_input_buffer_open _snd_input_buffer_open =\n      _snd_input_buffer_open_ptr.asFunction<_dart_snd_input_buffer_open>();\n\n  int snd_input_close(\n    ffi.Pointer<snd_input_> input,\n  ) {\n    return _snd_input_close(\n      input,\n    );\n  }\n\n  late final _snd_input_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_close>>('snd_input_close');\n  late final _dart_snd_input_close _snd_input_close =\n      _snd_input_close_ptr.asFunction<_dart_snd_input_close>();\n\n  int snd_input_scanf(\n    ffi.Pointer<snd_input_> input,\n    ffi.Pointer<ffi.Int8> format,\n  ) {\n    return _snd_input_scanf(\n      input,\n      format,\n    );\n  }\n\n  late final _snd_input_scanf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_scanf>>('snd_input_scanf');\n  late final _dart_snd_input_scanf _snd_input_scanf =\n      _snd_input_scanf_ptr.asFunction<_dart_snd_input_scanf>();\n\n  ffi.Pointer<ffi.Int8> snd_input_gets(\n    ffi.Pointer<snd_input_> input,\n    ffi.Pointer<ffi.Int8> str,\n    int size,\n  ) {\n    return _snd_input_gets(\n      input,\n      str,\n      size,\n    );\n  }\n\n  late final _snd_input_gets_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_gets>>('snd_input_gets');\n  late final _dart_snd_input_gets _snd_input_gets =\n      _snd_input_gets_ptr.asFunction<_dart_snd_input_gets>();\n\n  int snd_input_getc(\n    ffi.Pointer<snd_input_> input,\n  ) {\n    return _snd_input_getc(\n      input,\n    );\n  }\n\n  late final _snd_input_getc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_getc>>('snd_input_getc');\n  late final _dart_snd_input_getc _snd_input_getc =\n      _snd_input_getc_ptr.asFunction<_dart_snd_input_getc>();\n\n  int snd_input_ungetc(\n    ffi.Pointer<snd_input_> input,\n    int c,\n  ) {\n    return _snd_input_ungetc(\n      input,\n      c,\n    );\n  }\n\n  late final _snd_input_ungetc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_input_ungetc>>('snd_input_ungetc');\n  late final _dart_snd_input_ungetc _snd_input_ungetc =\n      _snd_input_ungetc_ptr.asFunction<_dart_snd_input_ungetc>();\n\n  int snd_output_stdio_open(\n    ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n    ffi.Pointer<ffi.Int8> file,\n    ffi.Pointer<ffi.Int8> mode,\n  ) {\n    return _snd_output_stdio_open(\n      outputp,\n      file,\n      mode,\n    );\n  }\n\n  late final _snd_output_stdio_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_stdio_open>>(\n          'snd_output_stdio_open');\n  late final _dart_snd_output_stdio_open _snd_output_stdio_open =\n      _snd_output_stdio_open_ptr.asFunction<_dart_snd_output_stdio_open>();\n\n  int snd_output_stdio_attach(\n    ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n    ffi.Pointer<IO_FILE_> fp,\n    int _close,\n  ) {\n    return _snd_output_stdio_attach(\n      outputp,\n      fp,\n      _close,\n    );\n  }\n\n  late final _snd_output_stdio_attach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_stdio_attach>>(\n          'snd_output_stdio_attach');\n  late final _dart_snd_output_stdio_attach _snd_output_stdio_attach =\n      _snd_output_stdio_attach_ptr.asFunction<_dart_snd_output_stdio_attach>();\n\n  int snd_output_buffer_open(\n    ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n  ) {\n    return _snd_output_buffer_open(\n      outputp,\n    );\n  }\n\n  late final _snd_output_buffer_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_buffer_open>>(\n          'snd_output_buffer_open');\n  late final _dart_snd_output_buffer_open _snd_output_buffer_open =\n      _snd_output_buffer_open_ptr.asFunction<_dart_snd_output_buffer_open>();\n\n  int snd_output_buffer_string(\n    ffi.Pointer<snd_output_> output,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> buf,\n  ) {\n    return _snd_output_buffer_string(\n      output,\n      buf,\n    );\n  }\n\n  late final _snd_output_buffer_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_buffer_string>>(\n          'snd_output_buffer_string');\n  late final _dart_snd_output_buffer_string _snd_output_buffer_string =\n      _snd_output_buffer_string_ptr\n          .asFunction<_dart_snd_output_buffer_string>();\n\n  int snd_output_close(\n    ffi.Pointer<snd_output_> output,\n  ) {\n    return _snd_output_close(\n      output,\n    );\n  }\n\n  late final _snd_output_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_close>>('snd_output_close');\n  late final _dart_snd_output_close _snd_output_close =\n      _snd_output_close_ptr.asFunction<_dart_snd_output_close>();\n\n  int snd_output_printf(\n    ffi.Pointer<snd_output_> output,\n    ffi.Pointer<ffi.Int8> format,\n  ) {\n    return _snd_output_printf(\n      output,\n      format,\n    );\n  }\n\n  late final _snd_output_printf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_printf>>('snd_output_printf');\n  late final _dart_snd_output_printf _snd_output_printf =\n      _snd_output_printf_ptr.asFunction<_dart_snd_output_printf>();\n\n  int snd_output_vprintf(\n    ffi.Pointer<snd_output_> output,\n    ffi.Pointer<ffi.Int8> format,\n    ffi.Pointer<_va_list_tag_> args,\n  ) {\n    return _snd_output_vprintf(\n      output,\n      format,\n      args,\n    );\n  }\n\n  late final _snd_output_vprintf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_vprintf>>('snd_output_vprintf');\n  late final _dart_snd_output_vprintf _snd_output_vprintf =\n      _snd_output_vprintf_ptr.asFunction<_dart_snd_output_vprintf>();\n\n  int snd_output_puts(\n    ffi.Pointer<snd_output_> output,\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_output_puts(\n      output,\n      str,\n    );\n  }\n\n  late final _snd_output_puts_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_puts>>('snd_output_puts');\n  late final _dart_snd_output_puts _snd_output_puts =\n      _snd_output_puts_ptr.asFunction<_dart_snd_output_puts>();\n\n  int snd_output_putc(\n    ffi.Pointer<snd_output_> output,\n    int c,\n  ) {\n    return _snd_output_putc(\n      output,\n      c,\n    );\n  }\n\n  late final _snd_output_putc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_putc>>('snd_output_putc');\n  late final _dart_snd_output_putc _snd_output_putc =\n      _snd_output_putc_ptr.asFunction<_dart_snd_output_putc>();\n\n  int snd_output_flush(\n    ffi.Pointer<snd_output_> output,\n  ) {\n    return _snd_output_flush(\n      output,\n    );\n  }\n\n  late final _snd_output_flush_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_output_flush>>('snd_output_flush');\n  late final _dart_snd_output_flush _snd_output_flush =\n      _snd_output_flush_ptr.asFunction<_dart_snd_output_flush>();\n\n  ffi.Pointer<ffi.Int8> snd_strerror(\n    int errnum,\n  ) {\n    return _snd_strerror(\n      errnum,\n    );\n  }\n\n  late final _snd_strerror_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_strerror>>('snd_strerror');\n  late final _dart_snd_strerror _snd_strerror =\n      _snd_strerror_ptr.asFunction<_dart_snd_strerror>();\n\n  late final ffi\n          .Pointer<ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>>>\n      _snd_lib_error =\n      _lookup<ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>>>(\n          'snd_lib_error');\n\n  ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>> get snd_lib_error =>\n      _snd_lib_error.value;\n\n  set snd_lib_error(\n          ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>> value) =>\n      _snd_lib_error.value = value;\n\n  int snd_lib_error_set_handler(\n    ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>> handler,\n  ) {\n    return _snd_lib_error_set_handler(\n      handler,\n    );\n  }\n\n  late final _snd_lib_error_set_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_lib_error_set_handler>>(\n          'snd_lib_error_set_handler');\n  late final _dart_snd_lib_error_set_handler _snd_lib_error_set_handler =\n      _snd_lib_error_set_handler_ptr\n          .asFunction<_dart_snd_lib_error_set_handler>();\n\n  ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>>\n      snd_lib_error_set_local(\n    ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>> func,\n  ) {\n    return _snd_lib_error_set_local(\n      func,\n    );\n  }\n\n  late final _snd_lib_error_set_local_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_lib_error_set_local>>(\n          'snd_lib_error_set_local');\n  late final _dart_snd_lib_error_set_local _snd_lib_error_set_local =\n      _snd_lib_error_set_local_ptr.asFunction<_dart_snd_lib_error_set_local>();\n\n  late final ffi.Pointer<ffi.Pointer<snd_config_>> _snd_config =\n      _lookup<ffi.Pointer<snd_config_>>('snd_config');\n\n  ffi.Pointer<snd_config_> get snd_config => _snd_config.value;\n\n  set snd_config(ffi.Pointer<snd_config_> value) => _snd_config.value = value;\n\n  ffi.Pointer<ffi.Int8> snd_config_topdir() {\n    return _snd_config_topdir();\n  }\n\n  late final _snd_config_topdir_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_topdir>>('snd_config_topdir');\n  late final _dart_snd_config_topdir _snd_config_topdir =\n      _snd_config_topdir_ptr.asFunction<_dart_snd_config_topdir>();\n\n  int snd_config_top(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ) {\n    return _snd_config_top(\n      config,\n    );\n  }\n\n  late final _snd_config_top_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_top>>('snd_config_top');\n  late final _dart_snd_config_top _snd_config_top =\n      _snd_config_top_ptr.asFunction<_dart_snd_config_top>();\n\n  int snd_config_load(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_input_> in_1,\n  ) {\n    return _snd_config_load(\n      config,\n      in_1,\n    );\n  }\n\n  late final _snd_config_load_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_load>>('snd_config_load');\n  late final _dart_snd_config_load _snd_config_load =\n      _snd_config_load_ptr.asFunction<_dart_snd_config_load>();\n\n  int snd_config_load_override(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_input_> in_1,\n  ) {\n    return _snd_config_load_override(\n      config,\n      in_1,\n    );\n  }\n\n  late final _snd_config_load_override_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_load_override>>(\n          'snd_config_load_override');\n  late final _dart_snd_config_load_override _snd_config_load_override =\n      _snd_config_load_override_ptr\n          .asFunction<_dart_snd_config_load_override>();\n\n  int snd_config_save(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_config_save(\n      config,\n      out,\n    );\n  }\n\n  late final _snd_config_save_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_save>>('snd_config_save');\n  late final _dart_snd_config_save _snd_config_save =\n      _snd_config_save_ptr.asFunction<_dart_snd_config_save>();\n\n  int snd_config_update() {\n    return _snd_config_update();\n  }\n\n  late final _snd_config_update_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_update>>('snd_config_update');\n  late final _dart_snd_config_update _snd_config_update =\n      _snd_config_update_ptr.asFunction<_dart_snd_config_update>();\n\n  int snd_config_update_r(\n    ffi.Pointer<ffi.Pointer<snd_config_>> top,\n    ffi.Pointer<ffi.Pointer<snd_config_update_>> update,\n    ffi.Pointer<ffi.Int8> path,\n  ) {\n    return _snd_config_update_r(\n      top,\n      update,\n      path,\n    );\n  }\n\n  late final _snd_config_update_r_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_update_r>>(\n          'snd_config_update_r');\n  late final _dart_snd_config_update_r _snd_config_update_r =\n      _snd_config_update_r_ptr.asFunction<_dart_snd_config_update_r>();\n\n  int snd_config_update_free(\n    ffi.Pointer<snd_config_update_> update,\n  ) {\n    return _snd_config_update_free(\n      update,\n    );\n  }\n\n  late final _snd_config_update_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_update_free>>(\n          'snd_config_update_free');\n  late final _dart_snd_config_update_free _snd_config_update_free =\n      _snd_config_update_free_ptr.asFunction<_dart_snd_config_update_free>();\n\n  int snd_config_update_free_global() {\n    return _snd_config_update_free_global();\n  }\n\n  late final _snd_config_update_free_global_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_update_free_global>>(\n          'snd_config_update_free_global');\n  late final _dart_snd_config_update_free_global\n      _snd_config_update_free_global = _snd_config_update_free_global_ptr\n          .asFunction<_dart_snd_config_update_free_global>();\n\n  int snd_config_update_ref(\n    ffi.Pointer<ffi.Pointer<snd_config_>> top,\n  ) {\n    return _snd_config_update_ref(\n      top,\n    );\n  }\n\n  late final _snd_config_update_ref_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_update_ref>>(\n          'snd_config_update_ref');\n  late final _dart_snd_config_update_ref _snd_config_update_ref =\n      _snd_config_update_ref_ptr.asFunction<_dart_snd_config_update_ref>();\n\n  void snd_config_ref(\n    ffi.Pointer<snd_config_> top,\n  ) {\n    return _snd_config_ref(\n      top,\n    );\n  }\n\n  late final _snd_config_ref_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_ref>>('snd_config_ref');\n  late final _dart_snd_config_ref _snd_config_ref =\n      _snd_config_ref_ptr.asFunction<_dart_snd_config_ref>();\n\n  void snd_config_unref(\n    ffi.Pointer<snd_config_> top,\n  ) {\n    return _snd_config_unref(\n      top,\n    );\n  }\n\n  late final _snd_config_unref_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_unref>>('snd_config_unref');\n  late final _dart_snd_config_unref _snd_config_unref =\n      _snd_config_unref_ptr.asFunction<_dart_snd_config_unref>();\n\n  int snd_config_search(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> key,\n    ffi.Pointer<ffi.Pointer<snd_config_>> result,\n  ) {\n    return _snd_config_search(\n      config,\n      key,\n      result,\n    );\n  }\n\n  late final _snd_config_search_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_search>>('snd_config_search');\n  late final _dart_snd_config_search _snd_config_search =\n      _snd_config_search_ptr.asFunction<_dart_snd_config_search>();\n\n  int snd_config_searchv(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Pointer<snd_config_>> result,\n  ) {\n    return _snd_config_searchv(\n      config,\n      result,\n    );\n  }\n\n  late final _snd_config_searchv_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_searchv>>('snd_config_searchv');\n  late final _dart_snd_config_searchv _snd_config_searchv =\n      _snd_config_searchv_ptr.asFunction<_dart_snd_config_searchv>();\n\n  int snd_config_search_definition(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> base,\n    ffi.Pointer<ffi.Int8> key,\n    ffi.Pointer<ffi.Pointer<snd_config_>> result,\n  ) {\n    return _snd_config_search_definition(\n      config,\n      base,\n      key,\n      result,\n    );\n  }\n\n  late final _snd_config_search_definition_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_search_definition>>(\n          'snd_config_search_definition');\n  late final _dart_snd_config_search_definition _snd_config_search_definition =\n      _snd_config_search_definition_ptr\n          .asFunction<_dart_snd_config_search_definition>();\n\n  int snd_config_expand(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_config_> root,\n    ffi.Pointer<ffi.Int8> args,\n    ffi.Pointer<snd_config_> private_data,\n    ffi.Pointer<ffi.Pointer<snd_config_>> result,\n  ) {\n    return _snd_config_expand(\n      config,\n      root,\n      args,\n      private_data,\n      result,\n    );\n  }\n\n  late final _snd_config_expand_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_expand>>('snd_config_expand');\n  late final _dart_snd_config_expand _snd_config_expand =\n      _snd_config_expand_ptr.asFunction<_dart_snd_config_expand>();\n\n  int snd_config_evaluate(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_config_> root,\n    ffi.Pointer<snd_config_> private_data,\n    ffi.Pointer<ffi.Pointer<snd_config_>> result,\n  ) {\n    return _snd_config_evaluate(\n      config,\n      root,\n      private_data,\n      result,\n    );\n  }\n\n  late final _snd_config_evaluate_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_evaluate>>(\n          'snd_config_evaluate');\n  late final _dart_snd_config_evaluate _snd_config_evaluate =\n      _snd_config_evaluate_ptr.asFunction<_dart_snd_config_evaluate>();\n\n  int snd_config_add(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_config_> child,\n  ) {\n    return _snd_config_add(\n      config,\n      child,\n    );\n  }\n\n  late final _snd_config_add_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_add>>('snd_config_add');\n  late final _dart_snd_config_add _snd_config_add =\n      _snd_config_add_ptr.asFunction<_dart_snd_config_add>();\n\n  int snd_config_add_before(\n    ffi.Pointer<snd_config_> before,\n    ffi.Pointer<snd_config_> child,\n  ) {\n    return _snd_config_add_before(\n      before,\n      child,\n    );\n  }\n\n  late final _snd_config_add_before_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_add_before>>(\n          'snd_config_add_before');\n  late final _dart_snd_config_add_before _snd_config_add_before =\n      _snd_config_add_before_ptr.asFunction<_dart_snd_config_add_before>();\n\n  int snd_config_add_after(\n    ffi.Pointer<snd_config_> after,\n    ffi.Pointer<snd_config_> child,\n  ) {\n    return _snd_config_add_after(\n      after,\n      child,\n    );\n  }\n\n  late final _snd_config_add_after_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_add_after>>(\n          'snd_config_add_after');\n  late final _dart_snd_config_add_after _snd_config_add_after =\n      _snd_config_add_after_ptr.asFunction<_dart_snd_config_add_after>();\n\n  int snd_config_remove(\n    ffi.Pointer<snd_config_> config,\n  ) {\n    return _snd_config_remove(\n      config,\n    );\n  }\n\n  late final _snd_config_remove_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_remove>>('snd_config_remove');\n  late final _dart_snd_config_remove _snd_config_remove =\n      _snd_config_remove_ptr.asFunction<_dart_snd_config_remove>();\n\n  int snd_config_delete(\n    ffi.Pointer<snd_config_> config,\n  ) {\n    return _snd_config_delete(\n      config,\n    );\n  }\n\n  late final _snd_config_delete_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_delete>>('snd_config_delete');\n  late final _dart_snd_config_delete _snd_config_delete =\n      _snd_config_delete_ptr.asFunction<_dart_snd_config_delete>();\n\n  int snd_config_delete_compound_members(\n    ffi.Pointer<snd_config_> config,\n  ) {\n    return _snd_config_delete_compound_members(\n      config,\n    );\n  }\n\n  late final _snd_config_delete_compound_members_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_delete_compound_members>>(\n          'snd_config_delete_compound_members');\n  late final _dart_snd_config_delete_compound_members\n      _snd_config_delete_compound_members =\n      _snd_config_delete_compound_members_ptr\n          .asFunction<_dart_snd_config_delete_compound_members>();\n\n  int snd_config_copy(\n    ffi.Pointer<ffi.Pointer<snd_config_>> dst,\n    ffi.Pointer<snd_config_> src,\n  ) {\n    return _snd_config_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_config_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_copy>>('snd_config_copy');\n  late final _dart_snd_config_copy _snd_config_copy =\n      _snd_config_copy_ptr.asFunction<_dart_snd_config_copy>();\n\n  int snd_config_make(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    int type,\n  ) {\n    return _snd_config_make(\n      config,\n      key,\n      type,\n    );\n  }\n\n  late final _snd_config_make_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make>>('snd_config_make');\n  late final _dart_snd_config_make _snd_config_make =\n      _snd_config_make_ptr.asFunction<_dart_snd_config_make>();\n\n  int snd_config_make_integer(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n  ) {\n    return _snd_config_make_integer(\n      config,\n      key,\n    );\n  }\n\n  late final _snd_config_make_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_integer>>(\n          'snd_config_make_integer');\n  late final _dart_snd_config_make_integer _snd_config_make_integer =\n      _snd_config_make_integer_ptr.asFunction<_dart_snd_config_make_integer>();\n\n  int snd_config_make_integer64(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n  ) {\n    return _snd_config_make_integer64(\n      config,\n      key,\n    );\n  }\n\n  late final _snd_config_make_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_integer64>>(\n          'snd_config_make_integer64');\n  late final _dart_snd_config_make_integer64 _snd_config_make_integer64 =\n      _snd_config_make_integer64_ptr\n          .asFunction<_dart_snd_config_make_integer64>();\n\n  int snd_config_make_real(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n  ) {\n    return _snd_config_make_real(\n      config,\n      key,\n    );\n  }\n\n  late final _snd_config_make_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_real>>(\n          'snd_config_make_real');\n  late final _dart_snd_config_make_real _snd_config_make_real =\n      _snd_config_make_real_ptr.asFunction<_dart_snd_config_make_real>();\n\n  int snd_config_make_string(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n  ) {\n    return _snd_config_make_string(\n      config,\n      key,\n    );\n  }\n\n  late final _snd_config_make_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_string>>(\n          'snd_config_make_string');\n  late final _dart_snd_config_make_string _snd_config_make_string =\n      _snd_config_make_string_ptr.asFunction<_dart_snd_config_make_string>();\n\n  int snd_config_make_pointer(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n  ) {\n    return _snd_config_make_pointer(\n      config,\n      key,\n    );\n  }\n\n  late final _snd_config_make_pointer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_pointer>>(\n          'snd_config_make_pointer');\n  late final _dart_snd_config_make_pointer _snd_config_make_pointer =\n      _snd_config_make_pointer_ptr.asFunction<_dart_snd_config_make_pointer>();\n\n  int snd_config_make_compound(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    int join,\n  ) {\n    return _snd_config_make_compound(\n      config,\n      key,\n      join,\n    );\n  }\n\n  late final _snd_config_make_compound_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_make_compound>>(\n          'snd_config_make_compound');\n  late final _dart_snd_config_make_compound _snd_config_make_compound =\n      _snd_config_make_compound_ptr\n          .asFunction<_dart_snd_config_make_compound>();\n\n  int snd_config_imake_integer(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    int value,\n  ) {\n    return _snd_config_imake_integer(\n      config,\n      key,\n      value,\n    );\n  }\n\n  late final _snd_config_imake_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_integer>>(\n          'snd_config_imake_integer');\n  late final _dart_snd_config_imake_integer _snd_config_imake_integer =\n      _snd_config_imake_integer_ptr\n          .asFunction<_dart_snd_config_imake_integer>();\n\n  int snd_config_imake_integer64(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    int value,\n  ) {\n    return _snd_config_imake_integer64(\n      config,\n      key,\n      value,\n    );\n  }\n\n  late final _snd_config_imake_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_integer64>>(\n          'snd_config_imake_integer64');\n  late final _dart_snd_config_imake_integer64 _snd_config_imake_integer64 =\n      _snd_config_imake_integer64_ptr\n          .asFunction<_dart_snd_config_imake_integer64>();\n\n  int snd_config_imake_real(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    double value,\n  ) {\n    return _snd_config_imake_real(\n      config,\n      key,\n      value,\n    );\n  }\n\n  late final _snd_config_imake_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_real>>(\n          'snd_config_imake_real');\n  late final _dart_snd_config_imake_real _snd_config_imake_real =\n      _snd_config_imake_real_ptr.asFunction<_dart_snd_config_imake_real>();\n\n  int snd_config_imake_string(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    ffi.Pointer<ffi.Int8> ascii,\n  ) {\n    return _snd_config_imake_string(\n      config,\n      key,\n      ascii,\n    );\n  }\n\n  late final _snd_config_imake_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_string>>(\n          'snd_config_imake_string');\n  late final _dart_snd_config_imake_string _snd_config_imake_string =\n      _snd_config_imake_string_ptr.asFunction<_dart_snd_config_imake_string>();\n\n  int snd_config_imake_safe_string(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    ffi.Pointer<ffi.Int8> ascii,\n  ) {\n    return _snd_config_imake_safe_string(\n      config,\n      key,\n      ascii,\n    );\n  }\n\n  late final _snd_config_imake_safe_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_safe_string>>(\n          'snd_config_imake_safe_string');\n  late final _dart_snd_config_imake_safe_string _snd_config_imake_safe_string =\n      _snd_config_imake_safe_string_ptr\n          .asFunction<_dart_snd_config_imake_safe_string>();\n\n  int snd_config_imake_pointer(\n    ffi.Pointer<ffi.Pointer<snd_config_>> config,\n    ffi.Pointer<ffi.Int8> key,\n    ffi.Pointer<ffi.Void> ptr,\n  ) {\n    return _snd_config_imake_pointer(\n      config,\n      key,\n      ptr,\n    );\n  }\n\n  late final _snd_config_imake_pointer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_imake_pointer>>(\n          'snd_config_imake_pointer');\n  late final _dart_snd_config_imake_pointer _snd_config_imake_pointer =\n      _snd_config_imake_pointer_ptr\n          .asFunction<_dart_snd_config_imake_pointer>();\n\n  int snd_config_get_type(\n    ffi.Pointer<snd_config_> config,\n  ) {\n    return _snd_config_get_type(\n      config,\n    );\n  }\n\n  late final _snd_config_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_type>>(\n          'snd_config_get_type');\n  late final _dart_snd_config_get_type _snd_config_get_type =\n      _snd_config_get_type_ptr.asFunction<_dart_snd_config_get_type>();\n\n  int snd_config_is_array(\n    ffi.Pointer<snd_config_> config,\n  ) {\n    return _snd_config_is_array(\n      config,\n    );\n  }\n\n  late final _snd_config_is_array_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_is_array>>(\n          'snd_config_is_array');\n  late final _dart_snd_config_is_array _snd_config_is_array =\n      _snd_config_is_array_ptr.asFunction<_dart_snd_config_is_array>();\n\n  int snd_config_set_id(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> id,\n  ) {\n    return _snd_config_set_id(\n      config,\n      id,\n    );\n  }\n\n  late final _snd_config_set_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_id>>('snd_config_set_id');\n  late final _dart_snd_config_set_id _snd_config_set_id =\n      _snd_config_set_id_ptr.asFunction<_dart_snd_config_set_id>();\n\n  int snd_config_set_integer(\n    ffi.Pointer<snd_config_> config,\n    int value,\n  ) {\n    return _snd_config_set_integer(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_set_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_integer>>(\n          'snd_config_set_integer');\n  late final _dart_snd_config_set_integer _snd_config_set_integer =\n      _snd_config_set_integer_ptr.asFunction<_dart_snd_config_set_integer>();\n\n  int snd_config_set_integer64(\n    ffi.Pointer<snd_config_> config,\n    int value,\n  ) {\n    return _snd_config_set_integer64(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_set_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_integer64>>(\n          'snd_config_set_integer64');\n  late final _dart_snd_config_set_integer64 _snd_config_set_integer64 =\n      _snd_config_set_integer64_ptr\n          .asFunction<_dart_snd_config_set_integer64>();\n\n  int snd_config_set_real(\n    ffi.Pointer<snd_config_> config,\n    double value,\n  ) {\n    return _snd_config_set_real(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_set_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_real>>(\n          'snd_config_set_real');\n  late final _dart_snd_config_set_real _snd_config_set_real =\n      _snd_config_set_real_ptr.asFunction<_dart_snd_config_set_real>();\n\n  int snd_config_set_string(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> value,\n  ) {\n    return _snd_config_set_string(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_set_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_string>>(\n          'snd_config_set_string');\n  late final _dart_snd_config_set_string _snd_config_set_string =\n      _snd_config_set_string_ptr.asFunction<_dart_snd_config_set_string>();\n\n  int snd_config_set_ascii(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> ascii,\n  ) {\n    return _snd_config_set_ascii(\n      config,\n      ascii,\n    );\n  }\n\n  late final _snd_config_set_ascii_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_ascii>>(\n          'snd_config_set_ascii');\n  late final _dart_snd_config_set_ascii _snd_config_set_ascii =\n      _snd_config_set_ascii_ptr.asFunction<_dart_snd_config_set_ascii>();\n\n  int snd_config_set_pointer(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Void> ptr,\n  ) {\n    return _snd_config_set_pointer(\n      config,\n      ptr,\n    );\n  }\n\n  late final _snd_config_set_pointer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_set_pointer>>(\n          'snd_config_set_pointer');\n  late final _dart_snd_config_set_pointer _snd_config_set_pointer =\n      _snd_config_set_pointer_ptr.asFunction<_dart_snd_config_set_pointer>();\n\n  int snd_config_get_id(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n  ) {\n    return _snd_config_get_id(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_id>>('snd_config_get_id');\n  late final _dart_snd_config_get_id _snd_config_get_id =\n      _snd_config_get_id_ptr.asFunction<_dart_snd_config_get_id>();\n\n  int snd_config_get_integer(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_config_get_integer(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_integer>>(\n          'snd_config_get_integer');\n  late final _dart_snd_config_get_integer _snd_config_get_integer =\n      _snd_config_get_integer_ptr.asFunction<_dart_snd_config_get_integer>();\n\n  int snd_config_get_integer64(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_config_get_integer64(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_integer64>>(\n          'snd_config_get_integer64');\n  late final _dart_snd_config_get_integer64 _snd_config_get_integer64 =\n      _snd_config_get_integer64_ptr\n          .asFunction<_dart_snd_config_get_integer64>();\n\n  int snd_config_get_real(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Double> value,\n  ) {\n    return _snd_config_get_real(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_real>>(\n          'snd_config_get_real');\n  late final _dart_snd_config_get_real _snd_config_get_real =\n      _snd_config_get_real_ptr.asFunction<_dart_snd_config_get_real>();\n\n  int snd_config_get_ireal(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Double> value,\n  ) {\n    return _snd_config_get_ireal(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_ireal_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_ireal>>(\n          'snd_config_get_ireal');\n  late final _dart_snd_config_get_ireal _snd_config_get_ireal =\n      _snd_config_get_ireal_ptr.asFunction<_dart_snd_config_get_ireal>();\n\n  int snd_config_get_string(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n  ) {\n    return _snd_config_get_string(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_string>>(\n          'snd_config_get_string');\n  late final _dart_snd_config_get_string _snd_config_get_string =\n      _snd_config_get_string_ptr.asFunction<_dart_snd_config_get_string>();\n\n  int snd_config_get_ascii(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n  ) {\n    return _snd_config_get_ascii(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_ascii_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_ascii>>(\n          'snd_config_get_ascii');\n  late final _dart_snd_config_get_ascii _snd_config_get_ascii =\n      _snd_config_get_ascii_ptr.asFunction<_dart_snd_config_get_ascii>();\n\n  int snd_config_get_pointer(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> value,\n  ) {\n    return _snd_config_get_pointer(\n      config,\n      value,\n    );\n  }\n\n  late final _snd_config_get_pointer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_pointer>>(\n          'snd_config_get_pointer');\n  late final _dart_snd_config_get_pointer _snd_config_get_pointer =\n      _snd_config_get_pointer_ptr.asFunction<_dart_snd_config_get_pointer>();\n\n  int snd_config_test_id(\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<ffi.Int8> id,\n  ) {\n    return _snd_config_test_id(\n      config,\n      id,\n    );\n  }\n\n  late final _snd_config_test_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_test_id>>('snd_config_test_id');\n  late final _dart_snd_config_test_id _snd_config_test_id =\n      _snd_config_test_id_ptr.asFunction<_dart_snd_config_test_id>();\n\n  ffi.Pointer<snd_config_iterator_> snd_config_iterator_first(\n    ffi.Pointer<snd_config_> node,\n  ) {\n    return _snd_config_iterator_first(\n      node,\n    );\n  }\n\n  late final _snd_config_iterator_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_iterator_first>>(\n          'snd_config_iterator_first');\n  late final _dart_snd_config_iterator_first _snd_config_iterator_first =\n      _snd_config_iterator_first_ptr\n          .asFunction<_dart_snd_config_iterator_first>();\n\n  ffi.Pointer<snd_config_iterator_> snd_config_iterator_next(\n    ffi.Pointer<snd_config_iterator_> iterator,\n  ) {\n    return _snd_config_iterator_next(\n      iterator,\n    );\n  }\n\n  late final _snd_config_iterator_next_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_iterator_next>>(\n          'snd_config_iterator_next');\n  late final _dart_snd_config_iterator_next _snd_config_iterator_next =\n      _snd_config_iterator_next_ptr\n          .asFunction<_dart_snd_config_iterator_next>();\n\n  ffi.Pointer<snd_config_iterator_> snd_config_iterator_end(\n    ffi.Pointer<snd_config_> node,\n  ) {\n    return _snd_config_iterator_end(\n      node,\n    );\n  }\n\n  late final _snd_config_iterator_end_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_iterator_end>>(\n          'snd_config_iterator_end');\n  late final _dart_snd_config_iterator_end _snd_config_iterator_end =\n      _snd_config_iterator_end_ptr.asFunction<_dart_snd_config_iterator_end>();\n\n  ffi.Pointer<snd_config_> snd_config_iterator_entry(\n    ffi.Pointer<snd_config_iterator_> iterator,\n  ) {\n    return _snd_config_iterator_entry(\n      iterator,\n    );\n  }\n\n  late final _snd_config_iterator_entry_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_iterator_entry>>(\n          'snd_config_iterator_entry');\n  late final _dart_snd_config_iterator_entry _snd_config_iterator_entry =\n      _snd_config_iterator_entry_ptr\n          .asFunction<_dart_snd_config_iterator_entry>();\n\n  int snd_config_get_bool_ascii(\n    ffi.Pointer<ffi.Int8> ascii,\n  ) {\n    return _snd_config_get_bool_ascii(\n      ascii,\n    );\n  }\n\n  late final _snd_config_get_bool_ascii_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_bool_ascii>>(\n          'snd_config_get_bool_ascii');\n  late final _dart_snd_config_get_bool_ascii _snd_config_get_bool_ascii =\n      _snd_config_get_bool_ascii_ptr\n          .asFunction<_dart_snd_config_get_bool_ascii>();\n\n  int snd_config_get_bool(\n    ffi.Pointer<snd_config_> conf,\n  ) {\n    return _snd_config_get_bool(\n      conf,\n    );\n  }\n\n  late final _snd_config_get_bool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_bool>>(\n          'snd_config_get_bool');\n  late final _dart_snd_config_get_bool _snd_config_get_bool =\n      _snd_config_get_bool_ptr.asFunction<_dart_snd_config_get_bool>();\n\n  int snd_config_get_ctl_iface_ascii(\n    ffi.Pointer<ffi.Int8> ascii,\n  ) {\n    return _snd_config_get_ctl_iface_ascii(\n      ascii,\n    );\n  }\n\n  late final _snd_config_get_ctl_iface_ascii_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_ctl_iface_ascii>>(\n          'snd_config_get_ctl_iface_ascii');\n  late final _dart_snd_config_get_ctl_iface_ascii\n      _snd_config_get_ctl_iface_ascii = _snd_config_get_ctl_iface_ascii_ptr\n          .asFunction<_dart_snd_config_get_ctl_iface_ascii>();\n\n  int snd_config_get_ctl_iface(\n    ffi.Pointer<snd_config_> conf,\n  ) {\n    return _snd_config_get_ctl_iface(\n      conf,\n    );\n  }\n\n  late final _snd_config_get_ctl_iface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_config_get_ctl_iface>>(\n          'snd_config_get_ctl_iface');\n  late final _dart_snd_config_get_ctl_iface _snd_config_get_ctl_iface =\n      _snd_config_get_ctl_iface_ptr\n          .asFunction<_dart_snd_config_get_ctl_iface>();\n\n  int snd_names_list(\n    ffi.Pointer<ffi.Int8> iface,\n    ffi.Pointer<ffi.Pointer<snd_devname>> list,\n  ) {\n    return _snd_names_list(\n      iface,\n      list,\n    );\n  }\n\n  late final _snd_names_list_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_names_list>>('snd_names_list');\n  late final _dart_snd_names_list _snd_names_list =\n      _snd_names_list_ptr.asFunction<_dart_snd_names_list>();\n\n  void snd_names_list_free(\n    ffi.Pointer<snd_devname> list,\n  ) {\n    return _snd_names_list_free(\n      list,\n    );\n  }\n\n  late final _snd_names_list_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_names_list_free>>(\n          'snd_names_list_free');\n  late final _dart_snd_names_list_free _snd_names_list_free =\n      _snd_names_list_free_ptr.asFunction<_dart_snd_names_list_free>();\n\n  int snd_pcm_open(\n    ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n    ffi.Pointer<ffi.Int8> name,\n    int stream,\n    int mode,\n  ) {\n    return _snd_pcm_open(\n      pcm,\n      name,\n      stream,\n      mode,\n    );\n  }\n\n  late final _snd_pcm_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_open>>('snd_pcm_open');\n  late final _dart_snd_pcm_open _snd_pcm_open =\n      _snd_pcm_open_ptr.asFunction<_dart_snd_pcm_open>();\n\n  int snd_pcm_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n    ffi.Pointer<ffi.Int8> name,\n    int stream,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_pcm_open_lconf(\n      pcm,\n      name,\n      stream,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_pcm_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_open_lconf>>('snd_pcm_open_lconf');\n  late final _dart_snd_pcm_open_lconf _snd_pcm_open_lconf =\n      _snd_pcm_open_lconf_ptr.asFunction<_dart_snd_pcm_open_lconf>();\n\n  int snd_pcm_open_fallback(\n    ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n    ffi.Pointer<snd_config_> root,\n    ffi.Pointer<ffi.Int8> name,\n    ffi.Pointer<ffi.Int8> orig_name,\n    int stream,\n    int mode,\n  ) {\n    return _snd_pcm_open_fallback(\n      pcm,\n      root,\n      name,\n      orig_name,\n      stream,\n      mode,\n    );\n  }\n\n  late final _snd_pcm_open_fallback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_open_fallback>>(\n          'snd_pcm_open_fallback');\n  late final _dart_snd_pcm_open_fallback _snd_pcm_open_fallback =\n      _snd_pcm_open_fallback_ptr.asFunction<_dart_snd_pcm_open_fallback>();\n\n  int snd_pcm_close(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_close(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_close>>('snd_pcm_close');\n  late final _dart_snd_pcm_close _snd_pcm_close =\n      _snd_pcm_close_ptr.asFunction<_dart_snd_pcm_close>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_name(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_name(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_name>>('snd_pcm_name');\n  late final _dart_snd_pcm_name _snd_pcm_name =\n      _snd_pcm_name_ptr.asFunction<_dart_snd_pcm_name>();\n\n  int snd_pcm_type(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_type(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_type>>('snd_pcm_type');\n  late final _dart_snd_pcm_type _snd_pcm_type =\n      _snd_pcm_type_ptr.asFunction<_dart_snd_pcm_type>();\n\n  int snd_pcm_stream(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_stream(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_stream>>('snd_pcm_stream');\n  late final _dart_snd_pcm_stream _snd_pcm_stream =\n      _snd_pcm_stream_ptr.asFunction<_dart_snd_pcm_stream>();\n\n  int snd_pcm_poll_descriptors_count(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_poll_descriptors_count(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_poll_descriptors_count>>(\n          'snd_pcm_poll_descriptors_count');\n  late final _dart_snd_pcm_poll_descriptors_count\n      _snd_pcm_poll_descriptors_count = _snd_pcm_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_pcm_poll_descriptors_count>();\n\n  int snd_pcm_poll_descriptors(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_pcm_poll_descriptors(\n      pcm,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_pcm_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_poll_descriptors>>(\n          'snd_pcm_poll_descriptors');\n  late final _dart_snd_pcm_poll_descriptors _snd_pcm_poll_descriptors =\n      _snd_pcm_poll_descriptors_ptr\n          .asFunction<_dart_snd_pcm_poll_descriptors>();\n\n  int snd_pcm_poll_descriptors_revents(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_pcm_poll_descriptors_revents(\n      pcm,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_pcm_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_poll_descriptors_revents>>(\n          'snd_pcm_poll_descriptors_revents');\n  late final _dart_snd_pcm_poll_descriptors_revents\n      _snd_pcm_poll_descriptors_revents = _snd_pcm_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_pcm_poll_descriptors_revents>();\n\n  int snd_pcm_nonblock(\n    ffi.Pointer<snd_pcm_> pcm,\n    int nonblock,\n  ) {\n    return _snd_pcm_nonblock(\n      pcm,\n      nonblock,\n    );\n  }\n\n  late final _snd_pcm_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_nonblock>>('snd_pcm_nonblock');\n  late final _dart_snd_pcm_nonblock _snd_pcm_nonblock =\n      _snd_pcm_nonblock_ptr.asFunction<_dart_snd_pcm_nonblock>();\n\n  int snd_async_add_pcm_handler(\n    ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_async_add_pcm_handler(\n      handler,\n      pcm,\n      callback,\n      private_data,\n    );\n  }\n\n  late final _snd_async_add_pcm_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_add_pcm_handler>>(\n          'snd_async_add_pcm_handler');\n  late final _dart_snd_async_add_pcm_handler _snd_async_add_pcm_handler =\n      _snd_async_add_pcm_handler_ptr\n          .asFunction<_dart_snd_async_add_pcm_handler>();\n\n  ffi.Pointer<snd_pcm_> snd_async_handler_get_pcm(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_pcm(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_pcm_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_pcm>>(\n          'snd_async_handler_get_pcm');\n  late final _dart_snd_async_handler_get_pcm _snd_async_handler_get_pcm =\n      _snd_async_handler_get_pcm_ptr\n          .asFunction<_dart_snd_async_handler_get_pcm>();\n\n  int snd_pcm_info(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_info_> info,\n  ) {\n    return _snd_pcm_info(\n      pcm,\n      info,\n    );\n  }\n\n  late final _snd_pcm_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info>>('snd_pcm_info');\n  late final _dart_snd_pcm_info _snd_pcm_info =\n      _snd_pcm_info_ptr.asFunction<_dart_snd_pcm_info>();\n\n  int snd_pcm_hw_params_current(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_current(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_current_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_current>>(\n          'snd_pcm_hw_params_current');\n  late final _dart_snd_pcm_hw_params_current _snd_pcm_hw_params_current =\n      _snd_pcm_hw_params_current_ptr\n          .asFunction<_dart_snd_pcm_hw_params_current>();\n\n  int snd_pcm_hw_params(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params>>('snd_pcm_hw_params');\n  late final _dart_snd_pcm_hw_params _snd_pcm_hw_params =\n      _snd_pcm_hw_params_ptr.asFunction<_dart_snd_pcm_hw_params>();\n\n  int snd_pcm_hw_free(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_hw_free(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_hw_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_free>>('snd_pcm_hw_free');\n  late final _dart_snd_pcm_hw_free _snd_pcm_hw_free =\n      _snd_pcm_hw_free_ptr.asFunction<_dart_snd_pcm_hw_free>();\n\n  int snd_pcm_sw_params_current(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n  ) {\n    return _snd_pcm_sw_params_current(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_sw_params_current_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_current>>(\n          'snd_pcm_sw_params_current');\n  late final _dart_snd_pcm_sw_params_current _snd_pcm_sw_params_current =\n      _snd_pcm_sw_params_current_ptr\n          .asFunction<_dart_snd_pcm_sw_params_current>();\n\n  int snd_pcm_sw_params(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n  ) {\n    return _snd_pcm_sw_params(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_sw_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params>>('snd_pcm_sw_params');\n  late final _dart_snd_pcm_sw_params _snd_pcm_sw_params =\n      _snd_pcm_sw_params_ptr.asFunction<_dart_snd_pcm_sw_params>();\n\n  int snd_pcm_prepare(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_prepare(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_prepare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_prepare>>('snd_pcm_prepare');\n  late final _dart_snd_pcm_prepare _snd_pcm_prepare =\n      _snd_pcm_prepare_ptr.asFunction<_dart_snd_pcm_prepare>();\n\n  int snd_pcm_reset(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_reset(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_reset_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_reset>>('snd_pcm_reset');\n  late final _dart_snd_pcm_reset _snd_pcm_reset =\n      _snd_pcm_reset_ptr.asFunction<_dart_snd_pcm_reset>();\n\n  int snd_pcm_status(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_status_> status,\n  ) {\n    return _snd_pcm_status(\n      pcm,\n      status,\n    );\n  }\n\n  late final _snd_pcm_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status>>('snd_pcm_status');\n  late final _dart_snd_pcm_status _snd_pcm_status =\n      _snd_pcm_status_ptr.asFunction<_dart_snd_pcm_status>();\n\n  int snd_pcm_start(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_start(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_start_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_start>>('snd_pcm_start');\n  late final _dart_snd_pcm_start _snd_pcm_start =\n      _snd_pcm_start_ptr.asFunction<_dart_snd_pcm_start>();\n\n  int snd_pcm_drop(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_drop(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_drop_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_drop>>('snd_pcm_drop');\n  late final _dart_snd_pcm_drop _snd_pcm_drop =\n      _snd_pcm_drop_ptr.asFunction<_dart_snd_pcm_drop>();\n\n  int snd_pcm_drain(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_drain(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_drain_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_drain>>('snd_pcm_drain');\n  late final _dart_snd_pcm_drain _snd_pcm_drain =\n      _snd_pcm_drain_ptr.asFunction<_dart_snd_pcm_drain>();\n\n  int snd_pcm_pause(\n    ffi.Pointer<snd_pcm_> pcm,\n    int enable,\n  ) {\n    return _snd_pcm_pause(\n      pcm,\n      enable,\n    );\n  }\n\n  late final _snd_pcm_pause_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_pause>>('snd_pcm_pause');\n  late final _dart_snd_pcm_pause _snd_pcm_pause =\n      _snd_pcm_pause_ptr.asFunction<_dart_snd_pcm_pause>();\n\n  int snd_pcm_state(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_state(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_state_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_state>>('snd_pcm_state');\n  late final _dart_snd_pcm_state _snd_pcm_state =\n      _snd_pcm_state_ptr.asFunction<_dart_snd_pcm_state>();\n\n  int snd_pcm_hwsync(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_hwsync(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_hwsync_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hwsync>>('snd_pcm_hwsync');\n  late final _dart_snd_pcm_hwsync _snd_pcm_hwsync =\n      _snd_pcm_hwsync_ptr.asFunction<_dart_snd_pcm_hwsync>();\n\n  int snd_pcm_delay(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Int64> delayp,\n  ) {\n    return _snd_pcm_delay(\n      pcm,\n      delayp,\n    );\n  }\n\n  late final _snd_pcm_delay_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_delay>>('snd_pcm_delay');\n  late final _dart_snd_pcm_delay _snd_pcm_delay =\n      _snd_pcm_delay_ptr.asFunction<_dart_snd_pcm_delay>();\n\n  int snd_pcm_resume(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_resume(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_resume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_resume>>('snd_pcm_resume');\n  late final _dart_snd_pcm_resume _snd_pcm_resume =\n      _snd_pcm_resume_ptr.asFunction<_dart_snd_pcm_resume>();\n\n  int snd_pcm_htimestamp(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Uint64> avail,\n    ffi.Pointer<timespec> tstamp,\n  ) {\n    return _snd_pcm_htimestamp(\n      pcm,\n      avail,\n      tstamp,\n    );\n  }\n\n  late final _snd_pcm_htimestamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_htimestamp>>('snd_pcm_htimestamp');\n  late final _dart_snd_pcm_htimestamp _snd_pcm_htimestamp =\n      _snd_pcm_htimestamp_ptr.asFunction<_dart_snd_pcm_htimestamp>();\n\n  int snd_pcm_avail(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_avail(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_avail_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_avail>>('snd_pcm_avail');\n  late final _dart_snd_pcm_avail _snd_pcm_avail =\n      _snd_pcm_avail_ptr.asFunction<_dart_snd_pcm_avail>();\n\n  int snd_pcm_avail_update(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_avail_update(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_avail_update_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_avail_update>>(\n          'snd_pcm_avail_update');\n  late final _dart_snd_pcm_avail_update _snd_pcm_avail_update =\n      _snd_pcm_avail_update_ptr.asFunction<_dart_snd_pcm_avail_update>();\n\n  int snd_pcm_avail_delay(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Int64> availp,\n    ffi.Pointer<ffi.Int64> delayp,\n  ) {\n    return _snd_pcm_avail_delay(\n      pcm,\n      availp,\n      delayp,\n    );\n  }\n\n  late final _snd_pcm_avail_delay_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_avail_delay>>(\n          'snd_pcm_avail_delay');\n  late final _dart_snd_pcm_avail_delay _snd_pcm_avail_delay =\n      _snd_pcm_avail_delay_ptr.asFunction<_dart_snd_pcm_avail_delay>();\n\n  int snd_pcm_rewindable(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_rewindable(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_rewindable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_rewindable>>('snd_pcm_rewindable');\n  late final _dart_snd_pcm_rewindable _snd_pcm_rewindable =\n      _snd_pcm_rewindable_ptr.asFunction<_dart_snd_pcm_rewindable>();\n\n  int snd_pcm_rewind(\n    ffi.Pointer<snd_pcm_> pcm,\n    int frames,\n  ) {\n    return _snd_pcm_rewind(\n      pcm,\n      frames,\n    );\n  }\n\n  late final _snd_pcm_rewind_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_rewind>>('snd_pcm_rewind');\n  late final _dart_snd_pcm_rewind _snd_pcm_rewind =\n      _snd_pcm_rewind_ptr.asFunction<_dart_snd_pcm_rewind>();\n\n  int snd_pcm_forwardable(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_forwardable(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_forwardable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_forwardable>>(\n          'snd_pcm_forwardable');\n  late final _dart_snd_pcm_forwardable _snd_pcm_forwardable =\n      _snd_pcm_forwardable_ptr.asFunction<_dart_snd_pcm_forwardable>();\n\n  int snd_pcm_forward(\n    ffi.Pointer<snd_pcm_> pcm,\n    int frames,\n  ) {\n    return _snd_pcm_forward(\n      pcm,\n      frames,\n    );\n  }\n\n  late final _snd_pcm_forward_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_forward>>('snd_pcm_forward');\n  late final _dart_snd_pcm_forward _snd_pcm_forward =\n      _snd_pcm_forward_ptr.asFunction<_dart_snd_pcm_forward>();\n\n  int snd_pcm_writei(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_pcm_writei(\n      pcm,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_pcm_writei_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_writei>>('snd_pcm_writei');\n  late final _dart_snd_pcm_writei _snd_pcm_writei =\n      _snd_pcm_writei_ptr.asFunction<_dart_snd_pcm_writei>();\n\n  int snd_pcm_readi(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_pcm_readi(\n      pcm,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_pcm_readi_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_readi>>('snd_pcm_readi');\n  late final _dart_snd_pcm_readi _snd_pcm_readi =\n      _snd_pcm_readi_ptr.asFunction<_dart_snd_pcm_readi>();\n\n  int snd_pcm_writen(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n    int size,\n  ) {\n    return _snd_pcm_writen(\n      pcm,\n      bufs,\n      size,\n    );\n  }\n\n  late final _snd_pcm_writen_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_writen>>('snd_pcm_writen');\n  late final _dart_snd_pcm_writen _snd_pcm_writen =\n      _snd_pcm_writen_ptr.asFunction<_dart_snd_pcm_writen>();\n\n  int snd_pcm_readn(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n    int size,\n  ) {\n    return _snd_pcm_readn(\n      pcm,\n      bufs,\n      size,\n    );\n  }\n\n  late final _snd_pcm_readn_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_readn>>('snd_pcm_readn');\n  late final _dart_snd_pcm_readn _snd_pcm_readn =\n      _snd_pcm_readn_ptr.asFunction<_dart_snd_pcm_readn>();\n\n  int snd_pcm_wait(\n    ffi.Pointer<snd_pcm_> pcm,\n    int timeout,\n  ) {\n    return _snd_pcm_wait(\n      pcm,\n      timeout,\n    );\n  }\n\n  late final _snd_pcm_wait_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_wait>>('snd_pcm_wait');\n  late final _dart_snd_pcm_wait _snd_pcm_wait =\n      _snd_pcm_wait_ptr.asFunction<_dart_snd_pcm_wait>();\n\n  int snd_pcm_link(\n    ffi.Pointer<snd_pcm_> pcm1,\n    ffi.Pointer<snd_pcm_> pcm2,\n  ) {\n    return _snd_pcm_link(\n      pcm1,\n      pcm2,\n    );\n  }\n\n  late final _snd_pcm_link_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_link>>('snd_pcm_link');\n  late final _dart_snd_pcm_link _snd_pcm_link =\n      _snd_pcm_link_ptr.asFunction<_dart_snd_pcm_link>();\n\n  int snd_pcm_unlink(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_unlink(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_unlink_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_unlink>>('snd_pcm_unlink');\n  late final _dart_snd_pcm_unlink _snd_pcm_unlink =\n      _snd_pcm_unlink_ptr.asFunction<_dart_snd_pcm_unlink>();\n\n  ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> snd_pcm_query_chmaps(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_query_chmaps(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_query_chmaps_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_query_chmaps>>(\n          'snd_pcm_query_chmaps');\n  late final _dart_snd_pcm_query_chmaps _snd_pcm_query_chmaps =\n      _snd_pcm_query_chmaps_ptr.asFunction<_dart_snd_pcm_query_chmaps>();\n\n  ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> snd_pcm_query_chmaps_from_hw(\n    int card,\n    int dev,\n    int subdev,\n    int stream,\n  ) {\n    return _snd_pcm_query_chmaps_from_hw(\n      card,\n      dev,\n      subdev,\n      stream,\n    );\n  }\n\n  late final _snd_pcm_query_chmaps_from_hw_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_query_chmaps_from_hw>>(\n          'snd_pcm_query_chmaps_from_hw');\n  late final _dart_snd_pcm_query_chmaps_from_hw _snd_pcm_query_chmaps_from_hw =\n      _snd_pcm_query_chmaps_from_hw_ptr\n          .asFunction<_dart_snd_pcm_query_chmaps_from_hw>();\n\n  void snd_pcm_free_chmaps(\n    ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> maps,\n  ) {\n    return _snd_pcm_free_chmaps(\n      maps,\n    );\n  }\n\n  late final _snd_pcm_free_chmaps_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_free_chmaps>>(\n          'snd_pcm_free_chmaps');\n  late final _dart_snd_pcm_free_chmaps _snd_pcm_free_chmaps =\n      _snd_pcm_free_chmaps_ptr.asFunction<_dart_snd_pcm_free_chmaps>();\n\n  ffi.Pointer<snd_pcm_chmap_t> snd_pcm_get_chmap(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_get_chmap(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_get_chmap_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_get_chmap>>('snd_pcm_get_chmap');\n  late final _dart_snd_pcm_get_chmap _snd_pcm_get_chmap =\n      _snd_pcm_get_chmap_ptr.asFunction<_dart_snd_pcm_get_chmap>();\n\n  int snd_pcm_set_chmap(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_chmap_t> map,\n  ) {\n    return _snd_pcm_set_chmap(\n      pcm,\n      map,\n    );\n  }\n\n  late final _snd_pcm_set_chmap_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_set_chmap>>('snd_pcm_set_chmap');\n  late final _dart_snd_pcm_set_chmap _snd_pcm_set_chmap =\n      _snd_pcm_set_chmap_ptr.asFunction<_dart_snd_pcm_set_chmap>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_chmap_type_name(\n    int val,\n  ) {\n    return _snd_pcm_chmap_type_name(\n      val,\n    );\n  }\n\n  late final _snd_pcm_chmap_type_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_type_name>>(\n          'snd_pcm_chmap_type_name');\n  late final _dart_snd_pcm_chmap_type_name _snd_pcm_chmap_type_name =\n      _snd_pcm_chmap_type_name_ptr.asFunction<_dart_snd_pcm_chmap_type_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_chmap_name(\n    int val,\n  ) {\n    return _snd_pcm_chmap_name(\n      val,\n    );\n  }\n\n  late final _snd_pcm_chmap_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_name>>('snd_pcm_chmap_name');\n  late final _dart_snd_pcm_chmap_name _snd_pcm_chmap_name =\n      _snd_pcm_chmap_name_ptr.asFunction<_dart_snd_pcm_chmap_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_chmap_long_name(\n    int val,\n  ) {\n    return _snd_pcm_chmap_long_name(\n      val,\n    );\n  }\n\n  late final _snd_pcm_chmap_long_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_long_name>>(\n          'snd_pcm_chmap_long_name');\n  late final _dart_snd_pcm_chmap_long_name _snd_pcm_chmap_long_name =\n      _snd_pcm_chmap_long_name_ptr.asFunction<_dart_snd_pcm_chmap_long_name>();\n\n  int snd_pcm_chmap_print(\n    ffi.Pointer<snd_pcm_chmap_t> map,\n    int maxlen,\n    ffi.Pointer<ffi.Int8> buf,\n  ) {\n    return _snd_pcm_chmap_print(\n      map,\n      maxlen,\n      buf,\n    );\n  }\n\n  late final _snd_pcm_chmap_print_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_print>>(\n          'snd_pcm_chmap_print');\n  late final _dart_snd_pcm_chmap_print _snd_pcm_chmap_print =\n      _snd_pcm_chmap_print_ptr.asFunction<_dart_snd_pcm_chmap_print>();\n\n  int snd_pcm_chmap_from_string(\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_pcm_chmap_from_string(\n      str,\n    );\n  }\n\n  late final _snd_pcm_chmap_from_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_from_string>>(\n          'snd_pcm_chmap_from_string');\n  late final _dart_snd_pcm_chmap_from_string _snd_pcm_chmap_from_string =\n      _snd_pcm_chmap_from_string_ptr\n          .asFunction<_dart_snd_pcm_chmap_from_string>();\n\n  ffi.Pointer<snd_pcm_chmap_t> snd_pcm_chmap_parse_string(\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_pcm_chmap_parse_string(\n      str,\n    );\n  }\n\n  late final _snd_pcm_chmap_parse_string_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_chmap_parse_string>>(\n          'snd_pcm_chmap_parse_string');\n  late final _dart_snd_pcm_chmap_parse_string _snd_pcm_chmap_parse_string =\n      _snd_pcm_chmap_parse_string_ptr\n          .asFunction<_dart_snd_pcm_chmap_parse_string>();\n\n  int snd_pcm_recover(\n    ffi.Pointer<snd_pcm_> pcm,\n    int err,\n    int silent,\n  ) {\n    return _snd_pcm_recover(\n      pcm,\n      err,\n      silent,\n    );\n  }\n\n  late final _snd_pcm_recover_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_recover>>('snd_pcm_recover');\n  late final _dart_snd_pcm_recover _snd_pcm_recover =\n      _snd_pcm_recover_ptr.asFunction<_dart_snd_pcm_recover>();\n\n  int snd_pcm_set_params(\n    ffi.Pointer<snd_pcm_> pcm,\n    int format,\n    int access,\n    int channels,\n    int rate,\n    int soft_resample,\n    int latency,\n  ) {\n    return _snd_pcm_set_params(\n      pcm,\n      format,\n      access,\n      channels,\n      rate,\n      soft_resample,\n      latency,\n    );\n  }\n\n  late final _snd_pcm_set_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_set_params>>('snd_pcm_set_params');\n  late final _dart_snd_pcm_set_params _snd_pcm_set_params =\n      _snd_pcm_set_params_ptr.asFunction<_dart_snd_pcm_set_params>();\n\n  int snd_pcm_get_params(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Uint64> buffer_size,\n    ffi.Pointer<ffi.Uint64> period_size,\n  ) {\n    return _snd_pcm_get_params(\n      pcm,\n      buffer_size,\n      period_size,\n    );\n  }\n\n  late final _snd_pcm_get_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_get_params>>('snd_pcm_get_params');\n  late final _dart_snd_pcm_get_params _snd_pcm_get_params =\n      _snd_pcm_get_params_ptr.asFunction<_dart_snd_pcm_get_params>();\n\n  int snd_pcm_info_sizeof() {\n    return _snd_pcm_info_sizeof();\n  }\n\n  late final _snd_pcm_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_sizeof>>(\n          'snd_pcm_info_sizeof');\n  late final _dart_snd_pcm_info_sizeof _snd_pcm_info_sizeof =\n      _snd_pcm_info_sizeof_ptr.asFunction<_dart_snd_pcm_info_sizeof>();\n\n  int snd_pcm_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_info_>> ptr,\n  ) {\n    return _snd_pcm_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_malloc>>(\n          'snd_pcm_info_malloc');\n  late final _dart_snd_pcm_info_malloc _snd_pcm_info_malloc =\n      _snd_pcm_info_malloc_ptr.asFunction<_dart_snd_pcm_info_malloc>();\n\n  void snd_pcm_info_free(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_free>>('snd_pcm_info_free');\n  late final _dart_snd_pcm_info_free _snd_pcm_info_free =\n      _snd_pcm_info_free_ptr.asFunction<_dart_snd_pcm_info_free>();\n\n  void snd_pcm_info_copy(\n    ffi.Pointer<snd_pcm_info_> dst,\n    ffi.Pointer<snd_pcm_info_> src,\n  ) {\n    return _snd_pcm_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_copy>>('snd_pcm_info_copy');\n  late final _dart_snd_pcm_info_copy _snd_pcm_info_copy =\n      _snd_pcm_info_copy_ptr.asFunction<_dart_snd_pcm_info_copy>();\n\n  int snd_pcm_info_get_device(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_device>>(\n          'snd_pcm_info_get_device');\n  late final _dart_snd_pcm_info_get_device _snd_pcm_info_get_device =\n      _snd_pcm_info_get_device_ptr.asFunction<_dart_snd_pcm_info_get_device>();\n\n  int snd_pcm_info_get_subdevice(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_subdevice>>(\n          'snd_pcm_info_get_subdevice');\n  late final _dart_snd_pcm_info_get_subdevice _snd_pcm_info_get_subdevice =\n      _snd_pcm_info_get_subdevice_ptr\n          .asFunction<_dart_snd_pcm_info_get_subdevice>();\n\n  int snd_pcm_info_get_stream(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_stream(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_stream>>(\n          'snd_pcm_info_get_stream');\n  late final _dart_snd_pcm_info_get_stream _snd_pcm_info_get_stream =\n      _snd_pcm_info_get_stream_ptr.asFunction<_dart_snd_pcm_info_get_stream>();\n\n  int snd_pcm_info_get_card(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_card(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_card>>(\n          'snd_pcm_info_get_card');\n  late final _dart_snd_pcm_info_get_card _snd_pcm_info_get_card =\n      _snd_pcm_info_get_card_ptr.asFunction<_dart_snd_pcm_info_get_card>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_info_get_id(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_id>>(\n          'snd_pcm_info_get_id');\n  late final _dart_snd_pcm_info_get_id _snd_pcm_info_get_id =\n      _snd_pcm_info_get_id_ptr.asFunction<_dart_snd_pcm_info_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_info_get_name(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_name>>(\n          'snd_pcm_info_get_name');\n  late final _dart_snd_pcm_info_get_name _snd_pcm_info_get_name =\n      _snd_pcm_info_get_name_ptr.asFunction<_dart_snd_pcm_info_get_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_info_get_subdevice_name(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_subdevice_name(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_subdevice_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_subdevice_name>>(\n          'snd_pcm_info_get_subdevice_name');\n  late final _dart_snd_pcm_info_get_subdevice_name\n      _snd_pcm_info_get_subdevice_name = _snd_pcm_info_get_subdevice_name_ptr\n          .asFunction<_dart_snd_pcm_info_get_subdevice_name>();\n\n  int snd_pcm_info_get_class(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_class(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_class_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_class>>(\n          'snd_pcm_info_get_class');\n  late final _dart_snd_pcm_info_get_class _snd_pcm_info_get_class =\n      _snd_pcm_info_get_class_ptr.asFunction<_dart_snd_pcm_info_get_class>();\n\n  int snd_pcm_info_get_subclass(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_subclass(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_subclass_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_subclass>>(\n          'snd_pcm_info_get_subclass');\n  late final _dart_snd_pcm_info_get_subclass _snd_pcm_info_get_subclass =\n      _snd_pcm_info_get_subclass_ptr\n          .asFunction<_dart_snd_pcm_info_get_subclass>();\n\n  int snd_pcm_info_get_subdevices_count(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_subdevices_count(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_subdevices_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_subdevices_count>>(\n          'snd_pcm_info_get_subdevices_count');\n  late final _dart_snd_pcm_info_get_subdevices_count\n      _snd_pcm_info_get_subdevices_count =\n      _snd_pcm_info_get_subdevices_count_ptr\n          .asFunction<_dart_snd_pcm_info_get_subdevices_count>();\n\n  int snd_pcm_info_get_subdevices_avail(\n    ffi.Pointer<snd_pcm_info_> obj,\n  ) {\n    return _snd_pcm_info_get_subdevices_avail(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_info_get_subdevices_avail_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_get_subdevices_avail>>(\n          'snd_pcm_info_get_subdevices_avail');\n  late final _dart_snd_pcm_info_get_subdevices_avail\n      _snd_pcm_info_get_subdevices_avail =\n      _snd_pcm_info_get_subdevices_avail_ptr\n          .asFunction<_dart_snd_pcm_info_get_subdevices_avail>();\n\n  void snd_pcm_info_set_device(\n    ffi.Pointer<snd_pcm_info_> obj,\n    int val,\n  ) {\n    return _snd_pcm_info_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_pcm_info_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_set_device>>(\n          'snd_pcm_info_set_device');\n  late final _dart_snd_pcm_info_set_device _snd_pcm_info_set_device =\n      _snd_pcm_info_set_device_ptr.asFunction<_dart_snd_pcm_info_set_device>();\n\n  void snd_pcm_info_set_subdevice(\n    ffi.Pointer<snd_pcm_info_> obj,\n    int val,\n  ) {\n    return _snd_pcm_info_set_subdevice(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_pcm_info_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_set_subdevice>>(\n          'snd_pcm_info_set_subdevice');\n  late final _dart_snd_pcm_info_set_subdevice _snd_pcm_info_set_subdevice =\n      _snd_pcm_info_set_subdevice_ptr\n          .asFunction<_dart_snd_pcm_info_set_subdevice>();\n\n  void snd_pcm_info_set_stream(\n    ffi.Pointer<snd_pcm_info_> obj,\n    int val,\n  ) {\n    return _snd_pcm_info_set_stream(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_pcm_info_set_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_info_set_stream>>(\n          'snd_pcm_info_set_stream');\n  late final _dart_snd_pcm_info_set_stream _snd_pcm_info_set_stream =\n      _snd_pcm_info_set_stream_ptr.asFunction<_dart_snd_pcm_info_set_stream>();\n\n  int snd_pcm_hw_params_any(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_any(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_any_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_any>>(\n          'snd_pcm_hw_params_any');\n  late final _dart_snd_pcm_hw_params_any _snd_pcm_hw_params_any =\n      _snd_pcm_hw_params_any_ptr.asFunction<_dart_snd_pcm_hw_params_any>();\n\n  int snd_pcm_hw_params_can_mmap_sample_resolution(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_mmap_sample_resolution(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_mmap_sample_resolution_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_pcm_hw_params_can_mmap_sample_resolution>>(\n      'snd_pcm_hw_params_can_mmap_sample_resolution');\n  late final _dart_snd_pcm_hw_params_can_mmap_sample_resolution\n      _snd_pcm_hw_params_can_mmap_sample_resolution =\n      _snd_pcm_hw_params_can_mmap_sample_resolution_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_mmap_sample_resolution>();\n\n  int snd_pcm_hw_params_is_double(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_double(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_double_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_double>>(\n          'snd_pcm_hw_params_is_double');\n  late final _dart_snd_pcm_hw_params_is_double _snd_pcm_hw_params_is_double =\n      _snd_pcm_hw_params_is_double_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_double>();\n\n  int snd_pcm_hw_params_is_batch(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_batch(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_batch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_batch>>(\n          'snd_pcm_hw_params_is_batch');\n  late final _dart_snd_pcm_hw_params_is_batch _snd_pcm_hw_params_is_batch =\n      _snd_pcm_hw_params_is_batch_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_batch>();\n\n  int snd_pcm_hw_params_is_block_transfer(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_block_transfer(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_block_transfer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_block_transfer>>(\n          'snd_pcm_hw_params_is_block_transfer');\n  late final _dart_snd_pcm_hw_params_is_block_transfer\n      _snd_pcm_hw_params_is_block_transfer =\n      _snd_pcm_hw_params_is_block_transfer_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_block_transfer>();\n\n  int snd_pcm_hw_params_is_monotonic(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_monotonic(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_monotonic_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_monotonic>>(\n          'snd_pcm_hw_params_is_monotonic');\n  late final _dart_snd_pcm_hw_params_is_monotonic\n      _snd_pcm_hw_params_is_monotonic = _snd_pcm_hw_params_is_monotonic_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_monotonic>();\n\n  int snd_pcm_hw_params_can_overrange(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_overrange(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_overrange_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_can_overrange>>(\n          'snd_pcm_hw_params_can_overrange');\n  late final _dart_snd_pcm_hw_params_can_overrange\n      _snd_pcm_hw_params_can_overrange = _snd_pcm_hw_params_can_overrange_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_overrange>();\n\n  int snd_pcm_hw_params_can_pause(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_pause(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_pause_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_can_pause>>(\n          'snd_pcm_hw_params_can_pause');\n  late final _dart_snd_pcm_hw_params_can_pause _snd_pcm_hw_params_can_pause =\n      _snd_pcm_hw_params_can_pause_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_pause>();\n\n  int snd_pcm_hw_params_can_resume(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_resume(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_resume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_can_resume>>(\n          'snd_pcm_hw_params_can_resume');\n  late final _dart_snd_pcm_hw_params_can_resume _snd_pcm_hw_params_can_resume =\n      _snd_pcm_hw_params_can_resume_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_resume>();\n\n  int snd_pcm_hw_params_is_half_duplex(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_half_duplex(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_half_duplex_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_half_duplex>>(\n          'snd_pcm_hw_params_is_half_duplex');\n  late final _dart_snd_pcm_hw_params_is_half_duplex\n      _snd_pcm_hw_params_is_half_duplex = _snd_pcm_hw_params_is_half_duplex_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_half_duplex>();\n\n  int snd_pcm_hw_params_is_joint_duplex(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_is_joint_duplex(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_is_joint_duplex_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_is_joint_duplex>>(\n          'snd_pcm_hw_params_is_joint_duplex');\n  late final _dart_snd_pcm_hw_params_is_joint_duplex\n      _snd_pcm_hw_params_is_joint_duplex =\n      _snd_pcm_hw_params_is_joint_duplex_ptr\n          .asFunction<_dart_snd_pcm_hw_params_is_joint_duplex>();\n\n  int snd_pcm_hw_params_can_sync_start(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_sync_start(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_sync_start_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_can_sync_start>>(\n          'snd_pcm_hw_params_can_sync_start');\n  late final _dart_snd_pcm_hw_params_can_sync_start\n      _snd_pcm_hw_params_can_sync_start = _snd_pcm_hw_params_can_sync_start_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_sync_start>();\n\n  int snd_pcm_hw_params_can_disable_period_wakeup(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_can_disable_period_wakeup(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_can_disable_period_wakeup_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_pcm_hw_params_can_disable_period_wakeup>>(\n      'snd_pcm_hw_params_can_disable_period_wakeup');\n  late final _dart_snd_pcm_hw_params_can_disable_period_wakeup\n      _snd_pcm_hw_params_can_disable_period_wakeup =\n      _snd_pcm_hw_params_can_disable_period_wakeup_ptr\n          .asFunction<_dart_snd_pcm_hw_params_can_disable_period_wakeup>();\n\n  int snd_pcm_hw_params_supports_audio_wallclock_ts(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_supports_audio_wallclock_ts(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_supports_audio_wallclock_ts_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_pcm_hw_params_supports_audio_wallclock_ts>>(\n      'snd_pcm_hw_params_supports_audio_wallclock_ts');\n  late final _dart_snd_pcm_hw_params_supports_audio_wallclock_ts\n      _snd_pcm_hw_params_supports_audio_wallclock_ts =\n      _snd_pcm_hw_params_supports_audio_wallclock_ts_ptr\n          .asFunction<_dart_snd_pcm_hw_params_supports_audio_wallclock_ts>();\n\n  int snd_pcm_hw_params_supports_audio_ts_type(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int type,\n  ) {\n    return _snd_pcm_hw_params_supports_audio_ts_type(\n      params,\n      type,\n    );\n  }\n\n  late final _snd_pcm_hw_params_supports_audio_ts_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_supports_audio_ts_type>>(\n          'snd_pcm_hw_params_supports_audio_ts_type');\n  late final _dart_snd_pcm_hw_params_supports_audio_ts_type\n      _snd_pcm_hw_params_supports_audio_ts_type =\n      _snd_pcm_hw_params_supports_audio_ts_type_ptr\n          .asFunction<_dart_snd_pcm_hw_params_supports_audio_ts_type>();\n\n  int snd_pcm_hw_params_get_rate_numden(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> rate_num,\n    ffi.Pointer<ffi.Uint32> rate_den,\n  ) {\n    return _snd_pcm_hw_params_get_rate_numden(\n      params,\n      rate_num,\n      rate_den,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_rate_numden_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_rate_numden>>(\n          'snd_pcm_hw_params_get_rate_numden');\n  late final _dart_snd_pcm_hw_params_get_rate_numden\n      _snd_pcm_hw_params_get_rate_numden =\n      _snd_pcm_hw_params_get_rate_numden_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_rate_numden>();\n\n  int snd_pcm_hw_params_get_sbits(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_get_sbits(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_sbits_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_sbits>>(\n          'snd_pcm_hw_params_get_sbits');\n  late final _dart_snd_pcm_hw_params_get_sbits _snd_pcm_hw_params_get_sbits =\n      _snd_pcm_hw_params_get_sbits_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_sbits>();\n\n  int snd_pcm_hw_params_get_fifo_size(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_get_fifo_size(\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_fifo_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_fifo_size>>(\n          'snd_pcm_hw_params_get_fifo_size');\n  late final _dart_snd_pcm_hw_params_get_fifo_size\n      _snd_pcm_hw_params_get_fifo_size = _snd_pcm_hw_params_get_fifo_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_fifo_size>();\n\n  int snd_pcm_hw_params_sizeof() {\n    return _snd_pcm_hw_params_sizeof();\n  }\n\n  late final _snd_pcm_hw_params_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_sizeof>>(\n          'snd_pcm_hw_params_sizeof');\n  late final _dart_snd_pcm_hw_params_sizeof _snd_pcm_hw_params_sizeof =\n      _snd_pcm_hw_params_sizeof_ptr\n          .asFunction<_dart_snd_pcm_hw_params_sizeof>();\n\n  int snd_pcm_hw_params_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_hw_params_>> ptr,\n  ) {\n    return _snd_pcm_hw_params_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_hw_params_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_malloc>>(\n          'snd_pcm_hw_params_malloc');\n  late final _dart_snd_pcm_hw_params_malloc _snd_pcm_hw_params_malloc =\n      _snd_pcm_hw_params_malloc_ptr\n          .asFunction<_dart_snd_pcm_hw_params_malloc>();\n\n  void snd_pcm_hw_params_free(\n    ffi.Pointer<snd_pcm_hw_params_> obj,\n  ) {\n    return _snd_pcm_hw_params_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_hw_params_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_free>>(\n          'snd_pcm_hw_params_free');\n  late final _dart_snd_pcm_hw_params_free _snd_pcm_hw_params_free =\n      _snd_pcm_hw_params_free_ptr.asFunction<_dart_snd_pcm_hw_params_free>();\n\n  void snd_pcm_hw_params_copy(\n    ffi.Pointer<snd_pcm_hw_params_> dst,\n    ffi.Pointer<snd_pcm_hw_params_> src,\n  ) {\n    return _snd_pcm_hw_params_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_hw_params_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_copy>>(\n          'snd_pcm_hw_params_copy');\n  late final _dart_snd_pcm_hw_params_copy _snd_pcm_hw_params_copy =\n      _snd_pcm_hw_params_copy_ptr.asFunction<_dart_snd_pcm_hw_params_copy>();\n\n  int snd_pcm_hw_params_get_access(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> _access,\n  ) {\n    return _snd_pcm_hw_params_get_access(\n      params,\n      _access,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_access_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_access>>(\n          'snd_pcm_hw_params_get_access');\n  late final _dart_snd_pcm_hw_params_get_access _snd_pcm_hw_params_get_access =\n      _snd_pcm_hw_params_get_access_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_access>();\n\n  int snd_pcm_hw_params_test_access(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int _access,\n  ) {\n    return _snd_pcm_hw_params_test_access(\n      pcm,\n      params,\n      _access,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_access_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_access>>(\n          'snd_pcm_hw_params_test_access');\n  late final _dart_snd_pcm_hw_params_test_access\n      _snd_pcm_hw_params_test_access = _snd_pcm_hw_params_test_access_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_access>();\n\n  int snd_pcm_hw_params_set_access(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int _access,\n  ) {\n    return _snd_pcm_hw_params_set_access(\n      pcm,\n      params,\n      _access,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_access_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_access>>(\n          'snd_pcm_hw_params_set_access');\n  late final _dart_snd_pcm_hw_params_set_access _snd_pcm_hw_params_set_access =\n      _snd_pcm_hw_params_set_access_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_access>();\n\n  int snd_pcm_hw_params_set_access_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> _access,\n  ) {\n    return _snd_pcm_hw_params_set_access_first(\n      pcm,\n      params,\n      _access,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_access_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_access_first>>(\n          'snd_pcm_hw_params_set_access_first');\n  late final _dart_snd_pcm_hw_params_set_access_first\n      _snd_pcm_hw_params_set_access_first =\n      _snd_pcm_hw_params_set_access_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_access_first>();\n\n  int snd_pcm_hw_params_set_access_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> _access,\n  ) {\n    return _snd_pcm_hw_params_set_access_last(\n      pcm,\n      params,\n      _access,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_access_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_access_last>>(\n          'snd_pcm_hw_params_set_access_last');\n  late final _dart_snd_pcm_hw_params_set_access_last\n      _snd_pcm_hw_params_set_access_last =\n      _snd_pcm_hw_params_set_access_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_access_last>();\n\n  int snd_pcm_hw_params_set_access_mask(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_set_access_mask(\n      pcm,\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_access_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_access_mask>>(\n          'snd_pcm_hw_params_set_access_mask');\n  late final _dart_snd_pcm_hw_params_set_access_mask\n      _snd_pcm_hw_params_set_access_mask =\n      _snd_pcm_hw_params_set_access_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_access_mask>();\n\n  int snd_pcm_hw_params_get_access_mask(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_get_access_mask(\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_access_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_access_mask>>(\n          'snd_pcm_hw_params_get_access_mask');\n  late final _dart_snd_pcm_hw_params_get_access_mask\n      _snd_pcm_hw_params_get_access_mask =\n      _snd_pcm_hw_params_get_access_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_access_mask>();\n\n  int snd_pcm_hw_params_get_format(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> val,\n  ) {\n    return _snd_pcm_hw_params_get_format(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_format_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_format>>(\n          'snd_pcm_hw_params_get_format');\n  late final _dart_snd_pcm_hw_params_get_format _snd_pcm_hw_params_get_format =\n      _snd_pcm_hw_params_get_format_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_format>();\n\n  int snd_pcm_hw_params_test_format(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_test_format(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_format_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_format>>(\n          'snd_pcm_hw_params_test_format');\n  late final _dart_snd_pcm_hw_params_test_format\n      _snd_pcm_hw_params_test_format = _snd_pcm_hw_params_test_format_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_format>();\n\n  int snd_pcm_hw_params_set_format(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_format(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_format_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_format>>(\n          'snd_pcm_hw_params_set_format');\n  late final _dart_snd_pcm_hw_params_set_format _snd_pcm_hw_params_set_format =\n      _snd_pcm_hw_params_set_format_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_format>();\n\n  int snd_pcm_hw_params_set_format_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> format,\n  ) {\n    return _snd_pcm_hw_params_set_format_first(\n      pcm,\n      params,\n      format,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_format_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_format_first>>(\n          'snd_pcm_hw_params_set_format_first');\n  late final _dart_snd_pcm_hw_params_set_format_first\n      _snd_pcm_hw_params_set_format_first =\n      _snd_pcm_hw_params_set_format_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_format_first>();\n\n  int snd_pcm_hw_params_set_format_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> format,\n  ) {\n    return _snd_pcm_hw_params_set_format_last(\n      pcm,\n      params,\n      format,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_format_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_format_last>>(\n          'snd_pcm_hw_params_set_format_last');\n  late final _dart_snd_pcm_hw_params_set_format_last\n      _snd_pcm_hw_params_set_format_last =\n      _snd_pcm_hw_params_set_format_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_format_last>();\n\n  int snd_pcm_hw_params_set_format_mask(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_set_format_mask(\n      pcm,\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_format_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_format_mask>>(\n          'snd_pcm_hw_params_set_format_mask');\n  late final _dart_snd_pcm_hw_params_set_format_mask\n      _snd_pcm_hw_params_set_format_mask =\n      _snd_pcm_hw_params_set_format_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_format_mask>();\n\n  void snd_pcm_hw_params_get_format_mask(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_get_format_mask(\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_format_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_format_mask>>(\n          'snd_pcm_hw_params_get_format_mask');\n  late final _dart_snd_pcm_hw_params_get_format_mask\n      _snd_pcm_hw_params_get_format_mask =\n      _snd_pcm_hw_params_get_format_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_format_mask>();\n\n  int snd_pcm_hw_params_get_subformat(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> subformat,\n  ) {\n    return _snd_pcm_hw_params_get_subformat(\n      params,\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_subformat_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_subformat>>(\n          'snd_pcm_hw_params_get_subformat');\n  late final _dart_snd_pcm_hw_params_get_subformat\n      _snd_pcm_hw_params_get_subformat = _snd_pcm_hw_params_get_subformat_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_subformat>();\n\n  int snd_pcm_hw_params_test_subformat(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int subformat,\n  ) {\n    return _snd_pcm_hw_params_test_subformat(\n      pcm,\n      params,\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_subformat_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_subformat>>(\n          'snd_pcm_hw_params_test_subformat');\n  late final _dart_snd_pcm_hw_params_test_subformat\n      _snd_pcm_hw_params_test_subformat = _snd_pcm_hw_params_test_subformat_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_subformat>();\n\n  int snd_pcm_hw_params_set_subformat(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int subformat,\n  ) {\n    return _snd_pcm_hw_params_set_subformat(\n      pcm,\n      params,\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_subformat_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_subformat>>(\n          'snd_pcm_hw_params_set_subformat');\n  late final _dart_snd_pcm_hw_params_set_subformat\n      _snd_pcm_hw_params_set_subformat = _snd_pcm_hw_params_set_subformat_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_subformat>();\n\n  int snd_pcm_hw_params_set_subformat_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> subformat,\n  ) {\n    return _snd_pcm_hw_params_set_subformat_first(\n      pcm,\n      params,\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_subformat_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_subformat_first>>(\n          'snd_pcm_hw_params_set_subformat_first');\n  late final _dart_snd_pcm_hw_params_set_subformat_first\n      _snd_pcm_hw_params_set_subformat_first =\n      _snd_pcm_hw_params_set_subformat_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_subformat_first>();\n\n  int snd_pcm_hw_params_set_subformat_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Int32> subformat,\n  ) {\n    return _snd_pcm_hw_params_set_subformat_last(\n      pcm,\n      params,\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_subformat_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_subformat_last>>(\n          'snd_pcm_hw_params_set_subformat_last');\n  late final _dart_snd_pcm_hw_params_set_subformat_last\n      _snd_pcm_hw_params_set_subformat_last =\n      _snd_pcm_hw_params_set_subformat_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_subformat_last>();\n\n  int snd_pcm_hw_params_set_subformat_mask(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_set_subformat_mask(\n      pcm,\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_subformat_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_subformat_mask>>(\n          'snd_pcm_hw_params_set_subformat_mask');\n  late final _dart_snd_pcm_hw_params_set_subformat_mask\n      _snd_pcm_hw_params_set_subformat_mask =\n      _snd_pcm_hw_params_set_subformat_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_subformat_mask>();\n\n  void snd_pcm_hw_params_get_subformat_mask(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ) {\n    return _snd_pcm_hw_params_get_subformat_mask(\n      params,\n      mask,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_subformat_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_subformat_mask>>(\n          'snd_pcm_hw_params_get_subformat_mask');\n  late final _dart_snd_pcm_hw_params_get_subformat_mask\n      _snd_pcm_hw_params_get_subformat_mask =\n      _snd_pcm_hw_params_get_subformat_mask_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_subformat_mask>();\n\n  int snd_pcm_hw_params_get_channels(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_channels(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_channels>>(\n          'snd_pcm_hw_params_get_channels');\n  late final _dart_snd_pcm_hw_params_get_channels\n      _snd_pcm_hw_params_get_channels = _snd_pcm_hw_params_get_channels_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_channels>();\n\n  int snd_pcm_hw_params_get_channels_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_channels_min(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_channels_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_channels_min>>(\n          'snd_pcm_hw_params_get_channels_min');\n  late final _dart_snd_pcm_hw_params_get_channels_min\n      _snd_pcm_hw_params_get_channels_min =\n      _snd_pcm_hw_params_get_channels_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_channels_min>();\n\n  int snd_pcm_hw_params_get_channels_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_channels_max(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_channels_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_channels_max>>(\n          'snd_pcm_hw_params_get_channels_max');\n  late final _dart_snd_pcm_hw_params_get_channels_max\n      _snd_pcm_hw_params_get_channels_max =\n      _snd_pcm_hw_params_get_channels_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_channels_max>();\n\n  int snd_pcm_hw_params_test_channels(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_test_channels(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_channels>>(\n          'snd_pcm_hw_params_test_channels');\n  late final _dart_snd_pcm_hw_params_test_channels\n      _snd_pcm_hw_params_test_channels = _snd_pcm_hw_params_test_channels_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_channels>();\n\n  int snd_pcm_hw_params_set_channels(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_channels(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels>>(\n          'snd_pcm_hw_params_set_channels');\n  late final _dart_snd_pcm_hw_params_set_channels\n      _snd_pcm_hw_params_set_channels = _snd_pcm_hw_params_set_channels_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels>();\n\n  int snd_pcm_hw_params_set_channels_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_set_channels_min(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_min>>(\n          'snd_pcm_hw_params_set_channels_min');\n  late final _dart_snd_pcm_hw_params_set_channels_min\n      _snd_pcm_hw_params_set_channels_min =\n      _snd_pcm_hw_params_set_channels_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_min>();\n\n  int snd_pcm_hw_params_set_channels_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_set_channels_max(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_max>>(\n          'snd_pcm_hw_params_set_channels_max');\n  late final _dart_snd_pcm_hw_params_set_channels_max\n      _snd_pcm_hw_params_set_channels_max =\n      _snd_pcm_hw_params_set_channels_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_max>();\n\n  int snd_pcm_hw_params_set_channels_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Uint32> max,\n  ) {\n    return _snd_pcm_hw_params_set_channels_minmax(\n      pcm,\n      params,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_minmax>>(\n          'snd_pcm_hw_params_set_channels_minmax');\n  late final _dart_snd_pcm_hw_params_set_channels_minmax\n      _snd_pcm_hw_params_set_channels_minmax =\n      _snd_pcm_hw_params_set_channels_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_minmax>();\n\n  int snd_pcm_hw_params_set_channels_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_set_channels_near(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_near>>(\n          'snd_pcm_hw_params_set_channels_near');\n  late final _dart_snd_pcm_hw_params_set_channels_near\n      _snd_pcm_hw_params_set_channels_near =\n      _snd_pcm_hw_params_set_channels_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_near>();\n\n  int snd_pcm_hw_params_set_channels_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_set_channels_first(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_first>>(\n          'snd_pcm_hw_params_set_channels_first');\n  late final _dart_snd_pcm_hw_params_set_channels_first\n      _snd_pcm_hw_params_set_channels_first =\n      _snd_pcm_hw_params_set_channels_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_first>();\n\n  int snd_pcm_hw_params_set_channels_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_set_channels_last(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_channels_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_channels_last>>(\n          'snd_pcm_hw_params_set_channels_last');\n  late final _dart_snd_pcm_hw_params_set_channels_last\n      _snd_pcm_hw_params_set_channels_last =\n      _snd_pcm_hw_params_set_channels_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_channels_last>();\n\n  int snd_pcm_hw_params_get_rate(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_rate(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_rate_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_rate>>(\n          'snd_pcm_hw_params_get_rate');\n  late final _dart_snd_pcm_hw_params_get_rate _snd_pcm_hw_params_get_rate =\n      _snd_pcm_hw_params_get_rate_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_rate>();\n\n  int snd_pcm_hw_params_get_rate_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_rate_min(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_rate_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_rate_min>>(\n          'snd_pcm_hw_params_get_rate_min');\n  late final _dart_snd_pcm_hw_params_get_rate_min\n      _snd_pcm_hw_params_get_rate_min = _snd_pcm_hw_params_get_rate_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_rate_min>();\n\n  int snd_pcm_hw_params_get_rate_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_rate_max(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_rate_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_rate_max>>(\n          'snd_pcm_hw_params_get_rate_max');\n  late final _dart_snd_pcm_hw_params_get_rate_max\n      _snd_pcm_hw_params_get_rate_max = _snd_pcm_hw_params_get_rate_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_rate_max>();\n\n  int snd_pcm_hw_params_test_rate(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_rate(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_rate_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_rate>>(\n          'snd_pcm_hw_params_test_rate');\n  late final _dart_snd_pcm_hw_params_test_rate _snd_pcm_hw_params_test_rate =\n      _snd_pcm_hw_params_test_rate_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_rate>();\n\n  int snd_pcm_hw_params_set_rate(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate>>(\n          'snd_pcm_hw_params_set_rate');\n  late final _dart_snd_pcm_hw_params_set_rate _snd_pcm_hw_params_set_rate =\n      _snd_pcm_hw_params_set_rate_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate>();\n\n  int snd_pcm_hw_params_set_rate_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_min>>(\n          'snd_pcm_hw_params_set_rate_min');\n  late final _dart_snd_pcm_hw_params_set_rate_min\n      _snd_pcm_hw_params_set_rate_min = _snd_pcm_hw_params_set_rate_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_min>();\n\n  int snd_pcm_hw_params_set_rate_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_max>>(\n          'snd_pcm_hw_params_set_rate_max');\n  late final _dart_snd_pcm_hw_params_set_rate_max\n      _snd_pcm_hw_params_set_rate_max = _snd_pcm_hw_params_set_rate_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_max>();\n\n  int snd_pcm_hw_params_set_rate_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint32> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_minmax>>(\n          'snd_pcm_hw_params_set_rate_minmax');\n  late final _dart_snd_pcm_hw_params_set_rate_minmax\n      _snd_pcm_hw_params_set_rate_minmax =\n      _snd_pcm_hw_params_set_rate_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_minmax>();\n\n  int snd_pcm_hw_params_set_rate_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_near>>(\n          'snd_pcm_hw_params_set_rate_near');\n  late final _dart_snd_pcm_hw_params_set_rate_near\n      _snd_pcm_hw_params_set_rate_near = _snd_pcm_hw_params_set_rate_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_near>();\n\n  int snd_pcm_hw_params_set_rate_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_first>>(\n          'snd_pcm_hw_params_set_rate_first');\n  late final _dart_snd_pcm_hw_params_set_rate_first\n      _snd_pcm_hw_params_set_rate_first = _snd_pcm_hw_params_set_rate_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_first>();\n\n  int snd_pcm_hw_params_set_rate_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_rate_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_last>>(\n          'snd_pcm_hw_params_set_rate_last');\n  late final _dart_snd_pcm_hw_params_set_rate_last\n      _snd_pcm_hw_params_set_rate_last = _snd_pcm_hw_params_set_rate_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_last>();\n\n  int snd_pcm_hw_params_set_rate_resample(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_rate_resample(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_rate_resample_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_rate_resample>>(\n          'snd_pcm_hw_params_set_rate_resample');\n  late final _dart_snd_pcm_hw_params_set_rate_resample\n      _snd_pcm_hw_params_set_rate_resample =\n      _snd_pcm_hw_params_set_rate_resample_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_rate_resample>();\n\n  int snd_pcm_hw_params_get_rate_resample(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_rate_resample(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_rate_resample_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_rate_resample>>(\n          'snd_pcm_hw_params_get_rate_resample');\n  late final _dart_snd_pcm_hw_params_get_rate_resample\n      _snd_pcm_hw_params_get_rate_resample =\n      _snd_pcm_hw_params_get_rate_resample_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_rate_resample>();\n\n  int snd_pcm_hw_params_set_export_buffer(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_export_buffer(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_export_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_export_buffer>>(\n          'snd_pcm_hw_params_set_export_buffer');\n  late final _dart_snd_pcm_hw_params_set_export_buffer\n      _snd_pcm_hw_params_set_export_buffer =\n      _snd_pcm_hw_params_set_export_buffer_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_export_buffer>();\n\n  int snd_pcm_hw_params_get_export_buffer(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_export_buffer(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_export_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_export_buffer>>(\n          'snd_pcm_hw_params_get_export_buffer');\n  late final _dart_snd_pcm_hw_params_get_export_buffer\n      _snd_pcm_hw_params_get_export_buffer =\n      _snd_pcm_hw_params_get_export_buffer_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_export_buffer>();\n\n  int snd_pcm_hw_params_set_period_wakeup(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_period_wakeup(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_wakeup_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_wakeup>>(\n          'snd_pcm_hw_params_set_period_wakeup');\n  late final _dart_snd_pcm_hw_params_set_period_wakeup\n      _snd_pcm_hw_params_set_period_wakeup =\n      _snd_pcm_hw_params_set_period_wakeup_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_wakeup>();\n\n  int snd_pcm_hw_params_get_period_wakeup(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_hw_params_get_period_wakeup(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_wakeup_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_wakeup>>(\n          'snd_pcm_hw_params_get_period_wakeup');\n  late final _dart_snd_pcm_hw_params_get_period_wakeup\n      _snd_pcm_hw_params_get_period_wakeup =\n      _snd_pcm_hw_params_get_period_wakeup_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_wakeup>();\n\n  int snd_pcm_hw_params_get_period_time(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_time(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_time>>(\n          'snd_pcm_hw_params_get_period_time');\n  late final _dart_snd_pcm_hw_params_get_period_time\n      _snd_pcm_hw_params_get_period_time =\n      _snd_pcm_hw_params_get_period_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_time>();\n\n  int snd_pcm_hw_params_get_period_time_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_time_min(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_time_min>>(\n          'snd_pcm_hw_params_get_period_time_min');\n  late final _dart_snd_pcm_hw_params_get_period_time_min\n      _snd_pcm_hw_params_get_period_time_min =\n      _snd_pcm_hw_params_get_period_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_time_min>();\n\n  int snd_pcm_hw_params_get_period_time_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_time_max(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_time_max>>(\n          'snd_pcm_hw_params_get_period_time_max');\n  late final _dart_snd_pcm_hw_params_get_period_time_max\n      _snd_pcm_hw_params_get_period_time_max =\n      _snd_pcm_hw_params_get_period_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_time_max>();\n\n  int snd_pcm_hw_params_test_period_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_period_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_period_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_period_time>>(\n          'snd_pcm_hw_params_test_period_time');\n  late final _dart_snd_pcm_hw_params_test_period_time\n      _snd_pcm_hw_params_test_period_time =\n      _snd_pcm_hw_params_test_period_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_period_time>();\n\n  int snd_pcm_hw_params_set_period_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time>>(\n          'snd_pcm_hw_params_set_period_time');\n  late final _dart_snd_pcm_hw_params_set_period_time\n      _snd_pcm_hw_params_set_period_time =\n      _snd_pcm_hw_params_set_period_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time>();\n\n  int snd_pcm_hw_params_set_period_time_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_min>>(\n          'snd_pcm_hw_params_set_period_time_min');\n  late final _dart_snd_pcm_hw_params_set_period_time_min\n      _snd_pcm_hw_params_set_period_time_min =\n      _snd_pcm_hw_params_set_period_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_min>();\n\n  int snd_pcm_hw_params_set_period_time_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_max>>(\n          'snd_pcm_hw_params_set_period_time_max');\n  late final _dart_snd_pcm_hw_params_set_period_time_max\n      _snd_pcm_hw_params_set_period_time_max =\n      _snd_pcm_hw_params_set_period_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_max>();\n\n  int snd_pcm_hw_params_set_period_time_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint32> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_minmax>>(\n          'snd_pcm_hw_params_set_period_time_minmax');\n  late final _dart_snd_pcm_hw_params_set_period_time_minmax\n      _snd_pcm_hw_params_set_period_time_minmax =\n      _snd_pcm_hw_params_set_period_time_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_minmax>();\n\n  int snd_pcm_hw_params_set_period_time_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_near>>(\n          'snd_pcm_hw_params_set_period_time_near');\n  late final _dart_snd_pcm_hw_params_set_period_time_near\n      _snd_pcm_hw_params_set_period_time_near =\n      _snd_pcm_hw_params_set_period_time_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_near>();\n\n  int snd_pcm_hw_params_set_period_time_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_first>>(\n          'snd_pcm_hw_params_set_period_time_first');\n  late final _dart_snd_pcm_hw_params_set_period_time_first\n      _snd_pcm_hw_params_set_period_time_first =\n      _snd_pcm_hw_params_set_period_time_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_first>();\n\n  int snd_pcm_hw_params_set_period_time_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_time_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_time_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_time_last>>(\n          'snd_pcm_hw_params_set_period_time_last');\n  late final _dart_snd_pcm_hw_params_set_period_time_last\n      _snd_pcm_hw_params_set_period_time_last =\n      _snd_pcm_hw_params_set_period_time_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_time_last>();\n\n  int snd_pcm_hw_params_get_period_size(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> frames,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_size(\n      params,\n      frames,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_size>>(\n          'snd_pcm_hw_params_get_period_size');\n  late final _dart_snd_pcm_hw_params_get_period_size\n      _snd_pcm_hw_params_get_period_size =\n      _snd_pcm_hw_params_get_period_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_size>();\n\n  int snd_pcm_hw_params_get_period_size_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> frames,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_size_min(\n      params,\n      frames,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_size_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_size_min>>(\n          'snd_pcm_hw_params_get_period_size_min');\n  late final _dart_snd_pcm_hw_params_get_period_size_min\n      _snd_pcm_hw_params_get_period_size_min =\n      _snd_pcm_hw_params_get_period_size_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_size_min>();\n\n  int snd_pcm_hw_params_get_period_size_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> frames,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_period_size_max(\n      params,\n      frames,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_period_size_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_period_size_max>>(\n          'snd_pcm_hw_params_get_period_size_max');\n  late final _dart_snd_pcm_hw_params_get_period_size_max\n      _snd_pcm_hw_params_get_period_size_max =\n      _snd_pcm_hw_params_get_period_size_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_period_size_max>();\n\n  int snd_pcm_hw_params_test_period_size(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_period_size(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_period_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_period_size>>(\n          'snd_pcm_hw_params_test_period_size');\n  late final _dart_snd_pcm_hw_params_test_period_size\n      _snd_pcm_hw_params_test_period_size =\n      _snd_pcm_hw_params_test_period_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_period_size>();\n\n  int snd_pcm_hw_params_set_period_size(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size>>(\n          'snd_pcm_hw_params_set_period_size');\n  late final _dart_snd_pcm_hw_params_set_period_size\n      _snd_pcm_hw_params_set_period_size =\n      _snd_pcm_hw_params_set_period_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size>();\n\n  int snd_pcm_hw_params_set_period_size_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_min>>(\n          'snd_pcm_hw_params_set_period_size_min');\n  late final _dart_snd_pcm_hw_params_set_period_size_min\n      _snd_pcm_hw_params_set_period_size_min =\n      _snd_pcm_hw_params_set_period_size_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_min>();\n\n  int snd_pcm_hw_params_set_period_size_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_max>>(\n          'snd_pcm_hw_params_set_period_size_max');\n  late final _dart_snd_pcm_hw_params_set_period_size_max\n      _snd_pcm_hw_params_set_period_size_max =\n      _snd_pcm_hw_params_set_period_size_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_max>();\n\n  int snd_pcm_hw_params_set_period_size_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint64> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_minmax>>(\n          'snd_pcm_hw_params_set_period_size_minmax');\n  late final _dart_snd_pcm_hw_params_set_period_size_minmax\n      _snd_pcm_hw_params_set_period_size_minmax =\n      _snd_pcm_hw_params_set_period_size_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_minmax>();\n\n  int snd_pcm_hw_params_set_period_size_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_near>>(\n          'snd_pcm_hw_params_set_period_size_near');\n  late final _dart_snd_pcm_hw_params_set_period_size_near\n      _snd_pcm_hw_params_set_period_size_near =\n      _snd_pcm_hw_params_set_period_size_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_near>();\n\n  int snd_pcm_hw_params_set_period_size_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_first>>(\n          'snd_pcm_hw_params_set_period_size_first');\n  late final _dart_snd_pcm_hw_params_set_period_size_first\n      _snd_pcm_hw_params_set_period_size_first =\n      _snd_pcm_hw_params_set_period_size_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_first>();\n\n  int snd_pcm_hw_params_set_period_size_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_last>>(\n          'snd_pcm_hw_params_set_period_size_last');\n  late final _dart_snd_pcm_hw_params_set_period_size_last\n      _snd_pcm_hw_params_set_period_size_last =\n      _snd_pcm_hw_params_set_period_size_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_last>();\n\n  int snd_pcm_hw_params_set_period_size_integer(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_set_period_size_integer(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_period_size_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_period_size_integer>>(\n          'snd_pcm_hw_params_set_period_size_integer');\n  late final _dart_snd_pcm_hw_params_set_period_size_integer\n      _snd_pcm_hw_params_set_period_size_integer =\n      _snd_pcm_hw_params_set_period_size_integer_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_period_size_integer>();\n\n  int snd_pcm_hw_params_get_periods(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_periods(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_periods_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_periods>>(\n          'snd_pcm_hw_params_get_periods');\n  late final _dart_snd_pcm_hw_params_get_periods\n      _snd_pcm_hw_params_get_periods = _snd_pcm_hw_params_get_periods_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_periods>();\n\n  int snd_pcm_hw_params_get_periods_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_periods_min(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_periods_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_periods_min>>(\n          'snd_pcm_hw_params_get_periods_min');\n  late final _dart_snd_pcm_hw_params_get_periods_min\n      _snd_pcm_hw_params_get_periods_min =\n      _snd_pcm_hw_params_get_periods_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_periods_min>();\n\n  int snd_pcm_hw_params_get_periods_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_periods_max(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_periods_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_periods_max>>(\n          'snd_pcm_hw_params_get_periods_max');\n  late final _dart_snd_pcm_hw_params_get_periods_max\n      _snd_pcm_hw_params_get_periods_max =\n      _snd_pcm_hw_params_get_periods_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_periods_max>();\n\n  int snd_pcm_hw_params_test_periods(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_periods(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_periods_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_periods>>(\n          'snd_pcm_hw_params_test_periods');\n  late final _dart_snd_pcm_hw_params_test_periods\n      _snd_pcm_hw_params_test_periods = _snd_pcm_hw_params_test_periods_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_periods>();\n\n  int snd_pcm_hw_params_set_periods(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods>>(\n          'snd_pcm_hw_params_set_periods');\n  late final _dart_snd_pcm_hw_params_set_periods\n      _snd_pcm_hw_params_set_periods = _snd_pcm_hw_params_set_periods_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods>();\n\n  int snd_pcm_hw_params_set_periods_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_min>>(\n          'snd_pcm_hw_params_set_periods_min');\n  late final _dart_snd_pcm_hw_params_set_periods_min\n      _snd_pcm_hw_params_set_periods_min =\n      _snd_pcm_hw_params_set_periods_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_min>();\n\n  int snd_pcm_hw_params_set_periods_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_max>>(\n          'snd_pcm_hw_params_set_periods_max');\n  late final _dart_snd_pcm_hw_params_set_periods_max\n      _snd_pcm_hw_params_set_periods_max =\n      _snd_pcm_hw_params_set_periods_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_max>();\n\n  int snd_pcm_hw_params_set_periods_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint32> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_minmax>>(\n          'snd_pcm_hw_params_set_periods_minmax');\n  late final _dart_snd_pcm_hw_params_set_periods_minmax\n      _snd_pcm_hw_params_set_periods_minmax =\n      _snd_pcm_hw_params_set_periods_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_minmax>();\n\n  int snd_pcm_hw_params_set_periods_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_near>>(\n          'snd_pcm_hw_params_set_periods_near');\n  late final _dart_snd_pcm_hw_params_set_periods_near\n      _snd_pcm_hw_params_set_periods_near =\n      _snd_pcm_hw_params_set_periods_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_near>();\n\n  int snd_pcm_hw_params_set_periods_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_first>>(\n          'snd_pcm_hw_params_set_periods_first');\n  late final _dart_snd_pcm_hw_params_set_periods_first\n      _snd_pcm_hw_params_set_periods_first =\n      _snd_pcm_hw_params_set_periods_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_first>();\n\n  int snd_pcm_hw_params_set_periods_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_periods_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_last>>(\n          'snd_pcm_hw_params_set_periods_last');\n  late final _dart_snd_pcm_hw_params_set_periods_last\n      _snd_pcm_hw_params_set_periods_last =\n      _snd_pcm_hw_params_set_periods_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_last>();\n\n  int snd_pcm_hw_params_set_periods_integer(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n  ) {\n    return _snd_pcm_hw_params_set_periods_integer(\n      pcm,\n      params,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_periods_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_periods_integer>>(\n          'snd_pcm_hw_params_set_periods_integer');\n  late final _dart_snd_pcm_hw_params_set_periods_integer\n      _snd_pcm_hw_params_set_periods_integer =\n      _snd_pcm_hw_params_set_periods_integer_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_periods_integer>();\n\n  int snd_pcm_hw_params_get_buffer_time(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_time(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_time>>(\n          'snd_pcm_hw_params_get_buffer_time');\n  late final _dart_snd_pcm_hw_params_get_buffer_time\n      _snd_pcm_hw_params_get_buffer_time =\n      _snd_pcm_hw_params_get_buffer_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_time>();\n\n  int snd_pcm_hw_params_get_buffer_time_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_time_min(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_time_min>>(\n          'snd_pcm_hw_params_get_buffer_time_min');\n  late final _dart_snd_pcm_hw_params_get_buffer_time_min\n      _snd_pcm_hw_params_get_buffer_time_min =\n      _snd_pcm_hw_params_get_buffer_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_time_min>();\n\n  int snd_pcm_hw_params_get_buffer_time_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_time_max(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_time_max>>(\n          'snd_pcm_hw_params_get_buffer_time_max');\n  late final _dart_snd_pcm_hw_params_get_buffer_time_max\n      _snd_pcm_hw_params_get_buffer_time_max =\n      _snd_pcm_hw_params_get_buffer_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_time_max>();\n\n  int snd_pcm_hw_params_test_buffer_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_buffer_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_buffer_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_buffer_time>>(\n          'snd_pcm_hw_params_test_buffer_time');\n  late final _dart_snd_pcm_hw_params_test_buffer_time\n      _snd_pcm_hw_params_test_buffer_time =\n      _snd_pcm_hw_params_test_buffer_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_buffer_time>();\n\n  int snd_pcm_hw_params_set_buffer_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time>>(\n          'snd_pcm_hw_params_set_buffer_time');\n  late final _dart_snd_pcm_hw_params_set_buffer_time\n      _snd_pcm_hw_params_set_buffer_time =\n      _snd_pcm_hw_params_set_buffer_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time>();\n\n  int snd_pcm_hw_params_set_buffer_time_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_min>>(\n          'snd_pcm_hw_params_set_buffer_time_min');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_min\n      _snd_pcm_hw_params_set_buffer_time_min =\n      _snd_pcm_hw_params_set_buffer_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_min>();\n\n  int snd_pcm_hw_params_set_buffer_time_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_max>>(\n          'snd_pcm_hw_params_set_buffer_time_max');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_max\n      _snd_pcm_hw_params_set_buffer_time_max =\n      _snd_pcm_hw_params_set_buffer_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_max>();\n\n  int snd_pcm_hw_params_set_buffer_time_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint32> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_minmax>>(\n          'snd_pcm_hw_params_set_buffer_time_minmax');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_minmax\n      _snd_pcm_hw_params_set_buffer_time_minmax =\n      _snd_pcm_hw_params_set_buffer_time_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_minmax>();\n\n  int snd_pcm_hw_params_set_buffer_time_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_near>>(\n          'snd_pcm_hw_params_set_buffer_time_near');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_near\n      _snd_pcm_hw_params_set_buffer_time_near =\n      _snd_pcm_hw_params_set_buffer_time_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_near>();\n\n  int snd_pcm_hw_params_set_buffer_time_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_first>>(\n          'snd_pcm_hw_params_set_buffer_time_first');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_first\n      _snd_pcm_hw_params_set_buffer_time_first =\n      _snd_pcm_hw_params_set_buffer_time_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_first>();\n\n  int snd_pcm_hw_params_set_buffer_time_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_time_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_time_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_time_last>>(\n          'snd_pcm_hw_params_set_buffer_time_last');\n  late final _dart_snd_pcm_hw_params_set_buffer_time_last\n      _snd_pcm_hw_params_set_buffer_time_last =\n      _snd_pcm_hw_params_set_buffer_time_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_time_last>();\n\n  int snd_pcm_hw_params_get_buffer_size(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_size(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_size>>(\n          'snd_pcm_hw_params_get_buffer_size');\n  late final _dart_snd_pcm_hw_params_get_buffer_size\n      _snd_pcm_hw_params_get_buffer_size =\n      _snd_pcm_hw_params_get_buffer_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_size>();\n\n  int snd_pcm_hw_params_get_buffer_size_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_size_min(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_size_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_size_min>>(\n          'snd_pcm_hw_params_get_buffer_size_min');\n  late final _dart_snd_pcm_hw_params_get_buffer_size_min\n      _snd_pcm_hw_params_get_buffer_size_min =\n      _snd_pcm_hw_params_get_buffer_size_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_size_min>();\n\n  int snd_pcm_hw_params_get_buffer_size_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_get_buffer_size_max(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_buffer_size_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_buffer_size_max>>(\n          'snd_pcm_hw_params_get_buffer_size_max');\n  late final _dart_snd_pcm_hw_params_get_buffer_size_max\n      _snd_pcm_hw_params_get_buffer_size_max =\n      _snd_pcm_hw_params_get_buffer_size_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_buffer_size_max>();\n\n  int snd_pcm_hw_params_test_buffer_size(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_test_buffer_size(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_buffer_size>>(\n          'snd_pcm_hw_params_test_buffer_size');\n  late final _dart_snd_pcm_hw_params_test_buffer_size\n      _snd_pcm_hw_params_test_buffer_size =\n      _snd_pcm_hw_params_test_buffer_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_buffer_size>();\n\n  int snd_pcm_hw_params_set_buffer_size(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size>>(\n          'snd_pcm_hw_params_set_buffer_size');\n  late final _dart_snd_pcm_hw_params_set_buffer_size\n      _snd_pcm_hw_params_set_buffer_size =\n      _snd_pcm_hw_params_set_buffer_size_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size>();\n\n  int snd_pcm_hw_params_set_buffer_size_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_min(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_min>>(\n          'snd_pcm_hw_params_set_buffer_size_min');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_min\n      _snd_pcm_hw_params_set_buffer_size_min =\n      _snd_pcm_hw_params_set_buffer_size_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_min>();\n\n  int snd_pcm_hw_params_set_buffer_size_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_max(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_max>>(\n          'snd_pcm_hw_params_set_buffer_size_max');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_max\n      _snd_pcm_hw_params_set_buffer_size_max =\n      _snd_pcm_hw_params_set_buffer_size_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_max>();\n\n  int snd_pcm_hw_params_set_buffer_size_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> min,\n    ffi.Pointer<ffi.Uint64> max,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_minmax(\n      pcm,\n      params,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_minmax>>(\n          'snd_pcm_hw_params_set_buffer_size_minmax');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_minmax\n      _snd_pcm_hw_params_set_buffer_size_minmax =\n      _snd_pcm_hw_params_set_buffer_size_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_minmax>();\n\n  int snd_pcm_hw_params_set_buffer_size_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_near(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_near>>(\n          'snd_pcm_hw_params_set_buffer_size_near');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_near\n      _snd_pcm_hw_params_set_buffer_size_near =\n      _snd_pcm_hw_params_set_buffer_size_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_near>();\n\n  int snd_pcm_hw_params_set_buffer_size_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_first(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_first>>(\n          'snd_pcm_hw_params_set_buffer_size_first');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_first\n      _snd_pcm_hw_params_set_buffer_size_first =\n      _snd_pcm_hw_params_set_buffer_size_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_first>();\n\n  int snd_pcm_hw_params_set_buffer_size_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_set_buffer_size_last(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_buffer_size_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_buffer_size_last>>(\n          'snd_pcm_hw_params_set_buffer_size_last');\n  late final _dart_snd_pcm_hw_params_set_buffer_size_last\n      _snd_pcm_hw_params_set_buffer_size_last =\n      _snd_pcm_hw_params_set_buffer_size_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_buffer_size_last>();\n\n  int snd_pcm_hw_params_get_min_align(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_hw_params_get_min_align(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_min_align_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_min_align>>(\n          'snd_pcm_hw_params_get_min_align');\n  late final _dart_snd_pcm_hw_params_get_min_align\n      _snd_pcm_hw_params_get_min_align = _snd_pcm_hw_params_get_min_align_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_min_align>();\n\n  int snd_pcm_sw_params_sizeof() {\n    return _snd_pcm_sw_params_sizeof();\n  }\n\n  late final _snd_pcm_sw_params_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_sizeof>>(\n          'snd_pcm_sw_params_sizeof');\n  late final _dart_snd_pcm_sw_params_sizeof _snd_pcm_sw_params_sizeof =\n      _snd_pcm_sw_params_sizeof_ptr\n          .asFunction<_dart_snd_pcm_sw_params_sizeof>();\n\n  int snd_pcm_sw_params_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_sw_params_>> ptr,\n  ) {\n    return _snd_pcm_sw_params_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_sw_params_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_malloc>>(\n          'snd_pcm_sw_params_malloc');\n  late final _dart_snd_pcm_sw_params_malloc _snd_pcm_sw_params_malloc =\n      _snd_pcm_sw_params_malloc_ptr\n          .asFunction<_dart_snd_pcm_sw_params_malloc>();\n\n  void snd_pcm_sw_params_free(\n    ffi.Pointer<snd_pcm_sw_params_> obj,\n  ) {\n    return _snd_pcm_sw_params_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_sw_params_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_free>>(\n          'snd_pcm_sw_params_free');\n  late final _dart_snd_pcm_sw_params_free _snd_pcm_sw_params_free =\n      _snd_pcm_sw_params_free_ptr.asFunction<_dart_snd_pcm_sw_params_free>();\n\n  void snd_pcm_sw_params_copy(\n    ffi.Pointer<snd_pcm_sw_params_> dst,\n    ffi.Pointer<snd_pcm_sw_params_> src,\n  ) {\n    return _snd_pcm_sw_params_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_sw_params_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_copy>>(\n          'snd_pcm_sw_params_copy');\n  late final _dart_snd_pcm_sw_params_copy _snd_pcm_sw_params_copy =\n      _snd_pcm_sw_params_copy_ptr.asFunction<_dart_snd_pcm_sw_params_copy>();\n\n  int snd_pcm_sw_params_get_boundary(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_boundary(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_boundary_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_boundary>>(\n          'snd_pcm_sw_params_get_boundary');\n  late final _dart_snd_pcm_sw_params_get_boundary\n      _snd_pcm_sw_params_get_boundary = _snd_pcm_sw_params_get_boundary_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_boundary>();\n\n  int snd_pcm_sw_params_set_tstamp_mode(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_tstamp_mode(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_tstamp_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_tstamp_mode>>(\n          'snd_pcm_sw_params_set_tstamp_mode');\n  late final _dart_snd_pcm_sw_params_set_tstamp_mode\n      _snd_pcm_sw_params_set_tstamp_mode =\n      _snd_pcm_sw_params_set_tstamp_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_tstamp_mode>();\n\n  int snd_pcm_sw_params_get_tstamp_mode(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Int32> val,\n  ) {\n    return _snd_pcm_sw_params_get_tstamp_mode(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_tstamp_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_tstamp_mode>>(\n          'snd_pcm_sw_params_get_tstamp_mode');\n  late final _dart_snd_pcm_sw_params_get_tstamp_mode\n      _snd_pcm_sw_params_get_tstamp_mode =\n      _snd_pcm_sw_params_get_tstamp_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_tstamp_mode>();\n\n  int snd_pcm_sw_params_set_tstamp_type(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_tstamp_type(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_tstamp_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_tstamp_type>>(\n          'snd_pcm_sw_params_set_tstamp_type');\n  late final _dart_snd_pcm_sw_params_set_tstamp_type\n      _snd_pcm_sw_params_set_tstamp_type =\n      _snd_pcm_sw_params_set_tstamp_type_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_tstamp_type>();\n\n  int snd_pcm_sw_params_get_tstamp_type(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Int32> val,\n  ) {\n    return _snd_pcm_sw_params_get_tstamp_type(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_tstamp_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_tstamp_type>>(\n          'snd_pcm_sw_params_get_tstamp_type');\n  late final _dart_snd_pcm_sw_params_get_tstamp_type\n      _snd_pcm_sw_params_get_tstamp_type =\n      _snd_pcm_sw_params_get_tstamp_type_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_tstamp_type>();\n\n  int snd_pcm_sw_params_set_avail_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_avail_min(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_avail_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_avail_min>>(\n          'snd_pcm_sw_params_set_avail_min');\n  late final _dart_snd_pcm_sw_params_set_avail_min\n      _snd_pcm_sw_params_set_avail_min = _snd_pcm_sw_params_set_avail_min_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_avail_min>();\n\n  int snd_pcm_sw_params_get_avail_min(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_avail_min(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_avail_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_avail_min>>(\n          'snd_pcm_sw_params_get_avail_min');\n  late final _dart_snd_pcm_sw_params_get_avail_min\n      _snd_pcm_sw_params_get_avail_min = _snd_pcm_sw_params_get_avail_min_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_avail_min>();\n\n  int snd_pcm_sw_params_set_period_event(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_period_event(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_period_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_period_event>>(\n          'snd_pcm_sw_params_set_period_event');\n  late final _dart_snd_pcm_sw_params_set_period_event\n      _snd_pcm_sw_params_set_period_event =\n      _snd_pcm_sw_params_set_period_event_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_period_event>();\n\n  int snd_pcm_sw_params_get_period_event(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Int32> val,\n  ) {\n    return _snd_pcm_sw_params_get_period_event(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_period_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_period_event>>(\n          'snd_pcm_sw_params_get_period_event');\n  late final _dart_snd_pcm_sw_params_get_period_event\n      _snd_pcm_sw_params_get_period_event =\n      _snd_pcm_sw_params_get_period_event_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_period_event>();\n\n  int snd_pcm_sw_params_set_start_threshold(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_start_threshold(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_start_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_start_threshold>>(\n          'snd_pcm_sw_params_set_start_threshold');\n  late final _dart_snd_pcm_sw_params_set_start_threshold\n      _snd_pcm_sw_params_set_start_threshold =\n      _snd_pcm_sw_params_set_start_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_start_threshold>();\n\n  int snd_pcm_sw_params_get_start_threshold(\n    ffi.Pointer<snd_pcm_sw_params_> paramsm,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_start_threshold(\n      paramsm,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_start_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_start_threshold>>(\n          'snd_pcm_sw_params_get_start_threshold');\n  late final _dart_snd_pcm_sw_params_get_start_threshold\n      _snd_pcm_sw_params_get_start_threshold =\n      _snd_pcm_sw_params_get_start_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_start_threshold>();\n\n  int snd_pcm_sw_params_set_stop_threshold(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_stop_threshold(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_stop_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_stop_threshold>>(\n          'snd_pcm_sw_params_set_stop_threshold');\n  late final _dart_snd_pcm_sw_params_set_stop_threshold\n      _snd_pcm_sw_params_set_stop_threshold =\n      _snd_pcm_sw_params_set_stop_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_stop_threshold>();\n\n  int snd_pcm_sw_params_get_stop_threshold(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_stop_threshold(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_stop_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_stop_threshold>>(\n          'snd_pcm_sw_params_get_stop_threshold');\n  late final _dart_snd_pcm_sw_params_get_stop_threshold\n      _snd_pcm_sw_params_get_stop_threshold =\n      _snd_pcm_sw_params_get_stop_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_stop_threshold>();\n\n  int snd_pcm_sw_params_set_silence_threshold(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_silence_threshold(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_silence_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_silence_threshold>>(\n          'snd_pcm_sw_params_set_silence_threshold');\n  late final _dart_snd_pcm_sw_params_set_silence_threshold\n      _snd_pcm_sw_params_set_silence_threshold =\n      _snd_pcm_sw_params_set_silence_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_silence_threshold>();\n\n  int snd_pcm_sw_params_get_silence_threshold(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_silence_threshold(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_silence_threshold_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_silence_threshold>>(\n          'snd_pcm_sw_params_get_silence_threshold');\n  late final _dart_snd_pcm_sw_params_get_silence_threshold\n      _snd_pcm_sw_params_get_silence_threshold =\n      _snd_pcm_sw_params_get_silence_threshold_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_silence_threshold>();\n\n  int snd_pcm_sw_params_set_silence_size(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_silence_size(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_silence_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_silence_size>>(\n          'snd_pcm_sw_params_set_silence_size');\n  late final _dart_snd_pcm_sw_params_set_silence_size\n      _snd_pcm_sw_params_set_silence_size =\n      _snd_pcm_sw_params_set_silence_size_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_silence_size>();\n\n  int snd_pcm_sw_params_get_silence_size(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_silence_size(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_silence_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_silence_size>>(\n          'snd_pcm_sw_params_get_silence_size');\n  late final _dart_snd_pcm_sw_params_get_silence_size\n      _snd_pcm_sw_params_get_silence_size =\n      _snd_pcm_sw_params_get_silence_size_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_silence_size>();\n\n  int snd_pcm_access_mask_sizeof() {\n    return _snd_pcm_access_mask_sizeof();\n  }\n\n  late final _snd_pcm_access_mask_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_sizeof>>(\n          'snd_pcm_access_mask_sizeof');\n  late final _dart_snd_pcm_access_mask_sizeof _snd_pcm_access_mask_sizeof =\n      _snd_pcm_access_mask_sizeof_ptr\n          .asFunction<_dart_snd_pcm_access_mask_sizeof>();\n\n  int snd_pcm_access_mask_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_access_mask_>> ptr,\n  ) {\n    return _snd_pcm_access_mask_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_access_mask_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_malloc>>(\n          'snd_pcm_access_mask_malloc');\n  late final _dart_snd_pcm_access_mask_malloc _snd_pcm_access_mask_malloc =\n      _snd_pcm_access_mask_malloc_ptr\n          .asFunction<_dart_snd_pcm_access_mask_malloc>();\n\n  void snd_pcm_access_mask_free(\n    ffi.Pointer<snd_pcm_access_mask_> obj,\n  ) {\n    return _snd_pcm_access_mask_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_access_mask_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_free>>(\n          'snd_pcm_access_mask_free');\n  late final _dart_snd_pcm_access_mask_free _snd_pcm_access_mask_free =\n      _snd_pcm_access_mask_free_ptr\n          .asFunction<_dart_snd_pcm_access_mask_free>();\n\n  void snd_pcm_access_mask_copy(\n    ffi.Pointer<snd_pcm_access_mask_> dst,\n    ffi.Pointer<snd_pcm_access_mask_> src,\n  ) {\n    return _snd_pcm_access_mask_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_access_mask_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_copy>>(\n          'snd_pcm_access_mask_copy');\n  late final _dart_snd_pcm_access_mask_copy _snd_pcm_access_mask_copy =\n      _snd_pcm_access_mask_copy_ptr\n          .asFunction<_dart_snd_pcm_access_mask_copy>();\n\n  void snd_pcm_access_mask_none(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n  ) {\n    return _snd_pcm_access_mask_none(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_access_mask_none_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_none>>(\n          'snd_pcm_access_mask_none');\n  late final _dart_snd_pcm_access_mask_none _snd_pcm_access_mask_none =\n      _snd_pcm_access_mask_none_ptr\n          .asFunction<_dart_snd_pcm_access_mask_none>();\n\n  void snd_pcm_access_mask_any(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n  ) {\n    return _snd_pcm_access_mask_any(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_access_mask_any_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_any>>(\n          'snd_pcm_access_mask_any');\n  late final _dart_snd_pcm_access_mask_any _snd_pcm_access_mask_any =\n      _snd_pcm_access_mask_any_ptr.asFunction<_dart_snd_pcm_access_mask_any>();\n\n  int snd_pcm_access_mask_test(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_access_mask_test(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_access_mask_test_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_test>>(\n          'snd_pcm_access_mask_test');\n  late final _dart_snd_pcm_access_mask_test _snd_pcm_access_mask_test =\n      _snd_pcm_access_mask_test_ptr\n          .asFunction<_dart_snd_pcm_access_mask_test>();\n\n  int snd_pcm_access_mask_empty(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n  ) {\n    return _snd_pcm_access_mask_empty(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_access_mask_empty_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_empty>>(\n          'snd_pcm_access_mask_empty');\n  late final _dart_snd_pcm_access_mask_empty _snd_pcm_access_mask_empty =\n      _snd_pcm_access_mask_empty_ptr\n          .asFunction<_dart_snd_pcm_access_mask_empty>();\n\n  void snd_pcm_access_mask_set(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_access_mask_set(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_access_mask_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_set>>(\n          'snd_pcm_access_mask_set');\n  late final _dart_snd_pcm_access_mask_set _snd_pcm_access_mask_set =\n      _snd_pcm_access_mask_set_ptr.asFunction<_dart_snd_pcm_access_mask_set>();\n\n  void snd_pcm_access_mask_reset(\n    ffi.Pointer<snd_pcm_access_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_access_mask_reset(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_access_mask_reset_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_mask_reset>>(\n          'snd_pcm_access_mask_reset');\n  late final _dart_snd_pcm_access_mask_reset _snd_pcm_access_mask_reset =\n      _snd_pcm_access_mask_reset_ptr\n          .asFunction<_dart_snd_pcm_access_mask_reset>();\n\n  int snd_pcm_format_mask_sizeof() {\n    return _snd_pcm_format_mask_sizeof();\n  }\n\n  late final _snd_pcm_format_mask_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_sizeof>>(\n          'snd_pcm_format_mask_sizeof');\n  late final _dart_snd_pcm_format_mask_sizeof _snd_pcm_format_mask_sizeof =\n      _snd_pcm_format_mask_sizeof_ptr\n          .asFunction<_dart_snd_pcm_format_mask_sizeof>();\n\n  int snd_pcm_format_mask_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_format_mask_>> ptr,\n  ) {\n    return _snd_pcm_format_mask_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_format_mask_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_malloc>>(\n          'snd_pcm_format_mask_malloc');\n  late final _dart_snd_pcm_format_mask_malloc _snd_pcm_format_mask_malloc =\n      _snd_pcm_format_mask_malloc_ptr\n          .asFunction<_dart_snd_pcm_format_mask_malloc>();\n\n  void snd_pcm_format_mask_free(\n    ffi.Pointer<snd_pcm_format_mask_> obj,\n  ) {\n    return _snd_pcm_format_mask_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_format_mask_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_free>>(\n          'snd_pcm_format_mask_free');\n  late final _dart_snd_pcm_format_mask_free _snd_pcm_format_mask_free =\n      _snd_pcm_format_mask_free_ptr\n          .asFunction<_dart_snd_pcm_format_mask_free>();\n\n  void snd_pcm_format_mask_copy(\n    ffi.Pointer<snd_pcm_format_mask_> dst,\n    ffi.Pointer<snd_pcm_format_mask_> src,\n  ) {\n    return _snd_pcm_format_mask_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_format_mask_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_copy>>(\n          'snd_pcm_format_mask_copy');\n  late final _dart_snd_pcm_format_mask_copy _snd_pcm_format_mask_copy =\n      _snd_pcm_format_mask_copy_ptr\n          .asFunction<_dart_snd_pcm_format_mask_copy>();\n\n  void snd_pcm_format_mask_none(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n  ) {\n    return _snd_pcm_format_mask_none(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_format_mask_none_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_none>>(\n          'snd_pcm_format_mask_none');\n  late final _dart_snd_pcm_format_mask_none _snd_pcm_format_mask_none =\n      _snd_pcm_format_mask_none_ptr\n          .asFunction<_dart_snd_pcm_format_mask_none>();\n\n  void snd_pcm_format_mask_any(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n  ) {\n    return _snd_pcm_format_mask_any(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_format_mask_any_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_any>>(\n          'snd_pcm_format_mask_any');\n  late final _dart_snd_pcm_format_mask_any _snd_pcm_format_mask_any =\n      _snd_pcm_format_mask_any_ptr.asFunction<_dart_snd_pcm_format_mask_any>();\n\n  int snd_pcm_format_mask_test(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_format_mask_test(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_format_mask_test_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_test>>(\n          'snd_pcm_format_mask_test');\n  late final _dart_snd_pcm_format_mask_test _snd_pcm_format_mask_test =\n      _snd_pcm_format_mask_test_ptr\n          .asFunction<_dart_snd_pcm_format_mask_test>();\n\n  int snd_pcm_format_mask_empty(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n  ) {\n    return _snd_pcm_format_mask_empty(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_format_mask_empty_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_empty>>(\n          'snd_pcm_format_mask_empty');\n  late final _dart_snd_pcm_format_mask_empty _snd_pcm_format_mask_empty =\n      _snd_pcm_format_mask_empty_ptr\n          .asFunction<_dart_snd_pcm_format_mask_empty>();\n\n  void snd_pcm_format_mask_set(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_format_mask_set(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_format_mask_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_set>>(\n          'snd_pcm_format_mask_set');\n  late final _dart_snd_pcm_format_mask_set _snd_pcm_format_mask_set =\n      _snd_pcm_format_mask_set_ptr.asFunction<_dart_snd_pcm_format_mask_set>();\n\n  void snd_pcm_format_mask_reset(\n    ffi.Pointer<snd_pcm_format_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_format_mask_reset(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_format_mask_reset_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_mask_reset>>(\n          'snd_pcm_format_mask_reset');\n  late final _dart_snd_pcm_format_mask_reset _snd_pcm_format_mask_reset =\n      _snd_pcm_format_mask_reset_ptr\n          .asFunction<_dart_snd_pcm_format_mask_reset>();\n\n  int snd_pcm_subformat_mask_sizeof() {\n    return _snd_pcm_subformat_mask_sizeof();\n  }\n\n  late final _snd_pcm_subformat_mask_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_sizeof>>(\n          'snd_pcm_subformat_mask_sizeof');\n  late final _dart_snd_pcm_subformat_mask_sizeof\n      _snd_pcm_subformat_mask_sizeof = _snd_pcm_subformat_mask_sizeof_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_sizeof>();\n\n  int snd_pcm_subformat_mask_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_subformat_mask_>> ptr,\n  ) {\n    return _snd_pcm_subformat_mask_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_malloc>>(\n          'snd_pcm_subformat_mask_malloc');\n  late final _dart_snd_pcm_subformat_mask_malloc\n      _snd_pcm_subformat_mask_malloc = _snd_pcm_subformat_mask_malloc_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_malloc>();\n\n  void snd_pcm_subformat_mask_free(\n    ffi.Pointer<snd_pcm_subformat_mask_> obj,\n  ) {\n    return _snd_pcm_subformat_mask_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_free>>(\n          'snd_pcm_subformat_mask_free');\n  late final _dart_snd_pcm_subformat_mask_free _snd_pcm_subformat_mask_free =\n      _snd_pcm_subformat_mask_free_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_free>();\n\n  void snd_pcm_subformat_mask_copy(\n    ffi.Pointer<snd_pcm_subformat_mask_> dst,\n    ffi.Pointer<snd_pcm_subformat_mask_> src,\n  ) {\n    return _snd_pcm_subformat_mask_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_copy>>(\n          'snd_pcm_subformat_mask_copy');\n  late final _dart_snd_pcm_subformat_mask_copy _snd_pcm_subformat_mask_copy =\n      _snd_pcm_subformat_mask_copy_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_copy>();\n\n  void snd_pcm_subformat_mask_none(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ) {\n    return _snd_pcm_subformat_mask_none(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_none_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_none>>(\n          'snd_pcm_subformat_mask_none');\n  late final _dart_snd_pcm_subformat_mask_none _snd_pcm_subformat_mask_none =\n      _snd_pcm_subformat_mask_none_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_none>();\n\n  void snd_pcm_subformat_mask_any(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ) {\n    return _snd_pcm_subformat_mask_any(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_any_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_any>>(\n          'snd_pcm_subformat_mask_any');\n  late final _dart_snd_pcm_subformat_mask_any _snd_pcm_subformat_mask_any =\n      _snd_pcm_subformat_mask_any_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_any>();\n\n  int snd_pcm_subformat_mask_test(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_subformat_mask_test(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_test_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_test>>(\n          'snd_pcm_subformat_mask_test');\n  late final _dart_snd_pcm_subformat_mask_test _snd_pcm_subformat_mask_test =\n      _snd_pcm_subformat_mask_test_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_test>();\n\n  int snd_pcm_subformat_mask_empty(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ) {\n    return _snd_pcm_subformat_mask_empty(\n      mask,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_empty_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_empty>>(\n          'snd_pcm_subformat_mask_empty');\n  late final _dart_snd_pcm_subformat_mask_empty _snd_pcm_subformat_mask_empty =\n      _snd_pcm_subformat_mask_empty_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_empty>();\n\n  void snd_pcm_subformat_mask_set(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_subformat_mask_set(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_set>>(\n          'snd_pcm_subformat_mask_set');\n  late final _dart_snd_pcm_subformat_mask_set _snd_pcm_subformat_mask_set =\n      _snd_pcm_subformat_mask_set_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_set>();\n\n  void snd_pcm_subformat_mask_reset(\n    ffi.Pointer<snd_pcm_subformat_mask_> mask,\n    int val,\n  ) {\n    return _snd_pcm_subformat_mask_reset(\n      mask,\n      val,\n    );\n  }\n\n  late final _snd_pcm_subformat_mask_reset_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_mask_reset>>(\n          'snd_pcm_subformat_mask_reset');\n  late final _dart_snd_pcm_subformat_mask_reset _snd_pcm_subformat_mask_reset =\n      _snd_pcm_subformat_mask_reset_ptr\n          .asFunction<_dart_snd_pcm_subformat_mask_reset>();\n\n  int snd_pcm_status_sizeof() {\n    return _snd_pcm_status_sizeof();\n  }\n\n  late final _snd_pcm_status_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_sizeof>>(\n          'snd_pcm_status_sizeof');\n  late final _dart_snd_pcm_status_sizeof _snd_pcm_status_sizeof =\n      _snd_pcm_status_sizeof_ptr.asFunction<_dart_snd_pcm_status_sizeof>();\n\n  int snd_pcm_status_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_status_>> ptr,\n  ) {\n    return _snd_pcm_status_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_malloc>>(\n          'snd_pcm_status_malloc');\n  late final _dart_snd_pcm_status_malloc _snd_pcm_status_malloc =\n      _snd_pcm_status_malloc_ptr.asFunction<_dart_snd_pcm_status_malloc>();\n\n  void snd_pcm_status_free(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_free(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_free>>(\n          'snd_pcm_status_free');\n  late final _dart_snd_pcm_status_free _snd_pcm_status_free =\n      _snd_pcm_status_free_ptr.asFunction<_dart_snd_pcm_status_free>();\n\n  void snd_pcm_status_copy(\n    ffi.Pointer<snd_pcm_status_> dst,\n    ffi.Pointer<snd_pcm_status_> src,\n  ) {\n    return _snd_pcm_status_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_pcm_status_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_copy>>(\n          'snd_pcm_status_copy');\n  late final _dart_snd_pcm_status_copy _snd_pcm_status_copy =\n      _snd_pcm_status_copy_ptr.asFunction<_dart_snd_pcm_status_copy>();\n\n  int snd_pcm_status_get_state(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_get_state(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_get_state_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_state>>(\n          'snd_pcm_status_get_state');\n  late final _dart_snd_pcm_status_get_state _snd_pcm_status_get_state =\n      _snd_pcm_status_get_state_ptr\n          .asFunction<_dart_snd_pcm_status_get_state>();\n\n  void snd_pcm_status_get_trigger_tstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timeval> ptr,\n  ) {\n    return _snd_pcm_status_get_trigger_tstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_trigger_tstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_trigger_tstamp>>(\n          'snd_pcm_status_get_trigger_tstamp');\n  late final _dart_snd_pcm_status_get_trigger_tstamp\n      _snd_pcm_status_get_trigger_tstamp =\n      _snd_pcm_status_get_trigger_tstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_trigger_tstamp>();\n\n  void snd_pcm_status_get_trigger_htstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timespec> ptr,\n  ) {\n    return _snd_pcm_status_get_trigger_htstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_trigger_htstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_trigger_htstamp>>(\n          'snd_pcm_status_get_trigger_htstamp');\n  late final _dart_snd_pcm_status_get_trigger_htstamp\n      _snd_pcm_status_get_trigger_htstamp =\n      _snd_pcm_status_get_trigger_htstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_trigger_htstamp>();\n\n  void snd_pcm_status_get_tstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timeval> ptr,\n  ) {\n    return _snd_pcm_status_get_tstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_tstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_tstamp>>(\n          'snd_pcm_status_get_tstamp');\n  late final _dart_snd_pcm_status_get_tstamp _snd_pcm_status_get_tstamp =\n      _snd_pcm_status_get_tstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_tstamp>();\n\n  void snd_pcm_status_get_htstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timespec> ptr,\n  ) {\n    return _snd_pcm_status_get_htstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_htstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_htstamp>>(\n          'snd_pcm_status_get_htstamp');\n  late final _dart_snd_pcm_status_get_htstamp _snd_pcm_status_get_htstamp =\n      _snd_pcm_status_get_htstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_htstamp>();\n\n  void snd_pcm_status_get_audio_htstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timespec> ptr,\n  ) {\n    return _snd_pcm_status_get_audio_htstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_audio_htstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_audio_htstamp>>(\n          'snd_pcm_status_get_audio_htstamp');\n  late final _dart_snd_pcm_status_get_audio_htstamp\n      _snd_pcm_status_get_audio_htstamp = _snd_pcm_status_get_audio_htstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_audio_htstamp>();\n\n  void snd_pcm_status_get_driver_htstamp(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<timespec> ptr,\n  ) {\n    return _snd_pcm_status_get_driver_htstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_status_get_driver_htstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_driver_htstamp>>(\n          'snd_pcm_status_get_driver_htstamp');\n  late final _dart_snd_pcm_status_get_driver_htstamp\n      _snd_pcm_status_get_driver_htstamp =\n      _snd_pcm_status_get_driver_htstamp_ptr\n          .asFunction<_dart_snd_pcm_status_get_driver_htstamp>();\n\n  void snd_pcm_status_get_audio_htstamp_report(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<snd_pcm_audio_tstamp_report_t> audio_tstamp_report,\n  ) {\n    return _snd_pcm_status_get_audio_htstamp_report(\n      obj,\n      audio_tstamp_report,\n    );\n  }\n\n  late final _snd_pcm_status_get_audio_htstamp_report_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_audio_htstamp_report>>(\n          'snd_pcm_status_get_audio_htstamp_report');\n  late final _dart_snd_pcm_status_get_audio_htstamp_report\n      _snd_pcm_status_get_audio_htstamp_report =\n      _snd_pcm_status_get_audio_htstamp_report_ptr\n          .asFunction<_dart_snd_pcm_status_get_audio_htstamp_report>();\n\n  void snd_pcm_status_set_audio_htstamp_config(\n    ffi.Pointer<snd_pcm_status_> obj,\n    ffi.Pointer<snd_pcm_audio_tstamp_config_t> audio_tstamp_config,\n  ) {\n    return _snd_pcm_status_set_audio_htstamp_config(\n      obj,\n      audio_tstamp_config,\n    );\n  }\n\n  late final _snd_pcm_status_set_audio_htstamp_config_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_set_audio_htstamp_config>>(\n          'snd_pcm_status_set_audio_htstamp_config');\n  late final _dart_snd_pcm_status_set_audio_htstamp_config\n      _snd_pcm_status_set_audio_htstamp_config =\n      _snd_pcm_status_set_audio_htstamp_config_ptr\n          .asFunction<_dart_snd_pcm_status_set_audio_htstamp_config>();\n\n  int snd_pcm_status_get_delay(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_get_delay(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_get_delay_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_delay>>(\n          'snd_pcm_status_get_delay');\n  late final _dart_snd_pcm_status_get_delay _snd_pcm_status_get_delay =\n      _snd_pcm_status_get_delay_ptr\n          .asFunction<_dart_snd_pcm_status_get_delay>();\n\n  int snd_pcm_status_get_avail(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_get_avail(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_get_avail_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_avail>>(\n          'snd_pcm_status_get_avail');\n  late final _dart_snd_pcm_status_get_avail _snd_pcm_status_get_avail =\n      _snd_pcm_status_get_avail_ptr\n          .asFunction<_dart_snd_pcm_status_get_avail>();\n\n  int snd_pcm_status_get_avail_max(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_get_avail_max(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_get_avail_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_avail_max>>(\n          'snd_pcm_status_get_avail_max');\n  late final _dart_snd_pcm_status_get_avail_max _snd_pcm_status_get_avail_max =\n      _snd_pcm_status_get_avail_max_ptr\n          .asFunction<_dart_snd_pcm_status_get_avail_max>();\n\n  int snd_pcm_status_get_overrange(\n    ffi.Pointer<snd_pcm_status_> obj,\n  ) {\n    return _snd_pcm_status_get_overrange(\n      obj,\n    );\n  }\n\n  late final _snd_pcm_status_get_overrange_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_get_overrange>>(\n          'snd_pcm_status_get_overrange');\n  late final _dart_snd_pcm_status_get_overrange _snd_pcm_status_get_overrange =\n      _snd_pcm_status_get_overrange_ptr\n          .asFunction<_dart_snd_pcm_status_get_overrange>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_type_name(\n    int type,\n  ) {\n    return _snd_pcm_type_name(\n      type,\n    );\n  }\n\n  late final _snd_pcm_type_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_type_name>>('snd_pcm_type_name');\n  late final _dart_snd_pcm_type_name _snd_pcm_type_name =\n      _snd_pcm_type_name_ptr.asFunction<_dart_snd_pcm_type_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_stream_name(\n    int stream,\n  ) {\n    return _snd_pcm_stream_name(\n      stream,\n    );\n  }\n\n  late final _snd_pcm_stream_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_stream_name>>(\n          'snd_pcm_stream_name');\n  late final _dart_snd_pcm_stream_name _snd_pcm_stream_name =\n      _snd_pcm_stream_name_ptr.asFunction<_dart_snd_pcm_stream_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_access_name(\n    int _access,\n  ) {\n    return _snd_pcm_access_name(\n      _access,\n    );\n  }\n\n  late final _snd_pcm_access_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_access_name>>(\n          'snd_pcm_access_name');\n  late final _dart_snd_pcm_access_name _snd_pcm_access_name =\n      _snd_pcm_access_name_ptr.asFunction<_dart_snd_pcm_access_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_format_name(\n    int format,\n  ) {\n    return _snd_pcm_format_name(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_name>>(\n          'snd_pcm_format_name');\n  late final _dart_snd_pcm_format_name _snd_pcm_format_name =\n      _snd_pcm_format_name_ptr.asFunction<_dart_snd_pcm_format_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_format_description(\n    int format,\n  ) {\n    return _snd_pcm_format_description(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_description_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_description>>(\n          'snd_pcm_format_description');\n  late final _dart_snd_pcm_format_description _snd_pcm_format_description =\n      _snd_pcm_format_description_ptr\n          .asFunction<_dart_snd_pcm_format_description>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_subformat_name(\n    int subformat,\n  ) {\n    return _snd_pcm_subformat_name(\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_subformat_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_name>>(\n          'snd_pcm_subformat_name');\n  late final _dart_snd_pcm_subformat_name _snd_pcm_subformat_name =\n      _snd_pcm_subformat_name_ptr.asFunction<_dart_snd_pcm_subformat_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_subformat_description(\n    int subformat,\n  ) {\n    return _snd_pcm_subformat_description(\n      subformat,\n    );\n  }\n\n  late final _snd_pcm_subformat_description_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_subformat_description>>(\n          'snd_pcm_subformat_description');\n  late final _dart_snd_pcm_subformat_description\n      _snd_pcm_subformat_description = _snd_pcm_subformat_description_ptr\n          .asFunction<_dart_snd_pcm_subformat_description>();\n\n  int snd_pcm_format_value(\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_pcm_format_value(\n      name,\n    );\n  }\n\n  late final _snd_pcm_format_value_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_value>>(\n          'snd_pcm_format_value');\n  late final _dart_snd_pcm_format_value _snd_pcm_format_value =\n      _snd_pcm_format_value_ptr.asFunction<_dart_snd_pcm_format_value>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_tstamp_mode_name(\n    int mode,\n  ) {\n    return _snd_pcm_tstamp_mode_name(\n      mode,\n    );\n  }\n\n  late final _snd_pcm_tstamp_mode_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_tstamp_mode_name>>(\n          'snd_pcm_tstamp_mode_name');\n  late final _dart_snd_pcm_tstamp_mode_name _snd_pcm_tstamp_mode_name =\n      _snd_pcm_tstamp_mode_name_ptr\n          .asFunction<_dart_snd_pcm_tstamp_mode_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_state_name(\n    int state,\n  ) {\n    return _snd_pcm_state_name(\n      state,\n    );\n  }\n\n  late final _snd_pcm_state_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_state_name>>('snd_pcm_state_name');\n  late final _dart_snd_pcm_state_name _snd_pcm_state_name =\n      _snd_pcm_state_name_ptr.asFunction<_dart_snd_pcm_state_name>();\n\n  int snd_pcm_dump(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_dump(\n      pcm,\n      out,\n    );\n  }\n\n  late final _snd_pcm_dump_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_dump>>('snd_pcm_dump');\n  late final _dart_snd_pcm_dump _snd_pcm_dump =\n      _snd_pcm_dump_ptr.asFunction<_dart_snd_pcm_dump>();\n\n  int snd_pcm_dump_hw_setup(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_dump_hw_setup(\n      pcm,\n      out,\n    );\n  }\n\n  late final _snd_pcm_dump_hw_setup_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_dump_hw_setup>>(\n          'snd_pcm_dump_hw_setup');\n  late final _dart_snd_pcm_dump_hw_setup _snd_pcm_dump_hw_setup =\n      _snd_pcm_dump_hw_setup_ptr.asFunction<_dart_snd_pcm_dump_hw_setup>();\n\n  int snd_pcm_dump_sw_setup(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_dump_sw_setup(\n      pcm,\n      out,\n    );\n  }\n\n  late final _snd_pcm_dump_sw_setup_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_dump_sw_setup>>(\n          'snd_pcm_dump_sw_setup');\n  late final _dart_snd_pcm_dump_sw_setup _snd_pcm_dump_sw_setup =\n      _snd_pcm_dump_sw_setup_ptr.asFunction<_dart_snd_pcm_dump_sw_setup>();\n\n  int snd_pcm_dump_setup(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_dump_setup(\n      pcm,\n      out,\n    );\n  }\n\n  late final _snd_pcm_dump_setup_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_dump_setup>>('snd_pcm_dump_setup');\n  late final _dart_snd_pcm_dump_setup _snd_pcm_dump_setup =\n      _snd_pcm_dump_setup_ptr.asFunction<_dart_snd_pcm_dump_setup>();\n\n  int snd_pcm_hw_params_dump(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_hw_params_dump(\n      params,\n      out,\n    );\n  }\n\n  late final _snd_pcm_hw_params_dump_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_dump>>(\n          'snd_pcm_hw_params_dump');\n  late final _dart_snd_pcm_hw_params_dump _snd_pcm_hw_params_dump =\n      _snd_pcm_hw_params_dump_ptr.asFunction<_dart_snd_pcm_hw_params_dump>();\n\n  int snd_pcm_sw_params_dump(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_sw_params_dump(\n      params,\n      out,\n    );\n  }\n\n  late final _snd_pcm_sw_params_dump_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_dump>>(\n          'snd_pcm_sw_params_dump');\n  late final _dart_snd_pcm_sw_params_dump _snd_pcm_sw_params_dump =\n      _snd_pcm_sw_params_dump_ptr.asFunction<_dart_snd_pcm_sw_params_dump>();\n\n  int snd_pcm_status_dump(\n    ffi.Pointer<snd_pcm_status_> status,\n    ffi.Pointer<snd_output_> out,\n  ) {\n    return _snd_pcm_status_dump(\n      status,\n      out,\n    );\n  }\n\n  late final _snd_pcm_status_dump_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_status_dump>>(\n          'snd_pcm_status_dump');\n  late final _dart_snd_pcm_status_dump _snd_pcm_status_dump =\n      _snd_pcm_status_dump_ptr.asFunction<_dart_snd_pcm_status_dump>();\n\n  int snd_pcm_mmap_begin(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Pointer<snd_pcm_channel_area_t>> areas,\n    ffi.Pointer<ffi.Uint64> offset,\n    ffi.Pointer<ffi.Uint64> frames,\n  ) {\n    return _snd_pcm_mmap_begin(\n      pcm,\n      areas,\n      offset,\n      frames,\n    );\n  }\n\n  late final _snd_pcm_mmap_begin_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_begin>>('snd_pcm_mmap_begin');\n  late final _dart_snd_pcm_mmap_begin _snd_pcm_mmap_begin =\n      _snd_pcm_mmap_begin_ptr.asFunction<_dart_snd_pcm_mmap_begin>();\n\n  int snd_pcm_mmap_commit(\n    ffi.Pointer<snd_pcm_> pcm,\n    int offset,\n    int frames,\n  ) {\n    return _snd_pcm_mmap_commit(\n      pcm,\n      offset,\n      frames,\n    );\n  }\n\n  late final _snd_pcm_mmap_commit_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_commit>>(\n          'snd_pcm_mmap_commit');\n  late final _dart_snd_pcm_mmap_commit _snd_pcm_mmap_commit =\n      _snd_pcm_mmap_commit_ptr.asFunction<_dart_snd_pcm_mmap_commit>();\n\n  int snd_pcm_mmap_writei(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_pcm_mmap_writei(\n      pcm,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_pcm_mmap_writei_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_writei>>(\n          'snd_pcm_mmap_writei');\n  late final _dart_snd_pcm_mmap_writei _snd_pcm_mmap_writei =\n      _snd_pcm_mmap_writei_ptr.asFunction<_dart_snd_pcm_mmap_writei>();\n\n  int snd_pcm_mmap_readi(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_pcm_mmap_readi(\n      pcm,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_pcm_mmap_readi_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_readi>>('snd_pcm_mmap_readi');\n  late final _dart_snd_pcm_mmap_readi _snd_pcm_mmap_readi =\n      _snd_pcm_mmap_readi_ptr.asFunction<_dart_snd_pcm_mmap_readi>();\n\n  int snd_pcm_mmap_writen(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n    int size,\n  ) {\n    return _snd_pcm_mmap_writen(\n      pcm,\n      bufs,\n      size,\n    );\n  }\n\n  late final _snd_pcm_mmap_writen_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_writen>>(\n          'snd_pcm_mmap_writen');\n  late final _dart_snd_pcm_mmap_writen _snd_pcm_mmap_writen =\n      _snd_pcm_mmap_writen_ptr.asFunction<_dart_snd_pcm_mmap_writen>();\n\n  int snd_pcm_mmap_readn(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n    int size,\n  ) {\n    return _snd_pcm_mmap_readn(\n      pcm,\n      bufs,\n      size,\n    );\n  }\n\n  late final _snd_pcm_mmap_readn_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_mmap_readn>>('snd_pcm_mmap_readn');\n  late final _dart_snd_pcm_mmap_readn _snd_pcm_mmap_readn =\n      _snd_pcm_mmap_readn_ptr.asFunction<_dart_snd_pcm_mmap_readn>();\n\n  int snd_pcm_format_signed(\n    int format,\n  ) {\n    return _snd_pcm_format_signed(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_signed_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_signed>>(\n          'snd_pcm_format_signed');\n  late final _dart_snd_pcm_format_signed _snd_pcm_format_signed =\n      _snd_pcm_format_signed_ptr.asFunction<_dart_snd_pcm_format_signed>();\n\n  int snd_pcm_format_unsigned(\n    int format,\n  ) {\n    return _snd_pcm_format_unsigned(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_unsigned_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_unsigned>>(\n          'snd_pcm_format_unsigned');\n  late final _dart_snd_pcm_format_unsigned _snd_pcm_format_unsigned =\n      _snd_pcm_format_unsigned_ptr.asFunction<_dart_snd_pcm_format_unsigned>();\n\n  int snd_pcm_format_linear(\n    int format,\n  ) {\n    return _snd_pcm_format_linear(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_linear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_linear>>(\n          'snd_pcm_format_linear');\n  late final _dart_snd_pcm_format_linear _snd_pcm_format_linear =\n      _snd_pcm_format_linear_ptr.asFunction<_dart_snd_pcm_format_linear>();\n\n  int snd_pcm_format_float(\n    int format,\n  ) {\n    return _snd_pcm_format_float(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_float_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_float>>(\n          'snd_pcm_format_float');\n  late final _dart_snd_pcm_format_float _snd_pcm_format_float =\n      _snd_pcm_format_float_ptr.asFunction<_dart_snd_pcm_format_float>();\n\n  int snd_pcm_format_little_endian(\n    int format,\n  ) {\n    return _snd_pcm_format_little_endian(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_little_endian_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_little_endian>>(\n          'snd_pcm_format_little_endian');\n  late final _dart_snd_pcm_format_little_endian _snd_pcm_format_little_endian =\n      _snd_pcm_format_little_endian_ptr\n          .asFunction<_dart_snd_pcm_format_little_endian>();\n\n  int snd_pcm_format_big_endian(\n    int format,\n  ) {\n    return _snd_pcm_format_big_endian(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_big_endian_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_big_endian>>(\n          'snd_pcm_format_big_endian');\n  late final _dart_snd_pcm_format_big_endian _snd_pcm_format_big_endian =\n      _snd_pcm_format_big_endian_ptr\n          .asFunction<_dart_snd_pcm_format_big_endian>();\n\n  int snd_pcm_format_cpu_endian(\n    int format,\n  ) {\n    return _snd_pcm_format_cpu_endian(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_cpu_endian_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_cpu_endian>>(\n          'snd_pcm_format_cpu_endian');\n  late final _dart_snd_pcm_format_cpu_endian _snd_pcm_format_cpu_endian =\n      _snd_pcm_format_cpu_endian_ptr\n          .asFunction<_dart_snd_pcm_format_cpu_endian>();\n\n  int snd_pcm_format_width(\n    int format,\n  ) {\n    return _snd_pcm_format_width(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_width_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_width>>(\n          'snd_pcm_format_width');\n  late final _dart_snd_pcm_format_width _snd_pcm_format_width =\n      _snd_pcm_format_width_ptr.asFunction<_dart_snd_pcm_format_width>();\n\n  int snd_pcm_format_physical_width(\n    int format,\n  ) {\n    return _snd_pcm_format_physical_width(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_physical_width_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_physical_width>>(\n          'snd_pcm_format_physical_width');\n  late final _dart_snd_pcm_format_physical_width\n      _snd_pcm_format_physical_width = _snd_pcm_format_physical_width_ptr\n          .asFunction<_dart_snd_pcm_format_physical_width>();\n\n  int snd_pcm_build_linear_format(\n    int width,\n    int pwidth,\n    int unsignd,\n    int big_endian,\n  ) {\n    return _snd_pcm_build_linear_format(\n      width,\n      pwidth,\n      unsignd,\n      big_endian,\n    );\n  }\n\n  late final _snd_pcm_build_linear_format_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_build_linear_format>>(\n          'snd_pcm_build_linear_format');\n  late final _dart_snd_pcm_build_linear_format _snd_pcm_build_linear_format =\n      _snd_pcm_build_linear_format_ptr\n          .asFunction<_dart_snd_pcm_build_linear_format>();\n\n  int snd_pcm_format_size(\n    int format,\n    int samples,\n  ) {\n    return _snd_pcm_format_size(\n      format,\n      samples,\n    );\n  }\n\n  late final _snd_pcm_format_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_size>>(\n          'snd_pcm_format_size');\n  late final _dart_snd_pcm_format_size _snd_pcm_format_size =\n      _snd_pcm_format_size_ptr.asFunction<_dart_snd_pcm_format_size>();\n\n  int snd_pcm_format_silence(\n    int format,\n  ) {\n    return _snd_pcm_format_silence(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_silence_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_silence>>(\n          'snd_pcm_format_silence');\n  late final _dart_snd_pcm_format_silence _snd_pcm_format_silence =\n      _snd_pcm_format_silence_ptr.asFunction<_dart_snd_pcm_format_silence>();\n\n  int snd_pcm_format_silence_16(\n    int format,\n  ) {\n    return _snd_pcm_format_silence_16(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_silence_16_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_silence_16>>(\n          'snd_pcm_format_silence_16');\n  late final _dart_snd_pcm_format_silence_16 _snd_pcm_format_silence_16 =\n      _snd_pcm_format_silence_16_ptr\n          .asFunction<_dart_snd_pcm_format_silence_16>();\n\n  int snd_pcm_format_silence_32(\n    int format,\n  ) {\n    return _snd_pcm_format_silence_32(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_silence_32_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_silence_32>>(\n          'snd_pcm_format_silence_32');\n  late final _dart_snd_pcm_format_silence_32 _snd_pcm_format_silence_32 =\n      _snd_pcm_format_silence_32_ptr\n          .asFunction<_dart_snd_pcm_format_silence_32>();\n\n  int snd_pcm_format_silence_64(\n    int format,\n  ) {\n    return _snd_pcm_format_silence_64(\n      format,\n    );\n  }\n\n  late final _snd_pcm_format_silence_64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_silence_64>>(\n          'snd_pcm_format_silence_64');\n  late final _dart_snd_pcm_format_silence_64 _snd_pcm_format_silence_64 =\n      _snd_pcm_format_silence_64_ptr\n          .asFunction<_dart_snd_pcm_format_silence_64>();\n\n  int snd_pcm_format_set_silence(\n    int format,\n    ffi.Pointer<ffi.Void> buf,\n    int samples,\n  ) {\n    return _snd_pcm_format_set_silence(\n      format,\n      buf,\n      samples,\n    );\n  }\n\n  late final _snd_pcm_format_set_silence_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_format_set_silence>>(\n          'snd_pcm_format_set_silence');\n  late final _dart_snd_pcm_format_set_silence _snd_pcm_format_set_silence =\n      _snd_pcm_format_set_silence_ptr\n          .asFunction<_dart_snd_pcm_format_set_silence>();\n\n  int snd_pcm_bytes_to_frames(\n    ffi.Pointer<snd_pcm_> pcm,\n    int bytes,\n  ) {\n    return _snd_pcm_bytes_to_frames(\n      pcm,\n      bytes,\n    );\n  }\n\n  late final _snd_pcm_bytes_to_frames_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_bytes_to_frames>>(\n          'snd_pcm_bytes_to_frames');\n  late final _dart_snd_pcm_bytes_to_frames _snd_pcm_bytes_to_frames =\n      _snd_pcm_bytes_to_frames_ptr.asFunction<_dart_snd_pcm_bytes_to_frames>();\n\n  int snd_pcm_frames_to_bytes(\n    ffi.Pointer<snd_pcm_> pcm,\n    int frames,\n  ) {\n    return _snd_pcm_frames_to_bytes(\n      pcm,\n      frames,\n    );\n  }\n\n  late final _snd_pcm_frames_to_bytes_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_frames_to_bytes>>(\n          'snd_pcm_frames_to_bytes');\n  late final _dart_snd_pcm_frames_to_bytes _snd_pcm_frames_to_bytes =\n      _snd_pcm_frames_to_bytes_ptr.asFunction<_dart_snd_pcm_frames_to_bytes>();\n\n  int snd_pcm_bytes_to_samples(\n    ffi.Pointer<snd_pcm_> pcm,\n    int bytes,\n  ) {\n    return _snd_pcm_bytes_to_samples(\n      pcm,\n      bytes,\n    );\n  }\n\n  late final _snd_pcm_bytes_to_samples_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_bytes_to_samples>>(\n          'snd_pcm_bytes_to_samples');\n  late final _dart_snd_pcm_bytes_to_samples _snd_pcm_bytes_to_samples =\n      _snd_pcm_bytes_to_samples_ptr\n          .asFunction<_dart_snd_pcm_bytes_to_samples>();\n\n  int snd_pcm_samples_to_bytes(\n    ffi.Pointer<snd_pcm_> pcm,\n    int samples,\n  ) {\n    return _snd_pcm_samples_to_bytes(\n      pcm,\n      samples,\n    );\n  }\n\n  late final _snd_pcm_samples_to_bytes_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_samples_to_bytes>>(\n          'snd_pcm_samples_to_bytes');\n  late final _dart_snd_pcm_samples_to_bytes _snd_pcm_samples_to_bytes =\n      _snd_pcm_samples_to_bytes_ptr\n          .asFunction<_dart_snd_pcm_samples_to_bytes>();\n\n  int snd_pcm_area_silence(\n    ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n    int dst_offset,\n    int samples,\n    int format,\n  ) {\n    return _snd_pcm_area_silence(\n      dst_channel,\n      dst_offset,\n      samples,\n      format,\n    );\n  }\n\n  late final _snd_pcm_area_silence_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_area_silence>>(\n          'snd_pcm_area_silence');\n  late final _dart_snd_pcm_area_silence _snd_pcm_area_silence =\n      _snd_pcm_area_silence_ptr.asFunction<_dart_snd_pcm_area_silence>();\n\n  int snd_pcm_areas_silence(\n    ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n    int dst_offset,\n    int channels,\n    int frames,\n    int format,\n  ) {\n    return _snd_pcm_areas_silence(\n      dst_channels,\n      dst_offset,\n      channels,\n      frames,\n      format,\n    );\n  }\n\n  late final _snd_pcm_areas_silence_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_areas_silence>>(\n          'snd_pcm_areas_silence');\n  late final _dart_snd_pcm_areas_silence _snd_pcm_areas_silence =\n      _snd_pcm_areas_silence_ptr.asFunction<_dart_snd_pcm_areas_silence>();\n\n  int snd_pcm_area_copy(\n    ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n    int dst_offset,\n    ffi.Pointer<snd_pcm_channel_area_t> src_channel,\n    int src_offset,\n    int samples,\n    int format,\n  ) {\n    return _snd_pcm_area_copy(\n      dst_channel,\n      dst_offset,\n      src_channel,\n      src_offset,\n      samples,\n      format,\n    );\n  }\n\n  late final _snd_pcm_area_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_area_copy>>('snd_pcm_area_copy');\n  late final _dart_snd_pcm_area_copy _snd_pcm_area_copy =\n      _snd_pcm_area_copy_ptr.asFunction<_dart_snd_pcm_area_copy>();\n\n  int snd_pcm_areas_copy(\n    ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n    int dst_offset,\n    ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n    int src_offset,\n    int channels,\n    int frames,\n    int format,\n  ) {\n    return _snd_pcm_areas_copy(\n      dst_channels,\n      dst_offset,\n      src_channels,\n      src_offset,\n      channels,\n      frames,\n      format,\n    );\n  }\n\n  late final _snd_pcm_areas_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_areas_copy>>('snd_pcm_areas_copy');\n  late final _dart_snd_pcm_areas_copy _snd_pcm_areas_copy =\n      _snd_pcm_areas_copy_ptr.asFunction<_dart_snd_pcm_areas_copy>();\n\n  int snd_pcm_areas_copy_wrap(\n    ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n    int dst_offset,\n    int dst_size,\n    ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n    int src_offset,\n    int src_size,\n    int channels,\n    int frames,\n    int format,\n  ) {\n    return _snd_pcm_areas_copy_wrap(\n      dst_channels,\n      dst_offset,\n      dst_size,\n      src_channels,\n      src_offset,\n      src_size,\n      channels,\n      frames,\n      format,\n    );\n  }\n\n  late final _snd_pcm_areas_copy_wrap_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_areas_copy_wrap>>(\n          'snd_pcm_areas_copy_wrap');\n  late final _dart_snd_pcm_areas_copy_wrap _snd_pcm_areas_copy_wrap =\n      _snd_pcm_areas_copy_wrap_ptr.asFunction<_dart_snd_pcm_areas_copy_wrap>();\n\n  ffi.Pointer<snd_pcm_> snd_pcm_hook_get_pcm(\n    ffi.Pointer<snd_pcm_hook_> hook,\n  ) {\n    return _snd_pcm_hook_get_pcm(\n      hook,\n    );\n  }\n\n  late final _snd_pcm_hook_get_pcm_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hook_get_pcm>>(\n          'snd_pcm_hook_get_pcm');\n  late final _dart_snd_pcm_hook_get_pcm _snd_pcm_hook_get_pcm =\n      _snd_pcm_hook_get_pcm_ptr.asFunction<_dart_snd_pcm_hook_get_pcm>();\n\n  ffi.Pointer<ffi.Void> snd_pcm_hook_get_private(\n    ffi.Pointer<snd_pcm_hook_> hook,\n  ) {\n    return _snd_pcm_hook_get_private(\n      hook,\n    );\n  }\n\n  late final _snd_pcm_hook_get_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hook_get_private>>(\n          'snd_pcm_hook_get_private');\n  late final _dart_snd_pcm_hook_get_private _snd_pcm_hook_get_private =\n      _snd_pcm_hook_get_private_ptr\n          .asFunction<_dart_snd_pcm_hook_get_private>();\n\n  void snd_pcm_hook_set_private(\n    ffi.Pointer<snd_pcm_hook_> hook,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_pcm_hook_set_private(\n      hook,\n      private_data,\n    );\n  }\n\n  late final _snd_pcm_hook_set_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hook_set_private>>(\n          'snd_pcm_hook_set_private');\n  late final _dart_snd_pcm_hook_set_private _snd_pcm_hook_set_private =\n      _snd_pcm_hook_set_private_ptr\n          .asFunction<_dart_snd_pcm_hook_set_private>();\n\n  int snd_pcm_hook_add(\n    ffi.Pointer<ffi.Pointer<snd_pcm_hook_>> hookp,\n    ffi.Pointer<snd_pcm_> pcm,\n    int type,\n    ffi.Pointer<ffi.NativeFunction<snd_pcm_hook_func_t>> func,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_pcm_hook_add(\n      hookp,\n      pcm,\n      type,\n      func,\n      private_data,\n    );\n  }\n\n  late final _snd_pcm_hook_add_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hook_add>>('snd_pcm_hook_add');\n  late final _dart_snd_pcm_hook_add _snd_pcm_hook_add =\n      _snd_pcm_hook_add_ptr.asFunction<_dart_snd_pcm_hook_add>();\n\n  int snd_pcm_hook_remove(\n    ffi.Pointer<snd_pcm_hook_> hook,\n  ) {\n    return _snd_pcm_hook_remove(\n      hook,\n    );\n  }\n\n  late final _snd_pcm_hook_remove_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hook_remove>>(\n          'snd_pcm_hook_remove');\n  late final _dart_snd_pcm_hook_remove _snd_pcm_hook_remove =\n      _snd_pcm_hook_remove_ptr.asFunction<_dart_snd_pcm_hook_remove>();\n\n  int snd_pcm_meter_get_bufsize(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_meter_get_bufsize(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_meter_get_bufsize_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_get_bufsize>>(\n          'snd_pcm_meter_get_bufsize');\n  late final _dart_snd_pcm_meter_get_bufsize _snd_pcm_meter_get_bufsize =\n      _snd_pcm_meter_get_bufsize_ptr\n          .asFunction<_dart_snd_pcm_meter_get_bufsize>();\n\n  int snd_pcm_meter_get_channels(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_meter_get_channels(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_meter_get_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_get_channels>>(\n          'snd_pcm_meter_get_channels');\n  late final _dart_snd_pcm_meter_get_channels _snd_pcm_meter_get_channels =\n      _snd_pcm_meter_get_channels_ptr\n          .asFunction<_dart_snd_pcm_meter_get_channels>();\n\n  int snd_pcm_meter_get_rate(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_meter_get_rate(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_meter_get_rate_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_get_rate>>(\n          'snd_pcm_meter_get_rate');\n  late final _dart_snd_pcm_meter_get_rate _snd_pcm_meter_get_rate =\n      _snd_pcm_meter_get_rate_ptr.asFunction<_dart_snd_pcm_meter_get_rate>();\n\n  int snd_pcm_meter_get_now(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_meter_get_now(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_meter_get_now_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_get_now>>(\n          'snd_pcm_meter_get_now');\n  late final _dart_snd_pcm_meter_get_now _snd_pcm_meter_get_now =\n      _snd_pcm_meter_get_now_ptr.asFunction<_dart_snd_pcm_meter_get_now>();\n\n  int snd_pcm_meter_get_boundary(\n    ffi.Pointer<snd_pcm_> pcm,\n  ) {\n    return _snd_pcm_meter_get_boundary(\n      pcm,\n    );\n  }\n\n  late final _snd_pcm_meter_get_boundary_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_get_boundary>>(\n          'snd_pcm_meter_get_boundary');\n  late final _dart_snd_pcm_meter_get_boundary _snd_pcm_meter_get_boundary =\n      _snd_pcm_meter_get_boundary_ptr\n          .asFunction<_dart_snd_pcm_meter_get_boundary>();\n\n  int snd_pcm_meter_add_scope(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_scope_> scope,\n  ) {\n    return _snd_pcm_meter_add_scope(\n      pcm,\n      scope,\n    );\n  }\n\n  late final _snd_pcm_meter_add_scope_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_add_scope>>(\n          'snd_pcm_meter_add_scope');\n  late final _dart_snd_pcm_meter_add_scope _snd_pcm_meter_add_scope =\n      _snd_pcm_meter_add_scope_ptr.asFunction<_dart_snd_pcm_meter_add_scope>();\n\n  ffi.Pointer<snd_pcm_scope_> snd_pcm_meter_search_scope(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_pcm_meter_search_scope(\n      pcm,\n      name,\n    );\n  }\n\n  late final _snd_pcm_meter_search_scope_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_meter_search_scope>>(\n          'snd_pcm_meter_search_scope');\n  late final _dart_snd_pcm_meter_search_scope _snd_pcm_meter_search_scope =\n      _snd_pcm_meter_search_scope_ptr\n          .asFunction<_dart_snd_pcm_meter_search_scope>();\n\n  int snd_pcm_scope_malloc(\n    ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> ptr,\n  ) {\n    return _snd_pcm_scope_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_pcm_scope_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_malloc>>(\n          'snd_pcm_scope_malloc');\n  late final _dart_snd_pcm_scope_malloc _snd_pcm_scope_malloc =\n      _snd_pcm_scope_malloc_ptr.asFunction<_dart_snd_pcm_scope_malloc>();\n\n  void snd_pcm_scope_set_ops(\n    ffi.Pointer<snd_pcm_scope_> scope,\n    ffi.Pointer<snd_pcm_scope_ops_t> val,\n  ) {\n    return _snd_pcm_scope_set_ops(\n      scope,\n      val,\n    );\n  }\n\n  late final _snd_pcm_scope_set_ops_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_set_ops>>(\n          'snd_pcm_scope_set_ops');\n  late final _dart_snd_pcm_scope_set_ops _snd_pcm_scope_set_ops =\n      _snd_pcm_scope_set_ops_ptr.asFunction<_dart_snd_pcm_scope_set_ops>();\n\n  void snd_pcm_scope_set_name(\n    ffi.Pointer<snd_pcm_scope_> scope,\n    ffi.Pointer<ffi.Int8> val,\n  ) {\n    return _snd_pcm_scope_set_name(\n      scope,\n      val,\n    );\n  }\n\n  late final _snd_pcm_scope_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_set_name>>(\n          'snd_pcm_scope_set_name');\n  late final _dart_snd_pcm_scope_set_name _snd_pcm_scope_set_name =\n      _snd_pcm_scope_set_name_ptr.asFunction<_dart_snd_pcm_scope_set_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_scope_get_name(\n    ffi.Pointer<snd_pcm_scope_> scope,\n  ) {\n    return _snd_pcm_scope_get_name(\n      scope,\n    );\n  }\n\n  late final _snd_pcm_scope_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_get_name>>(\n          'snd_pcm_scope_get_name');\n  late final _dart_snd_pcm_scope_get_name _snd_pcm_scope_get_name =\n      _snd_pcm_scope_get_name_ptr.asFunction<_dart_snd_pcm_scope_get_name>();\n\n  ffi.Pointer<ffi.Void> snd_pcm_scope_get_callback_private(\n    ffi.Pointer<snd_pcm_scope_> scope,\n  ) {\n    return _snd_pcm_scope_get_callback_private(\n      scope,\n    );\n  }\n\n  late final _snd_pcm_scope_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_get_callback_private>>(\n          'snd_pcm_scope_get_callback_private');\n  late final _dart_snd_pcm_scope_get_callback_private\n      _snd_pcm_scope_get_callback_private =\n      _snd_pcm_scope_get_callback_private_ptr\n          .asFunction<_dart_snd_pcm_scope_get_callback_private>();\n\n  void snd_pcm_scope_set_callback_private(\n    ffi.Pointer<snd_pcm_scope_> scope,\n    ffi.Pointer<ffi.Void> val,\n  ) {\n    return _snd_pcm_scope_set_callback_private(\n      scope,\n      val,\n    );\n  }\n\n  late final _snd_pcm_scope_set_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_set_callback_private>>(\n          'snd_pcm_scope_set_callback_private');\n  late final _dart_snd_pcm_scope_set_callback_private\n      _snd_pcm_scope_set_callback_private =\n      _snd_pcm_scope_set_callback_private_ptr\n          .asFunction<_dart_snd_pcm_scope_set_callback_private>();\n\n  int snd_pcm_scope_s16_open(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Int8> name,\n    ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> scopep,\n  ) {\n    return _snd_pcm_scope_s16_open(\n      pcm,\n      name,\n      scopep,\n    );\n  }\n\n  late final _snd_pcm_scope_s16_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_s16_open>>(\n          'snd_pcm_scope_s16_open');\n  late final _dart_snd_pcm_scope_s16_open _snd_pcm_scope_s16_open =\n      _snd_pcm_scope_s16_open_ptr.asFunction<_dart_snd_pcm_scope_s16_open>();\n\n  ffi.Pointer<ffi.Int16> snd_pcm_scope_s16_get_channel_buffer(\n    ffi.Pointer<snd_pcm_scope_> scope,\n    int channel,\n  ) {\n    return _snd_pcm_scope_s16_get_channel_buffer(\n      scope,\n      channel,\n    );\n  }\n\n  late final _snd_pcm_scope_s16_get_channel_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_scope_s16_get_channel_buffer>>(\n          'snd_pcm_scope_s16_get_channel_buffer');\n  late final _dart_snd_pcm_scope_s16_get_channel_buffer\n      _snd_pcm_scope_s16_get_channel_buffer =\n      _snd_pcm_scope_s16_get_channel_buffer_ptr\n          .asFunction<_dart_snd_pcm_scope_s16_get_channel_buffer>();\n\n  int snd_spcm_init(\n    ffi.Pointer<snd_pcm_> pcm,\n    int rate,\n    int channels,\n    int format,\n    int subformat,\n    int latency,\n    int _access,\n    int xrun_type,\n  ) {\n    return _snd_spcm_init(\n      pcm,\n      rate,\n      channels,\n      format,\n      subformat,\n      latency,\n      _access,\n      xrun_type,\n    );\n  }\n\n  late final _snd_spcm_init_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_spcm_init>>('snd_spcm_init');\n  late final _dart_snd_spcm_init _snd_spcm_init =\n      _snd_spcm_init_ptr.asFunction<_dart_snd_spcm_init>();\n\n  int snd_spcm_init_duplex(\n    ffi.Pointer<snd_pcm_> playback_pcm,\n    ffi.Pointer<snd_pcm_> capture_pcm,\n    int rate,\n    int channels,\n    int format,\n    int subformat,\n    int latency,\n    int _access,\n    int xrun_type,\n    int duplex_type,\n  ) {\n    return _snd_spcm_init_duplex(\n      playback_pcm,\n      capture_pcm,\n      rate,\n      channels,\n      format,\n      subformat,\n      latency,\n      _access,\n      xrun_type,\n      duplex_type,\n    );\n  }\n\n  late final _snd_spcm_init_duplex_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_spcm_init_duplex>>(\n          'snd_spcm_init_duplex');\n  late final _dart_snd_spcm_init_duplex _snd_spcm_init_duplex =\n      _snd_spcm_init_duplex_ptr.asFunction<_dart_snd_spcm_init_duplex>();\n\n  int snd_spcm_init_get_params(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<ffi.Uint32> rate,\n    ffi.Pointer<ffi.Uint64> buffer_size,\n    ffi.Pointer<ffi.Uint64> period_size,\n  ) {\n    return _snd_spcm_init_get_params(\n      pcm,\n      rate,\n      buffer_size,\n      period_size,\n    );\n  }\n\n  late final _snd_spcm_init_get_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_spcm_init_get_params>>(\n          'snd_spcm_init_get_params');\n  late final _dart_snd_spcm_init_get_params _snd_spcm_init_get_params =\n      _snd_spcm_init_get_params_ptr\n          .asFunction<_dart_snd_spcm_init_get_params>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_start_mode_name(\n    int mode,\n  ) {\n    return _snd_pcm_start_mode_name(\n      mode,\n    );\n  }\n\n  late final _snd_pcm_start_mode_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_start_mode_name>>(\n          'snd_pcm_start_mode_name');\n  late final _dart_snd_pcm_start_mode_name _snd_pcm_start_mode_name =\n      _snd_pcm_start_mode_name_ptr.asFunction<_dart_snd_pcm_start_mode_name>();\n\n  ffi.Pointer<ffi.Int8> snd_pcm_xrun_mode_name(\n    int mode,\n  ) {\n    return _snd_pcm_xrun_mode_name(\n      mode,\n    );\n  }\n\n  late final _snd_pcm_xrun_mode_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_xrun_mode_name>>(\n          'snd_pcm_xrun_mode_name');\n  late final _dart_snd_pcm_xrun_mode_name _snd_pcm_xrun_mode_name =\n      _snd_pcm_xrun_mode_name_ptr.asFunction<_dart_snd_pcm_xrun_mode_name>();\n\n  int snd_pcm_sw_params_set_start_mode(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_start_mode(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_start_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_start_mode>>(\n          'snd_pcm_sw_params_set_start_mode');\n  late final _dart_snd_pcm_sw_params_set_start_mode\n      _snd_pcm_sw_params_set_start_mode = _snd_pcm_sw_params_set_start_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_start_mode>();\n\n  int snd_pcm_sw_params_get_start_mode(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n  ) {\n    return _snd_pcm_sw_params_get_start_mode(\n      params,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_start_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_start_mode>>(\n          'snd_pcm_sw_params_get_start_mode');\n  late final _dart_snd_pcm_sw_params_get_start_mode\n      _snd_pcm_sw_params_get_start_mode = _snd_pcm_sw_params_get_start_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_start_mode>();\n\n  int snd_pcm_sw_params_set_xrun_mode(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_xrun_mode(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_xrun_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_xrun_mode>>(\n          'snd_pcm_sw_params_set_xrun_mode');\n  late final _dart_snd_pcm_sw_params_set_xrun_mode\n      _snd_pcm_sw_params_set_xrun_mode = _snd_pcm_sw_params_set_xrun_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_xrun_mode>();\n\n  int snd_pcm_sw_params_get_xrun_mode(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n  ) {\n    return _snd_pcm_sw_params_get_xrun_mode(\n      params,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_xrun_mode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_xrun_mode>>(\n          'snd_pcm_sw_params_get_xrun_mode');\n  late final _dart_snd_pcm_sw_params_get_xrun_mode\n      _snd_pcm_sw_params_get_xrun_mode = _snd_pcm_sw_params_get_xrun_mode_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_xrun_mode>();\n\n  int snd_pcm_sw_params_set_xfer_align(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_xfer_align(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_xfer_align_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_xfer_align>>(\n          'snd_pcm_sw_params_set_xfer_align');\n  late final _dart_snd_pcm_sw_params_set_xfer_align\n      _snd_pcm_sw_params_set_xfer_align = _snd_pcm_sw_params_set_xfer_align_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_xfer_align>();\n\n  int snd_pcm_sw_params_get_xfer_align(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint64> val,\n  ) {\n    return _snd_pcm_sw_params_get_xfer_align(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_xfer_align_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_xfer_align>>(\n          'snd_pcm_sw_params_get_xfer_align');\n  late final _dart_snd_pcm_sw_params_get_xfer_align\n      _snd_pcm_sw_params_get_xfer_align = _snd_pcm_sw_params_get_xfer_align_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_xfer_align>();\n\n  int snd_pcm_sw_params_set_sleep_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    int val,\n  ) {\n    return _snd_pcm_sw_params_set_sleep_min(\n      pcm,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_set_sleep_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_set_sleep_min>>(\n          'snd_pcm_sw_params_set_sleep_min');\n  late final _dart_snd_pcm_sw_params_set_sleep_min\n      _snd_pcm_sw_params_set_sleep_min = _snd_pcm_sw_params_set_sleep_min_ptr\n          .asFunction<_dart_snd_pcm_sw_params_set_sleep_min>();\n\n  int snd_pcm_sw_params_get_sleep_min(\n    ffi.Pointer<snd_pcm_sw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n  ) {\n    return _snd_pcm_sw_params_get_sleep_min(\n      params,\n      val,\n    );\n  }\n\n  late final _snd_pcm_sw_params_get_sleep_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_sw_params_get_sleep_min>>(\n          'snd_pcm_sw_params_get_sleep_min');\n  late final _dart_snd_pcm_sw_params_get_sleep_min\n      _snd_pcm_sw_params_get_sleep_min = _snd_pcm_sw_params_get_sleep_min_ptr\n          .asFunction<_dart_snd_pcm_sw_params_get_sleep_min>();\n\n  int snd_pcm_hw_params_get_tick_time(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_tick_time(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_tick_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_tick_time>>(\n          'snd_pcm_hw_params_get_tick_time');\n  late final _dart_snd_pcm_hw_params_get_tick_time\n      _snd_pcm_hw_params_get_tick_time = _snd_pcm_hw_params_get_tick_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_tick_time>();\n\n  int snd_pcm_hw_params_get_tick_time_min(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_tick_time_min(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_tick_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_tick_time_min>>(\n          'snd_pcm_hw_params_get_tick_time_min');\n  late final _dart_snd_pcm_hw_params_get_tick_time_min\n      _snd_pcm_hw_params_get_tick_time_min =\n      _snd_pcm_hw_params_get_tick_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_tick_time_min>();\n\n  int snd_pcm_hw_params_get_tick_time_max(\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_get_tick_time_max(\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_get_tick_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_get_tick_time_max>>(\n          'snd_pcm_hw_params_get_tick_time_max');\n  late final _dart_snd_pcm_hw_params_get_tick_time_max\n      _snd_pcm_hw_params_get_tick_time_max =\n      _snd_pcm_hw_params_get_tick_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_get_tick_time_max>();\n\n  int snd_pcm_hw_params_test_tick_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_test_tick_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_test_tick_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_test_tick_time>>(\n          'snd_pcm_hw_params_test_tick_time');\n  late final _dart_snd_pcm_hw_params_test_tick_time\n      _snd_pcm_hw_params_test_tick_time = _snd_pcm_hw_params_test_tick_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_test_tick_time>();\n\n  int snd_pcm_hw_params_set_tick_time(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    int val,\n    int dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time>>(\n          'snd_pcm_hw_params_set_tick_time');\n  late final _dart_snd_pcm_hw_params_set_tick_time\n      _snd_pcm_hw_params_set_tick_time = _snd_pcm_hw_params_set_tick_time_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time>();\n\n  int snd_pcm_hw_params_set_tick_time_min(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_min(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_min>>(\n          'snd_pcm_hw_params_set_tick_time_min');\n  late final _dart_snd_pcm_hw_params_set_tick_time_min\n      _snd_pcm_hw_params_set_tick_time_min =\n      _snd_pcm_hw_params_set_tick_time_min_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_min>();\n\n  int snd_pcm_hw_params_set_tick_time_max(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_max(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_max>>(\n          'snd_pcm_hw_params_set_tick_time_max');\n  late final _dart_snd_pcm_hw_params_set_tick_time_max\n      _snd_pcm_hw_params_set_tick_time_max =\n      _snd_pcm_hw_params_set_tick_time_max_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_max>();\n\n  int snd_pcm_hw_params_set_tick_time_minmax(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> min,\n    ffi.Pointer<ffi.Int32> mindir,\n    ffi.Pointer<ffi.Uint32> max,\n    ffi.Pointer<ffi.Int32> maxdir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_minmax(\n      pcm,\n      params,\n      min,\n      mindir,\n      max,\n      maxdir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_minmax_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_minmax>>(\n          'snd_pcm_hw_params_set_tick_time_minmax');\n  late final _dart_snd_pcm_hw_params_set_tick_time_minmax\n      _snd_pcm_hw_params_set_tick_time_minmax =\n      _snd_pcm_hw_params_set_tick_time_minmax_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_minmax>();\n\n  int snd_pcm_hw_params_set_tick_time_near(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_near(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_near_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_near>>(\n          'snd_pcm_hw_params_set_tick_time_near');\n  late final _dart_snd_pcm_hw_params_set_tick_time_near\n      _snd_pcm_hw_params_set_tick_time_near =\n      _snd_pcm_hw_params_set_tick_time_near_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_near>();\n\n  int snd_pcm_hw_params_set_tick_time_first(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_first(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_first_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_first>>(\n          'snd_pcm_hw_params_set_tick_time_first');\n  late final _dart_snd_pcm_hw_params_set_tick_time_first\n      _snd_pcm_hw_params_set_tick_time_first =\n      _snd_pcm_hw_params_set_tick_time_first_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_first>();\n\n  int snd_pcm_hw_params_set_tick_time_last(\n    ffi.Pointer<snd_pcm_> pcm,\n    ffi.Pointer<snd_pcm_hw_params_> params,\n    ffi.Pointer<ffi.Uint32> val,\n    ffi.Pointer<ffi.Int32> dir,\n  ) {\n    return _snd_pcm_hw_params_set_tick_time_last(\n      pcm,\n      params,\n      val,\n      dir,\n    );\n  }\n\n  late final _snd_pcm_hw_params_set_tick_time_last_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_pcm_hw_params_set_tick_time_last>>(\n          'snd_pcm_hw_params_set_tick_time_last');\n  late final _dart_snd_pcm_hw_params_set_tick_time_last\n      _snd_pcm_hw_params_set_tick_time_last =\n      _snd_pcm_hw_params_set_tick_time_last_ptr\n          .asFunction<_dart_snd_pcm_hw_params_set_tick_time_last>();\n\n  int snd_rawmidi_open(\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_rawmidi_open(\n      in_rmidi,\n      out_rmidi,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_rawmidi_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_open>>('snd_rawmidi_open');\n  late final _dart_snd_rawmidi_open _snd_rawmidi_open =\n      _snd_rawmidi_open_ptr.asFunction<_dart_snd_rawmidi_open>();\n\n  int snd_rawmidi_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_rawmidi_open_lconf(\n      in_rmidi,\n      out_rmidi,\n      name,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_rawmidi_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_open_lconf>>(\n          'snd_rawmidi_open_lconf');\n  late final _dart_snd_rawmidi_open_lconf _snd_rawmidi_open_lconf =\n      _snd_rawmidi_open_lconf_ptr.asFunction<_dart_snd_rawmidi_open_lconf>();\n\n  int snd_rawmidi_close(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_close(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_close>>('snd_rawmidi_close');\n  late final _dart_snd_rawmidi_close _snd_rawmidi_close =\n      _snd_rawmidi_close_ptr.asFunction<_dart_snd_rawmidi_close>();\n\n  int snd_rawmidi_poll_descriptors_count(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_poll_descriptors_count(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_poll_descriptors_count>>(\n          'snd_rawmidi_poll_descriptors_count');\n  late final _dart_snd_rawmidi_poll_descriptors_count\n      _snd_rawmidi_poll_descriptors_count =\n      _snd_rawmidi_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_rawmidi_poll_descriptors_count>();\n\n  int snd_rawmidi_poll_descriptors(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_rawmidi_poll_descriptors(\n      rmidi,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_rawmidi_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_poll_descriptors>>(\n          'snd_rawmidi_poll_descriptors');\n  late final _dart_snd_rawmidi_poll_descriptors _snd_rawmidi_poll_descriptors =\n      _snd_rawmidi_poll_descriptors_ptr\n          .asFunction<_dart_snd_rawmidi_poll_descriptors>();\n\n  int snd_rawmidi_poll_descriptors_revents(\n    ffi.Pointer<snd_rawmidi_> rawmidi,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revent,\n  ) {\n    return _snd_rawmidi_poll_descriptors_revents(\n      rawmidi,\n      pfds,\n      nfds,\n      revent,\n    );\n  }\n\n  late final _snd_rawmidi_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_poll_descriptors_revents>>(\n          'snd_rawmidi_poll_descriptors_revents');\n  late final _dart_snd_rawmidi_poll_descriptors_revents\n      _snd_rawmidi_poll_descriptors_revents =\n      _snd_rawmidi_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_rawmidi_poll_descriptors_revents>();\n\n  int snd_rawmidi_nonblock(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    int nonblock,\n  ) {\n    return _snd_rawmidi_nonblock(\n      rmidi,\n      nonblock,\n    );\n  }\n\n  late final _snd_rawmidi_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_nonblock>>(\n          'snd_rawmidi_nonblock');\n  late final _dart_snd_rawmidi_nonblock _snd_rawmidi_nonblock =\n      _snd_rawmidi_nonblock_ptr.asFunction<_dart_snd_rawmidi_nonblock>();\n\n  int snd_rawmidi_info_sizeof() {\n    return _snd_rawmidi_info_sizeof();\n  }\n\n  late final _snd_rawmidi_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_sizeof>>(\n          'snd_rawmidi_info_sizeof');\n  late final _dart_snd_rawmidi_info_sizeof _snd_rawmidi_info_sizeof =\n      _snd_rawmidi_info_sizeof_ptr.asFunction<_dart_snd_rawmidi_info_sizeof>();\n\n  int snd_rawmidi_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_info_>> ptr,\n  ) {\n    return _snd_rawmidi_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_rawmidi_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_malloc>>(\n          'snd_rawmidi_info_malloc');\n  late final _dart_snd_rawmidi_info_malloc _snd_rawmidi_info_malloc =\n      _snd_rawmidi_info_malloc_ptr.asFunction<_dart_snd_rawmidi_info_malloc>();\n\n  void snd_rawmidi_info_free(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_free>>(\n          'snd_rawmidi_info_free');\n  late final _dart_snd_rawmidi_info_free _snd_rawmidi_info_free =\n      _snd_rawmidi_info_free_ptr.asFunction<_dart_snd_rawmidi_info_free>();\n\n  void snd_rawmidi_info_copy(\n    ffi.Pointer<snd_rawmidi_info_> dst,\n    ffi.Pointer<snd_rawmidi_info_> src,\n  ) {\n    return _snd_rawmidi_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_rawmidi_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_copy>>(\n          'snd_rawmidi_info_copy');\n  late final _dart_snd_rawmidi_info_copy _snd_rawmidi_info_copy =\n      _snd_rawmidi_info_copy_ptr.asFunction<_dart_snd_rawmidi_info_copy>();\n\n  int snd_rawmidi_info_get_device(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_device>>(\n          'snd_rawmidi_info_get_device');\n  late final _dart_snd_rawmidi_info_get_device _snd_rawmidi_info_get_device =\n      _snd_rawmidi_info_get_device_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_device>();\n\n  int snd_rawmidi_info_get_subdevice(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_subdevice>>(\n          'snd_rawmidi_info_get_subdevice');\n  late final _dart_snd_rawmidi_info_get_subdevice\n      _snd_rawmidi_info_get_subdevice = _snd_rawmidi_info_get_subdevice_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_subdevice>();\n\n  int snd_rawmidi_info_get_stream(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_stream(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_stream>>(\n          'snd_rawmidi_info_get_stream');\n  late final _dart_snd_rawmidi_info_get_stream _snd_rawmidi_info_get_stream =\n      _snd_rawmidi_info_get_stream_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_stream>();\n\n  int snd_rawmidi_info_get_card(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_card(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_card>>(\n          'snd_rawmidi_info_get_card');\n  late final _dart_snd_rawmidi_info_get_card _snd_rawmidi_info_get_card =\n      _snd_rawmidi_info_get_card_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_card>();\n\n  int snd_rawmidi_info_get_flags(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_flags(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_flags_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_flags>>(\n          'snd_rawmidi_info_get_flags');\n  late final _dart_snd_rawmidi_info_get_flags _snd_rawmidi_info_get_flags =\n      _snd_rawmidi_info_get_flags_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_flags>();\n\n  ffi.Pointer<ffi.Int8> snd_rawmidi_info_get_id(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_id>>(\n          'snd_rawmidi_info_get_id');\n  late final _dart_snd_rawmidi_info_get_id _snd_rawmidi_info_get_id =\n      _snd_rawmidi_info_get_id_ptr.asFunction<_dart_snd_rawmidi_info_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_rawmidi_info_get_name(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_name>>(\n          'snd_rawmidi_info_get_name');\n  late final _dart_snd_rawmidi_info_get_name _snd_rawmidi_info_get_name =\n      _snd_rawmidi_info_get_name_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_name>();\n\n  ffi.Pointer<ffi.Int8> snd_rawmidi_info_get_subdevice_name(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_subdevice_name(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_subdevice_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_subdevice_name>>(\n          'snd_rawmidi_info_get_subdevice_name');\n  late final _dart_snd_rawmidi_info_get_subdevice_name\n      _snd_rawmidi_info_get_subdevice_name =\n      _snd_rawmidi_info_get_subdevice_name_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_subdevice_name>();\n\n  int snd_rawmidi_info_get_subdevices_count(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_subdevices_count(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_subdevices_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_subdevices_count>>(\n          'snd_rawmidi_info_get_subdevices_count');\n  late final _dart_snd_rawmidi_info_get_subdevices_count\n      _snd_rawmidi_info_get_subdevices_count =\n      _snd_rawmidi_info_get_subdevices_count_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_subdevices_count>();\n\n  int snd_rawmidi_info_get_subdevices_avail(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n  ) {\n    return _snd_rawmidi_info_get_subdevices_avail(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_info_get_subdevices_avail_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_get_subdevices_avail>>(\n          'snd_rawmidi_info_get_subdevices_avail');\n  late final _dart_snd_rawmidi_info_get_subdevices_avail\n      _snd_rawmidi_info_get_subdevices_avail =\n      _snd_rawmidi_info_get_subdevices_avail_ptr\n          .asFunction<_dart_snd_rawmidi_info_get_subdevices_avail>();\n\n  void snd_rawmidi_info_set_device(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n    int val,\n  ) {\n    return _snd_rawmidi_info_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_info_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_set_device>>(\n          'snd_rawmidi_info_set_device');\n  late final _dart_snd_rawmidi_info_set_device _snd_rawmidi_info_set_device =\n      _snd_rawmidi_info_set_device_ptr\n          .asFunction<_dart_snd_rawmidi_info_set_device>();\n\n  void snd_rawmidi_info_set_subdevice(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n    int val,\n  ) {\n    return _snd_rawmidi_info_set_subdevice(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_info_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_set_subdevice>>(\n          'snd_rawmidi_info_set_subdevice');\n  late final _dart_snd_rawmidi_info_set_subdevice\n      _snd_rawmidi_info_set_subdevice = _snd_rawmidi_info_set_subdevice_ptr\n          .asFunction<_dart_snd_rawmidi_info_set_subdevice>();\n\n  void snd_rawmidi_info_set_stream(\n    ffi.Pointer<snd_rawmidi_info_> obj,\n    int val,\n  ) {\n    return _snd_rawmidi_info_set_stream(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_info_set_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info_set_stream>>(\n          'snd_rawmidi_info_set_stream');\n  late final _dart_snd_rawmidi_info_set_stream _snd_rawmidi_info_set_stream =\n      _snd_rawmidi_info_set_stream_ptr\n          .asFunction<_dart_snd_rawmidi_info_set_stream>();\n\n  int snd_rawmidi_info(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_info_> info,\n  ) {\n    return _snd_rawmidi_info(\n      rmidi,\n      info,\n    );\n  }\n\n  late final _snd_rawmidi_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_info>>('snd_rawmidi_info');\n  late final _dart_snd_rawmidi_info _snd_rawmidi_info =\n      _snd_rawmidi_info_ptr.asFunction<_dart_snd_rawmidi_info>();\n\n  int snd_rawmidi_params_sizeof() {\n    return _snd_rawmidi_params_sizeof();\n  }\n\n  late final _snd_rawmidi_params_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_sizeof>>(\n          'snd_rawmidi_params_sizeof');\n  late final _dart_snd_rawmidi_params_sizeof _snd_rawmidi_params_sizeof =\n      _snd_rawmidi_params_sizeof_ptr\n          .asFunction<_dart_snd_rawmidi_params_sizeof>();\n\n  int snd_rawmidi_params_malloc(\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_params_>> ptr,\n  ) {\n    return _snd_rawmidi_params_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_rawmidi_params_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_malloc>>(\n          'snd_rawmidi_params_malloc');\n  late final _dart_snd_rawmidi_params_malloc _snd_rawmidi_params_malloc =\n      _snd_rawmidi_params_malloc_ptr\n          .asFunction<_dart_snd_rawmidi_params_malloc>();\n\n  void snd_rawmidi_params_free(\n    ffi.Pointer<snd_rawmidi_params_> obj,\n  ) {\n    return _snd_rawmidi_params_free(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_params_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_free>>(\n          'snd_rawmidi_params_free');\n  late final _dart_snd_rawmidi_params_free _snd_rawmidi_params_free =\n      _snd_rawmidi_params_free_ptr.asFunction<_dart_snd_rawmidi_params_free>();\n\n  void snd_rawmidi_params_copy(\n    ffi.Pointer<snd_rawmidi_params_> dst,\n    ffi.Pointer<snd_rawmidi_params_> src,\n  ) {\n    return _snd_rawmidi_params_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_rawmidi_params_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_copy>>(\n          'snd_rawmidi_params_copy');\n  late final _dart_snd_rawmidi_params_copy _snd_rawmidi_params_copy =\n      _snd_rawmidi_params_copy_ptr.asFunction<_dart_snd_rawmidi_params_copy>();\n\n  int snd_rawmidi_params_set_buffer_size(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_params_> params,\n    int val,\n  ) {\n    return _snd_rawmidi_params_set_buffer_size(\n      rmidi,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_params_set_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_set_buffer_size>>(\n          'snd_rawmidi_params_set_buffer_size');\n  late final _dart_snd_rawmidi_params_set_buffer_size\n      _snd_rawmidi_params_set_buffer_size =\n      _snd_rawmidi_params_set_buffer_size_ptr\n          .asFunction<_dart_snd_rawmidi_params_set_buffer_size>();\n\n  int snd_rawmidi_params_get_buffer_size(\n    ffi.Pointer<snd_rawmidi_params_> params,\n  ) {\n    return _snd_rawmidi_params_get_buffer_size(\n      params,\n    );\n  }\n\n  late final _snd_rawmidi_params_get_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_get_buffer_size>>(\n          'snd_rawmidi_params_get_buffer_size');\n  late final _dart_snd_rawmidi_params_get_buffer_size\n      _snd_rawmidi_params_get_buffer_size =\n      _snd_rawmidi_params_get_buffer_size_ptr\n          .asFunction<_dart_snd_rawmidi_params_get_buffer_size>();\n\n  int snd_rawmidi_params_set_avail_min(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_params_> params,\n    int val,\n  ) {\n    return _snd_rawmidi_params_set_avail_min(\n      rmidi,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_params_set_avail_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_set_avail_min>>(\n          'snd_rawmidi_params_set_avail_min');\n  late final _dart_snd_rawmidi_params_set_avail_min\n      _snd_rawmidi_params_set_avail_min = _snd_rawmidi_params_set_avail_min_ptr\n          .asFunction<_dart_snd_rawmidi_params_set_avail_min>();\n\n  int snd_rawmidi_params_get_avail_min(\n    ffi.Pointer<snd_rawmidi_params_> params,\n  ) {\n    return _snd_rawmidi_params_get_avail_min(\n      params,\n    );\n  }\n\n  late final _snd_rawmidi_params_get_avail_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_get_avail_min>>(\n          'snd_rawmidi_params_get_avail_min');\n  late final _dart_snd_rawmidi_params_get_avail_min\n      _snd_rawmidi_params_get_avail_min = _snd_rawmidi_params_get_avail_min_ptr\n          .asFunction<_dart_snd_rawmidi_params_get_avail_min>();\n\n  int snd_rawmidi_params_set_no_active_sensing(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_params_> params,\n    int val,\n  ) {\n    return _snd_rawmidi_params_set_no_active_sensing(\n      rmidi,\n      params,\n      val,\n    );\n  }\n\n  late final _snd_rawmidi_params_set_no_active_sensing_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_set_no_active_sensing>>(\n          'snd_rawmidi_params_set_no_active_sensing');\n  late final _dart_snd_rawmidi_params_set_no_active_sensing\n      _snd_rawmidi_params_set_no_active_sensing =\n      _snd_rawmidi_params_set_no_active_sensing_ptr\n          .asFunction<_dart_snd_rawmidi_params_set_no_active_sensing>();\n\n  int snd_rawmidi_params_get_no_active_sensing(\n    ffi.Pointer<snd_rawmidi_params_> params,\n  ) {\n    return _snd_rawmidi_params_get_no_active_sensing(\n      params,\n    );\n  }\n\n  late final _snd_rawmidi_params_get_no_active_sensing_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_get_no_active_sensing>>(\n          'snd_rawmidi_params_get_no_active_sensing');\n  late final _dart_snd_rawmidi_params_get_no_active_sensing\n      _snd_rawmidi_params_get_no_active_sensing =\n      _snd_rawmidi_params_get_no_active_sensing_ptr\n          .asFunction<_dart_snd_rawmidi_params_get_no_active_sensing>();\n\n  int snd_rawmidi_params(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_params_> params,\n  ) {\n    return _snd_rawmidi_params(\n      rmidi,\n      params,\n    );\n  }\n\n  late final _snd_rawmidi_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params>>('snd_rawmidi_params');\n  late final _dart_snd_rawmidi_params _snd_rawmidi_params =\n      _snd_rawmidi_params_ptr.asFunction<_dart_snd_rawmidi_params>();\n\n  int snd_rawmidi_params_current(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_params_> params,\n  ) {\n    return _snd_rawmidi_params_current(\n      rmidi,\n      params,\n    );\n  }\n\n  late final _snd_rawmidi_params_current_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_params_current>>(\n          'snd_rawmidi_params_current');\n  late final _dart_snd_rawmidi_params_current _snd_rawmidi_params_current =\n      _snd_rawmidi_params_current_ptr\n          .asFunction<_dart_snd_rawmidi_params_current>();\n\n  int snd_rawmidi_status_sizeof() {\n    return _snd_rawmidi_status_sizeof();\n  }\n\n  late final _snd_rawmidi_status_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_sizeof>>(\n          'snd_rawmidi_status_sizeof');\n  late final _dart_snd_rawmidi_status_sizeof _snd_rawmidi_status_sizeof =\n      _snd_rawmidi_status_sizeof_ptr\n          .asFunction<_dart_snd_rawmidi_status_sizeof>();\n\n  int snd_rawmidi_status_malloc(\n    ffi.Pointer<ffi.Pointer<snd_rawmidi_status_>> ptr,\n  ) {\n    return _snd_rawmidi_status_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_rawmidi_status_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_malloc>>(\n          'snd_rawmidi_status_malloc');\n  late final _dart_snd_rawmidi_status_malloc _snd_rawmidi_status_malloc =\n      _snd_rawmidi_status_malloc_ptr\n          .asFunction<_dart_snd_rawmidi_status_malloc>();\n\n  void snd_rawmidi_status_free(\n    ffi.Pointer<snd_rawmidi_status_> obj,\n  ) {\n    return _snd_rawmidi_status_free(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_status_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_free>>(\n          'snd_rawmidi_status_free');\n  late final _dart_snd_rawmidi_status_free _snd_rawmidi_status_free =\n      _snd_rawmidi_status_free_ptr.asFunction<_dart_snd_rawmidi_status_free>();\n\n  void snd_rawmidi_status_copy(\n    ffi.Pointer<snd_rawmidi_status_> dst,\n    ffi.Pointer<snd_rawmidi_status_> src,\n  ) {\n    return _snd_rawmidi_status_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_rawmidi_status_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_copy>>(\n          'snd_rawmidi_status_copy');\n  late final _dart_snd_rawmidi_status_copy _snd_rawmidi_status_copy =\n      _snd_rawmidi_status_copy_ptr.asFunction<_dart_snd_rawmidi_status_copy>();\n\n  void snd_rawmidi_status_get_tstamp(\n    ffi.Pointer<snd_rawmidi_status_> obj,\n    ffi.Pointer<timespec> ptr,\n  ) {\n    return _snd_rawmidi_status_get_tstamp(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_rawmidi_status_get_tstamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_get_tstamp>>(\n          'snd_rawmidi_status_get_tstamp');\n  late final _dart_snd_rawmidi_status_get_tstamp\n      _snd_rawmidi_status_get_tstamp = _snd_rawmidi_status_get_tstamp_ptr\n          .asFunction<_dart_snd_rawmidi_status_get_tstamp>();\n\n  int snd_rawmidi_status_get_avail(\n    ffi.Pointer<snd_rawmidi_status_> obj,\n  ) {\n    return _snd_rawmidi_status_get_avail(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_status_get_avail_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_get_avail>>(\n          'snd_rawmidi_status_get_avail');\n  late final _dart_snd_rawmidi_status_get_avail _snd_rawmidi_status_get_avail =\n      _snd_rawmidi_status_get_avail_ptr\n          .asFunction<_dart_snd_rawmidi_status_get_avail>();\n\n  int snd_rawmidi_status_get_xruns(\n    ffi.Pointer<snd_rawmidi_status_> obj,\n  ) {\n    return _snd_rawmidi_status_get_xruns(\n      obj,\n    );\n  }\n\n  late final _snd_rawmidi_status_get_xruns_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status_get_xruns>>(\n          'snd_rawmidi_status_get_xruns');\n  late final _dart_snd_rawmidi_status_get_xruns _snd_rawmidi_status_get_xruns =\n      _snd_rawmidi_status_get_xruns_ptr\n          .asFunction<_dart_snd_rawmidi_status_get_xruns>();\n\n  int snd_rawmidi_status(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<snd_rawmidi_status_> status,\n  ) {\n    return _snd_rawmidi_status(\n      rmidi,\n      status,\n    );\n  }\n\n  late final _snd_rawmidi_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_status>>('snd_rawmidi_status');\n  late final _dart_snd_rawmidi_status _snd_rawmidi_status =\n      _snd_rawmidi_status_ptr.asFunction<_dart_snd_rawmidi_status>();\n\n  int snd_rawmidi_drain(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_drain(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_drain_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_drain>>('snd_rawmidi_drain');\n  late final _dart_snd_rawmidi_drain _snd_rawmidi_drain =\n      _snd_rawmidi_drain_ptr.asFunction<_dart_snd_rawmidi_drain>();\n\n  int snd_rawmidi_drop(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_drop(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_drop_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_drop>>('snd_rawmidi_drop');\n  late final _dart_snd_rawmidi_drop _snd_rawmidi_drop =\n      _snd_rawmidi_drop_ptr.asFunction<_dart_snd_rawmidi_drop>();\n\n  int snd_rawmidi_write(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_rawmidi_write(\n      rmidi,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_rawmidi_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_write>>('snd_rawmidi_write');\n  late final _dart_snd_rawmidi_write _snd_rawmidi_write =\n      _snd_rawmidi_write_ptr.asFunction<_dart_snd_rawmidi_write>();\n\n  int snd_rawmidi_read(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_rawmidi_read(\n      rmidi,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_rawmidi_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_read>>('snd_rawmidi_read');\n  late final _dart_snd_rawmidi_read _snd_rawmidi_read =\n      _snd_rawmidi_read_ptr.asFunction<_dart_snd_rawmidi_read>();\n\n  ffi.Pointer<ffi.Int8> snd_rawmidi_name(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_name(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_name>>('snd_rawmidi_name');\n  late final _dart_snd_rawmidi_name _snd_rawmidi_name =\n      _snd_rawmidi_name_ptr.asFunction<_dart_snd_rawmidi_name>();\n\n  int snd_rawmidi_type(\n    ffi.Pointer<snd_rawmidi_> rmidi,\n  ) {\n    return _snd_rawmidi_type(\n      rmidi,\n    );\n  }\n\n  late final _snd_rawmidi_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_type>>('snd_rawmidi_type');\n  late final _dart_snd_rawmidi_type _snd_rawmidi_type =\n      _snd_rawmidi_type_ptr.asFunction<_dart_snd_rawmidi_type>();\n\n  int snd_rawmidi_stream(\n    ffi.Pointer<snd_rawmidi_> rawmidi,\n  ) {\n    return _snd_rawmidi_stream(\n      rawmidi,\n    );\n  }\n\n  late final _snd_rawmidi_stream_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_rawmidi_stream>>('snd_rawmidi_stream');\n  late final _dart_snd_rawmidi_stream _snd_rawmidi_stream =\n      _snd_rawmidi_stream_ptr.asFunction<_dart_snd_rawmidi_stream>();\n\n  int snd_timer_query_open(\n    ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_timer_query_open(\n      handle,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_timer_query_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_open>>(\n          'snd_timer_query_open');\n  late final _dart_snd_timer_query_open _snd_timer_query_open =\n      _snd_timer_query_open_ptr.asFunction<_dart_snd_timer_query_open>();\n\n  int snd_timer_query_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_timer_query_open_lconf(\n      handle,\n      name,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_timer_query_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_open_lconf>>(\n          'snd_timer_query_open_lconf');\n  late final _dart_snd_timer_query_open_lconf _snd_timer_query_open_lconf =\n      _snd_timer_query_open_lconf_ptr\n          .asFunction<_dart_snd_timer_query_open_lconf>();\n\n  int snd_timer_query_close(\n    ffi.Pointer<snd_timer_query_> handle,\n  ) {\n    return _snd_timer_query_close(\n      handle,\n    );\n  }\n\n  late final _snd_timer_query_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_close>>(\n          'snd_timer_query_close');\n  late final _dart_snd_timer_query_close _snd_timer_query_close =\n      _snd_timer_query_close_ptr.asFunction<_dart_snd_timer_query_close>();\n\n  int snd_timer_query_next_device(\n    ffi.Pointer<snd_timer_query_> handle,\n    ffi.Pointer<snd_timer_id_> tid,\n  ) {\n    return _snd_timer_query_next_device(\n      handle,\n      tid,\n    );\n  }\n\n  late final _snd_timer_query_next_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_next_device>>(\n          'snd_timer_query_next_device');\n  late final _dart_snd_timer_query_next_device _snd_timer_query_next_device =\n      _snd_timer_query_next_device_ptr\n          .asFunction<_dart_snd_timer_query_next_device>();\n\n  int snd_timer_query_info(\n    ffi.Pointer<snd_timer_query_> handle,\n    ffi.Pointer<snd_timer_ginfo_> info,\n  ) {\n    return _snd_timer_query_info(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_timer_query_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_info>>(\n          'snd_timer_query_info');\n  late final _dart_snd_timer_query_info _snd_timer_query_info =\n      _snd_timer_query_info_ptr.asFunction<_dart_snd_timer_query_info>();\n\n  int snd_timer_query_params(\n    ffi.Pointer<snd_timer_query_> handle,\n    ffi.Pointer<snd_timer_gparams_> params,\n  ) {\n    return _snd_timer_query_params(\n      handle,\n      params,\n    );\n  }\n\n  late final _snd_timer_query_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_params>>(\n          'snd_timer_query_params');\n  late final _dart_snd_timer_query_params _snd_timer_query_params =\n      _snd_timer_query_params_ptr.asFunction<_dart_snd_timer_query_params>();\n\n  int snd_timer_query_status(\n    ffi.Pointer<snd_timer_query_> handle,\n    ffi.Pointer<snd_timer_gstatus_> status,\n  ) {\n    return _snd_timer_query_status(\n      handle,\n      status,\n    );\n  }\n\n  late final _snd_timer_query_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_query_status>>(\n          'snd_timer_query_status');\n  late final _dart_snd_timer_query_status _snd_timer_query_status =\n      _snd_timer_query_status_ptr.asFunction<_dart_snd_timer_query_status>();\n\n  int snd_timer_open(\n    ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_timer_open(\n      handle,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_timer_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_open>>('snd_timer_open');\n  late final _dart_snd_timer_open _snd_timer_open =\n      _snd_timer_open_ptr.asFunction<_dart_snd_timer_open>();\n\n  int snd_timer_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_timer_open_lconf(\n      handle,\n      name,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_timer_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_open_lconf>>(\n          'snd_timer_open_lconf');\n  late final _dart_snd_timer_open_lconf _snd_timer_open_lconf =\n      _snd_timer_open_lconf_ptr.asFunction<_dart_snd_timer_open_lconf>();\n\n  int snd_timer_close(\n    ffi.Pointer<snd_timer_> handle,\n  ) {\n    return _snd_timer_close(\n      handle,\n    );\n  }\n\n  late final _snd_timer_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_close>>('snd_timer_close');\n  late final _dart_snd_timer_close _snd_timer_close =\n      _snd_timer_close_ptr.asFunction<_dart_snd_timer_close>();\n\n  int snd_async_add_timer_handler(\n    ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n    ffi.Pointer<snd_timer_> timer,\n    ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_async_add_timer_handler(\n      handler,\n      timer,\n      callback,\n      private_data,\n    );\n  }\n\n  late final _snd_async_add_timer_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_add_timer_handler>>(\n          'snd_async_add_timer_handler');\n  late final _dart_snd_async_add_timer_handler _snd_async_add_timer_handler =\n      _snd_async_add_timer_handler_ptr\n          .asFunction<_dart_snd_async_add_timer_handler>();\n\n  ffi.Pointer<snd_timer_> snd_async_handler_get_timer(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_timer(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_timer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_timer>>(\n          'snd_async_handler_get_timer');\n  late final _dart_snd_async_handler_get_timer _snd_async_handler_get_timer =\n      _snd_async_handler_get_timer_ptr\n          .asFunction<_dart_snd_async_handler_get_timer>();\n\n  int snd_timer_poll_descriptors_count(\n    ffi.Pointer<snd_timer_> handle,\n  ) {\n    return _snd_timer_poll_descriptors_count(\n      handle,\n    );\n  }\n\n  late final _snd_timer_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_poll_descriptors_count>>(\n          'snd_timer_poll_descriptors_count');\n  late final _dart_snd_timer_poll_descriptors_count\n      _snd_timer_poll_descriptors_count = _snd_timer_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_timer_poll_descriptors_count>();\n\n  int snd_timer_poll_descriptors(\n    ffi.Pointer<snd_timer_> handle,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_timer_poll_descriptors(\n      handle,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_timer_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_poll_descriptors>>(\n          'snd_timer_poll_descriptors');\n  late final _dart_snd_timer_poll_descriptors _snd_timer_poll_descriptors =\n      _snd_timer_poll_descriptors_ptr\n          .asFunction<_dart_snd_timer_poll_descriptors>();\n\n  int snd_timer_poll_descriptors_revents(\n    ffi.Pointer<snd_timer_> timer,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_timer_poll_descriptors_revents(\n      timer,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_timer_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_poll_descriptors_revents>>(\n          'snd_timer_poll_descriptors_revents');\n  late final _dart_snd_timer_poll_descriptors_revents\n      _snd_timer_poll_descriptors_revents =\n      _snd_timer_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_timer_poll_descriptors_revents>();\n\n  int snd_timer_info(\n    ffi.Pointer<snd_timer_> handle,\n    ffi.Pointer<snd_timer_info_> timer,\n  ) {\n    return _snd_timer_info(\n      handle,\n      timer,\n    );\n  }\n\n  late final _snd_timer_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info>>('snd_timer_info');\n  late final _dart_snd_timer_info _snd_timer_info =\n      _snd_timer_info_ptr.asFunction<_dart_snd_timer_info>();\n\n  int snd_timer_params(\n    ffi.Pointer<snd_timer_> handle,\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params(\n      handle,\n      params,\n    );\n  }\n\n  late final _snd_timer_params_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params>>('snd_timer_params');\n  late final _dart_snd_timer_params _snd_timer_params =\n      _snd_timer_params_ptr.asFunction<_dart_snd_timer_params>();\n\n  int snd_timer_status(\n    ffi.Pointer<snd_timer_> handle,\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status(\n      handle,\n      status,\n    );\n  }\n\n  late final _snd_timer_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status>>('snd_timer_status');\n  late final _dart_snd_timer_status _snd_timer_status =\n      _snd_timer_status_ptr.asFunction<_dart_snd_timer_status>();\n\n  int snd_timer_start(\n    ffi.Pointer<snd_timer_> handle,\n  ) {\n    return _snd_timer_start(\n      handle,\n    );\n  }\n\n  late final _snd_timer_start_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_start>>('snd_timer_start');\n  late final _dart_snd_timer_start _snd_timer_start =\n      _snd_timer_start_ptr.asFunction<_dart_snd_timer_start>();\n\n  int snd_timer_stop(\n    ffi.Pointer<snd_timer_> handle,\n  ) {\n    return _snd_timer_stop(\n      handle,\n    );\n  }\n\n  late final _snd_timer_stop_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_stop>>('snd_timer_stop');\n  late final _dart_snd_timer_stop _snd_timer_stop =\n      _snd_timer_stop_ptr.asFunction<_dart_snd_timer_stop>();\n\n  int snd_timer_continue(\n    ffi.Pointer<snd_timer_> handle,\n  ) {\n    return _snd_timer_continue(\n      handle,\n    );\n  }\n\n  late final _snd_timer_continue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_continue>>('snd_timer_continue');\n  late final _dart_snd_timer_continue _snd_timer_continue =\n      _snd_timer_continue_ptr.asFunction<_dart_snd_timer_continue>();\n\n  int snd_timer_read(\n    ffi.Pointer<snd_timer_> handle,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_timer_read(\n      handle,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_timer_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_read>>('snd_timer_read');\n  late final _dart_snd_timer_read _snd_timer_read =\n      _snd_timer_read_ptr.asFunction<_dart_snd_timer_read>();\n\n  int snd_timer_id_sizeof() {\n    return _snd_timer_id_sizeof();\n  }\n\n  late final _snd_timer_id_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_sizeof>>(\n          'snd_timer_id_sizeof');\n  late final _dart_snd_timer_id_sizeof _snd_timer_id_sizeof =\n      _snd_timer_id_sizeof_ptr.asFunction<_dart_snd_timer_id_sizeof>();\n\n  int snd_timer_id_malloc(\n    ffi.Pointer<ffi.Pointer<snd_timer_id_>> ptr,\n  ) {\n    return _snd_timer_id_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_timer_id_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_malloc>>(\n          'snd_timer_id_malloc');\n  late final _dart_snd_timer_id_malloc _snd_timer_id_malloc =\n      _snd_timer_id_malloc_ptr.asFunction<_dart_snd_timer_id_malloc>();\n\n  void snd_timer_id_free(\n    ffi.Pointer<snd_timer_id_> obj,\n  ) {\n    return _snd_timer_id_free(\n      obj,\n    );\n  }\n\n  late final _snd_timer_id_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_free>>('snd_timer_id_free');\n  late final _dart_snd_timer_id_free _snd_timer_id_free =\n      _snd_timer_id_free_ptr.asFunction<_dart_snd_timer_id_free>();\n\n  void snd_timer_id_copy(\n    ffi.Pointer<snd_timer_id_> dst,\n    ffi.Pointer<snd_timer_id_> src,\n  ) {\n    return _snd_timer_id_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_timer_id_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_copy>>('snd_timer_id_copy');\n  late final _dart_snd_timer_id_copy _snd_timer_id_copy =\n      _snd_timer_id_copy_ptr.asFunction<_dart_snd_timer_id_copy>();\n\n  void snd_timer_id_set_class(\n    ffi.Pointer<snd_timer_id_> id,\n    int dev_class,\n  ) {\n    return _snd_timer_id_set_class(\n      id,\n      dev_class,\n    );\n  }\n\n  late final _snd_timer_id_set_class_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_set_class>>(\n          'snd_timer_id_set_class');\n  late final _dart_snd_timer_id_set_class _snd_timer_id_set_class =\n      _snd_timer_id_set_class_ptr.asFunction<_dart_snd_timer_id_set_class>();\n\n  int snd_timer_id_get_class(\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_timer_id_get_class(\n      id,\n    );\n  }\n\n  late final _snd_timer_id_get_class_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_get_class>>(\n          'snd_timer_id_get_class');\n  late final _dart_snd_timer_id_get_class _snd_timer_id_get_class =\n      _snd_timer_id_get_class_ptr.asFunction<_dart_snd_timer_id_get_class>();\n\n  void snd_timer_id_set_sclass(\n    ffi.Pointer<snd_timer_id_> id,\n    int dev_sclass,\n  ) {\n    return _snd_timer_id_set_sclass(\n      id,\n      dev_sclass,\n    );\n  }\n\n  late final _snd_timer_id_set_sclass_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_set_sclass>>(\n          'snd_timer_id_set_sclass');\n  late final _dart_snd_timer_id_set_sclass _snd_timer_id_set_sclass =\n      _snd_timer_id_set_sclass_ptr.asFunction<_dart_snd_timer_id_set_sclass>();\n\n  int snd_timer_id_get_sclass(\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_timer_id_get_sclass(\n      id,\n    );\n  }\n\n  late final _snd_timer_id_get_sclass_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_get_sclass>>(\n          'snd_timer_id_get_sclass');\n  late final _dart_snd_timer_id_get_sclass _snd_timer_id_get_sclass =\n      _snd_timer_id_get_sclass_ptr.asFunction<_dart_snd_timer_id_get_sclass>();\n\n  void snd_timer_id_set_card(\n    ffi.Pointer<snd_timer_id_> id,\n    int card,\n  ) {\n    return _snd_timer_id_set_card(\n      id,\n      card,\n    );\n  }\n\n  late final _snd_timer_id_set_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_set_card>>(\n          'snd_timer_id_set_card');\n  late final _dart_snd_timer_id_set_card _snd_timer_id_set_card =\n      _snd_timer_id_set_card_ptr.asFunction<_dart_snd_timer_id_set_card>();\n\n  int snd_timer_id_get_card(\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_timer_id_get_card(\n      id,\n    );\n  }\n\n  late final _snd_timer_id_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_get_card>>(\n          'snd_timer_id_get_card');\n  late final _dart_snd_timer_id_get_card _snd_timer_id_get_card =\n      _snd_timer_id_get_card_ptr.asFunction<_dart_snd_timer_id_get_card>();\n\n  void snd_timer_id_set_device(\n    ffi.Pointer<snd_timer_id_> id,\n    int device,\n  ) {\n    return _snd_timer_id_set_device(\n      id,\n      device,\n    );\n  }\n\n  late final _snd_timer_id_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_set_device>>(\n          'snd_timer_id_set_device');\n  late final _dart_snd_timer_id_set_device _snd_timer_id_set_device =\n      _snd_timer_id_set_device_ptr.asFunction<_dart_snd_timer_id_set_device>();\n\n  int snd_timer_id_get_device(\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_timer_id_get_device(\n      id,\n    );\n  }\n\n  late final _snd_timer_id_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_get_device>>(\n          'snd_timer_id_get_device');\n  late final _dart_snd_timer_id_get_device _snd_timer_id_get_device =\n      _snd_timer_id_get_device_ptr.asFunction<_dart_snd_timer_id_get_device>();\n\n  void snd_timer_id_set_subdevice(\n    ffi.Pointer<snd_timer_id_> id,\n    int subdevice,\n  ) {\n    return _snd_timer_id_set_subdevice(\n      id,\n      subdevice,\n    );\n  }\n\n  late final _snd_timer_id_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_set_subdevice>>(\n          'snd_timer_id_set_subdevice');\n  late final _dart_snd_timer_id_set_subdevice _snd_timer_id_set_subdevice =\n      _snd_timer_id_set_subdevice_ptr\n          .asFunction<_dart_snd_timer_id_set_subdevice>();\n\n  int snd_timer_id_get_subdevice(\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_timer_id_get_subdevice(\n      id,\n    );\n  }\n\n  late final _snd_timer_id_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_id_get_subdevice>>(\n          'snd_timer_id_get_subdevice');\n  late final _dart_snd_timer_id_get_subdevice _snd_timer_id_get_subdevice =\n      _snd_timer_id_get_subdevice_ptr\n          .asFunction<_dart_snd_timer_id_get_subdevice>();\n\n  int snd_timer_ginfo_sizeof() {\n    return _snd_timer_ginfo_sizeof();\n  }\n\n  late final _snd_timer_ginfo_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_sizeof>>(\n          'snd_timer_ginfo_sizeof');\n  late final _dart_snd_timer_ginfo_sizeof _snd_timer_ginfo_sizeof =\n      _snd_timer_ginfo_sizeof_ptr.asFunction<_dart_snd_timer_ginfo_sizeof>();\n\n  int snd_timer_ginfo_malloc(\n    ffi.Pointer<ffi.Pointer<snd_timer_ginfo_>> ptr,\n  ) {\n    return _snd_timer_ginfo_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_timer_ginfo_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_malloc>>(\n          'snd_timer_ginfo_malloc');\n  late final _dart_snd_timer_ginfo_malloc _snd_timer_ginfo_malloc =\n      _snd_timer_ginfo_malloc_ptr.asFunction<_dart_snd_timer_ginfo_malloc>();\n\n  void snd_timer_ginfo_free(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_free(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_free>>(\n          'snd_timer_ginfo_free');\n  late final _dart_snd_timer_ginfo_free _snd_timer_ginfo_free =\n      _snd_timer_ginfo_free_ptr.asFunction<_dart_snd_timer_ginfo_free>();\n\n  void snd_timer_ginfo_copy(\n    ffi.Pointer<snd_timer_ginfo_> dst,\n    ffi.Pointer<snd_timer_ginfo_> src,\n  ) {\n    return _snd_timer_ginfo_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_timer_ginfo_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_copy>>(\n          'snd_timer_ginfo_copy');\n  late final _dart_snd_timer_ginfo_copy _snd_timer_ginfo_copy =\n      _snd_timer_ginfo_copy_ptr.asFunction<_dart_snd_timer_ginfo_copy>();\n\n  int snd_timer_ginfo_set_tid(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n    ffi.Pointer<snd_timer_id_> tid,\n  ) {\n    return _snd_timer_ginfo_set_tid(\n      obj,\n      tid,\n    );\n  }\n\n  late final _snd_timer_ginfo_set_tid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_set_tid>>(\n          'snd_timer_ginfo_set_tid');\n  late final _dart_snd_timer_ginfo_set_tid _snd_timer_ginfo_set_tid =\n      _snd_timer_ginfo_set_tid_ptr.asFunction<_dart_snd_timer_ginfo_set_tid>();\n\n  ffi.Pointer<snd_timer_id_> snd_timer_ginfo_get_tid(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_tid(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_tid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_tid>>(\n          'snd_timer_ginfo_get_tid');\n  late final _dart_snd_timer_ginfo_get_tid _snd_timer_ginfo_get_tid =\n      _snd_timer_ginfo_get_tid_ptr.asFunction<_dart_snd_timer_ginfo_get_tid>();\n\n  int snd_timer_ginfo_get_flags(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_flags(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_flags_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_flags>>(\n          'snd_timer_ginfo_get_flags');\n  late final _dart_snd_timer_ginfo_get_flags _snd_timer_ginfo_get_flags =\n      _snd_timer_ginfo_get_flags_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_flags>();\n\n  int snd_timer_ginfo_get_card(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_card(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_card>>(\n          'snd_timer_ginfo_get_card');\n  late final _dart_snd_timer_ginfo_get_card _snd_timer_ginfo_get_card =\n      _snd_timer_ginfo_get_card_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_card>();\n\n  ffi.Pointer<ffi.Int8> snd_timer_ginfo_get_id(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_id>>(\n          'snd_timer_ginfo_get_id');\n  late final _dart_snd_timer_ginfo_get_id _snd_timer_ginfo_get_id =\n      _snd_timer_ginfo_get_id_ptr.asFunction<_dart_snd_timer_ginfo_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_timer_ginfo_get_name(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_name>>(\n          'snd_timer_ginfo_get_name');\n  late final _dart_snd_timer_ginfo_get_name _snd_timer_ginfo_get_name =\n      _snd_timer_ginfo_get_name_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_name>();\n\n  int snd_timer_ginfo_get_resolution(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_resolution(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_resolution_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_resolution>>(\n          'snd_timer_ginfo_get_resolution');\n  late final _dart_snd_timer_ginfo_get_resolution\n      _snd_timer_ginfo_get_resolution = _snd_timer_ginfo_get_resolution_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_resolution>();\n\n  int snd_timer_ginfo_get_resolution_min(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_resolution_min(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_resolution_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_resolution_min>>(\n          'snd_timer_ginfo_get_resolution_min');\n  late final _dart_snd_timer_ginfo_get_resolution_min\n      _snd_timer_ginfo_get_resolution_min =\n      _snd_timer_ginfo_get_resolution_min_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_resolution_min>();\n\n  int snd_timer_ginfo_get_resolution_max(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_resolution_max(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_resolution_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_resolution_max>>(\n          'snd_timer_ginfo_get_resolution_max');\n  late final _dart_snd_timer_ginfo_get_resolution_max\n      _snd_timer_ginfo_get_resolution_max =\n      _snd_timer_ginfo_get_resolution_max_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_resolution_max>();\n\n  int snd_timer_ginfo_get_clients(\n    ffi.Pointer<snd_timer_ginfo_> obj,\n  ) {\n    return _snd_timer_ginfo_get_clients(\n      obj,\n    );\n  }\n\n  late final _snd_timer_ginfo_get_clients_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_ginfo_get_clients>>(\n          'snd_timer_ginfo_get_clients');\n  late final _dart_snd_timer_ginfo_get_clients _snd_timer_ginfo_get_clients =\n      _snd_timer_ginfo_get_clients_ptr\n          .asFunction<_dart_snd_timer_ginfo_get_clients>();\n\n  int snd_timer_info_sizeof() {\n    return _snd_timer_info_sizeof();\n  }\n\n  late final _snd_timer_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_sizeof>>(\n          'snd_timer_info_sizeof');\n  late final _dart_snd_timer_info_sizeof _snd_timer_info_sizeof =\n      _snd_timer_info_sizeof_ptr.asFunction<_dart_snd_timer_info_sizeof>();\n\n  int snd_timer_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_timer_info_>> ptr,\n  ) {\n    return _snd_timer_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_timer_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_malloc>>(\n          'snd_timer_info_malloc');\n  late final _dart_snd_timer_info_malloc _snd_timer_info_malloc =\n      _snd_timer_info_malloc_ptr.asFunction<_dart_snd_timer_info_malloc>();\n\n  void snd_timer_info_free(\n    ffi.Pointer<snd_timer_info_> obj,\n  ) {\n    return _snd_timer_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_timer_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_free>>(\n          'snd_timer_info_free');\n  late final _dart_snd_timer_info_free _snd_timer_info_free =\n      _snd_timer_info_free_ptr.asFunction<_dart_snd_timer_info_free>();\n\n  void snd_timer_info_copy(\n    ffi.Pointer<snd_timer_info_> dst,\n    ffi.Pointer<snd_timer_info_> src,\n  ) {\n    return _snd_timer_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_timer_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_copy>>(\n          'snd_timer_info_copy');\n  late final _dart_snd_timer_info_copy _snd_timer_info_copy =\n      _snd_timer_info_copy_ptr.asFunction<_dart_snd_timer_info_copy>();\n\n  int snd_timer_info_is_slave(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_is_slave(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_is_slave_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_is_slave>>(\n          'snd_timer_info_is_slave');\n  late final _dart_snd_timer_info_is_slave _snd_timer_info_is_slave =\n      _snd_timer_info_is_slave_ptr.asFunction<_dart_snd_timer_info_is_slave>();\n\n  int snd_timer_info_get_card(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_get_card(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_get_card>>(\n          'snd_timer_info_get_card');\n  late final _dart_snd_timer_info_get_card _snd_timer_info_get_card =\n      _snd_timer_info_get_card_ptr.asFunction<_dart_snd_timer_info_get_card>();\n\n  ffi.Pointer<ffi.Int8> snd_timer_info_get_id(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_get_id(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_get_id>>(\n          'snd_timer_info_get_id');\n  late final _dart_snd_timer_info_get_id _snd_timer_info_get_id =\n      _snd_timer_info_get_id_ptr.asFunction<_dart_snd_timer_info_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_timer_info_get_name(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_get_name(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_get_name>>(\n          'snd_timer_info_get_name');\n  late final _dart_snd_timer_info_get_name _snd_timer_info_get_name =\n      _snd_timer_info_get_name_ptr.asFunction<_dart_snd_timer_info_get_name>();\n\n  int snd_timer_info_get_resolution(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_get_resolution(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_get_resolution_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_get_resolution>>(\n          'snd_timer_info_get_resolution');\n  late final _dart_snd_timer_info_get_resolution\n      _snd_timer_info_get_resolution = _snd_timer_info_get_resolution_ptr\n          .asFunction<_dart_snd_timer_info_get_resolution>();\n\n  int snd_timer_params_sizeof() {\n    return _snd_timer_params_sizeof();\n  }\n\n  late final _snd_timer_params_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_sizeof>>(\n          'snd_timer_params_sizeof');\n  late final _dart_snd_timer_params_sizeof _snd_timer_params_sizeof =\n      _snd_timer_params_sizeof_ptr.asFunction<_dart_snd_timer_params_sizeof>();\n\n  int snd_timer_params_malloc(\n    ffi.Pointer<ffi.Pointer<snd_timer_params_>> ptr,\n  ) {\n    return _snd_timer_params_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_timer_params_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_malloc>>(\n          'snd_timer_params_malloc');\n  late final _dart_snd_timer_params_malloc _snd_timer_params_malloc =\n      _snd_timer_params_malloc_ptr.asFunction<_dart_snd_timer_params_malloc>();\n\n  void snd_timer_params_free(\n    ffi.Pointer<snd_timer_params_> obj,\n  ) {\n    return _snd_timer_params_free(\n      obj,\n    );\n  }\n\n  late final _snd_timer_params_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_free>>(\n          'snd_timer_params_free');\n  late final _dart_snd_timer_params_free _snd_timer_params_free =\n      _snd_timer_params_free_ptr.asFunction<_dart_snd_timer_params_free>();\n\n  void snd_timer_params_copy(\n    ffi.Pointer<snd_timer_params_> dst,\n    ffi.Pointer<snd_timer_params_> src,\n  ) {\n    return _snd_timer_params_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_timer_params_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_copy>>(\n          'snd_timer_params_copy');\n  late final _dart_snd_timer_params_copy _snd_timer_params_copy =\n      _snd_timer_params_copy_ptr.asFunction<_dart_snd_timer_params_copy>();\n\n  int snd_timer_params_set_auto_start(\n    ffi.Pointer<snd_timer_params_> params,\n    int auto_start,\n  ) {\n    return _snd_timer_params_set_auto_start(\n      params,\n      auto_start,\n    );\n  }\n\n  late final _snd_timer_params_set_auto_start_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_auto_start>>(\n          'snd_timer_params_set_auto_start');\n  late final _dart_snd_timer_params_set_auto_start\n      _snd_timer_params_set_auto_start = _snd_timer_params_set_auto_start_ptr\n          .asFunction<_dart_snd_timer_params_set_auto_start>();\n\n  int snd_timer_params_get_auto_start(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_auto_start(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_auto_start_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_auto_start>>(\n          'snd_timer_params_get_auto_start');\n  late final _dart_snd_timer_params_get_auto_start\n      _snd_timer_params_get_auto_start = _snd_timer_params_get_auto_start_ptr\n          .asFunction<_dart_snd_timer_params_get_auto_start>();\n\n  int snd_timer_params_set_exclusive(\n    ffi.Pointer<snd_timer_params_> params,\n    int exclusive,\n  ) {\n    return _snd_timer_params_set_exclusive(\n      params,\n      exclusive,\n    );\n  }\n\n  late final _snd_timer_params_set_exclusive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_exclusive>>(\n          'snd_timer_params_set_exclusive');\n  late final _dart_snd_timer_params_set_exclusive\n      _snd_timer_params_set_exclusive = _snd_timer_params_set_exclusive_ptr\n          .asFunction<_dart_snd_timer_params_set_exclusive>();\n\n  int snd_timer_params_get_exclusive(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_exclusive(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_exclusive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_exclusive>>(\n          'snd_timer_params_get_exclusive');\n  late final _dart_snd_timer_params_get_exclusive\n      _snd_timer_params_get_exclusive = _snd_timer_params_get_exclusive_ptr\n          .asFunction<_dart_snd_timer_params_get_exclusive>();\n\n  int snd_timer_params_set_early_event(\n    ffi.Pointer<snd_timer_params_> params,\n    int early_event,\n  ) {\n    return _snd_timer_params_set_early_event(\n      params,\n      early_event,\n    );\n  }\n\n  late final _snd_timer_params_set_early_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_early_event>>(\n          'snd_timer_params_set_early_event');\n  late final _dart_snd_timer_params_set_early_event\n      _snd_timer_params_set_early_event = _snd_timer_params_set_early_event_ptr\n          .asFunction<_dart_snd_timer_params_set_early_event>();\n\n  int snd_timer_params_get_early_event(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_early_event(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_early_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_early_event>>(\n          'snd_timer_params_get_early_event');\n  late final _dart_snd_timer_params_get_early_event\n      _snd_timer_params_get_early_event = _snd_timer_params_get_early_event_ptr\n          .asFunction<_dart_snd_timer_params_get_early_event>();\n\n  void snd_timer_params_set_ticks(\n    ffi.Pointer<snd_timer_params_> params,\n    int ticks,\n  ) {\n    return _snd_timer_params_set_ticks(\n      params,\n      ticks,\n    );\n  }\n\n  late final _snd_timer_params_set_ticks_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_ticks>>(\n          'snd_timer_params_set_ticks');\n  late final _dart_snd_timer_params_set_ticks _snd_timer_params_set_ticks =\n      _snd_timer_params_set_ticks_ptr\n          .asFunction<_dart_snd_timer_params_set_ticks>();\n\n  int snd_timer_params_get_ticks(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_ticks(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_ticks_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_ticks>>(\n          'snd_timer_params_get_ticks');\n  late final _dart_snd_timer_params_get_ticks _snd_timer_params_get_ticks =\n      _snd_timer_params_get_ticks_ptr\n          .asFunction<_dart_snd_timer_params_get_ticks>();\n\n  void snd_timer_params_set_queue_size(\n    ffi.Pointer<snd_timer_params_> params,\n    int queue_size,\n  ) {\n    return _snd_timer_params_set_queue_size(\n      params,\n      queue_size,\n    );\n  }\n\n  late final _snd_timer_params_set_queue_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_queue_size>>(\n          'snd_timer_params_set_queue_size');\n  late final _dart_snd_timer_params_set_queue_size\n      _snd_timer_params_set_queue_size = _snd_timer_params_set_queue_size_ptr\n          .asFunction<_dart_snd_timer_params_set_queue_size>();\n\n  int snd_timer_params_get_queue_size(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_queue_size(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_queue_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_queue_size>>(\n          'snd_timer_params_get_queue_size');\n  late final _dart_snd_timer_params_get_queue_size\n      _snd_timer_params_get_queue_size = _snd_timer_params_get_queue_size_ptr\n          .asFunction<_dart_snd_timer_params_get_queue_size>();\n\n  void snd_timer_params_set_filter(\n    ffi.Pointer<snd_timer_params_> params,\n    int filter,\n  ) {\n    return _snd_timer_params_set_filter(\n      params,\n      filter,\n    );\n  }\n\n  late final _snd_timer_params_set_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_set_filter>>(\n          'snd_timer_params_set_filter');\n  late final _dart_snd_timer_params_set_filter _snd_timer_params_set_filter =\n      _snd_timer_params_set_filter_ptr\n          .asFunction<_dart_snd_timer_params_set_filter>();\n\n  int snd_timer_params_get_filter(\n    ffi.Pointer<snd_timer_params_> params,\n  ) {\n    return _snd_timer_params_get_filter(\n      params,\n    );\n  }\n\n  late final _snd_timer_params_get_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_params_get_filter>>(\n          'snd_timer_params_get_filter');\n  late final _dart_snd_timer_params_get_filter _snd_timer_params_get_filter =\n      _snd_timer_params_get_filter_ptr\n          .asFunction<_dart_snd_timer_params_get_filter>();\n\n  int snd_timer_status_sizeof() {\n    return _snd_timer_status_sizeof();\n  }\n\n  late final _snd_timer_status_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_sizeof>>(\n          'snd_timer_status_sizeof');\n  late final _dart_snd_timer_status_sizeof _snd_timer_status_sizeof =\n      _snd_timer_status_sizeof_ptr.asFunction<_dart_snd_timer_status_sizeof>();\n\n  int snd_timer_status_malloc(\n    ffi.Pointer<ffi.Pointer<snd_timer_status_>> ptr,\n  ) {\n    return _snd_timer_status_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_timer_status_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_malloc>>(\n          'snd_timer_status_malloc');\n  late final _dart_snd_timer_status_malloc _snd_timer_status_malloc =\n      _snd_timer_status_malloc_ptr.asFunction<_dart_snd_timer_status_malloc>();\n\n  void snd_timer_status_free(\n    ffi.Pointer<snd_timer_status_> obj,\n  ) {\n    return _snd_timer_status_free(\n      obj,\n    );\n  }\n\n  late final _snd_timer_status_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_free>>(\n          'snd_timer_status_free');\n  late final _dart_snd_timer_status_free _snd_timer_status_free =\n      _snd_timer_status_free_ptr.asFunction<_dart_snd_timer_status_free>();\n\n  void snd_timer_status_copy(\n    ffi.Pointer<snd_timer_status_> dst,\n    ffi.Pointer<snd_timer_status_> src,\n  ) {\n    return _snd_timer_status_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_timer_status_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_copy>>(\n          'snd_timer_status_copy');\n  late final _dart_snd_timer_status_copy _snd_timer_status_copy =\n      _snd_timer_status_copy_ptr.asFunction<_dart_snd_timer_status_copy>();\n\n  timespec snd_timer_status_get_timestamp(\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status_get_timestamp(\n      status,\n    );\n  }\n\n  late final _snd_timer_status_get_timestamp_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_get_timestamp>>(\n          'snd_timer_status_get_timestamp');\n  late final _dart_snd_timer_status_get_timestamp\n      _snd_timer_status_get_timestamp = _snd_timer_status_get_timestamp_ptr\n          .asFunction<_dart_snd_timer_status_get_timestamp>();\n\n  int snd_timer_status_get_resolution(\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status_get_resolution(\n      status,\n    );\n  }\n\n  late final _snd_timer_status_get_resolution_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_get_resolution>>(\n          'snd_timer_status_get_resolution');\n  late final _dart_snd_timer_status_get_resolution\n      _snd_timer_status_get_resolution = _snd_timer_status_get_resolution_ptr\n          .asFunction<_dart_snd_timer_status_get_resolution>();\n\n  int snd_timer_status_get_lost(\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status_get_lost(\n      status,\n    );\n  }\n\n  late final _snd_timer_status_get_lost_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_get_lost>>(\n          'snd_timer_status_get_lost');\n  late final _dart_snd_timer_status_get_lost _snd_timer_status_get_lost =\n      _snd_timer_status_get_lost_ptr\n          .asFunction<_dart_snd_timer_status_get_lost>();\n\n  int snd_timer_status_get_overrun(\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status_get_overrun(\n      status,\n    );\n  }\n\n  late final _snd_timer_status_get_overrun_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_get_overrun>>(\n          'snd_timer_status_get_overrun');\n  late final _dart_snd_timer_status_get_overrun _snd_timer_status_get_overrun =\n      _snd_timer_status_get_overrun_ptr\n          .asFunction<_dart_snd_timer_status_get_overrun>();\n\n  int snd_timer_status_get_queue(\n    ffi.Pointer<snd_timer_status_> status,\n  ) {\n    return _snd_timer_status_get_queue(\n      status,\n    );\n  }\n\n  late final _snd_timer_status_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_status_get_queue>>(\n          'snd_timer_status_get_queue');\n  late final _dart_snd_timer_status_get_queue _snd_timer_status_get_queue =\n      _snd_timer_status_get_queue_ptr\n          .asFunction<_dart_snd_timer_status_get_queue>();\n\n  int snd_timer_info_get_ticks(\n    ffi.Pointer<snd_timer_info_> info,\n  ) {\n    return _snd_timer_info_get_ticks(\n      info,\n    );\n  }\n\n  late final _snd_timer_info_get_ticks_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_timer_info_get_ticks>>(\n          'snd_timer_info_get_ticks');\n  late final _dart_snd_timer_info_get_ticks _snd_timer_info_get_ticks =\n      _snd_timer_info_get_ticks_ptr\n          .asFunction<_dart_snd_timer_info_get_ticks>();\n\n  int snd_hwdep_open(\n    ffi.Pointer<ffi.Pointer<snd_hwdep_>> hwdep,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_hwdep_open(\n      hwdep,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_hwdep_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_open>>('snd_hwdep_open');\n  late final _dart_snd_hwdep_open _snd_hwdep_open =\n      _snd_hwdep_open_ptr.asFunction<_dart_snd_hwdep_open>();\n\n  int snd_hwdep_close(\n    ffi.Pointer<snd_hwdep_> hwdep,\n  ) {\n    return _snd_hwdep_close(\n      hwdep,\n    );\n  }\n\n  late final _snd_hwdep_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_close>>('snd_hwdep_close');\n  late final _dart_snd_hwdep_close _snd_hwdep_close =\n      _snd_hwdep_close_ptr.asFunction<_dart_snd_hwdep_close>();\n\n  int snd_hwdep_poll_descriptors(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_hwdep_poll_descriptors(\n      hwdep,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_hwdep_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_poll_descriptors>>(\n          'snd_hwdep_poll_descriptors');\n  late final _dart_snd_hwdep_poll_descriptors _snd_hwdep_poll_descriptors =\n      _snd_hwdep_poll_descriptors_ptr\n          .asFunction<_dart_snd_hwdep_poll_descriptors>();\n\n  int snd_hwdep_poll_descriptors_count(\n    ffi.Pointer<snd_hwdep_> hwdep,\n  ) {\n    return _snd_hwdep_poll_descriptors_count(\n      hwdep,\n    );\n  }\n\n  late final _snd_hwdep_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_poll_descriptors_count>>(\n          'snd_hwdep_poll_descriptors_count');\n  late final _dart_snd_hwdep_poll_descriptors_count\n      _snd_hwdep_poll_descriptors_count = _snd_hwdep_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_hwdep_poll_descriptors_count>();\n\n  int snd_hwdep_poll_descriptors_revents(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_hwdep_poll_descriptors_revents(\n      hwdep,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_hwdep_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_poll_descriptors_revents>>(\n          'snd_hwdep_poll_descriptors_revents');\n  late final _dart_snd_hwdep_poll_descriptors_revents\n      _snd_hwdep_poll_descriptors_revents =\n      _snd_hwdep_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_hwdep_poll_descriptors_revents>();\n\n  int snd_hwdep_nonblock(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    int nonblock,\n  ) {\n    return _snd_hwdep_nonblock(\n      hwdep,\n      nonblock,\n    );\n  }\n\n  late final _snd_hwdep_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_nonblock>>('snd_hwdep_nonblock');\n  late final _dart_snd_hwdep_nonblock _snd_hwdep_nonblock =\n      _snd_hwdep_nonblock_ptr.asFunction<_dart_snd_hwdep_nonblock>();\n\n  int snd_hwdep_info(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<snd_hwdep_info_> info,\n  ) {\n    return _snd_hwdep_info(\n      hwdep,\n      info,\n    );\n  }\n\n  late final _snd_hwdep_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info>>('snd_hwdep_info');\n  late final _dart_snd_hwdep_info _snd_hwdep_info =\n      _snd_hwdep_info_ptr.asFunction<_dart_snd_hwdep_info>();\n\n  int snd_hwdep_dsp_status(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<snd_hwdep_dsp_status_> status,\n  ) {\n    return _snd_hwdep_dsp_status(\n      hwdep,\n      status,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status>>(\n          'snd_hwdep_dsp_status');\n  late final _dart_snd_hwdep_dsp_status _snd_hwdep_dsp_status =\n      _snd_hwdep_dsp_status_ptr.asFunction<_dart_snd_hwdep_dsp_status>();\n\n  int snd_hwdep_dsp_load(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<snd_hwdep_dsp_image_> block,\n  ) {\n    return _snd_hwdep_dsp_load(\n      hwdep,\n      block,\n    );\n  }\n\n  late final _snd_hwdep_dsp_load_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_load>>('snd_hwdep_dsp_load');\n  late final _dart_snd_hwdep_dsp_load _snd_hwdep_dsp_load =\n      _snd_hwdep_dsp_load_ptr.asFunction<_dart_snd_hwdep_dsp_load>();\n\n  int snd_hwdep_ioctl(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    int request,\n    ffi.Pointer<ffi.Void> arg,\n  ) {\n    return _snd_hwdep_ioctl(\n      hwdep,\n      request,\n      arg,\n    );\n  }\n\n  late final _snd_hwdep_ioctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_ioctl>>('snd_hwdep_ioctl');\n  late final _dart_snd_hwdep_ioctl _snd_hwdep_ioctl =\n      _snd_hwdep_ioctl_ptr.asFunction<_dart_snd_hwdep_ioctl>();\n\n  int snd_hwdep_write(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_hwdep_write(\n      hwdep,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_hwdep_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_write>>('snd_hwdep_write');\n  late final _dart_snd_hwdep_write _snd_hwdep_write =\n      _snd_hwdep_write_ptr.asFunction<_dart_snd_hwdep_write>();\n\n  int snd_hwdep_read(\n    ffi.Pointer<snd_hwdep_> hwdep,\n    ffi.Pointer<ffi.Void> buffer,\n    int size,\n  ) {\n    return _snd_hwdep_read(\n      hwdep,\n      buffer,\n      size,\n    );\n  }\n\n  late final _snd_hwdep_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_read>>('snd_hwdep_read');\n  late final _dart_snd_hwdep_read _snd_hwdep_read =\n      _snd_hwdep_read_ptr.asFunction<_dart_snd_hwdep_read>();\n\n  int snd_hwdep_info_sizeof() {\n    return _snd_hwdep_info_sizeof();\n  }\n\n  late final _snd_hwdep_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_sizeof>>(\n          'snd_hwdep_info_sizeof');\n  late final _dart_snd_hwdep_info_sizeof _snd_hwdep_info_sizeof =\n      _snd_hwdep_info_sizeof_ptr.asFunction<_dart_snd_hwdep_info_sizeof>();\n\n  int snd_hwdep_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_hwdep_info_>> ptr,\n  ) {\n    return _snd_hwdep_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_hwdep_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_malloc>>(\n          'snd_hwdep_info_malloc');\n  late final _dart_snd_hwdep_info_malloc _snd_hwdep_info_malloc =\n      _snd_hwdep_info_malloc_ptr.asFunction<_dart_snd_hwdep_info_malloc>();\n\n  void snd_hwdep_info_free(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_free>>(\n          'snd_hwdep_info_free');\n  late final _dart_snd_hwdep_info_free _snd_hwdep_info_free =\n      _snd_hwdep_info_free_ptr.asFunction<_dart_snd_hwdep_info_free>();\n\n  void snd_hwdep_info_copy(\n    ffi.Pointer<snd_hwdep_info_> dst,\n    ffi.Pointer<snd_hwdep_info_> src,\n  ) {\n    return _snd_hwdep_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_hwdep_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_copy>>(\n          'snd_hwdep_info_copy');\n  late final _dart_snd_hwdep_info_copy _snd_hwdep_info_copy =\n      _snd_hwdep_info_copy_ptr.asFunction<_dart_snd_hwdep_info_copy>();\n\n  int snd_hwdep_info_get_device(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_get_device>>(\n          'snd_hwdep_info_get_device');\n  late final _dart_snd_hwdep_info_get_device _snd_hwdep_info_get_device =\n      _snd_hwdep_info_get_device_ptr\n          .asFunction<_dart_snd_hwdep_info_get_device>();\n\n  int snd_hwdep_info_get_card(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_get_card(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_get_card>>(\n          'snd_hwdep_info_get_card');\n  late final _dart_snd_hwdep_info_get_card _snd_hwdep_info_get_card =\n      _snd_hwdep_info_get_card_ptr.asFunction<_dart_snd_hwdep_info_get_card>();\n\n  ffi.Pointer<ffi.Int8> snd_hwdep_info_get_id(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_get_id>>(\n          'snd_hwdep_info_get_id');\n  late final _dart_snd_hwdep_info_get_id _snd_hwdep_info_get_id =\n      _snd_hwdep_info_get_id_ptr.asFunction<_dart_snd_hwdep_info_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_hwdep_info_get_name(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_get_name>>(\n          'snd_hwdep_info_get_name');\n  late final _dart_snd_hwdep_info_get_name _snd_hwdep_info_get_name =\n      _snd_hwdep_info_get_name_ptr.asFunction<_dart_snd_hwdep_info_get_name>();\n\n  int snd_hwdep_info_get_iface(\n    ffi.Pointer<snd_hwdep_info_> obj,\n  ) {\n    return _snd_hwdep_info_get_iface(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_info_get_iface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_get_iface>>(\n          'snd_hwdep_info_get_iface');\n  late final _dart_snd_hwdep_info_get_iface _snd_hwdep_info_get_iface =\n      _snd_hwdep_info_get_iface_ptr\n          .asFunction<_dart_snd_hwdep_info_get_iface>();\n\n  void snd_hwdep_info_set_device(\n    ffi.Pointer<snd_hwdep_info_> obj,\n    int val,\n  ) {\n    return _snd_hwdep_info_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_hwdep_info_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_info_set_device>>(\n          'snd_hwdep_info_set_device');\n  late final _dart_snd_hwdep_info_set_device _snd_hwdep_info_set_device =\n      _snd_hwdep_info_set_device_ptr\n          .asFunction<_dart_snd_hwdep_info_set_device>();\n\n  int snd_hwdep_dsp_status_sizeof() {\n    return _snd_hwdep_dsp_status_sizeof();\n  }\n\n  late final _snd_hwdep_dsp_status_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_sizeof>>(\n          'snd_hwdep_dsp_status_sizeof');\n  late final _dart_snd_hwdep_dsp_status_sizeof _snd_hwdep_dsp_status_sizeof =\n      _snd_hwdep_dsp_status_sizeof_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_sizeof>();\n\n  int snd_hwdep_dsp_status_malloc(\n    ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_status_>> ptr,\n  ) {\n    return _snd_hwdep_dsp_status_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_malloc>>(\n          'snd_hwdep_dsp_status_malloc');\n  late final _dart_snd_hwdep_dsp_status_malloc _snd_hwdep_dsp_status_malloc =\n      _snd_hwdep_dsp_status_malloc_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_malloc>();\n\n  void snd_hwdep_dsp_status_free(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_free(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_free>>(\n          'snd_hwdep_dsp_status_free');\n  late final _dart_snd_hwdep_dsp_status_free _snd_hwdep_dsp_status_free =\n      _snd_hwdep_dsp_status_free_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_free>();\n\n  void snd_hwdep_dsp_status_copy(\n    ffi.Pointer<snd_hwdep_dsp_status_> dst,\n    ffi.Pointer<snd_hwdep_dsp_status_> src,\n  ) {\n    return _snd_hwdep_dsp_status_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_copy>>(\n          'snd_hwdep_dsp_status_copy');\n  late final _dart_snd_hwdep_dsp_status_copy _snd_hwdep_dsp_status_copy =\n      _snd_hwdep_dsp_status_copy_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_copy>();\n\n  int snd_hwdep_dsp_status_get_version(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_get_version(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_get_version_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_get_version>>(\n          'snd_hwdep_dsp_status_get_version');\n  late final _dart_snd_hwdep_dsp_status_get_version\n      _snd_hwdep_dsp_status_get_version = _snd_hwdep_dsp_status_get_version_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_get_version>();\n\n  ffi.Pointer<ffi.Int8> snd_hwdep_dsp_status_get_id(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_get_id>>(\n          'snd_hwdep_dsp_status_get_id');\n  late final _dart_snd_hwdep_dsp_status_get_id _snd_hwdep_dsp_status_get_id =\n      _snd_hwdep_dsp_status_get_id_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_get_id>();\n\n  int snd_hwdep_dsp_status_get_num_dsps(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_get_num_dsps(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_get_num_dsps_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_get_num_dsps>>(\n          'snd_hwdep_dsp_status_get_num_dsps');\n  late final _dart_snd_hwdep_dsp_status_get_num_dsps\n      _snd_hwdep_dsp_status_get_num_dsps =\n      _snd_hwdep_dsp_status_get_num_dsps_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_get_num_dsps>();\n\n  int snd_hwdep_dsp_status_get_dsp_loaded(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_get_dsp_loaded(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_get_dsp_loaded_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_get_dsp_loaded>>(\n          'snd_hwdep_dsp_status_get_dsp_loaded');\n  late final _dart_snd_hwdep_dsp_status_get_dsp_loaded\n      _snd_hwdep_dsp_status_get_dsp_loaded =\n      _snd_hwdep_dsp_status_get_dsp_loaded_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_get_dsp_loaded>();\n\n  int snd_hwdep_dsp_status_get_chip_ready(\n    ffi.Pointer<snd_hwdep_dsp_status_> obj,\n  ) {\n    return _snd_hwdep_dsp_status_get_chip_ready(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_status_get_chip_ready_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_status_get_chip_ready>>(\n          'snd_hwdep_dsp_status_get_chip_ready');\n  late final _dart_snd_hwdep_dsp_status_get_chip_ready\n      _snd_hwdep_dsp_status_get_chip_ready =\n      _snd_hwdep_dsp_status_get_chip_ready_ptr\n          .asFunction<_dart_snd_hwdep_dsp_status_get_chip_ready>();\n\n  int snd_hwdep_dsp_image_sizeof() {\n    return _snd_hwdep_dsp_image_sizeof();\n  }\n\n  late final _snd_hwdep_dsp_image_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_sizeof>>(\n          'snd_hwdep_dsp_image_sizeof');\n  late final _dart_snd_hwdep_dsp_image_sizeof _snd_hwdep_dsp_image_sizeof =\n      _snd_hwdep_dsp_image_sizeof_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_sizeof>();\n\n  int snd_hwdep_dsp_image_malloc(\n    ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_image_>> ptr,\n  ) {\n    return _snd_hwdep_dsp_image_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_malloc>>(\n          'snd_hwdep_dsp_image_malloc');\n  late final _dart_snd_hwdep_dsp_image_malloc _snd_hwdep_dsp_image_malloc =\n      _snd_hwdep_dsp_image_malloc_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_malloc>();\n\n  void snd_hwdep_dsp_image_free(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ) {\n    return _snd_hwdep_dsp_image_free(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_free>>(\n          'snd_hwdep_dsp_image_free');\n  late final _dart_snd_hwdep_dsp_image_free _snd_hwdep_dsp_image_free =\n      _snd_hwdep_dsp_image_free_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_free>();\n\n  void snd_hwdep_dsp_image_copy(\n    ffi.Pointer<snd_hwdep_dsp_image_> dst,\n    ffi.Pointer<snd_hwdep_dsp_image_> src,\n  ) {\n    return _snd_hwdep_dsp_image_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_copy>>(\n          'snd_hwdep_dsp_image_copy');\n  late final _dart_snd_hwdep_dsp_image_copy _snd_hwdep_dsp_image_copy =\n      _snd_hwdep_dsp_image_copy_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_copy>();\n\n  int snd_hwdep_dsp_image_get_index(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ) {\n    return _snd_hwdep_dsp_image_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_get_index>>(\n          'snd_hwdep_dsp_image_get_index');\n  late final _dart_snd_hwdep_dsp_image_get_index\n      _snd_hwdep_dsp_image_get_index = _snd_hwdep_dsp_image_get_index_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_get_index>();\n\n  ffi.Pointer<ffi.Int8> snd_hwdep_dsp_image_get_name(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ) {\n    return _snd_hwdep_dsp_image_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_get_name>>(\n          'snd_hwdep_dsp_image_get_name');\n  late final _dart_snd_hwdep_dsp_image_get_name _snd_hwdep_dsp_image_get_name =\n      _snd_hwdep_dsp_image_get_name_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_get_name>();\n\n  ffi.Pointer<ffi.Void> snd_hwdep_dsp_image_get_image(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ) {\n    return _snd_hwdep_dsp_image_get_image(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_get_image_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_get_image>>(\n          'snd_hwdep_dsp_image_get_image');\n  late final _dart_snd_hwdep_dsp_image_get_image\n      _snd_hwdep_dsp_image_get_image = _snd_hwdep_dsp_image_get_image_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_get_image>();\n\n  int snd_hwdep_dsp_image_get_length(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ) {\n    return _snd_hwdep_dsp_image_get_length(\n      obj,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_get_length_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_get_length>>(\n          'snd_hwdep_dsp_image_get_length');\n  late final _dart_snd_hwdep_dsp_image_get_length\n      _snd_hwdep_dsp_image_get_length = _snd_hwdep_dsp_image_get_length_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_get_length>();\n\n  void snd_hwdep_dsp_image_set_index(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n    int _index,\n  ) {\n    return _snd_hwdep_dsp_image_set_index(\n      obj,\n      _index,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_set_index>>(\n          'snd_hwdep_dsp_image_set_index');\n  late final _dart_snd_hwdep_dsp_image_set_index\n      _snd_hwdep_dsp_image_set_index = _snd_hwdep_dsp_image_set_index_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_set_index>();\n\n  void snd_hwdep_dsp_image_set_name(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_hwdep_dsp_image_set_name(\n      obj,\n      name,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_set_name>>(\n          'snd_hwdep_dsp_image_set_name');\n  late final _dart_snd_hwdep_dsp_image_set_name _snd_hwdep_dsp_image_set_name =\n      _snd_hwdep_dsp_image_set_name_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_set_name>();\n\n  void snd_hwdep_dsp_image_set_image(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n    ffi.Pointer<ffi.Void> buffer,\n  ) {\n    return _snd_hwdep_dsp_image_set_image(\n      obj,\n      buffer,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_set_image_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_set_image>>(\n          'snd_hwdep_dsp_image_set_image');\n  late final _dart_snd_hwdep_dsp_image_set_image\n      _snd_hwdep_dsp_image_set_image = _snd_hwdep_dsp_image_set_image_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_set_image>();\n\n  void snd_hwdep_dsp_image_set_length(\n    ffi.Pointer<snd_hwdep_dsp_image_> obj,\n    int length,\n  ) {\n    return _snd_hwdep_dsp_image_set_length(\n      obj,\n      length,\n    );\n  }\n\n  late final _snd_hwdep_dsp_image_set_length_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hwdep_dsp_image_set_length>>(\n          'snd_hwdep_dsp_image_set_length');\n  late final _dart_snd_hwdep_dsp_image_set_length\n      _snd_hwdep_dsp_image_set_length = _snd_hwdep_dsp_image_set_length_ptr\n          .asFunction<_dart_snd_hwdep_dsp_image_set_length>();\n\n  int snd_card_load(\n    int card,\n  ) {\n    return _snd_card_load(\n      card,\n    );\n  }\n\n  late final _snd_card_load_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_card_load>>('snd_card_load');\n  late final _dart_snd_card_load _snd_card_load =\n      _snd_card_load_ptr.asFunction<_dart_snd_card_load>();\n\n  int snd_card_next(\n    ffi.Pointer<ffi.Int32> card,\n  ) {\n    return _snd_card_next(\n      card,\n    );\n  }\n\n  late final _snd_card_next_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_card_next>>('snd_card_next');\n  late final _dart_snd_card_next _snd_card_next =\n      _snd_card_next_ptr.asFunction<_dart_snd_card_next>();\n\n  int snd_card_get_index(\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_card_get_index(\n      name,\n    );\n  }\n\n  late final _snd_card_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_card_get_index>>('snd_card_get_index');\n  late final _dart_snd_card_get_index _snd_card_get_index =\n      _snd_card_get_index_ptr.asFunction<_dart_snd_card_get_index>();\n\n  int snd_card_get_name(\n    int card,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n  ) {\n    return _snd_card_get_name(\n      card,\n      name,\n    );\n  }\n\n  late final _snd_card_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_card_get_name>>('snd_card_get_name');\n  late final _dart_snd_card_get_name _snd_card_get_name =\n      _snd_card_get_name_ptr.asFunction<_dart_snd_card_get_name>();\n\n  int snd_card_get_longname(\n    int card,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n  ) {\n    return _snd_card_get_longname(\n      card,\n      name,\n    );\n  }\n\n  late final _snd_card_get_longname_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_card_get_longname>>(\n          'snd_card_get_longname');\n  late final _dart_snd_card_get_longname _snd_card_get_longname =\n      _snd_card_get_longname_ptr.asFunction<_dart_snd_card_get_longname>();\n\n  int snd_device_name_hint(\n    int card,\n    ffi.Pointer<ffi.Int8> iface,\n    ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Void>>> hints,\n  ) {\n    return _snd_device_name_hint(\n      card,\n      iface,\n      hints,\n    );\n  }\n\n  late final _snd_device_name_hint_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_device_name_hint>>(\n          'snd_device_name_hint');\n  late final _dart_snd_device_name_hint _snd_device_name_hint =\n      _snd_device_name_hint_ptr.asFunction<_dart_snd_device_name_hint>();\n\n  int snd_device_name_free_hint(\n    ffi.Pointer<ffi.Pointer<ffi.Void>> hints,\n  ) {\n    return _snd_device_name_free_hint(\n      hints,\n    );\n  }\n\n  late final _snd_device_name_free_hint_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_device_name_free_hint>>(\n          'snd_device_name_free_hint');\n  late final _dart_snd_device_name_free_hint _snd_device_name_free_hint =\n      _snd_device_name_free_hint_ptr\n          .asFunction<_dart_snd_device_name_free_hint>();\n\n  ffi.Pointer<ffi.Int8> snd_device_name_get_hint(\n    ffi.Pointer<ffi.Void> hint,\n    ffi.Pointer<ffi.Int8> id,\n  ) {\n    return _snd_device_name_get_hint(\n      hint,\n      id,\n    );\n  }\n\n  late final _snd_device_name_get_hint_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_device_name_get_hint>>(\n          'snd_device_name_get_hint');\n  late final _dart_snd_device_name_get_hint _snd_device_name_get_hint =\n      _snd_device_name_get_hint_ptr\n          .asFunction<_dart_snd_device_name_get_hint>();\n\n  int snd_ctl_open(\n    ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_ctl_open(\n      ctl,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_ctl_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_open>>('snd_ctl_open');\n  late final _dart_snd_ctl_open _snd_ctl_open =\n      _snd_ctl_open_ptr.asFunction<_dart_snd_ctl_open>();\n\n  int snd_ctl_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_ctl_open_lconf(\n      ctl,\n      name,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_ctl_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_open_lconf>>('snd_ctl_open_lconf');\n  late final _dart_snd_ctl_open_lconf _snd_ctl_open_lconf =\n      _snd_ctl_open_lconf_ptr.asFunction<_dart_snd_ctl_open_lconf>();\n\n  int snd_ctl_open_fallback(\n    ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n    ffi.Pointer<snd_config_> root,\n    ffi.Pointer<ffi.Int8> name,\n    ffi.Pointer<ffi.Int8> orig_name,\n    int mode,\n  ) {\n    return _snd_ctl_open_fallback(\n      ctl,\n      root,\n      name,\n      orig_name,\n      mode,\n    );\n  }\n\n  late final _snd_ctl_open_fallback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_open_fallback>>(\n          'snd_ctl_open_fallback');\n  late final _dart_snd_ctl_open_fallback _snd_ctl_open_fallback =\n      _snd_ctl_open_fallback_ptr.asFunction<_dart_snd_ctl_open_fallback>();\n\n  int snd_ctl_close(\n    ffi.Pointer<snd_ctl_> ctl,\n  ) {\n    return _snd_ctl_close(\n      ctl,\n    );\n  }\n\n  late final _snd_ctl_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_close>>('snd_ctl_close');\n  late final _dart_snd_ctl_close _snd_ctl_close =\n      _snd_ctl_close_ptr.asFunction<_dart_snd_ctl_close>();\n\n  int snd_ctl_nonblock(\n    ffi.Pointer<snd_ctl_> ctl,\n    int nonblock,\n  ) {\n    return _snd_ctl_nonblock(\n      ctl,\n      nonblock,\n    );\n  }\n\n  late final _snd_ctl_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_nonblock>>('snd_ctl_nonblock');\n  late final _dart_snd_ctl_nonblock _snd_ctl_nonblock =\n      _snd_ctl_nonblock_ptr.asFunction<_dart_snd_ctl_nonblock>();\n\n  int snd_async_add_ctl_handler(\n    ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_async_add_ctl_handler(\n      handler,\n      ctl,\n      callback,\n      private_data,\n    );\n  }\n\n  late final _snd_async_add_ctl_handler_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_add_ctl_handler>>(\n          'snd_async_add_ctl_handler');\n  late final _dart_snd_async_add_ctl_handler _snd_async_add_ctl_handler =\n      _snd_async_add_ctl_handler_ptr\n          .asFunction<_dart_snd_async_add_ctl_handler>();\n\n  ffi.Pointer<snd_ctl_> snd_async_handler_get_ctl(\n    ffi.Pointer<snd_async_handler_> handler,\n  ) {\n    return _snd_async_handler_get_ctl(\n      handler,\n    );\n  }\n\n  late final _snd_async_handler_get_ctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_async_handler_get_ctl>>(\n          'snd_async_handler_get_ctl');\n  late final _dart_snd_async_handler_get_ctl _snd_async_handler_get_ctl =\n      _snd_async_handler_get_ctl_ptr\n          .asFunction<_dart_snd_async_handler_get_ctl>();\n\n  int snd_ctl_poll_descriptors_count(\n    ffi.Pointer<snd_ctl_> ctl,\n  ) {\n    return _snd_ctl_poll_descriptors_count(\n      ctl,\n    );\n  }\n\n  late final _snd_ctl_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_poll_descriptors_count>>(\n          'snd_ctl_poll_descriptors_count');\n  late final _dart_snd_ctl_poll_descriptors_count\n      _snd_ctl_poll_descriptors_count = _snd_ctl_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_ctl_poll_descriptors_count>();\n\n  int snd_ctl_poll_descriptors(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_ctl_poll_descriptors(\n      ctl,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_ctl_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_poll_descriptors>>(\n          'snd_ctl_poll_descriptors');\n  late final _dart_snd_ctl_poll_descriptors _snd_ctl_poll_descriptors =\n      _snd_ctl_poll_descriptors_ptr\n          .asFunction<_dart_snd_ctl_poll_descriptors>();\n\n  int snd_ctl_poll_descriptors_revents(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_ctl_poll_descriptors_revents(\n      ctl,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_ctl_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_poll_descriptors_revents>>(\n          'snd_ctl_poll_descriptors_revents');\n  late final _dart_snd_ctl_poll_descriptors_revents\n      _snd_ctl_poll_descriptors_revents = _snd_ctl_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_ctl_poll_descriptors_revents>();\n\n  int snd_ctl_subscribe_events(\n    ffi.Pointer<snd_ctl_> ctl,\n    int subscribe,\n  ) {\n    return _snd_ctl_subscribe_events(\n      ctl,\n      subscribe,\n    );\n  }\n\n  late final _snd_ctl_subscribe_events_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_subscribe_events>>(\n          'snd_ctl_subscribe_events');\n  late final _dart_snd_ctl_subscribe_events _snd_ctl_subscribe_events =\n      _snd_ctl_subscribe_events_ptr\n          .asFunction<_dart_snd_ctl_subscribe_events>();\n\n  int snd_ctl_card_info(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_card_info_> info,\n  ) {\n    return _snd_ctl_card_info(\n      ctl,\n      info,\n    );\n  }\n\n  late final _snd_ctl_card_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info>>('snd_ctl_card_info');\n  late final _dart_snd_ctl_card_info _snd_ctl_card_info =\n      _snd_ctl_card_info_ptr.asFunction<_dart_snd_ctl_card_info>();\n\n  int snd_ctl_elem_list(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_list_> list,\n  ) {\n    return _snd_ctl_elem_list(\n      ctl,\n      list,\n    );\n  }\n\n  late final _snd_ctl_elem_list_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list>>('snd_ctl_elem_list');\n  late final _dart_snd_ctl_elem_list _snd_ctl_elem_list =\n      _snd_ctl_elem_list_ptr.asFunction<_dart_snd_ctl_elem_list>();\n\n  int snd_ctl_elem_info(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n  ) {\n    return _snd_ctl_elem_info(\n      ctl,\n      info,\n    );\n  }\n\n  late final _snd_ctl_elem_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info>>('snd_ctl_elem_info');\n  late final _dart_snd_ctl_elem_info _snd_ctl_elem_info =\n      _snd_ctl_elem_info_ptr.asFunction<_dart_snd_ctl_elem_info>();\n\n  int snd_ctl_elem_read(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_value_> data,\n  ) {\n    return _snd_ctl_elem_read(\n      ctl,\n      data,\n    );\n  }\n\n  late final _snd_ctl_elem_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_read>>('snd_ctl_elem_read');\n  late final _dart_snd_ctl_elem_read _snd_ctl_elem_read =\n      _snd_ctl_elem_read_ptr.asFunction<_dart_snd_ctl_elem_read>();\n\n  int snd_ctl_elem_write(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_value_> data,\n  ) {\n    return _snd_ctl_elem_write(\n      ctl,\n      data,\n    );\n  }\n\n  late final _snd_ctl_elem_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_write>>('snd_ctl_elem_write');\n  late final _dart_snd_ctl_elem_write _snd_ctl_elem_write =\n      _snd_ctl_elem_write_ptr.asFunction<_dart_snd_ctl_elem_write>();\n\n  int snd_ctl_elem_lock(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_ctl_elem_lock(\n      ctl,\n      id,\n    );\n  }\n\n  late final _snd_ctl_elem_lock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_lock>>('snd_ctl_elem_lock');\n  late final _dart_snd_ctl_elem_lock _snd_ctl_elem_lock =\n      _snd_ctl_elem_lock_ptr.asFunction<_dart_snd_ctl_elem_lock>();\n\n  int snd_ctl_elem_unlock(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_ctl_elem_unlock(\n      ctl,\n      id,\n    );\n  }\n\n  late final _snd_ctl_elem_unlock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_unlock>>(\n          'snd_ctl_elem_unlock');\n  late final _dart_snd_ctl_elem_unlock _snd_ctl_elem_unlock =\n      _snd_ctl_elem_unlock_ptr.asFunction<_dart_snd_ctl_elem_unlock>();\n\n  int snd_ctl_elem_tlv_read(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    ffi.Pointer<ffi.Uint32> tlv,\n    int tlv_size,\n  ) {\n    return _snd_ctl_elem_tlv_read(\n      ctl,\n      id,\n      tlv,\n      tlv_size,\n    );\n  }\n\n  late final _snd_ctl_elem_tlv_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_tlv_read>>(\n          'snd_ctl_elem_tlv_read');\n  late final _dart_snd_ctl_elem_tlv_read _snd_ctl_elem_tlv_read =\n      _snd_ctl_elem_tlv_read_ptr.asFunction<_dart_snd_ctl_elem_tlv_read>();\n\n  int snd_ctl_elem_tlv_write(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    ffi.Pointer<ffi.Uint32> tlv,\n  ) {\n    return _snd_ctl_elem_tlv_write(\n      ctl,\n      id,\n      tlv,\n    );\n  }\n\n  late final _snd_ctl_elem_tlv_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_tlv_write>>(\n          'snd_ctl_elem_tlv_write');\n  late final _dart_snd_ctl_elem_tlv_write _snd_ctl_elem_tlv_write =\n      _snd_ctl_elem_tlv_write_ptr.asFunction<_dart_snd_ctl_elem_tlv_write>();\n\n  int snd_ctl_elem_tlv_command(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    ffi.Pointer<ffi.Uint32> tlv,\n  ) {\n    return _snd_ctl_elem_tlv_command(\n      ctl,\n      id,\n      tlv,\n    );\n  }\n\n  late final _snd_ctl_elem_tlv_command_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_tlv_command>>(\n          'snd_ctl_elem_tlv_command');\n  late final _dart_snd_ctl_elem_tlv_command _snd_ctl_elem_tlv_command =\n      _snd_ctl_elem_tlv_command_ptr\n          .asFunction<_dart_snd_ctl_elem_tlv_command>();\n\n  int snd_ctl_hwdep_next_device(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<ffi.Int32> device,\n  ) {\n    return _snd_ctl_hwdep_next_device(\n      ctl,\n      device,\n    );\n  }\n\n  late final _snd_ctl_hwdep_next_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_hwdep_next_device>>(\n          'snd_ctl_hwdep_next_device');\n  late final _dart_snd_ctl_hwdep_next_device _snd_ctl_hwdep_next_device =\n      _snd_ctl_hwdep_next_device_ptr\n          .asFunction<_dart_snd_ctl_hwdep_next_device>();\n\n  int snd_ctl_hwdep_info(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_hwdep_info_> info,\n  ) {\n    return _snd_ctl_hwdep_info(\n      ctl,\n      info,\n    );\n  }\n\n  late final _snd_ctl_hwdep_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_hwdep_info>>('snd_ctl_hwdep_info');\n  late final _dart_snd_ctl_hwdep_info _snd_ctl_hwdep_info =\n      _snd_ctl_hwdep_info_ptr.asFunction<_dart_snd_ctl_hwdep_info>();\n\n  int snd_ctl_pcm_next_device(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<ffi.Int32> device,\n  ) {\n    return _snd_ctl_pcm_next_device(\n      ctl,\n      device,\n    );\n  }\n\n  late final _snd_ctl_pcm_next_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_pcm_next_device>>(\n          'snd_ctl_pcm_next_device');\n  late final _dart_snd_ctl_pcm_next_device _snd_ctl_pcm_next_device =\n      _snd_ctl_pcm_next_device_ptr.asFunction<_dart_snd_ctl_pcm_next_device>();\n\n  int snd_ctl_pcm_info(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_pcm_info_> info,\n  ) {\n    return _snd_ctl_pcm_info(\n      ctl,\n      info,\n    );\n  }\n\n  late final _snd_ctl_pcm_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_pcm_info>>('snd_ctl_pcm_info');\n  late final _dart_snd_ctl_pcm_info _snd_ctl_pcm_info =\n      _snd_ctl_pcm_info_ptr.asFunction<_dart_snd_ctl_pcm_info>();\n\n  int snd_ctl_pcm_prefer_subdevice(\n    ffi.Pointer<snd_ctl_> ctl,\n    int subdev,\n  ) {\n    return _snd_ctl_pcm_prefer_subdevice(\n      ctl,\n      subdev,\n    );\n  }\n\n  late final _snd_ctl_pcm_prefer_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_pcm_prefer_subdevice>>(\n          'snd_ctl_pcm_prefer_subdevice');\n  late final _dart_snd_ctl_pcm_prefer_subdevice _snd_ctl_pcm_prefer_subdevice =\n      _snd_ctl_pcm_prefer_subdevice_ptr\n          .asFunction<_dart_snd_ctl_pcm_prefer_subdevice>();\n\n  int snd_ctl_rawmidi_next_device(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<ffi.Int32> device,\n  ) {\n    return _snd_ctl_rawmidi_next_device(\n      ctl,\n      device,\n    );\n  }\n\n  late final _snd_ctl_rawmidi_next_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_rawmidi_next_device>>(\n          'snd_ctl_rawmidi_next_device');\n  late final _dart_snd_ctl_rawmidi_next_device _snd_ctl_rawmidi_next_device =\n      _snd_ctl_rawmidi_next_device_ptr\n          .asFunction<_dart_snd_ctl_rawmidi_next_device>();\n\n  int snd_ctl_rawmidi_info(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_rawmidi_info_> info,\n  ) {\n    return _snd_ctl_rawmidi_info(\n      ctl,\n      info,\n    );\n  }\n\n  late final _snd_ctl_rawmidi_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_rawmidi_info>>(\n          'snd_ctl_rawmidi_info');\n  late final _dart_snd_ctl_rawmidi_info _snd_ctl_rawmidi_info =\n      _snd_ctl_rawmidi_info_ptr.asFunction<_dart_snd_ctl_rawmidi_info>();\n\n  int snd_ctl_rawmidi_prefer_subdevice(\n    ffi.Pointer<snd_ctl_> ctl,\n    int subdev,\n  ) {\n    return _snd_ctl_rawmidi_prefer_subdevice(\n      ctl,\n      subdev,\n    );\n  }\n\n  late final _snd_ctl_rawmidi_prefer_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_rawmidi_prefer_subdevice>>(\n          'snd_ctl_rawmidi_prefer_subdevice');\n  late final _dart_snd_ctl_rawmidi_prefer_subdevice\n      _snd_ctl_rawmidi_prefer_subdevice = _snd_ctl_rawmidi_prefer_subdevice_ptr\n          .asFunction<_dart_snd_ctl_rawmidi_prefer_subdevice>();\n\n  int snd_ctl_set_power_state(\n    ffi.Pointer<snd_ctl_> ctl,\n    int state,\n  ) {\n    return _snd_ctl_set_power_state(\n      ctl,\n      state,\n    );\n  }\n\n  late final _snd_ctl_set_power_state_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_set_power_state>>(\n          'snd_ctl_set_power_state');\n  late final _dart_snd_ctl_set_power_state _snd_ctl_set_power_state =\n      _snd_ctl_set_power_state_ptr.asFunction<_dart_snd_ctl_set_power_state>();\n\n  int snd_ctl_get_power_state(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<ffi.Uint32> state,\n  ) {\n    return _snd_ctl_get_power_state(\n      ctl,\n      state,\n    );\n  }\n\n  late final _snd_ctl_get_power_state_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_get_power_state>>(\n          'snd_ctl_get_power_state');\n  late final _dart_snd_ctl_get_power_state _snd_ctl_get_power_state =\n      _snd_ctl_get_power_state_ptr.asFunction<_dart_snd_ctl_get_power_state>();\n\n  int snd_ctl_read(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_event_> event,\n  ) {\n    return _snd_ctl_read(\n      ctl,\n      event,\n    );\n  }\n\n  late final _snd_ctl_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_read>>('snd_ctl_read');\n  late final _dart_snd_ctl_read _snd_ctl_read =\n      _snd_ctl_read_ptr.asFunction<_dart_snd_ctl_read>();\n\n  int snd_ctl_wait(\n    ffi.Pointer<snd_ctl_> ctl,\n    int timeout,\n  ) {\n    return _snd_ctl_wait(\n      ctl,\n      timeout,\n    );\n  }\n\n  late final _snd_ctl_wait_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_wait>>('snd_ctl_wait');\n  late final _dart_snd_ctl_wait _snd_ctl_wait =\n      _snd_ctl_wait_ptr.asFunction<_dart_snd_ctl_wait>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_name(\n    ffi.Pointer<snd_ctl_> ctl,\n  ) {\n    return _snd_ctl_name(\n      ctl,\n    );\n  }\n\n  late final _snd_ctl_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_name>>('snd_ctl_name');\n  late final _dart_snd_ctl_name _snd_ctl_name =\n      _snd_ctl_name_ptr.asFunction<_dart_snd_ctl_name>();\n\n  int snd_ctl_type(\n    ffi.Pointer<snd_ctl_> ctl,\n  ) {\n    return _snd_ctl_type(\n      ctl,\n    );\n  }\n\n  late final _snd_ctl_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_type>>('snd_ctl_type');\n  late final _dart_snd_ctl_type _snd_ctl_type =\n      _snd_ctl_type_ptr.asFunction<_dart_snd_ctl_type>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_type_name(\n    int type,\n  ) {\n    return _snd_ctl_elem_type_name(\n      type,\n    );\n  }\n\n  late final _snd_ctl_elem_type_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_type_name>>(\n          'snd_ctl_elem_type_name');\n  late final _dart_snd_ctl_elem_type_name _snd_ctl_elem_type_name =\n      _snd_ctl_elem_type_name_ptr.asFunction<_dart_snd_ctl_elem_type_name>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_iface_name(\n    int iface,\n  ) {\n    return _snd_ctl_elem_iface_name(\n      iface,\n    );\n  }\n\n  late final _snd_ctl_elem_iface_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_iface_name>>(\n          'snd_ctl_elem_iface_name');\n  late final _dart_snd_ctl_elem_iface_name _snd_ctl_elem_iface_name =\n      _snd_ctl_elem_iface_name_ptr.asFunction<_dart_snd_ctl_elem_iface_name>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_event_type_name(\n    int type,\n  ) {\n    return _snd_ctl_event_type_name(\n      type,\n    );\n  }\n\n  late final _snd_ctl_event_type_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_type_name>>(\n          'snd_ctl_event_type_name');\n  late final _dart_snd_ctl_event_type_name _snd_ctl_event_type_name =\n      _snd_ctl_event_type_name_ptr.asFunction<_dart_snd_ctl_event_type_name>();\n\n  int snd_ctl_event_elem_get_mask(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_mask(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_mask_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_mask>>(\n          'snd_ctl_event_elem_get_mask');\n  late final _dart_snd_ctl_event_elem_get_mask _snd_ctl_event_elem_get_mask =\n      _snd_ctl_event_elem_get_mask_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_mask>();\n\n  int snd_ctl_event_elem_get_numid(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_numid(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_numid>>(\n          'snd_ctl_event_elem_get_numid');\n  late final _dart_snd_ctl_event_elem_get_numid _snd_ctl_event_elem_get_numid =\n      _snd_ctl_event_elem_get_numid_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_numid>();\n\n  void snd_ctl_event_elem_get_id(\n    ffi.Pointer<snd_ctl_event_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_event_elem_get_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_id>>(\n          'snd_ctl_event_elem_get_id');\n  late final _dart_snd_ctl_event_elem_get_id _snd_ctl_event_elem_get_id =\n      _snd_ctl_event_elem_get_id_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_id>();\n\n  int snd_ctl_event_elem_get_interface(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_interface(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_interface>>(\n          'snd_ctl_event_elem_get_interface');\n  late final _dart_snd_ctl_event_elem_get_interface\n      _snd_ctl_event_elem_get_interface = _snd_ctl_event_elem_get_interface_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_interface>();\n\n  int snd_ctl_event_elem_get_device(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_device>>(\n          'snd_ctl_event_elem_get_device');\n  late final _dart_snd_ctl_event_elem_get_device\n      _snd_ctl_event_elem_get_device = _snd_ctl_event_elem_get_device_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_device>();\n\n  int snd_ctl_event_elem_get_subdevice(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_subdevice>>(\n          'snd_ctl_event_elem_get_subdevice');\n  late final _dart_snd_ctl_event_elem_get_subdevice\n      _snd_ctl_event_elem_get_subdevice = _snd_ctl_event_elem_get_subdevice_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_event_elem_get_name(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_name>>(\n          'snd_ctl_event_elem_get_name');\n  late final _dart_snd_ctl_event_elem_get_name _snd_ctl_event_elem_get_name =\n      _snd_ctl_event_elem_get_name_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_name>();\n\n  int snd_ctl_event_elem_get_index(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_elem_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_elem_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_elem_get_index>>(\n          'snd_ctl_event_elem_get_index');\n  late final _dart_snd_ctl_event_elem_get_index _snd_ctl_event_elem_get_index =\n      _snd_ctl_event_elem_get_index_ptr\n          .asFunction<_dart_snd_ctl_event_elem_get_index>();\n\n  int snd_ctl_elem_list_alloc_space(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int entries,\n  ) {\n    return _snd_ctl_elem_list_alloc_space(\n      obj,\n      entries,\n    );\n  }\n\n  late final _snd_ctl_elem_list_alloc_space_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_alloc_space>>(\n          'snd_ctl_elem_list_alloc_space');\n  late final _dart_snd_ctl_elem_list_alloc_space\n      _snd_ctl_elem_list_alloc_space = _snd_ctl_elem_list_alloc_space_ptr\n          .asFunction<_dart_snd_ctl_elem_list_alloc_space>();\n\n  void snd_ctl_elem_list_free_space(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n  ) {\n    return _snd_ctl_elem_list_free_space(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_list_free_space_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_free_space>>(\n          'snd_ctl_elem_list_free_space');\n  late final _dart_snd_ctl_elem_list_free_space _snd_ctl_elem_list_free_space =\n      _snd_ctl_elem_list_free_space_ptr\n          .asFunction<_dart_snd_ctl_elem_list_free_space>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_ascii_elem_id_get(\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_ctl_ascii_elem_id_get(\n      id,\n    );\n  }\n\n  late final _snd_ctl_ascii_elem_id_get_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_ascii_elem_id_get>>(\n          'snd_ctl_ascii_elem_id_get');\n  late final _dart_snd_ctl_ascii_elem_id_get _snd_ctl_ascii_elem_id_get =\n      _snd_ctl_ascii_elem_id_get_ptr\n          .asFunction<_dart_snd_ctl_ascii_elem_id_get>();\n\n  int snd_ctl_ascii_elem_id_parse(\n    ffi.Pointer<snd_ctl_elem_id_> dst,\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_ctl_ascii_elem_id_parse(\n      dst,\n      str,\n    );\n  }\n\n  late final _snd_ctl_ascii_elem_id_parse_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_ascii_elem_id_parse>>(\n          'snd_ctl_ascii_elem_id_parse');\n  late final _dart_snd_ctl_ascii_elem_id_parse _snd_ctl_ascii_elem_id_parse =\n      _snd_ctl_ascii_elem_id_parse_ptr\n          .asFunction<_dart_snd_ctl_ascii_elem_id_parse>();\n\n  int snd_ctl_ascii_value_parse(\n    ffi.Pointer<snd_ctl_> handle,\n    ffi.Pointer<snd_ctl_elem_value_> dst,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    ffi.Pointer<ffi.Int8> value,\n  ) {\n    return _snd_ctl_ascii_value_parse(\n      handle,\n      dst,\n      info,\n      value,\n    );\n  }\n\n  late final _snd_ctl_ascii_value_parse_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_ascii_value_parse>>(\n          'snd_ctl_ascii_value_parse');\n  late final _dart_snd_ctl_ascii_value_parse _snd_ctl_ascii_value_parse =\n      _snd_ctl_ascii_value_parse_ptr\n          .asFunction<_dart_snd_ctl_ascii_value_parse>();\n\n  int snd_ctl_elem_id_sizeof() {\n    return _snd_ctl_elem_id_sizeof();\n  }\n\n  late final _snd_ctl_elem_id_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_sizeof>>(\n          'snd_ctl_elem_id_sizeof');\n  late final _dart_snd_ctl_elem_id_sizeof _snd_ctl_elem_id_sizeof =\n      _snd_ctl_elem_id_sizeof_ptr.asFunction<_dart_snd_ctl_elem_id_sizeof>();\n\n  int snd_ctl_elem_id_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_elem_id_>> ptr,\n  ) {\n    return _snd_ctl_elem_id_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_id_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_malloc>>(\n          'snd_ctl_elem_id_malloc');\n  late final _dart_snd_ctl_elem_id_malloc _snd_ctl_elem_id_malloc =\n      _snd_ctl_elem_id_malloc_ptr.asFunction<_dart_snd_ctl_elem_id_malloc>();\n\n  void snd_ctl_elem_id_free(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_free>>(\n          'snd_ctl_elem_id_free');\n  late final _dart_snd_ctl_elem_id_free _snd_ctl_elem_id_free =\n      _snd_ctl_elem_id_free_ptr.asFunction<_dart_snd_ctl_elem_id_free>();\n\n  void snd_ctl_elem_id_clear(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_clear>>(\n          'snd_ctl_elem_id_clear');\n  late final _dart_snd_ctl_elem_id_clear _snd_ctl_elem_id_clear =\n      _snd_ctl_elem_id_clear_ptr.asFunction<_dart_snd_ctl_elem_id_clear>();\n\n  void snd_ctl_elem_id_copy(\n    ffi.Pointer<snd_ctl_elem_id_> dst,\n    ffi.Pointer<snd_ctl_elem_id_> src,\n  ) {\n    return _snd_ctl_elem_id_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_elem_id_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_copy>>(\n          'snd_ctl_elem_id_copy');\n  late final _dart_snd_ctl_elem_id_copy _snd_ctl_elem_id_copy =\n      _snd_ctl_elem_id_copy_ptr.asFunction<_dart_snd_ctl_elem_id_copy>();\n\n  int snd_ctl_elem_id_get_numid(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_numid(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_numid>>(\n          'snd_ctl_elem_id_get_numid');\n  late final _dart_snd_ctl_elem_id_get_numid _snd_ctl_elem_id_get_numid =\n      _snd_ctl_elem_id_get_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_numid>();\n\n  int snd_ctl_elem_id_get_interface(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_interface(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_interface>>(\n          'snd_ctl_elem_id_get_interface');\n  late final _dart_snd_ctl_elem_id_get_interface\n      _snd_ctl_elem_id_get_interface = _snd_ctl_elem_id_get_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_interface>();\n\n  int snd_ctl_elem_id_get_device(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_device>>(\n          'snd_ctl_elem_id_get_device');\n  late final _dart_snd_ctl_elem_id_get_device _snd_ctl_elem_id_get_device =\n      _snd_ctl_elem_id_get_device_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_device>();\n\n  int snd_ctl_elem_id_get_subdevice(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_subdevice>>(\n          'snd_ctl_elem_id_get_subdevice');\n  late final _dart_snd_ctl_elem_id_get_subdevice\n      _snd_ctl_elem_id_get_subdevice = _snd_ctl_elem_id_get_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_id_get_name(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_name>>(\n          'snd_ctl_elem_id_get_name');\n  late final _dart_snd_ctl_elem_id_get_name _snd_ctl_elem_id_get_name =\n      _snd_ctl_elem_id_get_name_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_name>();\n\n  int snd_ctl_elem_id_get_index(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n  ) {\n    return _snd_ctl_elem_id_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_id_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_get_index>>(\n          'snd_ctl_elem_id_get_index');\n  late final _dart_snd_ctl_elem_id_get_index _snd_ctl_elem_id_get_index =\n      _snd_ctl_elem_id_get_index_ptr\n          .asFunction<_dart_snd_ctl_elem_id_get_index>();\n\n  void snd_ctl_elem_id_set_numid(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_id_set_numid(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_numid>>(\n          'snd_ctl_elem_id_set_numid');\n  late final _dart_snd_ctl_elem_id_set_numid _snd_ctl_elem_id_set_numid =\n      _snd_ctl_elem_id_set_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_numid>();\n\n  void snd_ctl_elem_id_set_interface(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_id_set_interface(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_interface>>(\n          'snd_ctl_elem_id_set_interface');\n  late final _dart_snd_ctl_elem_id_set_interface\n      _snd_ctl_elem_id_set_interface = _snd_ctl_elem_id_set_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_interface>();\n\n  void snd_ctl_elem_id_set_device(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_id_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_device>>(\n          'snd_ctl_elem_id_set_device');\n  late final _dart_snd_ctl_elem_id_set_device _snd_ctl_elem_id_set_device =\n      _snd_ctl_elem_id_set_device_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_device>();\n\n  void snd_ctl_elem_id_set_subdevice(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_id_set_subdevice(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_subdevice>>(\n          'snd_ctl_elem_id_set_subdevice');\n  late final _dart_snd_ctl_elem_id_set_subdevice\n      _snd_ctl_elem_id_set_subdevice = _snd_ctl_elem_id_set_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_subdevice>();\n\n  void snd_ctl_elem_id_set_name(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    ffi.Pointer<ffi.Int8> val,\n  ) {\n    return _snd_ctl_elem_id_set_name(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_name>>(\n          'snd_ctl_elem_id_set_name');\n  late final _dart_snd_ctl_elem_id_set_name _snd_ctl_elem_id_set_name =\n      _snd_ctl_elem_id_set_name_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_name>();\n\n  void snd_ctl_elem_id_set_index(\n    ffi.Pointer<snd_ctl_elem_id_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_id_set_index(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_id_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_id_set_index>>(\n          'snd_ctl_elem_id_set_index');\n  late final _dart_snd_ctl_elem_id_set_index _snd_ctl_elem_id_set_index =\n      _snd_ctl_elem_id_set_index_ptr\n          .asFunction<_dart_snd_ctl_elem_id_set_index>();\n\n  int snd_ctl_card_info_sizeof() {\n    return _snd_ctl_card_info_sizeof();\n  }\n\n  late final _snd_ctl_card_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_sizeof>>(\n          'snd_ctl_card_info_sizeof');\n  late final _dart_snd_ctl_card_info_sizeof _snd_ctl_card_info_sizeof =\n      _snd_ctl_card_info_sizeof_ptr\n          .asFunction<_dart_snd_ctl_card_info_sizeof>();\n\n  int snd_ctl_card_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_card_info_>> ptr,\n  ) {\n    return _snd_ctl_card_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_card_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_malloc>>(\n          'snd_ctl_card_info_malloc');\n  late final _dart_snd_ctl_card_info_malloc _snd_ctl_card_info_malloc =\n      _snd_ctl_card_info_malloc_ptr\n          .asFunction<_dart_snd_ctl_card_info_malloc>();\n\n  void snd_ctl_card_info_free(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_free>>(\n          'snd_ctl_card_info_free');\n  late final _dart_snd_ctl_card_info_free _snd_ctl_card_info_free =\n      _snd_ctl_card_info_free_ptr.asFunction<_dart_snd_ctl_card_info_free>();\n\n  void snd_ctl_card_info_clear(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_clear>>(\n          'snd_ctl_card_info_clear');\n  late final _dart_snd_ctl_card_info_clear _snd_ctl_card_info_clear =\n      _snd_ctl_card_info_clear_ptr.asFunction<_dart_snd_ctl_card_info_clear>();\n\n  void snd_ctl_card_info_copy(\n    ffi.Pointer<snd_ctl_card_info_> dst,\n    ffi.Pointer<snd_ctl_card_info_> src,\n  ) {\n    return _snd_ctl_card_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_card_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_copy>>(\n          'snd_ctl_card_info_copy');\n  late final _dart_snd_ctl_card_info_copy _snd_ctl_card_info_copy =\n      _snd_ctl_card_info_copy_ptr.asFunction<_dart_snd_ctl_card_info_copy>();\n\n  int snd_ctl_card_info_get_card(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_card(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_card>>(\n          'snd_ctl_card_info_get_card');\n  late final _dart_snd_ctl_card_info_get_card _snd_ctl_card_info_get_card =\n      _snd_ctl_card_info_get_card_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_card>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_id(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_id(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_id>>(\n          'snd_ctl_card_info_get_id');\n  late final _dart_snd_ctl_card_info_get_id _snd_ctl_card_info_get_id =\n      _snd_ctl_card_info_get_id_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_driver(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_driver(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_driver_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_driver>>(\n          'snd_ctl_card_info_get_driver');\n  late final _dart_snd_ctl_card_info_get_driver _snd_ctl_card_info_get_driver =\n      _snd_ctl_card_info_get_driver_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_driver>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_name(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_name>>(\n          'snd_ctl_card_info_get_name');\n  late final _dart_snd_ctl_card_info_get_name _snd_ctl_card_info_get_name =\n      _snd_ctl_card_info_get_name_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_name>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_longname(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_longname(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_longname_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_longname>>(\n          'snd_ctl_card_info_get_longname');\n  late final _dart_snd_ctl_card_info_get_longname\n      _snd_ctl_card_info_get_longname = _snd_ctl_card_info_get_longname_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_longname>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_mixername(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_mixername(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_mixername_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_mixername>>(\n          'snd_ctl_card_info_get_mixername');\n  late final _dart_snd_ctl_card_info_get_mixername\n      _snd_ctl_card_info_get_mixername = _snd_ctl_card_info_get_mixername_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_mixername>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_card_info_get_components(\n    ffi.Pointer<snd_ctl_card_info_> obj,\n  ) {\n    return _snd_ctl_card_info_get_components(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_card_info_get_components_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_card_info_get_components>>(\n          'snd_ctl_card_info_get_components');\n  late final _dart_snd_ctl_card_info_get_components\n      _snd_ctl_card_info_get_components = _snd_ctl_card_info_get_components_ptr\n          .asFunction<_dart_snd_ctl_card_info_get_components>();\n\n  int snd_ctl_event_sizeof() {\n    return _snd_ctl_event_sizeof();\n  }\n\n  late final _snd_ctl_event_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_sizeof>>(\n          'snd_ctl_event_sizeof');\n  late final _dart_snd_ctl_event_sizeof _snd_ctl_event_sizeof =\n      _snd_ctl_event_sizeof_ptr.asFunction<_dart_snd_ctl_event_sizeof>();\n\n  int snd_ctl_event_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_event_>> ptr,\n  ) {\n    return _snd_ctl_event_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_event_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_malloc>>(\n          'snd_ctl_event_malloc');\n  late final _dart_snd_ctl_event_malloc _snd_ctl_event_malloc =\n      _snd_ctl_event_malloc_ptr.asFunction<_dart_snd_ctl_event_malloc>();\n\n  void snd_ctl_event_free(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_free>>('snd_ctl_event_free');\n  late final _dart_snd_ctl_event_free _snd_ctl_event_free =\n      _snd_ctl_event_free_ptr.asFunction<_dart_snd_ctl_event_free>();\n\n  void snd_ctl_event_clear(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_clear>>(\n          'snd_ctl_event_clear');\n  late final _dart_snd_ctl_event_clear _snd_ctl_event_clear =\n      _snd_ctl_event_clear_ptr.asFunction<_dart_snd_ctl_event_clear>();\n\n  void snd_ctl_event_copy(\n    ffi.Pointer<snd_ctl_event_> dst,\n    ffi.Pointer<snd_ctl_event_> src,\n  ) {\n    return _snd_ctl_event_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_event_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_copy>>('snd_ctl_event_copy');\n  late final _dart_snd_ctl_event_copy _snd_ctl_event_copy =\n      _snd_ctl_event_copy_ptr.asFunction<_dart_snd_ctl_event_copy>();\n\n  int snd_ctl_event_get_type(\n    ffi.Pointer<snd_ctl_event_> obj,\n  ) {\n    return _snd_ctl_event_get_type(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_event_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_event_get_type>>(\n          'snd_ctl_event_get_type');\n  late final _dart_snd_ctl_event_get_type _snd_ctl_event_get_type =\n      _snd_ctl_event_get_type_ptr.asFunction<_dart_snd_ctl_event_get_type>();\n\n  int snd_ctl_elem_list_sizeof() {\n    return _snd_ctl_elem_list_sizeof();\n  }\n\n  late final _snd_ctl_elem_list_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_sizeof>>(\n          'snd_ctl_elem_list_sizeof');\n  late final _dart_snd_ctl_elem_list_sizeof _snd_ctl_elem_list_sizeof =\n      _snd_ctl_elem_list_sizeof_ptr\n          .asFunction<_dart_snd_ctl_elem_list_sizeof>();\n\n  int snd_ctl_elem_list_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_elem_list_>> ptr,\n  ) {\n    return _snd_ctl_elem_list_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_list_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_malloc>>(\n          'snd_ctl_elem_list_malloc');\n  late final _dart_snd_ctl_elem_list_malloc _snd_ctl_elem_list_malloc =\n      _snd_ctl_elem_list_malloc_ptr\n          .asFunction<_dart_snd_ctl_elem_list_malloc>();\n\n  void snd_ctl_elem_list_free(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n  ) {\n    return _snd_ctl_elem_list_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_list_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_free>>(\n          'snd_ctl_elem_list_free');\n  late final _dart_snd_ctl_elem_list_free _snd_ctl_elem_list_free =\n      _snd_ctl_elem_list_free_ptr.asFunction<_dart_snd_ctl_elem_list_free>();\n\n  void snd_ctl_elem_list_clear(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n  ) {\n    return _snd_ctl_elem_list_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_list_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_clear>>(\n          'snd_ctl_elem_list_clear');\n  late final _dart_snd_ctl_elem_list_clear _snd_ctl_elem_list_clear =\n      _snd_ctl_elem_list_clear_ptr.asFunction<_dart_snd_ctl_elem_list_clear>();\n\n  void snd_ctl_elem_list_copy(\n    ffi.Pointer<snd_ctl_elem_list_> dst,\n    ffi.Pointer<snd_ctl_elem_list_> src,\n  ) {\n    return _snd_ctl_elem_list_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_elem_list_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_copy>>(\n          'snd_ctl_elem_list_copy');\n  late final _dart_snd_ctl_elem_list_copy _snd_ctl_elem_list_copy =\n      _snd_ctl_elem_list_copy_ptr.asFunction<_dart_snd_ctl_elem_list_copy>();\n\n  void snd_ctl_elem_list_set_offset(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_list_set_offset(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_list_set_offset_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_set_offset>>(\n          'snd_ctl_elem_list_set_offset');\n  late final _dart_snd_ctl_elem_list_set_offset _snd_ctl_elem_list_set_offset =\n      _snd_ctl_elem_list_set_offset_ptr\n          .asFunction<_dart_snd_ctl_elem_list_set_offset>();\n\n  int snd_ctl_elem_list_get_used(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n  ) {\n    return _snd_ctl_elem_list_get_used(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_used_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_used>>(\n          'snd_ctl_elem_list_get_used');\n  late final _dart_snd_ctl_elem_list_get_used _snd_ctl_elem_list_get_used =\n      _snd_ctl_elem_list_get_used_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_used>();\n\n  int snd_ctl_elem_list_get_count(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n  ) {\n    return _snd_ctl_elem_list_get_count(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_count>>(\n          'snd_ctl_elem_list_get_count');\n  late final _dart_snd_ctl_elem_list_get_count _snd_ctl_elem_list_get_count =\n      _snd_ctl_elem_list_get_count_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_count>();\n\n  void snd_ctl_elem_list_get_id(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_elem_list_get_id(\n      obj,\n      idx,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_id>>(\n          'snd_ctl_elem_list_get_id');\n  late final _dart_snd_ctl_elem_list_get_id _snd_ctl_elem_list_get_id =\n      _snd_ctl_elem_list_get_id_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_id>();\n\n  int snd_ctl_elem_list_get_numid(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_numid(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_numid>>(\n          'snd_ctl_elem_list_get_numid');\n  late final _dart_snd_ctl_elem_list_get_numid _snd_ctl_elem_list_get_numid =\n      _snd_ctl_elem_list_get_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_numid>();\n\n  int snd_ctl_elem_list_get_interface(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_interface(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_interface>>(\n          'snd_ctl_elem_list_get_interface');\n  late final _dart_snd_ctl_elem_list_get_interface\n      _snd_ctl_elem_list_get_interface = _snd_ctl_elem_list_get_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_interface>();\n\n  int snd_ctl_elem_list_get_device(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_device(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_device>>(\n          'snd_ctl_elem_list_get_device');\n  late final _dart_snd_ctl_elem_list_get_device _snd_ctl_elem_list_get_device =\n      _snd_ctl_elem_list_get_device_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_device>();\n\n  int snd_ctl_elem_list_get_subdevice(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_subdevice(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_subdevice>>(\n          'snd_ctl_elem_list_get_subdevice');\n  late final _dart_snd_ctl_elem_list_get_subdevice\n      _snd_ctl_elem_list_get_subdevice = _snd_ctl_elem_list_get_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_list_get_name(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_name(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_name>>(\n          'snd_ctl_elem_list_get_name');\n  late final _dart_snd_ctl_elem_list_get_name _snd_ctl_elem_list_get_name =\n      _snd_ctl_elem_list_get_name_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_name>();\n\n  int snd_ctl_elem_list_get_index(\n    ffi.Pointer<snd_ctl_elem_list_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_list_get_index(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_list_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_list_get_index>>(\n          'snd_ctl_elem_list_get_index');\n  late final _dart_snd_ctl_elem_list_get_index _snd_ctl_elem_list_get_index =\n      _snd_ctl_elem_list_get_index_ptr\n          .asFunction<_dart_snd_ctl_elem_list_get_index>();\n\n  int snd_ctl_elem_info_sizeof() {\n    return _snd_ctl_elem_info_sizeof();\n  }\n\n  late final _snd_ctl_elem_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_sizeof>>(\n          'snd_ctl_elem_info_sizeof');\n  late final _dart_snd_ctl_elem_info_sizeof _snd_ctl_elem_info_sizeof =\n      _snd_ctl_elem_info_sizeof_ptr\n          .asFunction<_dart_snd_ctl_elem_info_sizeof>();\n\n  int snd_ctl_elem_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_elem_info_>> ptr,\n  ) {\n    return _snd_ctl_elem_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_malloc>>(\n          'snd_ctl_elem_info_malloc');\n  late final _dart_snd_ctl_elem_info_malloc _snd_ctl_elem_info_malloc =\n      _snd_ctl_elem_info_malloc_ptr\n          .asFunction<_dart_snd_ctl_elem_info_malloc>();\n\n  void snd_ctl_elem_info_free(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_free>>(\n          'snd_ctl_elem_info_free');\n  late final _dart_snd_ctl_elem_info_free _snd_ctl_elem_info_free =\n      _snd_ctl_elem_info_free_ptr.asFunction<_dart_snd_ctl_elem_info_free>();\n\n  void snd_ctl_elem_info_clear(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_clear>>(\n          'snd_ctl_elem_info_clear');\n  late final _dart_snd_ctl_elem_info_clear _snd_ctl_elem_info_clear =\n      _snd_ctl_elem_info_clear_ptr.asFunction<_dart_snd_ctl_elem_info_clear>();\n\n  void snd_ctl_elem_info_copy(\n    ffi.Pointer<snd_ctl_elem_info_> dst,\n    ffi.Pointer<snd_ctl_elem_info_> src,\n  ) {\n    return _snd_ctl_elem_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_elem_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_copy>>(\n          'snd_ctl_elem_info_copy');\n  late final _dart_snd_ctl_elem_info_copy _snd_ctl_elem_info_copy =\n      _snd_ctl_elem_info_copy_ptr.asFunction<_dart_snd_ctl_elem_info_copy>();\n\n  int snd_ctl_elem_info_get_type(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_type(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_type>>(\n          'snd_ctl_elem_info_get_type');\n  late final _dart_snd_ctl_elem_info_get_type _snd_ctl_elem_info_get_type =\n      _snd_ctl_elem_info_get_type_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_type>();\n\n  int snd_ctl_elem_info_is_readable(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_readable(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_readable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_readable>>(\n          'snd_ctl_elem_info_is_readable');\n  late final _dart_snd_ctl_elem_info_is_readable\n      _snd_ctl_elem_info_is_readable = _snd_ctl_elem_info_is_readable_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_readable>();\n\n  int snd_ctl_elem_info_is_writable(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_writable(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_writable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_writable>>(\n          'snd_ctl_elem_info_is_writable');\n  late final _dart_snd_ctl_elem_info_is_writable\n      _snd_ctl_elem_info_is_writable = _snd_ctl_elem_info_is_writable_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_writable>();\n\n  int snd_ctl_elem_info_is_volatile(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_volatile(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_volatile_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_volatile>>(\n          'snd_ctl_elem_info_is_volatile');\n  late final _dart_snd_ctl_elem_info_is_volatile\n      _snd_ctl_elem_info_is_volatile = _snd_ctl_elem_info_is_volatile_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_volatile>();\n\n  int snd_ctl_elem_info_is_inactive(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_inactive(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_inactive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_inactive>>(\n          'snd_ctl_elem_info_is_inactive');\n  late final _dart_snd_ctl_elem_info_is_inactive\n      _snd_ctl_elem_info_is_inactive = _snd_ctl_elem_info_is_inactive_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_inactive>();\n\n  int snd_ctl_elem_info_is_locked(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_locked(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_locked_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_locked>>(\n          'snd_ctl_elem_info_is_locked');\n  late final _dart_snd_ctl_elem_info_is_locked _snd_ctl_elem_info_is_locked =\n      _snd_ctl_elem_info_is_locked_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_locked>();\n\n  int snd_ctl_elem_info_is_tlv_readable(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_tlv_readable(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_tlv_readable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_tlv_readable>>(\n          'snd_ctl_elem_info_is_tlv_readable');\n  late final _dart_snd_ctl_elem_info_is_tlv_readable\n      _snd_ctl_elem_info_is_tlv_readable =\n      _snd_ctl_elem_info_is_tlv_readable_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_tlv_readable>();\n\n  int snd_ctl_elem_info_is_tlv_writable(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_tlv_writable(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_tlv_writable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_tlv_writable>>(\n          'snd_ctl_elem_info_is_tlv_writable');\n  late final _dart_snd_ctl_elem_info_is_tlv_writable\n      _snd_ctl_elem_info_is_tlv_writable =\n      _snd_ctl_elem_info_is_tlv_writable_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_tlv_writable>();\n\n  int snd_ctl_elem_info_is_tlv_commandable(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_tlv_commandable(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_tlv_commandable_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_tlv_commandable>>(\n          'snd_ctl_elem_info_is_tlv_commandable');\n  late final _dart_snd_ctl_elem_info_is_tlv_commandable\n      _snd_ctl_elem_info_is_tlv_commandable =\n      _snd_ctl_elem_info_is_tlv_commandable_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_tlv_commandable>();\n\n  int snd_ctl_elem_info_is_owner(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_owner(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_owner_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_owner>>(\n          'snd_ctl_elem_info_is_owner');\n  late final _dart_snd_ctl_elem_info_is_owner _snd_ctl_elem_info_is_owner =\n      _snd_ctl_elem_info_is_owner_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_owner>();\n\n  int snd_ctl_elem_info_is_user(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_is_user(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_is_user_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_is_user>>(\n          'snd_ctl_elem_info_is_user');\n  late final _dart_snd_ctl_elem_info_is_user _snd_ctl_elem_info_is_user =\n      _snd_ctl_elem_info_is_user_ptr\n          .asFunction<_dart_snd_ctl_elem_info_is_user>();\n\n  int snd_ctl_elem_info_get_owner(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_owner(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_owner_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_owner>>(\n          'snd_ctl_elem_info_get_owner');\n  late final _dart_snd_ctl_elem_info_get_owner _snd_ctl_elem_info_get_owner =\n      _snd_ctl_elem_info_get_owner_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_owner>();\n\n  int snd_ctl_elem_info_get_count(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_count(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_count>>(\n          'snd_ctl_elem_info_get_count');\n  late final _dart_snd_ctl_elem_info_get_count _snd_ctl_elem_info_get_count =\n      _snd_ctl_elem_info_get_count_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_count>();\n\n  int snd_ctl_elem_info_get_min(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_min(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_min_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_min>>(\n          'snd_ctl_elem_info_get_min');\n  late final _dart_snd_ctl_elem_info_get_min _snd_ctl_elem_info_get_min =\n      _snd_ctl_elem_info_get_min_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_min>();\n\n  int snd_ctl_elem_info_get_max(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_max(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_max_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_max>>(\n          'snd_ctl_elem_info_get_max');\n  late final _dart_snd_ctl_elem_info_get_max _snd_ctl_elem_info_get_max =\n      _snd_ctl_elem_info_get_max_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_max>();\n\n  int snd_ctl_elem_info_get_step(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_step(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_step_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_step>>(\n          'snd_ctl_elem_info_get_step');\n  late final _dart_snd_ctl_elem_info_get_step _snd_ctl_elem_info_get_step =\n      _snd_ctl_elem_info_get_step_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_step>();\n\n  int snd_ctl_elem_info_get_min64(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_min64(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_min64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_min64>>(\n          'snd_ctl_elem_info_get_min64');\n  late final _dart_snd_ctl_elem_info_get_min64 _snd_ctl_elem_info_get_min64 =\n      _snd_ctl_elem_info_get_min64_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_min64>();\n\n  int snd_ctl_elem_info_get_max64(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_max64(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_max64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_max64>>(\n          'snd_ctl_elem_info_get_max64');\n  late final _dart_snd_ctl_elem_info_get_max64 _snd_ctl_elem_info_get_max64 =\n      _snd_ctl_elem_info_get_max64_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_max64>();\n\n  int snd_ctl_elem_info_get_step64(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_step64(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_step64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_step64>>(\n          'snd_ctl_elem_info_get_step64');\n  late final _dart_snd_ctl_elem_info_get_step64 _snd_ctl_elem_info_get_step64 =\n      _snd_ctl_elem_info_get_step64_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_step64>();\n\n  int snd_ctl_elem_info_get_items(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_items(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_items_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_items>>(\n          'snd_ctl_elem_info_get_items');\n  late final _dart_snd_ctl_elem_info_get_items _snd_ctl_elem_info_get_items =\n      _snd_ctl_elem_info_get_items_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_items>();\n\n  void snd_ctl_elem_info_set_item(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_item(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_item_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_item>>(\n          'snd_ctl_elem_info_set_item');\n  late final _dart_snd_ctl_elem_info_set_item _snd_ctl_elem_info_set_item =\n      _snd_ctl_elem_info_set_item_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_item>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_info_get_item_name(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_item_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_item_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_item_name>>(\n          'snd_ctl_elem_info_get_item_name');\n  late final _dart_snd_ctl_elem_info_get_item_name\n      _snd_ctl_elem_info_get_item_name = _snd_ctl_elem_info_get_item_name_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_item_name>();\n\n  int snd_ctl_elem_info_get_dimensions(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_dimensions(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_dimensions_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_dimensions>>(\n          'snd_ctl_elem_info_get_dimensions');\n  late final _dart_snd_ctl_elem_info_get_dimensions\n      _snd_ctl_elem_info_get_dimensions = _snd_ctl_elem_info_get_dimensions_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_dimensions>();\n\n  int snd_ctl_elem_info_get_dimension(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_info_get_dimension(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_dimension_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_dimension>>(\n          'snd_ctl_elem_info_get_dimension');\n  late final _dart_snd_ctl_elem_info_get_dimension\n      _snd_ctl_elem_info_get_dimension = _snd_ctl_elem_info_get_dimension_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_dimension>();\n\n  int snd_ctl_elem_info_set_dimension(\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    ffi.Pointer<ffi.Int32> dimension,\n  ) {\n    return _snd_ctl_elem_info_set_dimension(\n      info,\n      dimension,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_dimension_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_dimension>>(\n          'snd_ctl_elem_info_set_dimension');\n  late final _dart_snd_ctl_elem_info_set_dimension\n      _snd_ctl_elem_info_set_dimension = _snd_ctl_elem_info_set_dimension_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_dimension>();\n\n  void snd_ctl_elem_info_get_id(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_elem_info_get_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_id>>(\n          'snd_ctl_elem_info_get_id');\n  late final _dart_snd_ctl_elem_info_get_id _snd_ctl_elem_info_get_id =\n      _snd_ctl_elem_info_get_id_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_id>();\n\n  int snd_ctl_elem_info_get_numid(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_numid(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_numid>>(\n          'snd_ctl_elem_info_get_numid');\n  late final _dart_snd_ctl_elem_info_get_numid _snd_ctl_elem_info_get_numid =\n      _snd_ctl_elem_info_get_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_numid>();\n\n  int snd_ctl_elem_info_get_interface(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_interface(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_interface>>(\n          'snd_ctl_elem_info_get_interface');\n  late final _dart_snd_ctl_elem_info_get_interface\n      _snd_ctl_elem_info_get_interface = _snd_ctl_elem_info_get_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_interface>();\n\n  int snd_ctl_elem_info_get_device(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_device>>(\n          'snd_ctl_elem_info_get_device');\n  late final _dart_snd_ctl_elem_info_get_device _snd_ctl_elem_info_get_device =\n      _snd_ctl_elem_info_get_device_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_device>();\n\n  int snd_ctl_elem_info_get_subdevice(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_subdevice>>(\n          'snd_ctl_elem_info_get_subdevice');\n  late final _dart_snd_ctl_elem_info_get_subdevice\n      _snd_ctl_elem_info_get_subdevice = _snd_ctl_elem_info_get_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_info_get_name(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_name>>(\n          'snd_ctl_elem_info_get_name');\n  late final _dart_snd_ctl_elem_info_get_name _snd_ctl_elem_info_get_name =\n      _snd_ctl_elem_info_get_name_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_name>();\n\n  int snd_ctl_elem_info_get_index(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n  ) {\n    return _snd_ctl_elem_info_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_info_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_get_index>>(\n          'snd_ctl_elem_info_get_index');\n  late final _dart_snd_ctl_elem_info_get_index _snd_ctl_elem_info_get_index =\n      _snd_ctl_elem_info_get_index_ptr\n          .asFunction<_dart_snd_ctl_elem_info_get_index>();\n\n  void snd_ctl_elem_info_set_id(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_elem_info_set_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_id>>(\n          'snd_ctl_elem_info_set_id');\n  late final _dart_snd_ctl_elem_info_set_id _snd_ctl_elem_info_set_id =\n      _snd_ctl_elem_info_set_id_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_id>();\n\n  void snd_ctl_elem_info_set_numid(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_numid(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_numid>>(\n          'snd_ctl_elem_info_set_numid');\n  late final _dart_snd_ctl_elem_info_set_numid _snd_ctl_elem_info_set_numid =\n      _snd_ctl_elem_info_set_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_numid>();\n\n  void snd_ctl_elem_info_set_interface(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_interface(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_interface>>(\n          'snd_ctl_elem_info_set_interface');\n  late final _dart_snd_ctl_elem_info_set_interface\n      _snd_ctl_elem_info_set_interface = _snd_ctl_elem_info_set_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_interface>();\n\n  void snd_ctl_elem_info_set_device(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_device>>(\n          'snd_ctl_elem_info_set_device');\n  late final _dart_snd_ctl_elem_info_set_device _snd_ctl_elem_info_set_device =\n      _snd_ctl_elem_info_set_device_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_device>();\n\n  void snd_ctl_elem_info_set_subdevice(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_subdevice(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_subdevice>>(\n          'snd_ctl_elem_info_set_subdevice');\n  late final _dart_snd_ctl_elem_info_set_subdevice\n      _snd_ctl_elem_info_set_subdevice = _snd_ctl_elem_info_set_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_subdevice>();\n\n  void snd_ctl_elem_info_set_name(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    ffi.Pointer<ffi.Int8> val,\n  ) {\n    return _snd_ctl_elem_info_set_name(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_name>>(\n          'snd_ctl_elem_info_set_name');\n  late final _dart_snd_ctl_elem_info_set_name _snd_ctl_elem_info_set_name =\n      _snd_ctl_elem_info_set_name_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_name>();\n\n  void snd_ctl_elem_info_set_index(\n    ffi.Pointer<snd_ctl_elem_info_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_info_set_index(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_info_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_info_set_index>>(\n          'snd_ctl_elem_info_set_index');\n  late final _dart_snd_ctl_elem_info_set_index _snd_ctl_elem_info_set_index =\n      _snd_ctl_elem_info_set_index_ptr\n          .asFunction<_dart_snd_ctl_elem_info_set_index>();\n\n  int snd_ctl_add_integer_elem_set(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    int element_count,\n    int member_count,\n    int min,\n    int max,\n    int step,\n  ) {\n    return _snd_ctl_add_integer_elem_set(\n      ctl,\n      info,\n      element_count,\n      member_count,\n      min,\n      max,\n      step,\n    );\n  }\n\n  late final _snd_ctl_add_integer_elem_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_add_integer_elem_set>>(\n          'snd_ctl_add_integer_elem_set');\n  late final _dart_snd_ctl_add_integer_elem_set _snd_ctl_add_integer_elem_set =\n      _snd_ctl_add_integer_elem_set_ptr\n          .asFunction<_dart_snd_ctl_add_integer_elem_set>();\n\n  int snd_ctl_add_integer64_elem_set(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    int element_count,\n    int member_count,\n    int min,\n    int max,\n    int step,\n  ) {\n    return _snd_ctl_add_integer64_elem_set(\n      ctl,\n      info,\n      element_count,\n      member_count,\n      min,\n      max,\n      step,\n    );\n  }\n\n  late final _snd_ctl_add_integer64_elem_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_add_integer64_elem_set>>(\n          'snd_ctl_add_integer64_elem_set');\n  late final _dart_snd_ctl_add_integer64_elem_set\n      _snd_ctl_add_integer64_elem_set = _snd_ctl_add_integer64_elem_set_ptr\n          .asFunction<_dart_snd_ctl_add_integer64_elem_set>();\n\n  int snd_ctl_add_boolean_elem_set(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    int element_count,\n    int member_count,\n  ) {\n    return _snd_ctl_add_boolean_elem_set(\n      ctl,\n      info,\n      element_count,\n      member_count,\n    );\n  }\n\n  late final _snd_ctl_add_boolean_elem_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_add_boolean_elem_set>>(\n          'snd_ctl_add_boolean_elem_set');\n  late final _dart_snd_ctl_add_boolean_elem_set _snd_ctl_add_boolean_elem_set =\n      _snd_ctl_add_boolean_elem_set_ptr\n          .asFunction<_dart_snd_ctl_add_boolean_elem_set>();\n\n  int snd_ctl_add_enumerated_elem_set(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    int element_count,\n    int member_count,\n    int items,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> labels,\n  ) {\n    return _snd_ctl_add_enumerated_elem_set(\n      ctl,\n      info,\n      element_count,\n      member_count,\n      items,\n      labels,\n    );\n  }\n\n  late final _snd_ctl_add_enumerated_elem_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_add_enumerated_elem_set>>(\n          'snd_ctl_add_enumerated_elem_set');\n  late final _dart_snd_ctl_add_enumerated_elem_set\n      _snd_ctl_add_enumerated_elem_set = _snd_ctl_add_enumerated_elem_set_ptr\n          .asFunction<_dart_snd_ctl_add_enumerated_elem_set>();\n\n  int snd_ctl_add_bytes_elem_set(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n    int element_count,\n    int member_count,\n  ) {\n    return _snd_ctl_add_bytes_elem_set(\n      ctl,\n      info,\n      element_count,\n      member_count,\n    );\n  }\n\n  late final _snd_ctl_add_bytes_elem_set_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_add_bytes_elem_set>>(\n          'snd_ctl_add_bytes_elem_set');\n  late final _dart_snd_ctl_add_bytes_elem_set _snd_ctl_add_bytes_elem_set =\n      _snd_ctl_add_bytes_elem_set_ptr\n          .asFunction<_dart_snd_ctl_add_bytes_elem_set>();\n\n  int snd_ctl_elem_add_integer(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int count,\n    int imin,\n    int imax,\n    int istep,\n  ) {\n    return _snd_ctl_elem_add_integer(\n      ctl,\n      id,\n      count,\n      imin,\n      imax,\n      istep,\n    );\n  }\n\n  late final _snd_ctl_elem_add_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_add_integer>>(\n          'snd_ctl_elem_add_integer');\n  late final _dart_snd_ctl_elem_add_integer _snd_ctl_elem_add_integer =\n      _snd_ctl_elem_add_integer_ptr\n          .asFunction<_dart_snd_ctl_elem_add_integer>();\n\n  int snd_ctl_elem_add_integer64(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int count,\n    int imin,\n    int imax,\n    int istep,\n  ) {\n    return _snd_ctl_elem_add_integer64(\n      ctl,\n      id,\n      count,\n      imin,\n      imax,\n      istep,\n    );\n  }\n\n  late final _snd_ctl_elem_add_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_add_integer64>>(\n          'snd_ctl_elem_add_integer64');\n  late final _dart_snd_ctl_elem_add_integer64 _snd_ctl_elem_add_integer64 =\n      _snd_ctl_elem_add_integer64_ptr\n          .asFunction<_dart_snd_ctl_elem_add_integer64>();\n\n  int snd_ctl_elem_add_boolean(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int count,\n  ) {\n    return _snd_ctl_elem_add_boolean(\n      ctl,\n      id,\n      count,\n    );\n  }\n\n  late final _snd_ctl_elem_add_boolean_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_add_boolean>>(\n          'snd_ctl_elem_add_boolean');\n  late final _dart_snd_ctl_elem_add_boolean _snd_ctl_elem_add_boolean =\n      _snd_ctl_elem_add_boolean_ptr\n          .asFunction<_dart_snd_ctl_elem_add_boolean>();\n\n  int snd_ctl_elem_add_enumerated(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int count,\n    int items,\n    ffi.Pointer<ffi.Pointer<ffi.Int8>> names,\n  ) {\n    return _snd_ctl_elem_add_enumerated(\n      ctl,\n      id,\n      count,\n      items,\n      names,\n    );\n  }\n\n  late final _snd_ctl_elem_add_enumerated_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_add_enumerated>>(\n          'snd_ctl_elem_add_enumerated');\n  late final _dart_snd_ctl_elem_add_enumerated _snd_ctl_elem_add_enumerated =\n      _snd_ctl_elem_add_enumerated_ptr\n          .asFunction<_dart_snd_ctl_elem_add_enumerated>();\n\n  int snd_ctl_elem_add_iec958(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_ctl_elem_add_iec958(\n      ctl,\n      id,\n    );\n  }\n\n  late final _snd_ctl_elem_add_iec958_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_add_iec958>>(\n          'snd_ctl_elem_add_iec958');\n  late final _dart_snd_ctl_elem_add_iec958 _snd_ctl_elem_add_iec958 =\n      _snd_ctl_elem_add_iec958_ptr.asFunction<_dart_snd_ctl_elem_add_iec958>();\n\n  int snd_ctl_elem_remove(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_ctl_elem_remove(\n      ctl,\n      id,\n    );\n  }\n\n  late final _snd_ctl_elem_remove_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_remove>>(\n          'snd_ctl_elem_remove');\n  late final _dart_snd_ctl_elem_remove _snd_ctl_elem_remove =\n      _snd_ctl_elem_remove_ptr.asFunction<_dart_snd_ctl_elem_remove>();\n\n  int snd_ctl_elem_value_sizeof() {\n    return _snd_ctl_elem_value_sizeof();\n  }\n\n  late final _snd_ctl_elem_value_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_sizeof>>(\n          'snd_ctl_elem_value_sizeof');\n  late final _dart_snd_ctl_elem_value_sizeof _snd_ctl_elem_value_sizeof =\n      _snd_ctl_elem_value_sizeof_ptr\n          .asFunction<_dart_snd_ctl_elem_value_sizeof>();\n\n  int snd_ctl_elem_value_malloc(\n    ffi.Pointer<ffi.Pointer<snd_ctl_elem_value_>> ptr,\n  ) {\n    return _snd_ctl_elem_value_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_value_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_malloc>>(\n          'snd_ctl_elem_value_malloc');\n  late final _dart_snd_ctl_elem_value_malloc _snd_ctl_elem_value_malloc =\n      _snd_ctl_elem_value_malloc_ptr\n          .asFunction<_dart_snd_ctl_elem_value_malloc>();\n\n  void snd_ctl_elem_value_free(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_free(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_free>>(\n          'snd_ctl_elem_value_free');\n  late final _dart_snd_ctl_elem_value_free _snd_ctl_elem_value_free =\n      _snd_ctl_elem_value_free_ptr.asFunction<_dart_snd_ctl_elem_value_free>();\n\n  void snd_ctl_elem_value_clear(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_clear(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_clear>>(\n          'snd_ctl_elem_value_clear');\n  late final _dart_snd_ctl_elem_value_clear _snd_ctl_elem_value_clear =\n      _snd_ctl_elem_value_clear_ptr\n          .asFunction<_dart_snd_ctl_elem_value_clear>();\n\n  void snd_ctl_elem_value_copy(\n    ffi.Pointer<snd_ctl_elem_value_> dst,\n    ffi.Pointer<snd_ctl_elem_value_> src,\n  ) {\n    return _snd_ctl_elem_value_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_ctl_elem_value_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_copy>>(\n          'snd_ctl_elem_value_copy');\n  late final _dart_snd_ctl_elem_value_copy _snd_ctl_elem_value_copy =\n      _snd_ctl_elem_value_copy_ptr.asFunction<_dart_snd_ctl_elem_value_copy>();\n\n  int snd_ctl_elem_value_compare(\n    ffi.Pointer<snd_ctl_elem_value_> left,\n    ffi.Pointer<snd_ctl_elem_value_> right,\n  ) {\n    return _snd_ctl_elem_value_compare(\n      left,\n      right,\n    );\n  }\n\n  late final _snd_ctl_elem_value_compare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_compare>>(\n          'snd_ctl_elem_value_compare');\n  late final _dart_snd_ctl_elem_value_compare _snd_ctl_elem_value_compare =\n      _snd_ctl_elem_value_compare_ptr\n          .asFunction<_dart_snd_ctl_elem_value_compare>();\n\n  void snd_ctl_elem_value_get_id(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_elem_value_get_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_id>>(\n          'snd_ctl_elem_value_get_id');\n  late final _dart_snd_ctl_elem_value_get_id _snd_ctl_elem_value_get_id =\n      _snd_ctl_elem_value_get_id_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_id>();\n\n  int snd_ctl_elem_value_get_numid(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_numid(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_numid>>(\n          'snd_ctl_elem_value_get_numid');\n  late final _dart_snd_ctl_elem_value_get_numid _snd_ctl_elem_value_get_numid =\n      _snd_ctl_elem_value_get_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_numid>();\n\n  int snd_ctl_elem_value_get_interface(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_interface(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_interface>>(\n          'snd_ctl_elem_value_get_interface');\n  late final _dart_snd_ctl_elem_value_get_interface\n      _snd_ctl_elem_value_get_interface = _snd_ctl_elem_value_get_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_interface>();\n\n  int snd_ctl_elem_value_get_device(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_device>>(\n          'snd_ctl_elem_value_get_device');\n  late final _dart_snd_ctl_elem_value_get_device\n      _snd_ctl_elem_value_get_device = _snd_ctl_elem_value_get_device_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_device>();\n\n  int snd_ctl_elem_value_get_subdevice(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_subdevice>>(\n          'snd_ctl_elem_value_get_subdevice');\n  late final _dart_snd_ctl_elem_value_get_subdevice\n      _snd_ctl_elem_value_get_subdevice = _snd_ctl_elem_value_get_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_ctl_elem_value_get_name(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_name>>(\n          'snd_ctl_elem_value_get_name');\n  late final _dart_snd_ctl_elem_value_get_name _snd_ctl_elem_value_get_name =\n      _snd_ctl_elem_value_get_name_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_name>();\n\n  int snd_ctl_elem_value_get_index(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_index>>(\n          'snd_ctl_elem_value_get_index');\n  late final _dart_snd_ctl_elem_value_get_index _snd_ctl_elem_value_get_index =\n      _snd_ctl_elem_value_get_index_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_index>();\n\n  void snd_ctl_elem_value_set_id(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_ctl_elem_value_set_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_id>>(\n          'snd_ctl_elem_value_set_id');\n  late final _dart_snd_ctl_elem_value_set_id _snd_ctl_elem_value_set_id =\n      _snd_ctl_elem_value_set_id_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_id>();\n\n  void snd_ctl_elem_value_set_numid(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_numid(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_numid>>(\n          'snd_ctl_elem_value_set_numid');\n  late final _dart_snd_ctl_elem_value_set_numid _snd_ctl_elem_value_set_numid =\n      _snd_ctl_elem_value_set_numid_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_numid>();\n\n  void snd_ctl_elem_value_set_interface(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_interface(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_interface>>(\n          'snd_ctl_elem_value_set_interface');\n  late final _dart_snd_ctl_elem_value_set_interface\n      _snd_ctl_elem_value_set_interface = _snd_ctl_elem_value_set_interface_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_interface>();\n\n  void snd_ctl_elem_value_set_device(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_device(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_device>>(\n          'snd_ctl_elem_value_set_device');\n  late final _dart_snd_ctl_elem_value_set_device\n      _snd_ctl_elem_value_set_device = _snd_ctl_elem_value_set_device_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_device>();\n\n  void snd_ctl_elem_value_set_subdevice(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_subdevice(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_subdevice>>(\n          'snd_ctl_elem_value_set_subdevice');\n  late final _dart_snd_ctl_elem_value_set_subdevice\n      _snd_ctl_elem_value_set_subdevice = _snd_ctl_elem_value_set_subdevice_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_subdevice>();\n\n  void snd_ctl_elem_value_set_name(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<ffi.Int8> val,\n  ) {\n    return _snd_ctl_elem_value_set_name(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_name>>(\n          'snd_ctl_elem_value_set_name');\n  late final _dart_snd_ctl_elem_value_set_name _snd_ctl_elem_value_set_name =\n      _snd_ctl_elem_value_set_name_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_name>();\n\n  void snd_ctl_elem_value_set_index(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_index(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_index>>(\n          'snd_ctl_elem_value_set_index');\n  late final _dart_snd_ctl_elem_value_set_index _snd_ctl_elem_value_set_index =\n      _snd_ctl_elem_value_set_index_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_index>();\n\n  int snd_ctl_elem_value_get_boolean(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_value_get_boolean(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_boolean_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_boolean>>(\n          'snd_ctl_elem_value_get_boolean');\n  late final _dart_snd_ctl_elem_value_get_boolean\n      _snd_ctl_elem_value_get_boolean = _snd_ctl_elem_value_get_boolean_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_boolean>();\n\n  int snd_ctl_elem_value_get_integer(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_value_get_integer(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_integer>>(\n          'snd_ctl_elem_value_get_integer');\n  late final _dart_snd_ctl_elem_value_get_integer\n      _snd_ctl_elem_value_get_integer = _snd_ctl_elem_value_get_integer_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_integer>();\n\n  int snd_ctl_elem_value_get_integer64(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_value_get_integer64(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_integer64>>(\n          'snd_ctl_elem_value_get_integer64');\n  late final _dart_snd_ctl_elem_value_get_integer64\n      _snd_ctl_elem_value_get_integer64 = _snd_ctl_elem_value_get_integer64_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_integer64>();\n\n  int snd_ctl_elem_value_get_enumerated(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_value_get_enumerated(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_enumerated_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_enumerated>>(\n          'snd_ctl_elem_value_get_enumerated');\n  late final _dart_snd_ctl_elem_value_get_enumerated\n      _snd_ctl_elem_value_get_enumerated =\n      _snd_ctl_elem_value_get_enumerated_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_enumerated>();\n\n  int snd_ctl_elem_value_get_byte(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n  ) {\n    return _snd_ctl_elem_value_get_byte(\n      obj,\n      idx,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_byte_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_byte>>(\n          'snd_ctl_elem_value_get_byte');\n  late final _dart_snd_ctl_elem_value_get_byte _snd_ctl_elem_value_get_byte =\n      _snd_ctl_elem_value_get_byte_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_byte>();\n\n  void snd_ctl_elem_value_set_boolean(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_boolean(\n      obj,\n      idx,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_boolean_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_boolean>>(\n          'snd_ctl_elem_value_set_boolean');\n  late final _dart_snd_ctl_elem_value_set_boolean\n      _snd_ctl_elem_value_set_boolean = _snd_ctl_elem_value_set_boolean_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_boolean>();\n\n  void snd_ctl_elem_value_set_integer(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_integer(\n      obj,\n      idx,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_integer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_integer>>(\n          'snd_ctl_elem_value_set_integer');\n  late final _dart_snd_ctl_elem_value_set_integer\n      _snd_ctl_elem_value_set_integer = _snd_ctl_elem_value_set_integer_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_integer>();\n\n  void snd_ctl_elem_value_set_integer64(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_integer64(\n      obj,\n      idx,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_integer64_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_integer64>>(\n          'snd_ctl_elem_value_set_integer64');\n  late final _dart_snd_ctl_elem_value_set_integer64\n      _snd_ctl_elem_value_set_integer64 = _snd_ctl_elem_value_set_integer64_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_integer64>();\n\n  void snd_ctl_elem_value_set_enumerated(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_enumerated(\n      obj,\n      idx,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_enumerated_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_enumerated>>(\n          'snd_ctl_elem_value_set_enumerated');\n  late final _dart_snd_ctl_elem_value_set_enumerated\n      _snd_ctl_elem_value_set_enumerated =\n      _snd_ctl_elem_value_set_enumerated_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_enumerated>();\n\n  void snd_ctl_elem_value_set_byte(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    int idx,\n    int val,\n  ) {\n    return _snd_ctl_elem_value_set_byte(\n      obj,\n      idx,\n      val,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_byte_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_byte>>(\n          'snd_ctl_elem_value_set_byte');\n  late final _dart_snd_ctl_elem_value_set_byte _snd_ctl_elem_value_set_byte =\n      _snd_ctl_elem_value_set_byte_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_byte>();\n\n  void snd_ctl_elem_set_bytes(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<ffi.Void> data,\n    int size,\n  ) {\n    return _snd_ctl_elem_set_bytes(\n      obj,\n      data,\n      size,\n    );\n  }\n\n  late final _snd_ctl_elem_set_bytes_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_set_bytes>>(\n          'snd_ctl_elem_set_bytes');\n  late final _dart_snd_ctl_elem_set_bytes _snd_ctl_elem_set_bytes =\n      _snd_ctl_elem_set_bytes_ptr.asFunction<_dart_snd_ctl_elem_set_bytes>();\n\n  ffi.Pointer<ffi.Void> snd_ctl_elem_value_get_bytes(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n  ) {\n    return _snd_ctl_elem_value_get_bytes(\n      obj,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_bytes_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_bytes>>(\n          'snd_ctl_elem_value_get_bytes');\n  late final _dart_snd_ctl_elem_value_get_bytes _snd_ctl_elem_value_get_bytes =\n      _snd_ctl_elem_value_get_bytes_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_bytes>();\n\n  void snd_ctl_elem_value_get_iec958(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<snd_aes_iec958_t> ptr,\n  ) {\n    return _snd_ctl_elem_value_get_iec958(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_value_get_iec958_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_get_iec958>>(\n          'snd_ctl_elem_value_get_iec958');\n  late final _dart_snd_ctl_elem_value_get_iec958\n      _snd_ctl_elem_value_get_iec958 = _snd_ctl_elem_value_get_iec958_ptr\n          .asFunction<_dart_snd_ctl_elem_value_get_iec958>();\n\n  void snd_ctl_elem_value_set_iec958(\n    ffi.Pointer<snd_ctl_elem_value_> obj,\n    ffi.Pointer<snd_aes_iec958_t> ptr,\n  ) {\n    return _snd_ctl_elem_value_set_iec958(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_ctl_elem_value_set_iec958_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_elem_value_set_iec958>>(\n          'snd_ctl_elem_value_set_iec958');\n  late final _dart_snd_ctl_elem_value_set_iec958\n      _snd_ctl_elem_value_set_iec958 = _snd_ctl_elem_value_set_iec958_ptr\n          .asFunction<_dart_snd_ctl_elem_value_set_iec958>();\n\n  int snd_tlv_parse_dB_info(\n    ffi.Pointer<ffi.Uint32> tlv,\n    int tlv_size,\n    ffi.Pointer<ffi.Pointer<ffi.Uint32>> db_tlvp,\n  ) {\n    return _snd_tlv_parse_dB_info(\n      tlv,\n      tlv_size,\n      db_tlvp,\n    );\n  }\n\n  late final _snd_tlv_parse_dB_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_tlv_parse_dB_info>>(\n          'snd_tlv_parse_dB_info');\n  late final _dart_snd_tlv_parse_dB_info _snd_tlv_parse_dB_info =\n      _snd_tlv_parse_dB_info_ptr.asFunction<_dart_snd_tlv_parse_dB_info>();\n\n  int snd_tlv_get_dB_range(\n    ffi.Pointer<ffi.Uint32> tlv,\n    int rangemin,\n    int rangemax,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_tlv_get_dB_range(\n      tlv,\n      rangemin,\n      rangemax,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_tlv_get_dB_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_tlv_get_dB_range>>(\n          'snd_tlv_get_dB_range');\n  late final _dart_snd_tlv_get_dB_range _snd_tlv_get_dB_range =\n      _snd_tlv_get_dB_range_ptr.asFunction<_dart_snd_tlv_get_dB_range>();\n\n  int snd_tlv_convert_to_dB(\n    ffi.Pointer<ffi.Uint32> tlv,\n    int rangemin,\n    int rangemax,\n    int volume,\n    ffi.Pointer<ffi.Int64> db_gain,\n  ) {\n    return _snd_tlv_convert_to_dB(\n      tlv,\n      rangemin,\n      rangemax,\n      volume,\n      db_gain,\n    );\n  }\n\n  late final _snd_tlv_convert_to_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_tlv_convert_to_dB>>(\n          'snd_tlv_convert_to_dB');\n  late final _dart_snd_tlv_convert_to_dB _snd_tlv_convert_to_dB =\n      _snd_tlv_convert_to_dB_ptr.asFunction<_dart_snd_tlv_convert_to_dB>();\n\n  int snd_tlv_convert_from_dB(\n    ffi.Pointer<ffi.Uint32> tlv,\n    int rangemin,\n    int rangemax,\n    int db_gain,\n    ffi.Pointer<ffi.Int64> value,\n    int xdir,\n  ) {\n    return _snd_tlv_convert_from_dB(\n      tlv,\n      rangemin,\n      rangemax,\n      db_gain,\n      value,\n      xdir,\n    );\n  }\n\n  late final _snd_tlv_convert_from_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_tlv_convert_from_dB>>(\n          'snd_tlv_convert_from_dB');\n  late final _dart_snd_tlv_convert_from_dB _snd_tlv_convert_from_dB =\n      _snd_tlv_convert_from_dB_ptr.asFunction<_dart_snd_tlv_convert_from_dB>();\n\n  int snd_ctl_get_dB_range(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_ctl_get_dB_range(\n      ctl,\n      id,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_ctl_get_dB_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_get_dB_range>>(\n          'snd_ctl_get_dB_range');\n  late final _dart_snd_ctl_get_dB_range _snd_ctl_get_dB_range =\n      _snd_ctl_get_dB_range_ptr.asFunction<_dart_snd_ctl_get_dB_range>();\n\n  int snd_ctl_convert_to_dB(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int volume,\n    ffi.Pointer<ffi.Int64> db_gain,\n  ) {\n    return _snd_ctl_convert_to_dB(\n      ctl,\n      id,\n      volume,\n      db_gain,\n    );\n  }\n\n  late final _snd_ctl_convert_to_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_convert_to_dB>>(\n          'snd_ctl_convert_to_dB');\n  late final _dart_snd_ctl_convert_to_dB _snd_ctl_convert_to_dB =\n      _snd_ctl_convert_to_dB_ptr.asFunction<_dart_snd_ctl_convert_to_dB>();\n\n  int snd_ctl_convert_from_dB(\n    ffi.Pointer<snd_ctl_> ctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n    int db_gain,\n    ffi.Pointer<ffi.Int64> value,\n    int xdir,\n  ) {\n    return _snd_ctl_convert_from_dB(\n      ctl,\n      id,\n      db_gain,\n      value,\n      xdir,\n    );\n  }\n\n  late final _snd_ctl_convert_from_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_ctl_convert_from_dB>>(\n          'snd_ctl_convert_from_dB');\n  late final _dart_snd_ctl_convert_from_dB _snd_ctl_convert_from_dB =\n      _snd_ctl_convert_from_dB_ptr.asFunction<_dart_snd_ctl_convert_from_dB>();\n\n  int snd_hctl_compare_fast(\n    ffi.Pointer<snd_hctl_elem_> c1,\n    ffi.Pointer<snd_hctl_elem_> c2,\n  ) {\n    return _snd_hctl_compare_fast(\n      c1,\n      c2,\n    );\n  }\n\n  late final _snd_hctl_compare_fast_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_compare_fast>>(\n          'snd_hctl_compare_fast');\n  late final _dart_snd_hctl_compare_fast _snd_hctl_compare_fast =\n      _snd_hctl_compare_fast_ptr.asFunction<_dart_snd_hctl_compare_fast>();\n\n  int snd_hctl_open(\n    ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n    ffi.Pointer<ffi.Int8> name,\n    int mode,\n  ) {\n    return _snd_hctl_open(\n      hctl,\n      name,\n      mode,\n    );\n  }\n\n  late final _snd_hctl_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_open>>('snd_hctl_open');\n  late final _dart_snd_hctl_open _snd_hctl_open =\n      _snd_hctl_open_ptr.asFunction<_dart_snd_hctl_open>();\n\n  int snd_hctl_open_ctl(\n    ffi.Pointer<ffi.Pointer<snd_hctl_>> hctlp,\n    ffi.Pointer<snd_ctl_> ctl,\n  ) {\n    return _snd_hctl_open_ctl(\n      hctlp,\n      ctl,\n    );\n  }\n\n  late final _snd_hctl_open_ctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_open_ctl>>('snd_hctl_open_ctl');\n  late final _dart_snd_hctl_open_ctl _snd_hctl_open_ctl =\n      _snd_hctl_open_ctl_ptr.asFunction<_dart_snd_hctl_open_ctl>();\n\n  int snd_hctl_close(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_close(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_close>>('snd_hctl_close');\n  late final _dart_snd_hctl_close _snd_hctl_close =\n      _snd_hctl_close_ptr.asFunction<_dart_snd_hctl_close>();\n\n  int snd_hctl_nonblock(\n    ffi.Pointer<snd_hctl_> hctl,\n    int nonblock,\n  ) {\n    return _snd_hctl_nonblock(\n      hctl,\n      nonblock,\n    );\n  }\n\n  late final _snd_hctl_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_nonblock>>('snd_hctl_nonblock');\n  late final _dart_snd_hctl_nonblock _snd_hctl_nonblock =\n      _snd_hctl_nonblock_ptr.asFunction<_dart_snd_hctl_nonblock>();\n\n  int snd_hctl_poll_descriptors_count(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_poll_descriptors_count(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_poll_descriptors_count>>(\n          'snd_hctl_poll_descriptors_count');\n  late final _dart_snd_hctl_poll_descriptors_count\n      _snd_hctl_poll_descriptors_count = _snd_hctl_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_hctl_poll_descriptors_count>();\n\n  int snd_hctl_poll_descriptors(\n    ffi.Pointer<snd_hctl_> hctl,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_hctl_poll_descriptors(\n      hctl,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_hctl_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_poll_descriptors>>(\n          'snd_hctl_poll_descriptors');\n  late final _dart_snd_hctl_poll_descriptors _snd_hctl_poll_descriptors =\n      _snd_hctl_poll_descriptors_ptr\n          .asFunction<_dart_snd_hctl_poll_descriptors>();\n\n  int snd_hctl_poll_descriptors_revents(\n    ffi.Pointer<snd_hctl_> ctl,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_hctl_poll_descriptors_revents(\n      ctl,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_hctl_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_poll_descriptors_revents>>(\n          'snd_hctl_poll_descriptors_revents');\n  late final _dart_snd_hctl_poll_descriptors_revents\n      _snd_hctl_poll_descriptors_revents =\n      _snd_hctl_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_hctl_poll_descriptors_revents>();\n\n  int snd_hctl_get_count(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_get_count(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_get_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_get_count>>('snd_hctl_get_count');\n  late final _dart_snd_hctl_get_count _snd_hctl_get_count =\n      _snd_hctl_get_count_ptr.asFunction<_dart_snd_hctl_get_count>();\n\n  int snd_hctl_set_compare(\n    ffi.Pointer<snd_hctl_> hctl,\n    ffi.Pointer<ffi.NativeFunction<snd_hctl_compare_t>> hsort,\n  ) {\n    return _snd_hctl_set_compare(\n      hctl,\n      hsort,\n    );\n  }\n\n  late final _snd_hctl_set_compare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_set_compare>>(\n          'snd_hctl_set_compare');\n  late final _dart_snd_hctl_set_compare _snd_hctl_set_compare =\n      _snd_hctl_set_compare_ptr.asFunction<_dart_snd_hctl_set_compare>();\n\n  ffi.Pointer<snd_hctl_elem_> snd_hctl_first_elem(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_first_elem(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_first_elem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_first_elem>>(\n          'snd_hctl_first_elem');\n  late final _dart_snd_hctl_first_elem _snd_hctl_first_elem =\n      _snd_hctl_first_elem_ptr.asFunction<_dart_snd_hctl_first_elem>();\n\n  ffi.Pointer<snd_hctl_elem_> snd_hctl_last_elem(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_last_elem(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_last_elem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_last_elem>>('snd_hctl_last_elem');\n  late final _dart_snd_hctl_last_elem _snd_hctl_last_elem =\n      _snd_hctl_last_elem_ptr.asFunction<_dart_snd_hctl_last_elem>();\n\n  ffi.Pointer<snd_hctl_elem_> snd_hctl_find_elem(\n    ffi.Pointer<snd_hctl_> hctl,\n    ffi.Pointer<snd_ctl_elem_id_> id,\n  ) {\n    return _snd_hctl_find_elem(\n      hctl,\n      id,\n    );\n  }\n\n  late final _snd_hctl_find_elem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_find_elem>>('snd_hctl_find_elem');\n  late final _dart_snd_hctl_find_elem _snd_hctl_find_elem =\n      _snd_hctl_find_elem_ptr.asFunction<_dart_snd_hctl_find_elem>();\n\n  void snd_hctl_set_callback(\n    ffi.Pointer<snd_hctl_> hctl,\n    ffi.Pointer<ffi.NativeFunction<snd_hctl_callback_t>> callback,\n  ) {\n    return _snd_hctl_set_callback(\n      hctl,\n      callback,\n    );\n  }\n\n  late final _snd_hctl_set_callback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_set_callback>>(\n          'snd_hctl_set_callback');\n  late final _dart_snd_hctl_set_callback _snd_hctl_set_callback =\n      _snd_hctl_set_callback_ptr.asFunction<_dart_snd_hctl_set_callback>();\n\n  void snd_hctl_set_callback_private(\n    ffi.Pointer<snd_hctl_> hctl,\n    ffi.Pointer<ffi.Void> data,\n  ) {\n    return _snd_hctl_set_callback_private(\n      hctl,\n      data,\n    );\n  }\n\n  late final _snd_hctl_set_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_set_callback_private>>(\n          'snd_hctl_set_callback_private');\n  late final _dart_snd_hctl_set_callback_private\n      _snd_hctl_set_callback_private = _snd_hctl_set_callback_private_ptr\n          .asFunction<_dart_snd_hctl_set_callback_private>();\n\n  ffi.Pointer<ffi.Void> snd_hctl_get_callback_private(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_get_callback_private(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_get_callback_private>>(\n          'snd_hctl_get_callback_private');\n  late final _dart_snd_hctl_get_callback_private\n      _snd_hctl_get_callback_private = _snd_hctl_get_callback_private_ptr\n          .asFunction<_dart_snd_hctl_get_callback_private>();\n\n  int snd_hctl_load(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_load(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_load_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_load>>('snd_hctl_load');\n  late final _dart_snd_hctl_load _snd_hctl_load =\n      _snd_hctl_load_ptr.asFunction<_dart_snd_hctl_load>();\n\n  int snd_hctl_free(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_free(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_free>>('snd_hctl_free');\n  late final _dart_snd_hctl_free _snd_hctl_free =\n      _snd_hctl_free_ptr.asFunction<_dart_snd_hctl_free>();\n\n  int snd_hctl_handle_events(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_handle_events(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_handle_events_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_handle_events>>(\n          'snd_hctl_handle_events');\n  late final _dart_snd_hctl_handle_events _snd_hctl_handle_events =\n      _snd_hctl_handle_events_ptr.asFunction<_dart_snd_hctl_handle_events>();\n\n  ffi.Pointer<ffi.Int8> snd_hctl_name(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_name(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_name>>('snd_hctl_name');\n  late final _dart_snd_hctl_name _snd_hctl_name =\n      _snd_hctl_name_ptr.asFunction<_dart_snd_hctl_name>();\n\n  int snd_hctl_wait(\n    ffi.Pointer<snd_hctl_> hctl,\n    int timeout,\n  ) {\n    return _snd_hctl_wait(\n      hctl,\n      timeout,\n    );\n  }\n\n  late final _snd_hctl_wait_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_wait>>('snd_hctl_wait');\n  late final _dart_snd_hctl_wait _snd_hctl_wait =\n      _snd_hctl_wait_ptr.asFunction<_dart_snd_hctl_wait>();\n\n  ffi.Pointer<snd_ctl_> snd_hctl_ctl(\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_hctl_ctl(\n      hctl,\n    );\n  }\n\n  late final _snd_hctl_ctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_ctl>>('snd_hctl_ctl');\n  late final _dart_snd_hctl_ctl _snd_hctl_ctl =\n      _snd_hctl_ctl_ptr.asFunction<_dart_snd_hctl_ctl>();\n\n  ffi.Pointer<snd_hctl_elem_> snd_hctl_elem_next(\n    ffi.Pointer<snd_hctl_elem_> elem,\n  ) {\n    return _snd_hctl_elem_next(\n      elem,\n    );\n  }\n\n  late final _snd_hctl_elem_next_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_next>>('snd_hctl_elem_next');\n  late final _dart_snd_hctl_elem_next _snd_hctl_elem_next =\n      _snd_hctl_elem_next_ptr.asFunction<_dart_snd_hctl_elem_next>();\n\n  ffi.Pointer<snd_hctl_elem_> snd_hctl_elem_prev(\n    ffi.Pointer<snd_hctl_elem_> elem,\n  ) {\n    return _snd_hctl_elem_prev(\n      elem,\n    );\n  }\n\n  late final _snd_hctl_elem_prev_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_prev>>('snd_hctl_elem_prev');\n  late final _dart_snd_hctl_elem_prev _snd_hctl_elem_prev =\n      _snd_hctl_elem_prev_ptr.asFunction<_dart_snd_hctl_elem_prev>();\n\n  int snd_hctl_elem_info(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<snd_ctl_elem_info_> info,\n  ) {\n    return _snd_hctl_elem_info(\n      elem,\n      info,\n    );\n  }\n\n  late final _snd_hctl_elem_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_info>>('snd_hctl_elem_info');\n  late final _dart_snd_hctl_elem_info _snd_hctl_elem_info =\n      _snd_hctl_elem_info_ptr.asFunction<_dart_snd_hctl_elem_info>();\n\n  int snd_hctl_elem_read(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<snd_ctl_elem_value_> value,\n  ) {\n    return _snd_hctl_elem_read(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_hctl_elem_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_read>>('snd_hctl_elem_read');\n  late final _dart_snd_hctl_elem_read _snd_hctl_elem_read =\n      _snd_hctl_elem_read_ptr.asFunction<_dart_snd_hctl_elem_read>();\n\n  int snd_hctl_elem_write(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<snd_ctl_elem_value_> value,\n  ) {\n    return _snd_hctl_elem_write(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_hctl_elem_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_write>>(\n          'snd_hctl_elem_write');\n  late final _dart_snd_hctl_elem_write _snd_hctl_elem_write =\n      _snd_hctl_elem_write_ptr.asFunction<_dart_snd_hctl_elem_write>();\n\n  int snd_hctl_elem_tlv_read(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<ffi.Uint32> tlv,\n    int tlv_size,\n  ) {\n    return _snd_hctl_elem_tlv_read(\n      elem,\n      tlv,\n      tlv_size,\n    );\n  }\n\n  late final _snd_hctl_elem_tlv_read_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_tlv_read>>(\n          'snd_hctl_elem_tlv_read');\n  late final _dart_snd_hctl_elem_tlv_read _snd_hctl_elem_tlv_read =\n      _snd_hctl_elem_tlv_read_ptr.asFunction<_dart_snd_hctl_elem_tlv_read>();\n\n  int snd_hctl_elem_tlv_write(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<ffi.Uint32> tlv,\n  ) {\n    return _snd_hctl_elem_tlv_write(\n      elem,\n      tlv,\n    );\n  }\n\n  late final _snd_hctl_elem_tlv_write_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_tlv_write>>(\n          'snd_hctl_elem_tlv_write');\n  late final _dart_snd_hctl_elem_tlv_write _snd_hctl_elem_tlv_write =\n      _snd_hctl_elem_tlv_write_ptr.asFunction<_dart_snd_hctl_elem_tlv_write>();\n\n  int snd_hctl_elem_tlv_command(\n    ffi.Pointer<snd_hctl_elem_> elem,\n    ffi.Pointer<ffi.Uint32> tlv,\n  ) {\n    return _snd_hctl_elem_tlv_command(\n      elem,\n      tlv,\n    );\n  }\n\n  late final _snd_hctl_elem_tlv_command_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_tlv_command>>(\n          'snd_hctl_elem_tlv_command');\n  late final _dart_snd_hctl_elem_tlv_command _snd_hctl_elem_tlv_command =\n      _snd_hctl_elem_tlv_command_ptr\n          .asFunction<_dart_snd_hctl_elem_tlv_command>();\n\n  ffi.Pointer<snd_hctl_> snd_hctl_elem_get_hctl(\n    ffi.Pointer<snd_hctl_elem_> elem,\n  ) {\n    return _snd_hctl_elem_get_hctl(\n      elem,\n    );\n  }\n\n  late final _snd_hctl_elem_get_hctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_hctl>>(\n          'snd_hctl_elem_get_hctl');\n  late final _dart_snd_hctl_elem_get_hctl _snd_hctl_elem_get_hctl =\n      _snd_hctl_elem_get_hctl_ptr.asFunction<_dart_snd_hctl_elem_get_hctl>();\n\n  void snd_hctl_elem_get_id(\n    ffi.Pointer<snd_hctl_elem_> obj,\n    ffi.Pointer<snd_ctl_elem_id_> ptr,\n  ) {\n    return _snd_hctl_elem_get_id(\n      obj,\n      ptr,\n    );\n  }\n\n  late final _snd_hctl_elem_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_id>>(\n          'snd_hctl_elem_get_id');\n  late final _dart_snd_hctl_elem_get_id _snd_hctl_elem_get_id =\n      _snd_hctl_elem_get_id_ptr.asFunction<_dart_snd_hctl_elem_get_id>();\n\n  int snd_hctl_elem_get_numid(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_numid(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_numid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_numid>>(\n          'snd_hctl_elem_get_numid');\n  late final _dart_snd_hctl_elem_get_numid _snd_hctl_elem_get_numid =\n      _snd_hctl_elem_get_numid_ptr.asFunction<_dart_snd_hctl_elem_get_numid>();\n\n  int snd_hctl_elem_get_interface(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_interface(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_interface_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_interface>>(\n          'snd_hctl_elem_get_interface');\n  late final _dart_snd_hctl_elem_get_interface _snd_hctl_elem_get_interface =\n      _snd_hctl_elem_get_interface_ptr\n          .asFunction<_dart_snd_hctl_elem_get_interface>();\n\n  int snd_hctl_elem_get_device(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_device(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_device_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_device>>(\n          'snd_hctl_elem_get_device');\n  late final _dart_snd_hctl_elem_get_device _snd_hctl_elem_get_device =\n      _snd_hctl_elem_get_device_ptr\n          .asFunction<_dart_snd_hctl_elem_get_device>();\n\n  int snd_hctl_elem_get_subdevice(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_subdevice(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_subdevice_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_subdevice>>(\n          'snd_hctl_elem_get_subdevice');\n  late final _dart_snd_hctl_elem_get_subdevice _snd_hctl_elem_get_subdevice =\n      _snd_hctl_elem_get_subdevice_ptr\n          .asFunction<_dart_snd_hctl_elem_get_subdevice>();\n\n  ffi.Pointer<ffi.Int8> snd_hctl_elem_get_name(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_name>>(\n          'snd_hctl_elem_get_name');\n  late final _dart_snd_hctl_elem_get_name _snd_hctl_elem_get_name =\n      _snd_hctl_elem_get_name_ptr.asFunction<_dart_snd_hctl_elem_get_name>();\n\n  int snd_hctl_elem_get_index(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_index>>(\n          'snd_hctl_elem_get_index');\n  late final _dart_snd_hctl_elem_get_index _snd_hctl_elem_get_index =\n      _snd_hctl_elem_get_index_ptr.asFunction<_dart_snd_hctl_elem_get_index>();\n\n  void snd_hctl_elem_set_callback(\n    ffi.Pointer<snd_hctl_elem_> obj,\n    ffi.Pointer<ffi.NativeFunction<snd_hctl_elem_callback_t>> val,\n  ) {\n    return _snd_hctl_elem_set_callback(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_hctl_elem_set_callback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_set_callback>>(\n          'snd_hctl_elem_set_callback');\n  late final _dart_snd_hctl_elem_set_callback _snd_hctl_elem_set_callback =\n      _snd_hctl_elem_set_callback_ptr\n          .asFunction<_dart_snd_hctl_elem_set_callback>();\n\n  ffi.Pointer<ffi.Void> snd_hctl_elem_get_callback_private(\n    ffi.Pointer<snd_hctl_elem_> obj,\n  ) {\n    return _snd_hctl_elem_get_callback_private(\n      obj,\n    );\n  }\n\n  late final _snd_hctl_elem_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_get_callback_private>>(\n          'snd_hctl_elem_get_callback_private');\n  late final _dart_snd_hctl_elem_get_callback_private\n      _snd_hctl_elem_get_callback_private =\n      _snd_hctl_elem_get_callback_private_ptr\n          .asFunction<_dart_snd_hctl_elem_get_callback_private>();\n\n  void snd_hctl_elem_set_callback_private(\n    ffi.Pointer<snd_hctl_elem_> obj,\n    ffi.Pointer<ffi.Void> val,\n  ) {\n    return _snd_hctl_elem_set_callback_private(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_hctl_elem_set_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_hctl_elem_set_callback_private>>(\n          'snd_hctl_elem_set_callback_private');\n  late final _dart_snd_hctl_elem_set_callback_private\n      _snd_hctl_elem_set_callback_private =\n      _snd_hctl_elem_set_callback_private_ptr\n          .asFunction<_dart_snd_hctl_elem_set_callback_private>();\n\n  int snd_sctl_build(\n    ffi.Pointer<ffi.Pointer<snd_sctl_>> ctl,\n    ffi.Pointer<snd_ctl_> handle,\n    ffi.Pointer<snd_config_> config,\n    ffi.Pointer<snd_config_> private_data,\n    int mode,\n  ) {\n    return _snd_sctl_build(\n      ctl,\n      handle,\n      config,\n      private_data,\n      mode,\n    );\n  }\n\n  late final _snd_sctl_build_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_sctl_build>>('snd_sctl_build');\n  late final _dart_snd_sctl_build _snd_sctl_build =\n      _snd_sctl_build_ptr.asFunction<_dart_snd_sctl_build>();\n\n  int snd_sctl_free(\n    ffi.Pointer<snd_sctl_> handle,\n  ) {\n    return _snd_sctl_free(\n      handle,\n    );\n  }\n\n  late final _snd_sctl_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_sctl_free>>('snd_sctl_free');\n  late final _dart_snd_sctl_free _snd_sctl_free =\n      _snd_sctl_free_ptr.asFunction<_dart_snd_sctl_free>();\n\n  int snd_sctl_install(\n    ffi.Pointer<snd_sctl_> handle,\n  ) {\n    return _snd_sctl_install(\n      handle,\n    );\n  }\n\n  late final _snd_sctl_install_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_sctl_install>>('snd_sctl_install');\n  late final _dart_snd_sctl_install _snd_sctl_install =\n      _snd_sctl_install_ptr.asFunction<_dart_snd_sctl_install>();\n\n  int snd_sctl_remove(\n    ffi.Pointer<snd_sctl_> handle,\n  ) {\n    return _snd_sctl_remove(\n      handle,\n    );\n  }\n\n  late final _snd_sctl_remove_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_sctl_remove>>('snd_sctl_remove');\n  late final _dart_snd_sctl_remove _snd_sctl_remove =\n      _snd_sctl_remove_ptr.asFunction<_dart_snd_sctl_remove>();\n\n  int snd_mixer_open(\n    ffi.Pointer<ffi.Pointer<snd_mixer_>> mixer,\n    int mode,\n  ) {\n    return _snd_mixer_open(\n      mixer,\n      mode,\n    );\n  }\n\n  late final _snd_mixer_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_open>>('snd_mixer_open');\n  late final _dart_snd_mixer_open _snd_mixer_open =\n      _snd_mixer_open_ptr.asFunction<_dart_snd_mixer_open>();\n\n  int snd_mixer_close(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_close(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_close>>('snd_mixer_close');\n  late final _dart_snd_mixer_close _snd_mixer_close =\n      _snd_mixer_close_ptr.asFunction<_dart_snd_mixer_close>();\n\n  ffi.Pointer<snd_mixer_elem_> snd_mixer_first_elem(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_first_elem(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_first_elem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_first_elem>>(\n          'snd_mixer_first_elem');\n  late final _dart_snd_mixer_first_elem _snd_mixer_first_elem =\n      _snd_mixer_first_elem_ptr.asFunction<_dart_snd_mixer_first_elem>();\n\n  ffi.Pointer<snd_mixer_elem_> snd_mixer_last_elem(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_last_elem(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_last_elem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_last_elem>>(\n          'snd_mixer_last_elem');\n  late final _dart_snd_mixer_last_elem _snd_mixer_last_elem =\n      _snd_mixer_last_elem_ptr.asFunction<_dart_snd_mixer_last_elem>();\n\n  int snd_mixer_handle_events(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_handle_events(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_handle_events_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_handle_events>>(\n          'snd_mixer_handle_events');\n  late final _dart_snd_mixer_handle_events _snd_mixer_handle_events =\n      _snd_mixer_handle_events_ptr.asFunction<_dart_snd_mixer_handle_events>();\n\n  int snd_mixer_attach(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_mixer_attach(\n      mixer,\n      name,\n    );\n  }\n\n  late final _snd_mixer_attach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_attach>>('snd_mixer_attach');\n  late final _dart_snd_mixer_attach _snd_mixer_attach =\n      _snd_mixer_attach_ptr.asFunction<_dart_snd_mixer_attach>();\n\n  int snd_mixer_attach_hctl(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_mixer_attach_hctl(\n      mixer,\n      hctl,\n    );\n  }\n\n  late final _snd_mixer_attach_hctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_attach_hctl>>(\n          'snd_mixer_attach_hctl');\n  late final _dart_snd_mixer_attach_hctl _snd_mixer_attach_hctl =\n      _snd_mixer_attach_hctl_ptr.asFunction<_dart_snd_mixer_attach_hctl>();\n\n  int snd_mixer_detach(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_mixer_detach(\n      mixer,\n      name,\n    );\n  }\n\n  late final _snd_mixer_detach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_detach>>('snd_mixer_detach');\n  late final _dart_snd_mixer_detach _snd_mixer_detach =\n      _snd_mixer_detach_ptr.asFunction<_dart_snd_mixer_detach>();\n\n  int snd_mixer_detach_hctl(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<snd_hctl_> hctl,\n  ) {\n    return _snd_mixer_detach_hctl(\n      mixer,\n      hctl,\n    );\n  }\n\n  late final _snd_mixer_detach_hctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_detach_hctl>>(\n          'snd_mixer_detach_hctl');\n  late final _dart_snd_mixer_detach_hctl _snd_mixer_detach_hctl =\n      _snd_mixer_detach_hctl_ptr.asFunction<_dart_snd_mixer_detach_hctl>();\n\n  int snd_mixer_get_hctl(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<ffi.Int8> name,\n    ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n  ) {\n    return _snd_mixer_get_hctl(\n      mixer,\n      name,\n      hctl,\n    );\n  }\n\n  late final _snd_mixer_get_hctl_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_get_hctl>>('snd_mixer_get_hctl');\n  late final _dart_snd_mixer_get_hctl _snd_mixer_get_hctl =\n      _snd_mixer_get_hctl_ptr.asFunction<_dart_snd_mixer_get_hctl>();\n\n  int snd_mixer_poll_descriptors_count(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_poll_descriptors_count(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_poll_descriptors_count>>(\n          'snd_mixer_poll_descriptors_count');\n  late final _dart_snd_mixer_poll_descriptors_count\n      _snd_mixer_poll_descriptors_count = _snd_mixer_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_mixer_poll_descriptors_count>();\n\n  int snd_mixer_poll_descriptors(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n  ) {\n    return _snd_mixer_poll_descriptors(\n      mixer,\n      pfds,\n      space,\n    );\n  }\n\n  late final _snd_mixer_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_poll_descriptors>>(\n          'snd_mixer_poll_descriptors');\n  late final _dart_snd_mixer_poll_descriptors _snd_mixer_poll_descriptors =\n      _snd_mixer_poll_descriptors_ptr\n          .asFunction<_dart_snd_mixer_poll_descriptors>();\n\n  int snd_mixer_poll_descriptors_revents(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_mixer_poll_descriptors_revents(\n      mixer,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_mixer_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_poll_descriptors_revents>>(\n          'snd_mixer_poll_descriptors_revents');\n  late final _dart_snd_mixer_poll_descriptors_revents\n      _snd_mixer_poll_descriptors_revents =\n      _snd_mixer_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_mixer_poll_descriptors_revents>();\n\n  int snd_mixer_load(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_load(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_load_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_load>>('snd_mixer_load');\n  late final _dart_snd_mixer_load _snd_mixer_load =\n      _snd_mixer_load_ptr.asFunction<_dart_snd_mixer_load>();\n\n  void snd_mixer_free(\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_free(\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_free>>('snd_mixer_free');\n  late final _dart_snd_mixer_free _snd_mixer_free =\n      _snd_mixer_free_ptr.asFunction<_dart_snd_mixer_free>();\n\n  int snd_mixer_wait(\n    ffi.Pointer<snd_mixer_> mixer,\n    int timeout,\n  ) {\n    return _snd_mixer_wait(\n      mixer,\n      timeout,\n    );\n  }\n\n  late final _snd_mixer_wait_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_wait>>('snd_mixer_wait');\n  late final _dart_snd_mixer_wait _snd_mixer_wait =\n      _snd_mixer_wait_ptr.asFunction<_dart_snd_mixer_wait>();\n\n  int snd_mixer_set_compare(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> msort,\n  ) {\n    return _snd_mixer_set_compare(\n      mixer,\n      msort,\n    );\n  }\n\n  late final _snd_mixer_set_compare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_set_compare>>(\n          'snd_mixer_set_compare');\n  late final _dart_snd_mixer_set_compare _snd_mixer_set_compare =\n      _snd_mixer_set_compare_ptr.asFunction<_dart_snd_mixer_set_compare>();\n\n  void snd_mixer_set_callback(\n    ffi.Pointer<snd_mixer_> obj,\n    ffi.Pointer<ffi.NativeFunction<snd_mixer_callback_t>> val,\n  ) {\n    return _snd_mixer_set_callback(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_set_callback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_set_callback>>(\n          'snd_mixer_set_callback');\n  late final _dart_snd_mixer_set_callback _snd_mixer_set_callback =\n      _snd_mixer_set_callback_ptr.asFunction<_dart_snd_mixer_set_callback>();\n\n  ffi.Pointer<ffi.Void> snd_mixer_get_callback_private(\n    ffi.Pointer<snd_mixer_> obj,\n  ) {\n    return _snd_mixer_get_callback_private(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_get_callback_private>>(\n          'snd_mixer_get_callback_private');\n  late final _dart_snd_mixer_get_callback_private\n      _snd_mixer_get_callback_private = _snd_mixer_get_callback_private_ptr\n          .asFunction<_dart_snd_mixer_get_callback_private>();\n\n  void snd_mixer_set_callback_private(\n    ffi.Pointer<snd_mixer_> obj,\n    ffi.Pointer<ffi.Void> val,\n  ) {\n    return _snd_mixer_set_callback_private(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_set_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_set_callback_private>>(\n          'snd_mixer_set_callback_private');\n  late final _dart_snd_mixer_set_callback_private\n      _snd_mixer_set_callback_private = _snd_mixer_set_callback_private_ptr\n          .asFunction<_dart_snd_mixer_set_callback_private>();\n\n  int snd_mixer_get_count(\n    ffi.Pointer<snd_mixer_> obj,\n  ) {\n    return _snd_mixer_get_count(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_get_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_get_count>>(\n          'snd_mixer_get_count');\n  late final _dart_snd_mixer_get_count _snd_mixer_get_count =\n      _snd_mixer_get_count_ptr.asFunction<_dart_snd_mixer_get_count>();\n\n  int snd_mixer_class_unregister(\n    ffi.Pointer<snd_mixer_class_> clss,\n  ) {\n    return _snd_mixer_class_unregister(\n      clss,\n    );\n  }\n\n  late final _snd_mixer_class_unregister_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_unregister>>(\n          'snd_mixer_class_unregister');\n  late final _dart_snd_mixer_class_unregister _snd_mixer_class_unregister =\n      _snd_mixer_class_unregister_ptr\n          .asFunction<_dart_snd_mixer_class_unregister>();\n\n  ffi.Pointer<snd_mixer_elem_> snd_mixer_elem_next(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_next(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_next_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_next>>(\n          'snd_mixer_elem_next');\n  late final _dart_snd_mixer_elem_next _snd_mixer_elem_next =\n      _snd_mixer_elem_next_ptr.asFunction<_dart_snd_mixer_elem_next>();\n\n  ffi.Pointer<snd_mixer_elem_> snd_mixer_elem_prev(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_prev(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_prev_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_prev>>(\n          'snd_mixer_elem_prev');\n  late final _dart_snd_mixer_elem_prev _snd_mixer_elem_prev =\n      _snd_mixer_elem_prev_ptr.asFunction<_dart_snd_mixer_elem_prev>();\n\n  void snd_mixer_elem_set_callback(\n    ffi.Pointer<snd_mixer_elem_> obj,\n    ffi.Pointer<ffi.NativeFunction<snd_mixer_elem_callback_t>> val,\n  ) {\n    return _snd_mixer_elem_set_callback(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_elem_set_callback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_set_callback>>(\n          'snd_mixer_elem_set_callback');\n  late final _dart_snd_mixer_elem_set_callback _snd_mixer_elem_set_callback =\n      _snd_mixer_elem_set_callback_ptr\n          .asFunction<_dart_snd_mixer_elem_set_callback>();\n\n  ffi.Pointer<ffi.Void> snd_mixer_elem_get_callback_private(\n    ffi.Pointer<snd_mixer_elem_> obj,\n  ) {\n    return _snd_mixer_elem_get_callback_private(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_elem_get_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_get_callback_private>>(\n          'snd_mixer_elem_get_callback_private');\n  late final _dart_snd_mixer_elem_get_callback_private\n      _snd_mixer_elem_get_callback_private =\n      _snd_mixer_elem_get_callback_private_ptr\n          .asFunction<_dart_snd_mixer_elem_get_callback_private>();\n\n  void snd_mixer_elem_set_callback_private(\n    ffi.Pointer<snd_mixer_elem_> obj,\n    ffi.Pointer<ffi.Void> val,\n  ) {\n    return _snd_mixer_elem_set_callback_private(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_elem_set_callback_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_set_callback_private>>(\n          'snd_mixer_elem_set_callback_private');\n  late final _dart_snd_mixer_elem_set_callback_private\n      _snd_mixer_elem_set_callback_private =\n      _snd_mixer_elem_set_callback_private_ptr\n          .asFunction<_dart_snd_mixer_elem_set_callback_private>();\n\n  int snd_mixer_elem_get_type(\n    ffi.Pointer<snd_mixer_elem_> obj,\n  ) {\n    return _snd_mixer_elem_get_type(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_elem_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_get_type>>(\n          'snd_mixer_elem_get_type');\n  late final _dart_snd_mixer_elem_get_type _snd_mixer_elem_get_type =\n      _snd_mixer_elem_get_type_ptr.asFunction<_dart_snd_mixer_elem_get_type>();\n\n  int snd_mixer_class_register(\n    ffi.Pointer<snd_mixer_class_> class_,\n    ffi.Pointer<snd_mixer_> mixer,\n  ) {\n    return _snd_mixer_class_register(\n      class_,\n      mixer,\n    );\n  }\n\n  late final _snd_mixer_class_register_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_register>>(\n          'snd_mixer_class_register');\n  late final _dart_snd_mixer_class_register _snd_mixer_class_register =\n      _snd_mixer_class_register_ptr\n          .asFunction<_dart_snd_mixer_class_register>();\n\n  int snd_mixer_elem_new(\n    ffi.Pointer<ffi.Pointer<snd_mixer_elem_>> elem,\n    int type,\n    int compare_weight,\n    ffi.Pointer<ffi.Void> private_data,\n    ffi.Pointer<ffi.NativeFunction<_typedefC_11>> private_free,\n  ) {\n    return _snd_mixer_elem_new(\n      elem,\n      type,\n      compare_weight,\n      private_data,\n      private_free,\n    );\n  }\n\n  late final _snd_mixer_elem_new_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_new>>('snd_mixer_elem_new');\n  late final _dart_snd_mixer_elem_new _snd_mixer_elem_new =\n      _snd_mixer_elem_new_ptr.asFunction<_dart_snd_mixer_elem_new>();\n\n  int snd_mixer_elem_add(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    ffi.Pointer<snd_mixer_class_> class_,\n  ) {\n    return _snd_mixer_elem_add(\n      elem,\n      class_,\n    );\n  }\n\n  late final _snd_mixer_elem_add_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_add>>('snd_mixer_elem_add');\n  late final _dart_snd_mixer_elem_add _snd_mixer_elem_add =\n      _snd_mixer_elem_add_ptr.asFunction<_dart_snd_mixer_elem_add>();\n\n  int snd_mixer_elem_remove(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_remove(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_remove_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_remove>>(\n          'snd_mixer_elem_remove');\n  late final _dart_snd_mixer_elem_remove _snd_mixer_elem_remove =\n      _snd_mixer_elem_remove_ptr.asFunction<_dart_snd_mixer_elem_remove>();\n\n  void snd_mixer_elem_free(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_free(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_free>>(\n          'snd_mixer_elem_free');\n  late final _dart_snd_mixer_elem_free _snd_mixer_elem_free =\n      _snd_mixer_elem_free_ptr.asFunction<_dart_snd_mixer_elem_free>();\n\n  int snd_mixer_elem_info(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_info(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_info>>(\n          'snd_mixer_elem_info');\n  late final _dart_snd_mixer_elem_info _snd_mixer_elem_info =\n      _snd_mixer_elem_info_ptr.asFunction<_dart_snd_mixer_elem_info>();\n\n  int snd_mixer_elem_value(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_elem_value(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_elem_value_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_value>>(\n          'snd_mixer_elem_value');\n  late final _dart_snd_mixer_elem_value _snd_mixer_elem_value =\n      _snd_mixer_elem_value_ptr.asFunction<_dart_snd_mixer_elem_value>();\n\n  int snd_mixer_elem_attach(\n    ffi.Pointer<snd_mixer_elem_> melem,\n    ffi.Pointer<snd_hctl_elem_> helem,\n  ) {\n    return _snd_mixer_elem_attach(\n      melem,\n      helem,\n    );\n  }\n\n  late final _snd_mixer_elem_attach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_attach>>(\n          'snd_mixer_elem_attach');\n  late final _dart_snd_mixer_elem_attach _snd_mixer_elem_attach =\n      _snd_mixer_elem_attach_ptr.asFunction<_dart_snd_mixer_elem_attach>();\n\n  int snd_mixer_elem_detach(\n    ffi.Pointer<snd_mixer_elem_> melem,\n    ffi.Pointer<snd_hctl_elem_> helem,\n  ) {\n    return _snd_mixer_elem_detach(\n      melem,\n      helem,\n    );\n  }\n\n  late final _snd_mixer_elem_detach_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_detach>>(\n          'snd_mixer_elem_detach');\n  late final _dart_snd_mixer_elem_detach _snd_mixer_elem_detach =\n      _snd_mixer_elem_detach_ptr.asFunction<_dart_snd_mixer_elem_detach>();\n\n  int snd_mixer_elem_empty(\n    ffi.Pointer<snd_mixer_elem_> melem,\n  ) {\n    return _snd_mixer_elem_empty(\n      melem,\n    );\n  }\n\n  late final _snd_mixer_elem_empty_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_empty>>(\n          'snd_mixer_elem_empty');\n  late final _dart_snd_mixer_elem_empty _snd_mixer_elem_empty =\n      _snd_mixer_elem_empty_ptr.asFunction<_dart_snd_mixer_elem_empty>();\n\n  ffi.Pointer<ffi.Void> snd_mixer_elem_get_private(\n    ffi.Pointer<snd_mixer_elem_> melem,\n  ) {\n    return _snd_mixer_elem_get_private(\n      melem,\n    );\n  }\n\n  late final _snd_mixer_elem_get_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_elem_get_private>>(\n          'snd_mixer_elem_get_private');\n  late final _dart_snd_mixer_elem_get_private _snd_mixer_elem_get_private =\n      _snd_mixer_elem_get_private_ptr\n          .asFunction<_dart_snd_mixer_elem_get_private>();\n\n  int snd_mixer_class_sizeof() {\n    return _snd_mixer_class_sizeof();\n  }\n\n  late final _snd_mixer_class_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_sizeof>>(\n          'snd_mixer_class_sizeof');\n  late final _dart_snd_mixer_class_sizeof _snd_mixer_class_sizeof =\n      _snd_mixer_class_sizeof_ptr.asFunction<_dart_snd_mixer_class_sizeof>();\n\n  int snd_mixer_class_malloc(\n    ffi.Pointer<ffi.Pointer<snd_mixer_class_>> ptr,\n  ) {\n    return _snd_mixer_class_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_mixer_class_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_malloc>>(\n          'snd_mixer_class_malloc');\n  late final _dart_snd_mixer_class_malloc _snd_mixer_class_malloc =\n      _snd_mixer_class_malloc_ptr.asFunction<_dart_snd_mixer_class_malloc>();\n\n  void snd_mixer_class_free(\n    ffi.Pointer<snd_mixer_class_> obj,\n  ) {\n    return _snd_mixer_class_free(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_class_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_free>>(\n          'snd_mixer_class_free');\n  late final _dart_snd_mixer_class_free _snd_mixer_class_free =\n      _snd_mixer_class_free_ptr.asFunction<_dart_snd_mixer_class_free>();\n\n  void snd_mixer_class_copy(\n    ffi.Pointer<snd_mixer_class_> dst,\n    ffi.Pointer<snd_mixer_class_> src,\n  ) {\n    return _snd_mixer_class_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_mixer_class_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_copy>>(\n          'snd_mixer_class_copy');\n  late final _dart_snd_mixer_class_copy _snd_mixer_class_copy =\n      _snd_mixer_class_copy_ptr.asFunction<_dart_snd_mixer_class_copy>();\n\n  ffi.Pointer<snd_mixer_> snd_mixer_class_get_mixer(\n    ffi.Pointer<snd_mixer_class_> class_,\n  ) {\n    return _snd_mixer_class_get_mixer(\n      class_,\n    );\n  }\n\n  late final _snd_mixer_class_get_mixer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_get_mixer>>(\n          'snd_mixer_class_get_mixer');\n  late final _dart_snd_mixer_class_get_mixer _snd_mixer_class_get_mixer =\n      _snd_mixer_class_get_mixer_ptr\n          .asFunction<_dart_snd_mixer_class_get_mixer>();\n\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> snd_mixer_class_get_event(\n    ffi.Pointer<snd_mixer_class_> class_,\n  ) {\n    return _snd_mixer_class_get_event(\n      class_,\n    );\n  }\n\n  late final _snd_mixer_class_get_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_get_event>>(\n          'snd_mixer_class_get_event');\n  late final _dart_snd_mixer_class_get_event _snd_mixer_class_get_event =\n      _snd_mixer_class_get_event_ptr\n          .asFunction<_dart_snd_mixer_class_get_event>();\n\n  ffi.Pointer<ffi.Void> snd_mixer_class_get_private(\n    ffi.Pointer<snd_mixer_class_> class_,\n  ) {\n    return _snd_mixer_class_get_private(\n      class_,\n    );\n  }\n\n  late final _snd_mixer_class_get_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_get_private>>(\n          'snd_mixer_class_get_private');\n  late final _dart_snd_mixer_class_get_private _snd_mixer_class_get_private =\n      _snd_mixer_class_get_private_ptr\n          .asFunction<_dart_snd_mixer_class_get_private>();\n\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>>\n      snd_mixer_class_get_compare(\n    ffi.Pointer<snd_mixer_class_> class_,\n  ) {\n    return _snd_mixer_class_get_compare(\n      class_,\n    );\n  }\n\n  late final _snd_mixer_class_get_compare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_get_compare>>(\n          'snd_mixer_class_get_compare');\n  late final _dart_snd_mixer_class_get_compare _snd_mixer_class_get_compare =\n      _snd_mixer_class_get_compare_ptr\n          .asFunction<_dart_snd_mixer_class_get_compare>();\n\n  int snd_mixer_class_set_event(\n    ffi.Pointer<snd_mixer_class_> class_,\n    ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> event,\n  ) {\n    return _snd_mixer_class_set_event(\n      class_,\n      event,\n    );\n  }\n\n  late final _snd_mixer_class_set_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_set_event>>(\n          'snd_mixer_class_set_event');\n  late final _dart_snd_mixer_class_set_event _snd_mixer_class_set_event =\n      _snd_mixer_class_set_event_ptr\n          .asFunction<_dart_snd_mixer_class_set_event>();\n\n  int snd_mixer_class_set_private(\n    ffi.Pointer<snd_mixer_class_> class_,\n    ffi.Pointer<ffi.Void> private_data,\n  ) {\n    return _snd_mixer_class_set_private(\n      class_,\n      private_data,\n    );\n  }\n\n  late final _snd_mixer_class_set_private_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_set_private>>(\n          'snd_mixer_class_set_private');\n  late final _dart_snd_mixer_class_set_private _snd_mixer_class_set_private =\n      _snd_mixer_class_set_private_ptr\n          .asFunction<_dart_snd_mixer_class_set_private>();\n\n  int snd_mixer_class_set_private_free(\n    ffi.Pointer<snd_mixer_class_> class_,\n    ffi.Pointer<ffi.NativeFunction<_typedefC_12>> private_free,\n  ) {\n    return _snd_mixer_class_set_private_free(\n      class_,\n      private_free,\n    );\n  }\n\n  late final _snd_mixer_class_set_private_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_set_private_free>>(\n          'snd_mixer_class_set_private_free');\n  late final _dart_snd_mixer_class_set_private_free\n      _snd_mixer_class_set_private_free = _snd_mixer_class_set_private_free_ptr\n          .asFunction<_dart_snd_mixer_class_set_private_free>();\n\n  int snd_mixer_class_set_compare(\n    ffi.Pointer<snd_mixer_class_> class_,\n    ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> compare,\n  ) {\n    return _snd_mixer_class_set_compare(\n      class_,\n      compare,\n    );\n  }\n\n  late final _snd_mixer_class_set_compare_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_class_set_compare>>(\n          'snd_mixer_class_set_compare');\n  late final _dart_snd_mixer_class_set_compare _snd_mixer_class_set_compare =\n      _snd_mixer_class_set_compare_ptr\n          .asFunction<_dart_snd_mixer_class_set_compare>();\n\n  ffi.Pointer<ffi.Int8> snd_mixer_selem_channel_name(\n    int channel,\n  ) {\n    return _snd_mixer_selem_channel_name(\n      channel,\n    );\n  }\n\n  late final _snd_mixer_selem_channel_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_channel_name>>(\n          'snd_mixer_selem_channel_name');\n  late final _dart_snd_mixer_selem_channel_name _snd_mixer_selem_channel_name =\n      _snd_mixer_selem_channel_name_ptr\n          .asFunction<_dart_snd_mixer_selem_channel_name>();\n\n  int snd_mixer_selem_register(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<snd_mixer_selem_regopt> options,\n    ffi.Pointer<ffi.Pointer<snd_mixer_class_>> classp,\n  ) {\n    return _snd_mixer_selem_register(\n      mixer,\n      options,\n      classp,\n    );\n  }\n\n  late final _snd_mixer_selem_register_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_register>>(\n          'snd_mixer_selem_register');\n  late final _dart_snd_mixer_selem_register _snd_mixer_selem_register =\n      _snd_mixer_selem_register_ptr\n          .asFunction<_dart_snd_mixer_selem_register>();\n\n  void snd_mixer_selem_get_id(\n    ffi.Pointer<snd_mixer_elem_> element,\n    ffi.Pointer<snd_mixer_selem_id_> id,\n  ) {\n    return _snd_mixer_selem_get_id(\n      element,\n      id,\n    );\n  }\n\n  late final _snd_mixer_selem_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_id>>(\n          'snd_mixer_selem_get_id');\n  late final _dart_snd_mixer_selem_get_id _snd_mixer_selem_get_id =\n      _snd_mixer_selem_get_id_ptr.asFunction<_dart_snd_mixer_selem_get_id>();\n\n  ffi.Pointer<ffi.Int8> snd_mixer_selem_get_name(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_get_name(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_name>>(\n          'snd_mixer_selem_get_name');\n  late final _dart_snd_mixer_selem_get_name _snd_mixer_selem_get_name =\n      _snd_mixer_selem_get_name_ptr\n          .asFunction<_dart_snd_mixer_selem_get_name>();\n\n  int snd_mixer_selem_get_index(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_get_index(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_index>>(\n          'snd_mixer_selem_get_index');\n  late final _dart_snd_mixer_selem_get_index _snd_mixer_selem_get_index =\n      _snd_mixer_selem_get_index_ptr\n          .asFunction<_dart_snd_mixer_selem_get_index>();\n\n  ffi.Pointer<snd_mixer_elem_> snd_mixer_find_selem(\n    ffi.Pointer<snd_mixer_> mixer,\n    ffi.Pointer<snd_mixer_selem_id_> id,\n  ) {\n    return _snd_mixer_find_selem(\n      mixer,\n      id,\n    );\n  }\n\n  late final _snd_mixer_find_selem_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_find_selem>>(\n          'snd_mixer_find_selem');\n  late final _dart_snd_mixer_find_selem _snd_mixer_find_selem =\n      _snd_mixer_find_selem_ptr.asFunction<_dart_snd_mixer_find_selem>();\n\n  int snd_mixer_selem_is_active(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_active(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_active_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_active>>(\n          'snd_mixer_selem_is_active');\n  late final _dart_snd_mixer_selem_is_active _snd_mixer_selem_is_active =\n      _snd_mixer_selem_is_active_ptr\n          .asFunction<_dart_snd_mixer_selem_is_active>();\n\n  int snd_mixer_selem_is_playback_mono(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_playback_mono(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_playback_mono_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_playback_mono>>(\n          'snd_mixer_selem_is_playback_mono');\n  late final _dart_snd_mixer_selem_is_playback_mono\n      _snd_mixer_selem_is_playback_mono = _snd_mixer_selem_is_playback_mono_ptr\n          .asFunction<_dart_snd_mixer_selem_is_playback_mono>();\n\n  int snd_mixer_selem_has_playback_channel(\n    ffi.Pointer<snd_mixer_elem_> obj,\n    int channel,\n  ) {\n    return _snd_mixer_selem_has_playback_channel(\n      obj,\n      channel,\n    );\n  }\n\n  late final _snd_mixer_selem_has_playback_channel_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_playback_channel>>(\n          'snd_mixer_selem_has_playback_channel');\n  late final _dart_snd_mixer_selem_has_playback_channel\n      _snd_mixer_selem_has_playback_channel =\n      _snd_mixer_selem_has_playback_channel_ptr\n          .asFunction<_dart_snd_mixer_selem_has_playback_channel>();\n\n  int snd_mixer_selem_is_capture_mono(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_capture_mono(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_capture_mono_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_capture_mono>>(\n          'snd_mixer_selem_is_capture_mono');\n  late final _dart_snd_mixer_selem_is_capture_mono\n      _snd_mixer_selem_is_capture_mono = _snd_mixer_selem_is_capture_mono_ptr\n          .asFunction<_dart_snd_mixer_selem_is_capture_mono>();\n\n  int snd_mixer_selem_has_capture_channel(\n    ffi.Pointer<snd_mixer_elem_> obj,\n    int channel,\n  ) {\n    return _snd_mixer_selem_has_capture_channel(\n      obj,\n      channel,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_channel_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_capture_channel>>(\n          'snd_mixer_selem_has_capture_channel');\n  late final _dart_snd_mixer_selem_has_capture_channel\n      _snd_mixer_selem_has_capture_channel =\n      _snd_mixer_selem_has_capture_channel_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_channel>();\n\n  int snd_mixer_selem_get_capture_group(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_get_capture_group(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_group_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_group>>(\n          'snd_mixer_selem_get_capture_group');\n  late final _dart_snd_mixer_selem_get_capture_group\n      _snd_mixer_selem_get_capture_group =\n      _snd_mixer_selem_get_capture_group_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_group>();\n\n  int snd_mixer_selem_has_common_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_common_volume(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_common_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_common_volume>>(\n          'snd_mixer_selem_has_common_volume');\n  late final _dart_snd_mixer_selem_has_common_volume\n      _snd_mixer_selem_has_common_volume =\n      _snd_mixer_selem_has_common_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_has_common_volume>();\n\n  int snd_mixer_selem_has_playback_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_playback_volume(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_playback_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_playback_volume>>(\n          'snd_mixer_selem_has_playback_volume');\n  late final _dart_snd_mixer_selem_has_playback_volume\n      _snd_mixer_selem_has_playback_volume =\n      _snd_mixer_selem_has_playback_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_has_playback_volume>();\n\n  int snd_mixer_selem_has_playback_volume_joined(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_playback_volume_joined(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_playback_volume_joined_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_mixer_selem_has_playback_volume_joined>>(\n      'snd_mixer_selem_has_playback_volume_joined');\n  late final _dart_snd_mixer_selem_has_playback_volume_joined\n      _snd_mixer_selem_has_playback_volume_joined =\n      _snd_mixer_selem_has_playback_volume_joined_ptr\n          .asFunction<_dart_snd_mixer_selem_has_playback_volume_joined>();\n\n  int snd_mixer_selem_has_capture_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_capture_volume(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_capture_volume>>(\n          'snd_mixer_selem_has_capture_volume');\n  late final _dart_snd_mixer_selem_has_capture_volume\n      _snd_mixer_selem_has_capture_volume =\n      _snd_mixer_selem_has_capture_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_volume>();\n\n  int snd_mixer_selem_has_capture_volume_joined(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_capture_volume_joined(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_volume_joined_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_capture_volume_joined>>(\n          'snd_mixer_selem_has_capture_volume_joined');\n  late final _dart_snd_mixer_selem_has_capture_volume_joined\n      _snd_mixer_selem_has_capture_volume_joined =\n      _snd_mixer_selem_has_capture_volume_joined_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_volume_joined>();\n\n  int snd_mixer_selem_has_common_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_common_switch(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_common_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_common_switch>>(\n          'snd_mixer_selem_has_common_switch');\n  late final _dart_snd_mixer_selem_has_common_switch\n      _snd_mixer_selem_has_common_switch =\n      _snd_mixer_selem_has_common_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_has_common_switch>();\n\n  int snd_mixer_selem_has_playback_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_playback_switch(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_playback_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_playback_switch>>(\n          'snd_mixer_selem_has_playback_switch');\n  late final _dart_snd_mixer_selem_has_playback_switch\n      _snd_mixer_selem_has_playback_switch =\n      _snd_mixer_selem_has_playback_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_has_playback_switch>();\n\n  int snd_mixer_selem_has_playback_switch_joined(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_playback_switch_joined(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_playback_switch_joined_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_mixer_selem_has_playback_switch_joined>>(\n      'snd_mixer_selem_has_playback_switch_joined');\n  late final _dart_snd_mixer_selem_has_playback_switch_joined\n      _snd_mixer_selem_has_playback_switch_joined =\n      _snd_mixer_selem_has_playback_switch_joined_ptr\n          .asFunction<_dart_snd_mixer_selem_has_playback_switch_joined>();\n\n  int snd_mixer_selem_has_capture_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_capture_switch(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_capture_switch>>(\n          'snd_mixer_selem_has_capture_switch');\n  late final _dart_snd_mixer_selem_has_capture_switch\n      _snd_mixer_selem_has_capture_switch =\n      _snd_mixer_selem_has_capture_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_switch>();\n\n  int snd_mixer_selem_has_capture_switch_joined(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_capture_switch_joined(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_switch_joined_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_has_capture_switch_joined>>(\n          'snd_mixer_selem_has_capture_switch_joined');\n  late final _dart_snd_mixer_selem_has_capture_switch_joined\n      _snd_mixer_selem_has_capture_switch_joined =\n      _snd_mixer_selem_has_capture_switch_joined_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_switch_joined>();\n\n  int snd_mixer_selem_has_capture_switch_exclusive(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_has_capture_switch_exclusive(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_has_capture_switch_exclusive_ptr = _lookup<\n          ffi.NativeFunction<_c_snd_mixer_selem_has_capture_switch_exclusive>>(\n      'snd_mixer_selem_has_capture_switch_exclusive');\n  late final _dart_snd_mixer_selem_has_capture_switch_exclusive\n      _snd_mixer_selem_has_capture_switch_exclusive =\n      _snd_mixer_selem_has_capture_switch_exclusive_ptr\n          .asFunction<_dart_snd_mixer_selem_has_capture_switch_exclusive>();\n\n  int snd_mixer_selem_ask_playback_vol_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n    ffi.Pointer<ffi.Int64> dBvalue,\n  ) {\n    return _snd_mixer_selem_ask_playback_vol_dB(\n      elem,\n      value,\n      dBvalue,\n    );\n  }\n\n  late final _snd_mixer_selem_ask_playback_vol_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_ask_playback_vol_dB>>(\n          'snd_mixer_selem_ask_playback_vol_dB');\n  late final _dart_snd_mixer_selem_ask_playback_vol_dB\n      _snd_mixer_selem_ask_playback_vol_dB =\n      _snd_mixer_selem_ask_playback_vol_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_ask_playback_vol_dB>();\n\n  int snd_mixer_selem_ask_capture_vol_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n    ffi.Pointer<ffi.Int64> dBvalue,\n  ) {\n    return _snd_mixer_selem_ask_capture_vol_dB(\n      elem,\n      value,\n      dBvalue,\n    );\n  }\n\n  late final _snd_mixer_selem_ask_capture_vol_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_ask_capture_vol_dB>>(\n          'snd_mixer_selem_ask_capture_vol_dB');\n  late final _dart_snd_mixer_selem_ask_capture_vol_dB\n      _snd_mixer_selem_ask_capture_vol_dB =\n      _snd_mixer_selem_ask_capture_vol_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_ask_capture_vol_dB>();\n\n  int snd_mixer_selem_ask_playback_dB_vol(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int dBvalue,\n    int dir,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_ask_playback_dB_vol(\n      elem,\n      dBvalue,\n      dir,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_ask_playback_dB_vol_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_ask_playback_dB_vol>>(\n          'snd_mixer_selem_ask_playback_dB_vol');\n  late final _dart_snd_mixer_selem_ask_playback_dB_vol\n      _snd_mixer_selem_ask_playback_dB_vol =\n      _snd_mixer_selem_ask_playback_dB_vol_ptr\n          .asFunction<_dart_snd_mixer_selem_ask_playback_dB_vol>();\n\n  int snd_mixer_selem_ask_capture_dB_vol(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int dBvalue,\n    int dir,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_ask_capture_dB_vol(\n      elem,\n      dBvalue,\n      dir,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_ask_capture_dB_vol_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_ask_capture_dB_vol>>(\n          'snd_mixer_selem_ask_capture_dB_vol');\n  late final _dart_snd_mixer_selem_ask_capture_dB_vol\n      _snd_mixer_selem_ask_capture_dB_vol =\n      _snd_mixer_selem_ask_capture_dB_vol_ptr\n          .asFunction<_dart_snd_mixer_selem_ask_capture_dB_vol>();\n\n  int snd_mixer_selem_get_playback_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_get_playback_volume(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_playback_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_playback_volume>>(\n          'snd_mixer_selem_get_playback_volume');\n  late final _dart_snd_mixer_selem_get_playback_volume\n      _snd_mixer_selem_get_playback_volume =\n      _snd_mixer_selem_get_playback_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_get_playback_volume>();\n\n  int snd_mixer_selem_get_capture_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_get_capture_volume(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_volume>>(\n          'snd_mixer_selem_get_capture_volume');\n  late final _dart_snd_mixer_selem_get_capture_volume\n      _snd_mixer_selem_get_capture_volume =\n      _snd_mixer_selem_get_capture_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_volume>();\n\n  int snd_mixer_selem_get_playback_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_get_playback_dB(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_playback_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_playback_dB>>(\n          'snd_mixer_selem_get_playback_dB');\n  late final _dart_snd_mixer_selem_get_playback_dB\n      _snd_mixer_selem_get_playback_dB = _snd_mixer_selem_get_playback_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_get_playback_dB>();\n\n  int snd_mixer_selem_get_capture_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int64> value,\n  ) {\n    return _snd_mixer_selem_get_capture_dB(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_dB>>(\n          'snd_mixer_selem_get_capture_dB');\n  late final _dart_snd_mixer_selem_get_capture_dB\n      _snd_mixer_selem_get_capture_dB = _snd_mixer_selem_get_capture_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_dB>();\n\n  int snd_mixer_selem_get_playback_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int32> value,\n  ) {\n    return _snd_mixer_selem_get_playback_switch(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_playback_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_playback_switch>>(\n          'snd_mixer_selem_get_playback_switch');\n  late final _dart_snd_mixer_selem_get_playback_switch\n      _snd_mixer_selem_get_playback_switch =\n      _snd_mixer_selem_get_playback_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_get_playback_switch>();\n\n  int snd_mixer_selem_get_capture_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Int32> value,\n  ) {\n    return _snd_mixer_selem_get_capture_switch(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_switch>>(\n          'snd_mixer_selem_get_capture_switch');\n  late final _dart_snd_mixer_selem_get_capture_switch\n      _snd_mixer_selem_get_capture_switch =\n      _snd_mixer_selem_get_capture_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_switch>();\n\n  int snd_mixer_selem_set_playback_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_playback_volume(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_volume>>(\n          'snd_mixer_selem_set_playback_volume');\n  late final _dart_snd_mixer_selem_set_playback_volume\n      _snd_mixer_selem_set_playback_volume =\n      _snd_mixer_selem_set_playback_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_volume>();\n\n  int snd_mixer_selem_set_capture_volume(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_capture_volume(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_volume_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_volume>>(\n          'snd_mixer_selem_set_capture_volume');\n  late final _dart_snd_mixer_selem_set_capture_volume\n      _snd_mixer_selem_set_capture_volume =\n      _snd_mixer_selem_set_capture_volume_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_volume>();\n\n  int snd_mixer_selem_set_playback_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n    int dir,\n  ) {\n    return _snd_mixer_selem_set_playback_dB(\n      elem,\n      channel,\n      value,\n      dir,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_dB>>(\n          'snd_mixer_selem_set_playback_dB');\n  late final _dart_snd_mixer_selem_set_playback_dB\n      _snd_mixer_selem_set_playback_dB = _snd_mixer_selem_set_playback_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_dB>();\n\n  int snd_mixer_selem_set_capture_dB(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n    int dir,\n  ) {\n    return _snd_mixer_selem_set_capture_dB(\n      elem,\n      channel,\n      value,\n      dir,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_dB_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_dB>>(\n          'snd_mixer_selem_set_capture_dB');\n  late final _dart_snd_mixer_selem_set_capture_dB\n      _snd_mixer_selem_set_capture_dB = _snd_mixer_selem_set_capture_dB_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_dB>();\n\n  int snd_mixer_selem_set_playback_volume_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_playback_volume_all(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_volume_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_volume_all>>(\n          'snd_mixer_selem_set_playback_volume_all');\n  late final _dart_snd_mixer_selem_set_playback_volume_all\n      _snd_mixer_selem_set_playback_volume_all =\n      _snd_mixer_selem_set_playback_volume_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_volume_all>();\n\n  int snd_mixer_selem_set_capture_volume_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_capture_volume_all(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_volume_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_volume_all>>(\n          'snd_mixer_selem_set_capture_volume_all');\n  late final _dart_snd_mixer_selem_set_capture_volume_all\n      _snd_mixer_selem_set_capture_volume_all =\n      _snd_mixer_selem_set_capture_volume_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_volume_all>();\n\n  int snd_mixer_selem_set_playback_dB_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n    int dir,\n  ) {\n    return _snd_mixer_selem_set_playback_dB_all(\n      elem,\n      value,\n      dir,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_dB_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_dB_all>>(\n          'snd_mixer_selem_set_playback_dB_all');\n  late final _dart_snd_mixer_selem_set_playback_dB_all\n      _snd_mixer_selem_set_playback_dB_all =\n      _snd_mixer_selem_set_playback_dB_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_dB_all>();\n\n  int snd_mixer_selem_set_capture_dB_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n    int dir,\n  ) {\n    return _snd_mixer_selem_set_capture_dB_all(\n      elem,\n      value,\n      dir,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_dB_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_dB_all>>(\n          'snd_mixer_selem_set_capture_dB_all');\n  late final _dart_snd_mixer_selem_set_capture_dB_all\n      _snd_mixer_selem_set_capture_dB_all =\n      _snd_mixer_selem_set_capture_dB_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_dB_all>();\n\n  int snd_mixer_selem_set_playback_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_playback_switch(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_switch>>(\n          'snd_mixer_selem_set_playback_switch');\n  late final _dart_snd_mixer_selem_set_playback_switch\n      _snd_mixer_selem_set_playback_switch =\n      _snd_mixer_selem_set_playback_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_switch>();\n\n  int snd_mixer_selem_set_capture_switch(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_capture_switch(\n      elem,\n      channel,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_switch_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_switch>>(\n          'snd_mixer_selem_set_capture_switch');\n  late final _dart_snd_mixer_selem_set_capture_switch\n      _snd_mixer_selem_set_capture_switch =\n      _snd_mixer_selem_set_capture_switch_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_switch>();\n\n  int snd_mixer_selem_set_playback_switch_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_playback_switch_all(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_switch_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_switch_all>>(\n          'snd_mixer_selem_set_playback_switch_all');\n  late final _dart_snd_mixer_selem_set_playback_switch_all\n      _snd_mixer_selem_set_playback_switch_all =\n      _snd_mixer_selem_set_playback_switch_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_switch_all>();\n\n  int snd_mixer_selem_set_capture_switch_all(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int value,\n  ) {\n    return _snd_mixer_selem_set_capture_switch_all(\n      elem,\n      value,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_switch_all_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_switch_all>>(\n          'snd_mixer_selem_set_capture_switch_all');\n  late final _dart_snd_mixer_selem_set_capture_switch_all\n      _snd_mixer_selem_set_capture_switch_all =\n      _snd_mixer_selem_set_capture_switch_all_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_switch_all>();\n\n  int snd_mixer_selem_get_playback_volume_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_mixer_selem_get_playback_volume_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_get_playback_volume_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_playback_volume_range>>(\n          'snd_mixer_selem_get_playback_volume_range');\n  late final _dart_snd_mixer_selem_get_playback_volume_range\n      _snd_mixer_selem_get_playback_volume_range =\n      _snd_mixer_selem_get_playback_volume_range_ptr\n          .asFunction<_dart_snd_mixer_selem_get_playback_volume_range>();\n\n  int snd_mixer_selem_get_playback_dB_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_mixer_selem_get_playback_dB_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_get_playback_dB_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_playback_dB_range>>(\n          'snd_mixer_selem_get_playback_dB_range');\n  late final _dart_snd_mixer_selem_get_playback_dB_range\n      _snd_mixer_selem_get_playback_dB_range =\n      _snd_mixer_selem_get_playback_dB_range_ptr\n          .asFunction<_dart_snd_mixer_selem_get_playback_dB_range>();\n\n  int snd_mixer_selem_set_playback_volume_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int min,\n    int max,\n  ) {\n    return _snd_mixer_selem_set_playback_volume_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_set_playback_volume_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_playback_volume_range>>(\n          'snd_mixer_selem_set_playback_volume_range');\n  late final _dart_snd_mixer_selem_set_playback_volume_range\n      _snd_mixer_selem_set_playback_volume_range =\n      _snd_mixer_selem_set_playback_volume_range_ptr\n          .asFunction<_dart_snd_mixer_selem_set_playback_volume_range>();\n\n  int snd_mixer_selem_get_capture_volume_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_mixer_selem_get_capture_volume_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_volume_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_volume_range>>(\n          'snd_mixer_selem_get_capture_volume_range');\n  late final _dart_snd_mixer_selem_get_capture_volume_range\n      _snd_mixer_selem_get_capture_volume_range =\n      _snd_mixer_selem_get_capture_volume_range_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_volume_range>();\n\n  int snd_mixer_selem_get_capture_dB_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    ffi.Pointer<ffi.Int64> min,\n    ffi.Pointer<ffi.Int64> max,\n  ) {\n    return _snd_mixer_selem_get_capture_dB_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_get_capture_dB_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_capture_dB_range>>(\n          'snd_mixer_selem_get_capture_dB_range');\n  late final _dart_snd_mixer_selem_get_capture_dB_range\n      _snd_mixer_selem_get_capture_dB_range =\n      _snd_mixer_selem_get_capture_dB_range_ptr\n          .asFunction<_dart_snd_mixer_selem_get_capture_dB_range>();\n\n  int snd_mixer_selem_set_capture_volume_range(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int min,\n    int max,\n  ) {\n    return _snd_mixer_selem_set_capture_volume_range(\n      elem,\n      min,\n      max,\n    );\n  }\n\n  late final _snd_mixer_selem_set_capture_volume_range_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_capture_volume_range>>(\n          'snd_mixer_selem_set_capture_volume_range');\n  late final _dart_snd_mixer_selem_set_capture_volume_range\n      _snd_mixer_selem_set_capture_volume_range =\n      _snd_mixer_selem_set_capture_volume_range_ptr\n          .asFunction<_dart_snd_mixer_selem_set_capture_volume_range>();\n\n  int snd_mixer_selem_is_enumerated(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_enumerated(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_enumerated_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_enumerated>>(\n          'snd_mixer_selem_is_enumerated');\n  late final _dart_snd_mixer_selem_is_enumerated\n      _snd_mixer_selem_is_enumerated = _snd_mixer_selem_is_enumerated_ptr\n          .asFunction<_dart_snd_mixer_selem_is_enumerated>();\n\n  int snd_mixer_selem_is_enum_playback(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_enum_playback(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_enum_playback_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_enum_playback>>(\n          'snd_mixer_selem_is_enum_playback');\n  late final _dart_snd_mixer_selem_is_enum_playback\n      _snd_mixer_selem_is_enum_playback = _snd_mixer_selem_is_enum_playback_ptr\n          .asFunction<_dart_snd_mixer_selem_is_enum_playback>();\n\n  int snd_mixer_selem_is_enum_capture(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_is_enum_capture(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_is_enum_capture_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_is_enum_capture>>(\n          'snd_mixer_selem_is_enum_capture');\n  late final _dart_snd_mixer_selem_is_enum_capture\n      _snd_mixer_selem_is_enum_capture = _snd_mixer_selem_is_enum_capture_ptr\n          .asFunction<_dart_snd_mixer_selem_is_enum_capture>();\n\n  int snd_mixer_selem_get_enum_items(\n    ffi.Pointer<snd_mixer_elem_> elem,\n  ) {\n    return _snd_mixer_selem_get_enum_items(\n      elem,\n    );\n  }\n\n  late final _snd_mixer_selem_get_enum_items_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_enum_items>>(\n          'snd_mixer_selem_get_enum_items');\n  late final _dart_snd_mixer_selem_get_enum_items\n      _snd_mixer_selem_get_enum_items = _snd_mixer_selem_get_enum_items_ptr\n          .asFunction<_dart_snd_mixer_selem_get_enum_items>();\n\n  int snd_mixer_selem_get_enum_item_name(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int idx,\n    int maxlen,\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_mixer_selem_get_enum_item_name(\n      elem,\n      idx,\n      maxlen,\n      str,\n    );\n  }\n\n  late final _snd_mixer_selem_get_enum_item_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_enum_item_name>>(\n          'snd_mixer_selem_get_enum_item_name');\n  late final _dart_snd_mixer_selem_get_enum_item_name\n      _snd_mixer_selem_get_enum_item_name =\n      _snd_mixer_selem_get_enum_item_name_ptr\n          .asFunction<_dart_snd_mixer_selem_get_enum_item_name>();\n\n  int snd_mixer_selem_get_enum_item(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    ffi.Pointer<ffi.Uint32> idxp,\n  ) {\n    return _snd_mixer_selem_get_enum_item(\n      elem,\n      channel,\n      idxp,\n    );\n  }\n\n  late final _snd_mixer_selem_get_enum_item_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_get_enum_item>>(\n          'snd_mixer_selem_get_enum_item');\n  late final _dart_snd_mixer_selem_get_enum_item\n      _snd_mixer_selem_get_enum_item = _snd_mixer_selem_get_enum_item_ptr\n          .asFunction<_dart_snd_mixer_selem_get_enum_item>();\n\n  int snd_mixer_selem_set_enum_item(\n    ffi.Pointer<snd_mixer_elem_> elem,\n    int channel,\n    int idx,\n  ) {\n    return _snd_mixer_selem_set_enum_item(\n      elem,\n      channel,\n      idx,\n    );\n  }\n\n  late final _snd_mixer_selem_set_enum_item_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_set_enum_item>>(\n          'snd_mixer_selem_set_enum_item');\n  late final _dart_snd_mixer_selem_set_enum_item\n      _snd_mixer_selem_set_enum_item = _snd_mixer_selem_set_enum_item_ptr\n          .asFunction<_dart_snd_mixer_selem_set_enum_item>();\n\n  int snd_mixer_selem_id_sizeof() {\n    return _snd_mixer_selem_id_sizeof();\n  }\n\n  late final _snd_mixer_selem_id_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_sizeof>>(\n          'snd_mixer_selem_id_sizeof');\n  late final _dart_snd_mixer_selem_id_sizeof _snd_mixer_selem_id_sizeof =\n      _snd_mixer_selem_id_sizeof_ptr\n          .asFunction<_dart_snd_mixer_selem_id_sizeof>();\n\n  int snd_mixer_selem_id_malloc(\n    ffi.Pointer<ffi.Pointer<snd_mixer_selem_id_>> ptr,\n  ) {\n    return _snd_mixer_selem_id_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_mixer_selem_id_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_malloc>>(\n          'snd_mixer_selem_id_malloc');\n  late final _dart_snd_mixer_selem_id_malloc _snd_mixer_selem_id_malloc =\n      _snd_mixer_selem_id_malloc_ptr\n          .asFunction<_dart_snd_mixer_selem_id_malloc>();\n\n  void snd_mixer_selem_id_free(\n    ffi.Pointer<snd_mixer_selem_id_> obj,\n  ) {\n    return _snd_mixer_selem_id_free(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_selem_id_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_free>>(\n          'snd_mixer_selem_id_free');\n  late final _dart_snd_mixer_selem_id_free _snd_mixer_selem_id_free =\n      _snd_mixer_selem_id_free_ptr.asFunction<_dart_snd_mixer_selem_id_free>();\n\n  void snd_mixer_selem_id_copy(\n    ffi.Pointer<snd_mixer_selem_id_> dst,\n    ffi.Pointer<snd_mixer_selem_id_> src,\n  ) {\n    return _snd_mixer_selem_id_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_mixer_selem_id_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_copy>>(\n          'snd_mixer_selem_id_copy');\n  late final _dart_snd_mixer_selem_id_copy _snd_mixer_selem_id_copy =\n      _snd_mixer_selem_id_copy_ptr.asFunction<_dart_snd_mixer_selem_id_copy>();\n\n  ffi.Pointer<ffi.Int8> snd_mixer_selem_id_get_name(\n    ffi.Pointer<snd_mixer_selem_id_> obj,\n  ) {\n    return _snd_mixer_selem_id_get_name(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_selem_id_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_get_name>>(\n          'snd_mixer_selem_id_get_name');\n  late final _dart_snd_mixer_selem_id_get_name _snd_mixer_selem_id_get_name =\n      _snd_mixer_selem_id_get_name_ptr\n          .asFunction<_dart_snd_mixer_selem_id_get_name>();\n\n  int snd_mixer_selem_id_get_index(\n    ffi.Pointer<snd_mixer_selem_id_> obj,\n  ) {\n    return _snd_mixer_selem_id_get_index(\n      obj,\n    );\n  }\n\n  late final _snd_mixer_selem_id_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_get_index>>(\n          'snd_mixer_selem_id_get_index');\n  late final _dart_snd_mixer_selem_id_get_index _snd_mixer_selem_id_get_index =\n      _snd_mixer_selem_id_get_index_ptr\n          .asFunction<_dart_snd_mixer_selem_id_get_index>();\n\n  void snd_mixer_selem_id_set_name(\n    ffi.Pointer<snd_mixer_selem_id_> obj,\n    ffi.Pointer<ffi.Int8> val,\n  ) {\n    return _snd_mixer_selem_id_set_name(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_selem_id_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_set_name>>(\n          'snd_mixer_selem_id_set_name');\n  late final _dart_snd_mixer_selem_id_set_name _snd_mixer_selem_id_set_name =\n      _snd_mixer_selem_id_set_name_ptr\n          .asFunction<_dart_snd_mixer_selem_id_set_name>();\n\n  void snd_mixer_selem_id_set_index(\n    ffi.Pointer<snd_mixer_selem_id_> obj,\n    int val,\n  ) {\n    return _snd_mixer_selem_id_set_index(\n      obj,\n      val,\n    );\n  }\n\n  late final _snd_mixer_selem_id_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_set_index>>(\n          'snd_mixer_selem_id_set_index');\n  late final _dart_snd_mixer_selem_id_set_index _snd_mixer_selem_id_set_index =\n      _snd_mixer_selem_id_set_index_ptr\n          .asFunction<_dart_snd_mixer_selem_id_set_index>();\n\n  int snd_mixer_selem_id_parse(\n    ffi.Pointer<snd_mixer_selem_id_> dst,\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_mixer_selem_id_parse(\n      dst,\n      str,\n    );\n  }\n\n  late final _snd_mixer_selem_id_parse_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_mixer_selem_id_parse>>(\n          'snd_mixer_selem_id_parse');\n  late final _dart_snd_mixer_selem_id_parse _snd_mixer_selem_id_parse =\n      _snd_mixer_selem_id_parse_ptr\n          .asFunction<_dart_snd_mixer_selem_id_parse>();\n\n  int snd_seq_open(\n    ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int streams,\n    int mode,\n  ) {\n    return _snd_seq_open(\n      handle,\n      name,\n      streams,\n      mode,\n    );\n  }\n\n  late final _snd_seq_open_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_open>>('snd_seq_open');\n  late final _dart_snd_seq_open _snd_seq_open =\n      _snd_seq_open_ptr.asFunction<_dart_snd_seq_open>();\n\n  int snd_seq_open_lconf(\n    ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n    ffi.Pointer<ffi.Int8> name,\n    int streams,\n    int mode,\n    ffi.Pointer<snd_config_> lconf,\n  ) {\n    return _snd_seq_open_lconf(\n      handle,\n      name,\n      streams,\n      mode,\n      lconf,\n    );\n  }\n\n  late final _snd_seq_open_lconf_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_open_lconf>>('snd_seq_open_lconf');\n  late final _dart_snd_seq_open_lconf _snd_seq_open_lconf =\n      _snd_seq_open_lconf_ptr.asFunction<_dart_snd_seq_open_lconf>();\n\n  ffi.Pointer<ffi.Int8> snd_seq_name(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_name(\n      seq,\n    );\n  }\n\n  late final _snd_seq_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_name>>('snd_seq_name');\n  late final _dart_snd_seq_name _snd_seq_name =\n      _snd_seq_name_ptr.asFunction<_dart_snd_seq_name>();\n\n  int snd_seq_type(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_type(\n      seq,\n    );\n  }\n\n  late final _snd_seq_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_type>>('snd_seq_type');\n  late final _dart_snd_seq_type _snd_seq_type =\n      _snd_seq_type_ptr.asFunction<_dart_snd_seq_type>();\n\n  int snd_seq_close(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_close(\n      handle,\n    );\n  }\n\n  late final _snd_seq_close_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_close>>('snd_seq_close');\n  late final _dart_snd_seq_close _snd_seq_close =\n      _snd_seq_close_ptr.asFunction<_dart_snd_seq_close>();\n\n  int snd_seq_poll_descriptors_count(\n    ffi.Pointer<snd_seq_> handle,\n    int events,\n  ) {\n    return _snd_seq_poll_descriptors_count(\n      handle,\n      events,\n    );\n  }\n\n  late final _snd_seq_poll_descriptors_count_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_poll_descriptors_count>>(\n          'snd_seq_poll_descriptors_count');\n  late final _dart_snd_seq_poll_descriptors_count\n      _snd_seq_poll_descriptors_count = _snd_seq_poll_descriptors_count_ptr\n          .asFunction<_dart_snd_seq_poll_descriptors_count>();\n\n  int snd_seq_poll_descriptors(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<pollfd> pfds,\n    int space,\n    int events,\n  ) {\n    return _snd_seq_poll_descriptors(\n      handle,\n      pfds,\n      space,\n      events,\n    );\n  }\n\n  late final _snd_seq_poll_descriptors_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_poll_descriptors>>(\n          'snd_seq_poll_descriptors');\n  late final _dart_snd_seq_poll_descriptors _snd_seq_poll_descriptors =\n      _snd_seq_poll_descriptors_ptr\n          .asFunction<_dart_snd_seq_poll_descriptors>();\n\n  int snd_seq_poll_descriptors_revents(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<pollfd> pfds,\n    int nfds,\n    ffi.Pointer<ffi.Uint16> revents,\n  ) {\n    return _snd_seq_poll_descriptors_revents(\n      seq,\n      pfds,\n      nfds,\n      revents,\n    );\n  }\n\n  late final _snd_seq_poll_descriptors_revents_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_poll_descriptors_revents>>(\n          'snd_seq_poll_descriptors_revents');\n  late final _dart_snd_seq_poll_descriptors_revents\n      _snd_seq_poll_descriptors_revents = _snd_seq_poll_descriptors_revents_ptr\n          .asFunction<_dart_snd_seq_poll_descriptors_revents>();\n\n  int snd_seq_nonblock(\n    ffi.Pointer<snd_seq_> handle,\n    int nonblock,\n  ) {\n    return _snd_seq_nonblock(\n      handle,\n      nonblock,\n    );\n  }\n\n  late final _snd_seq_nonblock_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_nonblock>>('snd_seq_nonblock');\n  late final _dart_snd_seq_nonblock _snd_seq_nonblock =\n      _snd_seq_nonblock_ptr.asFunction<_dart_snd_seq_nonblock>();\n\n  int snd_seq_client_id(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_client_id(\n      handle,\n    );\n  }\n\n  late final _snd_seq_client_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_id>>('snd_seq_client_id');\n  late final _dart_snd_seq_client_id _snd_seq_client_id =\n      _snd_seq_client_id_ptr.asFunction<_dart_snd_seq_client_id>();\n\n  int snd_seq_get_output_buffer_size(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_get_output_buffer_size(\n      handle,\n    );\n  }\n\n  late final _snd_seq_get_output_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_output_buffer_size>>(\n          'snd_seq_get_output_buffer_size');\n  late final _dart_snd_seq_get_output_buffer_size\n      _snd_seq_get_output_buffer_size = _snd_seq_get_output_buffer_size_ptr\n          .asFunction<_dart_snd_seq_get_output_buffer_size>();\n\n  int snd_seq_get_input_buffer_size(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_get_input_buffer_size(\n      handle,\n    );\n  }\n\n  late final _snd_seq_get_input_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_input_buffer_size>>(\n          'snd_seq_get_input_buffer_size');\n  late final _dart_snd_seq_get_input_buffer_size\n      _snd_seq_get_input_buffer_size = _snd_seq_get_input_buffer_size_ptr\n          .asFunction<_dart_snd_seq_get_input_buffer_size>();\n\n  int snd_seq_set_output_buffer_size(\n    ffi.Pointer<snd_seq_> handle,\n    int size,\n  ) {\n    return _snd_seq_set_output_buffer_size(\n      handle,\n      size,\n    );\n  }\n\n  late final _snd_seq_set_output_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_output_buffer_size>>(\n          'snd_seq_set_output_buffer_size');\n  late final _dart_snd_seq_set_output_buffer_size\n      _snd_seq_set_output_buffer_size = _snd_seq_set_output_buffer_size_ptr\n          .asFunction<_dart_snd_seq_set_output_buffer_size>();\n\n  int snd_seq_set_input_buffer_size(\n    ffi.Pointer<snd_seq_> handle,\n    int size,\n  ) {\n    return _snd_seq_set_input_buffer_size(\n      handle,\n      size,\n    );\n  }\n\n  late final _snd_seq_set_input_buffer_size_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_input_buffer_size>>(\n          'snd_seq_set_input_buffer_size');\n  late final _dart_snd_seq_set_input_buffer_size\n      _snd_seq_set_input_buffer_size = _snd_seq_set_input_buffer_size_ptr\n          .asFunction<_dart_snd_seq_set_input_buffer_size>();\n\n  int snd_seq_system_info_sizeof() {\n    return _snd_seq_system_info_sizeof();\n  }\n\n  late final _snd_seq_system_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_sizeof>>(\n          'snd_seq_system_info_sizeof');\n  late final _dart_snd_seq_system_info_sizeof _snd_seq_system_info_sizeof =\n      _snd_seq_system_info_sizeof_ptr\n          .asFunction<_dart_snd_seq_system_info_sizeof>();\n\n  int snd_seq_system_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_system_info_>> ptr,\n  ) {\n    return _snd_seq_system_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_system_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_malloc>>(\n          'snd_seq_system_info_malloc');\n  late final _dart_snd_seq_system_info_malloc _snd_seq_system_info_malloc =\n      _snd_seq_system_info_malloc_ptr\n          .asFunction<_dart_snd_seq_system_info_malloc>();\n\n  void snd_seq_system_info_free(\n    ffi.Pointer<snd_seq_system_info_> ptr,\n  ) {\n    return _snd_seq_system_info_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_system_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_free>>(\n          'snd_seq_system_info_free');\n  late final _dart_snd_seq_system_info_free _snd_seq_system_info_free =\n      _snd_seq_system_info_free_ptr\n          .asFunction<_dart_snd_seq_system_info_free>();\n\n  void snd_seq_system_info_copy(\n    ffi.Pointer<snd_seq_system_info_> dst,\n    ffi.Pointer<snd_seq_system_info_> src,\n  ) {\n    return _snd_seq_system_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_system_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_copy>>(\n          'snd_seq_system_info_copy');\n  late final _dart_snd_seq_system_info_copy _snd_seq_system_info_copy =\n      _snd_seq_system_info_copy_ptr\n          .asFunction<_dart_snd_seq_system_info_copy>();\n\n  int snd_seq_system_info_get_queues(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_queues(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_queues_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_queues>>(\n          'snd_seq_system_info_get_queues');\n  late final _dart_snd_seq_system_info_get_queues\n      _snd_seq_system_info_get_queues = _snd_seq_system_info_get_queues_ptr\n          .asFunction<_dart_snd_seq_system_info_get_queues>();\n\n  int snd_seq_system_info_get_clients(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_clients(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_clients_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_clients>>(\n          'snd_seq_system_info_get_clients');\n  late final _dart_snd_seq_system_info_get_clients\n      _snd_seq_system_info_get_clients = _snd_seq_system_info_get_clients_ptr\n          .asFunction<_dart_snd_seq_system_info_get_clients>();\n\n  int snd_seq_system_info_get_ports(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_ports(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_ports_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_ports>>(\n          'snd_seq_system_info_get_ports');\n  late final _dart_snd_seq_system_info_get_ports\n      _snd_seq_system_info_get_ports = _snd_seq_system_info_get_ports_ptr\n          .asFunction<_dart_snd_seq_system_info_get_ports>();\n\n  int snd_seq_system_info_get_channels(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_channels(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_channels>>(\n          'snd_seq_system_info_get_channels');\n  late final _dart_snd_seq_system_info_get_channels\n      _snd_seq_system_info_get_channels = _snd_seq_system_info_get_channels_ptr\n          .asFunction<_dart_snd_seq_system_info_get_channels>();\n\n  int snd_seq_system_info_get_cur_clients(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_cur_clients(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_cur_clients_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_cur_clients>>(\n          'snd_seq_system_info_get_cur_clients');\n  late final _dart_snd_seq_system_info_get_cur_clients\n      _snd_seq_system_info_get_cur_clients =\n      _snd_seq_system_info_get_cur_clients_ptr\n          .asFunction<_dart_snd_seq_system_info_get_cur_clients>();\n\n  int snd_seq_system_info_get_cur_queues(\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info_get_cur_queues(\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_get_cur_queues_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info_get_cur_queues>>(\n          'snd_seq_system_info_get_cur_queues');\n  late final _dart_snd_seq_system_info_get_cur_queues\n      _snd_seq_system_info_get_cur_queues =\n      _snd_seq_system_info_get_cur_queues_ptr\n          .asFunction<_dart_snd_seq_system_info_get_cur_queues>();\n\n  int snd_seq_system_info(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_system_info_> info,\n  ) {\n    return _snd_seq_system_info(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_system_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_system_info>>(\n          'snd_seq_system_info');\n  late final _dart_snd_seq_system_info _snd_seq_system_info =\n      _snd_seq_system_info_ptr.asFunction<_dart_snd_seq_system_info>();\n\n  int snd_seq_client_info_sizeof() {\n    return _snd_seq_client_info_sizeof();\n  }\n\n  late final _snd_seq_client_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_sizeof>>(\n          'snd_seq_client_info_sizeof');\n  late final _dart_snd_seq_client_info_sizeof _snd_seq_client_info_sizeof =\n      _snd_seq_client_info_sizeof_ptr\n          .asFunction<_dart_snd_seq_client_info_sizeof>();\n\n  int snd_seq_client_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_client_info_>> ptr,\n  ) {\n    return _snd_seq_client_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_client_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_malloc>>(\n          'snd_seq_client_info_malloc');\n  late final _dart_snd_seq_client_info_malloc _snd_seq_client_info_malloc =\n      _snd_seq_client_info_malloc_ptr\n          .asFunction<_dart_snd_seq_client_info_malloc>();\n\n  void snd_seq_client_info_free(\n    ffi.Pointer<snd_seq_client_info_> ptr,\n  ) {\n    return _snd_seq_client_info_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_client_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_free>>(\n          'snd_seq_client_info_free');\n  late final _dart_snd_seq_client_info_free _snd_seq_client_info_free =\n      _snd_seq_client_info_free_ptr\n          .asFunction<_dart_snd_seq_client_info_free>();\n\n  void snd_seq_client_info_copy(\n    ffi.Pointer<snd_seq_client_info_> dst,\n    ffi.Pointer<snd_seq_client_info_> src,\n  ) {\n    return _snd_seq_client_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_client_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_copy>>(\n          'snd_seq_client_info_copy');\n  late final _dart_snd_seq_client_info_copy _snd_seq_client_info_copy =\n      _snd_seq_client_info_copy_ptr\n          .asFunction<_dart_snd_seq_client_info_copy>();\n\n  int snd_seq_client_info_get_client(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_client(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_client>>(\n          'snd_seq_client_info_get_client');\n  late final _dart_snd_seq_client_info_get_client\n      _snd_seq_client_info_get_client = _snd_seq_client_info_get_client_ptr\n          .asFunction<_dart_snd_seq_client_info_get_client>();\n\n  int snd_seq_client_info_get_type(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_type(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_type>>(\n          'snd_seq_client_info_get_type');\n  late final _dart_snd_seq_client_info_get_type _snd_seq_client_info_get_type =\n      _snd_seq_client_info_get_type_ptr\n          .asFunction<_dart_snd_seq_client_info_get_type>();\n\n  ffi.Pointer<ffi.Int8> snd_seq_client_info_get_name(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_name(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_name>>(\n          'snd_seq_client_info_get_name');\n  late final _dart_snd_seq_client_info_get_name _snd_seq_client_info_get_name =\n      _snd_seq_client_info_get_name_ptr\n          .asFunction<_dart_snd_seq_client_info_get_name>();\n\n  int snd_seq_client_info_get_broadcast_filter(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_broadcast_filter(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_broadcast_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_broadcast_filter>>(\n          'snd_seq_client_info_get_broadcast_filter');\n  late final _dart_snd_seq_client_info_get_broadcast_filter\n      _snd_seq_client_info_get_broadcast_filter =\n      _snd_seq_client_info_get_broadcast_filter_ptr\n          .asFunction<_dart_snd_seq_client_info_get_broadcast_filter>();\n\n  int snd_seq_client_info_get_error_bounce(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_error_bounce(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_error_bounce_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_error_bounce>>(\n          'snd_seq_client_info_get_error_bounce');\n  late final _dart_snd_seq_client_info_get_error_bounce\n      _snd_seq_client_info_get_error_bounce =\n      _snd_seq_client_info_get_error_bounce_ptr\n          .asFunction<_dart_snd_seq_client_info_get_error_bounce>();\n\n  int snd_seq_client_info_get_card(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_card(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_card_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_card>>(\n          'snd_seq_client_info_get_card');\n  late final _dart_snd_seq_client_info_get_card _snd_seq_client_info_get_card =\n      _snd_seq_client_info_get_card_ptr\n          .asFunction<_dart_snd_seq_client_info_get_card>();\n\n  int snd_seq_client_info_get_pid(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_pid(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_pid_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_pid>>(\n          'snd_seq_client_info_get_pid');\n  late final _dart_snd_seq_client_info_get_pid _snd_seq_client_info_get_pid =\n      _snd_seq_client_info_get_pid_ptr\n          .asFunction<_dart_snd_seq_client_info_get_pid>();\n\n  ffi.Pointer<ffi.Uint8> snd_seq_client_info_get_event_filter(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_event_filter(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_event_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_event_filter>>(\n          'snd_seq_client_info_get_event_filter');\n  late final _dart_snd_seq_client_info_get_event_filter\n      _snd_seq_client_info_get_event_filter =\n      _snd_seq_client_info_get_event_filter_ptr\n          .asFunction<_dart_snd_seq_client_info_get_event_filter>();\n\n  int snd_seq_client_info_get_num_ports(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_num_ports(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_num_ports_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_num_ports>>(\n          'snd_seq_client_info_get_num_ports');\n  late final _dart_snd_seq_client_info_get_num_ports\n      _snd_seq_client_info_get_num_ports =\n      _snd_seq_client_info_get_num_ports_ptr\n          .asFunction<_dart_snd_seq_client_info_get_num_ports>();\n\n  int snd_seq_client_info_get_event_lost(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_get_event_lost(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_get_event_lost_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_get_event_lost>>(\n          'snd_seq_client_info_get_event_lost');\n  late final _dart_snd_seq_client_info_get_event_lost\n      _snd_seq_client_info_get_event_lost =\n      _snd_seq_client_info_get_event_lost_ptr\n          .asFunction<_dart_snd_seq_client_info_get_event_lost>();\n\n  void snd_seq_client_info_set_client(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int client,\n  ) {\n    return _snd_seq_client_info_set_client(\n      info,\n      client,\n    );\n  }\n\n  late final _snd_seq_client_info_set_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_set_client>>(\n          'snd_seq_client_info_set_client');\n  late final _dart_snd_seq_client_info_set_client\n      _snd_seq_client_info_set_client = _snd_seq_client_info_set_client_ptr\n          .asFunction<_dart_snd_seq_client_info_set_client>();\n\n  void snd_seq_client_info_set_name(\n    ffi.Pointer<snd_seq_client_info_> info,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_client_info_set_name(\n      info,\n      name,\n    );\n  }\n\n  late final _snd_seq_client_info_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_set_name>>(\n          'snd_seq_client_info_set_name');\n  late final _dart_snd_seq_client_info_set_name _snd_seq_client_info_set_name =\n      _snd_seq_client_info_set_name_ptr\n          .asFunction<_dart_snd_seq_client_info_set_name>();\n\n  void snd_seq_client_info_set_broadcast_filter(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int val,\n  ) {\n    return _snd_seq_client_info_set_broadcast_filter(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_client_info_set_broadcast_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_set_broadcast_filter>>(\n          'snd_seq_client_info_set_broadcast_filter');\n  late final _dart_snd_seq_client_info_set_broadcast_filter\n      _snd_seq_client_info_set_broadcast_filter =\n      _snd_seq_client_info_set_broadcast_filter_ptr\n          .asFunction<_dart_snd_seq_client_info_set_broadcast_filter>();\n\n  void snd_seq_client_info_set_error_bounce(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int val,\n  ) {\n    return _snd_seq_client_info_set_error_bounce(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_client_info_set_error_bounce_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_set_error_bounce>>(\n          'snd_seq_client_info_set_error_bounce');\n  late final _dart_snd_seq_client_info_set_error_bounce\n      _snd_seq_client_info_set_error_bounce =\n      _snd_seq_client_info_set_error_bounce_ptr\n          .asFunction<_dart_snd_seq_client_info_set_error_bounce>();\n\n  void snd_seq_client_info_set_event_filter(\n    ffi.Pointer<snd_seq_client_info_> info,\n    ffi.Pointer<ffi.Uint8> filter,\n  ) {\n    return _snd_seq_client_info_set_event_filter(\n      info,\n      filter,\n    );\n  }\n\n  late final _snd_seq_client_info_set_event_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_set_event_filter>>(\n          'snd_seq_client_info_set_event_filter');\n  late final _dart_snd_seq_client_info_set_event_filter\n      _snd_seq_client_info_set_event_filter =\n      _snd_seq_client_info_set_event_filter_ptr\n          .asFunction<_dart_snd_seq_client_info_set_event_filter>();\n\n  void snd_seq_client_info_event_filter_clear(\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_client_info_event_filter_clear(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_info_event_filter_clear_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_event_filter_clear>>(\n          'snd_seq_client_info_event_filter_clear');\n  late final _dart_snd_seq_client_info_event_filter_clear\n      _snd_seq_client_info_event_filter_clear =\n      _snd_seq_client_info_event_filter_clear_ptr\n          .asFunction<_dart_snd_seq_client_info_event_filter_clear>();\n\n  void snd_seq_client_info_event_filter_add(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int event_type,\n  ) {\n    return _snd_seq_client_info_event_filter_add(\n      info,\n      event_type,\n    );\n  }\n\n  late final _snd_seq_client_info_event_filter_add_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_event_filter_add>>(\n          'snd_seq_client_info_event_filter_add');\n  late final _dart_snd_seq_client_info_event_filter_add\n      _snd_seq_client_info_event_filter_add =\n      _snd_seq_client_info_event_filter_add_ptr\n          .asFunction<_dart_snd_seq_client_info_event_filter_add>();\n\n  void snd_seq_client_info_event_filter_del(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int event_type,\n  ) {\n    return _snd_seq_client_info_event_filter_del(\n      info,\n      event_type,\n    );\n  }\n\n  late final _snd_seq_client_info_event_filter_del_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_event_filter_del>>(\n          'snd_seq_client_info_event_filter_del');\n  late final _dart_snd_seq_client_info_event_filter_del\n      _snd_seq_client_info_event_filter_del =\n      _snd_seq_client_info_event_filter_del_ptr\n          .asFunction<_dart_snd_seq_client_info_event_filter_del>();\n\n  int snd_seq_client_info_event_filter_check(\n    ffi.Pointer<snd_seq_client_info_> info,\n    int event_type,\n  ) {\n    return _snd_seq_client_info_event_filter_check(\n      info,\n      event_type,\n    );\n  }\n\n  late final _snd_seq_client_info_event_filter_check_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_info_event_filter_check>>(\n          'snd_seq_client_info_event_filter_check');\n  late final _dart_snd_seq_client_info_event_filter_check\n      _snd_seq_client_info_event_filter_check =\n      _snd_seq_client_info_event_filter_check_ptr\n          .asFunction<_dart_snd_seq_client_info_event_filter_check>();\n\n  int snd_seq_get_client_info(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_get_client_info(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_client_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_client_info>>(\n          'snd_seq_get_client_info');\n  late final _dart_snd_seq_get_client_info _snd_seq_get_client_info =\n      _snd_seq_get_client_info_ptr.asFunction<_dart_snd_seq_get_client_info>();\n\n  int snd_seq_get_any_client_info(\n    ffi.Pointer<snd_seq_> handle,\n    int client,\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_get_any_client_info(\n      handle,\n      client,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_any_client_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_any_client_info>>(\n          'snd_seq_get_any_client_info');\n  late final _dart_snd_seq_get_any_client_info _snd_seq_get_any_client_info =\n      _snd_seq_get_any_client_info_ptr\n          .asFunction<_dart_snd_seq_get_any_client_info>();\n\n  int snd_seq_set_client_info(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_set_client_info(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_set_client_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_info>>(\n          'snd_seq_set_client_info');\n  late final _dart_snd_seq_set_client_info _snd_seq_set_client_info =\n      _snd_seq_set_client_info_ptr.asFunction<_dart_snd_seq_set_client_info>();\n\n  int snd_seq_query_next_client(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_client_info_> info,\n  ) {\n    return _snd_seq_query_next_client(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_query_next_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_next_client>>(\n          'snd_seq_query_next_client');\n  late final _dart_snd_seq_query_next_client _snd_seq_query_next_client =\n      _snd_seq_query_next_client_ptr\n          .asFunction<_dart_snd_seq_query_next_client>();\n\n  int snd_seq_client_pool_sizeof() {\n    return _snd_seq_client_pool_sizeof();\n  }\n\n  late final _snd_seq_client_pool_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_sizeof>>(\n          'snd_seq_client_pool_sizeof');\n  late final _dart_snd_seq_client_pool_sizeof _snd_seq_client_pool_sizeof =\n      _snd_seq_client_pool_sizeof_ptr\n          .asFunction<_dart_snd_seq_client_pool_sizeof>();\n\n  int snd_seq_client_pool_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_client_pool_>> ptr,\n  ) {\n    return _snd_seq_client_pool_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_client_pool_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_malloc>>(\n          'snd_seq_client_pool_malloc');\n  late final _dart_snd_seq_client_pool_malloc _snd_seq_client_pool_malloc =\n      _snd_seq_client_pool_malloc_ptr\n          .asFunction<_dart_snd_seq_client_pool_malloc>();\n\n  void snd_seq_client_pool_free(\n    ffi.Pointer<snd_seq_client_pool_> ptr,\n  ) {\n    return _snd_seq_client_pool_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_client_pool_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_free>>(\n          'snd_seq_client_pool_free');\n  late final _dart_snd_seq_client_pool_free _snd_seq_client_pool_free =\n      _snd_seq_client_pool_free_ptr\n          .asFunction<_dart_snd_seq_client_pool_free>();\n\n  void snd_seq_client_pool_copy(\n    ffi.Pointer<snd_seq_client_pool_> dst,\n    ffi.Pointer<snd_seq_client_pool_> src,\n  ) {\n    return _snd_seq_client_pool_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_client_pool_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_copy>>(\n          'snd_seq_client_pool_copy');\n  late final _dart_snd_seq_client_pool_copy _snd_seq_client_pool_copy =\n      _snd_seq_client_pool_copy_ptr\n          .asFunction<_dart_snd_seq_client_pool_copy>();\n\n  int snd_seq_client_pool_get_client(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_client(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_client>>(\n          'snd_seq_client_pool_get_client');\n  late final _dart_snd_seq_client_pool_get_client\n      _snd_seq_client_pool_get_client = _snd_seq_client_pool_get_client_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_client>();\n\n  int snd_seq_client_pool_get_output_pool(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_output_pool(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_output_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_output_pool>>(\n          'snd_seq_client_pool_get_output_pool');\n  late final _dart_snd_seq_client_pool_get_output_pool\n      _snd_seq_client_pool_get_output_pool =\n      _snd_seq_client_pool_get_output_pool_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_output_pool>();\n\n  int snd_seq_client_pool_get_input_pool(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_input_pool(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_input_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_input_pool>>(\n          'snd_seq_client_pool_get_input_pool');\n  late final _dart_snd_seq_client_pool_get_input_pool\n      _snd_seq_client_pool_get_input_pool =\n      _snd_seq_client_pool_get_input_pool_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_input_pool>();\n\n  int snd_seq_client_pool_get_output_room(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_output_room(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_output_room_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_output_room>>(\n          'snd_seq_client_pool_get_output_room');\n  late final _dart_snd_seq_client_pool_get_output_room\n      _snd_seq_client_pool_get_output_room =\n      _snd_seq_client_pool_get_output_room_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_output_room>();\n\n  int snd_seq_client_pool_get_output_free(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_output_free(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_output_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_output_free>>(\n          'snd_seq_client_pool_get_output_free');\n  late final _dart_snd_seq_client_pool_get_output_free\n      _snd_seq_client_pool_get_output_free =\n      _snd_seq_client_pool_get_output_free_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_output_free>();\n\n  int snd_seq_client_pool_get_input_free(\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_client_pool_get_input_free(\n      info,\n    );\n  }\n\n  late final _snd_seq_client_pool_get_input_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_get_input_free>>(\n          'snd_seq_client_pool_get_input_free');\n  late final _dart_snd_seq_client_pool_get_input_free\n      _snd_seq_client_pool_get_input_free =\n      _snd_seq_client_pool_get_input_free_ptr\n          .asFunction<_dart_snd_seq_client_pool_get_input_free>();\n\n  void snd_seq_client_pool_set_output_pool(\n    ffi.Pointer<snd_seq_client_pool_> info,\n    int size,\n  ) {\n    return _snd_seq_client_pool_set_output_pool(\n      info,\n      size,\n    );\n  }\n\n  late final _snd_seq_client_pool_set_output_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_set_output_pool>>(\n          'snd_seq_client_pool_set_output_pool');\n  late final _dart_snd_seq_client_pool_set_output_pool\n      _snd_seq_client_pool_set_output_pool =\n      _snd_seq_client_pool_set_output_pool_ptr\n          .asFunction<_dart_snd_seq_client_pool_set_output_pool>();\n\n  void snd_seq_client_pool_set_input_pool(\n    ffi.Pointer<snd_seq_client_pool_> info,\n    int size,\n  ) {\n    return _snd_seq_client_pool_set_input_pool(\n      info,\n      size,\n    );\n  }\n\n  late final _snd_seq_client_pool_set_input_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_set_input_pool>>(\n          'snd_seq_client_pool_set_input_pool');\n  late final _dart_snd_seq_client_pool_set_input_pool\n      _snd_seq_client_pool_set_input_pool =\n      _snd_seq_client_pool_set_input_pool_ptr\n          .asFunction<_dart_snd_seq_client_pool_set_input_pool>();\n\n  void snd_seq_client_pool_set_output_room(\n    ffi.Pointer<snd_seq_client_pool_> info,\n    int size,\n  ) {\n    return _snd_seq_client_pool_set_output_room(\n      info,\n      size,\n    );\n  }\n\n  late final _snd_seq_client_pool_set_output_room_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_client_pool_set_output_room>>(\n          'snd_seq_client_pool_set_output_room');\n  late final _dart_snd_seq_client_pool_set_output_room\n      _snd_seq_client_pool_set_output_room =\n      _snd_seq_client_pool_set_output_room_ptr\n          .asFunction<_dart_snd_seq_client_pool_set_output_room>();\n\n  int snd_seq_get_client_pool(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_get_client_pool(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_client_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_client_pool>>(\n          'snd_seq_get_client_pool');\n  late final _dart_snd_seq_get_client_pool _snd_seq_get_client_pool =\n      _snd_seq_get_client_pool_ptr.asFunction<_dart_snd_seq_get_client_pool>();\n\n  int snd_seq_set_client_pool(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_client_pool_> info,\n  ) {\n    return _snd_seq_set_client_pool(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_set_client_pool_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_pool>>(\n          'snd_seq_set_client_pool');\n  late final _dart_snd_seq_set_client_pool _snd_seq_set_client_pool =\n      _snd_seq_set_client_pool_ptr.asFunction<_dart_snd_seq_set_client_pool>();\n\n  int snd_seq_port_info_sizeof() {\n    return _snd_seq_port_info_sizeof();\n  }\n\n  late final _snd_seq_port_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_sizeof>>(\n          'snd_seq_port_info_sizeof');\n  late final _dart_snd_seq_port_info_sizeof _snd_seq_port_info_sizeof =\n      _snd_seq_port_info_sizeof_ptr\n          .asFunction<_dart_snd_seq_port_info_sizeof>();\n\n  int snd_seq_port_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_port_info_>> ptr,\n  ) {\n    return _snd_seq_port_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_port_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_malloc>>(\n          'snd_seq_port_info_malloc');\n  late final _dart_snd_seq_port_info_malloc _snd_seq_port_info_malloc =\n      _snd_seq_port_info_malloc_ptr\n          .asFunction<_dart_snd_seq_port_info_malloc>();\n\n  void snd_seq_port_info_free(\n    ffi.Pointer<snd_seq_port_info_> ptr,\n  ) {\n    return _snd_seq_port_info_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_port_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_free>>(\n          'snd_seq_port_info_free');\n  late final _dart_snd_seq_port_info_free _snd_seq_port_info_free =\n      _snd_seq_port_info_free_ptr.asFunction<_dart_snd_seq_port_info_free>();\n\n  void snd_seq_port_info_copy(\n    ffi.Pointer<snd_seq_port_info_> dst,\n    ffi.Pointer<snd_seq_port_info_> src,\n  ) {\n    return _snd_seq_port_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_port_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_copy>>(\n          'snd_seq_port_info_copy');\n  late final _dart_snd_seq_port_info_copy _snd_seq_port_info_copy =\n      _snd_seq_port_info_copy_ptr.asFunction<_dart_snd_seq_port_info_copy>();\n\n  int snd_seq_port_info_get_client(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_client(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_client>>(\n          'snd_seq_port_info_get_client');\n  late final _dart_snd_seq_port_info_get_client _snd_seq_port_info_get_client =\n      _snd_seq_port_info_get_client_ptr\n          .asFunction<_dart_snd_seq_port_info_get_client>();\n\n  int snd_seq_port_info_get_port(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_port(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_port>>(\n          'snd_seq_port_info_get_port');\n  late final _dart_snd_seq_port_info_get_port _snd_seq_port_info_get_port =\n      _snd_seq_port_info_get_port_ptr\n          .asFunction<_dart_snd_seq_port_info_get_port>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_port_info_get_addr(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_addr(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_addr_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_addr>>(\n          'snd_seq_port_info_get_addr');\n  late final _dart_snd_seq_port_info_get_addr _snd_seq_port_info_get_addr =\n      _snd_seq_port_info_get_addr_ptr\n          .asFunction<_dart_snd_seq_port_info_get_addr>();\n\n  ffi.Pointer<ffi.Int8> snd_seq_port_info_get_name(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_name(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_name>>(\n          'snd_seq_port_info_get_name');\n  late final _dart_snd_seq_port_info_get_name _snd_seq_port_info_get_name =\n      _snd_seq_port_info_get_name_ptr\n          .asFunction<_dart_snd_seq_port_info_get_name>();\n\n  int snd_seq_port_info_get_capability(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_capability(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_capability_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_capability>>(\n          'snd_seq_port_info_get_capability');\n  late final _dart_snd_seq_port_info_get_capability\n      _snd_seq_port_info_get_capability = _snd_seq_port_info_get_capability_ptr\n          .asFunction<_dart_snd_seq_port_info_get_capability>();\n\n  int snd_seq_port_info_get_type(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_type(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_type>>(\n          'snd_seq_port_info_get_type');\n  late final _dart_snd_seq_port_info_get_type _snd_seq_port_info_get_type =\n      _snd_seq_port_info_get_type_ptr\n          .asFunction<_dart_snd_seq_port_info_get_type>();\n\n  int snd_seq_port_info_get_midi_channels(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_midi_channels(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_midi_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_midi_channels>>(\n          'snd_seq_port_info_get_midi_channels');\n  late final _dart_snd_seq_port_info_get_midi_channels\n      _snd_seq_port_info_get_midi_channels =\n      _snd_seq_port_info_get_midi_channels_ptr\n          .asFunction<_dart_snd_seq_port_info_get_midi_channels>();\n\n  int snd_seq_port_info_get_midi_voices(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_midi_voices(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_midi_voices_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_midi_voices>>(\n          'snd_seq_port_info_get_midi_voices');\n  late final _dart_snd_seq_port_info_get_midi_voices\n      _snd_seq_port_info_get_midi_voices =\n      _snd_seq_port_info_get_midi_voices_ptr\n          .asFunction<_dart_snd_seq_port_info_get_midi_voices>();\n\n  int snd_seq_port_info_get_synth_voices(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_synth_voices(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_synth_voices_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_synth_voices>>(\n          'snd_seq_port_info_get_synth_voices');\n  late final _dart_snd_seq_port_info_get_synth_voices\n      _snd_seq_port_info_get_synth_voices =\n      _snd_seq_port_info_get_synth_voices_ptr\n          .asFunction<_dart_snd_seq_port_info_get_synth_voices>();\n\n  int snd_seq_port_info_get_read_use(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_read_use(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_read_use_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_read_use>>(\n          'snd_seq_port_info_get_read_use');\n  late final _dart_snd_seq_port_info_get_read_use\n      _snd_seq_port_info_get_read_use = _snd_seq_port_info_get_read_use_ptr\n          .asFunction<_dart_snd_seq_port_info_get_read_use>();\n\n  int snd_seq_port_info_get_write_use(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_write_use(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_write_use_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_write_use>>(\n          'snd_seq_port_info_get_write_use');\n  late final _dart_snd_seq_port_info_get_write_use\n      _snd_seq_port_info_get_write_use = _snd_seq_port_info_get_write_use_ptr\n          .asFunction<_dart_snd_seq_port_info_get_write_use>();\n\n  int snd_seq_port_info_get_port_specified(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_port_specified(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_port_specified_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_port_specified>>(\n          'snd_seq_port_info_get_port_specified');\n  late final _dart_snd_seq_port_info_get_port_specified\n      _snd_seq_port_info_get_port_specified =\n      _snd_seq_port_info_get_port_specified_ptr\n          .asFunction<_dart_snd_seq_port_info_get_port_specified>();\n\n  int snd_seq_port_info_get_timestamping(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_timestamping(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_timestamping_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_timestamping>>(\n          'snd_seq_port_info_get_timestamping');\n  late final _dart_snd_seq_port_info_get_timestamping\n      _snd_seq_port_info_get_timestamping =\n      _snd_seq_port_info_get_timestamping_ptr\n          .asFunction<_dart_snd_seq_port_info_get_timestamping>();\n\n  int snd_seq_port_info_get_timestamp_real(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_timestamp_real(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_timestamp_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_timestamp_real>>(\n          'snd_seq_port_info_get_timestamp_real');\n  late final _dart_snd_seq_port_info_get_timestamp_real\n      _snd_seq_port_info_get_timestamp_real =\n      _snd_seq_port_info_get_timestamp_real_ptr\n          .asFunction<_dart_snd_seq_port_info_get_timestamp_real>();\n\n  int snd_seq_port_info_get_timestamp_queue(\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_port_info_get_timestamp_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_info_get_timestamp_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_get_timestamp_queue>>(\n          'snd_seq_port_info_get_timestamp_queue');\n  late final _dart_snd_seq_port_info_get_timestamp_queue\n      _snd_seq_port_info_get_timestamp_queue =\n      _snd_seq_port_info_get_timestamp_queue_ptr\n          .asFunction<_dart_snd_seq_port_info_get_timestamp_queue>();\n\n  void snd_seq_port_info_set_client(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int client,\n  ) {\n    return _snd_seq_port_info_set_client(\n      info,\n      client,\n    );\n  }\n\n  late final _snd_seq_port_info_set_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_client>>(\n          'snd_seq_port_info_set_client');\n  late final _dart_snd_seq_port_info_set_client _snd_seq_port_info_set_client =\n      _snd_seq_port_info_set_client_ptr\n          .asFunction<_dart_snd_seq_port_info_set_client>();\n\n  void snd_seq_port_info_set_port(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int port,\n  ) {\n    return _snd_seq_port_info_set_port(\n      info,\n      port,\n    );\n  }\n\n  late final _snd_seq_port_info_set_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_port>>(\n          'snd_seq_port_info_set_port');\n  late final _dart_snd_seq_port_info_set_port _snd_seq_port_info_set_port =\n      _snd_seq_port_info_set_port_ptr\n          .asFunction<_dart_snd_seq_port_info_set_port>();\n\n  void snd_seq_port_info_set_addr(\n    ffi.Pointer<snd_seq_port_info_> info,\n    ffi.Pointer<snd_seq_addr_t> addr,\n  ) {\n    return _snd_seq_port_info_set_addr(\n      info,\n      addr,\n    );\n  }\n\n  late final _snd_seq_port_info_set_addr_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_addr>>(\n          'snd_seq_port_info_set_addr');\n  late final _dart_snd_seq_port_info_set_addr _snd_seq_port_info_set_addr =\n      _snd_seq_port_info_set_addr_ptr\n          .asFunction<_dart_snd_seq_port_info_set_addr>();\n\n  void snd_seq_port_info_set_name(\n    ffi.Pointer<snd_seq_port_info_> info,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_port_info_set_name(\n      info,\n      name,\n    );\n  }\n\n  late final _snd_seq_port_info_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_name>>(\n          'snd_seq_port_info_set_name');\n  late final _dart_snd_seq_port_info_set_name _snd_seq_port_info_set_name =\n      _snd_seq_port_info_set_name_ptr\n          .asFunction<_dart_snd_seq_port_info_set_name>();\n\n  void snd_seq_port_info_set_capability(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int capability,\n  ) {\n    return _snd_seq_port_info_set_capability(\n      info,\n      capability,\n    );\n  }\n\n  late final _snd_seq_port_info_set_capability_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_capability>>(\n          'snd_seq_port_info_set_capability');\n  late final _dart_snd_seq_port_info_set_capability\n      _snd_seq_port_info_set_capability = _snd_seq_port_info_set_capability_ptr\n          .asFunction<_dart_snd_seq_port_info_set_capability>();\n\n  void snd_seq_port_info_set_type(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int type,\n  ) {\n    return _snd_seq_port_info_set_type(\n      info,\n      type,\n    );\n  }\n\n  late final _snd_seq_port_info_set_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_type>>(\n          'snd_seq_port_info_set_type');\n  late final _dart_snd_seq_port_info_set_type _snd_seq_port_info_set_type =\n      _snd_seq_port_info_set_type_ptr\n          .asFunction<_dart_snd_seq_port_info_set_type>();\n\n  void snd_seq_port_info_set_midi_channels(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int channels,\n  ) {\n    return _snd_seq_port_info_set_midi_channels(\n      info,\n      channels,\n    );\n  }\n\n  late final _snd_seq_port_info_set_midi_channels_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_midi_channels>>(\n          'snd_seq_port_info_set_midi_channels');\n  late final _dart_snd_seq_port_info_set_midi_channels\n      _snd_seq_port_info_set_midi_channels =\n      _snd_seq_port_info_set_midi_channels_ptr\n          .asFunction<_dart_snd_seq_port_info_set_midi_channels>();\n\n  void snd_seq_port_info_set_midi_voices(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int voices,\n  ) {\n    return _snd_seq_port_info_set_midi_voices(\n      info,\n      voices,\n    );\n  }\n\n  late final _snd_seq_port_info_set_midi_voices_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_midi_voices>>(\n          'snd_seq_port_info_set_midi_voices');\n  late final _dart_snd_seq_port_info_set_midi_voices\n      _snd_seq_port_info_set_midi_voices =\n      _snd_seq_port_info_set_midi_voices_ptr\n          .asFunction<_dart_snd_seq_port_info_set_midi_voices>();\n\n  void snd_seq_port_info_set_synth_voices(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int voices,\n  ) {\n    return _snd_seq_port_info_set_synth_voices(\n      info,\n      voices,\n    );\n  }\n\n  late final _snd_seq_port_info_set_synth_voices_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_synth_voices>>(\n          'snd_seq_port_info_set_synth_voices');\n  late final _dart_snd_seq_port_info_set_synth_voices\n      _snd_seq_port_info_set_synth_voices =\n      _snd_seq_port_info_set_synth_voices_ptr\n          .asFunction<_dart_snd_seq_port_info_set_synth_voices>();\n\n  void snd_seq_port_info_set_port_specified(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int val,\n  ) {\n    return _snd_seq_port_info_set_port_specified(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_port_info_set_port_specified_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_port_specified>>(\n          'snd_seq_port_info_set_port_specified');\n  late final _dart_snd_seq_port_info_set_port_specified\n      _snd_seq_port_info_set_port_specified =\n      _snd_seq_port_info_set_port_specified_ptr\n          .asFunction<_dart_snd_seq_port_info_set_port_specified>();\n\n  void snd_seq_port_info_set_timestamping(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int enable,\n  ) {\n    return _snd_seq_port_info_set_timestamping(\n      info,\n      enable,\n    );\n  }\n\n  late final _snd_seq_port_info_set_timestamping_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_timestamping>>(\n          'snd_seq_port_info_set_timestamping');\n  late final _dart_snd_seq_port_info_set_timestamping\n      _snd_seq_port_info_set_timestamping =\n      _snd_seq_port_info_set_timestamping_ptr\n          .asFunction<_dart_snd_seq_port_info_set_timestamping>();\n\n  void snd_seq_port_info_set_timestamp_real(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int realtime,\n  ) {\n    return _snd_seq_port_info_set_timestamp_real(\n      info,\n      realtime,\n    );\n  }\n\n  late final _snd_seq_port_info_set_timestamp_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_timestamp_real>>(\n          'snd_seq_port_info_set_timestamp_real');\n  late final _dart_snd_seq_port_info_set_timestamp_real\n      _snd_seq_port_info_set_timestamp_real =\n      _snd_seq_port_info_set_timestamp_real_ptr\n          .asFunction<_dart_snd_seq_port_info_set_timestamp_real>();\n\n  void snd_seq_port_info_set_timestamp_queue(\n    ffi.Pointer<snd_seq_port_info_> info,\n    int queue,\n  ) {\n    return _snd_seq_port_info_set_timestamp_queue(\n      info,\n      queue,\n    );\n  }\n\n  late final _snd_seq_port_info_set_timestamp_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_info_set_timestamp_queue>>(\n          'snd_seq_port_info_set_timestamp_queue');\n  late final _dart_snd_seq_port_info_set_timestamp_queue\n      _snd_seq_port_info_set_timestamp_queue =\n      _snd_seq_port_info_set_timestamp_queue_ptr\n          .asFunction<_dart_snd_seq_port_info_set_timestamp_queue>();\n\n  int snd_seq_create_port(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_create_port(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_create_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_create_port>>(\n          'snd_seq_create_port');\n  late final _dart_snd_seq_create_port _snd_seq_create_port =\n      _snd_seq_create_port_ptr.asFunction<_dart_snd_seq_create_port>();\n\n  int snd_seq_delete_port(\n    ffi.Pointer<snd_seq_> handle,\n    int port,\n  ) {\n    return _snd_seq_delete_port(\n      handle,\n      port,\n    );\n  }\n\n  late final _snd_seq_delete_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_delete_port>>(\n          'snd_seq_delete_port');\n  late final _dart_snd_seq_delete_port _snd_seq_delete_port =\n      _snd_seq_delete_port_ptr.asFunction<_dart_snd_seq_delete_port>();\n\n  int snd_seq_get_port_info(\n    ffi.Pointer<snd_seq_> handle,\n    int port,\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_get_port_info(\n      handle,\n      port,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_port_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_port_info>>(\n          'snd_seq_get_port_info');\n  late final _dart_snd_seq_get_port_info _snd_seq_get_port_info =\n      _snd_seq_get_port_info_ptr.asFunction<_dart_snd_seq_get_port_info>();\n\n  int snd_seq_get_any_port_info(\n    ffi.Pointer<snd_seq_> handle,\n    int client,\n    int port,\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_get_any_port_info(\n      handle,\n      client,\n      port,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_any_port_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_any_port_info>>(\n          'snd_seq_get_any_port_info');\n  late final _dart_snd_seq_get_any_port_info _snd_seq_get_any_port_info =\n      _snd_seq_get_any_port_info_ptr\n          .asFunction<_dart_snd_seq_get_any_port_info>();\n\n  int snd_seq_set_port_info(\n    ffi.Pointer<snd_seq_> handle,\n    int port,\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_set_port_info(\n      handle,\n      port,\n      info,\n    );\n  }\n\n  late final _snd_seq_set_port_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_port_info>>(\n          'snd_seq_set_port_info');\n  late final _dart_snd_seq_set_port_info _snd_seq_set_port_info =\n      _snd_seq_set_port_info_ptr.asFunction<_dart_snd_seq_set_port_info>();\n\n  int snd_seq_query_next_port(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_port_info_> info,\n  ) {\n    return _snd_seq_query_next_port(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_query_next_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_next_port>>(\n          'snd_seq_query_next_port');\n  late final _dart_snd_seq_query_next_port _snd_seq_query_next_port =\n      _snd_seq_query_next_port_ptr.asFunction<_dart_snd_seq_query_next_port>();\n\n  int snd_seq_port_subscribe_sizeof() {\n    return _snd_seq_port_subscribe_sizeof();\n  }\n\n  late final _snd_seq_port_subscribe_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_sizeof>>(\n          'snd_seq_port_subscribe_sizeof');\n  late final _dart_snd_seq_port_subscribe_sizeof\n      _snd_seq_port_subscribe_sizeof = _snd_seq_port_subscribe_sizeof_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_sizeof>();\n\n  int snd_seq_port_subscribe_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_port_subscribe_>> ptr,\n  ) {\n    return _snd_seq_port_subscribe_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_malloc>>(\n          'snd_seq_port_subscribe_malloc');\n  late final _dart_snd_seq_port_subscribe_malloc\n      _snd_seq_port_subscribe_malloc = _snd_seq_port_subscribe_malloc_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_malloc>();\n\n  void snd_seq_port_subscribe_free(\n    ffi.Pointer<snd_seq_port_subscribe_> ptr,\n  ) {\n    return _snd_seq_port_subscribe_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_free>>(\n          'snd_seq_port_subscribe_free');\n  late final _dart_snd_seq_port_subscribe_free _snd_seq_port_subscribe_free =\n      _snd_seq_port_subscribe_free_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_free>();\n\n  void snd_seq_port_subscribe_copy(\n    ffi.Pointer<snd_seq_port_subscribe_> dst,\n    ffi.Pointer<snd_seq_port_subscribe_> src,\n  ) {\n    return _snd_seq_port_subscribe_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_copy>>(\n          'snd_seq_port_subscribe_copy');\n  late final _dart_snd_seq_port_subscribe_copy _snd_seq_port_subscribe_copy =\n      _snd_seq_port_subscribe_copy_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_copy>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_port_subscribe_get_sender(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_sender(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_sender_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_sender>>(\n          'snd_seq_port_subscribe_get_sender');\n  late final _dart_snd_seq_port_subscribe_get_sender\n      _snd_seq_port_subscribe_get_sender =\n      _snd_seq_port_subscribe_get_sender_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_sender>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_port_subscribe_get_dest(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_dest(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_dest_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_dest>>(\n          'snd_seq_port_subscribe_get_dest');\n  late final _dart_snd_seq_port_subscribe_get_dest\n      _snd_seq_port_subscribe_get_dest = _snd_seq_port_subscribe_get_dest_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_dest>();\n\n  int snd_seq_port_subscribe_get_queue(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_queue>>(\n          'snd_seq_port_subscribe_get_queue');\n  late final _dart_snd_seq_port_subscribe_get_queue\n      _snd_seq_port_subscribe_get_queue = _snd_seq_port_subscribe_get_queue_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_queue>();\n\n  int snd_seq_port_subscribe_get_exclusive(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_exclusive(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_exclusive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_exclusive>>(\n          'snd_seq_port_subscribe_get_exclusive');\n  late final _dart_snd_seq_port_subscribe_get_exclusive\n      _snd_seq_port_subscribe_get_exclusive =\n      _snd_seq_port_subscribe_get_exclusive_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_exclusive>();\n\n  int snd_seq_port_subscribe_get_time_update(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_time_update(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_time_update_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_time_update>>(\n          'snd_seq_port_subscribe_get_time_update');\n  late final _dart_snd_seq_port_subscribe_get_time_update\n      _snd_seq_port_subscribe_get_time_update =\n      _snd_seq_port_subscribe_get_time_update_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_time_update>();\n\n  int snd_seq_port_subscribe_get_time_real(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n  ) {\n    return _snd_seq_port_subscribe_get_time_real(\n      info,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_get_time_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_get_time_real>>(\n          'snd_seq_port_subscribe_get_time_real');\n  late final _dart_snd_seq_port_subscribe_get_time_real\n      _snd_seq_port_subscribe_get_time_real =\n      _snd_seq_port_subscribe_get_time_real_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_get_time_real>();\n\n  void snd_seq_port_subscribe_set_sender(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    ffi.Pointer<snd_seq_addr_t> addr,\n  ) {\n    return _snd_seq_port_subscribe_set_sender(\n      info,\n      addr,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_sender_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_sender>>(\n          'snd_seq_port_subscribe_set_sender');\n  late final _dart_snd_seq_port_subscribe_set_sender\n      _snd_seq_port_subscribe_set_sender =\n      _snd_seq_port_subscribe_set_sender_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_sender>();\n\n  void snd_seq_port_subscribe_set_dest(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    ffi.Pointer<snd_seq_addr_t> addr,\n  ) {\n    return _snd_seq_port_subscribe_set_dest(\n      info,\n      addr,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_dest_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_dest>>(\n          'snd_seq_port_subscribe_set_dest');\n  late final _dart_snd_seq_port_subscribe_set_dest\n      _snd_seq_port_subscribe_set_dest = _snd_seq_port_subscribe_set_dest_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_dest>();\n\n  void snd_seq_port_subscribe_set_queue(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    int q,\n  ) {\n    return _snd_seq_port_subscribe_set_queue(\n      info,\n      q,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_queue>>(\n          'snd_seq_port_subscribe_set_queue');\n  late final _dart_snd_seq_port_subscribe_set_queue\n      _snd_seq_port_subscribe_set_queue = _snd_seq_port_subscribe_set_queue_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_queue>();\n\n  void snd_seq_port_subscribe_set_exclusive(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    int val,\n  ) {\n    return _snd_seq_port_subscribe_set_exclusive(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_exclusive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_exclusive>>(\n          'snd_seq_port_subscribe_set_exclusive');\n  late final _dart_snd_seq_port_subscribe_set_exclusive\n      _snd_seq_port_subscribe_set_exclusive =\n      _snd_seq_port_subscribe_set_exclusive_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_exclusive>();\n\n  void snd_seq_port_subscribe_set_time_update(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    int val,\n  ) {\n    return _snd_seq_port_subscribe_set_time_update(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_time_update_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_time_update>>(\n          'snd_seq_port_subscribe_set_time_update');\n  late final _dart_snd_seq_port_subscribe_set_time_update\n      _snd_seq_port_subscribe_set_time_update =\n      _snd_seq_port_subscribe_set_time_update_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_time_update>();\n\n  void snd_seq_port_subscribe_set_time_real(\n    ffi.Pointer<snd_seq_port_subscribe_> info,\n    int val,\n  ) {\n    return _snd_seq_port_subscribe_set_time_real(\n      info,\n      val,\n    );\n  }\n\n  late final _snd_seq_port_subscribe_set_time_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_port_subscribe_set_time_real>>(\n          'snd_seq_port_subscribe_set_time_real');\n  late final _dart_snd_seq_port_subscribe_set_time_real\n      _snd_seq_port_subscribe_set_time_real =\n      _snd_seq_port_subscribe_set_time_real_ptr\n          .asFunction<_dart_snd_seq_port_subscribe_set_time_real>();\n\n  int snd_seq_get_port_subscription(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_port_subscribe_> sub,\n  ) {\n    return _snd_seq_get_port_subscription(\n      handle,\n      sub,\n    );\n  }\n\n  late final _snd_seq_get_port_subscription_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_port_subscription>>(\n          'snd_seq_get_port_subscription');\n  late final _dart_snd_seq_get_port_subscription\n      _snd_seq_get_port_subscription = _snd_seq_get_port_subscription_ptr\n          .asFunction<_dart_snd_seq_get_port_subscription>();\n\n  int snd_seq_subscribe_port(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_port_subscribe_> sub,\n  ) {\n    return _snd_seq_subscribe_port(\n      handle,\n      sub,\n    );\n  }\n\n  late final _snd_seq_subscribe_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_subscribe_port>>(\n          'snd_seq_subscribe_port');\n  late final _dart_snd_seq_subscribe_port _snd_seq_subscribe_port =\n      _snd_seq_subscribe_port_ptr.asFunction<_dart_snd_seq_subscribe_port>();\n\n  int snd_seq_unsubscribe_port(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_port_subscribe_> sub,\n  ) {\n    return _snd_seq_unsubscribe_port(\n      handle,\n      sub,\n    );\n  }\n\n  late final _snd_seq_unsubscribe_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_unsubscribe_port>>(\n          'snd_seq_unsubscribe_port');\n  late final _dart_snd_seq_unsubscribe_port _snd_seq_unsubscribe_port =\n      _snd_seq_unsubscribe_port_ptr\n          .asFunction<_dart_snd_seq_unsubscribe_port>();\n\n  int snd_seq_query_subscribe_sizeof() {\n    return _snd_seq_query_subscribe_sizeof();\n  }\n\n  late final _snd_seq_query_subscribe_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_sizeof>>(\n          'snd_seq_query_subscribe_sizeof');\n  late final _dart_snd_seq_query_subscribe_sizeof\n      _snd_seq_query_subscribe_sizeof = _snd_seq_query_subscribe_sizeof_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_sizeof>();\n\n  int snd_seq_query_subscribe_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_query_subscribe_>> ptr,\n  ) {\n    return _snd_seq_query_subscribe_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_malloc>>(\n          'snd_seq_query_subscribe_malloc');\n  late final _dart_snd_seq_query_subscribe_malloc\n      _snd_seq_query_subscribe_malloc = _snd_seq_query_subscribe_malloc_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_malloc>();\n\n  void snd_seq_query_subscribe_free(\n    ffi.Pointer<snd_seq_query_subscribe_> ptr,\n  ) {\n    return _snd_seq_query_subscribe_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_free>>(\n          'snd_seq_query_subscribe_free');\n  late final _dart_snd_seq_query_subscribe_free _snd_seq_query_subscribe_free =\n      _snd_seq_query_subscribe_free_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_free>();\n\n  void snd_seq_query_subscribe_copy(\n    ffi.Pointer<snd_seq_query_subscribe_> dst,\n    ffi.Pointer<snd_seq_query_subscribe_> src,\n  ) {\n    return _snd_seq_query_subscribe_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_copy>>(\n          'snd_seq_query_subscribe_copy');\n  late final _dart_snd_seq_query_subscribe_copy _snd_seq_query_subscribe_copy =\n      _snd_seq_query_subscribe_copy_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_copy>();\n\n  int snd_seq_query_subscribe_get_client(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_client(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_client>>(\n          'snd_seq_query_subscribe_get_client');\n  late final _dart_snd_seq_query_subscribe_get_client\n      _snd_seq_query_subscribe_get_client =\n      _snd_seq_query_subscribe_get_client_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_client>();\n\n  int snd_seq_query_subscribe_get_port(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_port(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_port>>(\n          'snd_seq_query_subscribe_get_port');\n  late final _dart_snd_seq_query_subscribe_get_port\n      _snd_seq_query_subscribe_get_port = _snd_seq_query_subscribe_get_port_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_port>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_query_subscribe_get_root(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_root(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_root_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_root>>(\n          'snd_seq_query_subscribe_get_root');\n  late final _dart_snd_seq_query_subscribe_get_root\n      _snd_seq_query_subscribe_get_root = _snd_seq_query_subscribe_get_root_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_root>();\n\n  int snd_seq_query_subscribe_get_type(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_type(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_type>>(\n          'snd_seq_query_subscribe_get_type');\n  late final _dart_snd_seq_query_subscribe_get_type\n      _snd_seq_query_subscribe_get_type = _snd_seq_query_subscribe_get_type_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_type>();\n\n  int snd_seq_query_subscribe_get_index(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_index(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_index>>(\n          'snd_seq_query_subscribe_get_index');\n  late final _dart_snd_seq_query_subscribe_get_index\n      _snd_seq_query_subscribe_get_index =\n      _snd_seq_query_subscribe_get_index_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_index>();\n\n  int snd_seq_query_subscribe_get_num_subs(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_num_subs(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_num_subs_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_num_subs>>(\n          'snd_seq_query_subscribe_get_num_subs');\n  late final _dart_snd_seq_query_subscribe_get_num_subs\n      _snd_seq_query_subscribe_get_num_subs =\n      _snd_seq_query_subscribe_get_num_subs_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_num_subs>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_query_subscribe_get_addr(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_addr(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_addr_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_addr>>(\n          'snd_seq_query_subscribe_get_addr');\n  late final _dart_snd_seq_query_subscribe_get_addr\n      _snd_seq_query_subscribe_get_addr = _snd_seq_query_subscribe_get_addr_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_addr>();\n\n  int snd_seq_query_subscribe_get_queue(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_queue>>(\n          'snd_seq_query_subscribe_get_queue');\n  late final _dart_snd_seq_query_subscribe_get_queue\n      _snd_seq_query_subscribe_get_queue =\n      _snd_seq_query_subscribe_get_queue_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_queue>();\n\n  int snd_seq_query_subscribe_get_exclusive(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_exclusive(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_exclusive_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_exclusive>>(\n          'snd_seq_query_subscribe_get_exclusive');\n  late final _dart_snd_seq_query_subscribe_get_exclusive\n      _snd_seq_query_subscribe_get_exclusive =\n      _snd_seq_query_subscribe_get_exclusive_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_exclusive>();\n\n  int snd_seq_query_subscribe_get_time_update(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_time_update(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_time_update_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_time_update>>(\n          'snd_seq_query_subscribe_get_time_update');\n  late final _dart_snd_seq_query_subscribe_get_time_update\n      _snd_seq_query_subscribe_get_time_update =\n      _snd_seq_query_subscribe_get_time_update_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_time_update>();\n\n  int snd_seq_query_subscribe_get_time_real(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n  ) {\n    return _snd_seq_query_subscribe_get_time_real(\n      info,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_get_time_real_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_get_time_real>>(\n          'snd_seq_query_subscribe_get_time_real');\n  late final _dart_snd_seq_query_subscribe_get_time_real\n      _snd_seq_query_subscribe_get_time_real =\n      _snd_seq_query_subscribe_get_time_real_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_get_time_real>();\n\n  void snd_seq_query_subscribe_set_client(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n    int client,\n  ) {\n    return _snd_seq_query_subscribe_set_client(\n      info,\n      client,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_set_client_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_set_client>>(\n          'snd_seq_query_subscribe_set_client');\n  late final _dart_snd_seq_query_subscribe_set_client\n      _snd_seq_query_subscribe_set_client =\n      _snd_seq_query_subscribe_set_client_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_set_client>();\n\n  void snd_seq_query_subscribe_set_port(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n    int port,\n  ) {\n    return _snd_seq_query_subscribe_set_port(\n      info,\n      port,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_set_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_set_port>>(\n          'snd_seq_query_subscribe_set_port');\n  late final _dart_snd_seq_query_subscribe_set_port\n      _snd_seq_query_subscribe_set_port = _snd_seq_query_subscribe_set_port_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_set_port>();\n\n  void snd_seq_query_subscribe_set_root(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n    ffi.Pointer<snd_seq_addr_t> addr,\n  ) {\n    return _snd_seq_query_subscribe_set_root(\n      info,\n      addr,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_set_root_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_set_root>>(\n          'snd_seq_query_subscribe_set_root');\n  late final _dart_snd_seq_query_subscribe_set_root\n      _snd_seq_query_subscribe_set_root = _snd_seq_query_subscribe_set_root_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_set_root>();\n\n  void snd_seq_query_subscribe_set_type(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n    int type,\n  ) {\n    return _snd_seq_query_subscribe_set_type(\n      info,\n      type,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_set_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_set_type>>(\n          'snd_seq_query_subscribe_set_type');\n  late final _dart_snd_seq_query_subscribe_set_type\n      _snd_seq_query_subscribe_set_type = _snd_seq_query_subscribe_set_type_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_set_type>();\n\n  void snd_seq_query_subscribe_set_index(\n    ffi.Pointer<snd_seq_query_subscribe_> info,\n    int _index,\n  ) {\n    return _snd_seq_query_subscribe_set_index(\n      info,\n      _index,\n    );\n  }\n\n  late final _snd_seq_query_subscribe_set_index_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_subscribe_set_index>>(\n          'snd_seq_query_subscribe_set_index');\n  late final _dart_snd_seq_query_subscribe_set_index\n      _snd_seq_query_subscribe_set_index =\n      _snd_seq_query_subscribe_set_index_ptr\n          .asFunction<_dart_snd_seq_query_subscribe_set_index>();\n\n  int snd_seq_query_port_subscribers(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<snd_seq_query_subscribe_> subs,\n  ) {\n    return _snd_seq_query_port_subscribers(\n      seq,\n      subs,\n    );\n  }\n\n  late final _snd_seq_query_port_subscribers_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_port_subscribers>>(\n          'snd_seq_query_port_subscribers');\n  late final _dart_snd_seq_query_port_subscribers\n      _snd_seq_query_port_subscribers = _snd_seq_query_port_subscribers_ptr\n          .asFunction<_dart_snd_seq_query_port_subscribers>();\n\n  int snd_seq_queue_info_sizeof() {\n    return _snd_seq_queue_info_sizeof();\n  }\n\n  late final _snd_seq_queue_info_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_sizeof>>(\n          'snd_seq_queue_info_sizeof');\n  late final _dart_snd_seq_queue_info_sizeof _snd_seq_queue_info_sizeof =\n      _snd_seq_queue_info_sizeof_ptr\n          .asFunction<_dart_snd_seq_queue_info_sizeof>();\n\n  int snd_seq_queue_info_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_queue_info_>> ptr,\n  ) {\n    return _snd_seq_queue_info_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_info_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_malloc>>(\n          'snd_seq_queue_info_malloc');\n  late final _dart_snd_seq_queue_info_malloc _snd_seq_queue_info_malloc =\n      _snd_seq_queue_info_malloc_ptr\n          .asFunction<_dart_snd_seq_queue_info_malloc>();\n\n  void snd_seq_queue_info_free(\n    ffi.Pointer<snd_seq_queue_info_> ptr,\n  ) {\n    return _snd_seq_queue_info_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_info_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_free>>(\n          'snd_seq_queue_info_free');\n  late final _dart_snd_seq_queue_info_free _snd_seq_queue_info_free =\n      _snd_seq_queue_info_free_ptr.asFunction<_dart_snd_seq_queue_info_free>();\n\n  void snd_seq_queue_info_copy(\n    ffi.Pointer<snd_seq_queue_info_> dst,\n    ffi.Pointer<snd_seq_queue_info_> src,\n  ) {\n    return _snd_seq_queue_info_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_queue_info_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_copy>>(\n          'snd_seq_queue_info_copy');\n  late final _dart_snd_seq_queue_info_copy _snd_seq_queue_info_copy =\n      _snd_seq_queue_info_copy_ptr.asFunction<_dart_snd_seq_queue_info_copy>();\n\n  int snd_seq_queue_info_get_queue(\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_queue_info_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_info_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_get_queue>>(\n          'snd_seq_queue_info_get_queue');\n  late final _dart_snd_seq_queue_info_get_queue _snd_seq_queue_info_get_queue =\n      _snd_seq_queue_info_get_queue_ptr\n          .asFunction<_dart_snd_seq_queue_info_get_queue>();\n\n  ffi.Pointer<ffi.Int8> snd_seq_queue_info_get_name(\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_queue_info_get_name(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_info_get_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_get_name>>(\n          'snd_seq_queue_info_get_name');\n  late final _dart_snd_seq_queue_info_get_name _snd_seq_queue_info_get_name =\n      _snd_seq_queue_info_get_name_ptr\n          .asFunction<_dart_snd_seq_queue_info_get_name>();\n\n  int snd_seq_queue_info_get_owner(\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_queue_info_get_owner(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_info_get_owner_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_get_owner>>(\n          'snd_seq_queue_info_get_owner');\n  late final _dart_snd_seq_queue_info_get_owner _snd_seq_queue_info_get_owner =\n      _snd_seq_queue_info_get_owner_ptr\n          .asFunction<_dart_snd_seq_queue_info_get_owner>();\n\n  int snd_seq_queue_info_get_locked(\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_queue_info_get_locked(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_info_get_locked_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_get_locked>>(\n          'snd_seq_queue_info_get_locked');\n  late final _dart_snd_seq_queue_info_get_locked\n      _snd_seq_queue_info_get_locked = _snd_seq_queue_info_get_locked_ptr\n          .asFunction<_dart_snd_seq_queue_info_get_locked>();\n\n  int snd_seq_queue_info_get_flags(\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_queue_info_get_flags(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_info_get_flags_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_get_flags>>(\n          'snd_seq_queue_info_get_flags');\n  late final _dart_snd_seq_queue_info_get_flags _snd_seq_queue_info_get_flags =\n      _snd_seq_queue_info_get_flags_ptr\n          .asFunction<_dart_snd_seq_queue_info_get_flags>();\n\n  void snd_seq_queue_info_set_name(\n    ffi.Pointer<snd_seq_queue_info_> info,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_queue_info_set_name(\n      info,\n      name,\n    );\n  }\n\n  late final _snd_seq_queue_info_set_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_set_name>>(\n          'snd_seq_queue_info_set_name');\n  late final _dart_snd_seq_queue_info_set_name _snd_seq_queue_info_set_name =\n      _snd_seq_queue_info_set_name_ptr\n          .asFunction<_dart_snd_seq_queue_info_set_name>();\n\n  void snd_seq_queue_info_set_owner(\n    ffi.Pointer<snd_seq_queue_info_> info,\n    int owner,\n  ) {\n    return _snd_seq_queue_info_set_owner(\n      info,\n      owner,\n    );\n  }\n\n  late final _snd_seq_queue_info_set_owner_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_set_owner>>(\n          'snd_seq_queue_info_set_owner');\n  late final _dart_snd_seq_queue_info_set_owner _snd_seq_queue_info_set_owner =\n      _snd_seq_queue_info_set_owner_ptr\n          .asFunction<_dart_snd_seq_queue_info_set_owner>();\n\n  void snd_seq_queue_info_set_locked(\n    ffi.Pointer<snd_seq_queue_info_> info,\n    int locked,\n  ) {\n    return _snd_seq_queue_info_set_locked(\n      info,\n      locked,\n    );\n  }\n\n  late final _snd_seq_queue_info_set_locked_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_set_locked>>(\n          'snd_seq_queue_info_set_locked');\n  late final _dart_snd_seq_queue_info_set_locked\n      _snd_seq_queue_info_set_locked = _snd_seq_queue_info_set_locked_ptr\n          .asFunction<_dart_snd_seq_queue_info_set_locked>();\n\n  void snd_seq_queue_info_set_flags(\n    ffi.Pointer<snd_seq_queue_info_> info,\n    int flags,\n  ) {\n    return _snd_seq_queue_info_set_flags(\n      info,\n      flags,\n    );\n  }\n\n  late final _snd_seq_queue_info_set_flags_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_info_set_flags>>(\n          'snd_seq_queue_info_set_flags');\n  late final _dart_snd_seq_queue_info_set_flags _snd_seq_queue_info_set_flags =\n      _snd_seq_queue_info_set_flags_ptr\n          .asFunction<_dart_snd_seq_queue_info_set_flags>();\n\n  int snd_seq_create_queue(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_create_queue(\n      seq,\n      info,\n    );\n  }\n\n  late final _snd_seq_create_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_create_queue>>(\n          'snd_seq_create_queue');\n  late final _dart_snd_seq_create_queue _snd_seq_create_queue =\n      _snd_seq_create_queue_ptr.asFunction<_dart_snd_seq_create_queue>();\n\n  int snd_seq_alloc_named_queue(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_alloc_named_queue(\n      seq,\n      name,\n    );\n  }\n\n  late final _snd_seq_alloc_named_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_alloc_named_queue>>(\n          'snd_seq_alloc_named_queue');\n  late final _dart_snd_seq_alloc_named_queue _snd_seq_alloc_named_queue =\n      _snd_seq_alloc_named_queue_ptr\n          .asFunction<_dart_snd_seq_alloc_named_queue>();\n\n  int snd_seq_alloc_queue(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_alloc_queue(\n      handle,\n    );\n  }\n\n  late final _snd_seq_alloc_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_alloc_queue>>(\n          'snd_seq_alloc_queue');\n  late final _dart_snd_seq_alloc_queue _snd_seq_alloc_queue =\n      _snd_seq_alloc_queue_ptr.asFunction<_dart_snd_seq_alloc_queue>();\n\n  int snd_seq_free_queue(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n  ) {\n    return _snd_seq_free_queue(\n      handle,\n      q,\n    );\n  }\n\n  late final _snd_seq_free_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_free_queue>>('snd_seq_free_queue');\n  late final _dart_snd_seq_free_queue _snd_seq_free_queue =\n      _snd_seq_free_queue_ptr.asFunction<_dart_snd_seq_free_queue>();\n\n  int snd_seq_get_queue_info(\n    ffi.Pointer<snd_seq_> seq,\n    int q,\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_get_queue_info(\n      seq,\n      q,\n      info,\n    );\n  }\n\n  late final _snd_seq_get_queue_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_queue_info>>(\n          'snd_seq_get_queue_info');\n  late final _dart_snd_seq_get_queue_info _snd_seq_get_queue_info =\n      _snd_seq_get_queue_info_ptr.asFunction<_dart_snd_seq_get_queue_info>();\n\n  int snd_seq_set_queue_info(\n    ffi.Pointer<snd_seq_> seq,\n    int q,\n    ffi.Pointer<snd_seq_queue_info_> info,\n  ) {\n    return _snd_seq_set_queue_info(\n      seq,\n      q,\n      info,\n    );\n  }\n\n  late final _snd_seq_set_queue_info_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_queue_info>>(\n          'snd_seq_set_queue_info');\n  late final _dart_snd_seq_set_queue_info _snd_seq_set_queue_info =\n      _snd_seq_set_queue_info_ptr.asFunction<_dart_snd_seq_set_queue_info>();\n\n  int snd_seq_query_named_queue(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_query_named_queue(\n      seq,\n      name,\n    );\n  }\n\n  late final _snd_seq_query_named_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_query_named_queue>>(\n          'snd_seq_query_named_queue');\n  late final _dart_snd_seq_query_named_queue _snd_seq_query_named_queue =\n      _snd_seq_query_named_queue_ptr\n          .asFunction<_dart_snd_seq_query_named_queue>();\n\n  int snd_seq_get_queue_usage(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n  ) {\n    return _snd_seq_get_queue_usage(\n      handle,\n      q,\n    );\n  }\n\n  late final _snd_seq_get_queue_usage_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_queue_usage>>(\n          'snd_seq_get_queue_usage');\n  late final _dart_snd_seq_get_queue_usage _snd_seq_get_queue_usage =\n      _snd_seq_get_queue_usage_ptr.asFunction<_dart_snd_seq_get_queue_usage>();\n\n  int snd_seq_set_queue_usage(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    int used,\n  ) {\n    return _snd_seq_set_queue_usage(\n      handle,\n      q,\n      used,\n    );\n  }\n\n  late final _snd_seq_set_queue_usage_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_queue_usage>>(\n          'snd_seq_set_queue_usage');\n  late final _dart_snd_seq_set_queue_usage _snd_seq_set_queue_usage =\n      _snd_seq_set_queue_usage_ptr.asFunction<_dart_snd_seq_set_queue_usage>();\n\n  int snd_seq_queue_status_sizeof() {\n    return _snd_seq_queue_status_sizeof();\n  }\n\n  late final _snd_seq_queue_status_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_sizeof>>(\n          'snd_seq_queue_status_sizeof');\n  late final _dart_snd_seq_queue_status_sizeof _snd_seq_queue_status_sizeof =\n      _snd_seq_queue_status_sizeof_ptr\n          .asFunction<_dart_snd_seq_queue_status_sizeof>();\n\n  int snd_seq_queue_status_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_queue_status_>> ptr,\n  ) {\n    return _snd_seq_queue_status_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_status_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_malloc>>(\n          'snd_seq_queue_status_malloc');\n  late final _dart_snd_seq_queue_status_malloc _snd_seq_queue_status_malloc =\n      _snd_seq_queue_status_malloc_ptr\n          .asFunction<_dart_snd_seq_queue_status_malloc>();\n\n  void snd_seq_queue_status_free(\n    ffi.Pointer<snd_seq_queue_status_> ptr,\n  ) {\n    return _snd_seq_queue_status_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_status_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_free>>(\n          'snd_seq_queue_status_free');\n  late final _dart_snd_seq_queue_status_free _snd_seq_queue_status_free =\n      _snd_seq_queue_status_free_ptr\n          .asFunction<_dart_snd_seq_queue_status_free>();\n\n  void snd_seq_queue_status_copy(\n    ffi.Pointer<snd_seq_queue_status_> dst,\n    ffi.Pointer<snd_seq_queue_status_> src,\n  ) {\n    return _snd_seq_queue_status_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_queue_status_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_copy>>(\n          'snd_seq_queue_status_copy');\n  late final _dart_snd_seq_queue_status_copy _snd_seq_queue_status_copy =\n      _snd_seq_queue_status_copy_ptr\n          .asFunction<_dart_snd_seq_queue_status_copy>();\n\n  int snd_seq_queue_status_get_queue(\n    ffi.Pointer<snd_seq_queue_status_> info,\n  ) {\n    return _snd_seq_queue_status_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_status_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_get_queue>>(\n          'snd_seq_queue_status_get_queue');\n  late final _dart_snd_seq_queue_status_get_queue\n      _snd_seq_queue_status_get_queue = _snd_seq_queue_status_get_queue_ptr\n          .asFunction<_dart_snd_seq_queue_status_get_queue>();\n\n  int snd_seq_queue_status_get_events(\n    ffi.Pointer<snd_seq_queue_status_> info,\n  ) {\n    return _snd_seq_queue_status_get_events(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_status_get_events_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_get_events>>(\n          'snd_seq_queue_status_get_events');\n  late final _dart_snd_seq_queue_status_get_events\n      _snd_seq_queue_status_get_events = _snd_seq_queue_status_get_events_ptr\n          .asFunction<_dart_snd_seq_queue_status_get_events>();\n\n  int snd_seq_queue_status_get_tick_time(\n    ffi.Pointer<snd_seq_queue_status_> info,\n  ) {\n    return _snd_seq_queue_status_get_tick_time(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_status_get_tick_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_get_tick_time>>(\n          'snd_seq_queue_status_get_tick_time');\n  late final _dart_snd_seq_queue_status_get_tick_time\n      _snd_seq_queue_status_get_tick_time =\n      _snd_seq_queue_status_get_tick_time_ptr\n          .asFunction<_dart_snd_seq_queue_status_get_tick_time>();\n\n  ffi.Pointer<snd_seq_real_time_t> snd_seq_queue_status_get_real_time(\n    ffi.Pointer<snd_seq_queue_status_> info,\n  ) {\n    return _snd_seq_queue_status_get_real_time(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_status_get_real_time_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_get_real_time>>(\n          'snd_seq_queue_status_get_real_time');\n  late final _dart_snd_seq_queue_status_get_real_time\n      _snd_seq_queue_status_get_real_time =\n      _snd_seq_queue_status_get_real_time_ptr\n          .asFunction<_dart_snd_seq_queue_status_get_real_time>();\n\n  int snd_seq_queue_status_get_status(\n    ffi.Pointer<snd_seq_queue_status_> info,\n  ) {\n    return _snd_seq_queue_status_get_status(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_status_get_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_status_get_status>>(\n          'snd_seq_queue_status_get_status');\n  late final _dart_snd_seq_queue_status_get_status\n      _snd_seq_queue_status_get_status = _snd_seq_queue_status_get_status_ptr\n          .asFunction<_dart_snd_seq_queue_status_get_status>();\n\n  int snd_seq_get_queue_status(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    ffi.Pointer<snd_seq_queue_status_> status,\n  ) {\n    return _snd_seq_get_queue_status(\n      handle,\n      q,\n      status,\n    );\n  }\n\n  late final _snd_seq_get_queue_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_queue_status>>(\n          'snd_seq_get_queue_status');\n  late final _dart_snd_seq_get_queue_status _snd_seq_get_queue_status =\n      _snd_seq_get_queue_status_ptr\n          .asFunction<_dart_snd_seq_get_queue_status>();\n\n  int snd_seq_queue_tempo_sizeof() {\n    return _snd_seq_queue_tempo_sizeof();\n  }\n\n  late final _snd_seq_queue_tempo_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_sizeof>>(\n          'snd_seq_queue_tempo_sizeof');\n  late final _dart_snd_seq_queue_tempo_sizeof _snd_seq_queue_tempo_sizeof =\n      _snd_seq_queue_tempo_sizeof_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_sizeof>();\n\n  int snd_seq_queue_tempo_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_queue_tempo_>> ptr,\n  ) {\n    return _snd_seq_queue_tempo_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_malloc>>(\n          'snd_seq_queue_tempo_malloc');\n  late final _dart_snd_seq_queue_tempo_malloc _snd_seq_queue_tempo_malloc =\n      _snd_seq_queue_tempo_malloc_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_malloc>();\n\n  void snd_seq_queue_tempo_free(\n    ffi.Pointer<snd_seq_queue_tempo_> ptr,\n  ) {\n    return _snd_seq_queue_tempo_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_free>>(\n          'snd_seq_queue_tempo_free');\n  late final _dart_snd_seq_queue_tempo_free _snd_seq_queue_tempo_free =\n      _snd_seq_queue_tempo_free_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_free>();\n\n  void snd_seq_queue_tempo_copy(\n    ffi.Pointer<snd_seq_queue_tempo_> dst,\n    ffi.Pointer<snd_seq_queue_tempo_> src,\n  ) {\n    return _snd_seq_queue_tempo_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_copy>>(\n          'snd_seq_queue_tempo_copy');\n  late final _dart_snd_seq_queue_tempo_copy _snd_seq_queue_tempo_copy =\n      _snd_seq_queue_tempo_copy_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_copy>();\n\n  int snd_seq_queue_tempo_get_queue(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n  ) {\n    return _snd_seq_queue_tempo_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_get_queue>>(\n          'snd_seq_queue_tempo_get_queue');\n  late final _dart_snd_seq_queue_tempo_get_queue\n      _snd_seq_queue_tempo_get_queue = _snd_seq_queue_tempo_get_queue_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_get_queue>();\n\n  int snd_seq_queue_tempo_get_tempo(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n  ) {\n    return _snd_seq_queue_tempo_get_tempo(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_get_tempo_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_get_tempo>>(\n          'snd_seq_queue_tempo_get_tempo');\n  late final _dart_snd_seq_queue_tempo_get_tempo\n      _snd_seq_queue_tempo_get_tempo = _snd_seq_queue_tempo_get_tempo_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_get_tempo>();\n\n  int snd_seq_queue_tempo_get_ppq(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n  ) {\n    return _snd_seq_queue_tempo_get_ppq(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_get_ppq_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_get_ppq>>(\n          'snd_seq_queue_tempo_get_ppq');\n  late final _dart_snd_seq_queue_tempo_get_ppq _snd_seq_queue_tempo_get_ppq =\n      _snd_seq_queue_tempo_get_ppq_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_get_ppq>();\n\n  int snd_seq_queue_tempo_get_skew(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n  ) {\n    return _snd_seq_queue_tempo_get_skew(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_get_skew_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_get_skew>>(\n          'snd_seq_queue_tempo_get_skew');\n  late final _dart_snd_seq_queue_tempo_get_skew _snd_seq_queue_tempo_get_skew =\n      _snd_seq_queue_tempo_get_skew_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_get_skew>();\n\n  int snd_seq_queue_tempo_get_skew_base(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n  ) {\n    return _snd_seq_queue_tempo_get_skew_base(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_get_skew_base_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_get_skew_base>>(\n          'snd_seq_queue_tempo_get_skew_base');\n  late final _dart_snd_seq_queue_tempo_get_skew_base\n      _snd_seq_queue_tempo_get_skew_base =\n      _snd_seq_queue_tempo_get_skew_base_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_get_skew_base>();\n\n  void snd_seq_queue_tempo_set_tempo(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n    int tempo,\n  ) {\n    return _snd_seq_queue_tempo_set_tempo(\n      info,\n      tempo,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_set_tempo_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_set_tempo>>(\n          'snd_seq_queue_tempo_set_tempo');\n  late final _dart_snd_seq_queue_tempo_set_tempo\n      _snd_seq_queue_tempo_set_tempo = _snd_seq_queue_tempo_set_tempo_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_set_tempo>();\n\n  void snd_seq_queue_tempo_set_ppq(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n    int ppq,\n  ) {\n    return _snd_seq_queue_tempo_set_ppq(\n      info,\n      ppq,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_set_ppq_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_set_ppq>>(\n          'snd_seq_queue_tempo_set_ppq');\n  late final _dart_snd_seq_queue_tempo_set_ppq _snd_seq_queue_tempo_set_ppq =\n      _snd_seq_queue_tempo_set_ppq_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_set_ppq>();\n\n  void snd_seq_queue_tempo_set_skew(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n    int skew,\n  ) {\n    return _snd_seq_queue_tempo_set_skew(\n      info,\n      skew,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_set_skew_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_set_skew>>(\n          'snd_seq_queue_tempo_set_skew');\n  late final _dart_snd_seq_queue_tempo_set_skew _snd_seq_queue_tempo_set_skew =\n      _snd_seq_queue_tempo_set_skew_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_set_skew>();\n\n  void snd_seq_queue_tempo_set_skew_base(\n    ffi.Pointer<snd_seq_queue_tempo_> info,\n    int base,\n  ) {\n    return _snd_seq_queue_tempo_set_skew_base(\n      info,\n      base,\n    );\n  }\n\n  late final _snd_seq_queue_tempo_set_skew_base_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_tempo_set_skew_base>>(\n          'snd_seq_queue_tempo_set_skew_base');\n  late final _dart_snd_seq_queue_tempo_set_skew_base\n      _snd_seq_queue_tempo_set_skew_base =\n      _snd_seq_queue_tempo_set_skew_base_ptr\n          .asFunction<_dart_snd_seq_queue_tempo_set_skew_base>();\n\n  int snd_seq_get_queue_tempo(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    ffi.Pointer<snd_seq_queue_tempo_> tempo,\n  ) {\n    return _snd_seq_get_queue_tempo(\n      handle,\n      q,\n      tempo,\n    );\n  }\n\n  late final _snd_seq_get_queue_tempo_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_queue_tempo>>(\n          'snd_seq_get_queue_tempo');\n  late final _dart_snd_seq_get_queue_tempo _snd_seq_get_queue_tempo =\n      _snd_seq_get_queue_tempo_ptr.asFunction<_dart_snd_seq_get_queue_tempo>();\n\n  int snd_seq_set_queue_tempo(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    ffi.Pointer<snd_seq_queue_tempo_> tempo,\n  ) {\n    return _snd_seq_set_queue_tempo(\n      handle,\n      q,\n      tempo,\n    );\n  }\n\n  late final _snd_seq_set_queue_tempo_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_queue_tempo>>(\n          'snd_seq_set_queue_tempo');\n  late final _dart_snd_seq_set_queue_tempo _snd_seq_set_queue_tempo =\n      _snd_seq_set_queue_tempo_ptr.asFunction<_dart_snd_seq_set_queue_tempo>();\n\n  int snd_seq_queue_timer_sizeof() {\n    return _snd_seq_queue_timer_sizeof();\n  }\n\n  late final _snd_seq_queue_timer_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_sizeof>>(\n          'snd_seq_queue_timer_sizeof');\n  late final _dart_snd_seq_queue_timer_sizeof _snd_seq_queue_timer_sizeof =\n      _snd_seq_queue_timer_sizeof_ptr\n          .asFunction<_dart_snd_seq_queue_timer_sizeof>();\n\n  int snd_seq_queue_timer_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_queue_timer_>> ptr,\n  ) {\n    return _snd_seq_queue_timer_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_timer_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_malloc>>(\n          'snd_seq_queue_timer_malloc');\n  late final _dart_snd_seq_queue_timer_malloc _snd_seq_queue_timer_malloc =\n      _snd_seq_queue_timer_malloc_ptr\n          .asFunction<_dart_snd_seq_queue_timer_malloc>();\n\n  void snd_seq_queue_timer_free(\n    ffi.Pointer<snd_seq_queue_timer_> ptr,\n  ) {\n    return _snd_seq_queue_timer_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_queue_timer_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_free>>(\n          'snd_seq_queue_timer_free');\n  late final _dart_snd_seq_queue_timer_free _snd_seq_queue_timer_free =\n      _snd_seq_queue_timer_free_ptr\n          .asFunction<_dart_snd_seq_queue_timer_free>();\n\n  void snd_seq_queue_timer_copy(\n    ffi.Pointer<snd_seq_queue_timer_> dst,\n    ffi.Pointer<snd_seq_queue_timer_> src,\n  ) {\n    return _snd_seq_queue_timer_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_queue_timer_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_copy>>(\n          'snd_seq_queue_timer_copy');\n  late final _dart_snd_seq_queue_timer_copy _snd_seq_queue_timer_copy =\n      _snd_seq_queue_timer_copy_ptr\n          .asFunction<_dart_snd_seq_queue_timer_copy>();\n\n  int snd_seq_queue_timer_get_queue(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n  ) {\n    return _snd_seq_queue_timer_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_timer_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_get_queue>>(\n          'snd_seq_queue_timer_get_queue');\n  late final _dart_snd_seq_queue_timer_get_queue\n      _snd_seq_queue_timer_get_queue = _snd_seq_queue_timer_get_queue_ptr\n          .asFunction<_dart_snd_seq_queue_timer_get_queue>();\n\n  int snd_seq_queue_timer_get_type(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n  ) {\n    return _snd_seq_queue_timer_get_type(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_timer_get_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_get_type>>(\n          'snd_seq_queue_timer_get_type');\n  late final _dart_snd_seq_queue_timer_get_type _snd_seq_queue_timer_get_type =\n      _snd_seq_queue_timer_get_type_ptr\n          .asFunction<_dart_snd_seq_queue_timer_get_type>();\n\n  ffi.Pointer<snd_timer_id_> snd_seq_queue_timer_get_id(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n  ) {\n    return _snd_seq_queue_timer_get_id(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_timer_get_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_get_id>>(\n          'snd_seq_queue_timer_get_id');\n  late final _dart_snd_seq_queue_timer_get_id _snd_seq_queue_timer_get_id =\n      _snd_seq_queue_timer_get_id_ptr\n          .asFunction<_dart_snd_seq_queue_timer_get_id>();\n\n  int snd_seq_queue_timer_get_resolution(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n  ) {\n    return _snd_seq_queue_timer_get_resolution(\n      info,\n    );\n  }\n\n  late final _snd_seq_queue_timer_get_resolution_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_get_resolution>>(\n          'snd_seq_queue_timer_get_resolution');\n  late final _dart_snd_seq_queue_timer_get_resolution\n      _snd_seq_queue_timer_get_resolution =\n      _snd_seq_queue_timer_get_resolution_ptr\n          .asFunction<_dart_snd_seq_queue_timer_get_resolution>();\n\n  void snd_seq_queue_timer_set_type(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n    int type,\n  ) {\n    return _snd_seq_queue_timer_set_type(\n      info,\n      type,\n    );\n  }\n\n  late final _snd_seq_queue_timer_set_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_set_type>>(\n          'snd_seq_queue_timer_set_type');\n  late final _dart_snd_seq_queue_timer_set_type _snd_seq_queue_timer_set_type =\n      _snd_seq_queue_timer_set_type_ptr\n          .asFunction<_dart_snd_seq_queue_timer_set_type>();\n\n  void snd_seq_queue_timer_set_id(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n    ffi.Pointer<snd_timer_id_> id,\n  ) {\n    return _snd_seq_queue_timer_set_id(\n      info,\n      id,\n    );\n  }\n\n  late final _snd_seq_queue_timer_set_id_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_set_id>>(\n          'snd_seq_queue_timer_set_id');\n  late final _dart_snd_seq_queue_timer_set_id _snd_seq_queue_timer_set_id =\n      _snd_seq_queue_timer_set_id_ptr\n          .asFunction<_dart_snd_seq_queue_timer_set_id>();\n\n  void snd_seq_queue_timer_set_resolution(\n    ffi.Pointer<snd_seq_queue_timer_> info,\n    int resolution,\n  ) {\n    return _snd_seq_queue_timer_set_resolution(\n      info,\n      resolution,\n    );\n  }\n\n  late final _snd_seq_queue_timer_set_resolution_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_queue_timer_set_resolution>>(\n          'snd_seq_queue_timer_set_resolution');\n  late final _dart_snd_seq_queue_timer_set_resolution\n      _snd_seq_queue_timer_set_resolution =\n      _snd_seq_queue_timer_set_resolution_ptr\n          .asFunction<_dart_snd_seq_queue_timer_set_resolution>();\n\n  int snd_seq_get_queue_timer(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    ffi.Pointer<snd_seq_queue_timer_> timer,\n  ) {\n    return _snd_seq_get_queue_timer(\n      handle,\n      q,\n      timer,\n    );\n  }\n\n  late final _snd_seq_get_queue_timer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_queue_timer>>(\n          'snd_seq_get_queue_timer');\n  late final _dart_snd_seq_get_queue_timer _snd_seq_get_queue_timer =\n      _snd_seq_get_queue_timer_ptr.asFunction<_dart_snd_seq_get_queue_timer>();\n\n  int snd_seq_set_queue_timer(\n    ffi.Pointer<snd_seq_> handle,\n    int q,\n    ffi.Pointer<snd_seq_queue_timer_> timer,\n  ) {\n    return _snd_seq_set_queue_timer(\n      handle,\n      q,\n      timer,\n    );\n  }\n\n  late final _snd_seq_set_queue_timer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_queue_timer>>(\n          'snd_seq_set_queue_timer');\n  late final _dart_snd_seq_set_queue_timer _snd_seq_set_queue_timer =\n      _snd_seq_set_queue_timer_ptr.asFunction<_dart_snd_seq_set_queue_timer>();\n\n  int snd_seq_free_event(\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_free_event(\n      ev,\n    );\n  }\n\n  late final _snd_seq_free_event_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_free_event>>('snd_seq_free_event');\n  late final _dart_snd_seq_free_event _snd_seq_free_event =\n      _snd_seq_free_event_ptr.asFunction<_dart_snd_seq_free_event>();\n\n  int snd_seq_event_length(\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_event_length(\n      ev,\n    );\n  }\n\n  late final _snd_seq_event_length_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_length>>(\n          'snd_seq_event_length');\n  late final _dart_snd_seq_event_length _snd_seq_event_length =\n      _snd_seq_event_length_ptr.asFunction<_dart_snd_seq_event_length>();\n\n  int snd_seq_event_output(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_event_output(\n      handle,\n      ev,\n    );\n  }\n\n  late final _snd_seq_event_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_output>>(\n          'snd_seq_event_output');\n  late final _dart_snd_seq_event_output _snd_seq_event_output =\n      _snd_seq_event_output_ptr.asFunction<_dart_snd_seq_event_output>();\n\n  int snd_seq_event_output_buffer(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_event_output_buffer(\n      handle,\n      ev,\n    );\n  }\n\n  late final _snd_seq_event_output_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_output_buffer>>(\n          'snd_seq_event_output_buffer');\n  late final _dart_snd_seq_event_output_buffer _snd_seq_event_output_buffer =\n      _snd_seq_event_output_buffer_ptr\n          .asFunction<_dart_snd_seq_event_output_buffer>();\n\n  int snd_seq_event_output_direct(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_event_output_direct(\n      handle,\n      ev,\n    );\n  }\n\n  late final _snd_seq_event_output_direct_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_output_direct>>(\n          'snd_seq_event_output_direct');\n  late final _dart_snd_seq_event_output_direct _snd_seq_event_output_direct =\n      _snd_seq_event_output_direct_ptr\n          .asFunction<_dart_snd_seq_event_output_direct>();\n\n  int snd_seq_event_input(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n  ) {\n    return _snd_seq_event_input(\n      handle,\n      ev,\n    );\n  }\n\n  late final _snd_seq_event_input_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_input>>(\n          'snd_seq_event_input');\n  late final _dart_snd_seq_event_input _snd_seq_event_input =\n      _snd_seq_event_input_ptr.asFunction<_dart_snd_seq_event_input>();\n\n  int snd_seq_event_input_pending(\n    ffi.Pointer<snd_seq_> seq,\n    int fetch_sequencer,\n  ) {\n    return _snd_seq_event_input_pending(\n      seq,\n      fetch_sequencer,\n    );\n  }\n\n  late final _snd_seq_event_input_pending_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_input_pending>>(\n          'snd_seq_event_input_pending');\n  late final _dart_snd_seq_event_input_pending _snd_seq_event_input_pending =\n      _snd_seq_event_input_pending_ptr\n          .asFunction<_dart_snd_seq_event_input_pending>();\n\n  int snd_seq_drain_output(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_drain_output(\n      handle,\n    );\n  }\n\n  late final _snd_seq_drain_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_drain_output>>(\n          'snd_seq_drain_output');\n  late final _dart_snd_seq_drain_output _snd_seq_drain_output =\n      _snd_seq_drain_output_ptr.asFunction<_dart_snd_seq_drain_output>();\n\n  int snd_seq_event_output_pending(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_event_output_pending(\n      seq,\n    );\n  }\n\n  late final _snd_seq_event_output_pending_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_event_output_pending>>(\n          'snd_seq_event_output_pending');\n  late final _dart_snd_seq_event_output_pending _snd_seq_event_output_pending =\n      _snd_seq_event_output_pending_ptr\n          .asFunction<_dart_snd_seq_event_output_pending>();\n\n  int snd_seq_extract_output(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n  ) {\n    return _snd_seq_extract_output(\n      handle,\n      ev,\n    );\n  }\n\n  late final _snd_seq_extract_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_extract_output>>(\n          'snd_seq_extract_output');\n  late final _dart_snd_seq_extract_output _snd_seq_extract_output =\n      _snd_seq_extract_output_ptr.asFunction<_dart_snd_seq_extract_output>();\n\n  int snd_seq_drop_output(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_drop_output(\n      handle,\n    );\n  }\n\n  late final _snd_seq_drop_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_drop_output>>(\n          'snd_seq_drop_output');\n  late final _dart_snd_seq_drop_output _snd_seq_drop_output =\n      _snd_seq_drop_output_ptr.asFunction<_dart_snd_seq_drop_output>();\n\n  int snd_seq_drop_output_buffer(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_drop_output_buffer(\n      handle,\n    );\n  }\n\n  late final _snd_seq_drop_output_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_drop_output_buffer>>(\n          'snd_seq_drop_output_buffer');\n  late final _dart_snd_seq_drop_output_buffer _snd_seq_drop_output_buffer =\n      _snd_seq_drop_output_buffer_ptr\n          .asFunction<_dart_snd_seq_drop_output_buffer>();\n\n  int snd_seq_drop_input(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_drop_input(\n      handle,\n    );\n  }\n\n  late final _snd_seq_drop_input_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_drop_input>>('snd_seq_drop_input');\n  late final _dart_snd_seq_drop_input _snd_seq_drop_input =\n      _snd_seq_drop_input_ptr.asFunction<_dart_snd_seq_drop_input>();\n\n  int snd_seq_drop_input_buffer(\n    ffi.Pointer<snd_seq_> handle,\n  ) {\n    return _snd_seq_drop_input_buffer(\n      handle,\n    );\n  }\n\n  late final _snd_seq_drop_input_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_drop_input_buffer>>(\n          'snd_seq_drop_input_buffer');\n  late final _dart_snd_seq_drop_input_buffer _snd_seq_drop_input_buffer =\n      _snd_seq_drop_input_buffer_ptr\n          .asFunction<_dart_snd_seq_drop_input_buffer>();\n\n  int snd_seq_remove_events_sizeof() {\n    return _snd_seq_remove_events_sizeof();\n  }\n\n  late final _snd_seq_remove_events_sizeof_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_sizeof>>(\n          'snd_seq_remove_events_sizeof');\n  late final _dart_snd_seq_remove_events_sizeof _snd_seq_remove_events_sizeof =\n      _snd_seq_remove_events_sizeof_ptr\n          .asFunction<_dart_snd_seq_remove_events_sizeof>();\n\n  int snd_seq_remove_events_malloc(\n    ffi.Pointer<ffi.Pointer<snd_seq_remove_events_>> ptr,\n  ) {\n    return _snd_seq_remove_events_malloc(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_remove_events_malloc_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_malloc>>(\n          'snd_seq_remove_events_malloc');\n  late final _dart_snd_seq_remove_events_malloc _snd_seq_remove_events_malloc =\n      _snd_seq_remove_events_malloc_ptr\n          .asFunction<_dart_snd_seq_remove_events_malloc>();\n\n  void snd_seq_remove_events_free(\n    ffi.Pointer<snd_seq_remove_events_> ptr,\n  ) {\n    return _snd_seq_remove_events_free(\n      ptr,\n    );\n  }\n\n  late final _snd_seq_remove_events_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_free>>(\n          'snd_seq_remove_events_free');\n  late final _dart_snd_seq_remove_events_free _snd_seq_remove_events_free =\n      _snd_seq_remove_events_free_ptr\n          .asFunction<_dart_snd_seq_remove_events_free>();\n\n  void snd_seq_remove_events_copy(\n    ffi.Pointer<snd_seq_remove_events_> dst,\n    ffi.Pointer<snd_seq_remove_events_> src,\n  ) {\n    return _snd_seq_remove_events_copy(\n      dst,\n      src,\n    );\n  }\n\n  late final _snd_seq_remove_events_copy_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_copy>>(\n          'snd_seq_remove_events_copy');\n  late final _dart_snd_seq_remove_events_copy _snd_seq_remove_events_copy =\n      _snd_seq_remove_events_copy_ptr\n          .asFunction<_dart_snd_seq_remove_events_copy>();\n\n  int snd_seq_remove_events_get_condition(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_condition(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_condition_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_condition>>(\n          'snd_seq_remove_events_get_condition');\n  late final _dart_snd_seq_remove_events_get_condition\n      _snd_seq_remove_events_get_condition =\n      _snd_seq_remove_events_get_condition_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_condition>();\n\n  int snd_seq_remove_events_get_queue(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_queue(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_queue>>(\n          'snd_seq_remove_events_get_queue');\n  late final _dart_snd_seq_remove_events_get_queue\n      _snd_seq_remove_events_get_queue = _snd_seq_remove_events_get_queue_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_queue>();\n\n  ffi.Pointer<snd_seq_addr_t> snd_seq_remove_events_get_dest(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_dest(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_dest_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_dest>>(\n          'snd_seq_remove_events_get_dest');\n  late final _dart_snd_seq_remove_events_get_dest\n      _snd_seq_remove_events_get_dest = _snd_seq_remove_events_get_dest_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_dest>();\n\n  int snd_seq_remove_events_get_channel(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_channel(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_channel_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_channel>>(\n          'snd_seq_remove_events_get_channel');\n  late final _dart_snd_seq_remove_events_get_channel\n      _snd_seq_remove_events_get_channel =\n      _snd_seq_remove_events_get_channel_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_channel>();\n\n  int snd_seq_remove_events_get_event_type(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_event_type(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_event_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_event_type>>(\n          'snd_seq_remove_events_get_event_type');\n  late final _dart_snd_seq_remove_events_get_event_type\n      _snd_seq_remove_events_get_event_type =\n      _snd_seq_remove_events_get_event_type_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_event_type>();\n\n  int snd_seq_remove_events_get_tag(\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events_get_tag(\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_get_tag_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_get_tag>>(\n          'snd_seq_remove_events_get_tag');\n  late final _dart_snd_seq_remove_events_get_tag\n      _snd_seq_remove_events_get_tag = _snd_seq_remove_events_get_tag_ptr\n          .asFunction<_dart_snd_seq_remove_events_get_tag>();\n\n  void snd_seq_remove_events_set_condition(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    int flags,\n  ) {\n    return _snd_seq_remove_events_set_condition(\n      info,\n      flags,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_condition_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_condition>>(\n          'snd_seq_remove_events_set_condition');\n  late final _dart_snd_seq_remove_events_set_condition\n      _snd_seq_remove_events_set_condition =\n      _snd_seq_remove_events_set_condition_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_condition>();\n\n  void snd_seq_remove_events_set_queue(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    int queue,\n  ) {\n    return _snd_seq_remove_events_set_queue(\n      info,\n      queue,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_queue>>(\n          'snd_seq_remove_events_set_queue');\n  late final _dart_snd_seq_remove_events_set_queue\n      _snd_seq_remove_events_set_queue = _snd_seq_remove_events_set_queue_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_queue>();\n\n  void snd_seq_remove_events_set_dest(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    ffi.Pointer<snd_seq_addr_t> addr,\n  ) {\n    return _snd_seq_remove_events_set_dest(\n      info,\n      addr,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_dest_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_dest>>(\n          'snd_seq_remove_events_set_dest');\n  late final _dart_snd_seq_remove_events_set_dest\n      _snd_seq_remove_events_set_dest = _snd_seq_remove_events_set_dest_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_dest>();\n\n  void snd_seq_remove_events_set_channel(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    int channel,\n  ) {\n    return _snd_seq_remove_events_set_channel(\n      info,\n      channel,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_channel_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_channel>>(\n          'snd_seq_remove_events_set_channel');\n  late final _dart_snd_seq_remove_events_set_channel\n      _snd_seq_remove_events_set_channel =\n      _snd_seq_remove_events_set_channel_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_channel>();\n\n  void snd_seq_remove_events_set_event_type(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    int type,\n  ) {\n    return _snd_seq_remove_events_set_event_type(\n      info,\n      type,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_event_type_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_event_type>>(\n          'snd_seq_remove_events_set_event_type');\n  late final _dart_snd_seq_remove_events_set_event_type\n      _snd_seq_remove_events_set_event_type =\n      _snd_seq_remove_events_set_event_type_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_event_type>();\n\n  void snd_seq_remove_events_set_tag(\n    ffi.Pointer<snd_seq_remove_events_> info,\n    int tag,\n  ) {\n    return _snd_seq_remove_events_set_tag(\n      info,\n      tag,\n    );\n  }\n\n  late final _snd_seq_remove_events_set_tag_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events_set_tag>>(\n          'snd_seq_remove_events_set_tag');\n  late final _dart_snd_seq_remove_events_set_tag\n      _snd_seq_remove_events_set_tag = _snd_seq_remove_events_set_tag_ptr\n          .asFunction<_dart_snd_seq_remove_events_set_tag>();\n\n  int snd_seq_remove_events(\n    ffi.Pointer<snd_seq_> handle,\n    ffi.Pointer<snd_seq_remove_events_> info,\n  ) {\n    return _snd_seq_remove_events(\n      handle,\n      info,\n    );\n  }\n\n  late final _snd_seq_remove_events_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_remove_events>>(\n          'snd_seq_remove_events');\n  late final _dart_snd_seq_remove_events _snd_seq_remove_events =\n      _snd_seq_remove_events_ptr.asFunction<_dart_snd_seq_remove_events>();\n\n  void snd_seq_set_bit(\n    int nr,\n    ffi.Pointer<ffi.Void> array,\n  ) {\n    return _snd_seq_set_bit(\n      nr,\n      array,\n    );\n  }\n\n  late final _snd_seq_set_bit_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_bit>>('snd_seq_set_bit');\n  late final _dart_snd_seq_set_bit _snd_seq_set_bit =\n      _snd_seq_set_bit_ptr.asFunction<_dart_snd_seq_set_bit>();\n\n  void snd_seq_unset_bit(\n    int nr,\n    ffi.Pointer<ffi.Void> array,\n  ) {\n    return _snd_seq_unset_bit(\n      nr,\n      array,\n    );\n  }\n\n  late final _snd_seq_unset_bit_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_unset_bit>>('snd_seq_unset_bit');\n  late final _dart_snd_seq_unset_bit _snd_seq_unset_bit =\n      _snd_seq_unset_bit_ptr.asFunction<_dart_snd_seq_unset_bit>();\n\n  int snd_seq_change_bit(\n    int nr,\n    ffi.Pointer<ffi.Void> array,\n  ) {\n    return _snd_seq_change_bit(\n      nr,\n      array,\n    );\n  }\n\n  late final _snd_seq_change_bit_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_change_bit>>('snd_seq_change_bit');\n  late final _dart_snd_seq_change_bit _snd_seq_change_bit =\n      _snd_seq_change_bit_ptr.asFunction<_dart_snd_seq_change_bit>();\n\n  int snd_seq_get_bit(\n    int nr,\n    ffi.Pointer<ffi.Void> array,\n  ) {\n    return _snd_seq_get_bit(\n      nr,\n      array,\n    );\n  }\n\n  late final _snd_seq_get_bit_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_get_bit>>('snd_seq_get_bit');\n  late final _dart_snd_seq_get_bit _snd_seq_get_bit =\n      _snd_seq_get_bit_ptr.asFunction<_dart_snd_seq_get_bit>();\n\n  late final ffi.Pointer<ffi.Pointer<ffi.Uint32>> _snd_seq_event_types =\n      _lookup<ffi.Pointer<ffi.Uint32>>('snd_seq_event_types');\n\n  ffi.Pointer<ffi.Uint32> get snd_seq_event_types => _snd_seq_event_types.value;\n\n  set snd_seq_event_types(ffi.Pointer<ffi.Uint32> value) =>\n      _snd_seq_event_types.value = value;\n\n  int snd_seq_control_queue(\n    ffi.Pointer<snd_seq_> seq,\n    int q,\n    int type,\n    int value,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_seq_control_queue(\n      seq,\n      q,\n      type,\n      value,\n      ev,\n    );\n  }\n\n  late final _snd_seq_control_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_control_queue>>(\n          'snd_seq_control_queue');\n  late final _dart_snd_seq_control_queue _snd_seq_control_queue =\n      _snd_seq_control_queue_ptr.asFunction<_dart_snd_seq_control_queue>();\n\n  int snd_seq_create_simple_port(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<ffi.Int8> name,\n    int caps,\n    int type,\n  ) {\n    return _snd_seq_create_simple_port(\n      seq,\n      name,\n      caps,\n      type,\n    );\n  }\n\n  late final _snd_seq_create_simple_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_create_simple_port>>(\n          'snd_seq_create_simple_port');\n  late final _dart_snd_seq_create_simple_port _snd_seq_create_simple_port =\n      _snd_seq_create_simple_port_ptr\n          .asFunction<_dart_snd_seq_create_simple_port>();\n\n  int snd_seq_delete_simple_port(\n    ffi.Pointer<snd_seq_> seq,\n    int port,\n  ) {\n    return _snd_seq_delete_simple_port(\n      seq,\n      port,\n    );\n  }\n\n  late final _snd_seq_delete_simple_port_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_delete_simple_port>>(\n          'snd_seq_delete_simple_port');\n  late final _dart_snd_seq_delete_simple_port _snd_seq_delete_simple_port =\n      _snd_seq_delete_simple_port_ptr\n          .asFunction<_dart_snd_seq_delete_simple_port>();\n\n  int snd_seq_connect_from(\n    ffi.Pointer<snd_seq_> seq,\n    int my_port,\n    int src_client,\n    int src_port,\n  ) {\n    return _snd_seq_connect_from(\n      seq,\n      my_port,\n      src_client,\n      src_port,\n    );\n  }\n\n  late final _snd_seq_connect_from_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_connect_from>>(\n          'snd_seq_connect_from');\n  late final _dart_snd_seq_connect_from _snd_seq_connect_from =\n      _snd_seq_connect_from_ptr.asFunction<_dart_snd_seq_connect_from>();\n\n  int snd_seq_connect_to(\n    ffi.Pointer<snd_seq_> seq,\n    int my_port,\n    int dest_client,\n    int dest_port,\n  ) {\n    return _snd_seq_connect_to(\n      seq,\n      my_port,\n      dest_client,\n      dest_port,\n    );\n  }\n\n  late final _snd_seq_connect_to_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_connect_to>>('snd_seq_connect_to');\n  late final _dart_snd_seq_connect_to _snd_seq_connect_to =\n      _snd_seq_connect_to_ptr.asFunction<_dart_snd_seq_connect_to>();\n\n  int snd_seq_disconnect_from(\n    ffi.Pointer<snd_seq_> seq,\n    int my_port,\n    int src_client,\n    int src_port,\n  ) {\n    return _snd_seq_disconnect_from(\n      seq,\n      my_port,\n      src_client,\n      src_port,\n    );\n  }\n\n  late final _snd_seq_disconnect_from_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_disconnect_from>>(\n          'snd_seq_disconnect_from');\n  late final _dart_snd_seq_disconnect_from _snd_seq_disconnect_from =\n      _snd_seq_disconnect_from_ptr.asFunction<_dart_snd_seq_disconnect_from>();\n\n  int snd_seq_disconnect_to(\n    ffi.Pointer<snd_seq_> seq,\n    int my_port,\n    int dest_client,\n    int dest_port,\n  ) {\n    return _snd_seq_disconnect_to(\n      seq,\n      my_port,\n      dest_client,\n      dest_port,\n    );\n  }\n\n  late final _snd_seq_disconnect_to_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_disconnect_to>>(\n          'snd_seq_disconnect_to');\n  late final _dart_snd_seq_disconnect_to _snd_seq_disconnect_to =\n      _snd_seq_disconnect_to_ptr.asFunction<_dart_snd_seq_disconnect_to>();\n\n  int snd_seq_set_client_name(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<ffi.Int8> name,\n  ) {\n    return _snd_seq_set_client_name(\n      seq,\n      name,\n    );\n  }\n\n  late final _snd_seq_set_client_name_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_name>>(\n          'snd_seq_set_client_name');\n  late final _dart_snd_seq_set_client_name _snd_seq_set_client_name =\n      _snd_seq_set_client_name_ptr.asFunction<_dart_snd_seq_set_client_name>();\n\n  int snd_seq_set_client_event_filter(\n    ffi.Pointer<snd_seq_> seq,\n    int event_type,\n  ) {\n    return _snd_seq_set_client_event_filter(\n      seq,\n      event_type,\n    );\n  }\n\n  late final _snd_seq_set_client_event_filter_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_event_filter>>(\n          'snd_seq_set_client_event_filter');\n  late final _dart_snd_seq_set_client_event_filter\n      _snd_seq_set_client_event_filter = _snd_seq_set_client_event_filter_ptr\n          .asFunction<_dart_snd_seq_set_client_event_filter>();\n\n  int snd_seq_set_client_pool_output(\n    ffi.Pointer<snd_seq_> seq,\n    int size,\n  ) {\n    return _snd_seq_set_client_pool_output(\n      seq,\n      size,\n    );\n  }\n\n  late final _snd_seq_set_client_pool_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_pool_output>>(\n          'snd_seq_set_client_pool_output');\n  late final _dart_snd_seq_set_client_pool_output\n      _snd_seq_set_client_pool_output = _snd_seq_set_client_pool_output_ptr\n          .asFunction<_dart_snd_seq_set_client_pool_output>();\n\n  int snd_seq_set_client_pool_output_room(\n    ffi.Pointer<snd_seq_> seq,\n    int size,\n  ) {\n    return _snd_seq_set_client_pool_output_room(\n      seq,\n      size,\n    );\n  }\n\n  late final _snd_seq_set_client_pool_output_room_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_pool_output_room>>(\n          'snd_seq_set_client_pool_output_room');\n  late final _dart_snd_seq_set_client_pool_output_room\n      _snd_seq_set_client_pool_output_room =\n      _snd_seq_set_client_pool_output_room_ptr\n          .asFunction<_dart_snd_seq_set_client_pool_output_room>();\n\n  int snd_seq_set_client_pool_input(\n    ffi.Pointer<snd_seq_> seq,\n    int size,\n  ) {\n    return _snd_seq_set_client_pool_input(\n      seq,\n      size,\n    );\n  }\n\n  late final _snd_seq_set_client_pool_input_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_set_client_pool_input>>(\n          'snd_seq_set_client_pool_input');\n  late final _dart_snd_seq_set_client_pool_input\n      _snd_seq_set_client_pool_input = _snd_seq_set_client_pool_input_ptr\n          .asFunction<_dart_snd_seq_set_client_pool_input>();\n\n  int snd_seq_sync_output_queue(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_sync_output_queue(\n      seq,\n    );\n  }\n\n  late final _snd_seq_sync_output_queue_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_sync_output_queue>>(\n          'snd_seq_sync_output_queue');\n  late final _dart_snd_seq_sync_output_queue _snd_seq_sync_output_queue =\n      _snd_seq_sync_output_queue_ptr\n          .asFunction<_dart_snd_seq_sync_output_queue>();\n\n  int snd_seq_parse_address(\n    ffi.Pointer<snd_seq_> seq,\n    ffi.Pointer<snd_seq_addr_t> addr,\n    ffi.Pointer<ffi.Int8> str,\n  ) {\n    return _snd_seq_parse_address(\n      seq,\n      addr,\n      str,\n    );\n  }\n\n  late final _snd_seq_parse_address_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_parse_address>>(\n          'snd_seq_parse_address');\n  late final _dart_snd_seq_parse_address _snd_seq_parse_address =\n      _snd_seq_parse_address_ptr.asFunction<_dart_snd_seq_parse_address>();\n\n  int snd_seq_reset_pool_output(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_reset_pool_output(\n      seq,\n    );\n  }\n\n  late final _snd_seq_reset_pool_output_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_reset_pool_output>>(\n          'snd_seq_reset_pool_output');\n  late final _dart_snd_seq_reset_pool_output _snd_seq_reset_pool_output =\n      _snd_seq_reset_pool_output_ptr\n          .asFunction<_dart_snd_seq_reset_pool_output>();\n\n  int snd_seq_reset_pool_input(\n    ffi.Pointer<snd_seq_> seq,\n  ) {\n    return _snd_seq_reset_pool_input(\n      seq,\n    );\n  }\n\n  late final _snd_seq_reset_pool_input_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_seq_reset_pool_input>>(\n          'snd_seq_reset_pool_input');\n  late final _dart_snd_seq_reset_pool_input _snd_seq_reset_pool_input =\n      _snd_seq_reset_pool_input_ptr\n          .asFunction<_dart_snd_seq_reset_pool_input>();\n\n  int snd_midi_event_new(\n    int bufsize,\n    ffi.Pointer<ffi.Pointer<snd_midi_event>> rdev,\n  ) {\n    return _snd_midi_event_new(\n      bufsize,\n      rdev,\n    );\n  }\n\n  late final _snd_midi_event_new_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_new>>('snd_midi_event_new');\n  late final _dart_snd_midi_event_new _snd_midi_event_new =\n      _snd_midi_event_new_ptr.asFunction<_dart_snd_midi_event_new>();\n\n  int snd_midi_event_resize_buffer(\n    ffi.Pointer<snd_midi_event> dev,\n    int bufsize,\n  ) {\n    return _snd_midi_event_resize_buffer(\n      dev,\n      bufsize,\n    );\n  }\n\n  late final _snd_midi_event_resize_buffer_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_resize_buffer>>(\n          'snd_midi_event_resize_buffer');\n  late final _dart_snd_midi_event_resize_buffer _snd_midi_event_resize_buffer =\n      _snd_midi_event_resize_buffer_ptr\n          .asFunction<_dart_snd_midi_event_resize_buffer>();\n\n  void snd_midi_event_free(\n    ffi.Pointer<snd_midi_event> dev,\n  ) {\n    return _snd_midi_event_free(\n      dev,\n    );\n  }\n\n  late final _snd_midi_event_free_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_free>>(\n          'snd_midi_event_free');\n  late final _dart_snd_midi_event_free _snd_midi_event_free =\n      _snd_midi_event_free_ptr.asFunction<_dart_snd_midi_event_free>();\n\n  void snd_midi_event_init(\n    ffi.Pointer<snd_midi_event> dev,\n  ) {\n    return _snd_midi_event_init(\n      dev,\n    );\n  }\n\n  late final _snd_midi_event_init_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_init>>(\n          'snd_midi_event_init');\n  late final _dart_snd_midi_event_init _snd_midi_event_init =\n      _snd_midi_event_init_ptr.asFunction<_dart_snd_midi_event_init>();\n\n  void snd_midi_event_reset_encode(\n    ffi.Pointer<snd_midi_event> dev,\n  ) {\n    return _snd_midi_event_reset_encode(\n      dev,\n    );\n  }\n\n  late final _snd_midi_event_reset_encode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_reset_encode>>(\n          'snd_midi_event_reset_encode');\n  late final _dart_snd_midi_event_reset_encode _snd_midi_event_reset_encode =\n      _snd_midi_event_reset_encode_ptr\n          .asFunction<_dart_snd_midi_event_reset_encode>();\n\n  void snd_midi_event_reset_decode(\n    ffi.Pointer<snd_midi_event> dev,\n  ) {\n    return _snd_midi_event_reset_decode(\n      dev,\n    );\n  }\n\n  late final _snd_midi_event_reset_decode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_reset_decode>>(\n          'snd_midi_event_reset_decode');\n  late final _dart_snd_midi_event_reset_decode _snd_midi_event_reset_decode =\n      _snd_midi_event_reset_decode_ptr\n          .asFunction<_dart_snd_midi_event_reset_decode>();\n\n  void snd_midi_event_no_status(\n    ffi.Pointer<snd_midi_event> dev,\n    int on_1,\n  ) {\n    return _snd_midi_event_no_status(\n      dev,\n      on_1,\n    );\n  }\n\n  late final _snd_midi_event_no_status_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_no_status>>(\n          'snd_midi_event_no_status');\n  late final _dart_snd_midi_event_no_status _snd_midi_event_no_status =\n      _snd_midi_event_no_status_ptr\n          .asFunction<_dart_snd_midi_event_no_status>();\n\n  int snd_midi_event_encode(\n    ffi.Pointer<snd_midi_event> dev,\n    ffi.Pointer<ffi.Uint8> buf,\n    int count,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_midi_event_encode(\n      dev,\n      buf,\n      count,\n      ev,\n    );\n  }\n\n  late final _snd_midi_event_encode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_encode>>(\n          'snd_midi_event_encode');\n  late final _dart_snd_midi_event_encode _snd_midi_event_encode =\n      _snd_midi_event_encode_ptr.asFunction<_dart_snd_midi_event_encode>();\n\n  int snd_midi_event_encode_byte(\n    ffi.Pointer<snd_midi_event> dev,\n    int c,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_midi_event_encode_byte(\n      dev,\n      c,\n      ev,\n    );\n  }\n\n  late final _snd_midi_event_encode_byte_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_encode_byte>>(\n          'snd_midi_event_encode_byte');\n  late final _dart_snd_midi_event_encode_byte _snd_midi_event_encode_byte =\n      _snd_midi_event_encode_byte_ptr\n          .asFunction<_dart_snd_midi_event_encode_byte>();\n\n  int snd_midi_event_decode(\n    ffi.Pointer<snd_midi_event> dev,\n    ffi.Pointer<ffi.Uint8> buf,\n    int count,\n    ffi.Pointer<snd_seq_event_t> ev,\n  ) {\n    return _snd_midi_event_decode(\n      dev,\n      buf,\n      count,\n      ev,\n    );\n  }\n\n  late final _snd_midi_event_decode_ptr =\n      _lookup<ffi.NativeFunction<_c_snd_midi_event_decode>>(\n          'snd_midi_event_decode');\n  late final _dart_snd_midi_event_decode _snd_midi_event_decode =\n      _snd_midi_event_decode_ptr.asFunction<_dart_snd_midi_event_decode>();\n}\n\nclass _fsid_t_ extends ffi.Opaque {}\n\nclass _mbstate_t_ extends ffi.Opaque {}\n\nclass _fpos_t_ extends ffi.Opaque {}\n\nclass _fpos64_t_ extends ffi.Opaque {}\n\nclass IO_marker_ extends ffi.Opaque {}\n\nclass IO_codecvt_ extends ffi.Opaque {}\n\nclass IO_wide_data_ extends ffi.Opaque {}\n\nclass IO_FILE_ extends ffi.Opaque {}\n\nclass _va_list_tag_ extends ffi.Struct {\n  @ffi.Uint32()\n  external int gp_offset;\n\n  @ffi.Uint32()\n  external int fp_offset;\n\n  external ffi.Pointer<ffi.Void> overflow_arg_area;\n\n  external ffi.Pointer<ffi.Void> reg_save_area;\n}\n\nabstract class idtype_t {\n  static const int P_ALL = 0;\n  static const int P_PID = 1;\n  static const int P_PGID = 2;\n}\n\nclass div_t extends ffi.Struct {\n  @ffi.Int32()\n  external int quot;\n\n  @ffi.Int32()\n  external int rem;\n}\n\nclass ldiv_t extends ffi.Struct {\n  @ffi.Int64()\n  external int quot;\n\n  @ffi.Int64()\n  external int rem;\n}\n\nclass lldiv_t extends ffi.Struct {\n  @ffi.Int64()\n  external int quot;\n\n  @ffi.Int64()\n  external int rem;\n}\n\nclass _sigset_t_ extends ffi.Opaque {}\n\nclass timeval extends ffi.Struct {\n  @ffi.Int64()\n  external int tv_sec;\n\n  @ffi.Int64()\n  external int tv_usec;\n}\n\nclass timespec extends ffi.Struct {\n  @ffi.Int64()\n  external int tv_sec;\n\n  @ffi.Int64()\n  external int tv_nsec;\n}\n\nclass fd_set extends ffi.Opaque {}\n\nclass _pthread_list_t_ extends ffi.Struct {\n  external ffi.Pointer<_pthread_list_t_> _prev_;\n\n  external ffi.Pointer<_pthread_list_t_> _next_;\n}\n\nclass _pthread_slist_t_ extends ffi.Struct {\n  external ffi.Pointer<_pthread_slist_t_> _next_;\n}\n\nclass _pthread_mutex_s_ extends ffi.Struct {\n  @ffi.Int32()\n  external int _lock_;\n\n  @ffi.Uint32()\n  external int _count_;\n\n  @ffi.Int32()\n  external int _owner_;\n\n  @ffi.Uint32()\n  external int _nusers_;\n\n  @ffi.Int32()\n  external int _kind_;\n\n  @ffi.Int16()\n  external int _spins_;\n\n  @ffi.Int16()\n  external int _elision_;\n\n  external _pthread_list_t_ _list_;\n}\n\nclass _pthread_rwlock_arch_t_ extends ffi.Opaque {}\n\nclass _pthread_cond_s_ extends ffi.Opaque {}\n\nclass random_data extends ffi.Struct {\n  external ffi.Pointer<ffi.Int32> fptr;\n\n  external ffi.Pointer<ffi.Int32> rptr;\n\n  external ffi.Pointer<ffi.Int32> state;\n\n  @ffi.Int32()\n  external int rand_type;\n\n  @ffi.Int32()\n  external int rand_deg;\n\n  @ffi.Int32()\n  external int rand_sep;\n\n  external ffi.Pointer<ffi.Int32> end_ptr;\n}\n\nclass drand48_data extends ffi.Opaque {}\n\nclass _locale_data_ extends ffi.Opaque {}\n\nclass _locale_struct_ extends ffi.Opaque {}\n\nclass flock extends ffi.Struct {\n  @ffi.Int16()\n  external int l_type;\n\n  @ffi.Int16()\n  external int l_whence;\n\n  @ffi.Int64()\n  external int l_start;\n\n  @ffi.Int64()\n  external int l_len;\n\n  @ffi.Int32()\n  external int l_pid;\n}\n\nclass stat extends ffi.Opaque {}\n\nclass pollfd extends ffi.Struct {\n  @ffi.Int32()\n  external int fd;\n\n  @ffi.Int16()\n  external int events;\n\n  @ffi.Int16()\n  external int revents;\n}\n\nclass tm extends ffi.Struct {\n  @ffi.Int32()\n  external int tm_sec;\n\n  @ffi.Int32()\n  external int tm_min;\n\n  @ffi.Int32()\n  external int tm_hour;\n\n  @ffi.Int32()\n  external int tm_mday;\n\n  @ffi.Int32()\n  external int tm_mon;\n\n  @ffi.Int32()\n  external int tm_year;\n\n  @ffi.Int32()\n  external int tm_wday;\n\n  @ffi.Int32()\n  external int tm_yday;\n\n  @ffi.Int32()\n  external int tm_isdst;\n\n  @ffi.Int64()\n  external int tm_gmtoff;\n\n  external ffi.Pointer<ffi.Int8> tm_zone;\n}\n\nclass itimerspec extends ffi.Struct {\n  external timespec it_interval;\n\n  external timespec it_value;\n}\n\nclass sigevent extends ffi.Opaque {}\n\nclass snd_dlsym_link extends ffi.Struct {\n  external ffi.Pointer<snd_dlsym_link> next;\n\n  external ffi.Pointer<ffi.Int8> dlsym_name;\n\n  external ffi.Pointer<ffi.Void> dlsym_ptr;\n}\n\nclass snd_async_handler_ extends ffi.Opaque {}\n\nclass snd_shm_area extends ffi.Opaque {}\n\nclass snd_input_ extends ffi.Opaque {}\n\nabstract class snd_input_type_t {\n  static const int SND_INPUT_STDIO = 0;\n  static const int SND_INPUT_BUFFER = 1;\n}\n\nclass snd_output_ extends ffi.Opaque {}\n\nabstract class snd_output_type_t {\n  static const int SND_OUTPUT_STDIO = 0;\n  static const int SND_OUTPUT_BUFFER = 1;\n}\n\nabstract class snd_config_type_t {\n  static const int SND_CONFIG_TYPE_INTEGER = 0;\n  static const int SND_CONFIG_TYPE_INTEGER64 = 1;\n  static const int SND_CONFIG_TYPE_REAL = 2;\n  static const int SND_CONFIG_TYPE_STRING = 3;\n  static const int SND_CONFIG_TYPE_POINTER = 4;\n  static const int SND_CONFIG_TYPE_COMPOUND = 1024;\n}\n\nclass snd_config_ extends ffi.Opaque {}\n\nclass snd_config_iterator_ extends ffi.Opaque {}\n\nclass snd_config_update_ extends ffi.Opaque {}\n\nclass snd_devname extends ffi.Struct {\n  external ffi.Pointer<ffi.Int8> name;\n\n  external ffi.Pointer<ffi.Int8> comment;\n\n  external ffi.Pointer<snd_devname> next;\n}\n\nclass snd_pcm_info_ extends ffi.Opaque {}\n\nclass snd_pcm_hw_params_ extends ffi.Opaque {}\n\nclass snd_pcm_sw_params_ extends ffi.Opaque {}\n\nclass snd_pcm_status_ extends ffi.Opaque {}\n\nclass snd_pcm_access_mask_ extends ffi.Opaque {}\n\nclass snd_pcm_format_mask_ extends ffi.Opaque {}\n\nclass snd_pcm_subformat_mask_ extends ffi.Opaque {}\n\nabstract class snd_pcm_class_t {\n  static const int SND_PCM_CLASS_GENERIC = 0;\n  static const int SND_PCM_CLASS_MULTI = 1;\n  static const int SND_PCM_CLASS_MODEM = 2;\n  static const int SND_PCM_CLASS_DIGITIZER = 3;\n  static const int SND_PCM_CLASS_LAST = 3;\n}\n\nabstract class snd_pcm_subclass_t {\n  static const int SND_PCM_SUBCLASS_GENERIC_MIX = 0;\n  static const int SND_PCM_SUBCLASS_MULTI_MIX = 1;\n  static const int SND_PCM_SUBCLASS_LAST = 1;\n}\n\nabstract class snd_pcm_stream_t {\n  static const int SND_PCM_STREAM_PLAYBACK = 0;\n  static const int SND_PCM_STREAM_CAPTURE = 1;\n  static const int SND_PCM_STREAM_LAST = 1;\n}\n\nabstract class snd_pcm_access_t {\n  static const int SND_PCM_ACCESS_MMAP_INTERLEAVED = 0;\n  static const int SND_PCM_ACCESS_MMAP_NONINTERLEAVED = 1;\n  static const int SND_PCM_ACCESS_MMAP_COMPLEX = 2;\n  static const int SND_PCM_ACCESS_RW_INTERLEAVED = 3;\n  static const int SND_PCM_ACCESS_RW_NONINTERLEAVED = 4;\n  static const int SND_PCM_ACCESS_LAST = 4;\n}\n\nabstract class snd_pcm_format_t {\n  static const int SND_PCM_FORMAT_UNKNOWN = -1;\n  static const int SND_PCM_FORMAT_S8 = 0;\n  static const int SND_PCM_FORMAT_U8 = 1;\n  static const int SND_PCM_FORMAT_S16_LE = 2;\n  static const int SND_PCM_FORMAT_S16_BE = 3;\n  static const int SND_PCM_FORMAT_U16_LE = 4;\n  static const int SND_PCM_FORMAT_U16_BE = 5;\n  static const int SND_PCM_FORMAT_S24_LE = 6;\n  static const int SND_PCM_FORMAT_S24_BE = 7;\n  static const int SND_PCM_FORMAT_U24_LE = 8;\n  static const int SND_PCM_FORMAT_U24_BE = 9;\n  static const int SND_PCM_FORMAT_S32_LE = 10;\n  static const int SND_PCM_FORMAT_S32_BE = 11;\n  static const int SND_PCM_FORMAT_U32_LE = 12;\n  static const int SND_PCM_FORMAT_U32_BE = 13;\n  static const int SND_PCM_FORMAT_FLOAT_LE = 14;\n  static const int SND_PCM_FORMAT_FLOAT_BE = 15;\n  static const int SND_PCM_FORMAT_FLOAT64_LE = 16;\n  static const int SND_PCM_FORMAT_FLOAT64_BE = 17;\n  static const int SND_PCM_FORMAT_IEC958_SUBFRAME_LE = 18;\n  static const int SND_PCM_FORMAT_IEC958_SUBFRAME_BE = 19;\n  static const int SND_PCM_FORMAT_MU_LAW = 20;\n  static const int SND_PCM_FORMAT_A_LAW = 21;\n  static const int SND_PCM_FORMAT_IMA_ADPCM = 22;\n  static const int SND_PCM_FORMAT_MPEG = 23;\n  static const int SND_PCM_FORMAT_GSM = 24;\n  static const int SND_PCM_FORMAT_S20_LE = 25;\n  static const int SND_PCM_FORMAT_S20_BE = 26;\n  static const int SND_PCM_FORMAT_U20_LE = 27;\n  static const int SND_PCM_FORMAT_U20_BE = 28;\n  static const int SND_PCM_FORMAT_SPECIAL = 31;\n  static const int SND_PCM_FORMAT_S24_3LE = 32;\n  static const int SND_PCM_FORMAT_S24_3BE = 33;\n  static const int SND_PCM_FORMAT_U24_3LE = 34;\n  static const int SND_PCM_FORMAT_U24_3BE = 35;\n  static const int SND_PCM_FORMAT_S20_3LE = 36;\n  static const int SND_PCM_FORMAT_S20_3BE = 37;\n  static const int SND_PCM_FORMAT_U20_3LE = 38;\n  static const int SND_PCM_FORMAT_U20_3BE = 39;\n  static const int SND_PCM_FORMAT_S18_3LE = 40;\n  static const int SND_PCM_FORMAT_S18_3BE = 41;\n  static const int SND_PCM_FORMAT_U18_3LE = 42;\n  static const int SND_PCM_FORMAT_U18_3BE = 43;\n  static const int SND_PCM_FORMAT_G723_24 = 44;\n  static const int SND_PCM_FORMAT_G723_24_1B = 45;\n  static const int SND_PCM_FORMAT_G723_40 = 46;\n  static const int SND_PCM_FORMAT_G723_40_1B = 47;\n  static const int SND_PCM_FORMAT_DSD_U8 = 48;\n  static const int SND_PCM_FORMAT_DSD_U16_LE = 49;\n  static const int SND_PCM_FORMAT_DSD_U32_LE = 50;\n  static const int SND_PCM_FORMAT_DSD_U16_BE = 51;\n  static const int SND_PCM_FORMAT_DSD_U32_BE = 52;\n  static const int SND_PCM_FORMAT_LAST = 52;\n  static const int SND_PCM_FORMAT_S16 = 2;\n  static const int SND_PCM_FORMAT_U16 = 4;\n  static const int SND_PCM_FORMAT_S24 = 6;\n  static const int SND_PCM_FORMAT_U24 = 8;\n  static const int SND_PCM_FORMAT_S32 = 10;\n  static const int SND_PCM_FORMAT_U32 = 12;\n  static const int SND_PCM_FORMAT_FLOAT = 14;\n  static const int SND_PCM_FORMAT_FLOAT64 = 16;\n  static const int SND_PCM_FORMAT_IEC958_SUBFRAME = 18;\n  static const int SND_PCM_FORMAT_S20 = 25;\n  static const int SND_PCM_FORMAT_U20 = 27;\n}\n\nabstract class snd_pcm_subformat_t {\n  static const int SND_PCM_SUBFORMAT_STD = 0;\n  static const int SND_PCM_SUBFORMAT_LAST = 0;\n}\n\nabstract class snd_pcm_state_t {\n  static const int SND_PCM_STATE_OPEN = 0;\n  static const int SND_PCM_STATE_SETUP = 1;\n  static const int SND_PCM_STATE_PREPARED = 2;\n  static const int SND_PCM_STATE_RUNNING = 3;\n  static const int SND_PCM_STATE_XRUN = 4;\n  static const int SND_PCM_STATE_DRAINING = 5;\n  static const int SND_PCM_STATE_PAUSED = 6;\n  static const int SND_PCM_STATE_SUSPENDED = 7;\n  static const int SND_PCM_STATE_DISCONNECTED = 8;\n  static const int SND_PCM_STATE_LAST = 8;\n  static const int SND_PCM_STATE_PRIVATE1 = 1024;\n}\n\nabstract class snd_pcm_start_t {\n  static const int SND_PCM_START_DATA = 0;\n  static const int SND_PCM_START_EXPLICIT = 1;\n  static const int SND_PCM_START_LAST = 1;\n}\n\nabstract class snd_pcm_xrun_t {\n  static const int SND_PCM_XRUN_NONE = 0;\n  static const int SND_PCM_XRUN_STOP = 1;\n  static const int SND_PCM_XRUN_LAST = 1;\n}\n\nabstract class snd_pcm_tstamp_t {\n  static const int SND_PCM_TSTAMP_NONE = 0;\n  static const int SND_PCM_TSTAMP_ENABLE = 1;\n  static const int SND_PCM_TSTAMP_MMAP = 1;\n  static const int SND_PCM_TSTAMP_LAST = 1;\n}\n\nabstract class snd_pcm_tstamp_type_t {\n  static const int SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0;\n  static const int SND_PCM_TSTAMP_TYPE_MONOTONIC = 1;\n  static const int SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW = 2;\n  static const int SND_PCM_TSTAMP_TYPE_LAST = 2;\n}\n\nclass snd_pcm_audio_tstamp_config_t extends ffi.Opaque {}\n\nclass snd_pcm_audio_tstamp_report_t extends ffi.Opaque {}\n\nclass snd_pcm_ extends ffi.Opaque {}\n\nabstract class _snd_pcm_type {\n  static const int SND_PCM_TYPE_HW = 0;\n  static const int SND_PCM_TYPE_HOOKS = 1;\n  static const int SND_PCM_TYPE_MULTI = 2;\n  static const int SND_PCM_TYPE_FILE = 3;\n  static const int SND_PCM_TYPE_NULL = 4;\n  static const int SND_PCM_TYPE_SHM = 5;\n  static const int SND_PCM_TYPE_INET = 6;\n  static const int SND_PCM_TYPE_COPY = 7;\n  static const int SND_PCM_TYPE_LINEAR = 8;\n  static const int SND_PCM_TYPE_ALAW = 9;\n  static const int SND_PCM_TYPE_MULAW = 10;\n  static const int SND_PCM_TYPE_ADPCM = 11;\n  static const int SND_PCM_TYPE_RATE = 12;\n  static const int SND_PCM_TYPE_ROUTE = 13;\n  static const int SND_PCM_TYPE_PLUG = 14;\n  static const int SND_PCM_TYPE_SHARE = 15;\n  static const int SND_PCM_TYPE_METER = 16;\n  static const int SND_PCM_TYPE_MIX = 17;\n  static const int SND_PCM_TYPE_DROUTE = 18;\n  static const int SND_PCM_TYPE_LBSERVER = 19;\n  static const int SND_PCM_TYPE_LINEAR_FLOAT = 20;\n  static const int SND_PCM_TYPE_LADSPA = 21;\n  static const int SND_PCM_TYPE_DMIX = 22;\n  static const int SND_PCM_TYPE_JACK = 23;\n  static const int SND_PCM_TYPE_DSNOOP = 24;\n  static const int SND_PCM_TYPE_DSHARE = 25;\n  static const int SND_PCM_TYPE_IEC958 = 26;\n  static const int SND_PCM_TYPE_SOFTVOL = 27;\n  static const int SND_PCM_TYPE_IOPLUG = 28;\n  static const int SND_PCM_TYPE_EXTPLUG = 29;\n  static const int SND_PCM_TYPE_MMAP_EMUL = 30;\n  static const int SND_PCM_TYPE_LAST = 30;\n}\n\nclass snd_pcm_channel_area_t extends ffi.Struct {\n  external ffi.Pointer<ffi.Void> addr;\n\n  @ffi.Uint32()\n  external int first;\n\n  @ffi.Uint32()\n  external int step;\n}\n\nclass snd_pcm_scope_ extends ffi.Opaque {}\n\nabstract class snd_pcm_chmap_type {\n  static const int SND_CHMAP_TYPE_NONE = 0;\n  static const int SND_CHMAP_TYPE_FIXED = 1;\n  static const int SND_CHMAP_TYPE_VAR = 2;\n  static const int SND_CHMAP_TYPE_PAIRED = 3;\n  static const int SND_CHMAP_TYPE_LAST = 3;\n}\n\nabstract class snd_pcm_chmap_position {\n  static const int SND_CHMAP_UNKNOWN = 0;\n  static const int SND_CHMAP_NA = 1;\n  static const int SND_CHMAP_MONO = 2;\n  static const int SND_CHMAP_FL = 3;\n  static const int SND_CHMAP_FR = 4;\n  static const int SND_CHMAP_RL = 5;\n  static const int SND_CHMAP_RR = 6;\n  static const int SND_CHMAP_FC = 7;\n  static const int SND_CHMAP_LFE = 8;\n  static const int SND_CHMAP_SL = 9;\n  static const int SND_CHMAP_SR = 10;\n  static const int SND_CHMAP_RC = 11;\n  static const int SND_CHMAP_FLC = 12;\n  static const int SND_CHMAP_FRC = 13;\n  static const int SND_CHMAP_RLC = 14;\n  static const int SND_CHMAP_RRC = 15;\n  static const int SND_CHMAP_FLW = 16;\n  static const int SND_CHMAP_FRW = 17;\n  static const int SND_CHMAP_FLH = 18;\n  static const int SND_CHMAP_FCH = 19;\n  static const int SND_CHMAP_FRH = 20;\n  static const int SND_CHMAP_TC = 21;\n  static const int SND_CHMAP_TFL = 22;\n  static const int SND_CHMAP_TFR = 23;\n  static const int SND_CHMAP_TFC = 24;\n  static const int SND_CHMAP_TRL = 25;\n  static const int SND_CHMAP_TRR = 26;\n  static const int SND_CHMAP_TRC = 27;\n  static const int SND_CHMAP_TFLC = 28;\n  static const int SND_CHMAP_TFRC = 29;\n  static const int SND_CHMAP_TSL = 30;\n  static const int SND_CHMAP_TSR = 31;\n  static const int SND_CHMAP_LLFE = 32;\n  static const int SND_CHMAP_RLFE = 33;\n  static const int SND_CHMAP_BC = 34;\n  static const int SND_CHMAP_BLC = 35;\n  static const int SND_CHMAP_BRC = 36;\n  static const int SND_CHMAP_LAST = 36;\n}\n\nclass snd_pcm_chmap_t extends ffi.Opaque {}\n\nclass snd_pcm_chmap_query_t extends ffi.Opaque {}\n\nabstract class snd_pcm_hook_type_t {\n  static const int SND_PCM_HOOK_TYPE_HW_PARAMS = 0;\n  static const int SND_PCM_HOOK_TYPE_HW_FREE = 1;\n  static const int SND_PCM_HOOK_TYPE_CLOSE = 2;\n  static const int SND_PCM_HOOK_TYPE_LAST = 2;\n}\n\nclass snd_pcm_hook_ extends ffi.Opaque {}\n\nclass snd_pcm_scope_ops_t extends ffi.Struct {\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_4>> enable;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_5>> disable;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_6>> start;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_7>> stop;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_8>> update;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_9>> reset;\n\n  external ffi.Pointer<ffi.NativeFunction<_typedefC_10>> close;\n}\n\nabstract class snd_spcm_latency_t {\n  static const int SND_SPCM_LATENCY_STANDARD = 0;\n  static const int SND_SPCM_LATENCY_MEDIUM = 1;\n  static const int SND_SPCM_LATENCY_REALTIME = 2;\n}\n\nabstract class snd_spcm_xrun_type_t {\n  static const int SND_SPCM_XRUN_IGNORE = 0;\n  static const int SND_SPCM_XRUN_STOP = 1;\n}\n\nabstract class snd_spcm_duplex_type_t {\n  static const int SND_SPCM_DUPLEX_LIBERAL = 0;\n  static const int SND_SPCM_DUPLEX_PEDANTIC = 1;\n}\n\nclass snd_rawmidi_info_ extends ffi.Opaque {}\n\nclass snd_rawmidi_params_ extends ffi.Opaque {}\n\nclass snd_rawmidi_status_ extends ffi.Opaque {}\n\nabstract class snd_rawmidi_stream_t {\n  static const int SND_RAWMIDI_STREAM_OUTPUT = 0;\n  static const int SND_RAWMIDI_STREAM_INPUT = 1;\n  static const int SND_RAWMIDI_STREAM_LAST = 1;\n}\n\nclass snd_rawmidi_ extends ffi.Opaque {}\n\nabstract class snd_rawmidi_type_t {\n  static const int SND_RAWMIDI_TYPE_HW = 0;\n  static const int SND_RAWMIDI_TYPE_SHM = 1;\n  static const int SND_RAWMIDI_TYPE_INET = 2;\n  static const int SND_RAWMIDI_TYPE_VIRTUAL = 3;\n}\n\nclass snd_timer_id_ extends ffi.Opaque {}\n\nclass snd_timer_ginfo_ extends ffi.Opaque {}\n\nclass snd_timer_gparams_ extends ffi.Opaque {}\n\nclass snd_timer_gstatus_ extends ffi.Opaque {}\n\nclass snd_timer_info_ extends ffi.Opaque {}\n\nclass snd_timer_params_ extends ffi.Opaque {}\n\nclass snd_timer_status_ extends ffi.Opaque {}\n\nabstract class snd_timer_class_t {\n  static const int SND_TIMER_CLASS_NONE = -1;\n  static const int SND_TIMER_CLASS_SLAVE = 0;\n  static const int SND_TIMER_CLASS_GLOBAL = 1;\n  static const int SND_TIMER_CLASS_CARD = 2;\n  static const int SND_TIMER_CLASS_PCM = 3;\n  static const int SND_TIMER_CLASS_LAST = 3;\n}\n\nabstract class snd_timer_slave_class_t {\n  static const int SND_TIMER_SCLASS_NONE = 0;\n  static const int SND_TIMER_SCLASS_APPLICATION = 1;\n  static const int SND_TIMER_SCLASS_SEQUENCER = 2;\n  static const int SND_TIMER_SCLASS_OSS_SEQUENCER = 3;\n  static const int SND_TIMER_SCLASS_LAST = 3;\n}\n\nabstract class snd_timer_event_t {\n  static const int SND_TIMER_EVENT_RESOLUTION = 0;\n  static const int SND_TIMER_EVENT_TICK = 1;\n  static const int SND_TIMER_EVENT_START = 2;\n  static const int SND_TIMER_EVENT_STOP = 3;\n  static const int SND_TIMER_EVENT_CONTINUE = 4;\n  static const int SND_TIMER_EVENT_PAUSE = 5;\n  static const int SND_TIMER_EVENT_EARLY = 6;\n  static const int SND_TIMER_EVENT_SUSPEND = 7;\n  static const int SND_TIMER_EVENT_RESUME = 8;\n  static const int SND_TIMER_EVENT_MSTART = 12;\n  static const int SND_TIMER_EVENT_MSTOP = 13;\n  static const int SND_TIMER_EVENT_MCONTINUE = 14;\n  static const int SND_TIMER_EVENT_MPAUSE = 15;\n  static const int SND_TIMER_EVENT_MSUSPEND = 17;\n  static const int SND_TIMER_EVENT_MRESUME = 18;\n}\n\nclass snd_timer_read_t extends ffi.Struct {\n  @ffi.Uint32()\n  external int resolution;\n\n  @ffi.Uint32()\n  external int ticks;\n}\n\nclass snd_timer_tread_t extends ffi.Struct {\n  @ffi.Int32()\n  external int event;\n\n  external timespec tstamp;\n\n  @ffi.Uint32()\n  external int val;\n}\n\nabstract class snd_timer_type_t {\n  static const int SND_TIMER_TYPE_HW = 0;\n  static const int SND_TIMER_TYPE_SHM = 1;\n  static const int SND_TIMER_TYPE_INET = 2;\n}\n\nclass snd_timer_query_ extends ffi.Opaque {}\n\nclass snd_timer_ extends ffi.Opaque {}\n\nclass snd_hwdep_info_ extends ffi.Opaque {}\n\nclass snd_hwdep_dsp_status_ extends ffi.Opaque {}\n\nclass snd_hwdep_dsp_image_ extends ffi.Opaque {}\n\nabstract class snd_hwdep_iface_t {\n  static const int SND_HWDEP_IFACE_OPL2 = 0;\n  static const int SND_HWDEP_IFACE_OPL3 = 1;\n  static const int SND_HWDEP_IFACE_OPL4 = 2;\n  static const int SND_HWDEP_IFACE_SB16CSP = 3;\n  static const int SND_HWDEP_IFACE_EMU10K1 = 4;\n  static const int SND_HWDEP_IFACE_YSS225 = 5;\n  static const int SND_HWDEP_IFACE_ICS2115 = 6;\n  static const int SND_HWDEP_IFACE_SSCAPE = 7;\n  static const int SND_HWDEP_IFACE_VX = 8;\n  static const int SND_HWDEP_IFACE_MIXART = 9;\n  static const int SND_HWDEP_IFACE_USX2Y = 10;\n  static const int SND_HWDEP_IFACE_EMUX_WAVETABLE = 11;\n  static const int SND_HWDEP_IFACE_BLUETOOTH = 12;\n  static const int SND_HWDEP_IFACE_USX2Y_PCM = 13;\n  static const int SND_HWDEP_IFACE_PCXHR = 14;\n  static const int SND_HWDEP_IFACE_SB_RC = 15;\n  static const int SND_HWDEP_IFACE_HDA = 16;\n  static const int SND_HWDEP_IFACE_USB_STREAM = 17;\n  static const int SND_HWDEP_IFACE_FW_DICE = 18;\n  static const int SND_HWDEP_IFACE_FW_FIREWORKS = 19;\n  static const int SND_HWDEP_IFACE_FW_BEBOB = 20;\n  static const int SND_HWDEP_IFACE_FW_OXFW = 21;\n  static const int SND_HWDEP_IFACE_FW_DIGI00X = 22;\n  static const int SND_HWDEP_IFACE_FW_TASCAM = 23;\n  static const int SND_HWDEP_IFACE_LINE6 = 24;\n  static const int SND_HWDEP_IFACE_FW_MOTU = 25;\n  static const int SND_HWDEP_IFACE_FW_FIREFACE = 26;\n  static const int SND_HWDEP_IFACE_LAST = 26;\n}\n\nabstract class snd_hwdep_type_t {\n  static const int SND_HWDEP_TYPE_HW = 0;\n  static const int SND_HWDEP_TYPE_SHM = 1;\n  static const int SND_HWDEP_TYPE_INET = 2;\n}\n\nclass snd_hwdep_ extends ffi.Opaque {}\n\nclass snd_aes_iec958_t extends ffi.Opaque {}\n\nclass snd_ctl_card_info_ extends ffi.Opaque {}\n\nclass snd_ctl_elem_id_ extends ffi.Opaque {}\n\nclass snd_ctl_elem_list_ extends ffi.Opaque {}\n\nclass snd_ctl_elem_info_ extends ffi.Opaque {}\n\nclass snd_ctl_elem_value_ extends ffi.Opaque {}\n\nclass snd_ctl_event_ extends ffi.Opaque {}\n\nabstract class snd_ctl_elem_type_t {\n  static const int SND_CTL_ELEM_TYPE_NONE = 0;\n  static const int SND_CTL_ELEM_TYPE_BOOLEAN = 1;\n  static const int SND_CTL_ELEM_TYPE_INTEGER = 2;\n  static const int SND_CTL_ELEM_TYPE_ENUMERATED = 3;\n  static const int SND_CTL_ELEM_TYPE_BYTES = 4;\n  static const int SND_CTL_ELEM_TYPE_IEC958 = 5;\n  static const int SND_CTL_ELEM_TYPE_INTEGER64 = 6;\n  static const int SND_CTL_ELEM_TYPE_LAST = 6;\n}\n\nabstract class snd_ctl_elem_iface_t {\n  static const int SND_CTL_ELEM_IFACE_CARD = 0;\n  static const int SND_CTL_ELEM_IFACE_HWDEP = 1;\n  static const int SND_CTL_ELEM_IFACE_MIXER = 2;\n  static const int SND_CTL_ELEM_IFACE_PCM = 3;\n  static const int SND_CTL_ELEM_IFACE_RAWMIDI = 4;\n  static const int SND_CTL_ELEM_IFACE_TIMER = 5;\n  static const int SND_CTL_ELEM_IFACE_SEQUENCER = 6;\n  static const int SND_CTL_ELEM_IFACE_LAST = 6;\n}\n\nabstract class snd_ctl_event_type_t {\n  static const int SND_CTL_EVENT_ELEM = 0;\n  static const int SND_CTL_EVENT_LAST = 0;\n}\n\nabstract class snd_ctl_type_t {\n  static const int SND_CTL_TYPE_HW = 0;\n  static const int SND_CTL_TYPE_SHM = 1;\n  static const int SND_CTL_TYPE_INET = 2;\n  static const int SND_CTL_TYPE_EXT = 3;\n}\n\nclass snd_ctl_ extends ffi.Opaque {}\n\nclass snd_sctl_ extends ffi.Opaque {}\n\nclass snd_hctl_elem_ extends ffi.Opaque {}\n\nclass snd_hctl_ extends ffi.Opaque {}\n\nclass snd_mixer_ extends ffi.Opaque {}\n\nclass snd_mixer_class_ extends ffi.Opaque {}\n\nclass snd_mixer_elem_ extends ffi.Opaque {}\n\nabstract class snd_mixer_elem_type_t {\n  static const int SND_MIXER_ELEM_SIMPLE = 0;\n  static const int SND_MIXER_ELEM_LAST = 0;\n}\n\nabstract class snd_mixer_selem_channel_id_t {\n  static const int SND_MIXER_SCHN_UNKNOWN = -1;\n  static const int SND_MIXER_SCHN_FRONT_LEFT = 0;\n  static const int SND_MIXER_SCHN_FRONT_RIGHT = 1;\n  static const int SND_MIXER_SCHN_REAR_LEFT = 2;\n  static const int SND_MIXER_SCHN_REAR_RIGHT = 3;\n  static const int SND_MIXER_SCHN_FRONT_CENTER = 4;\n  static const int SND_MIXER_SCHN_WOOFER = 5;\n  static const int SND_MIXER_SCHN_SIDE_LEFT = 6;\n  static const int SND_MIXER_SCHN_SIDE_RIGHT = 7;\n  static const int SND_MIXER_SCHN_REAR_CENTER = 8;\n  static const int SND_MIXER_SCHN_LAST = 31;\n  static const int SND_MIXER_SCHN_MONO = 0;\n}\n\nabstract class snd_mixer_selem_regopt_abstract {\n  static const int SND_MIXER_SABSTRACT_NONE = 0;\n  static const int SND_MIXER_SABSTRACT_BASIC = 1;\n}\n\nclass snd_mixer_selem_regopt extends ffi.Struct {\n  @ffi.Int32()\n  external int ver;\n\n  @ffi.Int32()\n  external int abstract_1;\n\n  external ffi.Pointer<ffi.Int8> device;\n\n  external ffi.Pointer<snd_pcm_> playback_pcm;\n\n  external ffi.Pointer<snd_pcm_> capture_pcm;\n}\n\nclass snd_mixer_selem_id_ extends ffi.Opaque {}\n\nabstract class snd_seq_event_type {\n  static const int SND_SEQ_EVENT_SYSTEM = 0;\n  static const int SND_SEQ_EVENT_RESULT = 1;\n  static const int SND_SEQ_EVENT_NOTE = 5;\n  static const int SND_SEQ_EVENT_NOTEON = 6;\n  static const int SND_SEQ_EVENT_NOTEOFF = 7;\n  static const int SND_SEQ_EVENT_KEYPRESS = 8;\n  static const int SND_SEQ_EVENT_CONTROLLER = 10;\n  static const int SND_SEQ_EVENT_PGMCHANGE = 11;\n  static const int SND_SEQ_EVENT_CHANPRESS = 12;\n  static const int SND_SEQ_EVENT_PITCHBEND = 13;\n  static const int SND_SEQ_EVENT_CONTROL14 = 14;\n  static const int SND_SEQ_EVENT_NONREGPARAM = 15;\n  static const int SND_SEQ_EVENT_REGPARAM = 16;\n  static const int SND_SEQ_EVENT_SONGPOS = 20;\n  static const int SND_SEQ_EVENT_SONGSEL = 21;\n  static const int SND_SEQ_EVENT_QFRAME = 22;\n  static const int SND_SEQ_EVENT_TIMESIGN = 23;\n  static const int SND_SEQ_EVENT_KEYSIGN = 24;\n  static const int SND_SEQ_EVENT_START = 30;\n  static const int SND_SEQ_EVENT_CONTINUE = 31;\n  static const int SND_SEQ_EVENT_STOP = 32;\n  static const int SND_SEQ_EVENT_SETPOS_TICK = 33;\n  static const int SND_SEQ_EVENT_SETPOS_TIME = 34;\n  static const int SND_SEQ_EVENT_TEMPO = 35;\n  static const int SND_SEQ_EVENT_CLOCK = 36;\n  static const int SND_SEQ_EVENT_TICK = 37;\n  static const int SND_SEQ_EVENT_QUEUE_SKEW = 38;\n  static const int SND_SEQ_EVENT_SYNC_POS = 39;\n  static const int SND_SEQ_EVENT_TUNE_REQUEST = 40;\n  static const int SND_SEQ_EVENT_RESET = 41;\n  static const int SND_SEQ_EVENT_SENSING = 42;\n  static const int SND_SEQ_EVENT_ECHO = 50;\n  static const int SND_SEQ_EVENT_OSS = 51;\n  static const int SND_SEQ_EVENT_CLIENT_START = 60;\n  static const int SND_SEQ_EVENT_CLIENT_EXIT = 61;\n  static const int SND_SEQ_EVENT_CLIENT_CHANGE = 62;\n  static const int SND_SEQ_EVENT_PORT_START = 63;\n  static const int SND_SEQ_EVENT_PORT_EXIT = 64;\n  static const int SND_SEQ_EVENT_PORT_CHANGE = 65;\n  static const int SND_SEQ_EVENT_PORT_SUBSCRIBED = 66;\n  static const int SND_SEQ_EVENT_PORT_UNSUBSCRIBED = 67;\n  static const int SND_SEQ_EVENT_USR0 = 90;\n  static const int SND_SEQ_EVENT_USR1 = 91;\n  static const int SND_SEQ_EVENT_USR2 = 92;\n  static const int SND_SEQ_EVENT_USR3 = 93;\n  static const int SND_SEQ_EVENT_USR4 = 94;\n  static const int SND_SEQ_EVENT_USR5 = 95;\n  static const int SND_SEQ_EVENT_USR6 = 96;\n  static const int SND_SEQ_EVENT_USR7 = 97;\n  static const int SND_SEQ_EVENT_USR8 = 98;\n  static const int SND_SEQ_EVENT_USR9 = 99;\n  static const int SND_SEQ_EVENT_SYSEX = 130;\n  static const int SND_SEQ_EVENT_BOUNCE = 131;\n  static const int SND_SEQ_EVENT_USR_VAR0 = 135;\n  static const int SND_SEQ_EVENT_USR_VAR1 = 136;\n  static const int SND_SEQ_EVENT_USR_VAR2 = 137;\n  static const int SND_SEQ_EVENT_USR_VAR3 = 138;\n  static const int SND_SEQ_EVENT_USR_VAR4 = 139;\n  static const int SND_SEQ_EVENT_NONE = 255;\n}\n\nclass snd_seq_addr_t extends ffi.Struct {\n  @ffi.Uint8()\n  external int client;\n\n  @ffi.Uint8()\n  external int port;\n}\n\nclass snd_seq_connect_t extends ffi.Struct {\n  external snd_seq_addr_t sender;\n\n  external snd_seq_addr_t dest;\n}\n\nclass snd_seq_real_time_t extends ffi.Struct {\n  @ffi.Uint32()\n  external int tv_sec;\n\n  @ffi.Uint32()\n  external int tv_nsec;\n}\n\nclass snd_seq_ev_note_t extends ffi.Struct {\n  @ffi.Uint8()\n  external int channel;\n\n  @ffi.Uint8()\n  external int note;\n\n  @ffi.Uint8()\n  external int velocity;\n\n  @ffi.Uint8()\n  external int off_velocity;\n\n  @ffi.Uint32()\n  external int duration;\n}\n\nclass snd_seq_ev_ctrl_t extends ffi.Opaque {}\n\nclass snd_seq_ev_raw8_t extends ffi.Opaque {}\n\nclass snd_seq_ev_raw32_t extends ffi.Opaque {}\n\nclass snd_seq_ev_ext extends ffi.Struct {\n  @ffi.Uint32()\n  external int len;\n\n  external ffi.Pointer<ffi.Void> ptr;\n}\n\nclass snd_seq_result_t extends ffi.Struct {\n  @ffi.Int32()\n  external int event;\n\n  @ffi.Int32()\n  external int result;\n}\n\nclass snd_seq_queue_skew_t extends ffi.Struct {\n  @ffi.Uint32()\n  external int value;\n\n  @ffi.Uint32()\n  external int base;\n}\n\nclass snd_seq_ev_queue_control_t extends ffi.Opaque {}\n\nclass snd_seq_event_t extends ffi.Opaque {}\n\nclass snd_seq_ extends ffi.Opaque {}\n\nabstract class snd_seq_type_t {\n  static const int SND_SEQ_TYPE_HW = 0;\n  static const int SND_SEQ_TYPE_SHM = 1;\n  static const int SND_SEQ_TYPE_INET = 2;\n}\n\nclass snd_seq_system_info_ extends ffi.Opaque {}\n\nclass snd_seq_client_info_ extends ffi.Opaque {}\n\nabstract class snd_seq_client_type_t {\n  static const int SND_SEQ_USER_CLIENT = 1;\n  static const int SND_SEQ_KERNEL_CLIENT = 2;\n}\n\nclass snd_seq_client_pool_ extends ffi.Opaque {}\n\nclass snd_seq_port_info_ extends ffi.Opaque {}\n\nclass snd_seq_port_subscribe_ extends ffi.Opaque {}\n\nclass snd_seq_query_subscribe_ extends ffi.Opaque {}\n\nabstract class snd_seq_query_subs_type_t {\n  static const int SND_SEQ_QUERY_SUBS_READ = 0;\n  static const int SND_SEQ_QUERY_SUBS_WRITE = 1;\n}\n\nclass snd_seq_queue_info_ extends ffi.Opaque {}\n\nclass snd_seq_queue_status_ extends ffi.Opaque {}\n\nclass snd_seq_queue_tempo_ extends ffi.Opaque {}\n\nclass snd_seq_queue_timer_ extends ffi.Opaque {}\n\nabstract class snd_seq_queue_timer_type_t {\n  static const int SND_SEQ_TIMER_ALSA = 0;\n  static const int SND_SEQ_TIMER_MIDI_CLOCK = 1;\n  static const int SND_SEQ_TIMER_MIDI_TICK = 2;\n}\n\nclass snd_seq_remove_events_ extends ffi.Opaque {}\n\nclass snd_midi_event extends ffi.Opaque {}\n\nconst int _PC_LINK_MAX = 0;\n\nconst int _PC_MAX_CANON = 1;\n\nconst int _PC_MAX_INPUT = 2;\n\nconst int _PC_NAME_MAX = 3;\n\nconst int _PC_PATH_MAX = 4;\n\nconst int _PC_PIPE_BUF = 5;\n\nconst int _PC_CHOWN_RESTRICTED = 6;\n\nconst int _PC_NO_TRUNC = 7;\n\nconst int _PC_VDISABLE = 8;\n\nconst int _PC_SYNC_IO = 9;\n\nconst int _PC_ASYNC_IO = 10;\n\nconst int _PC_PRIO_IO = 11;\n\nconst int _PC_SOCK_MAXBUF = 12;\n\nconst int _PC_FILESIZEBITS = 13;\n\nconst int _PC_REC_INCR_XFER_SIZE = 14;\n\nconst int _PC_REC_MAX_XFER_SIZE = 15;\n\nconst int _PC_REC_MIN_XFER_SIZE = 16;\n\nconst int _PC_REC_XFER_ALIGN = 17;\n\nconst int _PC_ALLOC_SIZE_MIN = 18;\n\nconst int _PC_SYMLINK_MAX = 19;\n\nconst int _PC_2_SYMLINKS = 20;\n\nconst int _SC_ARG_MAX = 0;\n\nconst int _SC_CHILD_MAX = 1;\n\nconst int _SC_CLK_TCK = 2;\n\nconst int _SC_NGROUPS_MAX = 3;\n\nconst int _SC_OPEN_MAX = 4;\n\nconst int _SC_STREAM_MAX = 5;\n\nconst int _SC_TZNAME_MAX = 6;\n\nconst int _SC_JOB_CONTROL = 7;\n\nconst int _SC_SAVED_IDS = 8;\n\nconst int _SC_REALTIME_SIGNALS = 9;\n\nconst int _SC_PRIORITY_SCHEDULING = 10;\n\nconst int _SC_TIMERS = 11;\n\nconst int _SC_ASYNCHRONOUS_IO = 12;\n\nconst int _SC_PRIORITIZED_IO = 13;\n\nconst int _SC_SYNCHRONIZED_IO = 14;\n\nconst int _SC_FSYNC = 15;\n\nconst int _SC_MAPPED_FILES = 16;\n\nconst int _SC_MEMLOCK = 17;\n\nconst int _SC_MEMLOCK_RANGE = 18;\n\nconst int _SC_MEMORY_PROTECTION = 19;\n\nconst int _SC_MESSAGE_PASSING = 20;\n\nconst int _SC_SEMAPHORES = 21;\n\nconst int _SC_SHARED_MEMORY_OBJECTS = 22;\n\nconst int _SC_AIO_LISTIO_MAX = 23;\n\nconst int _SC_AIO_MAX = 24;\n\nconst int _SC_AIO_PRIO_DELTA_MAX = 25;\n\nconst int _SC_DELAYTIMER_MAX = 26;\n\nconst int _SC_MQ_OPEN_MAX = 27;\n\nconst int _SC_MQ_PRIO_MAX = 28;\n\nconst int _SC_VERSION = 29;\n\nconst int _SC_PAGESIZE = 30;\n\nconst int _SC_RTSIG_MAX = 31;\n\nconst int _SC_SEM_NSEMS_MAX = 32;\n\nconst int _SC_SEM_VALUE_MAX = 33;\n\nconst int _SC_SIGQUEUE_MAX = 34;\n\nconst int _SC_TIMER_MAX = 35;\n\nconst int _SC_BC_BASE_MAX = 36;\n\nconst int _SC_BC_DIM_MAX = 37;\n\nconst int _SC_BC_SCALE_MAX = 38;\n\nconst int _SC_BC_STRING_MAX = 39;\n\nconst int _SC_COLL_WEIGHTS_MAX = 40;\n\nconst int _SC_EQUIV_CLASS_MAX = 41;\n\nconst int _SC_EXPR_NEST_MAX = 42;\n\nconst int _SC_LINE_MAX = 43;\n\nconst int _SC_RE_DUP_MAX = 44;\n\nconst int _SC_CHARCLASS_NAME_MAX = 45;\n\nconst int _SC_2_VERSION = 46;\n\nconst int _SC_2_C_BIND = 47;\n\nconst int _SC_2_C_DEV = 48;\n\nconst int _SC_2_FORT_DEV = 49;\n\nconst int _SC_2_FORT_RUN = 50;\n\nconst int _SC_2_SW_DEV = 51;\n\nconst int _SC_2_LOCALEDEF = 52;\n\nconst int _SC_PII = 53;\n\nconst int _SC_PII_XTI = 54;\n\nconst int _SC_PII_SOCKET = 55;\n\nconst int _SC_PII_INTERNET = 56;\n\nconst int _SC_PII_OSI = 57;\n\nconst int _SC_POLL = 58;\n\nconst int _SC_SELECT = 59;\n\nconst int _SC_UIO_MAXIOV = 60;\n\nconst int _SC_IOV_MAX = 60;\n\nconst int _SC_PII_INTERNET_STREAM = 61;\n\nconst int _SC_PII_INTERNET_DGRAM = 62;\n\nconst int _SC_PII_OSI_COTS = 63;\n\nconst int _SC_PII_OSI_CLTS = 64;\n\nconst int _SC_PII_OSI_M = 65;\n\nconst int _SC_T_IOV_MAX = 66;\n\nconst int _SC_THREADS = 67;\n\nconst int _SC_THREAD_SAFE_FUNCTIONS = 68;\n\nconst int _SC_GETGR_R_SIZE_MAX = 69;\n\nconst int _SC_GETPW_R_SIZE_MAX = 70;\n\nconst int _SC_LOGIN_NAME_MAX = 71;\n\nconst int _SC_TTY_NAME_MAX = 72;\n\nconst int _SC_THREAD_DESTRUCTOR_ITERATIONS = 73;\n\nconst int _SC_THREAD_KEYS_MAX = 74;\n\nconst int _SC_THREAD_STACK_MIN = 75;\n\nconst int _SC_THREAD_THREADS_MAX = 76;\n\nconst int _SC_THREAD_ATTR_STACKADDR = 77;\n\nconst int _SC_THREAD_ATTR_STACKSIZE = 78;\n\nconst int _SC_THREAD_PRIORITY_SCHEDULING = 79;\n\nconst int _SC_THREAD_PRIO_INHERIT = 80;\n\nconst int _SC_THREAD_PRIO_PROTECT = 81;\n\nconst int _SC_THREAD_PROCESS_SHARED = 82;\n\nconst int _SC_NPROCESSORS_CONF = 83;\n\nconst int _SC_NPROCESSORS_ONLN = 84;\n\nconst int _SC_PHYS_PAGES = 85;\n\nconst int _SC_AVPHYS_PAGES = 86;\n\nconst int _SC_ATEXIT_MAX = 87;\n\nconst int _SC_PASS_MAX = 88;\n\nconst int _SC_XOPEN_VERSION = 89;\n\nconst int _SC_XOPEN_XCU_VERSION = 90;\n\nconst int _SC_XOPEN_UNIX = 91;\n\nconst int _SC_XOPEN_CRYPT = 92;\n\nconst int _SC_XOPEN_ENH_I18N = 93;\n\nconst int _SC_XOPEN_SHM = 94;\n\nconst int _SC_2_CHAR_TERM = 95;\n\nconst int _SC_2_C_VERSION = 96;\n\nconst int _SC_2_UPE = 97;\n\nconst int _SC_XOPEN_XPG2 = 98;\n\nconst int _SC_XOPEN_XPG3 = 99;\n\nconst int _SC_XOPEN_XPG4 = 100;\n\nconst int _SC_CHAR_BIT = 101;\n\nconst int _SC_CHAR_MAX = 102;\n\nconst int _SC_CHAR_MIN = 103;\n\nconst int _SC_INT_MAX = 104;\n\nconst int _SC_INT_MIN = 105;\n\nconst int _SC_LONG_BIT = 106;\n\nconst int _SC_WORD_BIT = 107;\n\nconst int _SC_MB_LEN_MAX = 108;\n\nconst int _SC_NZERO = 109;\n\nconst int _SC_SSIZE_MAX = 110;\n\nconst int _SC_SCHAR_MAX = 111;\n\nconst int _SC_SCHAR_MIN = 112;\n\nconst int _SC_SHRT_MAX = 113;\n\nconst int _SC_SHRT_MIN = 114;\n\nconst int _SC_UCHAR_MAX = 115;\n\nconst int _SC_UINT_MAX = 116;\n\nconst int _SC_ULONG_MAX = 117;\n\nconst int _SC_USHRT_MAX = 118;\n\nconst int _SC_NL_ARGMAX = 119;\n\nconst int _SC_NL_LANGMAX = 120;\n\nconst int _SC_NL_MSGMAX = 121;\n\nconst int _SC_NL_NMAX = 122;\n\nconst int _SC_NL_SETMAX = 123;\n\nconst int _SC_NL_TEXTMAX = 124;\n\nconst int _SC_XBS5_ILP32_OFF32 = 125;\n\nconst int _SC_XBS5_ILP32_OFFBIG = 126;\n\nconst int _SC_XBS5_LP64_OFF64 = 127;\n\nconst int _SC_XBS5_LPBIG_OFFBIG = 128;\n\nconst int _SC_XOPEN_LEGACY = 129;\n\nconst int _SC_XOPEN_REALTIME = 130;\n\nconst int _SC_XOPEN_REALTIME_THREADS = 131;\n\nconst int _SC_ADVISORY_INFO = 132;\n\nconst int _SC_BARRIERS = 133;\n\nconst int _SC_BASE = 134;\n\nconst int _SC_C_LANG_SUPPORT = 135;\n\nconst int _SC_C_LANG_SUPPORT_R = 136;\n\nconst int _SC_CLOCK_SELECTION = 137;\n\nconst int _SC_CPUTIME = 138;\n\nconst int _SC_THREAD_CPUTIME = 139;\n\nconst int _SC_DEVICE_IO = 140;\n\nconst int _SC_DEVICE_SPECIFIC = 141;\n\nconst int _SC_DEVICE_SPECIFIC_R = 142;\n\nconst int _SC_FD_MGMT = 143;\n\nconst int _SC_FIFO = 144;\n\nconst int _SC_PIPE = 145;\n\nconst int _SC_FILE_ATTRIBUTES = 146;\n\nconst int _SC_FILE_LOCKING = 147;\n\nconst int _SC_FILE_SYSTEM = 148;\n\nconst int _SC_MONOTONIC_CLOCK = 149;\n\nconst int _SC_MULTI_PROCESS = 150;\n\nconst int _SC_SINGLE_PROCESS = 151;\n\nconst int _SC_NETWORKING = 152;\n\nconst int _SC_READER_WRITER_LOCKS = 153;\n\nconst int _SC_SPIN_LOCKS = 154;\n\nconst int _SC_REGEXP = 155;\n\nconst int _SC_REGEX_VERSION = 156;\n\nconst int _SC_SHELL = 157;\n\nconst int _SC_SIGNALS = 158;\n\nconst int _SC_SPAWN = 159;\n\nconst int _SC_SPORADIC_SERVER = 160;\n\nconst int _SC_THREAD_SPORADIC_SERVER = 161;\n\nconst int _SC_SYSTEM_DATABASE = 162;\n\nconst int _SC_SYSTEM_DATABASE_R = 163;\n\nconst int _SC_TIMEOUTS = 164;\n\nconst int _SC_TYPED_MEMORY_OBJECTS = 165;\n\nconst int _SC_USER_GROUPS = 166;\n\nconst int _SC_USER_GROUPS_R = 167;\n\nconst int _SC_2_PBS = 168;\n\nconst int _SC_2_PBS_ACCOUNTING = 169;\n\nconst int _SC_2_PBS_LOCATE = 170;\n\nconst int _SC_2_PBS_MESSAGE = 171;\n\nconst int _SC_2_PBS_TRACK = 172;\n\nconst int _SC_SYMLOOP_MAX = 173;\n\nconst int _SC_STREAMS = 174;\n\nconst int _SC_2_PBS_CHECKPOINT = 175;\n\nconst int _SC_V6_ILP32_OFF32 = 176;\n\nconst int _SC_V6_ILP32_OFFBIG = 177;\n\nconst int _SC_V6_LP64_OFF64 = 178;\n\nconst int _SC_V6_LPBIG_OFFBIG = 179;\n\nconst int _SC_HOST_NAME_MAX = 180;\n\nconst int _SC_TRACE = 181;\n\nconst int _SC_TRACE_EVENT_FILTER = 182;\n\nconst int _SC_TRACE_INHERIT = 183;\n\nconst int _SC_TRACE_LOG = 184;\n\nconst int _SC_LEVEL1_ICACHE_SIZE = 185;\n\nconst int _SC_LEVEL1_ICACHE_ASSOC = 186;\n\nconst int _SC_LEVEL1_ICACHE_LINESIZE = 187;\n\nconst int _SC_LEVEL1_DCACHE_SIZE = 188;\n\nconst int _SC_LEVEL1_DCACHE_ASSOC = 189;\n\nconst int _SC_LEVEL1_DCACHE_LINESIZE = 190;\n\nconst int _SC_LEVEL2_CACHE_SIZE = 191;\n\nconst int _SC_LEVEL2_CACHE_ASSOC = 192;\n\nconst int _SC_LEVEL2_CACHE_LINESIZE = 193;\n\nconst int _SC_LEVEL3_CACHE_SIZE = 194;\n\nconst int _SC_LEVEL3_CACHE_ASSOC = 195;\n\nconst int _SC_LEVEL3_CACHE_LINESIZE = 196;\n\nconst int _SC_LEVEL4_CACHE_SIZE = 197;\n\nconst int _SC_LEVEL4_CACHE_ASSOC = 198;\n\nconst int _SC_LEVEL4_CACHE_LINESIZE = 199;\n\nconst int _SC_IPV6 = 235;\n\nconst int _SC_RAW_SOCKETS = 236;\n\nconst int _SC_V7_ILP32_OFF32 = 237;\n\nconst int _SC_V7_ILP32_OFFBIG = 238;\n\nconst int _SC_V7_LP64_OFF64 = 239;\n\nconst int _SC_V7_LPBIG_OFFBIG = 240;\n\nconst int _SC_SS_REPL_MAX = 241;\n\nconst int _SC_TRACE_EVENT_NAME_MAX = 242;\n\nconst int _SC_TRACE_NAME_MAX = 243;\n\nconst int _SC_TRACE_SYS_MAX = 244;\n\nconst int _SC_TRACE_USER_EVENT_MAX = 245;\n\nconst int _SC_XOPEN_STREAMS = 246;\n\nconst int _SC_THREAD_ROBUST_PRIO_INHERIT = 247;\n\nconst int _SC_THREAD_ROBUST_PRIO_PROTECT = 248;\n\nconst int _CS_PATH = 0;\n\nconst int _CS_V6_WIDTH_RESTRICTED_ENVS = 1;\n\nconst int _CS_GNU_LIBC_VERSION = 2;\n\nconst int _CS_GNU_LIBPTHREAD_VERSION = 3;\n\nconst int _CS_V5_WIDTH_RESTRICTED_ENVS = 4;\n\nconst int _CS_V7_WIDTH_RESTRICTED_ENVS = 5;\n\nconst int _CS_LFS_CFLAGS = 1000;\n\nconst int _CS_LFS_LDFLAGS = 1001;\n\nconst int _CS_LFS_LIBS = 1002;\n\nconst int _CS_LFS_LINTFLAGS = 1003;\n\nconst int _CS_LFS64_CFLAGS = 1004;\n\nconst int _CS_LFS64_LDFLAGS = 1005;\n\nconst int _CS_LFS64_LIBS = 1006;\n\nconst int _CS_LFS64_LINTFLAGS = 1007;\n\nconst int _CS_XBS5_ILP32_OFF32_CFLAGS = 1100;\n\nconst int _CS_XBS5_ILP32_OFF32_LDFLAGS = 1101;\n\nconst int _CS_XBS5_ILP32_OFF32_LIBS = 1102;\n\nconst int _CS_XBS5_ILP32_OFF32_LINTFLAGS = 1103;\n\nconst int _CS_XBS5_ILP32_OFFBIG_CFLAGS = 1104;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LDFLAGS = 1105;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LIBS = 1106;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LINTFLAGS = 1107;\n\nconst int _CS_XBS5_LP64_OFF64_CFLAGS = 1108;\n\nconst int _CS_XBS5_LP64_OFF64_LDFLAGS = 1109;\n\nconst int _CS_XBS5_LP64_OFF64_LIBS = 1110;\n\nconst int _CS_XBS5_LP64_OFF64_LINTFLAGS = 1111;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_CFLAGS = 1112;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LDFLAGS = 1113;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LIBS = 1114;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS = 1115;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_CFLAGS = 1116;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LDFLAGS = 1117;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LIBS = 1118;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS = 1119;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS = 1120;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS = 1121;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LIBS = 1122;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS = 1123;\n\nconst int _CS_POSIX_V6_LP64_OFF64_CFLAGS = 1124;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LDFLAGS = 1125;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LIBS = 1126;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LINTFLAGS = 1127;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS = 1128;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS = 1129;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LIBS = 1130;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS = 1131;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_CFLAGS = 1132;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LDFLAGS = 1133;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LIBS = 1134;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS = 1135;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS = 1136;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS = 1137;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LIBS = 1138;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS = 1139;\n\nconst int _CS_POSIX_V7_LP64_OFF64_CFLAGS = 1140;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LDFLAGS = 1141;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LIBS = 1142;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LINTFLAGS = 1143;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS = 1144;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS = 1145;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LIBS = 1146;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS = 1147;\n\nconst int _CS_V6_ENV = 1148;\n\nconst int _CS_V7_ENV = 1149;\n\nconst int SND_SEQ_EVFLG_RESULT = 0;\n\nconst int SND_SEQ_EVFLG_NOTE = 1;\n\nconst int SND_SEQ_EVFLG_CONTROL = 2;\n\nconst int SND_SEQ_EVFLG_QUEUE = 3;\n\nconst int SND_SEQ_EVFLG_SYSTEM = 4;\n\nconst int SND_SEQ_EVFLG_MESSAGE = 5;\n\nconst int SND_SEQ_EVFLG_CONNECTION = 6;\n\nconst int SND_SEQ_EVFLG_SAMPLE = 7;\n\nconst int SND_SEQ_EVFLG_USERS = 8;\n\nconst int SND_SEQ_EVFLG_INSTR = 9;\n\nconst int SND_SEQ_EVFLG_QUOTE = 10;\n\nconst int SND_SEQ_EVFLG_NONE = 11;\n\nconst int SND_SEQ_EVFLG_RAW = 12;\n\nconst int SND_SEQ_EVFLG_FIXED = 13;\n\nconst int SND_SEQ_EVFLG_VARIABLE = 14;\n\nconst int SND_SEQ_EVFLG_VARUSR = 15;\n\nconst int SND_SEQ_EVFLG_NOTE_ONEARG = 0;\n\nconst int SND_SEQ_EVFLG_NOTE_TWOARG = 1;\n\nconst int SND_SEQ_EVFLG_QUEUE_NOARG = 0;\n\nconst int SND_SEQ_EVFLG_QUEUE_TICK = 1;\n\nconst int SND_SEQ_EVFLG_QUEUE_TIME = 2;\n\nconst int SND_SEQ_EVFLG_QUEUE_VALUE = 3;\n\nconst int _UNISTD_H = 1;\n\nconst int _FEATURES_H = 1;\n\nconst int _DEFAULT_SOURCE = 1;\n\nconst int __USE_ISOC11 = 1;\n\nconst int __USE_ISOC99 = 1;\n\nconst int __USE_ISOC95 = 1;\n\nconst int _POSIX_SOURCE = 1;\n\nconst int _POSIX_C_SOURCE = 200809;\n\nconst int __USE_POSIX = 1;\n\nconst int __USE_POSIX2 = 1;\n\nconst int __USE_POSIX199309 = 1;\n\nconst int __USE_POSIX199506 = 1;\n\nconst int __USE_XOPEN2K = 1;\n\nconst int __USE_XOPEN2K8 = 1;\n\nconst int _ATFILE_SOURCE = 1;\n\nconst int __USE_MISC = 1;\n\nconst int __USE_ATFILE = 1;\n\nconst int __USE_FORTIFY_LEVEL = 0;\n\nconst int __GLIBC_USE_DEPRECATED_GETS = 0;\n\nconst int _STDC_PREDEF_H = 1;\n\nconst int __STDC_IEC_559__ = 1;\n\nconst int __STDC_IEC_559_COMPLEX__ = 1;\n\nconst int __STDC_ISO_10646__ = 201706;\n\nconst int __GNU_LIBRARY__ = 6;\n\nconst int __GLIBC__ = 2;\n\nconst int __GLIBC_MINOR__ = 27;\n\nconst int _SYS_CDEFS_H = 1;\n\nconst int __glibc_c99_flexarr_available = 1;\n\nconst int __WORDSIZE = 64;\n\nconst int __WORDSIZE_TIME64_COMPAT32 = 1;\n\nconst int __SYSCALL_WORDSIZE = 64;\n\nconst int __HAVE_GENERIC_SELECTION = 0;\n\nconst int _POSIX_VERSION = 200809;\n\nconst int __POSIX2_THIS_VERSION = 200809;\n\nconst int _POSIX2_VERSION = 200809;\n\nconst int _POSIX2_C_VERSION = 200809;\n\nconst int _POSIX2_C_BIND = 200809;\n\nconst int _POSIX2_C_DEV = 200809;\n\nconst int _POSIX2_SW_DEV = 200809;\n\nconst int _POSIX2_LOCALEDEF = 200809;\n\nconst int _XOPEN_VERSION = 700;\n\nconst int _XOPEN_XCU_VERSION = 4;\n\nconst int _XOPEN_XPG2 = 1;\n\nconst int _XOPEN_XPG3 = 1;\n\nconst int _XOPEN_XPG4 = 1;\n\nconst int _XOPEN_UNIX = 1;\n\nconst int _XOPEN_ENH_I18N = 1;\n\nconst int _XOPEN_LEGACY = 1;\n\nconst int _BITS_POSIX_OPT_H = 1;\n\nconst int _POSIX_JOB_CONTROL = 1;\n\nconst int _POSIX_SAVED_IDS = 1;\n\nconst int _POSIX_PRIORITY_SCHEDULING = 200809;\n\nconst int _POSIX_SYNCHRONIZED_IO = 200809;\n\nconst int _POSIX_FSYNC = 200809;\n\nconst int _POSIX_MAPPED_FILES = 200809;\n\nconst int _POSIX_MEMLOCK = 200809;\n\nconst int _POSIX_MEMLOCK_RANGE = 200809;\n\nconst int _POSIX_MEMORY_PROTECTION = 200809;\n\nconst int _POSIX_CHOWN_RESTRICTED = 0;\n\nconst int _POSIX_VDISABLE = 0;\n\nconst int _POSIX_NO_TRUNC = 1;\n\nconst int _XOPEN_REALTIME = 1;\n\nconst int _XOPEN_REALTIME_THREADS = 1;\n\nconst int _XOPEN_SHM = 1;\n\nconst int _POSIX_THREADS = 200809;\n\nconst int _POSIX_REENTRANT_FUNCTIONS = 1;\n\nconst int _POSIX_THREAD_SAFE_FUNCTIONS = 200809;\n\nconst int _POSIX_THREAD_PRIORITY_SCHEDULING = 200809;\n\nconst int _POSIX_THREAD_ATTR_STACKSIZE = 200809;\n\nconst int _POSIX_THREAD_ATTR_STACKADDR = 200809;\n\nconst int _POSIX_THREAD_PRIO_INHERIT = 200809;\n\nconst int _POSIX_THREAD_PRIO_PROTECT = 200809;\n\nconst int _POSIX_THREAD_ROBUST_PRIO_INHERIT = 200809;\n\nconst int _POSIX_THREAD_ROBUST_PRIO_PROTECT = -1;\n\nconst int _POSIX_SEMAPHORES = 200809;\n\nconst int _POSIX_REALTIME_SIGNALS = 200809;\n\nconst int _POSIX_ASYNCHRONOUS_IO = 200809;\n\nconst int _POSIX_ASYNC_IO = 1;\n\nconst int _LFS_ASYNCHRONOUS_IO = 1;\n\nconst int _POSIX_PRIORITIZED_IO = 200809;\n\nconst int _LFS64_ASYNCHRONOUS_IO = 1;\n\nconst int _LFS_LARGEFILE = 1;\n\nconst int _LFS64_LARGEFILE = 1;\n\nconst int _LFS64_STDIO = 1;\n\nconst int _POSIX_SHARED_MEMORY_OBJECTS = 200809;\n\nconst int _POSIX_CPUTIME = 0;\n\nconst int _POSIX_THREAD_CPUTIME = 0;\n\nconst int _POSIX_REGEXP = 1;\n\nconst int _POSIX_READER_WRITER_LOCKS = 200809;\n\nconst int _POSIX_SHELL = 1;\n\nconst int _POSIX_TIMEOUTS = 200809;\n\nconst int _POSIX_SPIN_LOCKS = 200809;\n\nconst int _POSIX_SPAWN = 200809;\n\nconst int _POSIX_TIMERS = 200809;\n\nconst int _POSIX_BARRIERS = 200809;\n\nconst int _POSIX_MESSAGE_PASSING = 200809;\n\nconst int _POSIX_THREAD_PROCESS_SHARED = 200809;\n\nconst int _POSIX_MONOTONIC_CLOCK = 0;\n\nconst int _POSIX_CLOCK_SELECTION = 200809;\n\nconst int _POSIX_ADVISORY_INFO = 200809;\n\nconst int _POSIX_IPV6 = 200809;\n\nconst int _POSIX_RAW_SOCKETS = 200809;\n\nconst int _POSIX2_CHAR_TERM = 200809;\n\nconst int _POSIX_SPORADIC_SERVER = -1;\n\nconst int _POSIX_THREAD_SPORADIC_SERVER = -1;\n\nconst int _POSIX_TRACE = -1;\n\nconst int _POSIX_TRACE_EVENT_FILTER = -1;\n\nconst int _POSIX_TRACE_INHERIT = -1;\n\nconst int _POSIX_TRACE_LOG = -1;\n\nconst int _POSIX_TYPED_MEMORY_OBJECTS = -1;\n\nconst int _POSIX_V7_LPBIG_OFFBIG = -1;\n\nconst int _POSIX_V6_LPBIG_OFFBIG = -1;\n\nconst int _XBS5_LPBIG_OFFBIG = -1;\n\nconst int _POSIX_V7_LP64_OFF64 = 1;\n\nconst int _POSIX_V6_LP64_OFF64 = 1;\n\nconst int _XBS5_LP64_OFF64 = 1;\n\nconst String __ILP32_OFF32_CFLAGS = '-m32';\n\nconst String __ILP32_OFF32_LDFLAGS = '-m32';\n\nconst String __ILP32_OFFBIG_CFLAGS =\n    '-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64';\n\nconst String __ILP32_OFFBIG_LDFLAGS = '-m32';\n\nconst String __LP64_OFF64_CFLAGS = '-m64';\n\nconst String __LP64_OFF64_LDFLAGS = '-m64';\n\nconst int STDIN_FILENO = 0;\n\nconst int STDOUT_FILENO = 1;\n\nconst int STDERR_FILENO = 2;\n\nconst int _BITS_TYPES_H = 1;\n\nconst int _BITS_TYPESIZES_H = 1;\n\nconst int __OFF_T_MATCHES_OFF64_T = 1;\n\nconst int __INO_T_MATCHES_INO64_T = 1;\n\nconst int __RLIM_T_MATCHES_RLIM64_T = 1;\n\nconst int __FD_SETSIZE = 1024;\n\nconst int NULL = 0;\n\nconst int R_OK = 4;\n\nconst int W_OK = 2;\n\nconst int X_OK = 1;\n\nconst int F_OK = 0;\n\nconst int SEEK_SET = 0;\n\nconst int SEEK_CUR = 1;\n\nconst int SEEK_END = 2;\n\nconst int L_SET = 0;\n\nconst int L_INCR = 1;\n\nconst int L_XTND = 2;\n\nconst int _PC_LINK_MAX_1 = 0;\n\nconst int _PC_MAX_CANON_1 = 1;\n\nconst int _PC_MAX_INPUT_1 = 2;\n\nconst int _PC_NAME_MAX_1 = 3;\n\nconst int _PC_PATH_MAX_1 = 4;\n\nconst int _PC_PIPE_BUF_1 = 5;\n\nconst int _PC_CHOWN_RESTRICTED_1 = 6;\n\nconst int _PC_NO_TRUNC_1 = 7;\n\nconst int _PC_VDISABLE_1 = 8;\n\nconst int _PC_SYNC_IO_1 = 9;\n\nconst int _PC_ASYNC_IO_1 = 10;\n\nconst int _PC_PRIO_IO_1 = 11;\n\nconst int _PC_SOCK_MAXBUF_1 = 12;\n\nconst int _PC_FILESIZEBITS_1 = 13;\n\nconst int _PC_REC_INCR_XFER_SIZE_1 = 14;\n\nconst int _PC_REC_MAX_XFER_SIZE_1 = 15;\n\nconst int _PC_REC_MIN_XFER_SIZE_1 = 16;\n\nconst int _PC_REC_XFER_ALIGN_1 = 17;\n\nconst int _PC_ALLOC_SIZE_MIN_1 = 18;\n\nconst int _PC_SYMLINK_MAX_1 = 19;\n\nconst int _PC_2_SYMLINKS_1 = 20;\n\nconst int _SC_ARG_MAX_1 = 0;\n\nconst int _SC_CHILD_MAX_1 = 1;\n\nconst int _SC_CLK_TCK_1 = 2;\n\nconst int _SC_NGROUPS_MAX_1 = 3;\n\nconst int _SC_OPEN_MAX_1 = 4;\n\nconst int _SC_STREAM_MAX_1 = 5;\n\nconst int _SC_TZNAME_MAX_1 = 6;\n\nconst int _SC_JOB_CONTROL_1 = 7;\n\nconst int _SC_SAVED_IDS_1 = 8;\n\nconst int _SC_REALTIME_SIGNALS_1 = 9;\n\nconst int _SC_PRIORITY_SCHEDULING_1 = 10;\n\nconst int _SC_TIMERS_1 = 11;\n\nconst int _SC_ASYNCHRONOUS_IO_1 = 12;\n\nconst int _SC_PRIORITIZED_IO_1 = 13;\n\nconst int _SC_SYNCHRONIZED_IO_1 = 14;\n\nconst int _SC_FSYNC_1 = 15;\n\nconst int _SC_MAPPED_FILES_1 = 16;\n\nconst int _SC_MEMLOCK_1 = 17;\n\nconst int _SC_MEMLOCK_RANGE_1 = 18;\n\nconst int _SC_MEMORY_PROTECTION_1 = 19;\n\nconst int _SC_MESSAGE_PASSING_1 = 20;\n\nconst int _SC_SEMAPHORES_1 = 21;\n\nconst int _SC_SHARED_MEMORY_OBJECTS_1 = 22;\n\nconst int _SC_AIO_LISTIO_MAX_1 = 23;\n\nconst int _SC_AIO_MAX_1 = 24;\n\nconst int _SC_AIO_PRIO_DELTA_MAX_1 = 25;\n\nconst int _SC_DELAYTIMER_MAX_1 = 26;\n\nconst int _SC_MQ_OPEN_MAX_1 = 27;\n\nconst int _SC_MQ_PRIO_MAX_1 = 28;\n\nconst int _SC_VERSION_1 = 29;\n\nconst int _SC_PAGESIZE_1 = 30;\n\nconst int _SC_PAGE_SIZE = 30;\n\nconst int _SC_RTSIG_MAX_1 = 31;\n\nconst int _SC_SEM_NSEMS_MAX_1 = 32;\n\nconst int _SC_SEM_VALUE_MAX_1 = 33;\n\nconst int _SC_SIGQUEUE_MAX_1 = 34;\n\nconst int _SC_TIMER_MAX_1 = 35;\n\nconst int _SC_BC_BASE_MAX_1 = 36;\n\nconst int _SC_BC_DIM_MAX_1 = 37;\n\nconst int _SC_BC_SCALE_MAX_1 = 38;\n\nconst int _SC_BC_STRING_MAX_1 = 39;\n\nconst int _SC_COLL_WEIGHTS_MAX_1 = 40;\n\nconst int _SC_EQUIV_CLASS_MAX_1 = 41;\n\nconst int _SC_EXPR_NEST_MAX_1 = 42;\n\nconst int _SC_LINE_MAX_1 = 43;\n\nconst int _SC_RE_DUP_MAX_1 = 44;\n\nconst int _SC_CHARCLASS_NAME_MAX_1 = 45;\n\nconst int _SC_2_VERSION_1 = 46;\n\nconst int _SC_2_C_BIND_1 = 47;\n\nconst int _SC_2_C_DEV_1 = 48;\n\nconst int _SC_2_FORT_DEV_1 = 49;\n\nconst int _SC_2_FORT_RUN_1 = 50;\n\nconst int _SC_2_SW_DEV_1 = 51;\n\nconst int _SC_2_LOCALEDEF_1 = 52;\n\nconst int _SC_PII_1 = 53;\n\nconst int _SC_PII_XTI_1 = 54;\n\nconst int _SC_PII_SOCKET_1 = 55;\n\nconst int _SC_PII_INTERNET_1 = 56;\n\nconst int _SC_PII_OSI_1 = 57;\n\nconst int _SC_POLL_1 = 58;\n\nconst int _SC_SELECT_1 = 59;\n\nconst int _SC_UIO_MAXIOV_1 = 60;\n\nconst int _SC_IOV_MAX_1 = 60;\n\nconst int _SC_PII_INTERNET_STREAM_1 = 61;\n\nconst int _SC_PII_INTERNET_DGRAM_1 = 62;\n\nconst int _SC_PII_OSI_COTS_1 = 63;\n\nconst int _SC_PII_OSI_CLTS_1 = 64;\n\nconst int _SC_PII_OSI_M_1 = 65;\n\nconst int _SC_T_IOV_MAX_1 = 66;\n\nconst int _SC_THREADS_1 = 67;\n\nconst int _SC_THREAD_SAFE_FUNCTIONS_1 = 68;\n\nconst int _SC_GETGR_R_SIZE_MAX_1 = 69;\n\nconst int _SC_GETPW_R_SIZE_MAX_1 = 70;\n\nconst int _SC_LOGIN_NAME_MAX_1 = 71;\n\nconst int _SC_TTY_NAME_MAX_1 = 72;\n\nconst int _SC_THREAD_DESTRUCTOR_ITERATIONS_1 = 73;\n\nconst int _SC_THREAD_KEYS_MAX_1 = 74;\n\nconst int _SC_THREAD_STACK_MIN_1 = 75;\n\nconst int _SC_THREAD_THREADS_MAX_1 = 76;\n\nconst int _SC_THREAD_ATTR_STACKADDR_1 = 77;\n\nconst int _SC_THREAD_ATTR_STACKSIZE_1 = 78;\n\nconst int _SC_THREAD_PRIORITY_SCHEDULING_1 = 79;\n\nconst int _SC_THREAD_PRIO_INHERIT_1 = 80;\n\nconst int _SC_THREAD_PRIO_PROTECT_1 = 81;\n\nconst int _SC_THREAD_PROCESS_SHARED_1 = 82;\n\nconst int _SC_NPROCESSORS_CONF_1 = 83;\n\nconst int _SC_NPROCESSORS_ONLN_1 = 84;\n\nconst int _SC_PHYS_PAGES_1 = 85;\n\nconst int _SC_AVPHYS_PAGES_1 = 86;\n\nconst int _SC_ATEXIT_MAX_1 = 87;\n\nconst int _SC_PASS_MAX_1 = 88;\n\nconst int _SC_XOPEN_VERSION_1 = 89;\n\nconst int _SC_XOPEN_XCU_VERSION_1 = 90;\n\nconst int _SC_XOPEN_UNIX_1 = 91;\n\nconst int _SC_XOPEN_CRYPT_1 = 92;\n\nconst int _SC_XOPEN_ENH_I18N_1 = 93;\n\nconst int _SC_XOPEN_SHM_1 = 94;\n\nconst int _SC_2_CHAR_TERM_1 = 95;\n\nconst int _SC_2_C_VERSION_1 = 96;\n\nconst int _SC_2_UPE_1 = 97;\n\nconst int _SC_XOPEN_XPG2_1 = 98;\n\nconst int _SC_XOPEN_XPG3_1 = 99;\n\nconst int _SC_XOPEN_XPG4_1 = 100;\n\nconst int _SC_CHAR_BIT_1 = 101;\n\nconst int _SC_CHAR_MAX_1 = 102;\n\nconst int _SC_CHAR_MIN_1 = 103;\n\nconst int _SC_INT_MAX_1 = 104;\n\nconst int _SC_INT_MIN_1 = 105;\n\nconst int _SC_LONG_BIT_1 = 106;\n\nconst int _SC_WORD_BIT_1 = 107;\n\nconst int _SC_MB_LEN_MAX_1 = 108;\n\nconst int _SC_NZERO_1 = 109;\n\nconst int _SC_SSIZE_MAX_1 = 110;\n\nconst int _SC_SCHAR_MAX_1 = 111;\n\nconst int _SC_SCHAR_MIN_1 = 112;\n\nconst int _SC_SHRT_MAX_1 = 113;\n\nconst int _SC_SHRT_MIN_1 = 114;\n\nconst int _SC_UCHAR_MAX_1 = 115;\n\nconst int _SC_UINT_MAX_1 = 116;\n\nconst int _SC_ULONG_MAX_1 = 117;\n\nconst int _SC_USHRT_MAX_1 = 118;\n\nconst int _SC_NL_ARGMAX_1 = 119;\n\nconst int _SC_NL_LANGMAX_1 = 120;\n\nconst int _SC_NL_MSGMAX_1 = 121;\n\nconst int _SC_NL_NMAX_1 = 122;\n\nconst int _SC_NL_SETMAX_1 = 123;\n\nconst int _SC_NL_TEXTMAX_1 = 124;\n\nconst int _SC_XBS5_ILP32_OFF32_1 = 125;\n\nconst int _SC_XBS5_ILP32_OFFBIG_1 = 126;\n\nconst int _SC_XBS5_LP64_OFF64_1 = 127;\n\nconst int _SC_XBS5_LPBIG_OFFBIG_1 = 128;\n\nconst int _SC_XOPEN_LEGACY_1 = 129;\n\nconst int _SC_XOPEN_REALTIME_1 = 130;\n\nconst int _SC_XOPEN_REALTIME_THREADS_1 = 131;\n\nconst int _SC_ADVISORY_INFO_1 = 132;\n\nconst int _SC_BARRIERS_1 = 133;\n\nconst int _SC_BASE_1 = 134;\n\nconst int _SC_C_LANG_SUPPORT_1 = 135;\n\nconst int _SC_C_LANG_SUPPORT_R_1 = 136;\n\nconst int _SC_CLOCK_SELECTION_1 = 137;\n\nconst int _SC_CPUTIME_1 = 138;\n\nconst int _SC_THREAD_CPUTIME_1 = 139;\n\nconst int _SC_DEVICE_IO_1 = 140;\n\nconst int _SC_DEVICE_SPECIFIC_1 = 141;\n\nconst int _SC_DEVICE_SPECIFIC_R_1 = 142;\n\nconst int _SC_FD_MGMT_1 = 143;\n\nconst int _SC_FIFO_1 = 144;\n\nconst int _SC_PIPE_1 = 145;\n\nconst int _SC_FILE_ATTRIBUTES_1 = 146;\n\nconst int _SC_FILE_LOCKING_1 = 147;\n\nconst int _SC_FILE_SYSTEM_1 = 148;\n\nconst int _SC_MONOTONIC_CLOCK_1 = 149;\n\nconst int _SC_MULTI_PROCESS_1 = 150;\n\nconst int _SC_SINGLE_PROCESS_1 = 151;\n\nconst int _SC_NETWORKING_1 = 152;\n\nconst int _SC_READER_WRITER_LOCKS_1 = 153;\n\nconst int _SC_SPIN_LOCKS_1 = 154;\n\nconst int _SC_REGEXP_1 = 155;\n\nconst int _SC_REGEX_VERSION_1 = 156;\n\nconst int _SC_SHELL_1 = 157;\n\nconst int _SC_SIGNALS_1 = 158;\n\nconst int _SC_SPAWN_1 = 159;\n\nconst int _SC_SPORADIC_SERVER_1 = 160;\n\nconst int _SC_THREAD_SPORADIC_SERVER_1 = 161;\n\nconst int _SC_SYSTEM_DATABASE_1 = 162;\n\nconst int _SC_SYSTEM_DATABASE_R_1 = 163;\n\nconst int _SC_TIMEOUTS_1 = 164;\n\nconst int _SC_TYPED_MEMORY_OBJECTS_1 = 165;\n\nconst int _SC_USER_GROUPS_1 = 166;\n\nconst int _SC_USER_GROUPS_R_1 = 167;\n\nconst int _SC_2_PBS_1 = 168;\n\nconst int _SC_2_PBS_ACCOUNTING_1 = 169;\n\nconst int _SC_2_PBS_LOCATE_1 = 170;\n\nconst int _SC_2_PBS_MESSAGE_1 = 171;\n\nconst int _SC_2_PBS_TRACK_1 = 172;\n\nconst int _SC_SYMLOOP_MAX_1 = 173;\n\nconst int _SC_STREAMS_1 = 174;\n\nconst int _SC_2_PBS_CHECKPOINT_1 = 175;\n\nconst int _SC_V6_ILP32_OFF32_1 = 176;\n\nconst int _SC_V6_ILP32_OFFBIG_1 = 177;\n\nconst int _SC_V6_LP64_OFF64_1 = 178;\n\nconst int _SC_V6_LPBIG_OFFBIG_1 = 179;\n\nconst int _SC_HOST_NAME_MAX_1 = 180;\n\nconst int _SC_TRACE_1 = 181;\n\nconst int _SC_TRACE_EVENT_FILTER_1 = 182;\n\nconst int _SC_TRACE_INHERIT_1 = 183;\n\nconst int _SC_TRACE_LOG_1 = 184;\n\nconst int _SC_LEVEL1_ICACHE_SIZE_1 = 185;\n\nconst int _SC_LEVEL1_ICACHE_ASSOC_1 = 186;\n\nconst int _SC_LEVEL1_ICACHE_LINESIZE_1 = 187;\n\nconst int _SC_LEVEL1_DCACHE_SIZE_1 = 188;\n\nconst int _SC_LEVEL1_DCACHE_ASSOC_1 = 189;\n\nconst int _SC_LEVEL1_DCACHE_LINESIZE_1 = 190;\n\nconst int _SC_LEVEL2_CACHE_SIZE_1 = 191;\n\nconst int _SC_LEVEL2_CACHE_ASSOC_1 = 192;\n\nconst int _SC_LEVEL2_CACHE_LINESIZE_1 = 193;\n\nconst int _SC_LEVEL3_CACHE_SIZE_1 = 194;\n\nconst int _SC_LEVEL3_CACHE_ASSOC_1 = 195;\n\nconst int _SC_LEVEL3_CACHE_LINESIZE_1 = 196;\n\nconst int _SC_LEVEL4_CACHE_SIZE_1 = 197;\n\nconst int _SC_LEVEL4_CACHE_ASSOC_1 = 198;\n\nconst int _SC_LEVEL4_CACHE_LINESIZE_1 = 199;\n\nconst int _SC_IPV6_1 = 235;\n\nconst int _SC_RAW_SOCKETS_1 = 236;\n\nconst int _SC_V7_ILP32_OFF32_1 = 237;\n\nconst int _SC_V7_ILP32_OFFBIG_1 = 238;\n\nconst int _SC_V7_LP64_OFF64_1 = 239;\n\nconst int _SC_V7_LPBIG_OFFBIG_1 = 240;\n\nconst int _SC_SS_REPL_MAX_1 = 241;\n\nconst int _SC_TRACE_EVENT_NAME_MAX_1 = 242;\n\nconst int _SC_TRACE_NAME_MAX_1 = 243;\n\nconst int _SC_TRACE_SYS_MAX_1 = 244;\n\nconst int _SC_TRACE_USER_EVENT_MAX_1 = 245;\n\nconst int _SC_XOPEN_STREAMS_1 = 246;\n\nconst int _SC_THREAD_ROBUST_PRIO_INHERIT_1 = 247;\n\nconst int _SC_THREAD_ROBUST_PRIO_PROTECT_1 = 248;\n\nconst int _CS_PATH_1 = 0;\n\nconst int _CS_V6_WIDTH_RESTRICTED_ENVS_1 = 1;\n\nconst int _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS = 1;\n\nconst int _CS_GNU_LIBC_VERSION_1 = 2;\n\nconst int _CS_GNU_LIBPTHREAD_VERSION_1 = 3;\n\nconst int _CS_V5_WIDTH_RESTRICTED_ENVS_1 = 4;\n\nconst int _CS_POSIX_V5_WIDTH_RESTRICTED_ENVS = 4;\n\nconst int _CS_V7_WIDTH_RESTRICTED_ENVS_1 = 5;\n\nconst int _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS = 5;\n\nconst int _CS_LFS_CFLAGS_1 = 1000;\n\nconst int _CS_LFS_LDFLAGS_1 = 1001;\n\nconst int _CS_LFS_LIBS_1 = 1002;\n\nconst int _CS_LFS_LINTFLAGS_1 = 1003;\n\nconst int _CS_LFS64_CFLAGS_1 = 1004;\n\nconst int _CS_LFS64_LDFLAGS_1 = 1005;\n\nconst int _CS_LFS64_LIBS_1 = 1006;\n\nconst int _CS_LFS64_LINTFLAGS_1 = 1007;\n\nconst int _CS_XBS5_ILP32_OFF32_CFLAGS_1 = 1100;\n\nconst int _CS_XBS5_ILP32_OFF32_LDFLAGS_1 = 1101;\n\nconst int _CS_XBS5_ILP32_OFF32_LIBS_1 = 1102;\n\nconst int _CS_XBS5_ILP32_OFF32_LINTFLAGS_1 = 1103;\n\nconst int _CS_XBS5_ILP32_OFFBIG_CFLAGS_1 = 1104;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LDFLAGS_1 = 1105;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LIBS_1 = 1106;\n\nconst int _CS_XBS5_ILP32_OFFBIG_LINTFLAGS_1 = 1107;\n\nconst int _CS_XBS5_LP64_OFF64_CFLAGS_1 = 1108;\n\nconst int _CS_XBS5_LP64_OFF64_LDFLAGS_1 = 1109;\n\nconst int _CS_XBS5_LP64_OFF64_LIBS_1 = 1110;\n\nconst int _CS_XBS5_LP64_OFF64_LINTFLAGS_1 = 1111;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_CFLAGS_1 = 1112;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LDFLAGS_1 = 1113;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LIBS_1 = 1114;\n\nconst int _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS_1 = 1115;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_CFLAGS_1 = 1116;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LDFLAGS_1 = 1117;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LIBS_1 = 1118;\n\nconst int _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS_1 = 1119;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS_1 = 1120;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS_1 = 1121;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LIBS_1 = 1122;\n\nconst int _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS_1 = 1123;\n\nconst int _CS_POSIX_V6_LP64_OFF64_CFLAGS_1 = 1124;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LDFLAGS_1 = 1125;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LIBS_1 = 1126;\n\nconst int _CS_POSIX_V6_LP64_OFF64_LINTFLAGS_1 = 1127;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS_1 = 1128;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS_1 = 1129;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LIBS_1 = 1130;\n\nconst int _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS_1 = 1131;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_CFLAGS_1 = 1132;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LDFLAGS_1 = 1133;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LIBS_1 = 1134;\n\nconst int _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS_1 = 1135;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS_1 = 1136;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS_1 = 1137;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LIBS_1 = 1138;\n\nconst int _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS_1 = 1139;\n\nconst int _CS_POSIX_V7_LP64_OFF64_CFLAGS_1 = 1140;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LDFLAGS_1 = 1141;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LIBS_1 = 1142;\n\nconst int _CS_POSIX_V7_LP64_OFF64_LINTFLAGS_1 = 1143;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS_1 = 1144;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS_1 = 1145;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LIBS_1 = 1146;\n\nconst int _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS_1 = 1147;\n\nconst int _CS_V6_ENV_1 = 1148;\n\nconst int _CS_V7_ENV_1 = 1149;\n\nconst int _GETOPT_POSIX_H = 1;\n\nconst int _GETOPT_CORE_H = 1;\n\nconst int F_ULOCK = 0;\n\nconst int F_LOCK = 1;\n\nconst int F_TLOCK = 2;\n\nconst int F_TEST = 3;\n\nconst int _STDIO_H = 1;\n\nconst int __GLIBC_USE_LIB_EXT2 = 1;\n\nconst int __GLIBC_USE_IEC_60559_BFP_EXT = 1;\n\nconst int __GLIBC_USE_IEC_60559_FUNCS_EXT = 1;\n\nconst int __GLIBC_USE_IEC_60559_TYPES_EXT = 1;\n\nconst int __GNUC_VA_LIST = 1;\n\nconst int ____mbstate_t_defined = 1;\n\nconst int ____FILE_defined = 1;\n\nconst int __FILE_defined = 1;\n\nconst int _IO_EOF_SEEN = 16;\n\nconst int _IO_ERR_SEEN = 32;\n\nconst int _IO_USER_LOCK = 32768;\n\nconst int _IOFBF = 0;\n\nconst int _IOLBF = 1;\n\nconst int _IONBF = 2;\n\nconst int BUFSIZ = 8192;\n\nconst int EOF = -1;\n\nconst String P_tmpdir = '/tmp';\n\nconst int _BITS_STDIO_LIM_H = 1;\n\nconst int L_tmpnam = 20;\n\nconst int TMP_MAX = 238328;\n\nconst int FILENAME_MAX = 4096;\n\nconst int L_ctermid = 9;\n\nconst int FOPEN_MAX = 16;\n\nconst int _STDLIB_H = 1;\n\nconst int WNOHANG = 1;\n\nconst int WUNTRACED = 2;\n\nconst int WSTOPPED = 2;\n\nconst int WEXITED = 4;\n\nconst int WCONTINUED = 8;\n\nconst int WNOWAIT = 16777216;\n\nconst int __WNOTHREAD = 536870912;\n\nconst int __WALL = 1073741824;\n\nconst int __WCLONE = 2147483648;\n\nconst int __ENUM_IDTYPE_T = 1;\n\nconst int __W_CONTINUED = 65535;\n\nconst int __WCOREFLAG = 128;\n\nconst int __HAVE_FLOAT128 = 0;\n\nconst int __HAVE_DISTINCT_FLOAT128 = 0;\n\nconst int __HAVE_FLOAT64X = 1;\n\nconst int __HAVE_FLOAT64X_LONG_DOUBLE = 1;\n\nconst int __HAVE_FLOAT16 = 0;\n\nconst int __HAVE_FLOAT32 = 1;\n\nconst int __HAVE_FLOAT64 = 1;\n\nconst int __HAVE_FLOAT32X = 1;\n\nconst int __HAVE_FLOAT128X = 0;\n\nconst int __HAVE_DISTINCT_FLOAT16 = 0;\n\nconst int __HAVE_DISTINCT_FLOAT32 = 0;\n\nconst int __HAVE_DISTINCT_FLOAT64 = 0;\n\nconst int __HAVE_DISTINCT_FLOAT32X = 0;\n\nconst int __HAVE_DISTINCT_FLOAT64X = 0;\n\nconst int __HAVE_DISTINCT_FLOAT128X = 0;\n\nconst int __HAVE_FLOATN_NOT_TYPEDEF = 0;\n\nconst int __ldiv_t_defined = 1;\n\nconst int __lldiv_t_defined = 1;\n\nconst int RAND_MAX = 2147483647;\n\nconst int EXIT_FAILURE = 1;\n\nconst int EXIT_SUCCESS = 0;\n\nconst int _SYS_TYPES_H = 1;\n\nconst int __clock_t_defined = 1;\n\nconst int __clockid_t_defined = 1;\n\nconst int __time_t_defined = 1;\n\nconst int __timer_t_defined = 1;\n\nconst int _BITS_STDINT_INTN_H = 1;\n\nconst int __BIT_TYPES_DEFINED__ = 1;\n\nconst int _ENDIAN_H = 1;\n\nconst int __LITTLE_ENDIAN = 1234;\n\nconst int __BIG_ENDIAN = 4321;\n\nconst int __PDP_ENDIAN = 3412;\n\nconst int __BYTE_ORDER = 1234;\n\nconst int __FLOAT_WORD_ORDER = 1234;\n\nconst int LITTLE_ENDIAN = 1234;\n\nconst int BIG_ENDIAN = 4321;\n\nconst int PDP_ENDIAN = 3412;\n\nconst int BYTE_ORDER = 1234;\n\nconst int _BITS_BYTESWAP_H = 1;\n\nconst int _BITS_UINTN_IDENTITY_H = 1;\n\nconst int _SYS_SELECT_H = 1;\n\nconst String __FD_ZERO_STOS = 'stosq';\n\nconst int __sigset_t_defined = 1;\n\nconst int _SIGSET_NWORDS = 16;\n\nconst int __timeval_defined = 1;\n\nconst int _STRUCT_TIMESPEC = 1;\n\nconst int __NFDBITS = 64;\n\nconst int FD_SETSIZE = 1024;\n\nconst int NFDBITS = 64;\n\nconst int _BITS_PTHREADTYPES_COMMON_H = 1;\n\nconst int _THREAD_SHARED_TYPES_H = 1;\n\nconst int _BITS_PTHREADTYPES_ARCH_H = 1;\n\nconst int __SIZEOF_PTHREAD_MUTEX_T = 40;\n\nconst int __SIZEOF_PTHREAD_ATTR_T = 56;\n\nconst int __SIZEOF_PTHREAD_RWLOCK_T = 56;\n\nconst int __SIZEOF_PTHREAD_BARRIER_T = 32;\n\nconst int __SIZEOF_PTHREAD_MUTEXATTR_T = 4;\n\nconst int __SIZEOF_PTHREAD_COND_T = 48;\n\nconst int __SIZEOF_PTHREAD_CONDATTR_T = 4;\n\nconst int __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;\n\nconst int __SIZEOF_PTHREAD_BARRIERATTR_T = 4;\n\nconst int __PTHREAD_MUTEX_HAVE_PREV = 1;\n\nconst int __PTHREAD_RWLOCK_ELISION_EXTRA = 0;\n\nconst int __have_pthread_attr_t = 1;\n\nconst int _ALLOCA_H = 1;\n\nconst int _STRING_H = 1;\n\nconst int _BITS_TYPES_LOCALE_T_H = 1;\n\nconst int _BITS_TYPES___LOCALE_T_H = 1;\n\nconst int _STRINGS_H = 1;\n\nconst int _FCNTL_H = 1;\n\nconst int __O_LARGEFILE = 0;\n\nconst int F_GETLK64 = 5;\n\nconst int F_SETLK64 = 6;\n\nconst int F_SETLKW64 = 7;\n\nconst int O_ACCMODE = 3;\n\nconst int O_RDONLY = 0;\n\nconst int O_WRONLY = 1;\n\nconst int O_RDWR = 2;\n\nconst int O_CREAT = 64;\n\nconst int O_EXCL = 128;\n\nconst int O_NOCTTY = 256;\n\nconst int O_TRUNC = 512;\n\nconst int O_APPEND = 1024;\n\nconst int O_NONBLOCK = 2048;\n\nconst int O_NDELAY = 2048;\n\nconst int O_SYNC = 1052672;\n\nconst int O_FSYNC = 1052672;\n\nconst int O_ASYNC = 8192;\n\nconst int __O_DIRECTORY = 65536;\n\nconst int __O_NOFOLLOW = 131072;\n\nconst int __O_CLOEXEC = 524288;\n\nconst int __O_DIRECT = 16384;\n\nconst int __O_NOATIME = 262144;\n\nconst int __O_PATH = 2097152;\n\nconst int __O_DSYNC = 4096;\n\nconst int __O_TMPFILE = 4259840;\n\nconst int F_GETLK = 5;\n\nconst int F_SETLK = 6;\n\nconst int F_SETLKW = 7;\n\nconst int O_DIRECTORY = 65536;\n\nconst int O_NOFOLLOW = 131072;\n\nconst int O_CLOEXEC = 524288;\n\nconst int O_DSYNC = 4096;\n\nconst int O_RSYNC = 1052672;\n\nconst int F_DUPFD = 0;\n\nconst int F_GETFD = 1;\n\nconst int F_SETFD = 2;\n\nconst int F_GETFL = 3;\n\nconst int F_SETFL = 4;\n\nconst int __F_SETOWN = 8;\n\nconst int __F_GETOWN = 9;\n\nconst int F_SETOWN = 8;\n\nconst int F_GETOWN = 9;\n\nconst int __F_SETSIG = 10;\n\nconst int __F_GETSIG = 11;\n\nconst int __F_SETOWN_EX = 15;\n\nconst int __F_GETOWN_EX = 16;\n\nconst int F_DUPFD_CLOEXEC = 1030;\n\nconst int FD_CLOEXEC = 1;\n\nconst int F_RDLCK = 0;\n\nconst int F_WRLCK = 1;\n\nconst int F_UNLCK = 2;\n\nconst int F_EXLCK = 4;\n\nconst int F_SHLCK = 8;\n\nconst int LOCK_SH = 1;\n\nconst int LOCK_EX = 2;\n\nconst int LOCK_NB = 4;\n\nconst int LOCK_UN = 8;\n\nconst int FAPPEND = 1024;\n\nconst int FFSYNC = 1052672;\n\nconst int FASYNC = 8192;\n\nconst int FNONBLOCK = 2048;\n\nconst int FNDELAY = 2048;\n\nconst int __POSIX_FADV_DONTNEED = 4;\n\nconst int __POSIX_FADV_NOREUSE = 5;\n\nconst int POSIX_FADV_NORMAL = 0;\n\nconst int POSIX_FADV_RANDOM = 1;\n\nconst int POSIX_FADV_SEQUENTIAL = 2;\n\nconst int POSIX_FADV_WILLNEED = 3;\n\nconst int POSIX_FADV_DONTNEED = 4;\n\nconst int POSIX_FADV_NOREUSE = 5;\n\nconst int AT_FDCWD = -100;\n\nconst int AT_SYMLINK_NOFOLLOW = 256;\n\nconst int AT_REMOVEDIR = 512;\n\nconst int AT_SYMLINK_FOLLOW = 1024;\n\nconst int AT_EACCESS = 512;\n\nconst int _BITS_STAT_H = 1;\n\nconst int _STAT_VER_KERNEL = 0;\n\nconst int _STAT_VER_LINUX = 1;\n\nconst int _MKNOD_VER_LINUX = 0;\n\nconst int _STAT_VER = 1;\n\nconst int __S_IFMT = 61440;\n\nconst int __S_IFDIR = 16384;\n\nconst int __S_IFCHR = 8192;\n\nconst int __S_IFBLK = 24576;\n\nconst int __S_IFREG = 32768;\n\nconst int __S_IFIFO = 4096;\n\nconst int __S_IFLNK = 40960;\n\nconst int __S_IFSOCK = 49152;\n\nconst int __S_ISUID = 2048;\n\nconst int __S_ISGID = 1024;\n\nconst int __S_ISVTX = 512;\n\nconst int __S_IREAD = 256;\n\nconst int __S_IWRITE = 128;\n\nconst int __S_IEXEC = 64;\n\nconst int UTIME_NOW = 1073741823;\n\nconst int UTIME_OMIT = 1073741822;\n\nconst int S_IFMT = 61440;\n\nconst int S_IFDIR = 16384;\n\nconst int S_IFCHR = 8192;\n\nconst int S_IFBLK = 24576;\n\nconst int S_IFREG = 32768;\n\nconst int S_IFIFO = 4096;\n\nconst int S_IFLNK = 40960;\n\nconst int S_IFSOCK = 49152;\n\nconst int S_ISUID = 2048;\n\nconst int S_ISGID = 1024;\n\nconst int S_ISVTX = 512;\n\nconst int S_IRUSR = 256;\n\nconst int S_IWUSR = 128;\n\nconst int S_IXUSR = 64;\n\nconst int S_IRWXU = 448;\n\nconst int S_IRGRP = 32;\n\nconst int S_IWGRP = 16;\n\nconst int S_IXGRP = 8;\n\nconst int S_IRWXG = 56;\n\nconst int S_IROTH = 4;\n\nconst int S_IWOTH = 2;\n\nconst int S_IXOTH = 1;\n\nconst int S_IRWXO = 7;\n\nconst int _ASSERT_H = 1;\n\nconst int _SYS_POLL_H = 1;\n\nconst int POLLIN = 1;\n\nconst int POLLPRI = 2;\n\nconst int POLLOUT = 4;\n\nconst int POLLRDNORM = 64;\n\nconst int POLLRDBAND = 128;\n\nconst int POLLWRNORM = 256;\n\nconst int POLLWRBAND = 512;\n\nconst int POLLERR = 8;\n\nconst int POLLHUP = 16;\n\nconst int POLLNVAL = 32;\n\nconst int _ERRNO_H = 1;\n\nconst int _BITS_ERRNO_H = 1;\n\nconst int EPERM = 1;\n\nconst int ENOENT = 2;\n\nconst int ESRCH = 3;\n\nconst int EINTR = 4;\n\nconst int EIO = 5;\n\nconst int ENXIO = 6;\n\nconst int E2BIG = 7;\n\nconst int ENOEXEC = 8;\n\nconst int EBADF = 9;\n\nconst int ECHILD = 10;\n\nconst int EAGAIN = 11;\n\nconst int ENOMEM = 12;\n\nconst int EACCES = 13;\n\nconst int EFAULT = 14;\n\nconst int ENOTBLK = 15;\n\nconst int EBUSY = 16;\n\nconst int EEXIST = 17;\n\nconst int EXDEV = 18;\n\nconst int ENODEV = 19;\n\nconst int ENOTDIR = 20;\n\nconst int EISDIR = 21;\n\nconst int EINVAL = 22;\n\nconst int ENFILE = 23;\n\nconst int EMFILE = 24;\n\nconst int ENOTTY = 25;\n\nconst int ETXTBSY = 26;\n\nconst int EFBIG = 27;\n\nconst int ENOSPC = 28;\n\nconst int ESPIPE = 29;\n\nconst int EROFS = 30;\n\nconst int EMLINK = 31;\n\nconst int EPIPE = 32;\n\nconst int EDOM = 33;\n\nconst int ERANGE = 34;\n\nconst int EDEADLK = 35;\n\nconst int ENAMETOOLONG = 36;\n\nconst int ENOLCK = 37;\n\nconst int ENOSYS = 38;\n\nconst int ENOTEMPTY = 39;\n\nconst int ELOOP = 40;\n\nconst int EWOULDBLOCK = 11;\n\nconst int ENOMSG = 42;\n\nconst int EIDRM = 43;\n\nconst int ECHRNG = 44;\n\nconst int EL2NSYNC = 45;\n\nconst int EL3HLT = 46;\n\nconst int EL3RST = 47;\n\nconst int ELNRNG = 48;\n\nconst int EUNATCH = 49;\n\nconst int ENOCSI = 50;\n\nconst int EL2HLT = 51;\n\nconst int EBADE = 52;\n\nconst int EBADR = 53;\n\nconst int EXFULL = 54;\n\nconst int ENOANO = 55;\n\nconst int EBADRQC = 56;\n\nconst int EBADSLT = 57;\n\nconst int EDEADLOCK = 35;\n\nconst int EBFONT = 59;\n\nconst int ENOSTR = 60;\n\nconst int ENODATA = 61;\n\nconst int ETIME = 62;\n\nconst int ENOSR = 63;\n\nconst int ENONET = 64;\n\nconst int ENOPKG = 65;\n\nconst int EREMOTE = 66;\n\nconst int ENOLINK = 67;\n\nconst int EADV = 68;\n\nconst int ESRMNT = 69;\n\nconst int ECOMM = 70;\n\nconst int EPROTO = 71;\n\nconst int EMULTIHOP = 72;\n\nconst int EDOTDOT = 73;\n\nconst int EBADMSG = 74;\n\nconst int EOVERFLOW = 75;\n\nconst int ENOTUNIQ = 76;\n\nconst int EBADFD = 77;\n\nconst int EREMCHG = 78;\n\nconst int ELIBACC = 79;\n\nconst int ELIBBAD = 80;\n\nconst int ELIBSCN = 81;\n\nconst int ELIBMAX = 82;\n\nconst int ELIBEXEC = 83;\n\nconst int EILSEQ = 84;\n\nconst int ERESTART = 85;\n\nconst int ESTRPIPE = 86;\n\nconst int EUSERS = 87;\n\nconst int ENOTSOCK = 88;\n\nconst int EDESTADDRREQ = 89;\n\nconst int EMSGSIZE = 90;\n\nconst int EPROTOTYPE = 91;\n\nconst int ENOPROTOOPT = 92;\n\nconst int EPROTONOSUPPORT = 93;\n\nconst int ESOCKTNOSUPPORT = 94;\n\nconst int EOPNOTSUPP = 95;\n\nconst int EPFNOSUPPORT = 96;\n\nconst int EAFNOSUPPORT = 97;\n\nconst int EADDRINUSE = 98;\n\nconst int EADDRNOTAVAIL = 99;\n\nconst int ENETDOWN = 100;\n\nconst int ENETUNREACH = 101;\n\nconst int ENETRESET = 102;\n\nconst int ECONNABORTED = 103;\n\nconst int ECONNRESET = 104;\n\nconst int ENOBUFS = 105;\n\nconst int EISCONN = 106;\n\nconst int ENOTCONN = 107;\n\nconst int ESHUTDOWN = 108;\n\nconst int ETOOMANYREFS = 109;\n\nconst int ETIMEDOUT = 110;\n\nconst int ECONNREFUSED = 111;\n\nconst int EHOSTDOWN = 112;\n\nconst int EHOSTUNREACH = 113;\n\nconst int EALREADY = 114;\n\nconst int EINPROGRESS = 115;\n\nconst int ESTALE = 116;\n\nconst int EUCLEAN = 117;\n\nconst int ENOTNAM = 118;\n\nconst int ENAVAIL = 119;\n\nconst int EISNAM = 120;\n\nconst int EREMOTEIO = 121;\n\nconst int EDQUOT = 122;\n\nconst int ENOMEDIUM = 123;\n\nconst int EMEDIUMTYPE = 124;\n\nconst int ECANCELED = 125;\n\nconst int ENOKEY = 126;\n\nconst int EKEYEXPIRED = 127;\n\nconst int EKEYREVOKED = 128;\n\nconst int EKEYREJECTED = 129;\n\nconst int EOWNERDEAD = 130;\n\nconst int ENOTRECOVERABLE = 131;\n\nconst int ERFKILL = 132;\n\nconst int EHWPOISON = 133;\n\nconst int ENOTSUP = 95;\n\nconst int IEC958_AES0_PROFESSIONAL = 1;\n\nconst int IEC958_AES0_NONAUDIO = 2;\n\nconst int IEC958_AES0_PRO_EMPHASIS = 28;\n\nconst int IEC958_AES0_PRO_EMPHASIS_NOTID = 0;\n\nconst int IEC958_AES0_PRO_EMPHASIS_NONE = 4;\n\nconst int IEC958_AES0_PRO_EMPHASIS_5015 = 12;\n\nconst int IEC958_AES0_PRO_EMPHASIS_CCITT = 28;\n\nconst int IEC958_AES0_PRO_FREQ_UNLOCKED = 32;\n\nconst int IEC958_AES0_PRO_FS = 192;\n\nconst int IEC958_AES0_PRO_FS_NOTID = 0;\n\nconst int IEC958_AES0_PRO_FS_44100 = 64;\n\nconst int IEC958_AES0_PRO_FS_48000 = 128;\n\nconst int IEC958_AES0_PRO_FS_32000 = 192;\n\nconst int IEC958_AES0_CON_NOT_COPYRIGHT = 4;\n\nconst int IEC958_AES0_CON_EMPHASIS = 56;\n\nconst int IEC958_AES0_CON_EMPHASIS_NONE = 0;\n\nconst int IEC958_AES0_CON_EMPHASIS_5015 = 8;\n\nconst int IEC958_AES0_CON_MODE = 192;\n\nconst int IEC958_AES1_PRO_MODE = 15;\n\nconst int IEC958_AES1_PRO_MODE_NOTID = 0;\n\nconst int IEC958_AES1_PRO_MODE_STEREOPHONIC = 2;\n\nconst int IEC958_AES1_PRO_MODE_SINGLE = 4;\n\nconst int IEC958_AES1_PRO_MODE_TWO = 8;\n\nconst int IEC958_AES1_PRO_MODE_PRIMARY = 12;\n\nconst int IEC958_AES1_PRO_MODE_BYTE3 = 15;\n\nconst int IEC958_AES1_PRO_USERBITS = 240;\n\nconst int IEC958_AES1_PRO_USERBITS_NOTID = 0;\n\nconst int IEC958_AES1_PRO_USERBITS_192 = 128;\n\nconst int IEC958_AES1_PRO_USERBITS_UDEF = 192;\n\nconst int IEC958_AES1_CON_CATEGORY = 127;\n\nconst int IEC958_AES1_CON_GENERAL = 0;\n\nconst int IEC958_AES1_CON_LASEROPT_MASK = 7;\n\nconst int IEC958_AES1_CON_LASEROPT_ID = 1;\n\nconst int IEC958_AES1_CON_IEC908_CD = 1;\n\nconst int IEC958_AES1_CON_NON_IEC908_CD = 9;\n\nconst int IEC958_AES1_CON_MINI_DISC = 73;\n\nconst int IEC958_AES1_CON_DVD = 25;\n\nconst int IEC958_AES1_CON_LASTEROPT_OTHER = 121;\n\nconst int IEC958_AES1_CON_DIGDIGCONV_MASK = 7;\n\nconst int IEC958_AES1_CON_DIGDIGCONV_ID = 2;\n\nconst int IEC958_AES1_CON_PCM_CODER = 2;\n\nconst int IEC958_AES1_CON_MIXER = 18;\n\nconst int IEC958_AES1_CON_RATE_CONVERTER = 26;\n\nconst int IEC958_AES1_CON_SAMPLER = 34;\n\nconst int IEC958_AES1_CON_DSP = 42;\n\nconst int IEC958_AES1_CON_DIGDIGCONV_OTHER = 122;\n\nconst int IEC958_AES1_CON_MAGNETIC_MASK = 7;\n\nconst int IEC958_AES1_CON_MAGNETIC_ID = 3;\n\nconst int IEC958_AES1_CON_DAT = 3;\n\nconst int IEC958_AES1_CON_VCR = 11;\n\nconst int IEC958_AES1_CON_DCC = 67;\n\nconst int IEC958_AES1_CON_MAGNETIC_DISC = 27;\n\nconst int IEC958_AES1_CON_MAGNETIC_OTHER = 123;\n\nconst int IEC958_AES1_CON_BROADCAST1_MASK = 7;\n\nconst int IEC958_AES1_CON_BROADCAST1_ID = 4;\n\nconst int IEC958_AES1_CON_DAB_JAPAN = 4;\n\nconst int IEC958_AES1_CON_DAB_EUROPE = 12;\n\nconst int IEC958_AES1_CON_DAB_USA = 100;\n\nconst int IEC958_AES1_CON_SOFTWARE = 68;\n\nconst int IEC958_AES1_CON_IEC62105 = 36;\n\nconst int IEC958_AES1_CON_BROADCAST1_OTHER = 124;\n\nconst int IEC958_AES1_CON_BROADCAST2_MASK = 15;\n\nconst int IEC958_AES1_CON_BROADCAST2_ID = 14;\n\nconst int IEC958_AES1_CON_MUSICAL_MASK = 7;\n\nconst int IEC958_AES1_CON_MUSICAL_ID = 5;\n\nconst int IEC958_AES1_CON_SYNTHESIZER = 5;\n\nconst int IEC958_AES1_CON_MICROPHONE = 13;\n\nconst int IEC958_AES1_CON_MUSICAL_OTHER = 125;\n\nconst int IEC958_AES1_CON_ADC_MASK = 31;\n\nconst int IEC958_AES1_CON_ADC_ID = 6;\n\nconst int IEC958_AES1_CON_ADC = 6;\n\nconst int IEC958_AES1_CON_ADC_OTHER = 102;\n\nconst int IEC958_AES1_CON_ADC_COPYRIGHT_MASK = 31;\n\nconst int IEC958_AES1_CON_ADC_COPYRIGHT_ID = 22;\n\nconst int IEC958_AES1_CON_ADC_COPYRIGHT = 22;\n\nconst int IEC958_AES1_CON_ADC_COPYRIGHT_OTHER = 118;\n\nconst int IEC958_AES1_CON_SOLIDMEM_MASK = 15;\n\nconst int IEC958_AES1_CON_SOLIDMEM_ID = 8;\n\nconst int IEC958_AES1_CON_SOLIDMEM_DIGITAL_RECORDER_PLAYER = 8;\n\nconst int IEC958_AES1_CON_SOLIDMEM_OTHER = 120;\n\nconst int IEC958_AES1_CON_EXPERIMENTAL = 64;\n\nconst int IEC958_AES1_CON_ORIGINAL = 128;\n\nconst int IEC958_AES2_PRO_SBITS = 7;\n\nconst int IEC958_AES2_PRO_SBITS_20 = 2;\n\nconst int IEC958_AES2_PRO_SBITS_24 = 4;\n\nconst int IEC958_AES2_PRO_SBITS_UDEF = 6;\n\nconst int IEC958_AES2_PRO_WORDLEN = 56;\n\nconst int IEC958_AES2_PRO_WORDLEN_NOTID = 0;\n\nconst int IEC958_AES2_PRO_WORDLEN_22_18 = 16;\n\nconst int IEC958_AES2_PRO_WORDLEN_23_19 = 32;\n\nconst int IEC958_AES2_PRO_WORDLEN_24_20 = 40;\n\nconst int IEC958_AES2_PRO_WORDLEN_20_16 = 48;\n\nconst int IEC958_AES2_CON_SOURCE = 15;\n\nconst int IEC958_AES2_CON_SOURCE_UNSPEC = 0;\n\nconst int IEC958_AES2_CON_CHANNEL = 240;\n\nconst int IEC958_AES2_CON_CHANNEL_UNSPEC = 0;\n\nconst int IEC958_AES3_CON_FS = 15;\n\nconst int IEC958_AES3_CON_FS_44100 = 0;\n\nconst int IEC958_AES3_CON_FS_NOTID = 1;\n\nconst int IEC958_AES3_CON_FS_48000 = 2;\n\nconst int IEC958_AES3_CON_FS_32000 = 3;\n\nconst int IEC958_AES3_CON_FS_22050 = 4;\n\nconst int IEC958_AES3_CON_FS_24000 = 6;\n\nconst int IEC958_AES3_CON_FS_88200 = 8;\n\nconst int IEC958_AES3_CON_FS_768000 = 9;\n\nconst int IEC958_AES3_CON_FS_96000 = 10;\n\nconst int IEC958_AES3_CON_FS_176400 = 12;\n\nconst int IEC958_AES3_CON_FS_192000 = 14;\n\nconst int IEC958_AES3_CON_CLOCK = 48;\n\nconst int IEC958_AES3_CON_CLOCK_1000PPM = 0;\n\nconst int IEC958_AES3_CON_CLOCK_50PPM = 16;\n\nconst int IEC958_AES3_CON_CLOCK_VARIABLE = 32;\n\nconst int IEC958_AES4_CON_MAX_WORDLEN_24 = 1;\n\nconst int IEC958_AES4_CON_WORDLEN = 14;\n\nconst int IEC958_AES4_CON_WORDLEN_NOTID = 0;\n\nconst int IEC958_AES4_CON_WORDLEN_20_16 = 2;\n\nconst int IEC958_AES4_CON_WORDLEN_22_18 = 4;\n\nconst int IEC958_AES4_CON_WORDLEN_23_19 = 8;\n\nconst int IEC958_AES4_CON_WORDLEN_24_20 = 10;\n\nconst int IEC958_AES4_CON_WORDLEN_21_17 = 12;\n\nconst int IEC958_AES4_CON_ORIGFS = 240;\n\nconst int IEC958_AES4_CON_ORIGFS_NOTID = 0;\n\nconst int IEC958_AES4_CON_ORIGFS_192000 = 16;\n\nconst int IEC958_AES4_CON_ORIGFS_12000 = 32;\n\nconst int IEC958_AES4_CON_ORIGFS_176400 = 48;\n\nconst int IEC958_AES4_CON_ORIGFS_96000 = 80;\n\nconst int IEC958_AES4_CON_ORIGFS_8000 = 96;\n\nconst int IEC958_AES4_CON_ORIGFS_88200 = 112;\n\nconst int IEC958_AES4_CON_ORIGFS_16000 = 128;\n\nconst int IEC958_AES4_CON_ORIGFS_24000 = 144;\n\nconst int IEC958_AES4_CON_ORIGFS_11025 = 160;\n\nconst int IEC958_AES4_CON_ORIGFS_22050 = 176;\n\nconst int IEC958_AES4_CON_ORIGFS_32000 = 192;\n\nconst int IEC958_AES4_CON_ORIGFS_48000 = 208;\n\nconst int IEC958_AES4_CON_ORIGFS_44100 = 240;\n\nconst int IEC958_AES5_CON_CGMSA = 3;\n\nconst int IEC958_AES5_CON_CGMSA_COPYFREELY = 0;\n\nconst int IEC958_AES5_CON_CGMSA_COPYONCE = 1;\n\nconst int IEC958_AES5_CON_CGMSA_COPYNOMORE = 2;\n\nconst int IEC958_AES5_CON_CGMSA_COPYNEVER = 3;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CC = 7;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT = 240;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_FROM_STREAM = 0;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_IEC60958 = 16;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_AC3 = 32;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_MPEG1 = 48;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_MP3 = 64;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_MPEG2_MULTICH = 80;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_AAC = 96;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_DTS = 112;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_ATRAC = 128;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_ONEBIT = 144;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_DOLBY_DIG_PLUS = 160;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_DTS_HD = 176;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_MAT = 192;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_DST = 208;\n\nconst int CEA861_AUDIO_INFOFRAME_DB1CT_WMA_PRO = 224;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF = 28;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_FROM_STREAM = 0;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_32000 = 4;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_44100 = 8;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_48000 = 12;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_88200 = 16;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_96000 = 20;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_176400 = 24;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SF_192000 = 28;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SS = 3;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SS_FROM_STREAM = 0;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SS_16BIT = 1;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SS_20BIT = 2;\n\nconst int CEA861_AUDIO_INFOFRAME_DB2SS_24BIT = 3;\n\nconst int CEA861_AUDIO_INFOFRAME_DB5_DM_INH = 128;\n\nconst int CEA861_AUDIO_INFOFRAME_DB5_DM_INH_PERMITTED = 0;\n\nconst int CEA861_AUDIO_INFOFRAME_DB5_DM_INH_PROHIBITED = 128;\n\nconst int CEA861_AUDIO_INFOFRAME_DB5_LSV = 120;\n\nconst int MIDI_CHANNELS = 16;\n\nconst int MIDI_GM_DRUM_CHANNEL = 9;\n\nconst int MIDI_CMD_NOTE_OFF = 128;\n\nconst int MIDI_CMD_NOTE_ON = 144;\n\nconst int MIDI_CMD_NOTE_PRESSURE = 160;\n\nconst int MIDI_CMD_CONTROL = 176;\n\nconst int MIDI_CMD_PGM_CHANGE = 192;\n\nconst int MIDI_CMD_CHANNEL_PRESSURE = 208;\n\nconst int MIDI_CMD_BENDER = 224;\n\nconst int MIDI_CMD_COMMON_SYSEX = 240;\n\nconst int MIDI_CMD_COMMON_MTC_QUARTER = 241;\n\nconst int MIDI_CMD_COMMON_SONG_POS = 242;\n\nconst int MIDI_CMD_COMMON_SONG_SELECT = 243;\n\nconst int MIDI_CMD_COMMON_TUNE_REQUEST = 246;\n\nconst int MIDI_CMD_COMMON_SYSEX_END = 247;\n\nconst int MIDI_CMD_COMMON_CLOCK = 248;\n\nconst int MIDI_CMD_COMMON_START = 250;\n\nconst int MIDI_CMD_COMMON_CONTINUE = 251;\n\nconst int MIDI_CMD_COMMON_STOP = 252;\n\nconst int MIDI_CMD_COMMON_SENSING = 254;\n\nconst int MIDI_CMD_COMMON_RESET = 255;\n\nconst int MIDI_CTL_MSB_BANK = 0;\n\nconst int MIDI_CTL_MSB_MODWHEEL = 1;\n\nconst int MIDI_CTL_MSB_BREATH = 2;\n\nconst int MIDI_CTL_MSB_FOOT = 4;\n\nconst int MIDI_CTL_MSB_PORTAMENTO_TIME = 5;\n\nconst int MIDI_CTL_MSB_DATA_ENTRY = 6;\n\nconst int MIDI_CTL_MSB_MAIN_VOLUME = 7;\n\nconst int MIDI_CTL_MSB_BALANCE = 8;\n\nconst int MIDI_CTL_MSB_PAN = 10;\n\nconst int MIDI_CTL_MSB_EXPRESSION = 11;\n\nconst int MIDI_CTL_MSB_EFFECT1 = 12;\n\nconst int MIDI_CTL_MSB_EFFECT2 = 13;\n\nconst int MIDI_CTL_MSB_GENERAL_PURPOSE1 = 16;\n\nconst int MIDI_CTL_MSB_GENERAL_PURPOSE2 = 17;\n\nconst int MIDI_CTL_MSB_GENERAL_PURPOSE3 = 18;\n\nconst int MIDI_CTL_MSB_GENERAL_PURPOSE4 = 19;\n\nconst int MIDI_CTL_LSB_BANK = 32;\n\nconst int MIDI_CTL_LSB_MODWHEEL = 33;\n\nconst int MIDI_CTL_LSB_BREATH = 34;\n\nconst int MIDI_CTL_LSB_FOOT = 36;\n\nconst int MIDI_CTL_LSB_PORTAMENTO_TIME = 37;\n\nconst int MIDI_CTL_LSB_DATA_ENTRY = 38;\n\nconst int MIDI_CTL_LSB_MAIN_VOLUME = 39;\n\nconst int MIDI_CTL_LSB_BALANCE = 40;\n\nconst int MIDI_CTL_LSB_PAN = 42;\n\nconst int MIDI_CTL_LSB_EXPRESSION = 43;\n\nconst int MIDI_CTL_LSB_EFFECT1 = 44;\n\nconst int MIDI_CTL_LSB_EFFECT2 = 45;\n\nconst int MIDI_CTL_LSB_GENERAL_PURPOSE1 = 48;\n\nconst int MIDI_CTL_LSB_GENERAL_PURPOSE2 = 49;\n\nconst int MIDI_CTL_LSB_GENERAL_PURPOSE3 = 50;\n\nconst int MIDI_CTL_LSB_GENERAL_PURPOSE4 = 51;\n\nconst int MIDI_CTL_SUSTAIN = 64;\n\nconst int MIDI_CTL_PORTAMENTO = 65;\n\nconst int MIDI_CTL_SOSTENUTO = 66;\n\nconst int MIDI_CTL_SUSTENUTO = 66;\n\nconst int MIDI_CTL_SOFT_PEDAL = 67;\n\nconst int MIDI_CTL_LEGATO_FOOTSWITCH = 68;\n\nconst int MIDI_CTL_HOLD2 = 69;\n\nconst int MIDI_CTL_SC1_SOUND_VARIATION = 70;\n\nconst int MIDI_CTL_SC2_TIMBRE = 71;\n\nconst int MIDI_CTL_SC3_RELEASE_TIME = 72;\n\nconst int MIDI_CTL_SC4_ATTACK_TIME = 73;\n\nconst int MIDI_CTL_SC5_BRIGHTNESS = 74;\n\nconst int MIDI_CTL_SC6 = 75;\n\nconst int MIDI_CTL_SC7 = 76;\n\nconst int MIDI_CTL_SC8 = 77;\n\nconst int MIDI_CTL_SC9 = 78;\n\nconst int MIDI_CTL_SC10 = 79;\n\nconst int MIDI_CTL_GENERAL_PURPOSE5 = 80;\n\nconst int MIDI_CTL_GENERAL_PURPOSE6 = 81;\n\nconst int MIDI_CTL_GENERAL_PURPOSE7 = 82;\n\nconst int MIDI_CTL_GENERAL_PURPOSE8 = 83;\n\nconst int MIDI_CTL_PORTAMENTO_CONTROL = 84;\n\nconst int MIDI_CTL_E1_REVERB_DEPTH = 91;\n\nconst int MIDI_CTL_E2_TREMOLO_DEPTH = 92;\n\nconst int MIDI_CTL_E3_CHORUS_DEPTH = 93;\n\nconst int MIDI_CTL_E4_DETUNE_DEPTH = 94;\n\nconst int MIDI_CTL_E5_PHASER_DEPTH = 95;\n\nconst int MIDI_CTL_DATA_INCREMENT = 96;\n\nconst int MIDI_CTL_DATA_DECREMENT = 97;\n\nconst int MIDI_CTL_NONREG_PARM_NUM_LSB = 98;\n\nconst int MIDI_CTL_NONREG_PARM_NUM_MSB = 99;\n\nconst int MIDI_CTL_REGIST_PARM_NUM_LSB = 100;\n\nconst int MIDI_CTL_REGIST_PARM_NUM_MSB = 101;\n\nconst int MIDI_CTL_ALL_SOUNDS_OFF = 120;\n\nconst int MIDI_CTL_RESET_CONTROLLERS = 121;\n\nconst int MIDI_CTL_LOCAL_CONTROL_SWITCH = 122;\n\nconst int MIDI_CTL_ALL_NOTES_OFF = 123;\n\nconst int MIDI_CTL_OMNI_OFF = 124;\n\nconst int MIDI_CTL_OMNI_ON = 125;\n\nconst int MIDI_CTL_MONO1 = 126;\n\nconst int MIDI_CTL_MONO2 = 127;\n\nconst int SND_LIB_MAJOR = 1;\n\nconst int SND_LIB_MINOR = 2;\n\nconst int SND_LIB_SUBMINOR = 2;\n\nconst int SND_LIB_EXTRAVER = 1000000;\n\nconst int SND_LIB_VERSION = 66050;\n\nconst String SND_LIB_VERSION_STR = '1.2.2';\n\nconst int _TIME_H = 1;\n\nconst int _BITS_TIME_H = 1;\n\nconst int CLOCKS_PER_SEC = 1000000;\n\nconst int CLOCK_REALTIME = 0;\n\nconst int CLOCK_MONOTONIC = 1;\n\nconst int CLOCK_PROCESS_CPUTIME_ID = 2;\n\nconst int CLOCK_THREAD_CPUTIME_ID = 3;\n\nconst int CLOCK_MONOTONIC_RAW = 4;\n\nconst int CLOCK_REALTIME_COARSE = 5;\n\nconst int CLOCK_MONOTONIC_COARSE = 6;\n\nconst int CLOCK_BOOTTIME = 7;\n\nconst int CLOCK_REALTIME_ALARM = 8;\n\nconst int CLOCK_BOOTTIME_ALARM = 9;\n\nconst int CLOCK_TAI = 11;\n\nconst int TIMER_ABSTIME = 1;\n\nconst int __struct_tm_defined = 1;\n\nconst int __itimerspec_defined = 1;\n\nconst int TIME_UTC = 1;\n\nconst int SND_ERROR_BEGIN = 500000;\n\nconst int SND_ERROR_INCOMPATIBLE_VERSION = 500000;\n\nconst int SND_ERROR_ALISP_NIL = 500001;\n\nconst int _STDINT_H = 1;\n\nconst int _BITS_WCHAR_H = 1;\n\nconst int __WCHAR_MAX = 2147483647;\n\nconst int __WCHAR_MIN = -2147483648;\n\nconst int _BITS_STDINT_UINTN_H = 1;\n\nconst int INT8_MIN = -128;\n\nconst int INT16_MIN = -32768;\n\nconst int INT32_MIN = -2147483648;\n\nconst int INT64_MIN = -9223372036854775808;\n\nconst int INT8_MAX = 127;\n\nconst int INT16_MAX = 32767;\n\nconst int INT32_MAX = 2147483647;\n\nconst int INT64_MAX = 9223372036854775807;\n\nconst int UINT8_MAX = 255;\n\nconst int UINT16_MAX = 65535;\n\nconst int UINT32_MAX = 4294967295;\n\nconst int UINT64_MAX = -1;\n\nconst int INT_LEAST8_MIN = -128;\n\nconst int INT_LEAST16_MIN = -32768;\n\nconst int INT_LEAST32_MIN = -2147483648;\n\nconst int INT_LEAST64_MIN = -9223372036854775808;\n\nconst int INT_LEAST8_MAX = 127;\n\nconst int INT_LEAST16_MAX = 32767;\n\nconst int INT_LEAST32_MAX = 2147483647;\n\nconst int INT_LEAST64_MAX = 9223372036854775807;\n\nconst int UINT_LEAST8_MAX = 255;\n\nconst int UINT_LEAST16_MAX = 65535;\n\nconst int UINT_LEAST32_MAX = 4294967295;\n\nconst int UINT_LEAST64_MAX = -1;\n\nconst int INT_FAST8_MIN = -128;\n\nconst int INT_FAST16_MIN = -9223372036854775808;\n\nconst int INT_FAST32_MIN = -9223372036854775808;\n\nconst int INT_FAST64_MIN = -9223372036854775808;\n\nconst int INT_FAST8_MAX = 127;\n\nconst int INT_FAST16_MAX = 9223372036854775807;\n\nconst int INT_FAST32_MAX = 9223372036854775807;\n\nconst int INT_FAST64_MAX = 9223372036854775807;\n\nconst int UINT_FAST8_MAX = 255;\n\nconst int UINT_FAST16_MAX = -1;\n\nconst int UINT_FAST32_MAX = -1;\n\nconst int UINT_FAST64_MAX = -1;\n\nconst int INTPTR_MIN = -9223372036854775808;\n\nconst int INTPTR_MAX = 9223372036854775807;\n\nconst int UINTPTR_MAX = -1;\n\nconst int INTMAX_MIN = -9223372036854775808;\n\nconst int INTMAX_MAX = 9223372036854775807;\n\nconst int UINTMAX_MAX = -1;\n\nconst int PTRDIFF_MIN = -9223372036854775808;\n\nconst int PTRDIFF_MAX = 9223372036854775807;\n\nconst int SIG_ATOMIC_MIN = -2147483648;\n\nconst int SIG_ATOMIC_MAX = 2147483647;\n\nconst int SIZE_MAX = -1;\n\nconst int WCHAR_MIN = -2147483648;\n\nconst int WCHAR_MAX = 2147483647;\n\nconst int WINT_MIN = 0;\n\nconst int WINT_MAX = 4294967295;\n\nconst int SND_PCM_NONBLOCK = 1;\n\nconst int SND_PCM_ASYNC = 2;\n\nconst int SND_PCM_ABORT = 32768;\n\nconst int SND_PCM_NO_AUTO_RESAMPLE = 65536;\n\nconst int SND_PCM_NO_AUTO_CHANNELS = 131072;\n\nconst int SND_PCM_NO_AUTO_FORMAT = 262144;\n\nconst int SND_PCM_NO_SOFTVOL = 524288;\n\nconst int SND_CHMAP_API_VERSION = 65537;\n\nconst int SND_CHMAP_POSITION_MASK = 65535;\n\nconst int SND_CHMAP_PHASE_INVERSE = 65536;\n\nconst int SND_CHMAP_DRIVER_SPEC = 131072;\n\nconst int SND_RAWMIDI_APPEND = 1;\n\nconst int SND_RAWMIDI_NONBLOCK = 2;\n\nconst int SND_RAWMIDI_SYNC = 4;\n\nconst int SND_TIMER_GLOBAL_SYSTEM = 0;\n\nconst int SND_TIMER_GLOBAL_RTC = 1;\n\nconst int SND_TIMER_GLOBAL_HPET = 2;\n\nconst int SND_TIMER_GLOBAL_HRTIMER = 3;\n\nconst int SND_TIMER_OPEN_NONBLOCK = 1;\n\nconst int SND_TIMER_OPEN_TREAD = 2;\n\nconst int SND_HWDEP_OPEN_READ = 0;\n\nconst int SND_HWDEP_OPEN_WRITE = 1;\n\nconst int SND_HWDEP_OPEN_DUPLEX = 2;\n\nconst int SND_HWDEP_OPEN_NONBLOCK = 2048;\n\nconst int SND_CTL_EVENT_MASK_REMOVE = 4294967295;\n\nconst int SND_CTL_EVENT_MASK_VALUE = 1;\n\nconst int SND_CTL_EVENT_MASK_INFO = 2;\n\nconst int SND_CTL_EVENT_MASK_ADD = 4;\n\nconst int SND_CTL_EVENT_MASK_TLV = 8;\n\nconst String SND_CTL_NAME_NONE = '';\n\nconst String SND_CTL_NAME_PLAYBACK = 'Playback ';\n\nconst String SND_CTL_NAME_CAPTURE = 'Capture ';\n\nconst String SND_CTL_NAME_IEC958_NONE = '';\n\nconst String SND_CTL_NAME_IEC958_SWITCH = 'Switch';\n\nconst String SND_CTL_NAME_IEC958_VOLUME = 'Volume';\n\nconst String SND_CTL_NAME_IEC958_DEFAULT = 'Default';\n\nconst String SND_CTL_NAME_IEC958_MASK = 'Mask';\n\nconst String SND_CTL_NAME_IEC958_CON_MASK = 'Con Mask';\n\nconst String SND_CTL_NAME_IEC958_PRO_MASK = 'Pro Mask';\n\nconst String SND_CTL_NAME_IEC958_PCM_STREAM = 'PCM Stream';\n\nconst int SND_CTL_POWER_MASK = 65280;\n\nconst int SND_CTL_POWER_D0 = 0;\n\nconst int SND_CTL_POWER_D1 = 256;\n\nconst int SND_CTL_POWER_D2 = 512;\n\nconst int SND_CTL_POWER_D3 = 768;\n\nconst int SND_CTL_POWER_D3hot = 768;\n\nconst int SND_CTL_POWER_D3cold = 769;\n\nconst int SND_CTL_TLVT_CONTAINER = 0;\n\nconst int SND_CTL_TLVT_DB_SCALE = 1;\n\nconst int SND_CTL_TLVT_DB_LINEAR = 2;\n\nconst int SND_CTL_TLVT_DB_RANGE = 3;\n\nconst int SND_CTL_TLVT_DB_MINMAX = 4;\n\nconst int SND_CTL_TLVT_DB_MINMAX_MUTE = 5;\n\nconst int SND_CTL_TLV_DB_GAIN_MUTE = -9999999;\n\nconst int SND_CTL_TLVT_CHMAP_FIXED = 257;\n\nconst int SND_CTL_TLVT_CHMAP_VAR = 258;\n\nconst int SND_CTL_TLVT_CHMAP_PAIRED = 259;\n\nconst int SND_CTL_NONBLOCK = 1;\n\nconst int SND_CTL_ASYNC = 2;\n\nconst int SND_CTL_READONLY = 4;\n\nconst int SND_SCTL_NOFREE = 1;\n\nconst int SND_SEQ_TIME_STAMP_TICK = 0;\n\nconst int SND_SEQ_TIME_STAMP_REAL = 1;\n\nconst int SND_SEQ_TIME_STAMP_MASK = 1;\n\nconst int SND_SEQ_TIME_MODE_ABS = 0;\n\nconst int SND_SEQ_TIME_MODE_REL = 2;\n\nconst int SND_SEQ_TIME_MODE_MASK = 2;\n\nconst int SND_SEQ_EVENT_LENGTH_FIXED = 0;\n\nconst int SND_SEQ_EVENT_LENGTH_VARIABLE = 4;\n\nconst int SND_SEQ_EVENT_LENGTH_VARUSR = 8;\n\nconst int SND_SEQ_EVENT_LENGTH_MASK = 12;\n\nconst int SND_SEQ_PRIORITY_NORMAL = 0;\n\nconst int SND_SEQ_PRIORITY_HIGH = 16;\n\nconst int SND_SEQ_PRIORITY_MASK = 16;\n\nconst int SND_SEQ_OPEN_OUTPUT = 1;\n\nconst int SND_SEQ_OPEN_INPUT = 2;\n\nconst int SND_SEQ_OPEN_DUPLEX = 3;\n\nconst int SND_SEQ_NONBLOCK = 1;\n\nconst int SND_SEQ_ADDRESS_UNKNOWN = 253;\n\nconst int SND_SEQ_ADDRESS_SUBSCRIBERS = 254;\n\nconst int SND_SEQ_ADDRESS_BROADCAST = 255;\n\nconst int SND_SEQ_CLIENT_SYSTEM = 0;\n\nconst int SND_SEQ_PORT_SYSTEM_TIMER = 0;\n\nconst int SND_SEQ_PORT_SYSTEM_ANNOUNCE = 1;\n\nconst int SND_SEQ_PORT_CAP_READ = 1;\n\nconst int SND_SEQ_PORT_CAP_WRITE = 2;\n\nconst int SND_SEQ_PORT_CAP_SYNC_READ = 4;\n\nconst int SND_SEQ_PORT_CAP_SYNC_WRITE = 8;\n\nconst int SND_SEQ_PORT_CAP_DUPLEX = 16;\n\nconst int SND_SEQ_PORT_CAP_SUBS_READ = 32;\n\nconst int SND_SEQ_PORT_CAP_SUBS_WRITE = 64;\n\nconst int SND_SEQ_PORT_CAP_NO_EXPORT = 128;\n\nconst int SND_SEQ_PORT_TYPE_SPECIFIC = 1;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_GENERIC = 2;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_GM = 4;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_GS = 8;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_XG = 16;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_MT32 = 32;\n\nconst int SND_SEQ_PORT_TYPE_MIDI_GM2 = 64;\n\nconst int SND_SEQ_PORT_TYPE_SYNTH = 1024;\n\nconst int SND_SEQ_PORT_TYPE_DIRECT_SAMPLE = 2048;\n\nconst int SND_SEQ_PORT_TYPE_SAMPLE = 4096;\n\nconst int SND_SEQ_PORT_TYPE_HARDWARE = 65536;\n\nconst int SND_SEQ_PORT_TYPE_SOFTWARE = 131072;\n\nconst int SND_SEQ_PORT_TYPE_SYNTHESIZER = 262144;\n\nconst int SND_SEQ_PORT_TYPE_PORT = 524288;\n\nconst int SND_SEQ_PORT_TYPE_APPLICATION = 1048576;\n\nconst int SND_SEQ_QUEUE_DIRECT = 253;\n\nconst int SND_SEQ_REMOVE_INPUT = 1;\n\nconst int SND_SEQ_REMOVE_OUTPUT = 2;\n\nconst int SND_SEQ_REMOVE_DEST = 4;\n\nconst int SND_SEQ_REMOVE_DEST_CHANNEL = 8;\n\nconst int SND_SEQ_REMOVE_TIME_BEFORE = 16;\n\nconst int SND_SEQ_REMOVE_TIME_AFTER = 32;\n\nconst int SND_SEQ_REMOVE_TIME_TICK = 64;\n\nconst int SND_SEQ_REMOVE_EVENT_TYPE = 128;\n\nconst int SND_SEQ_REMOVE_IGNORE_OFF = 256;\n\nconst int SND_SEQ_REMOVE_TAG_MATCH = 512;\n\ntypedef _c_access = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Int32 __type,\n);\n\ntypedef _dart_access = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __type,\n);\n\ntypedef _c_faccessat = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Int32 __type,\n  ffi.Int32 __flag,\n);\n\ntypedef _dart_faccessat = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  int __type,\n  int __flag,\n);\n\ntypedef _c_lseek = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Int64 __offset,\n  ffi.Int32 __whence,\n);\n\ntypedef _dart_lseek = int Function(\n  int __fd,\n  int __offset,\n  int __whence,\n);\n\ntypedef _c_close = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_close = int Function(\n  int __fd,\n);\n\ntypedef _c_read = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  ffi.Uint64 __nbytes,\n);\n\ntypedef _dart_read = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  int __nbytes,\n);\n\ntypedef _c_write = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_write = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  int __n,\n);\n\ntypedef _c_pread = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  ffi.Uint64 __nbytes,\n  ffi.Int64 __offset,\n);\n\ntypedef _dart_pread = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  int __nbytes,\n  int __offset,\n);\n\ntypedef _c_pwrite = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  ffi.Uint64 __n,\n  ffi.Int64 __offset,\n);\n\ntypedef _dart_pwrite = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Void> __buf,\n  int __n,\n  int __offset,\n);\n\ntypedef _c_pipe = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int32> __pipedes,\n);\n\ntypedef _dart_pipe = int Function(\n  ffi.Pointer<ffi.Int32> __pipedes,\n);\n\ntypedef _c_alarm = ffi.Uint32 Function(\n  ffi.Uint32 __seconds,\n);\n\ntypedef _dart_alarm = int Function(\n  int __seconds,\n);\n\ntypedef _c_sleep = ffi.Uint32 Function(\n  ffi.Uint32 __seconds,\n);\n\ntypedef _dart_sleep = int Function(\n  int __seconds,\n);\n\ntypedef _c_ualarm = ffi.Uint32 Function(\n  ffi.Uint32 __value,\n  ffi.Uint32 __interval,\n);\n\ntypedef _dart_ualarm = int Function(\n  int __value,\n  int __interval,\n);\n\ntypedef _c_usleep = ffi.Int32 Function(\n  ffi.Uint32 __useconds,\n);\n\ntypedef _dart_usleep = int Function(\n  int __useconds,\n);\n\ntypedef _c_pause = ffi.Int32 Function();\n\ntypedef _dart_pause = int Function();\n\ntypedef _c_chown = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __owner,\n  ffi.Uint32 __group,\n);\n\ntypedef _dart_chown = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  int __owner,\n  int __group,\n);\n\ntypedef _c_fchown = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Uint32 __owner,\n  ffi.Uint32 __group,\n);\n\ntypedef _dart_fchown = int Function(\n  int __fd,\n  int __owner,\n  int __group,\n);\n\ntypedef _c_lchown = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __owner,\n  ffi.Uint32 __group,\n);\n\ntypedef _dart_lchown = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  int __owner,\n  int __group,\n);\n\ntypedef _c_fchownat = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __owner,\n  ffi.Uint32 __group,\n  ffi.Int32 __flag,\n);\n\ntypedef _dart_fchownat = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  int __owner,\n  int __group,\n  int __flag,\n);\n\ntypedef _c_chdir = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _dart_chdir = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _c_fchdir = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_fchdir = int Function(\n  int __fd,\n);\n\ntypedef _c_getcwd = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_getcwd = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __buf,\n  int __size,\n);\n\ntypedef _c_getwd = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _dart_getwd = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _c_dup = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_dup = int Function(\n  int __fd,\n);\n\ntypedef _c_dup2 = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int32 __fd2,\n);\n\ntypedef _dart_dup2 = int Function(\n  int __fd,\n  int __fd2,\n);\n\ntypedef _c_execve = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n);\n\ntypedef _dart_execve = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n);\n\ntypedef _c_fexecve = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n);\n\ntypedef _dart_fexecve = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __envp,\n);\n\ntypedef _c_execv = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n);\n\ntypedef _dart_execv = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n);\n\ntypedef _c_execle = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _dart_execle = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _c_execl = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _dart_execl = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _c_execvp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n);\n\ntypedef _dart_execvp = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __argv,\n);\n\ntypedef _c_execlp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _dart_execlp = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Pointer<ffi.Int8> __arg,\n);\n\ntypedef _c_nice = ffi.Int32 Function(\n  ffi.Int32 __inc,\n);\n\ntypedef _dart_nice = int Function(\n  int __inc,\n);\n\ntypedef _c__exit = ffi.Void Function(\n  ffi.Int32 __status,\n);\n\ntypedef _dart__exit = void Function(\n  int __status,\n);\n\ntypedef _c_pathconf = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Int32 __name,\n);\n\ntypedef _dart_pathconf = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  int __name,\n);\n\ntypedef _c_fpathconf = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Int32 __name,\n);\n\ntypedef _dart_fpathconf = int Function(\n  int __fd,\n  int __name,\n);\n\ntypedef _c_sysconf = ffi.Int64 Function(\n  ffi.Int32 __name,\n);\n\ntypedef _dart_sysconf = int Function(\n  int __name,\n);\n\ntypedef _c_confstr = ffi.Uint64 Function(\n  ffi.Int32 __name,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_confstr = int Function(\n  int __name,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __len,\n);\n\ntypedef _c_getpid = ffi.Int32 Function();\n\ntypedef _dart_getpid = int Function();\n\ntypedef _c_getppid = ffi.Int32 Function();\n\ntypedef _dart_getppid = int Function();\n\ntypedef _c_getpgrp = ffi.Int32 Function();\n\ntypedef _dart_getpgrp = int Function();\n\ntypedef _c___getpgid = ffi.Int32 Function(\n  ffi.Int32 __pid,\n);\n\ntypedef _dart___getpgid = int Function(\n  int __pid,\n);\n\ntypedef _c_getpgid = ffi.Int32 Function(\n  ffi.Int32 __pid,\n);\n\ntypedef _dart_getpgid = int Function(\n  int __pid,\n);\n\ntypedef _c_setpgid = ffi.Int32 Function(\n  ffi.Int32 __pid,\n  ffi.Int32 __pgid,\n);\n\ntypedef _dart_setpgid = int Function(\n  int __pid,\n  int __pgid,\n);\n\ntypedef _c_setpgrp = ffi.Int32 Function();\n\ntypedef _dart_setpgrp = int Function();\n\ntypedef _c_setsid = ffi.Int32 Function();\n\ntypedef _dart_setsid = int Function();\n\ntypedef _c_getsid = ffi.Int32 Function(\n  ffi.Int32 __pid,\n);\n\ntypedef _dart_getsid = int Function(\n  int __pid,\n);\n\ntypedef _c_getuid = ffi.Uint32 Function();\n\ntypedef _dart_getuid = int Function();\n\ntypedef _c_geteuid = ffi.Uint32 Function();\n\ntypedef _dart_geteuid = int Function();\n\ntypedef _c_getgid = ffi.Uint32 Function();\n\ntypedef _dart_getgid = int Function();\n\ntypedef _c_getegid = ffi.Uint32 Function();\n\ntypedef _dart_getegid = int Function();\n\ntypedef _c_getgroups = ffi.Int32 Function(\n  ffi.Int32 __size,\n  ffi.Pointer<ffi.Uint32> __list,\n);\n\ntypedef _dart_getgroups = int Function(\n  int __size,\n  ffi.Pointer<ffi.Uint32> __list,\n);\n\ntypedef _c_setuid = ffi.Int32 Function(\n  ffi.Uint32 __uid,\n);\n\ntypedef _dart_setuid = int Function(\n  int __uid,\n);\n\ntypedef _c_setreuid = ffi.Int32 Function(\n  ffi.Uint32 __ruid,\n  ffi.Uint32 __euid,\n);\n\ntypedef _dart_setreuid = int Function(\n  int __ruid,\n  int __euid,\n);\n\ntypedef _c_seteuid = ffi.Int32 Function(\n  ffi.Uint32 __uid,\n);\n\ntypedef _dart_seteuid = int Function(\n  int __uid,\n);\n\ntypedef _c_setgid = ffi.Int32 Function(\n  ffi.Uint32 __gid,\n);\n\ntypedef _dart_setgid = int Function(\n  int __gid,\n);\n\ntypedef _c_setregid = ffi.Int32 Function(\n  ffi.Uint32 __rgid,\n  ffi.Uint32 __egid,\n);\n\ntypedef _dart_setregid = int Function(\n  int __rgid,\n  int __egid,\n);\n\ntypedef _c_setegid = ffi.Int32 Function(\n  ffi.Uint32 __gid,\n);\n\ntypedef _dart_setegid = int Function(\n  int __gid,\n);\n\ntypedef _c_fork = ffi.Int32 Function();\n\ntypedef _dart_fork = int Function();\n\ntypedef _c_vfork = ffi.Int32 Function();\n\ntypedef _dart_vfork = int Function();\n\ntypedef _c_ttyname = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_ttyname = ffi.Pointer<ffi.Int8> Function(\n  int __fd,\n);\n\ntypedef _c_ttyname_r = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __buflen,\n);\n\ntypedef _dart_ttyname_r = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __buflen,\n);\n\ntypedef _c_isatty = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_isatty = int Function(\n  int __fd,\n);\n\ntypedef _c_ttyslot = ffi.Int32 Function();\n\ntypedef _dart_ttyslot = int Function();\n\ntypedef _c_link = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _dart_link = int Function(\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _c_linkat = ffi.Int32 Function(\n  ffi.Int32 __fromfd,\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Int32 __tofd,\n  ffi.Pointer<ffi.Int8> __to,\n  ffi.Int32 __flags,\n);\n\ntypedef _dart_linkat = int Function(\n  int __fromfd,\n  ffi.Pointer<ffi.Int8> __from,\n  int __tofd,\n  ffi.Pointer<ffi.Int8> __to,\n  int __flags,\n);\n\ntypedef _c_symlink = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _dart_symlink = int Function(\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _c_readlink = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_readlink = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __len,\n);\n\ntypedef _c_symlinkat = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __from,\n  ffi.Int32 __tofd,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _dart_symlinkat = int Function(\n  ffi.Pointer<ffi.Int8> __from,\n  int __tofd,\n  ffi.Pointer<ffi.Int8> __to,\n);\n\ntypedef _c_readlinkat = ffi.Int64 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_readlinkat = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __path,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __len,\n);\n\ntypedef _c_unlink = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _dart_unlink = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _c_unlinkat = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Int32 __flag,\n);\n\ntypedef _dart_unlinkat = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __name,\n  int __flag,\n);\n\ntypedef _c_rmdir = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _dart_rmdir = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _c_tcgetpgrp = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_tcgetpgrp = int Function(\n  int __fd,\n);\n\ntypedef _c_tcsetpgrp = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int32 __pgrp_id,\n);\n\ntypedef _dart_tcsetpgrp = int Function(\n  int __fd,\n  int __pgrp_id,\n);\n\ntypedef _c_getlogin = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _dart_getlogin = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _c_getlogin_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Uint64 __name_len,\n);\n\ntypedef _dart_getlogin_r = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __name_len,\n);\n\ntypedef _c_setlogin = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _dart_setlogin = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _c_getopt = ffi.Int32 Function(\n  ffi.Int32 ___argc,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> ___argv,\n  ffi.Pointer<ffi.Int8> __shortopts,\n);\n\ntypedef _dart_getopt = int Function(\n  int ___argc,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> ___argv,\n  ffi.Pointer<ffi.Int8> __shortopts,\n);\n\ntypedef _c_gethostname = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_gethostname = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __len,\n);\n\ntypedef _c_sethostname = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_sethostname = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __len,\n);\n\ntypedef _c_sethostid = ffi.Int32 Function(\n  ffi.Int64 __id,\n);\n\ntypedef _dart_sethostid = int Function(\n  int __id,\n);\n\ntypedef _c_getdomainname = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_getdomainname = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __len,\n);\n\ntypedef _c_setdomainname = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_setdomainname = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  int __len,\n);\n\ntypedef _c_vhangup = ffi.Int32 Function();\n\ntypedef _dart_vhangup = int Function();\n\ntypedef _c_revoke = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n);\n\ntypedef _dart_revoke = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n);\n\ntypedef _c_profil = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __sample_buffer,\n  ffi.Uint64 __size,\n  ffi.Uint64 __offset,\n  ffi.Uint32 __scale,\n);\n\ntypedef _dart_profil = int Function(\n  ffi.Pointer<ffi.Uint16> __sample_buffer,\n  int __size,\n  int __offset,\n  int __scale,\n);\n\ntypedef _c_acct = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _dart_acct = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _c_getusershell = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _dart_getusershell = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _c_endusershell = ffi.Void Function();\n\ntypedef _dart_endusershell = void Function();\n\ntypedef _c_setusershell = ffi.Void Function();\n\ntypedef _dart_setusershell = void Function();\n\ntypedef _c_daemon = ffi.Int32 Function(\n  ffi.Int32 __nochdir,\n  ffi.Int32 __noclose,\n);\n\ntypedef _dart_daemon = int Function(\n  int __nochdir,\n  int __noclose,\n);\n\ntypedef _c_chroot = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _dart_chroot = int Function(\n  ffi.Pointer<ffi.Int8> __path,\n);\n\ntypedef _c_getpass = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __prompt,\n);\n\ntypedef _dart_getpass = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __prompt,\n);\n\ntypedef _c_fsync = ffi.Int32 Function(\n  ffi.Int32 __fd,\n);\n\ntypedef _dart_fsync = int Function(\n  int __fd,\n);\n\ntypedef _c_gethostid = ffi.Int64 Function();\n\ntypedef _dart_gethostid = int Function();\n\ntypedef _c_sync_1 = ffi.Void Function();\n\ntypedef _dart_sync_1 = void Function();\n\ntypedef _c_getpagesize = ffi.Int32 Function();\n\ntypedef _dart_getpagesize = int Function();\n\ntypedef _c_getdtablesize = ffi.Int32 Function();\n\ntypedef _dart_getdtablesize = int Function();\n\ntypedef _c_truncate = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Int64 __length,\n);\n\ntypedef _dart_truncate = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  int __length,\n);\n\ntypedef _c_ftruncate = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int64 __length,\n);\n\ntypedef _dart_ftruncate = int Function(\n  int __fd,\n  int __length,\n);\n\ntypedef _c_brk = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __addr,\n);\n\ntypedef _dart_brk = int Function(\n  ffi.Pointer<ffi.Void> __addr,\n);\n\ntypedef _c_sbrk = ffi.Pointer<ffi.Void> Function(\n  ffi.IntPtr __delta,\n);\n\ntypedef _dart_sbrk = ffi.Pointer<ffi.Void> Function(\n  int __delta,\n);\n\ntypedef _c_syscall = ffi.Int64 Function(\n  ffi.Int64 __sysno,\n);\n\ntypedef _dart_syscall = int Function(\n  int __sysno,\n);\n\ntypedef _c_lockf = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int32 __cmd,\n  ffi.Int64 __len,\n);\n\ntypedef _dart_lockf = int Function(\n  int __fd,\n  int __cmd,\n  int __len,\n);\n\ntypedef _c_fdatasync = ffi.Int32 Function(\n  ffi.Int32 __fildes,\n);\n\ntypedef _dart_fdatasync = int Function(\n  int __fildes,\n);\n\ntypedef _c_crypt = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __key,\n  ffi.Pointer<ffi.Int8> __salt,\n);\n\ntypedef _dart_crypt = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __key,\n  ffi.Pointer<ffi.Int8> __salt,\n);\n\ntypedef _c_getentropy = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __buffer,\n  ffi.Uint64 __length,\n);\n\ntypedef _dart_getentropy = int Function(\n  ffi.Pointer<ffi.Void> __buffer,\n  int __length,\n);\n\ntypedef _c_remove = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __filename,\n);\n\ntypedef _dart_remove = int Function(\n  ffi.Pointer<ffi.Int8> __filename,\n);\n\ntypedef _c_rename = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __old,\n  ffi.Pointer<ffi.Int8> __new,\n);\n\ntypedef _dart_rename = int Function(\n  ffi.Pointer<ffi.Int8> __old,\n  ffi.Pointer<ffi.Int8> __new,\n);\n\ntypedef _c_renameat = ffi.Int32 Function(\n  ffi.Int32 __oldfd,\n  ffi.Pointer<ffi.Int8> __old,\n  ffi.Int32 __newfd,\n  ffi.Pointer<ffi.Int8> __new,\n);\n\ntypedef _dart_renameat = int Function(\n  int __oldfd,\n  ffi.Pointer<ffi.Int8> __old,\n  int __newfd,\n  ffi.Pointer<ffi.Int8> __new,\n);\n\ntypedef _c_tmpfile = ffi.Pointer<IO_FILE_> Function();\n\ntypedef _dart_tmpfile = ffi.Pointer<IO_FILE_> Function();\n\ntypedef _c_tmpnam = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_tmpnam = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_tmpnam_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_tmpnam_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_tempnam = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dir,\n  ffi.Pointer<ffi.Int8> __pfx,\n);\n\ntypedef _dart_tempnam = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dir,\n  ffi.Pointer<ffi.Int8> __pfx,\n);\n\ntypedef _c_fclose = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fclose = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fflush = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fflush = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fflush_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fflush_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __filename,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _dart_fopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __filename,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _c_freopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __filename,\n  ffi.Pointer<ffi.Int8> __modes,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_freopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __filename,\n  ffi.Pointer<ffi.Int8> __modes,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fdopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _dart_fdopen = ffi.Pointer<IO_FILE_> Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _c_fmemopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Void> __s,\n  ffi.Uint64 __len,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _dart_fmemopen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Void> __s,\n  int __len,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _c_open_memstream = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __bufloc,\n  ffi.Pointer<ffi.Uint64> __sizeloc,\n);\n\ntypedef _dart_open_memstream = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __bufloc,\n  ffi.Pointer<ffi.Uint64> __sizeloc,\n);\n\ntypedef _c_setbuf = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _dart_setbuf = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _c_setvbuf = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Int32 __modes,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_setvbuf = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __modes,\n  int __n,\n);\n\ntypedef _c_setbuffer = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_setbuffer = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __size,\n);\n\ntypedef _c_setlinebuf = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_setlinebuf = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fprintf = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_fprintf = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_printf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_printf = int Function(\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_sprintf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_sprintf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_vfprintf = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vfprintf = int Function(\n  ffi.Pointer<IO_FILE_> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_vprintf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vprintf = int Function(\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_vsprintf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vsprintf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_snprintf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __maxlen,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_snprintf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __maxlen,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_vsnprintf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __maxlen,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vsnprintf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __maxlen,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_vdprintf = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __fmt,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vdprintf = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __fmt,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_dprintf = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __fmt,\n);\n\ntypedef _dart_dprintf = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __fmt,\n);\n\ntypedef _c_fscanf = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_fscanf = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_scanf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_scanf = int Function(\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_sscanf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _dart_sscanf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n);\n\ntypedef _c_vfscanf = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vfscanf = int Function(\n  ffi.Pointer<IO_FILE_> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_vscanf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vscanf = int Function(\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_vsscanf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _dart_vsscanf = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<_va_list_tag_> __arg,\n);\n\ntypedef _c_fgetc = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fgetc = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_getc = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_getc = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_getchar = ffi.Int32 Function();\n\ntypedef _dart_getchar = int Function();\n\ntypedef _c_getc_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_getc_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_getchar_unlocked = ffi.Int32 Function();\n\ntypedef _dart_getchar_unlocked = int Function();\n\ntypedef _c_fgetc_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fgetc_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fputc = ffi.Int32 Function(\n  ffi.Int32 __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fputc = int Function(\n  int __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_putc = ffi.Int32 Function(\n  ffi.Int32 __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_putc = int Function(\n  int __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_putchar = ffi.Int32 Function(\n  ffi.Int32 __c,\n);\n\ntypedef _dart_putchar = int Function(\n  int __c,\n);\n\ntypedef _c_fputc_unlocked = ffi.Int32 Function(\n  ffi.Int32 __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fputc_unlocked = int Function(\n  int __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_putc_unlocked = ffi.Int32 Function(\n  ffi.Int32 __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_putc_unlocked = int Function(\n  int __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_putchar_unlocked = ffi.Int32 Function(\n  ffi.Int32 __c,\n);\n\ntypedef _dart_putchar_unlocked = int Function(\n  int __c,\n);\n\ntypedef _c_getw = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_getw = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_putw = ffi.Int32 Function(\n  ffi.Int32 __w,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_putw = int Function(\n  int __w,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fgets = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fgets = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c___getdelim = ffi.Int64 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  ffi.Int32 __delimiter,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart___getdelim = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  int __delimiter,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_getdelim = ffi.Int64 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  ffi.Int32 __delimiter,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_getdelim = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  int __delimiter,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_getline = ffi.Int64 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_getline = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __lineptr,\n  ffi.Pointer<ffi.Uint64> __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fputs = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fputs = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_puts = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_puts = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_ungetc = ffi.Int32 Function(\n  ffi.Int32 __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ungetc = int Function(\n  int __c,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fread = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __size,\n  ffi.Uint64 __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fread = int Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __size,\n  int __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fwrite = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __size,\n  ffi.Uint64 __n,\n  ffi.Pointer<IO_FILE_> __s,\n);\n\ntypedef _dart_fwrite = int Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __size,\n  int __n,\n  ffi.Pointer<IO_FILE_> __s,\n);\n\ntypedef _c_fread_unlocked = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __size,\n  ffi.Uint64 __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fread_unlocked = int Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __size,\n  int __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fwrite_unlocked = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __size,\n  ffi.Uint64 __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fwrite_unlocked = int Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __size,\n  int __n,\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fseek = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Int64 __off,\n  ffi.Int32 __whence,\n);\n\ntypedef _dart_fseek = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  int __off,\n  int __whence,\n);\n\ntypedef _c_ftell = ffi.Int64 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ftell = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_rewind = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_rewind = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fseeko = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Int64 __off,\n  ffi.Int32 __whence,\n);\n\ntypedef _dart_fseeko = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  int __off,\n  int __whence,\n);\n\ntypedef _c_ftello = ffi.Int64 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ftello = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fgetpos = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<_fpos_t_> __pos,\n);\n\ntypedef _dart_fgetpos = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<_fpos_t_> __pos,\n);\n\ntypedef _c_fsetpos = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<_fpos_t_> __pos,\n);\n\ntypedef _dart_fsetpos = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n  ffi.Pointer<_fpos_t_> __pos,\n);\n\ntypedef _c_clearerr = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_clearerr = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_feof = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_feof = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_ferror = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ferror = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_clearerr_unlocked = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_clearerr_unlocked = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_feof_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_feof_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_ferror_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ferror_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_perror = ffi.Void Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_perror = void Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_fileno = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fileno = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_fileno_unlocked = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_fileno_unlocked = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_popen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __command,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _dart_popen = ffi.Pointer<IO_FILE_> Function(\n  ffi.Pointer<ffi.Int8> __command,\n  ffi.Pointer<ffi.Int8> __modes,\n);\n\ntypedef _c_pclose = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_pclose = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_ctermid = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_ctermid = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_flockfile = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_flockfile = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_ftrylockfile = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_ftrylockfile = int Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c_funlockfile = ffi.Void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _dart_funlockfile = void Function(\n  ffi.Pointer<IO_FILE_> __stream,\n);\n\ntypedef _c___uflow = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> arg0,\n);\n\ntypedef _dart___uflow = int Function(\n  ffi.Pointer<IO_FILE_> arg0,\n);\n\ntypedef _c___overflow = ffi.Int32 Function(\n  ffi.Pointer<IO_FILE_> arg0,\n  ffi.Int32 arg1,\n);\n\ntypedef _dart___overflow = int Function(\n  ffi.Pointer<IO_FILE_> arg0,\n  int arg1,\n);\n\ntypedef _c___ctype_get_mb_cur_max = ffi.Uint64 Function();\n\ntypedef _dart___ctype_get_mb_cur_max = int Function();\n\ntypedef _c_atof = ffi.Double Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _dart_atof = double Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _c_atoi = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _dart_atoi = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _c_atol = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _dart_atol = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _c_atoll = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _dart_atoll = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n);\n\ntypedef _c_strtod = ffi.Double Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n);\n\ntypedef _dart_strtod = double Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n);\n\ntypedef _c_strtof = ffi.Float Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n);\n\ntypedef _dart_strtof = double Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n);\n\ntypedef _c_strtol = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtol = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_strtoul = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtoul = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_strtoq = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtoq = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_strtouq = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtouq = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_strtoll = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtoll = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_strtoull = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_strtoull = int Function(\n  ffi.Pointer<ffi.Int8> __nptr,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __endptr,\n  int __base,\n);\n\ntypedef _c_l64a = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int64 __n,\n);\n\ntypedef _dart_l64a = ffi.Pointer<ffi.Int8> Function(\n  int __n,\n);\n\ntypedef _c_a64l = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_a64l = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_select = ffi.Int32 Function(\n  ffi.Int32 __nfds,\n  ffi.Pointer<fd_set> __readfds,\n  ffi.Pointer<fd_set> __writefds,\n  ffi.Pointer<fd_set> __exceptfds,\n  ffi.Pointer<timeval> __timeout,\n);\n\ntypedef _dart_select = int Function(\n  int __nfds,\n  ffi.Pointer<fd_set> __readfds,\n  ffi.Pointer<fd_set> __writefds,\n  ffi.Pointer<fd_set> __exceptfds,\n  ffi.Pointer<timeval> __timeout,\n);\n\ntypedef _c_pselect = ffi.Int32 Function(\n  ffi.Int32 __nfds,\n  ffi.Pointer<fd_set> __readfds,\n  ffi.Pointer<fd_set> __writefds,\n  ffi.Pointer<fd_set> __exceptfds,\n  ffi.Pointer<timespec> __timeout,\n  ffi.Pointer<_sigset_t_> __sigmask,\n);\n\ntypedef _dart_pselect = int Function(\n  int __nfds,\n  ffi.Pointer<fd_set> __readfds,\n  ffi.Pointer<fd_set> __writefds,\n  ffi.Pointer<fd_set> __exceptfds,\n  ffi.Pointer<timespec> __timeout,\n  ffi.Pointer<_sigset_t_> __sigmask,\n);\n\ntypedef _c_random = ffi.Int64 Function();\n\ntypedef _dart_random = int Function();\n\ntypedef _c_srandom = ffi.Void Function(\n  ffi.Uint32 __seed,\n);\n\ntypedef _dart_srandom = void Function(\n  int __seed,\n);\n\ntypedef _c_initstate = ffi.Pointer<ffi.Int8> Function(\n  ffi.Uint32 __seed,\n  ffi.Pointer<ffi.Int8> __statebuf,\n  ffi.Uint64 __statelen,\n);\n\ntypedef _dart_initstate = ffi.Pointer<ffi.Int8> Function(\n  int __seed,\n  ffi.Pointer<ffi.Int8> __statebuf,\n  int __statelen,\n);\n\ntypedef _c_setstate = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __statebuf,\n);\n\ntypedef _dart_setstate = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __statebuf,\n);\n\ntypedef _c_random_r = ffi.Int32 Function(\n  ffi.Pointer<random_data> __buf,\n  ffi.Pointer<ffi.Int32> __result,\n);\n\ntypedef _dart_random_r = int Function(\n  ffi.Pointer<random_data> __buf,\n  ffi.Pointer<ffi.Int32> __result,\n);\n\ntypedef _c_srandom_r = ffi.Int32 Function(\n  ffi.Uint32 __seed,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _dart_srandom_r = int Function(\n  int __seed,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _c_initstate_r = ffi.Int32 Function(\n  ffi.Uint32 __seed,\n  ffi.Pointer<ffi.Int8> __statebuf,\n  ffi.Uint64 __statelen,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _dart_initstate_r = int Function(\n  int __seed,\n  ffi.Pointer<ffi.Int8> __statebuf,\n  int __statelen,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _c_setstate_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __statebuf,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _dart_setstate_r = int Function(\n  ffi.Pointer<ffi.Int8> __statebuf,\n  ffi.Pointer<random_data> __buf,\n);\n\ntypedef _c_rand = ffi.Int32 Function();\n\ntypedef _dart_rand = int Function();\n\ntypedef _c_srand = ffi.Void Function(\n  ffi.Uint32 __seed,\n);\n\ntypedef _dart_srand = void Function(\n  int __seed,\n);\n\ntypedef _c_rand_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint32> __seed,\n);\n\ntypedef _dart_rand_r = int Function(\n  ffi.Pointer<ffi.Uint32> __seed,\n);\n\ntypedef _c_drand48 = ffi.Double Function();\n\ntypedef _dart_drand48 = double Function();\n\ntypedef _c_erand48 = ffi.Double Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _dart_erand48 = double Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _c_lrand48 = ffi.Int64 Function();\n\ntypedef _dart_lrand48 = int Function();\n\ntypedef _c_nrand48 = ffi.Int64 Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _dart_nrand48 = int Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _c_mrand48 = ffi.Int64 Function();\n\ntypedef _dart_mrand48 = int Function();\n\ntypedef _c_jrand48 = ffi.Int64 Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _dart_jrand48 = int Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n);\n\ntypedef _c_srand48 = ffi.Void Function(\n  ffi.Int64 __seedval,\n);\n\ntypedef _dart_srand48 = void Function(\n  int __seedval,\n);\n\ntypedef _c_seed48 = ffi.Pointer<ffi.Uint16> Function(\n  ffi.Pointer<ffi.Uint16> __seed16v,\n);\n\ntypedef _dart_seed48 = ffi.Pointer<ffi.Uint16> Function(\n  ffi.Pointer<ffi.Uint16> __seed16v,\n);\n\ntypedef _c_lcong48 = ffi.Void Function(\n  ffi.Pointer<ffi.Uint16> __param,\n);\n\ntypedef _dart_lcong48 = void Function(\n  ffi.Pointer<ffi.Uint16> __param,\n);\n\ntypedef _c_drand48_r = ffi.Int32 Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Double> __result,\n);\n\ntypedef _dart_drand48_r = int Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Double> __result,\n);\n\ntypedef _c_erand48_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Double> __result,\n);\n\ntypedef _dart_erand48_r = int Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Double> __result,\n);\n\ntypedef _c_lrand48_r = ffi.Int32 Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _dart_lrand48_r = int Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _c_nrand48_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _dart_nrand48_r = int Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _c_mrand48_r = ffi.Int32 Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _dart_mrand48_r = int Function(\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _c_jrand48_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _dart_jrand48_r = int Function(\n  ffi.Pointer<ffi.Uint16> __xsubi,\n  ffi.Pointer<drand48_data> __buffer,\n  ffi.Pointer<ffi.Int64> __result,\n);\n\ntypedef _c_srand48_r = ffi.Int32 Function(\n  ffi.Int64 __seedval,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _dart_srand48_r = int Function(\n  int __seedval,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _c_seed48_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __seed16v,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _dart_seed48_r = int Function(\n  ffi.Pointer<ffi.Uint16> __seed16v,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _c_lcong48_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint16> __param,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _dart_lcong48_r = int Function(\n  ffi.Pointer<ffi.Uint16> __param,\n  ffi.Pointer<drand48_data> __buffer,\n);\n\ntypedef _c_malloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_malloc = ffi.Pointer<ffi.Void> Function(\n  int __size,\n);\n\ntypedef _c_calloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Uint64 __nmemb,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_calloc = ffi.Pointer<ffi.Void> Function(\n  int __nmemb,\n  int __size,\n);\n\ntypedef _c_realloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_realloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __size,\n);\n\ntypedef _c_reallocarray = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  ffi.Uint64 __nmemb,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_reallocarray = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __ptr,\n  int __nmemb,\n  int __size,\n);\n\ntypedef _c_free = ffi.Void Function(\n  ffi.Pointer<ffi.Void> __ptr,\n);\n\ntypedef _dart_free = void Function(\n  ffi.Pointer<ffi.Void> __ptr,\n);\n\ntypedef _c_alloca = ffi.Pointer<ffi.Void> Function(\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_alloca = ffi.Pointer<ffi.Void> Function(\n  int __size,\n);\n\ntypedef _c_valloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_valloc = ffi.Pointer<ffi.Void> Function(\n  int __size,\n);\n\ntypedef _c_posix_memalign = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Void>> __memptr,\n  ffi.Uint64 __alignment,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_posix_memalign = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Void>> __memptr,\n  int __alignment,\n  int __size,\n);\n\ntypedef _c_aligned_alloc = ffi.Pointer<ffi.Void> Function(\n  ffi.Uint64 __alignment,\n  ffi.Uint64 __size,\n);\n\ntypedef _dart_aligned_alloc = ffi.Pointer<ffi.Void> Function(\n  int __alignment,\n  int __size,\n);\n\ntypedef _c_abort = ffi.Void Function();\n\ntypedef _dart_abort = void Function();\n\ntypedef _typedefC_1 = ffi.Void Function();\n\ntypedef _c_atexit = ffi.Int32 Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> __func,\n);\n\ntypedef _dart_atexit = int Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> __func,\n);\n\ntypedef _typedefC_2 = ffi.Void Function();\n\ntypedef _c_at_quick_exit = ffi.Int32 Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> __func,\n);\n\ntypedef _dart_at_quick_exit = int Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_2>> __func,\n);\n\ntypedef _typedefC_3 = ffi.Void Function(\n  ffi.Int32,\n  ffi.Pointer<ffi.Void>,\n);\n\ntypedef _c_on_exit = ffi.Int32 Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> __func,\n  ffi.Pointer<ffi.Void> __arg,\n);\n\ntypedef _dart_on_exit = int Function(\n  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> __func,\n  ffi.Pointer<ffi.Void> __arg,\n);\n\ntypedef _c_exit = ffi.Void Function(\n  ffi.Int32 __status,\n);\n\ntypedef _dart_exit = void Function(\n  int __status,\n);\n\ntypedef _c_quick_exit = ffi.Void Function(\n  ffi.Int32 __status,\n);\n\ntypedef _dart_quick_exit = void Function(\n  int __status,\n);\n\ntypedef _c__Exit = ffi.Void Function(\n  ffi.Int32 __status,\n);\n\ntypedef _dart__Exit = void Function(\n  int __status,\n);\n\ntypedef _c_getenv = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _dart_getenv = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _c_putenv = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __string,\n);\n\ntypedef _dart_putenv = int Function(\n  ffi.Pointer<ffi.Int8> __string,\n);\n\ntypedef _c_setenv = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Pointer<ffi.Int8> __value,\n  ffi.Int32 __replace,\n);\n\ntypedef _dart_setenv = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Pointer<ffi.Int8> __value,\n  int __replace,\n);\n\ntypedef _c_unsetenv = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _dart_unsetenv = int Function(\n  ffi.Pointer<ffi.Int8> __name,\n);\n\ntypedef _c_clearenv = ffi.Int32 Function();\n\ntypedef _dart_clearenv = int Function();\n\ntypedef _c_mktemp = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _dart_mktemp = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _c_mkstemp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _dart_mkstemp = int Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _c_mkstemps = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __template,\n  ffi.Int32 __suffixlen,\n);\n\ntypedef _dart_mkstemps = int Function(\n  ffi.Pointer<ffi.Int8> __template,\n  int __suffixlen,\n);\n\ntypedef _c_mkdtemp = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _dart_mkdtemp = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __template,\n);\n\ntypedef _c_system = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __command,\n);\n\ntypedef _dart_system = int Function(\n  ffi.Pointer<ffi.Int8> __command,\n);\n\ntypedef _c_realpath = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Pointer<ffi.Int8> __resolved,\n);\n\ntypedef _dart_realpath = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __name,\n  ffi.Pointer<ffi.Int8> __resolved,\n);\n\ntypedef __compar_fn_t = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void>,\n  ffi.Pointer<ffi.Void>,\n);\n\ntypedef _c_bsearch = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __key,\n  ffi.Pointer<ffi.Void> __base,\n  ffi.Uint64 __nmemb,\n  ffi.Uint64 __size,\n  ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n);\n\ntypedef _dart_bsearch = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __key,\n  ffi.Pointer<ffi.Void> __base,\n  int __nmemb,\n  int __size,\n  ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n);\n\ntypedef _c_qsort = ffi.Void Function(\n  ffi.Pointer<ffi.Void> __base,\n  ffi.Uint64 __nmemb,\n  ffi.Uint64 __size,\n  ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n);\n\ntypedef _dart_qsort = void Function(\n  ffi.Pointer<ffi.Void> __base,\n  int __nmemb,\n  int __size,\n  ffi.Pointer<ffi.NativeFunction<__compar_fn_t>> __compar,\n);\n\ntypedef _c_abs = ffi.Int32 Function(\n  ffi.Int32 __x,\n);\n\ntypedef _dart_abs = int Function(\n  int __x,\n);\n\ntypedef _c_labs = ffi.Int64 Function(\n  ffi.Int64 __x,\n);\n\ntypedef _dart_labs = int Function(\n  int __x,\n);\n\ntypedef _c_llabs = ffi.Int64 Function(\n  ffi.Int64 __x,\n);\n\ntypedef _dart_llabs = int Function(\n  int __x,\n);\n\ntypedef _c_div = div_t Function(\n  ffi.Int32 __numer,\n  ffi.Int32 __denom,\n);\n\ntypedef _dart_div = div_t Function(\n  int __numer,\n  int __denom,\n);\n\ntypedef _c_ldiv = ldiv_t Function(\n  ffi.Int64 __numer,\n  ffi.Int64 __denom,\n);\n\ntypedef _dart_ldiv = ldiv_t Function(\n  int __numer,\n  int __denom,\n);\n\ntypedef _c_lldiv = lldiv_t Function(\n  ffi.Int64 __numer,\n  ffi.Int64 __denom,\n);\n\ntypedef _dart_lldiv = lldiv_t Function(\n  int __numer,\n  int __denom,\n);\n\ntypedef _c_ecvt = ffi.Pointer<ffi.Int8> Function(\n  ffi.Double __value,\n  ffi.Int32 __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n);\n\ntypedef _dart_ecvt = ffi.Pointer<ffi.Int8> Function(\n  double __value,\n  int __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n);\n\ntypedef _c_fcvt = ffi.Pointer<ffi.Int8> Function(\n  ffi.Double __value,\n  ffi.Int32 __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n);\n\ntypedef _dart_fcvt = ffi.Pointer<ffi.Int8> Function(\n  double __value,\n  int __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n);\n\ntypedef _c_gcvt = ffi.Pointer<ffi.Int8> Function(\n  ffi.Double __value,\n  ffi.Int32 __ndigit,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _dart_gcvt = ffi.Pointer<ffi.Int8> Function(\n  double __value,\n  int __ndigit,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _c_ecvt_r = ffi.Int32 Function(\n  ffi.Double __value,\n  ffi.Int32 __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_ecvt_r = int Function(\n  double __value,\n  int __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __len,\n);\n\ntypedef _c_fcvt_r = ffi.Int32 Function(\n  ffi.Double __value,\n  ffi.Int32 __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __len,\n);\n\ntypedef _dart_fcvt_r = int Function(\n  double __value,\n  int __ndigit,\n  ffi.Pointer<ffi.Int32> __decpt,\n  ffi.Pointer<ffi.Int32> __sign,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __len,\n);\n\ntypedef _c_mblen = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_mblen = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __n,\n);\n\ntypedef _c_mbtowc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int32> __pwc,\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_mbtowc = int Function(\n  ffi.Pointer<ffi.Int32> __pwc,\n  ffi.Pointer<ffi.Int8> __s,\n  int __n,\n);\n\ntypedef _c_wctomb = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __wchar,\n);\n\ntypedef _dart_wctomb = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __wchar,\n);\n\ntypedef _c_mbstowcs = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int32> __pwcs,\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_mbstowcs = int Function(\n  ffi.Pointer<ffi.Int32> __pwcs,\n  ffi.Pointer<ffi.Int8> __s,\n  int __n,\n);\n\ntypedef _c_wcstombs = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int32> __pwcs,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_wcstombs = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int32> __pwcs,\n  int __n,\n);\n\ntypedef _c_rpmatch = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __response,\n);\n\ntypedef _dart_rpmatch = int Function(\n  ffi.Pointer<ffi.Int8> __response,\n);\n\ntypedef _c_getsubopt = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __optionp,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __tokens,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __valuep,\n);\n\ntypedef _dart_getsubopt = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __optionp,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __tokens,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __valuep,\n);\n\ntypedef _c_getloadavg = ffi.Int32 Function(\n  ffi.Pointer<ffi.Double> __loadavg,\n  ffi.Int32 __nelem,\n);\n\ntypedef _dart_getloadavg = int Function(\n  ffi.Pointer<ffi.Double> __loadavg,\n  int __nelem,\n);\n\ntypedef _c_memcpy = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memcpy = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  int __n,\n);\n\ntypedef _c_memmove = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memmove = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  int __n,\n);\n\ntypedef _c_memccpy = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  ffi.Int32 __c,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memccpy = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Pointer<ffi.Void> __src,\n  int __c,\n  int __n,\n);\n\ntypedef _c_memset = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __s,\n  ffi.Int32 __c,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memset = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __s,\n  int __c,\n  int __n,\n);\n\ntypedef _c_memcmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __s1,\n  ffi.Pointer<ffi.Void> __s2,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memcmp = int Function(\n  ffi.Pointer<ffi.Void> __s1,\n  ffi.Pointer<ffi.Void> __s2,\n  int __n,\n);\n\ntypedef _c_memchr = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __s,\n  ffi.Int32 __c,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_memchr = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> __s,\n  int __c,\n  int __n,\n);\n\ntypedef _c_strcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _dart_strcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _c_strncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n);\n\ntypedef _c_strcat = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _dart_strcat = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _c_strncat = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strncat = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n);\n\ntypedef _c_strcmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _dart_strcmp = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _c_strncmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strncmp = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  int __n,\n);\n\ntypedef _c_strcoll = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _dart_strcoll = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _c_strxfrm = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strxfrm = int Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n);\n\ntypedef _c_strcoll_l = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _dart_strcoll_l = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _c_strxfrm_l = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _dart_strxfrm_l = int Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _c_strdup = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_strdup = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_strndup = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __string,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strndup = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __string,\n  int __n,\n);\n\ntypedef _c_strchr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __c,\n);\n\ntypedef _dart_strchr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __c,\n);\n\ntypedef _c_strrchr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __c,\n);\n\ntypedef _dart_strrchr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __c,\n);\n\ntypedef _c_strcspn = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __reject,\n);\n\ntypedef _dart_strcspn = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __reject,\n);\n\ntypedef _c_strspn = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __accept,\n);\n\ntypedef _dart_strspn = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __accept,\n);\n\ntypedef _c_strpbrk = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __accept,\n);\n\ntypedef _dart_strpbrk = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __accept,\n);\n\ntypedef _c_strstr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __haystack,\n  ffi.Pointer<ffi.Int8> __needle,\n);\n\ntypedef _dart_strstr = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __haystack,\n  ffi.Pointer<ffi.Int8> __needle,\n);\n\ntypedef _c_strtok = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n);\n\ntypedef _dart_strtok = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n);\n\ntypedef _c___strtok_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n);\n\ntypedef _dart___strtok_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n);\n\ntypedef _c_strtok_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n);\n\ntypedef _dart_strtok_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Pointer<ffi.Int8> __delim,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __save_ptr,\n);\n\ntypedef _c_strlen = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _dart_strlen = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n);\n\ntypedef _c_strnlen = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __string,\n  ffi.Uint64 __maxlen,\n);\n\ntypedef _dart_strnlen = int Function(\n  ffi.Pointer<ffi.Int8> __string,\n  int __maxlen,\n);\n\ntypedef _c_strerror = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 __errnum,\n);\n\ntypedef _dart_strerror = ffi.Pointer<ffi.Int8> Function(\n  int __errnum,\n);\n\ntypedef _c_strerror_r = ffi.Int32 Function(\n  ffi.Int32 __errnum,\n  ffi.Pointer<ffi.Int8> __buf,\n  ffi.Uint64 __buflen,\n);\n\ntypedef _dart_strerror_r = int Function(\n  int __errnum,\n  ffi.Pointer<ffi.Int8> __buf,\n  int __buflen,\n);\n\ntypedef _c_strerror_l = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 __errnum,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _dart_strerror_l = ffi.Pointer<ffi.Int8> Function(\n  int __errnum,\n  ffi.Pointer<_locale_struct_> __l,\n);\n\ntypedef _c_bcmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __s1,\n  ffi.Pointer<ffi.Void> __s2,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_bcmp = int Function(\n  ffi.Pointer<ffi.Void> __s1,\n  ffi.Pointer<ffi.Void> __s2,\n  int __n,\n);\n\ntypedef _c_bcopy = ffi.Void Function(\n  ffi.Pointer<ffi.Void> __src,\n  ffi.Pointer<ffi.Void> __dest,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_bcopy = void Function(\n  ffi.Pointer<ffi.Void> __src,\n  ffi.Pointer<ffi.Void> __dest,\n  int __n,\n);\n\ntypedef _c_bzero = ffi.Void Function(\n  ffi.Pointer<ffi.Void> __s,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_bzero = void Function(\n  ffi.Pointer<ffi.Void> __s,\n  int __n,\n);\n\ntypedef _c_index = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __c,\n);\n\ntypedef _dart_index = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __c,\n);\n\ntypedef _c_rindex = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Int32 __c,\n);\n\ntypedef _dart_rindex = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __c,\n);\n\ntypedef _c_ffs = ffi.Int32 Function(\n  ffi.Int32 __i,\n);\n\ntypedef _dart_ffs = int Function(\n  int __i,\n);\n\ntypedef _c_ffsl = ffi.Int32 Function(\n  ffi.Int64 __l,\n);\n\ntypedef _dart_ffsl = int Function(\n  int __l,\n);\n\ntypedef _c_ffsll = ffi.Int32 Function(\n  ffi.Int64 __ll,\n);\n\ntypedef _dart_ffsll = int Function(\n  int __ll,\n);\n\ntypedef _c_strcasecmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _dart_strcasecmp = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n);\n\ntypedef _c_strncasecmp = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_strncasecmp = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  int __n,\n);\n\ntypedef _c_strcasecmp_l = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _dart_strcasecmp_l = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _c_strncasecmp_l = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  ffi.Uint64 __n,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _dart_strncasecmp_l = int Function(\n  ffi.Pointer<ffi.Int8> __s1,\n  ffi.Pointer<ffi.Int8> __s2,\n  int __n,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _c_explicit_bzero = ffi.Void Function(\n  ffi.Pointer<ffi.Void> __s,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_explicit_bzero = void Function(\n  ffi.Pointer<ffi.Void> __s,\n  int __n,\n);\n\ntypedef _c_strsep = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __stringp,\n  ffi.Pointer<ffi.Int8> __delim,\n);\n\ntypedef _dart_strsep = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> __stringp,\n  ffi.Pointer<ffi.Int8> __delim,\n);\n\ntypedef _c_strsignal = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 __sig,\n);\n\ntypedef _dart_strsignal = ffi.Pointer<ffi.Int8> Function(\n  int __sig,\n);\n\ntypedef _c___stpcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _dart___stpcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _c_stpcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _dart_stpcpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n);\n\ntypedef _c___stpncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart___stpncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n);\n\ntypedef _c_stpncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  ffi.Uint64 __n,\n);\n\ntypedef _dart_stpncpy = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int8> __dest,\n  ffi.Pointer<ffi.Int8> __src,\n  int __n,\n);\n\ntypedef _c_fcntl = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int32 __cmd,\n);\n\ntypedef _dart_fcntl = int Function(\n  int __fd,\n  int __cmd,\n);\n\ntypedef _c_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Int32 __oflag,\n);\n\ntypedef _dart_open = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  int __oflag,\n);\n\ntypedef _c_openat = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Int32 __oflag,\n);\n\ntypedef _dart_openat = int Function(\n  int __fd,\n  ffi.Pointer<ffi.Int8> __file,\n  int __oflag,\n);\n\ntypedef _c_creat = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __mode,\n);\n\ntypedef _dart_creat = int Function(\n  ffi.Pointer<ffi.Int8> __file,\n  int __mode,\n);\n\ntypedef _c_posix_fadvise = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int64 __offset,\n  ffi.Int64 __len,\n  ffi.Int32 __advise,\n);\n\ntypedef _dart_posix_fadvise = int Function(\n  int __fd,\n  int __offset,\n  int __len,\n  int __advise,\n);\n\ntypedef _c_posix_fallocate = ffi.Int32 Function(\n  ffi.Int32 __fd,\n  ffi.Int64 __offset,\n  ffi.Int64 __len,\n);\n\ntypedef _dart_posix_fallocate = int Function(\n  int __fd,\n  int __offset,\n  int __len,\n);\n\ntypedef _c___assert_fail = ffi.Void Function(\n  ffi.Pointer<ffi.Int8> __assertion,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __line,\n  ffi.Pointer<ffi.Int8> __function,\n);\n\ntypedef _dart___assert_fail = void Function(\n  ffi.Pointer<ffi.Int8> __assertion,\n  ffi.Pointer<ffi.Int8> __file,\n  int __line,\n  ffi.Pointer<ffi.Int8> __function,\n);\n\ntypedef _c___assert_perror_fail = ffi.Void Function(\n  ffi.Int32 __errnum,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Uint32 __line,\n  ffi.Pointer<ffi.Int8> __function,\n);\n\ntypedef _dart___assert_perror_fail = void Function(\n  int __errnum,\n  ffi.Pointer<ffi.Int8> __file,\n  int __line,\n  ffi.Pointer<ffi.Int8> __function,\n);\n\ntypedef _c___assert = ffi.Void Function(\n  ffi.Pointer<ffi.Int8> __assertion,\n  ffi.Pointer<ffi.Int8> __file,\n  ffi.Int32 __line,\n);\n\ntypedef _dart___assert = void Function(\n  ffi.Pointer<ffi.Int8> __assertion,\n  ffi.Pointer<ffi.Int8> __file,\n  int __line,\n);\n\ntypedef _c_poll = ffi.Int32 Function(\n  ffi.Pointer<pollfd> __fds,\n  ffi.Uint64 __nfds,\n  ffi.Int32 __timeout,\n);\n\ntypedef _dart_poll = int Function(\n  ffi.Pointer<pollfd> __fds,\n  int __nfds,\n  int __timeout,\n);\n\ntypedef _c___errno_location = ffi.Pointer<ffi.Int32> Function();\n\ntypedef _dart___errno_location = ffi.Pointer<ffi.Int32> Function();\n\ntypedef _c_clock = ffi.Int64 Function();\n\ntypedef _dart_clock = int Function();\n\ntypedef _c_time = ffi.Int64 Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _dart_time = int Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _c_difftime = ffi.Double Function(\n  ffi.Int64 __time1,\n  ffi.Int64 __time0,\n);\n\ntypedef _dart_difftime = double Function(\n  int __time1,\n  int __time0,\n);\n\ntypedef _c_mktime = ffi.Int64 Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_mktime = int Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_strftime = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __maxsize,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_strftime = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __maxsize,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_strftime_l = ffi.Uint64 Function(\n  ffi.Pointer<ffi.Int8> __s,\n  ffi.Uint64 __maxsize,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<tm> __tp,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _dart_strftime_l = int Function(\n  ffi.Pointer<ffi.Int8> __s,\n  int __maxsize,\n  ffi.Pointer<ffi.Int8> __format,\n  ffi.Pointer<tm> __tp,\n  ffi.Pointer<_locale_struct_> __loc,\n);\n\ntypedef _c_gmtime = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _dart_gmtime = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _c_localtime = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _dart_localtime = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _c_gmtime_r = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_gmtime_r = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_localtime_r = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_localtime_r = ffi.Pointer<tm> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_asctime = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_asctime = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_ctime = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _dart_ctime = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n);\n\ntypedef _c_asctime_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<tm> __tp,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _dart_asctime_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<tm> __tp,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _c_ctime_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _dart_ctime_r = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Int64> __timer,\n  ffi.Pointer<ffi.Int8> __buf,\n);\n\ntypedef _c_tzset = ffi.Void Function();\n\ntypedef _dart_tzset = void Function();\n\ntypedef _c_timegm = ffi.Int64 Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_timegm = int Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_timelocal = ffi.Int64 Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _dart_timelocal = int Function(\n  ffi.Pointer<tm> __tp,\n);\n\ntypedef _c_dysize = ffi.Int32 Function(\n  ffi.Int32 __year,\n);\n\ntypedef _dart_dysize = int Function(\n  int __year,\n);\n\ntypedef _c_nanosleep = ffi.Int32 Function(\n  ffi.Pointer<timespec> __requested_time,\n  ffi.Pointer<timespec> __remaining,\n);\n\ntypedef _dart_nanosleep = int Function(\n  ffi.Pointer<timespec> __requested_time,\n  ffi.Pointer<timespec> __remaining,\n);\n\ntypedef _c_clock_getres = ffi.Int32 Function(\n  ffi.Int32 __clock_id,\n  ffi.Pointer<timespec> __res,\n);\n\ntypedef _dart_clock_getres = int Function(\n  int __clock_id,\n  ffi.Pointer<timespec> __res,\n);\n\ntypedef _c_clock_gettime = ffi.Int32 Function(\n  ffi.Int32 __clock_id,\n  ffi.Pointer<timespec> __tp,\n);\n\ntypedef _dart_clock_gettime = int Function(\n  int __clock_id,\n  ffi.Pointer<timespec> __tp,\n);\n\ntypedef _c_clock_settime = ffi.Int32 Function(\n  ffi.Int32 __clock_id,\n  ffi.Pointer<timespec> __tp,\n);\n\ntypedef _dart_clock_settime = int Function(\n  int __clock_id,\n  ffi.Pointer<timespec> __tp,\n);\n\ntypedef _c_clock_nanosleep = ffi.Int32 Function(\n  ffi.Int32 __clock_id,\n  ffi.Int32 __flags,\n  ffi.Pointer<timespec> __req,\n  ffi.Pointer<timespec> __rem,\n);\n\ntypedef _dart_clock_nanosleep = int Function(\n  int __clock_id,\n  int __flags,\n  ffi.Pointer<timespec> __req,\n  ffi.Pointer<timespec> __rem,\n);\n\ntypedef _c_clock_getcpuclockid = ffi.Int32 Function(\n  ffi.Int32 __pid,\n  ffi.Pointer<ffi.Int32> __clock_id,\n);\n\ntypedef _dart_clock_getcpuclockid = int Function(\n  int __pid,\n  ffi.Pointer<ffi.Int32> __clock_id,\n);\n\ntypedef _c_timer_create = ffi.Int32 Function(\n  ffi.Int32 __clock_id,\n  ffi.Pointer<sigevent> __evp,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> __timerid,\n);\n\ntypedef _dart_timer_create = int Function(\n  int __clock_id,\n  ffi.Pointer<sigevent> __evp,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> __timerid,\n);\n\ntypedef _c_timer_delete = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __timerid,\n);\n\ntypedef _dart_timer_delete = int Function(\n  ffi.Pointer<ffi.Void> __timerid,\n);\n\ntypedef _c_timer_settime = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __timerid,\n  ffi.Int32 __flags,\n  ffi.Pointer<itimerspec> __value,\n  ffi.Pointer<itimerspec> __ovalue,\n);\n\ntypedef _dart_timer_settime = int Function(\n  ffi.Pointer<ffi.Void> __timerid,\n  int __flags,\n  ffi.Pointer<itimerspec> __value,\n  ffi.Pointer<itimerspec> __ovalue,\n);\n\ntypedef _c_timer_gettime = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __timerid,\n  ffi.Pointer<itimerspec> __value,\n);\n\ntypedef _dart_timer_gettime = int Function(\n  ffi.Pointer<ffi.Void> __timerid,\n  ffi.Pointer<itimerspec> __value,\n);\n\ntypedef _c_timer_getoverrun = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> __timerid,\n);\n\ntypedef _dart_timer_getoverrun = int Function(\n  ffi.Pointer<ffi.Void> __timerid,\n);\n\ntypedef _c_timespec_get = ffi.Int32 Function(\n  ffi.Pointer<timespec> __ts,\n  ffi.Int32 __base,\n);\n\ntypedef _dart_timespec_get = int Function(\n  ffi.Pointer<timespec> __ts,\n  int __base,\n);\n\ntypedef _c_snd_asoundlib_version = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _dart_snd_asoundlib_version = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _c_snd_dlopen = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Int32 mode,\n  ffi.Pointer<ffi.Int8> errbuf,\n  ffi.Uint64 errbuflen,\n);\n\ntypedef _dart_snd_dlopen = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Int8> file,\n  int mode,\n  ffi.Pointer<ffi.Int8> errbuf,\n  int errbuflen,\n);\n\ntypedef _c_snd_dlsym = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> version,\n);\n\ntypedef _dart_snd_dlsym = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<ffi.Void> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> version,\n);\n\ntypedef _c_snd_dlclose = ffi.Int32 Function(\n  ffi.Pointer<ffi.Void> handle,\n);\n\ntypedef _dart_snd_dlclose = int Function(\n  ffi.Pointer<ffi.Void> handle,\n);\n\ntypedef snd_async_callback_t = ffi.Void Function(\n  ffi.Pointer<snd_async_handler_>,\n);\n\ntypedef _c_snd_async_add_handler = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Int32 fd,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_async_add_handler = int Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  int fd,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _c_snd_async_del_handler = ffi.Int32 Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_del_handler = int Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_async_handler_get_fd = ffi.Int32 Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_fd = int Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_async_handler_get_signo = ffi.Int32 Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_signo = int Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_async_handler_get_callback_private = ffi.Pointer<ffi.Void>\n    Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_callback_private = ffi.Pointer<ffi.Void>\n    Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_shm_area_create = ffi.Pointer<snd_shm_area> Function(\n  ffi.Int32 shmid,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _dart_snd_shm_area_create = ffi.Pointer<snd_shm_area> Function(\n  int shmid,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _c_snd_shm_area_share = ffi.Pointer<snd_shm_area> Function(\n  ffi.Pointer<snd_shm_area> area,\n);\n\ntypedef _dart_snd_shm_area_share = ffi.Pointer<snd_shm_area> Function(\n  ffi.Pointer<snd_shm_area> area,\n);\n\ntypedef _c_snd_shm_area_destroy = ffi.Int32 Function(\n  ffi.Pointer<snd_shm_area> area,\n);\n\ntypedef _dart_snd_shm_area_destroy = int Function(\n  ffi.Pointer<snd_shm_area> area,\n);\n\ntypedef _c_snd_user_file = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> result,\n);\n\ntypedef _dart_snd_user_file = int Function(\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> result,\n);\n\ntypedef _c_snd_input_stdio_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Int8> mode,\n);\n\ntypedef _dart_snd_input_stdio_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Int8> mode,\n);\n\ntypedef _c_snd_input_stdio_attach = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<IO_FILE_> fp,\n  ffi.Int32 _close,\n);\n\ntypedef _dart_snd_input_stdio_attach = int Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<IO_FILE_> fp,\n  int _close,\n);\n\ntypedef _c_snd_input_buffer_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<ffi.Int8> buffer,\n  ffi.Int64 size,\n);\n\ntypedef _dart_snd_input_buffer_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_input_>> inputp,\n  ffi.Pointer<ffi.Int8> buffer,\n  int size,\n);\n\ntypedef _c_snd_input_close = ffi.Int32 Function(\n  ffi.Pointer<snd_input_> input,\n);\n\ntypedef _dart_snd_input_close = int Function(\n  ffi.Pointer<snd_input_> input,\n);\n\ntypedef _c_snd_input_scanf = ffi.Int32 Function(\n  ffi.Pointer<snd_input_> input,\n  ffi.Pointer<ffi.Int8> format,\n);\n\ntypedef _dart_snd_input_scanf = int Function(\n  ffi.Pointer<snd_input_> input,\n  ffi.Pointer<ffi.Int8> format,\n);\n\ntypedef _c_snd_input_gets = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_input_> input,\n  ffi.Pointer<ffi.Int8> str,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_input_gets = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_input_> input,\n  ffi.Pointer<ffi.Int8> str,\n  int size,\n);\n\ntypedef _c_snd_input_getc = ffi.Int32 Function(\n  ffi.Pointer<snd_input_> input,\n);\n\ntypedef _dart_snd_input_getc = int Function(\n  ffi.Pointer<snd_input_> input,\n);\n\ntypedef _c_snd_input_ungetc = ffi.Int32 Function(\n  ffi.Pointer<snd_input_> input,\n  ffi.Int32 c,\n);\n\ntypedef _dart_snd_input_ungetc = int Function(\n  ffi.Pointer<snd_input_> input,\n  int c,\n);\n\ntypedef _c_snd_output_stdio_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Int8> mode,\n);\n\ntypedef _dart_snd_output_stdio_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n  ffi.Pointer<ffi.Int8> file,\n  ffi.Pointer<ffi.Int8> mode,\n);\n\ntypedef _c_snd_output_stdio_attach = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n  ffi.Pointer<IO_FILE_> fp,\n  ffi.Int32 _close,\n);\n\ntypedef _dart_snd_output_stdio_attach = int Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n  ffi.Pointer<IO_FILE_> fp,\n  int _close,\n);\n\ntypedef _c_snd_output_buffer_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n);\n\ntypedef _dart_snd_output_buffer_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_output_>> outputp,\n);\n\ntypedef _c_snd_output_buffer_string = ffi.Uint64 Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> buf,\n);\n\ntypedef _dart_snd_output_buffer_string = int Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> buf,\n);\n\ntypedef _c_snd_output_close = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n);\n\ntypedef _dart_snd_output_close = int Function(\n  ffi.Pointer<snd_output_> output,\n);\n\ntypedef _c_snd_output_printf = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> format,\n);\n\ntypedef _dart_snd_output_printf = int Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> format,\n);\n\ntypedef _c_snd_output_vprintf = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> format,\n  ffi.Pointer<_va_list_tag_> args,\n);\n\ntypedef _dart_snd_output_vprintf = int Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> format,\n  ffi.Pointer<_va_list_tag_> args,\n);\n\ntypedef _c_snd_output_puts = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_output_puts = int Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_output_putc = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n  ffi.Int32 c,\n);\n\ntypedef _dart_snd_output_putc = int Function(\n  ffi.Pointer<snd_output_> output,\n  int c,\n);\n\ntypedef _c_snd_output_flush = ffi.Int32 Function(\n  ffi.Pointer<snd_output_> output,\n);\n\ntypedef _dart_snd_output_flush = int Function(\n  ffi.Pointer<snd_output_> output,\n);\n\ntypedef _c_snd_strerror = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 errnum,\n);\n\ntypedef _dart_snd_strerror = ffi.Pointer<ffi.Int8> Function(\n  int errnum,\n);\n\ntypedef snd_lib_error_handler_t = ffi.Void Function(\n  ffi.Pointer<ffi.Int8>,\n  ffi.Int32,\n  ffi.Pointer<ffi.Int8>,\n  ffi.Int32,\n  ffi.Pointer<ffi.Int8>,\n);\n\ntypedef _c_snd_lib_error_set_handler = ffi.Int32 Function(\n  ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>> handler,\n);\n\ntypedef _dart_snd_lib_error_set_handler = int Function(\n  ffi.Pointer<ffi.NativeFunction<snd_lib_error_handler_t>> handler,\n);\n\ntypedef snd_local_error_handler_t = ffi.Void Function(\n  ffi.Pointer<ffi.Int8>,\n  ffi.Int32,\n  ffi.Pointer<ffi.Int8>,\n  ffi.Int32,\n  ffi.Pointer<ffi.Int8>,\n  ffi.Pointer<_va_list_tag_>,\n);\n\ntypedef _c_snd_lib_error_set_local\n    = ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>> Function(\n  ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>> func,\n);\n\ntypedef _dart_snd_lib_error_set_local\n    = ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>> Function(\n  ffi.Pointer<ffi.NativeFunction<snd_local_error_handler_t>> func,\n);\n\ntypedef _c_snd_config_topdir = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _dart_snd_config_topdir = ffi.Pointer<ffi.Int8> Function();\n\ntypedef _c_snd_config_top = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n);\n\ntypedef _dart_snd_config_top = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n);\n\ntypedef _c_snd_config_load = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_input_> in_1,\n);\n\ntypedef _dart_snd_config_load = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_input_> in_1,\n);\n\ntypedef _c_snd_config_load_override = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_input_> in_1,\n);\n\ntypedef _dart_snd_config_load_override = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_input_> in_1,\n);\n\ntypedef _c_snd_config_save = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_config_save = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_config_update = ffi.Int32 Function();\n\ntypedef _dart_snd_config_update = int Function();\n\ntypedef _c_snd_config_update_r = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> top,\n  ffi.Pointer<ffi.Pointer<snd_config_update_>> update,\n  ffi.Pointer<ffi.Int8> path,\n);\n\ntypedef _dart_snd_config_update_r = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> top,\n  ffi.Pointer<ffi.Pointer<snd_config_update_>> update,\n  ffi.Pointer<ffi.Int8> path,\n);\n\ntypedef _c_snd_config_update_free = ffi.Int32 Function(\n  ffi.Pointer<snd_config_update_> update,\n);\n\ntypedef _dart_snd_config_update_free = int Function(\n  ffi.Pointer<snd_config_update_> update,\n);\n\ntypedef _c_snd_config_update_free_global = ffi.Int32 Function();\n\ntypedef _dart_snd_config_update_free_global = int Function();\n\ntypedef _c_snd_config_update_ref = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> top,\n);\n\ntypedef _dart_snd_config_update_ref = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> top,\n);\n\ntypedef _c_snd_config_ref = ffi.Void Function(\n  ffi.Pointer<snd_config_> top,\n);\n\ntypedef _dart_snd_config_ref = void Function(\n  ffi.Pointer<snd_config_> top,\n);\n\ntypedef _c_snd_config_unref = ffi.Void Function(\n  ffi.Pointer<snd_config_> top,\n);\n\ntypedef _dart_snd_config_unref = void Function(\n  ffi.Pointer<snd_config_> top,\n);\n\ntypedef _c_snd_config_search = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _dart_snd_config_search = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _c_snd_config_searchv = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _dart_snd_config_searchv = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _c_snd_config_search_definition = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> base,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _dart_snd_config_search_definition = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> base,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _c_snd_config_expand = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> args,\n  ffi.Pointer<snd_config_> private_data,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _dart_snd_config_expand = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> args,\n  ffi.Pointer<snd_config_> private_data,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _c_snd_config_evaluate = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<snd_config_> private_data,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _dart_snd_config_evaluate = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<snd_config_> private_data,\n  ffi.Pointer<ffi.Pointer<snd_config_>> result,\n);\n\ntypedef _c_snd_config_add = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _dart_snd_config_add = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _c_snd_config_add_before = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> before,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _dart_snd_config_add_before = int Function(\n  ffi.Pointer<snd_config_> before,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _c_snd_config_add_after = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> after,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _dart_snd_config_add_after = int Function(\n  ffi.Pointer<snd_config_> after,\n  ffi.Pointer<snd_config_> child,\n);\n\ntypedef _c_snd_config_remove = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _dart_snd_config_remove = int Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _c_snd_config_delete = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _dart_snd_config_delete = int Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _c_snd_config_delete_compound_members = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _dart_snd_config_delete_compound_members = int Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _c_snd_config_copy = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> dst,\n  ffi.Pointer<snd_config_> src,\n);\n\ntypedef _dart_snd_config_copy = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> dst,\n  ffi.Pointer<snd_config_> src,\n);\n\ntypedef _c_snd_config_make = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_config_make = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  int type,\n);\n\ntypedef _c_snd_config_make_integer = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _dart_snd_config_make_integer = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _c_snd_config_make_integer64 = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _dart_snd_config_make_integer64 = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _c_snd_config_make_real = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _dart_snd_config_make_real = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _c_snd_config_make_string = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _dart_snd_config_make_string = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _c_snd_config_make_pointer = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _dart_snd_config_make_pointer = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n);\n\ntypedef _c_snd_config_make_compound = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Int32 join,\n);\n\ntypedef _dart_snd_config_make_compound = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  int join,\n);\n\ntypedef _c_snd_config_imake_integer = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_config_imake_integer = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  int value,\n);\n\ntypedef _c_snd_config_imake_integer64 = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_config_imake_integer64 = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  int value,\n);\n\ntypedef _c_snd_config_imake_real = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Double value,\n);\n\ntypedef _dart_snd_config_imake_real = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  double value,\n);\n\ntypedef _c_snd_config_imake_string = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _dart_snd_config_imake_string = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _c_snd_config_imake_safe_string = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _dart_snd_config_imake_safe_string = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _c_snd_config_imake_pointer = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _dart_snd_config_imake_pointer = int Function(\n  ffi.Pointer<ffi.Pointer<snd_config_>> config,\n  ffi.Pointer<ffi.Int8> key,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _c_snd_config_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _dart_snd_config_get_type = int Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _c_snd_config_is_array = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _dart_snd_config_is_array = int Function(\n  ffi.Pointer<snd_config_> config,\n);\n\ntypedef _c_snd_config_set_id = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _dart_snd_config_set_id = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _c_snd_config_set_integer = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_config_set_integer = int Function(\n  ffi.Pointer<snd_config_> config,\n  int value,\n);\n\ntypedef _c_snd_config_set_integer64 = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_config_set_integer64 = int Function(\n  ffi.Pointer<snd_config_> config,\n  int value,\n);\n\ntypedef _c_snd_config_set_real = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Double value,\n);\n\ntypedef _dart_snd_config_set_real = int Function(\n  ffi.Pointer<snd_config_> config,\n  double value,\n);\n\ntypedef _c_snd_config_set_string = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> value,\n);\n\ntypedef _dart_snd_config_set_string = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> value,\n);\n\ntypedef _c_snd_config_set_ascii = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _dart_snd_config_set_ascii = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _c_snd_config_set_pointer = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _dart_snd_config_set_pointer = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Void> ptr,\n);\n\ntypedef _c_snd_config_get_id = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _dart_snd_config_get_id = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _c_snd_config_get_integer = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_config_get_integer = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_config_get_integer64 = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_config_get_integer64 = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_config_get_real = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Double> value,\n);\n\ntypedef _dart_snd_config_get_real = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Double> value,\n);\n\ntypedef _c_snd_config_get_ireal = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Double> value,\n);\n\ntypedef _dart_snd_config_get_ireal = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Double> value,\n);\n\ntypedef _c_snd_config_get_string = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _dart_snd_config_get_string = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _c_snd_config_get_ascii = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _dart_snd_config_get_ascii = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> value,\n);\n\ntypedef _c_snd_config_get_pointer = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> value,\n);\n\ntypedef _dart_snd_config_get_pointer = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> value,\n);\n\ntypedef _c_snd_config_test_id = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _dart_snd_config_test_id = int Function(\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _c_snd_config_iterator_first = ffi.Pointer<snd_config_iterator_>\n    Function(\n  ffi.Pointer<snd_config_> node,\n);\n\ntypedef _dart_snd_config_iterator_first = ffi.Pointer<snd_config_iterator_>\n    Function(\n  ffi.Pointer<snd_config_> node,\n);\n\ntypedef _c_snd_config_iterator_next = ffi.Pointer<snd_config_iterator_>\n    Function(\n  ffi.Pointer<snd_config_iterator_> iterator,\n);\n\ntypedef _dart_snd_config_iterator_next = ffi.Pointer<snd_config_iterator_>\n    Function(\n  ffi.Pointer<snd_config_iterator_> iterator,\n);\n\ntypedef _c_snd_config_iterator_end = ffi.Pointer<snd_config_iterator_> Function(\n  ffi.Pointer<snd_config_> node,\n);\n\ntypedef _dart_snd_config_iterator_end = ffi.Pointer<snd_config_iterator_>\n    Function(\n  ffi.Pointer<snd_config_> node,\n);\n\ntypedef _c_snd_config_iterator_entry = ffi.Pointer<snd_config_> Function(\n  ffi.Pointer<snd_config_iterator_> iterator,\n);\n\ntypedef _dart_snd_config_iterator_entry = ffi.Pointer<snd_config_> Function(\n  ffi.Pointer<snd_config_iterator_> iterator,\n);\n\ntypedef _c_snd_config_get_bool_ascii = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _dart_snd_config_get_bool_ascii = int Function(\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _c_snd_config_get_bool = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> conf,\n);\n\ntypedef _dart_snd_config_get_bool = int Function(\n  ffi.Pointer<snd_config_> conf,\n);\n\ntypedef _c_snd_config_get_ctl_iface_ascii = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _dart_snd_config_get_ctl_iface_ascii = int Function(\n  ffi.Pointer<ffi.Int8> ascii,\n);\n\ntypedef _c_snd_config_get_ctl_iface = ffi.Int32 Function(\n  ffi.Pointer<snd_config_> conf,\n);\n\ntypedef _dart_snd_config_get_ctl_iface = int Function(\n  ffi.Pointer<snd_config_> conf,\n);\n\ntypedef _c_snd_names_list = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> iface,\n  ffi.Pointer<ffi.Pointer<snd_devname>> list,\n);\n\ntypedef _dart_snd_names_list = int Function(\n  ffi.Pointer<ffi.Int8> iface,\n  ffi.Pointer<ffi.Pointer<snd_devname>> list,\n);\n\ntypedef _c_snd_names_list_free = ffi.Void Function(\n  ffi.Pointer<snd_devname> list,\n);\n\ntypedef _dart_snd_names_list_free = void Function(\n  ffi.Pointer<snd_devname> list,\n);\n\ntypedef _c_snd_pcm_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 stream,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_pcm_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  int stream,\n  int mode,\n);\n\ntypedef _c_snd_pcm_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 stream,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_pcm_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  int stream,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_pcm_open_fallback = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> orig_name,\n  ffi.Int32 stream,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_pcm_open_fallback = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_>> pcm,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> orig_name,\n  int stream,\n  int mode,\n);\n\ntypedef _c_snd_pcm_close = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_close = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_type = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_type = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_stream = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_stream = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_pcm_poll_descriptors = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_pcm_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_pcm_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_pcm_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_pcm_nonblock = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int nonblock,\n);\n\ntypedef _c_snd_async_add_pcm_handler = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_async_add_pcm_handler = int Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _c_snd_async_handler_get_pcm = ffi.Pointer<snd_pcm_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_pcm = ffi.Pointer<snd_pcm_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_pcm_info = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_info_> info,\n);\n\ntypedef _dart_snd_pcm_info = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_info_> info,\n);\n\ntypedef _c_snd_pcm_hw_params_current = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_current = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_free = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_hw_free = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_sw_params_current = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _dart_snd_pcm_sw_params_current = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _c_snd_pcm_sw_params = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _dart_snd_pcm_sw_params = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _c_snd_pcm_prepare = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_prepare = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_reset = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_reset = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_status = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_status_> status,\n);\n\ntypedef _dart_snd_pcm_status = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_status_> status,\n);\n\ntypedef _c_snd_pcm_start = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_start = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_drop = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_drop = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_drain = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_drain = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_pause = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 enable,\n);\n\ntypedef _dart_snd_pcm_pause = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int enable,\n);\n\ntypedef _c_snd_pcm_state = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_state = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_hwsync = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_hwsync = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_delay = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int64> delayp,\n);\n\ntypedef _dart_snd_pcm_delay = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int64> delayp,\n);\n\ntypedef _c_snd_pcm_resume = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_resume = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_htimestamp = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint64> avail,\n  ffi.Pointer<timespec> tstamp,\n);\n\ntypedef _dart_snd_pcm_htimestamp = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint64> avail,\n  ffi.Pointer<timespec> tstamp,\n);\n\ntypedef _c_snd_pcm_avail = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_avail = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_avail_update = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_avail_update = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_avail_delay = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int64> availp,\n  ffi.Pointer<ffi.Int64> delayp,\n);\n\ntypedef _dart_snd_pcm_avail_delay = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int64> availp,\n  ffi.Pointer<ffi.Int64> delayp,\n);\n\ntypedef _c_snd_pcm_rewindable = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_rewindable = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_rewind = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Uint64 frames,\n);\n\ntypedef _dart_snd_pcm_rewind = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int frames,\n);\n\ntypedef _c_snd_pcm_forwardable = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_forwardable = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_forward = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Uint64 frames,\n);\n\ntypedef _dart_snd_pcm_forward = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int frames,\n);\n\ntypedef _c_snd_pcm_writei = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_writei = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_pcm_readi = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_readi = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_pcm_writen = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_writen = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  int size,\n);\n\ntypedef _c_snd_pcm_readn = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_readn = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  int size,\n);\n\ntypedef _c_snd_pcm_wait = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 timeout,\n);\n\ntypedef _dart_snd_pcm_wait = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int timeout,\n);\n\ntypedef _c_snd_pcm_link = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm1,\n  ffi.Pointer<snd_pcm_> pcm2,\n);\n\ntypedef _dart_snd_pcm_link = int Function(\n  ffi.Pointer<snd_pcm_> pcm1,\n  ffi.Pointer<snd_pcm_> pcm2,\n);\n\ntypedef _c_snd_pcm_unlink = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_unlink = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_query_chmaps\n    = ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_query_chmaps\n    = ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_query_chmaps_from_hw\n    = ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> Function(\n  ffi.Int32 card,\n  ffi.Int32 dev,\n  ffi.Int32 subdev,\n  ffi.Int32 stream,\n);\n\ntypedef _dart_snd_pcm_query_chmaps_from_hw\n    = ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> Function(\n  int card,\n  int dev,\n  int subdev,\n  int stream,\n);\n\ntypedef _c_snd_pcm_free_chmaps = ffi.Void Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> maps,\n);\n\ntypedef _dart_snd_pcm_free_chmaps = void Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_chmap_query_t>> maps,\n);\n\ntypedef _c_snd_pcm_get_chmap = ffi.Pointer<snd_pcm_chmap_t> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_get_chmap = ffi.Pointer<snd_pcm_chmap_t> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_set_chmap = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_chmap_t> map,\n);\n\ntypedef _dart_snd_pcm_set_chmap = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_chmap_t> map,\n);\n\ntypedef _c_snd_pcm_chmap_type_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_chmap_type_name = ffi.Pointer<ffi.Int8> Function(\n  int val,\n);\n\ntypedef _c_snd_pcm_chmap_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_chmap_name = ffi.Pointer<ffi.Int8> Function(\n  int val,\n);\n\ntypedef _c_snd_pcm_chmap_long_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_chmap_long_name = ffi.Pointer<ffi.Int8> Function(\n  int val,\n);\n\ntypedef _c_snd_pcm_chmap_print = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_chmap_t> map,\n  ffi.Uint64 maxlen,\n  ffi.Pointer<ffi.Int8> buf,\n);\n\ntypedef _dart_snd_pcm_chmap_print = int Function(\n  ffi.Pointer<snd_pcm_chmap_t> map,\n  int maxlen,\n  ffi.Pointer<ffi.Int8> buf,\n);\n\ntypedef _c_snd_pcm_chmap_from_string = ffi.Uint32 Function(\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_pcm_chmap_from_string = int Function(\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_pcm_chmap_parse_string = ffi.Pointer<snd_pcm_chmap_t> Function(\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_pcm_chmap_parse_string = ffi.Pointer<snd_pcm_chmap_t>\n    Function(\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_pcm_recover = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 err,\n  ffi.Int32 silent,\n);\n\ntypedef _dart_snd_pcm_recover = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int err,\n  int silent,\n);\n\ntypedef _c_snd_pcm_set_params = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 format,\n  ffi.Int32 access,\n  ffi.Uint32 channels,\n  ffi.Uint32 rate,\n  ffi.Int32 soft_resample,\n  ffi.Uint32 latency,\n);\n\ntypedef _dart_snd_pcm_set_params = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int format,\n  int access,\n  int channels,\n  int rate,\n  int soft_resample,\n  int latency,\n);\n\ntypedef _c_snd_pcm_get_params = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint64> buffer_size,\n  ffi.Pointer<ffi.Uint64> period_size,\n);\n\ntypedef _dart_snd_pcm_get_params = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint64> buffer_size,\n  ffi.Pointer<ffi.Uint64> period_size,\n);\n\ntypedef _c_snd_pcm_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_info_sizeof = int Function();\n\ntypedef _c_snd_pcm_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_info_>> ptr,\n);\n\ntypedef _dart_snd_pcm_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_info_>> ptr,\n);\n\ntypedef _c_snd_pcm_info_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_free = void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_info_> dst,\n  ffi.Pointer<snd_pcm_info_> src,\n);\n\ntypedef _dart_snd_pcm_info_copy = void Function(\n  ffi.Pointer<snd_pcm_info_> dst,\n  ffi.Pointer<snd_pcm_info_> src,\n);\n\ntypedef _c_snd_pcm_info_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_device = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_subdevice = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_stream = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_stream = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_card = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_subdevice_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_subdevice_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_class = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_class = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_subclass = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_subclass = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_subdevices_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_subdevices_count = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_get_subdevices_avail = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _dart_snd_pcm_info_get_subdevices_avail = int Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n);\n\ntypedef _c_snd_pcm_info_set_device = ffi.Void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_info_set_device = void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_pcm_info_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_info_set_subdevice = void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_pcm_info_set_stream = ffi.Void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_info_set_stream = void Function(\n  ffi.Pointer<snd_pcm_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_any = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_any = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_mmap_sample_resolution = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_mmap_sample_resolution = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_double = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_double = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_batch = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_batch = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_block_transfer = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_block_transfer = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_monotonic = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_monotonic = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_overrange = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_overrange = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_pause = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_pause = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_resume = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_resume = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_half_duplex = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_half_duplex = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_is_joint_duplex = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_is_joint_duplex = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_sync_start = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_sync_start = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_can_disable_period_wakeup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_can_disable_period_wakeup = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_supports_audio_wallclock_ts = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_supports_audio_wallclock_ts = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_supports_audio_ts_type = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_pcm_hw_params_supports_audio_ts_type = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int type,\n);\n\ntypedef _c_snd_pcm_hw_params_get_rate_numden = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> rate_num,\n  ffi.Pointer<ffi.Uint32> rate_den,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_rate_numden = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> rate_num,\n  ffi.Pointer<ffi.Uint32> rate_den,\n);\n\ntypedef _c_snd_pcm_hw_params_get_sbits = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_sbits = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_get_fifo_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_fifo_size = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_hw_params_sizeof = int Function();\n\ntypedef _c_snd_pcm_hw_params_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_hw_params_>> ptr,\n);\n\ntypedef _dart_snd_pcm_hw_params_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_hw_params_>> ptr,\n);\n\ntypedef _c_snd_pcm_hw_params_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_hw_params_> obj,\n);\n\ntypedef _dart_snd_pcm_hw_params_free = void Function(\n  ffi.Pointer<snd_pcm_hw_params_> obj,\n);\n\ntypedef _c_snd_pcm_hw_params_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_hw_params_> dst,\n  ffi.Pointer<snd_pcm_hw_params_> src,\n);\n\ntypedef _dart_snd_pcm_hw_params_copy = void Function(\n  ffi.Pointer<snd_pcm_hw_params_> dst,\n  ffi.Pointer<snd_pcm_hw_params_> src,\n);\n\ntypedef _c_snd_pcm_hw_params_get_access = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_access = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _c_snd_pcm_hw_params_test_access = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 _access,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_access = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int _access,\n);\n\ntypedef _c_snd_pcm_hw_params_set_access = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 _access,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_access = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int _access,\n);\n\ntypedef _c_snd_pcm_hw_params_set_access_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_access_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _c_snd_pcm_hw_params_set_access_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_access_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> _access,\n);\n\ntypedef _c_snd_pcm_hw_params_set_access_mask = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_access_mask = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_access_mask = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_access_mask = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_format = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_format = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_test_format = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_format = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_format = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_format = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_format_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> format,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_format_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> format,\n);\n\ntypedef _c_snd_pcm_hw_params_set_format_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> format,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_format_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> format,\n);\n\ntypedef _c_snd_pcm_hw_params_set_format_mask = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_format_mask = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_format_mask = ffi.Void Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_format_mask = void Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_subformat = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_subformat = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _c_snd_pcm_hw_params_test_subformat = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 subformat,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_subformat = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int subformat,\n);\n\ntypedef _c_snd_pcm_hw_params_set_subformat = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Int32 subformat,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_subformat = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int subformat,\n);\n\ntypedef _c_snd_pcm_hw_params_set_subformat_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_subformat_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _c_snd_pcm_hw_params_set_subformat_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_subformat_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Int32> subformat,\n);\n\ntypedef _c_snd_pcm_hw_params_set_subformat_mask = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_subformat_mask = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_subformat_mask = ffi.Void Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_subformat_mask = void Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _c_snd_pcm_hw_params_get_channels = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_channels = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_channels_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_channels_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_channels_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_channels_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_test_channels = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_channels = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Uint32> max,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Uint32> max,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_channels_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_channels_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_rate = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_rate = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_rate_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_rate_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_rate_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_rate_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_rate = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_rate = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_rate_resample = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_rate_resample = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_rate_resample = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_rate_resample = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_export_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_export_buffer = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_export_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_export_buffer = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_wakeup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_wakeup = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_wakeup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_wakeup = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_time = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_time_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_time_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_period_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_period_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_time_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_time_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_size = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_size_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_size_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_period_size_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_period_size_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> frames,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_period_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint64 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_period_size = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint64 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint64> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint64> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_period_size_integer = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_period_size_integer = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_get_periods = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_periods = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_periods_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_periods_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_periods_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_periods_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_periods = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_periods = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_periods_integer = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_periods_integer = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_time = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_time_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_time_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_buffer_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_buffer_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_time_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_time_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_size = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_size_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_size_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_buffer_size_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_buffer_size_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_test_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_buffer_size = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> min,\n  ffi.Pointer<ffi.Uint64> max,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> min,\n  ffi.Pointer<ffi.Uint64> max,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_set_buffer_size_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_buffer_size_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_min_align = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_min_align = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_sw_params_sizeof = int Function();\n\ntypedef _c_snd_pcm_sw_params_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_sw_params_>> ptr,\n);\n\ntypedef _dart_snd_pcm_sw_params_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_sw_params_>> ptr,\n);\n\ntypedef _c_snd_pcm_sw_params_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_sw_params_> obj,\n);\n\ntypedef _dart_snd_pcm_sw_params_free = void Function(\n  ffi.Pointer<snd_pcm_sw_params_> obj,\n);\n\ntypedef _c_snd_pcm_sw_params_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_sw_params_> dst,\n  ffi.Pointer<snd_pcm_sw_params_> src,\n);\n\ntypedef _dart_snd_pcm_sw_params_copy = void Function(\n  ffi.Pointer<snd_pcm_sw_params_> dst,\n  ffi.Pointer<snd_pcm_sw_params_> src,\n);\n\ntypedef _c_snd_pcm_sw_params_get_boundary = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_boundary = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_tstamp_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_tstamp_mode = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_tstamp_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_tstamp_mode = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_tstamp_type = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_tstamp_type = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_tstamp_type = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_tstamp_type = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_avail_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_avail_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_avail_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_avail_min = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_period_event = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_period_event = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_period_event = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_period_event = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Int32> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_start_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_start_threshold = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_start_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> paramsm,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_start_threshold = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> paramsm,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_stop_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_stop_threshold = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_stop_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_stop_threshold = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_silence_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_silence_threshold = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_silence_threshold = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_silence_threshold = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_silence_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_silence_size = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_silence_size = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_silence_size = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_access_mask_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_access_mask_sizeof = int Function();\n\ntypedef _c_snd_pcm_access_mask_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_access_mask_>> ptr,\n);\n\ntypedef _dart_snd_pcm_access_mask_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_access_mask_>> ptr,\n);\n\ntypedef _c_snd_pcm_access_mask_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> obj,\n);\n\ntypedef _dart_snd_pcm_access_mask_free = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> obj,\n);\n\ntypedef _c_snd_pcm_access_mask_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> dst,\n  ffi.Pointer<snd_pcm_access_mask_> src,\n);\n\ntypedef _dart_snd_pcm_access_mask_copy = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> dst,\n  ffi.Pointer<snd_pcm_access_mask_> src,\n);\n\ntypedef _c_snd_pcm_access_mask_none = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_access_mask_none = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _c_snd_pcm_access_mask_any = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_access_mask_any = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _c_snd_pcm_access_mask_test = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_access_mask_test = int Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_access_mask_empty = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_access_mask_empty = int Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n);\n\ntypedef _c_snd_pcm_access_mask_set = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_access_mask_set = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_access_mask_reset = ffi.Void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_access_mask_reset = void Function(\n  ffi.Pointer<snd_pcm_access_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_format_mask_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_format_mask_sizeof = int Function();\n\ntypedef _c_snd_pcm_format_mask_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_format_mask_>> ptr,\n);\n\ntypedef _dart_snd_pcm_format_mask_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_format_mask_>> ptr,\n);\n\ntypedef _c_snd_pcm_format_mask_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> obj,\n);\n\ntypedef _dart_snd_pcm_format_mask_free = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> obj,\n);\n\ntypedef _c_snd_pcm_format_mask_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> dst,\n  ffi.Pointer<snd_pcm_format_mask_> src,\n);\n\ntypedef _dart_snd_pcm_format_mask_copy = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> dst,\n  ffi.Pointer<snd_pcm_format_mask_> src,\n);\n\ntypedef _c_snd_pcm_format_mask_none = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_format_mask_none = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _c_snd_pcm_format_mask_any = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_format_mask_any = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _c_snd_pcm_format_mask_test = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_format_mask_test = int Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_format_mask_empty = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_format_mask_empty = int Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n);\n\ntypedef _c_snd_pcm_format_mask_set = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_format_mask_set = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_format_mask_reset = ffi.Void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_format_mask_reset = void Function(\n  ffi.Pointer<snd_pcm_format_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_subformat_mask_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_subformat_mask_sizeof = int Function();\n\ntypedef _c_snd_pcm_subformat_mask_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_subformat_mask_>> ptr,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_subformat_mask_>> ptr,\n);\n\ntypedef _c_snd_pcm_subformat_mask_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> obj,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_free = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> obj,\n);\n\ntypedef _c_snd_pcm_subformat_mask_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> dst,\n  ffi.Pointer<snd_pcm_subformat_mask_> src,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_copy = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> dst,\n  ffi.Pointer<snd_pcm_subformat_mask_> src,\n);\n\ntypedef _c_snd_pcm_subformat_mask_none = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_none = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _c_snd_pcm_subformat_mask_any = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_any = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _c_snd_pcm_subformat_mask_test = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_test = int Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_subformat_mask_empty = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_empty = int Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n);\n\ntypedef _c_snd_pcm_subformat_mask_set = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_set = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_subformat_mask_reset = ffi.Void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_subformat_mask_reset = void Function(\n  ffi.Pointer<snd_pcm_subformat_mask_> mask,\n  int val,\n);\n\ntypedef _c_snd_pcm_status_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_pcm_status_sizeof = int Function();\n\ntypedef _c_snd_pcm_status_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_status_>> ptr,\n);\n\ntypedef _dart_snd_pcm_status_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_status_>> ptr,\n);\n\ntypedef _c_snd_pcm_status_free = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_free = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_status_copy = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> dst,\n  ffi.Pointer<snd_pcm_status_> src,\n);\n\ntypedef _dart_snd_pcm_status_copy = void Function(\n  ffi.Pointer<snd_pcm_status_> dst,\n  ffi.Pointer<snd_pcm_status_> src,\n);\n\ntypedef _c_snd_pcm_status_get_state = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_get_state = int Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_status_get_trigger_tstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timeval> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_trigger_tstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timeval> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_trigger_htstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_trigger_htstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_tstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timeval> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_tstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timeval> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_htstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_htstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_audio_htstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_audio_htstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_driver_htstamp = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _dart_snd_pcm_status_get_driver_htstamp = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _c_snd_pcm_status_get_audio_htstamp_report = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<snd_pcm_audio_tstamp_report_t> audio_tstamp_report,\n);\n\ntypedef _dart_snd_pcm_status_get_audio_htstamp_report = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<snd_pcm_audio_tstamp_report_t> audio_tstamp_report,\n);\n\ntypedef _c_snd_pcm_status_set_audio_htstamp_config = ffi.Void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<snd_pcm_audio_tstamp_config_t> audio_tstamp_config,\n);\n\ntypedef _dart_snd_pcm_status_set_audio_htstamp_config = void Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n  ffi.Pointer<snd_pcm_audio_tstamp_config_t> audio_tstamp_config,\n);\n\ntypedef _c_snd_pcm_status_get_delay = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_get_delay = int Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_status_get_avail = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_get_avail = int Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_status_get_avail_max = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_get_avail_max = int Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_status_get_overrange = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _dart_snd_pcm_status_get_overrange = int Function(\n  ffi.Pointer<snd_pcm_status_> obj,\n);\n\ntypedef _c_snd_pcm_type_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_pcm_type_name = ffi.Pointer<ffi.Int8> Function(\n  int type,\n);\n\ntypedef _c_snd_pcm_stream_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 stream,\n);\n\ntypedef _dart_snd_pcm_stream_name = ffi.Pointer<ffi.Int8> Function(\n  int stream,\n);\n\ntypedef _c_snd_pcm_access_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 _access,\n);\n\ntypedef _dart_snd_pcm_access_name = ffi.Pointer<ffi.Int8> Function(\n  int _access,\n);\n\ntypedef _c_snd_pcm_format_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_name = ffi.Pointer<ffi.Int8> Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_description = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_description = ffi.Pointer<ffi.Int8> Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_subformat_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 subformat,\n);\n\ntypedef _dart_snd_pcm_subformat_name = ffi.Pointer<ffi.Int8> Function(\n  int subformat,\n);\n\ntypedef _c_snd_pcm_subformat_description = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 subformat,\n);\n\ntypedef _dart_snd_pcm_subformat_description = ffi.Pointer<ffi.Int8> Function(\n  int subformat,\n);\n\ntypedef _c_snd_pcm_format_value = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_pcm_format_value = int Function(\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_pcm_tstamp_mode_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_pcm_tstamp_mode_name = ffi.Pointer<ffi.Int8> Function(\n  int mode,\n);\n\ntypedef _c_snd_pcm_state_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 state,\n);\n\ntypedef _dart_snd_pcm_state_name = ffi.Pointer<ffi.Int8> Function(\n  int state,\n);\n\ntypedef _c_snd_pcm_dump = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_dump = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_dump_hw_setup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_dump_hw_setup = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_dump_sw_setup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_dump_sw_setup = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_dump_setup = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_dump_setup = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_hw_params_dump = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_hw_params_dump = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_sw_params_dump = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_sw_params_dump = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_status_dump = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_status_> status,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _dart_snd_pcm_status_dump = int Function(\n  ffi.Pointer<snd_pcm_status_> status,\n  ffi.Pointer<snd_output_> out,\n);\n\ntypedef _c_snd_pcm_mmap_begin = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<snd_pcm_channel_area_t>> areas,\n  ffi.Pointer<ffi.Uint64> offset,\n  ffi.Pointer<ffi.Uint64> frames,\n);\n\ntypedef _dart_snd_pcm_mmap_begin = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<snd_pcm_channel_area_t>> areas,\n  ffi.Pointer<ffi.Uint64> offset,\n  ffi.Pointer<ffi.Uint64> frames,\n);\n\ntypedef _c_snd_pcm_mmap_commit = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Uint64 offset,\n  ffi.Uint64 frames,\n);\n\ntypedef _dart_snd_pcm_mmap_commit = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int offset,\n  int frames,\n);\n\ntypedef _c_snd_pcm_mmap_writei = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_mmap_writei = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_pcm_mmap_readi = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_mmap_readi = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_pcm_mmap_writen = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_mmap_writen = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  int size,\n);\n\ntypedef _c_snd_pcm_mmap_readn = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_pcm_mmap_readn = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Pointer<ffi.Void>> bufs,\n  int size,\n);\n\ntypedef _c_snd_pcm_format_signed = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_signed = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_unsigned = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_unsigned = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_linear = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_linear = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_float = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_float = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_little_endian = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_little_endian = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_big_endian = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_big_endian = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_cpu_endian = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_cpu_endian = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_width = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_width = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_physical_width = ffi.Int32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_physical_width = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_build_linear_format = ffi.Int32 Function(\n  ffi.Int32 width,\n  ffi.Int32 pwidth,\n  ffi.Int32 unsignd,\n  ffi.Int32 big_endian,\n);\n\ntypedef _dart_snd_pcm_build_linear_format = int Function(\n  int width,\n  int pwidth,\n  int unsignd,\n  int big_endian,\n);\n\ntypedef _c_snd_pcm_format_size = ffi.Int64 Function(\n  ffi.Int32 format,\n  ffi.Uint64 samples,\n);\n\ntypedef _dart_snd_pcm_format_size = int Function(\n  int format,\n  int samples,\n);\n\ntypedef _c_snd_pcm_format_silence = ffi.Uint8 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_silence = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_silence_16 = ffi.Uint16 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_silence_16 = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_silence_32 = ffi.Uint32 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_silence_32 = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_silence_64 = ffi.Uint64 Function(\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_format_silence_64 = int Function(\n  int format,\n);\n\ntypedef _c_snd_pcm_format_set_silence = ffi.Int32 Function(\n  ffi.Int32 format,\n  ffi.Pointer<ffi.Void> buf,\n  ffi.Uint32 samples,\n);\n\ntypedef _dart_snd_pcm_format_set_silence = int Function(\n  int format,\n  ffi.Pointer<ffi.Void> buf,\n  int samples,\n);\n\ntypedef _c_snd_pcm_bytes_to_frames = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int64 bytes,\n);\n\ntypedef _dart_snd_pcm_bytes_to_frames = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int bytes,\n);\n\ntypedef _c_snd_pcm_frames_to_bytes = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int64 frames,\n);\n\ntypedef _dart_snd_pcm_frames_to_bytes = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int frames,\n);\n\ntypedef _c_snd_pcm_bytes_to_samples = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int64 bytes,\n);\n\ntypedef _dart_snd_pcm_bytes_to_samples = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int bytes,\n);\n\ntypedef _c_snd_pcm_samples_to_bytes = ffi.Int64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int64 samples,\n);\n\ntypedef _dart_snd_pcm_samples_to_bytes = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int samples,\n);\n\ntypedef _c_snd_pcm_area_silence = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n  ffi.Uint64 dst_offset,\n  ffi.Uint32 samples,\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_area_silence = int Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n  int dst_offset,\n  int samples,\n  int format,\n);\n\ntypedef _c_snd_pcm_areas_silence = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  ffi.Uint64 dst_offset,\n  ffi.Uint32 channels,\n  ffi.Uint64 frames,\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_areas_silence = int Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  int dst_offset,\n  int channels,\n  int frames,\n  int format,\n);\n\ntypedef _c_snd_pcm_area_copy = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n  ffi.Uint64 dst_offset,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channel,\n  ffi.Uint64 src_offset,\n  ffi.Uint32 samples,\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_area_copy = int Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channel,\n  int dst_offset,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channel,\n  int src_offset,\n  int samples,\n  int format,\n);\n\ntypedef _c_snd_pcm_areas_copy = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  ffi.Uint64 dst_offset,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n  ffi.Uint64 src_offset,\n  ffi.Uint32 channels,\n  ffi.Uint64 frames,\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_areas_copy = int Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  int dst_offset,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n  int src_offset,\n  int channels,\n  int frames,\n  int format,\n);\n\ntypedef _c_snd_pcm_areas_copy_wrap = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  ffi.Uint64 dst_offset,\n  ffi.Uint64 dst_size,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n  ffi.Uint64 src_offset,\n  ffi.Uint64 src_size,\n  ffi.Uint32 channels,\n  ffi.Uint64 frames,\n  ffi.Int32 format,\n);\n\ntypedef _dart_snd_pcm_areas_copy_wrap = int Function(\n  ffi.Pointer<snd_pcm_channel_area_t> dst_channels,\n  int dst_offset,\n  int dst_size,\n  ffi.Pointer<snd_pcm_channel_area_t> src_channels,\n  int src_offset,\n  int src_size,\n  int channels,\n  int frames,\n  int format,\n);\n\ntypedef _c_snd_pcm_hook_get_pcm = ffi.Pointer<snd_pcm_> Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _dart_snd_pcm_hook_get_pcm = ffi.Pointer<snd_pcm_> Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _c_snd_pcm_hook_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _dart_snd_pcm_hook_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _c_snd_pcm_hook_set_private = ffi.Void Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_pcm_hook_set_private = void Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef snd_pcm_hook_func_t = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hook_>,\n);\n\ntypedef _c_snd_pcm_hook_add = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_hook_>> hookp,\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Int32 type,\n  ffi.Pointer<ffi.NativeFunction<snd_pcm_hook_func_t>> func,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_pcm_hook_add = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_hook_>> hookp,\n  ffi.Pointer<snd_pcm_> pcm,\n  int type,\n  ffi.Pointer<ffi.NativeFunction<snd_pcm_hook_func_t>> func,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _c_snd_pcm_hook_remove = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _dart_snd_pcm_hook_remove = int Function(\n  ffi.Pointer<snd_pcm_hook_> hook,\n);\n\ntypedef _c_snd_pcm_meter_get_bufsize = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_meter_get_bufsize = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_meter_get_channels = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_meter_get_channels = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_meter_get_rate = ffi.Uint32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_meter_get_rate = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_meter_get_now = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_meter_get_now = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_meter_get_boundary = ffi.Uint64 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _dart_snd_pcm_meter_get_boundary = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n);\n\ntypedef _c_snd_pcm_meter_add_scope = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _dart_snd_pcm_meter_add_scope = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _c_snd_pcm_meter_search_scope = ffi.Pointer<snd_pcm_scope_> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_pcm_meter_search_scope = ffi.Pointer<snd_pcm_scope_> Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_pcm_scope_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> ptr,\n);\n\ntypedef _dart_snd_pcm_scope_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> ptr,\n);\n\ntypedef _c_snd_pcm_scope_set_ops = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<snd_pcm_scope_ops_t> val,\n);\n\ntypedef _dart_snd_pcm_scope_set_ops = void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<snd_pcm_scope_ops_t> val,\n);\n\ntypedef _c_snd_pcm_scope_set_name = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _dart_snd_pcm_scope_set_name = void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _c_snd_pcm_scope_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _dart_snd_pcm_scope_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _c_snd_pcm_scope_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _dart_snd_pcm_scope_get_callback_private = ffi.Pointer<ffi.Void>\n    Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n);\n\ntypedef _c_snd_pcm_scope_set_callback_private = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _dart_snd_pcm_scope_set_callback_private = void Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _c_snd_pcm_scope_s16_open = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> scopep,\n);\n\ntypedef _dart_snd_pcm_scope_s16_open = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Pointer<snd_pcm_scope_>> scopep,\n);\n\ntypedef _c_snd_pcm_scope_s16_get_channel_buffer = ffi.Pointer<ffi.Int16>\n    Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  ffi.Uint32 channel,\n);\n\ntypedef _dart_snd_pcm_scope_s16_get_channel_buffer = ffi.Pointer<ffi.Int16>\n    Function(\n  ffi.Pointer<snd_pcm_scope_> scope,\n  int channel,\n);\n\ntypedef _c_snd_spcm_init = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Uint32 rate,\n  ffi.Uint32 channels,\n  ffi.Int32 format,\n  ffi.Int32 subformat,\n  ffi.Int32 latency,\n  ffi.Int32 _access,\n  ffi.Int32 xrun_type,\n);\n\ntypedef _dart_snd_spcm_init = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  int rate,\n  int channels,\n  int format,\n  int subformat,\n  int latency,\n  int _access,\n  int xrun_type,\n);\n\ntypedef _c_snd_spcm_init_duplex = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> playback_pcm,\n  ffi.Pointer<snd_pcm_> capture_pcm,\n  ffi.Uint32 rate,\n  ffi.Uint32 channels,\n  ffi.Int32 format,\n  ffi.Int32 subformat,\n  ffi.Int32 latency,\n  ffi.Int32 _access,\n  ffi.Int32 xrun_type,\n  ffi.Int32 duplex_type,\n);\n\ntypedef _dart_snd_spcm_init_duplex = int Function(\n  ffi.Pointer<snd_pcm_> playback_pcm,\n  ffi.Pointer<snd_pcm_> capture_pcm,\n  int rate,\n  int channels,\n  int format,\n  int subformat,\n  int latency,\n  int _access,\n  int xrun_type,\n  int duplex_type,\n);\n\ntypedef _c_snd_spcm_init_get_params = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint32> rate,\n  ffi.Pointer<ffi.Uint64> buffer_size,\n  ffi.Pointer<ffi.Uint64> period_size,\n);\n\ntypedef _dart_snd_spcm_init_get_params = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<ffi.Uint32> rate,\n  ffi.Pointer<ffi.Uint64> buffer_size,\n  ffi.Pointer<ffi.Uint64> period_size,\n);\n\ntypedef _c_snd_pcm_start_mode_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_pcm_start_mode_name = ffi.Pointer<ffi.Int8> Function(\n  int mode,\n);\n\ntypedef _c_snd_pcm_xrun_mode_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_pcm_xrun_mode_name = ffi.Pointer<ffi.Int8> Function(\n  int mode,\n);\n\ntypedef _c_snd_pcm_sw_params_set_start_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_start_mode = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_start_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_start_mode = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _c_snd_pcm_sw_params_set_xrun_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_xrun_mode = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_xrun_mode = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_xrun_mode = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n);\n\ntypedef _c_snd_pcm_sw_params_set_xfer_align = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_xfer_align = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_xfer_align = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_xfer_align = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint64> val,\n);\n\ntypedef _c_snd_pcm_sw_params_set_sleep_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_pcm_sw_params_set_sleep_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  int val,\n);\n\ntypedef _c_snd_pcm_sw_params_get_sleep_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _dart_snd_pcm_sw_params_get_sleep_min = int Function(\n  ffi.Pointer<snd_pcm_sw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n);\n\ntypedef _c_snd_pcm_hw_params_get_tick_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_tick_time = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_tick_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_tick_time_min = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_get_tick_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_get_tick_time_max = int Function(\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_test_tick_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_test_tick_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Uint32 val,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  int val,\n  int dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_min = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_min = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_max = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_max = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_minmax = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_minmax = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> min,\n  ffi.Pointer<ffi.Int32> mindir,\n  ffi.Pointer<ffi.Uint32> max,\n  ffi.Pointer<ffi.Int32> maxdir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_near = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_near = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_first = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_first = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_pcm_hw_params_set_tick_time_last = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _dart_snd_pcm_hw_params_set_tick_time_last = int Function(\n  ffi.Pointer<snd_pcm_> pcm,\n  ffi.Pointer<snd_pcm_hw_params_> params,\n  ffi.Pointer<ffi.Uint32> val,\n  ffi.Pointer<ffi.Int32> dir,\n);\n\ntypedef _c_snd_rawmidi_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_rawmidi_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_rawmidi_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_rawmidi_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> in_rmidi,\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_>> out_rmidi,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_rawmidi_close = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_close = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_rawmidi_poll_descriptors = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_rawmidi_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rawmidi,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revent,\n);\n\ntypedef _dart_snd_rawmidi_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_rawmidi_> rawmidi,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revent,\n);\n\ntypedef _c_snd_rawmidi_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_rawmidi_nonblock = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  int nonblock,\n);\n\ntypedef _c_snd_rawmidi_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_rawmidi_info_sizeof = int Function();\n\ntypedef _c_snd_rawmidi_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_info_>> ptr,\n);\n\ntypedef _dart_snd_rawmidi_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_info_>> ptr,\n);\n\ntypedef _c_snd_rawmidi_info_free = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_free = void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_info_> dst,\n  ffi.Pointer<snd_rawmidi_info_> src,\n);\n\ntypedef _dart_snd_rawmidi_info_copy = void Function(\n  ffi.Pointer<snd_rawmidi_info_> dst,\n  ffi.Pointer<snd_rawmidi_info_> src,\n);\n\ntypedef _c_snd_rawmidi_info_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_device = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_subdevice = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_stream = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_stream = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_card = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_flags = ffi.Uint32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_flags = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_subdevice_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_subdevice_name = ffi.Pointer<ffi.Int8>\n    Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_subdevices_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_subdevices_count = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_get_subdevices_avail = ffi.Uint32 Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _dart_snd_rawmidi_info_get_subdevices_avail = int Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n);\n\ntypedef _c_snd_rawmidi_info_set_device = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_rawmidi_info_set_device = void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_info_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_rawmidi_info_set_subdevice = void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_info_set_stream = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_rawmidi_info_set_stream = void Function(\n  ffi.Pointer<snd_rawmidi_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_info = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_info_> info,\n);\n\ntypedef _dart_snd_rawmidi_info = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_info_> info,\n);\n\ntypedef _c_snd_rawmidi_params_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_rawmidi_params_sizeof = int Function();\n\ntypedef _c_snd_rawmidi_params_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_params_>> ptr,\n);\n\ntypedef _dart_snd_rawmidi_params_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_params_>> ptr,\n);\n\ntypedef _c_snd_rawmidi_params_free = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_params_> obj,\n);\n\ntypedef _dart_snd_rawmidi_params_free = void Function(\n  ffi.Pointer<snd_rawmidi_params_> obj,\n);\n\ntypedef _c_snd_rawmidi_params_copy = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_params_> dst,\n  ffi.Pointer<snd_rawmidi_params_> src,\n);\n\ntypedef _dart_snd_rawmidi_params_copy = void Function(\n  ffi.Pointer<snd_rawmidi_params_> dst,\n  ffi.Pointer<snd_rawmidi_params_> src,\n);\n\ntypedef _c_snd_rawmidi_params_set_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_rawmidi_params_set_buffer_size = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_params_get_buffer_size = ffi.Uint64 Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _dart_snd_rawmidi_params_get_buffer_size = int Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _c_snd_rawmidi_params_set_avail_min = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  ffi.Uint64 val,\n);\n\ntypedef _dart_snd_rawmidi_params_set_avail_min = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_params_get_avail_min = ffi.Uint64 Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _dart_snd_rawmidi_params_get_avail_min = int Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _c_snd_rawmidi_params_set_no_active_sensing = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_rawmidi_params_set_no_active_sensing = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n  int val,\n);\n\ntypedef _c_snd_rawmidi_params_get_no_active_sensing = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _dart_snd_rawmidi_params_get_no_active_sensing = int Function(\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _c_snd_rawmidi_params = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _dart_snd_rawmidi_params = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _c_snd_rawmidi_params_current = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _dart_snd_rawmidi_params_current = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_params_> params,\n);\n\ntypedef _c_snd_rawmidi_status_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_rawmidi_status_sizeof = int Function();\n\ntypedef _c_snd_rawmidi_status_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_status_>> ptr,\n);\n\ntypedef _dart_snd_rawmidi_status_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_rawmidi_status_>> ptr,\n);\n\ntypedef _c_snd_rawmidi_status_free = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _dart_snd_rawmidi_status_free = void Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _c_snd_rawmidi_status_copy = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_status_> dst,\n  ffi.Pointer<snd_rawmidi_status_> src,\n);\n\ntypedef _dart_snd_rawmidi_status_copy = void Function(\n  ffi.Pointer<snd_rawmidi_status_> dst,\n  ffi.Pointer<snd_rawmidi_status_> src,\n);\n\ntypedef _c_snd_rawmidi_status_get_tstamp = ffi.Void Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _dart_snd_rawmidi_status_get_tstamp = void Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n  ffi.Pointer<timespec> ptr,\n);\n\ntypedef _c_snd_rawmidi_status_get_avail = ffi.Uint64 Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _dart_snd_rawmidi_status_get_avail = int Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _c_snd_rawmidi_status_get_xruns = ffi.Uint64 Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _dart_snd_rawmidi_status_get_xruns = int Function(\n  ffi.Pointer<snd_rawmidi_status_> obj,\n);\n\ntypedef _c_snd_rawmidi_status = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_status_> status,\n);\n\ntypedef _dart_snd_rawmidi_status = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<snd_rawmidi_status_> status,\n);\n\ntypedef _c_snd_rawmidi_drain = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_drain = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_drop = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_drop = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_write = ffi.Int64 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_rawmidi_write = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_rawmidi_read = ffi.Int64 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_rawmidi_read = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_rawmidi_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_type = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _dart_snd_rawmidi_type = int Function(\n  ffi.Pointer<snd_rawmidi_> rmidi,\n);\n\ntypedef _c_snd_rawmidi_stream = ffi.Int32 Function(\n  ffi.Pointer<snd_rawmidi_> rawmidi,\n);\n\ntypedef _dart_snd_rawmidi_stream = int Function(\n  ffi.Pointer<snd_rawmidi_> rawmidi,\n);\n\ntypedef _c_snd_timer_query_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_timer_query_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_timer_query_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_timer_query_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_query_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_timer_query_close = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_query_> handle,\n);\n\ntypedef _dart_snd_timer_query_close = int Function(\n  ffi.Pointer<snd_timer_query_> handle,\n);\n\ntypedef _c_snd_timer_query_next_device = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_id_> tid,\n);\n\ntypedef _dart_snd_timer_query_next_device = int Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_id_> tid,\n);\n\ntypedef _c_snd_timer_query_info = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_ginfo_> info,\n);\n\ntypedef _dart_snd_timer_query_info = int Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_ginfo_> info,\n);\n\ntypedef _c_snd_timer_query_params = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_gparams_> params,\n);\n\ntypedef _dart_snd_timer_query_params = int Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_gparams_> params,\n);\n\ntypedef _c_snd_timer_query_status = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_gstatus_> status,\n);\n\ntypedef _dart_snd_timer_query_status = int Function(\n  ffi.Pointer<snd_timer_query_> handle,\n  ffi.Pointer<snd_timer_gstatus_> status,\n);\n\ntypedef _c_snd_timer_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_timer_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_timer_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_timer_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_timer_close = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _dart_snd_timer_close = int Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _c_snd_async_add_timer_handler = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_timer_> timer,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_async_add_timer_handler = int Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_timer_> timer,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _c_snd_async_handler_get_timer = ffi.Pointer<snd_timer_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_timer = ffi.Pointer<snd_timer_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_timer_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _dart_snd_timer_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _c_snd_timer_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_timer_poll_descriptors = int Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_timer_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> timer,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_timer_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_timer_> timer,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_timer_info = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_info_> timer,\n);\n\ntypedef _dart_snd_timer_info = int Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_info_> timer,\n);\n\ntypedef _c_snd_timer_params = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params = int Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_status = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status = int Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_start = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _dart_snd_timer_start = int Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _c_snd_timer_stop = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _dart_snd_timer_stop = int Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _c_snd_timer_continue = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _dart_snd_timer_continue = int Function(\n  ffi.Pointer<snd_timer_> handle,\n);\n\ntypedef _c_snd_timer_read = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_timer_read = int Function(\n  ffi.Pointer<snd_timer_> handle,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_timer_id_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_timer_id_sizeof = int Function();\n\ntypedef _c_snd_timer_id_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_id_>> ptr,\n);\n\ntypedef _dart_snd_timer_id_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_id_>> ptr,\n);\n\ntypedef _c_snd_timer_id_free = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> obj,\n);\n\ntypedef _dart_snd_timer_id_free = void Function(\n  ffi.Pointer<snd_timer_id_> obj,\n);\n\ntypedef _c_snd_timer_id_copy = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> dst,\n  ffi.Pointer<snd_timer_id_> src,\n);\n\ntypedef _dart_snd_timer_id_copy = void Function(\n  ffi.Pointer<snd_timer_id_> dst,\n  ffi.Pointer<snd_timer_id_> src,\n);\n\ntypedef _c_snd_timer_id_set_class = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  ffi.Int32 dev_class,\n);\n\ntypedef _dart_snd_timer_id_set_class = void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  int dev_class,\n);\n\ntypedef _c_snd_timer_id_get_class = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_timer_id_get_class = int Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_timer_id_set_sclass = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  ffi.Int32 dev_sclass,\n);\n\ntypedef _dart_snd_timer_id_set_sclass = void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  int dev_sclass,\n);\n\ntypedef _c_snd_timer_id_get_sclass = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_timer_id_get_sclass = int Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_timer_id_set_card = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  ffi.Int32 card,\n);\n\ntypedef _dart_snd_timer_id_set_card = void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  int card,\n);\n\ntypedef _c_snd_timer_id_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_timer_id_get_card = int Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_timer_id_set_device = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  ffi.Int32 device,\n);\n\ntypedef _dart_snd_timer_id_set_device = void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  int device,\n);\n\ntypedef _c_snd_timer_id_get_device = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_timer_id_get_device = int Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_timer_id_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  ffi.Int32 subdevice,\n);\n\ntypedef _dart_snd_timer_id_set_subdevice = void Function(\n  ffi.Pointer<snd_timer_id_> id,\n  int subdevice,\n);\n\ntypedef _c_snd_timer_id_get_subdevice = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_timer_id_get_subdevice = int Function(\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_timer_ginfo_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_timer_ginfo_sizeof = int Function();\n\ntypedef _c_snd_timer_ginfo_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_ginfo_>> ptr,\n);\n\ntypedef _dart_snd_timer_ginfo_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_ginfo_>> ptr,\n);\n\ntypedef _c_snd_timer_ginfo_free = ffi.Void Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_free = void Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_copy = ffi.Void Function(\n  ffi.Pointer<snd_timer_ginfo_> dst,\n  ffi.Pointer<snd_timer_ginfo_> src,\n);\n\ntypedef _dart_snd_timer_ginfo_copy = void Function(\n  ffi.Pointer<snd_timer_ginfo_> dst,\n  ffi.Pointer<snd_timer_ginfo_> src,\n);\n\ntypedef _c_snd_timer_ginfo_set_tid = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n  ffi.Pointer<snd_timer_id_> tid,\n);\n\ntypedef _dart_snd_timer_ginfo_set_tid = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n  ffi.Pointer<snd_timer_id_> tid,\n);\n\ntypedef _c_snd_timer_ginfo_get_tid = ffi.Pointer<snd_timer_id_> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_tid = ffi.Pointer<snd_timer_id_> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_flags = ffi.Uint32 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_flags = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_card = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_resolution = ffi.Uint64 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_resolution = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_resolution_min = ffi.Uint64 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_resolution_min = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_resolution_max = ffi.Uint64 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_resolution_max = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_ginfo_get_clients = ffi.Uint32 Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _dart_snd_timer_ginfo_get_clients = int Function(\n  ffi.Pointer<snd_timer_ginfo_> obj,\n);\n\ntypedef _c_snd_timer_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_timer_info_sizeof = int Function();\n\ntypedef _c_snd_timer_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_info_>> ptr,\n);\n\ntypedef _dart_snd_timer_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_info_>> ptr,\n);\n\ntypedef _c_snd_timer_info_free = ffi.Void Function(\n  ffi.Pointer<snd_timer_info_> obj,\n);\n\ntypedef _dart_snd_timer_info_free = void Function(\n  ffi.Pointer<snd_timer_info_> obj,\n);\n\ntypedef _c_snd_timer_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_timer_info_> dst,\n  ffi.Pointer<snd_timer_info_> src,\n);\n\ntypedef _dart_snd_timer_info_copy = void Function(\n  ffi.Pointer<snd_timer_info_> dst,\n  ffi.Pointer<snd_timer_info_> src,\n);\n\ntypedef _c_snd_timer_info_is_slave = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_is_slave = int Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_timer_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_get_card = int Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_timer_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_timer_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_timer_info_get_resolution = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_get_resolution = int Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_timer_params_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_timer_params_sizeof = int Function();\n\ntypedef _c_snd_timer_params_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_params_>> ptr,\n);\n\ntypedef _dart_snd_timer_params_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_params_>> ptr,\n);\n\ntypedef _c_snd_timer_params_free = ffi.Void Function(\n  ffi.Pointer<snd_timer_params_> obj,\n);\n\ntypedef _dart_snd_timer_params_free = void Function(\n  ffi.Pointer<snd_timer_params_> obj,\n);\n\ntypedef _c_snd_timer_params_copy = ffi.Void Function(\n  ffi.Pointer<snd_timer_params_> dst,\n  ffi.Pointer<snd_timer_params_> src,\n);\n\ntypedef _dart_snd_timer_params_copy = void Function(\n  ffi.Pointer<snd_timer_params_> dst,\n  ffi.Pointer<snd_timer_params_> src,\n);\n\ntypedef _c_snd_timer_params_set_auto_start = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Int32 auto_start,\n);\n\ntypedef _dart_snd_timer_params_set_auto_start = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int auto_start,\n);\n\ntypedef _c_snd_timer_params_get_auto_start = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_auto_start = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_params_set_exclusive = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Int32 exclusive,\n);\n\ntypedef _dart_snd_timer_params_set_exclusive = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int exclusive,\n);\n\ntypedef _c_snd_timer_params_get_exclusive = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_exclusive = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_params_set_early_event = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Int32 early_event,\n);\n\ntypedef _dart_snd_timer_params_set_early_event = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int early_event,\n);\n\ntypedef _c_snd_timer_params_get_early_event = ffi.Int32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_early_event = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_params_set_ticks = ffi.Void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Int64 ticks,\n);\n\ntypedef _dart_snd_timer_params_set_ticks = void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int ticks,\n);\n\ntypedef _c_snd_timer_params_get_ticks = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_ticks = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_params_set_queue_size = ffi.Void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Int64 queue_size,\n);\n\ntypedef _dart_snd_timer_params_set_queue_size = void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int queue_size,\n);\n\ntypedef _c_snd_timer_params_get_queue_size = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_queue_size = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_params_set_filter = ffi.Void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  ffi.Uint32 filter,\n);\n\ntypedef _dart_snd_timer_params_set_filter = void Function(\n  ffi.Pointer<snd_timer_params_> params,\n  int filter,\n);\n\ntypedef _c_snd_timer_params_get_filter = ffi.Uint32 Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _dart_snd_timer_params_get_filter = int Function(\n  ffi.Pointer<snd_timer_params_> params,\n);\n\ntypedef _c_snd_timer_status_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_timer_status_sizeof = int Function();\n\ntypedef _c_snd_timer_status_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_status_>> ptr,\n);\n\ntypedef _dart_snd_timer_status_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_timer_status_>> ptr,\n);\n\ntypedef _c_snd_timer_status_free = ffi.Void Function(\n  ffi.Pointer<snd_timer_status_> obj,\n);\n\ntypedef _dart_snd_timer_status_free = void Function(\n  ffi.Pointer<snd_timer_status_> obj,\n);\n\ntypedef _c_snd_timer_status_copy = ffi.Void Function(\n  ffi.Pointer<snd_timer_status_> dst,\n  ffi.Pointer<snd_timer_status_> src,\n);\n\ntypedef _dart_snd_timer_status_copy = void Function(\n  ffi.Pointer<snd_timer_status_> dst,\n  ffi.Pointer<snd_timer_status_> src,\n);\n\ntypedef _c_snd_timer_status_get_timestamp = timespec Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status_get_timestamp = timespec Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_status_get_resolution = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status_get_resolution = int Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_status_get_lost = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status_get_lost = int Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_status_get_overrun = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status_get_overrun = int Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_status_get_queue = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _dart_snd_timer_status_get_queue = int Function(\n  ffi.Pointer<snd_timer_status_> status,\n);\n\ntypedef _c_snd_timer_info_get_ticks = ffi.Int64 Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _dart_snd_timer_info_get_ticks = int Function(\n  ffi.Pointer<snd_timer_info_> info,\n);\n\ntypedef _c_snd_hwdep_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_>> hwdep,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_hwdep_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_>> hwdep,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_hwdep_close = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n);\n\ntypedef _dart_snd_hwdep_close = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n);\n\ntypedef _c_snd_hwdep_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_hwdep_poll_descriptors = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_hwdep_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n);\n\ntypedef _dart_snd_hwdep_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n);\n\ntypedef _c_snd_hwdep_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_hwdep_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_hwdep_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_hwdep_nonblock = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  int nonblock,\n);\n\ntypedef _c_snd_hwdep_info = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_info_> info,\n);\n\ntypedef _dart_snd_hwdep_info = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_info_> info,\n);\n\ntypedef _c_snd_hwdep_dsp_status = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_dsp_status_> status,\n);\n\ntypedef _dart_snd_hwdep_dsp_status = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_dsp_status_> status,\n);\n\ntypedef _c_snd_hwdep_dsp_load = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_dsp_image_> block,\n);\n\ntypedef _dart_snd_hwdep_dsp_load = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<snd_hwdep_dsp_image_> block,\n);\n\ntypedef _c_snd_hwdep_ioctl = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Uint32 request,\n  ffi.Pointer<ffi.Void> arg,\n);\n\ntypedef _dart_snd_hwdep_ioctl = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  int request,\n  ffi.Pointer<ffi.Void> arg,\n);\n\ntypedef _c_snd_hwdep_write = ffi.Int64 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_hwdep_write = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_hwdep_read = ffi.Int64 Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<ffi.Void> buffer,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_hwdep_read = int Function(\n  ffi.Pointer<snd_hwdep_> hwdep,\n  ffi.Pointer<ffi.Void> buffer,\n  int size,\n);\n\ntypedef _c_snd_hwdep_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_hwdep_info_sizeof = int Function();\n\ntypedef _c_snd_hwdep_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_info_>> ptr,\n);\n\ntypedef _dart_snd_hwdep_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_info_>> ptr,\n);\n\ntypedef _c_snd_hwdep_info_free = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_free = void Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_info_> dst,\n  ffi.Pointer<snd_hwdep_info_> src,\n);\n\ntypedef _dart_snd_hwdep_info_copy = void Function(\n  ffi.Pointer<snd_hwdep_info_> dst,\n  ffi.Pointer<snd_hwdep_info_> src,\n);\n\ntypedef _c_snd_hwdep_info_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_get_device = int Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_get_card = int Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_get_iface = ffi.Int32 Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _dart_snd_hwdep_info_get_iface = int Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n);\n\ntypedef _c_snd_hwdep_info_set_device = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_hwdep_info_set_device = void Function(\n  ffi.Pointer<snd_hwdep_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_hwdep_dsp_status_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_hwdep_dsp_status_sizeof = int Function();\n\ntypedef _c_snd_hwdep_dsp_status_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_status_>> ptr,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_status_>> ptr,\n);\n\ntypedef _c_snd_hwdep_dsp_status_free = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_free = void Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_status_copy = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> dst,\n  ffi.Pointer<snd_hwdep_dsp_status_> src,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_copy = void Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> dst,\n  ffi.Pointer<snd_hwdep_dsp_status_> src,\n);\n\ntypedef _c_snd_hwdep_dsp_status_get_version = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_get_version = int Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_status_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_status_get_num_dsps = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_get_num_dsps = int Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_status_get_dsp_loaded = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_get_dsp_loaded = int Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_status_get_chip_ready = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_status_get_chip_ready = int Function(\n  ffi.Pointer<snd_hwdep_dsp_status_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_hwdep_dsp_image_sizeof = int Function();\n\ntypedef _c_snd_hwdep_dsp_image_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_image_>> ptr,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hwdep_dsp_image_>> ptr,\n);\n\ntypedef _c_snd_hwdep_dsp_image_free = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_free = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_copy = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> dst,\n  ffi.Pointer<snd_hwdep_dsp_image_> src,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_copy = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> dst,\n  ffi.Pointer<snd_hwdep_dsp_image_> src,\n);\n\ntypedef _c_snd_hwdep_dsp_image_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_get_index = int Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_get_image = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_get_image = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_get_length = ffi.Uint64 Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_get_length = int Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n);\n\ntypedef _c_snd_hwdep_dsp_image_set_index = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Uint32 _index,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_set_index = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  int _index,\n);\n\ntypedef _c_snd_hwdep_dsp_image_set_name = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_set_name = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_hwdep_dsp_image_set_image = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Pointer<ffi.Void> buffer,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_set_image = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Pointer<ffi.Void> buffer,\n);\n\ntypedef _c_snd_hwdep_dsp_image_set_length = ffi.Void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  ffi.Uint64 length,\n);\n\ntypedef _dart_snd_hwdep_dsp_image_set_length = void Function(\n  ffi.Pointer<snd_hwdep_dsp_image_> obj,\n  int length,\n);\n\ntypedef _c_snd_card_load = ffi.Int32 Function(\n  ffi.Int32 card,\n);\n\ntypedef _dart_snd_card_load = int Function(\n  int card,\n);\n\ntypedef _c_snd_card_next = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int32> card,\n);\n\ntypedef _dart_snd_card_next = int Function(\n  ffi.Pointer<ffi.Int32> card,\n);\n\ntypedef _c_snd_card_get_index = ffi.Int32 Function(\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_card_get_index = int Function(\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_card_get_name = ffi.Int32 Function(\n  ffi.Int32 card,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n);\n\ntypedef _dart_snd_card_get_name = int Function(\n  int card,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n);\n\ntypedef _c_snd_card_get_longname = ffi.Int32 Function(\n  ffi.Int32 card,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n);\n\ntypedef _dart_snd_card_get_longname = int Function(\n  int card,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> name,\n);\n\ntypedef _c_snd_device_name_hint = ffi.Int32 Function(\n  ffi.Int32 card,\n  ffi.Pointer<ffi.Int8> iface,\n  ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Void>>> hints,\n);\n\ntypedef _dart_snd_device_name_hint = int Function(\n  int card,\n  ffi.Pointer<ffi.Int8> iface,\n  ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Void>>> hints,\n);\n\ntypedef _c_snd_device_name_free_hint = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<ffi.Void>> hints,\n);\n\ntypedef _dart_snd_device_name_free_hint = int Function(\n  ffi.Pointer<ffi.Pointer<ffi.Void>> hints,\n);\n\ntypedef _c_snd_device_name_get_hint = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Void> hint,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _dart_snd_device_name_get_hint = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<ffi.Void> hint,\n  ffi.Pointer<ffi.Int8> id,\n);\n\ntypedef _c_snd_ctl_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_ctl_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_ctl_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_ctl_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_ctl_open_fallback = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> orig_name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_ctl_open_fallback = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_>> ctl,\n  ffi.Pointer<snd_config_> root,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Int8> orig_name,\n  int mode,\n);\n\ntypedef _c_snd_ctl_close = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _dart_snd_ctl_close = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _c_snd_ctl_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_ctl_nonblock = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int nonblock,\n);\n\ntypedef _c_snd_async_add_ctl_handler = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_async_add_ctl_handler = int Function(\n  ffi.Pointer<ffi.Pointer<snd_async_handler_>> handler,\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.NativeFunction<snd_async_callback_t>> callback,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _c_snd_async_handler_get_ctl = ffi.Pointer<snd_ctl_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _dart_snd_async_handler_get_ctl = ffi.Pointer<snd_ctl_> Function(\n  ffi.Pointer<snd_async_handler_> handler,\n);\n\ntypedef _c_snd_ctl_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _dart_snd_ctl_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _c_snd_ctl_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_ctl_poll_descriptors = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_ctl_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_ctl_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_ctl_subscribe_events = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Int32 subscribe,\n);\n\ntypedef _dart_snd_ctl_subscribe_events = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int subscribe,\n);\n\ntypedef _c_snd_ctl_card_info = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_card_info_> info,\n);\n\ntypedef _dart_snd_ctl_card_info = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_card_info_> info,\n);\n\ntypedef _c_snd_ctl_elem_list = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_list_> list,\n);\n\ntypedef _dart_snd_ctl_elem_list = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_list_> list,\n);\n\ntypedef _c_snd_ctl_elem_info = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n);\n\ntypedef _dart_snd_ctl_elem_info = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n);\n\ntypedef _c_snd_ctl_elem_read = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_value_> data,\n);\n\ntypedef _dart_snd_ctl_elem_read = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_value_> data,\n);\n\ntypedef _c_snd_ctl_elem_write = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_value_> data,\n);\n\ntypedef _dart_snd_ctl_elem_write = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_value_> data,\n);\n\ntypedef _c_snd_ctl_elem_lock = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_ctl_elem_lock = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _c_snd_ctl_elem_unlock = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_ctl_elem_unlock = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _c_snd_ctl_elem_tlv_read = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Uint32 tlv_size,\n);\n\ntypedef _dart_snd_ctl_elem_tlv_read = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n  int tlv_size,\n);\n\ntypedef _c_snd_ctl_elem_tlv_write = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _dart_snd_ctl_elem_tlv_write = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _c_snd_ctl_elem_tlv_command = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _dart_snd_ctl_elem_tlv_command = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _c_snd_ctl_hwdep_next_device = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _dart_snd_ctl_hwdep_next_device = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _c_snd_ctl_hwdep_info = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_hwdep_info_> info,\n);\n\ntypedef _dart_snd_ctl_hwdep_info = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_hwdep_info_> info,\n);\n\ntypedef _c_snd_ctl_pcm_next_device = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _dart_snd_ctl_pcm_next_device = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _c_snd_ctl_pcm_info = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_pcm_info_> info,\n);\n\ntypedef _dart_snd_ctl_pcm_info = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_pcm_info_> info,\n);\n\ntypedef _c_snd_ctl_pcm_prefer_subdevice = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Int32 subdev,\n);\n\ntypedef _dart_snd_ctl_pcm_prefer_subdevice = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int subdev,\n);\n\ntypedef _c_snd_ctl_rawmidi_next_device = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _dart_snd_ctl_rawmidi_next_device = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Int32> device,\n);\n\ntypedef _c_snd_ctl_rawmidi_info = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_rawmidi_info_> info,\n);\n\ntypedef _dart_snd_ctl_rawmidi_info = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_rawmidi_info_> info,\n);\n\ntypedef _c_snd_ctl_rawmidi_prefer_subdevice = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Int32 subdev,\n);\n\ntypedef _dart_snd_ctl_rawmidi_prefer_subdevice = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int subdev,\n);\n\ntypedef _c_snd_ctl_set_power_state = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Uint32 state,\n);\n\ntypedef _dart_snd_ctl_set_power_state = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int state,\n);\n\ntypedef _c_snd_ctl_get_power_state = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Uint32> state,\n);\n\ntypedef _dart_snd_ctl_get_power_state = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<ffi.Uint32> state,\n);\n\ntypedef _c_snd_ctl_read = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_event_> event,\n);\n\ntypedef _dart_snd_ctl_read = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_event_> event,\n);\n\ntypedef _c_snd_ctl_wait = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Int32 timeout,\n);\n\ntypedef _dart_snd_ctl_wait = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  int timeout,\n);\n\ntypedef _c_snd_ctl_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _dart_snd_ctl_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _c_snd_ctl_type = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _dart_snd_ctl_type = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _c_snd_ctl_elem_type_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_ctl_elem_type_name = ffi.Pointer<ffi.Int8> Function(\n  int type,\n);\n\ntypedef _c_snd_ctl_elem_iface_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 iface,\n);\n\ntypedef _dart_snd_ctl_elem_iface_name = ffi.Pointer<ffi.Int8> Function(\n  int iface,\n);\n\ntypedef _c_snd_ctl_event_type_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_ctl_event_type_name = ffi.Pointer<ffi.Int8> Function(\n  int type,\n);\n\ntypedef _c_snd_ctl_event_elem_get_mask = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_mask = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_numid = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_id = void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_event_elem_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_interface = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_device = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_subdevice = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_elem_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_elem_get_index = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_alloc_space = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 entries,\n);\n\ntypedef _dart_snd_ctl_elem_list_alloc_space = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int entries,\n);\n\ntypedef _c_snd_ctl_elem_list_free_space = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_list_free_space = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _c_snd_ctl_ascii_elem_id_get = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_ctl_ascii_elem_id_get = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _c_snd_ctl_ascii_elem_id_parse = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> dst,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_ctl_ascii_elem_id_parse = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> dst,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_ctl_ascii_value_parse = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> handle,\n  ffi.Pointer<snd_ctl_elem_value_> dst,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Pointer<ffi.Int8> value,\n);\n\ntypedef _dart_snd_ctl_ascii_value_parse = int Function(\n  ffi.Pointer<snd_ctl_> handle,\n  ffi.Pointer<snd_ctl_elem_value_> dst,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Pointer<ffi.Int8> value,\n);\n\ntypedef _c_snd_ctl_elem_id_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_elem_id_sizeof = int Function();\n\ntypedef _c_snd_ctl_elem_id_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_id_>> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_id_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_id_>> ptr,\n);\n\ntypedef _c_snd_ctl_elem_id_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_free = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_clear = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> dst,\n  ffi.Pointer<snd_ctl_elem_id_> src,\n);\n\ntypedef _dart_snd_ctl_elem_id_copy = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> dst,\n  ffi.Pointer<snd_ctl_elem_id_> src,\n);\n\ntypedef _c_snd_ctl_elem_id_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_numid = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_interface = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_device = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_subdevice = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_id_get_index = int Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n);\n\ntypedef _c_snd_ctl_elem_id_set_numid = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_numid = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_id_set_interface = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_interface = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_id_set_device = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_device = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_id_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_subdevice = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_id_set_name = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_name = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _c_snd_ctl_elem_id_set_index = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_id_set_index = void Function(\n  ffi.Pointer<snd_ctl_elem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_card_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_card_info_sizeof = int Function();\n\ntypedef _c_snd_ctl_card_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_card_info_>> ptr,\n);\n\ntypedef _dart_snd_ctl_card_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_card_info_>> ptr,\n);\n\ntypedef _c_snd_ctl_card_info_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_free = void Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_clear = void Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_card_info_> dst,\n  ffi.Pointer<snd_ctl_card_info_> src,\n);\n\ntypedef _dart_snd_ctl_card_info_copy = void Function(\n  ffi.Pointer<snd_ctl_card_info_> dst,\n  ffi.Pointer<snd_ctl_card_info_> src,\n);\n\ntypedef _c_snd_ctl_card_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_card = int Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_id = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_driver = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_driver = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_longname = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_longname = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_mixername = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_mixername = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_card_info_get_components = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _dart_snd_ctl_card_info_get_components = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_card_info_> obj,\n);\n\ntypedef _c_snd_ctl_event_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_event_sizeof = int Function();\n\ntypedef _c_snd_ctl_event_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_event_>> ptr,\n);\n\ntypedef _dart_snd_ctl_event_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_event_>> ptr,\n);\n\ntypedef _c_snd_ctl_event_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_free = void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_clear = void Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_event_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_event_> dst,\n  ffi.Pointer<snd_ctl_event_> src,\n);\n\ntypedef _dart_snd_ctl_event_copy = void Function(\n  ffi.Pointer<snd_ctl_event_> dst,\n  ffi.Pointer<snd_ctl_event_> src,\n);\n\ntypedef _c_snd_ctl_event_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _dart_snd_ctl_event_get_type = int Function(\n  ffi.Pointer<snd_ctl_event_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_elem_list_sizeof = int Function();\n\ntypedef _c_snd_ctl_elem_list_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_list_>> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_list_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_list_>> ptr,\n);\n\ntypedef _c_snd_ctl_elem_list_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_list_free = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_list_clear = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> dst,\n  ffi.Pointer<snd_ctl_elem_list_> src,\n);\n\ntypedef _dart_snd_ctl_elem_list_copy = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> dst,\n  ffi.Pointer<snd_ctl_elem_list_> src,\n);\n\ntypedef _c_snd_ctl_elem_list_set_offset = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_list_set_offset = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_list_get_used = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_used = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_get_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_count = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n);\n\ntypedef _c_snd_ctl_elem_list_get_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_id = void Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_elem_list_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_numid = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_list_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_interface = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_list_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_device = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_list_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_subdevice = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_list_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_list_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_list_get_index = int Function(\n  ffi.Pointer<snd_ctl_elem_list_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_elem_info_sizeof = int Function();\n\ntypedef _c_snd_ctl_elem_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_info_>> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_info_>> ptr,\n);\n\ntypedef _c_snd_ctl_elem_info_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_free = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_clear = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> dst,\n  ffi.Pointer<snd_ctl_elem_info_> src,\n);\n\ntypedef _dart_snd_ctl_elem_info_copy = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> dst,\n  ffi.Pointer<snd_ctl_elem_info_> src,\n);\n\ntypedef _c_snd_ctl_elem_info_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_type = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_readable = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_readable = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_writable = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_writable = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_volatile = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_volatile = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_inactive = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_inactive = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_locked = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_locked = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_tlv_readable = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_tlv_readable = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_tlv_writable = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_tlv_writable = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_tlv_commandable = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_tlv_commandable = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_owner = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_owner = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_is_user = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_is_user = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_owner = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_owner = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_count = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_min = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_min = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_max = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_max = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_step = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_step = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_min64 = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_min64 = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_max64 = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_max64 = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_step64 = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_step64 = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_items = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_items = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_set_item = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_item = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_info_get_item_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_item_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_dimensions = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_dimensions = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_dimension = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_dimension = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_info_set_dimension = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Pointer<ffi.Int32> dimension,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_dimension = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Pointer<ffi.Int32> dimension,\n);\n\ntypedef _c_snd_ctl_elem_info_get_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_id = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_elem_info_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_numid = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_interface = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_device = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_subdevice = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_info_get_index = int Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n);\n\ntypedef _c_snd_ctl_elem_info_set_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_id = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_elem_info_set_numid = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_numid = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_info_set_interface = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_interface = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_info_set_device = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_device = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_info_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_subdevice = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_info_set_name = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_name = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _c_snd_ctl_elem_info_set_index = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_info_set_index = void Function(\n  ffi.Pointer<snd_ctl_elem_info_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_add_integer_elem_set = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Uint32 element_count,\n  ffi.Uint32 member_count,\n  ffi.Int64 min,\n  ffi.Int64 max,\n  ffi.Int64 step,\n);\n\ntypedef _dart_snd_ctl_add_integer_elem_set = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  int element_count,\n  int member_count,\n  int min,\n  int max,\n  int step,\n);\n\ntypedef _c_snd_ctl_add_integer64_elem_set = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Uint32 element_count,\n  ffi.Uint32 member_count,\n  ffi.Int64 min,\n  ffi.Int64 max,\n  ffi.Int64 step,\n);\n\ntypedef _dart_snd_ctl_add_integer64_elem_set = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  int element_count,\n  int member_count,\n  int min,\n  int max,\n  int step,\n);\n\ntypedef _c_snd_ctl_add_boolean_elem_set = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Uint32 element_count,\n  ffi.Uint32 member_count,\n);\n\ntypedef _dart_snd_ctl_add_boolean_elem_set = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  int element_count,\n  int member_count,\n);\n\ntypedef _c_snd_ctl_add_enumerated_elem_set = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Uint32 element_count,\n  ffi.Uint32 member_count,\n  ffi.Uint32 items,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> labels,\n);\n\ntypedef _dart_snd_ctl_add_enumerated_elem_set = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  int element_count,\n  int member_count,\n  int items,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> labels,\n);\n\ntypedef _c_snd_ctl_add_bytes_elem_set = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  ffi.Uint32 element_count,\n  ffi.Uint32 member_count,\n);\n\ntypedef _dart_snd_ctl_add_bytes_elem_set = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n  int element_count,\n  int member_count,\n);\n\ntypedef _c_snd_ctl_elem_add_integer = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Uint32 count,\n  ffi.Int64 imin,\n  ffi.Int64 imax,\n  ffi.Int64 istep,\n);\n\ntypedef _dart_snd_ctl_elem_add_integer = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int count,\n  int imin,\n  int imax,\n  int istep,\n);\n\ntypedef _c_snd_ctl_elem_add_integer64 = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Uint32 count,\n  ffi.Int64 imin,\n  ffi.Int64 imax,\n  ffi.Int64 istep,\n);\n\ntypedef _dart_snd_ctl_elem_add_integer64 = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int count,\n  int imin,\n  int imax,\n  int istep,\n);\n\ntypedef _c_snd_ctl_elem_add_boolean = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Uint32 count,\n);\n\ntypedef _dart_snd_ctl_elem_add_boolean = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int count,\n);\n\ntypedef _c_snd_ctl_elem_add_enumerated = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Uint32 count,\n  ffi.Uint32 items,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> names,\n);\n\ntypedef _dart_snd_ctl_elem_add_enumerated = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int count,\n  int items,\n  ffi.Pointer<ffi.Pointer<ffi.Int8>> names,\n);\n\ntypedef _c_snd_ctl_elem_add_iec958 = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_ctl_elem_add_iec958 = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _c_snd_ctl_elem_remove = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_ctl_elem_remove = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _c_snd_ctl_elem_value_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_ctl_elem_value_sizeof = int Function();\n\ntypedef _c_snd_ctl_elem_value_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_value_>> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_value_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_ctl_elem_value_>> ptr,\n);\n\ntypedef _c_snd_ctl_elem_value_free = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_free = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_clear = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_clear = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_copy = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> dst,\n  ffi.Pointer<snd_ctl_elem_value_> src,\n);\n\ntypedef _dart_snd_ctl_elem_value_copy = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> dst,\n  ffi.Pointer<snd_ctl_elem_value_> src,\n);\n\ntypedef _c_snd_ctl_elem_value_compare = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> left,\n  ffi.Pointer<snd_ctl_elem_value_> right,\n);\n\ntypedef _dart_snd_ctl_elem_value_compare = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> left,\n  ffi.Pointer<snd_ctl_elem_value_> right,\n);\n\ntypedef _c_snd_ctl_elem_value_get_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_id = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_elem_value_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_numid = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_interface = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_device = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_subdevice = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_index = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_set_id = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_id = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_ctl_elem_value_set_numid = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_numid = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_interface = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_interface = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_device = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_device = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_subdevice = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_subdevice = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_name = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_name = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_index = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_index = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_get_boolean = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_boolean = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_value_get_integer = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_integer = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_value_get_integer64 = ffi.Int64 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_integer64 = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_value_get_enumerated = ffi.Uint32 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_enumerated = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_value_get_byte = ffi.Uint8 Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_byte = int Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n);\n\ntypedef _c_snd_ctl_elem_value_set_boolean = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n  ffi.Int64 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_boolean = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_integer = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n  ffi.Int64 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_integer = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_integer64 = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n  ffi.Int64 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_integer64 = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_enumerated = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_enumerated = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_value_set_byte = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Uint32 idx,\n  ffi.Uint8 val,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_byte = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  int idx,\n  int val,\n);\n\ntypedef _c_snd_ctl_elem_set_bytes = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<ffi.Void> data,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_ctl_elem_set_bytes = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<ffi.Void> data,\n  int size,\n);\n\ntypedef _c_snd_ctl_elem_value_get_bytes = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_bytes = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n);\n\ntypedef _c_snd_ctl_elem_value_get_iec958 = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_aes_iec958_t> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_value_get_iec958 = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_aes_iec958_t> ptr,\n);\n\ntypedef _c_snd_ctl_elem_value_set_iec958 = ffi.Void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_aes_iec958_t> ptr,\n);\n\ntypedef _dart_snd_ctl_elem_value_set_iec958 = void Function(\n  ffi.Pointer<snd_ctl_elem_value_> obj,\n  ffi.Pointer<snd_aes_iec958_t> ptr,\n);\n\ntypedef _c_snd_tlv_parse_dB_info = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Uint32 tlv_size,\n  ffi.Pointer<ffi.Pointer<ffi.Uint32>> db_tlvp,\n);\n\ntypedef _dart_snd_tlv_parse_dB_info = int Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  int tlv_size,\n  ffi.Pointer<ffi.Pointer<ffi.Uint32>> db_tlvp,\n);\n\ntypedef _c_snd_tlv_get_dB_range = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Int64 rangemin,\n  ffi.Int64 rangemax,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_tlv_get_dB_range = int Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  int rangemin,\n  int rangemax,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_tlv_convert_to_dB = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Int64 rangemin,\n  ffi.Int64 rangemax,\n  ffi.Int64 volume,\n  ffi.Pointer<ffi.Int64> db_gain,\n);\n\ntypedef _dart_snd_tlv_convert_to_dB = int Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  int rangemin,\n  int rangemax,\n  int volume,\n  ffi.Pointer<ffi.Int64> db_gain,\n);\n\ntypedef _c_snd_tlv_convert_from_dB = ffi.Int32 Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Int64 rangemin,\n  ffi.Int64 rangemax,\n  ffi.Int64 db_gain,\n  ffi.Pointer<ffi.Int64> value,\n  ffi.Int32 xdir,\n);\n\ntypedef _dart_snd_tlv_convert_from_dB = int Function(\n  ffi.Pointer<ffi.Uint32> tlv,\n  int rangemin,\n  int rangemax,\n  int db_gain,\n  ffi.Pointer<ffi.Int64> value,\n  int xdir,\n);\n\ntypedef _c_snd_ctl_get_dB_range = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_ctl_get_dB_range = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_ctl_convert_to_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Int64 volume,\n  ffi.Pointer<ffi.Int64> db_gain,\n);\n\ntypedef _dart_snd_ctl_convert_to_dB = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int volume,\n  ffi.Pointer<ffi.Int64> db_gain,\n);\n\ntypedef _c_snd_ctl_convert_from_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  ffi.Int64 db_gain,\n  ffi.Pointer<ffi.Int64> value,\n  ffi.Int32 xdir,\n);\n\ntypedef _dart_snd_ctl_convert_from_dB = int Function(\n  ffi.Pointer<snd_ctl_> ctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n  int db_gain,\n  ffi.Pointer<ffi.Int64> value,\n  int xdir,\n);\n\ntypedef _c_snd_hctl_compare_fast = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> c1,\n  ffi.Pointer<snd_hctl_elem_> c2,\n);\n\ntypedef _dart_snd_hctl_compare_fast = int Function(\n  ffi.Pointer<snd_hctl_elem_> c1,\n  ffi.Pointer<snd_hctl_elem_> c2,\n);\n\ntypedef _c_snd_hctl_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_hctl_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n  ffi.Pointer<ffi.Int8> name,\n  int mode,\n);\n\ntypedef _c_snd_hctl_open_ctl = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctlp,\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _dart_snd_hctl_open_ctl = int Function(\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctlp,\n  ffi.Pointer<snd_ctl_> ctl,\n);\n\ntypedef _c_snd_hctl_close = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_close = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_hctl_nonblock = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  int nonblock,\n);\n\ntypedef _c_snd_hctl_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_hctl_poll_descriptors = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_hctl_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_hctl_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_hctl_> ctl,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_hctl_get_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_get_count = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef snd_hctl_compare_t = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_>,\n  ffi.Pointer<snd_hctl_elem_>,\n);\n\ntypedef _c_snd_hctl_set_compare = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_compare_t>> hsort,\n);\n\ntypedef _dart_snd_hctl_set_compare = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_compare_t>> hsort,\n);\n\ntypedef _c_snd_hctl_first_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_first_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_last_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_last_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_find_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef _dart_snd_hctl_find_elem = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<snd_ctl_elem_id_> id,\n);\n\ntypedef snd_hctl_callback_t = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_>,\n  ffi.Uint32,\n  ffi.Pointer<snd_hctl_elem_>,\n);\n\ntypedef _c_snd_hctl_set_callback = ffi.Void Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_callback_t>> callback,\n);\n\ntypedef _dart_snd_hctl_set_callback = void Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_callback_t>> callback,\n);\n\ntypedef _c_snd_hctl_set_callback_private = ffi.Void Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.Void> data,\n);\n\ntypedef _dart_snd_hctl_set_callback_private = void Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Pointer<ffi.Void> data,\n);\n\ntypedef _c_snd_hctl_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_load = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_load = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_free = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_free = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_handle_events = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_handle_events = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_wait = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  ffi.Int32 timeout,\n);\n\ntypedef _dart_snd_hctl_wait = int Function(\n  ffi.Pointer<snd_hctl_> hctl,\n  int timeout,\n);\n\ntypedef _c_snd_hctl_ctl = ffi.Pointer<snd_ctl_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_hctl_ctl = ffi.Pointer<snd_ctl_> Function(\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_hctl_elem_next = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _dart_snd_hctl_elem_next = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _c_snd_hctl_elem_prev = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _dart_snd_hctl_elem_prev = ffi.Pointer<snd_hctl_elem_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _c_snd_hctl_elem_info = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n);\n\ntypedef _dart_snd_hctl_elem_info = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_info_> info,\n);\n\ntypedef _c_snd_hctl_elem_read = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_value_> value,\n);\n\ntypedef _dart_snd_hctl_elem_read = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_value_> value,\n);\n\ntypedef _c_snd_hctl_elem_write = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_value_> value,\n);\n\ntypedef _dart_snd_hctl_elem_write = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<snd_ctl_elem_value_> value,\n);\n\ntypedef _c_snd_hctl_elem_tlv_read = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n  ffi.Uint32 tlv_size,\n);\n\ntypedef _dart_snd_hctl_elem_tlv_read = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n  int tlv_size,\n);\n\ntypedef _c_snd_hctl_elem_tlv_write = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _dart_snd_hctl_elem_tlv_write = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _c_snd_hctl_elem_tlv_command = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _dart_snd_hctl_elem_tlv_command = int Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n  ffi.Pointer<ffi.Uint32> tlv,\n);\n\ntypedef _c_snd_hctl_elem_get_hctl = ffi.Pointer<snd_hctl_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _dart_snd_hctl_elem_get_hctl = ffi.Pointer<snd_hctl_> Function(\n  ffi.Pointer<snd_hctl_elem_> elem,\n);\n\ntypedef _c_snd_hctl_elem_get_id = ffi.Void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _dart_snd_hctl_elem_get_id = void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<snd_ctl_elem_id_> ptr,\n);\n\ntypedef _c_snd_hctl_elem_get_numid = ffi.Uint32 Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_numid = int Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_get_interface = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_interface = int Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_get_device = ffi.Uint32 Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_device = int Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_get_subdevice = ffi.Uint32 Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_subdevice = int Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_index = int Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef snd_hctl_elem_callback_t = ffi.Int32 Function(\n  ffi.Pointer<snd_hctl_elem_>,\n  ffi.Uint32,\n);\n\ntypedef _c_snd_hctl_elem_set_callback = ffi.Void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_elem_callback_t>> val,\n);\n\ntypedef _dart_snd_hctl_elem_set_callback = void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_hctl_elem_callback_t>> val,\n);\n\ntypedef _c_snd_hctl_elem_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _dart_snd_hctl_elem_get_callback_private = ffi.Pointer<ffi.Void>\n    Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n);\n\ntypedef _c_snd_hctl_elem_set_callback_private = ffi.Void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _dart_snd_hctl_elem_set_callback_private = void Function(\n  ffi.Pointer<snd_hctl_elem_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _c_snd_sctl_build = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_sctl_>> ctl,\n  ffi.Pointer<snd_ctl_> handle,\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> private_data,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_sctl_build = int Function(\n  ffi.Pointer<ffi.Pointer<snd_sctl_>> ctl,\n  ffi.Pointer<snd_ctl_> handle,\n  ffi.Pointer<snd_config_> config,\n  ffi.Pointer<snd_config_> private_data,\n  int mode,\n);\n\ntypedef _c_snd_sctl_free = ffi.Int32 Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _dart_snd_sctl_free = int Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _c_snd_sctl_install = ffi.Int32 Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _dart_snd_sctl_install = int Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _c_snd_sctl_remove = ffi.Int32 Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _dart_snd_sctl_remove = int Function(\n  ffi.Pointer<snd_sctl_> handle,\n);\n\ntypedef _c_snd_mixer_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_>> mixer,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_mixer_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_>> mixer,\n  int mode,\n);\n\ntypedef _c_snd_mixer_close = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_close = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_first_elem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_first_elem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_last_elem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_last_elem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_handle_events = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_handle_events = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_attach = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_mixer_attach = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_mixer_attach_hctl = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_mixer_attach_hctl = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_mixer_detach = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_mixer_detach = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_mixer_detach_hctl = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _dart_snd_mixer_detach_hctl = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_hctl_> hctl,\n);\n\ntypedef _c_snd_mixer_get_hctl = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n);\n\ntypedef _dart_snd_mixer_get_hctl = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Pointer<ffi.Pointer<snd_hctl_>> hctl,\n);\n\ntypedef _c_snd_mixer_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n);\n\ntypedef _dart_snd_mixer_poll_descriptors = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n);\n\ntypedef _c_snd_mixer_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_mixer_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_mixer_load = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_load = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_free = ffi.Void Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_free = void Function(\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _c_snd_mixer_wait = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Int32 timeout,\n);\n\ntypedef _dart_snd_mixer_wait = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  int timeout,\n);\n\ntypedef snd_mixer_compare_t = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_>,\n  ffi.Pointer<snd_mixer_elem_>,\n);\n\ntypedef _c_snd_mixer_set_compare = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> msort,\n);\n\ntypedef _dart_snd_mixer_set_compare = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> msort,\n);\n\ntypedef snd_mixer_callback_t = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_>,\n  ffi.Uint32,\n  ffi.Pointer<snd_mixer_elem_>,\n);\n\ntypedef _c_snd_mixer_set_callback = ffi.Void Function(\n  ffi.Pointer<snd_mixer_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_callback_t>> val,\n);\n\ntypedef _dart_snd_mixer_set_callback = void Function(\n  ffi.Pointer<snd_mixer_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_callback_t>> val,\n);\n\ntypedef _c_snd_mixer_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_> obj,\n);\n\ntypedef _dart_snd_mixer_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_> obj,\n);\n\ntypedef _c_snd_mixer_set_callback_private = ffi.Void Function(\n  ffi.Pointer<snd_mixer_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _dart_snd_mixer_set_callback_private = void Function(\n  ffi.Pointer<snd_mixer_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _c_snd_mixer_get_count = ffi.Uint32 Function(\n  ffi.Pointer<snd_mixer_> obj,\n);\n\ntypedef _dart_snd_mixer_get_count = int Function(\n  ffi.Pointer<snd_mixer_> obj,\n);\n\ntypedef _c_snd_mixer_class_unregister = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> clss,\n);\n\ntypedef _dart_snd_mixer_class_unregister = int Function(\n  ffi.Pointer<snd_mixer_class_> clss,\n);\n\ntypedef _c_snd_mixer_elem_next = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_next = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_elem_prev = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_prev = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef snd_mixer_elem_callback_t = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_>,\n  ffi.Uint32,\n);\n\ntypedef _c_snd_mixer_elem_set_callback = ffi.Void Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_elem_callback_t>> val,\n);\n\ntypedef _dart_snd_mixer_elem_set_callback = void Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_elem_callback_t>> val,\n);\n\ntypedef _c_snd_mixer_elem_get_callback_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n);\n\ntypedef _dart_snd_mixer_elem_get_callback_private = ffi.Pointer<ffi.Void>\n    Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n);\n\ntypedef _c_snd_mixer_elem_set_callback_private = ffi.Void Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _dart_snd_mixer_elem_set_callback_private = void Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Pointer<ffi.Void> val,\n);\n\ntypedef _c_snd_mixer_elem_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n);\n\ntypedef _dart_snd_mixer_elem_get_type = int Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n);\n\ntypedef _c_snd_mixer_class_register = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _dart_snd_mixer_class_register = int Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<snd_mixer_> mixer,\n);\n\ntypedef _typedefC_11 = ffi.Void Function(\n  ffi.Pointer<snd_mixer_elem_>,\n);\n\ntypedef _c_snd_mixer_elem_new = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_elem_>> elem,\n  ffi.Int32 type,\n  ffi.Int32 compare_weight,\n  ffi.Pointer<ffi.Void> private_data,\n  ffi.Pointer<ffi.NativeFunction<_typedefC_11>> private_free,\n);\n\ntypedef _dart_snd_mixer_elem_new = int Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_elem_>> elem,\n  int type,\n  int compare_weight,\n  ffi.Pointer<ffi.Void> private_data,\n  ffi.Pointer<ffi.NativeFunction<_typedefC_11>> private_free,\n);\n\ntypedef _c_snd_mixer_elem_add = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _dart_snd_mixer_elem_add = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _c_snd_mixer_elem_remove = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_remove = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_elem_free = ffi.Void Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_free = void Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_elem_info = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_info = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_elem_value = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_elem_value = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_elem_attach = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n  ffi.Pointer<snd_hctl_elem_> helem,\n);\n\ntypedef _dart_snd_mixer_elem_attach = int Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n  ffi.Pointer<snd_hctl_elem_> helem,\n);\n\ntypedef _c_snd_mixer_elem_detach = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n  ffi.Pointer<snd_hctl_elem_> helem,\n);\n\ntypedef _dart_snd_mixer_elem_detach = int Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n  ffi.Pointer<snd_hctl_elem_> helem,\n);\n\ntypedef _c_snd_mixer_elem_empty = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n);\n\ntypedef _dart_snd_mixer_elem_empty = int Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n);\n\ntypedef _c_snd_mixer_elem_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n);\n\ntypedef _dart_snd_mixer_elem_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_elem_> melem,\n);\n\ntypedef _c_snd_mixer_class_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_mixer_class_sizeof = int Function();\n\ntypedef _c_snd_mixer_class_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_class_>> ptr,\n);\n\ntypedef _dart_snd_mixer_class_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_class_>> ptr,\n);\n\ntypedef _c_snd_mixer_class_free = ffi.Void Function(\n  ffi.Pointer<snd_mixer_class_> obj,\n);\n\ntypedef _dart_snd_mixer_class_free = void Function(\n  ffi.Pointer<snd_mixer_class_> obj,\n);\n\ntypedef _c_snd_mixer_class_copy = ffi.Void Function(\n  ffi.Pointer<snd_mixer_class_> dst,\n  ffi.Pointer<snd_mixer_class_> src,\n);\n\ntypedef _dart_snd_mixer_class_copy = void Function(\n  ffi.Pointer<snd_mixer_class_> dst,\n  ffi.Pointer<snd_mixer_class_> src,\n);\n\ntypedef _c_snd_mixer_class_get_mixer = ffi.Pointer<snd_mixer_> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _dart_snd_mixer_class_get_mixer = ffi.Pointer<snd_mixer_> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef snd_mixer_event_t = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_>,\n  ffi.Uint32,\n  ffi.Pointer<snd_hctl_elem_>,\n  ffi.Pointer<snd_mixer_elem_>,\n);\n\ntypedef _c_snd_mixer_class_get_event\n    = ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _dart_snd_mixer_class_get_event\n    = ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _c_snd_mixer_class_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _dart_snd_mixer_class_get_private = ffi.Pointer<ffi.Void> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _c_snd_mixer_class_get_compare\n    = ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _dart_snd_mixer_class_get_compare\n    = ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n);\n\ntypedef _c_snd_mixer_class_set_event = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> event,\n);\n\ntypedef _dart_snd_mixer_class_set_event = int Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_event_t>> event,\n);\n\ntypedef _c_snd_mixer_class_set_private = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _dart_snd_mixer_class_set_private = int Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.Void> private_data,\n);\n\ntypedef _typedefC_12 = ffi.Void Function(\n  ffi.Pointer<snd_mixer_class_>,\n);\n\ntypedef _c_snd_mixer_class_set_private_free = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<_typedefC_12>> private_free,\n);\n\ntypedef _dart_snd_mixer_class_set_private_free = int Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<_typedefC_12>> private_free,\n);\n\ntypedef _c_snd_mixer_class_set_compare = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> compare,\n);\n\ntypedef _dart_snd_mixer_class_set_compare = int Function(\n  ffi.Pointer<snd_mixer_class_> class_,\n  ffi.Pointer<ffi.NativeFunction<snd_mixer_compare_t>> compare,\n);\n\ntypedef _c_snd_mixer_selem_channel_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Int32 channel,\n);\n\ntypedef _dart_snd_mixer_selem_channel_name = ffi.Pointer<ffi.Int8> Function(\n  int channel,\n);\n\ntypedef _c_snd_mixer_selem_register = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_mixer_selem_regopt> options,\n  ffi.Pointer<ffi.Pointer<snd_mixer_class_>> classp,\n);\n\ntypedef _dart_snd_mixer_selem_register = int Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_mixer_selem_regopt> options,\n  ffi.Pointer<ffi.Pointer<snd_mixer_class_>> classp,\n);\n\ntypedef _c_snd_mixer_selem_get_id = ffi.Void Function(\n  ffi.Pointer<snd_mixer_elem_> element,\n  ffi.Pointer<snd_mixer_selem_id_> id,\n);\n\ntypedef _dart_snd_mixer_selem_get_id = void Function(\n  ffi.Pointer<snd_mixer_elem_> element,\n  ffi.Pointer<snd_mixer_selem_id_> id,\n);\n\ntypedef _c_snd_mixer_selem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_get_index = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_find_selem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_mixer_selem_id_> id,\n);\n\ntypedef _dart_snd_mixer_find_selem = ffi.Pointer<snd_mixer_elem_> Function(\n  ffi.Pointer<snd_mixer_> mixer,\n  ffi.Pointer<snd_mixer_selem_id_> id,\n);\n\ntypedef _c_snd_mixer_selem_is_active = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_active = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_is_playback_mono = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_playback_mono = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_playback_channel = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Int32 channel,\n);\n\ntypedef _dart_snd_mixer_selem_has_playback_channel = int Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  int channel,\n);\n\ntypedef _c_snd_mixer_selem_is_capture_mono = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_capture_mono = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_channel = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  ffi.Int32 channel,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_channel = int Function(\n  ffi.Pointer<snd_mixer_elem_> obj,\n  int channel,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_group = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_group = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_common_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_common_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_playback_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_playback_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_playback_volume_joined = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_playback_volume_joined = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_volume_joined = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_volume_joined = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_common_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_common_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_playback_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_playback_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_playback_switch_joined = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_playback_switch_joined = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_switch_joined = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_switch_joined = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_has_capture_switch_exclusive = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_has_capture_switch_exclusive = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_ask_playback_vol_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n  ffi.Pointer<ffi.Int64> dBvalue,\n);\n\ntypedef _dart_snd_mixer_selem_ask_playback_vol_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n  ffi.Pointer<ffi.Int64> dBvalue,\n);\n\ntypedef _c_snd_mixer_selem_ask_capture_vol_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n  ffi.Pointer<ffi.Int64> dBvalue,\n);\n\ntypedef _dart_snd_mixer_selem_ask_capture_vol_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n  ffi.Pointer<ffi.Int64> dBvalue,\n);\n\ntypedef _c_snd_mixer_selem_ask_playback_dB_vol = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 dBvalue,\n  ffi.Int32 dir,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_ask_playback_dB_vol = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int dBvalue,\n  int dir,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_ask_capture_dB_vol = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 dBvalue,\n  ffi.Int32 dir,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_ask_capture_dB_vol = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int dBvalue,\n  int dir,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_get_playback_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_playback_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_get_playback_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_playback_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int64> value,\n);\n\ntypedef _c_snd_mixer_selem_get_playback_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int32> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_playback_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int32> value,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Int32> value,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Int32> value,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_volume = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_volume = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int64 value,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n  int dir,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_dB = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int64 value,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_dB = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n  int dir,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_volume_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_volume_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_volume_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_volume_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_dB_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_dB_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n  int dir,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_dB_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 value,\n  ffi.Int32 dir,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_dB_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n  int dir,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int32 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_switch = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Int32 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_switch = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_switch_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_switch_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_switch_all = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 value,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_switch_all = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int value,\n);\n\ntypedef _c_snd_mixer_selem_get_playback_volume_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_mixer_selem_get_playback_volume_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_mixer_selem_get_playback_dB_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_mixer_selem_get_playback_dB_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_mixer_selem_set_playback_volume_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 min,\n  ffi.Int64 max,\n);\n\ntypedef _dart_snd_mixer_selem_set_playback_volume_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int min,\n  int max,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_volume_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_volume_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_mixer_selem_get_capture_dB_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _dart_snd_mixer_selem_get_capture_dB_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Pointer<ffi.Int64> min,\n  ffi.Pointer<ffi.Int64> max,\n);\n\ntypedef _c_snd_mixer_selem_set_capture_volume_range = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int64 min,\n  ffi.Int64 max,\n);\n\ntypedef _dart_snd_mixer_selem_set_capture_volume_range = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int min,\n  int max,\n);\n\ntypedef _c_snd_mixer_selem_is_enumerated = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_enumerated = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_is_enum_playback = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_enum_playback = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_is_enum_capture = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_is_enum_capture = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_get_enum_items = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _dart_snd_mixer_selem_get_enum_items = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n);\n\ntypedef _c_snd_mixer_selem_get_enum_item_name = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Uint32 idx,\n  ffi.Uint64 maxlen,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_mixer_selem_get_enum_item_name = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int idx,\n  int maxlen,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_mixer_selem_get_enum_item = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Pointer<ffi.Uint32> idxp,\n);\n\ntypedef _dart_snd_mixer_selem_get_enum_item = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  ffi.Pointer<ffi.Uint32> idxp,\n);\n\ntypedef _c_snd_mixer_selem_set_enum_item = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  ffi.Int32 channel,\n  ffi.Uint32 idx,\n);\n\ntypedef _dart_snd_mixer_selem_set_enum_item = int Function(\n  ffi.Pointer<snd_mixer_elem_> elem,\n  int channel,\n  int idx,\n);\n\ntypedef _c_snd_mixer_selem_id_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_mixer_selem_id_sizeof = int Function();\n\ntypedef _c_snd_mixer_selem_id_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_selem_id_>> ptr,\n);\n\ntypedef _dart_snd_mixer_selem_id_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_mixer_selem_id_>> ptr,\n);\n\ntypedef _c_snd_mixer_selem_id_free = ffi.Void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _dart_snd_mixer_selem_id_free = void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _c_snd_mixer_selem_id_copy = ffi.Void Function(\n  ffi.Pointer<snd_mixer_selem_id_> dst,\n  ffi.Pointer<snd_mixer_selem_id_> src,\n);\n\ntypedef _dart_snd_mixer_selem_id_copy = void Function(\n  ffi.Pointer<snd_mixer_selem_id_> dst,\n  ffi.Pointer<snd_mixer_selem_id_> src,\n);\n\ntypedef _c_snd_mixer_selem_id_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _dart_snd_mixer_selem_id_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _c_snd_mixer_selem_id_get_index = ffi.Uint32 Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _dart_snd_mixer_selem_id_get_index = int Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n);\n\ntypedef _c_snd_mixer_selem_id_set_name = ffi.Void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _dart_snd_mixer_selem_id_set_name = void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n  ffi.Pointer<ffi.Int8> val,\n);\n\ntypedef _c_snd_mixer_selem_id_set_index = ffi.Void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n  ffi.Uint32 val,\n);\n\ntypedef _dart_snd_mixer_selem_id_set_index = void Function(\n  ffi.Pointer<snd_mixer_selem_id_> obj,\n  int val,\n);\n\ntypedef _c_snd_mixer_selem_id_parse = ffi.Int32 Function(\n  ffi.Pointer<snd_mixer_selem_id_> dst,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_mixer_selem_id_parse = int Function(\n  ffi.Pointer<snd_mixer_selem_id_> dst,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_seq_open = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 streams,\n  ffi.Int32 mode,\n);\n\ntypedef _dart_snd_seq_open = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int streams,\n  int mode,\n);\n\ntypedef _c_snd_seq_open_lconf = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Int32 streams,\n  ffi.Int32 mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _dart_snd_seq_open_lconf = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_>> handle,\n  ffi.Pointer<ffi.Int8> name,\n  int streams,\n  int mode,\n  ffi.Pointer<snd_config_> lconf,\n);\n\ntypedef _c_snd_seq_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_seq_type = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_type = int Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_seq_close = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_close = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_poll_descriptors_count = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int16 events,\n);\n\ntypedef _dart_snd_seq_poll_descriptors_count = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int events,\n);\n\ntypedef _c_snd_seq_poll_descriptors = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 space,\n  ffi.Int16 events,\n);\n\ntypedef _dart_snd_seq_poll_descriptors = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<pollfd> pfds,\n  int space,\n  int events,\n);\n\ntypedef _c_snd_seq_poll_descriptors_revents = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<pollfd> pfds,\n  ffi.Uint32 nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _dart_snd_seq_poll_descriptors_revents = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<pollfd> pfds,\n  int nfds,\n  ffi.Pointer<ffi.Uint16> revents,\n);\n\ntypedef _c_snd_seq_nonblock = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 nonblock,\n);\n\ntypedef _dart_snd_seq_nonblock = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int nonblock,\n);\n\ntypedef _c_snd_seq_client_id = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_client_id = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_get_output_buffer_size = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_get_output_buffer_size = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_get_input_buffer_size = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_get_input_buffer_size = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_set_output_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_set_output_buffer_size = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int size,\n);\n\ntypedef _c_snd_seq_set_input_buffer_size = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_set_input_buffer_size = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int size,\n);\n\ntypedef _c_snd_seq_system_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_system_info_sizeof = int Function();\n\ntypedef _c_snd_seq_system_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_system_info_>> ptr,\n);\n\ntypedef _dart_snd_seq_system_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_system_info_>> ptr,\n);\n\ntypedef _c_snd_seq_system_info_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_system_info_> ptr,\n);\n\ntypedef _dart_snd_seq_system_info_free = void Function(\n  ffi.Pointer<snd_seq_system_info_> ptr,\n);\n\ntypedef _c_snd_seq_system_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_system_info_> dst,\n  ffi.Pointer<snd_seq_system_info_> src,\n);\n\ntypedef _dart_snd_seq_system_info_copy = void Function(\n  ffi.Pointer<snd_seq_system_info_> dst,\n  ffi.Pointer<snd_seq_system_info_> src,\n);\n\ntypedef _c_snd_seq_system_info_get_queues = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_queues = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info_get_clients = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_clients = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info_get_ports = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_ports = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info_get_channels = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_channels = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info_get_cur_clients = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_cur_clients = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info_get_cur_queues = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info_get_cur_queues = int Function(\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_system_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _dart_snd_seq_system_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_system_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_client_info_sizeof = int Function();\n\ntypedef _c_snd_seq_client_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_client_info_>> ptr,\n);\n\ntypedef _dart_snd_seq_client_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_client_info_>> ptr,\n);\n\ntypedef _c_snd_seq_client_info_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> ptr,\n);\n\ntypedef _dart_snd_seq_client_info_free = void Function(\n  ffi.Pointer<snd_seq_client_info_> ptr,\n);\n\ntypedef _c_snd_seq_client_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> dst,\n  ffi.Pointer<snd_seq_client_info_> src,\n);\n\ntypedef _dart_snd_seq_client_info_copy = void Function(\n  ffi.Pointer<snd_seq_client_info_> dst,\n  ffi.Pointer<snd_seq_client_info_> src,\n);\n\ntypedef _c_snd_seq_client_info_get_client = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_client = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_type = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_broadcast_filter = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_broadcast_filter = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_error_bounce = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_error_bounce = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_card = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_card = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_pid = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_pid = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_event_filter = ffi.Pointer<ffi.Uint8>\n    Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_event_filter = ffi.Pointer<ffi.Uint8>\n    Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_num_ports = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_num_ports = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_get_event_lost = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_get_event_lost = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_set_client = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 client,\n);\n\ntypedef _dart_snd_seq_client_info_set_client = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int client,\n);\n\ntypedef _c_snd_seq_client_info_set_name = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_client_info_set_name = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_client_info_set_broadcast_filter = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_client_info_set_broadcast_filter = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_client_info_set_error_bounce = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_client_info_set_error_bounce = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_client_info_set_event_filter = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Pointer<ffi.Uint8> filter,\n);\n\ntypedef _dart_snd_seq_client_info_set_event_filter = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Pointer<ffi.Uint8> filter,\n);\n\ntypedef _c_snd_seq_client_info_event_filter_clear = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_client_info_event_filter_clear = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_info_event_filter_add = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 event_type,\n);\n\ntypedef _dart_snd_seq_client_info_event_filter_add = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int event_type,\n);\n\ntypedef _c_snd_seq_client_info_event_filter_del = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 event_type,\n);\n\ntypedef _dart_snd_seq_client_info_event_filter_del = void Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int event_type,\n);\n\ntypedef _c_snd_seq_client_info_event_filter_check = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  ffi.Int32 event_type,\n);\n\ntypedef _dart_snd_seq_client_info_event_filter_check = int Function(\n  ffi.Pointer<snd_seq_client_info_> info,\n  int event_type,\n);\n\ntypedef _c_snd_seq_get_client_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_get_client_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_get_any_client_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 client,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_get_any_client_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int client,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_set_client_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_set_client_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_query_next_client = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _dart_snd_seq_query_next_client = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_info_> info,\n);\n\ntypedef _c_snd_seq_client_pool_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_client_pool_sizeof = int Function();\n\ntypedef _c_snd_seq_client_pool_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_client_pool_>> ptr,\n);\n\ntypedef _dart_snd_seq_client_pool_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_client_pool_>> ptr,\n);\n\ntypedef _c_snd_seq_client_pool_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_pool_> ptr,\n);\n\ntypedef _dart_snd_seq_client_pool_free = void Function(\n  ffi.Pointer<snd_seq_client_pool_> ptr,\n);\n\ntypedef _c_snd_seq_client_pool_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_pool_> dst,\n  ffi.Pointer<snd_seq_client_pool_> src,\n);\n\ntypedef _dart_snd_seq_client_pool_copy = void Function(\n  ffi.Pointer<snd_seq_client_pool_> dst,\n  ffi.Pointer<snd_seq_client_pool_> src,\n);\n\ntypedef _c_snd_seq_client_pool_get_client = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_client = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_get_output_pool = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_output_pool = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_get_input_pool = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_input_pool = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_get_output_room = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_output_room = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_get_output_free = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_output_free = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_get_input_free = ffi.Uint64 Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_client_pool_get_input_free = int Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_client_pool_set_output_pool = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_client_pool_set_output_pool = void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  int size,\n);\n\ntypedef _c_snd_seq_client_pool_set_input_pool = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_client_pool_set_input_pool = void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  int size,\n);\n\ntypedef _c_snd_seq_client_pool_set_output_room = ffi.Void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_client_pool_set_output_room = void Function(\n  ffi.Pointer<snd_seq_client_pool_> info,\n  int size,\n);\n\ntypedef _c_snd_seq_get_client_pool = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_get_client_pool = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_set_client_pool = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _dart_snd_seq_set_client_pool = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_client_pool_> info,\n);\n\ntypedef _c_snd_seq_port_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_port_info_sizeof = int Function();\n\ntypedef _c_snd_seq_port_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_port_info_>> ptr,\n);\n\ntypedef _dart_snd_seq_port_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_port_info_>> ptr,\n);\n\ntypedef _c_snd_seq_port_info_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> ptr,\n);\n\ntypedef _dart_snd_seq_port_info_free = void Function(\n  ffi.Pointer<snd_seq_port_info_> ptr,\n);\n\ntypedef _c_snd_seq_port_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> dst,\n  ffi.Pointer<snd_seq_port_info_> src,\n);\n\ntypedef _dart_snd_seq_port_info_copy = void Function(\n  ffi.Pointer<snd_seq_port_info_> dst,\n  ffi.Pointer<snd_seq_port_info_> src,\n);\n\ntypedef _c_snd_seq_port_info_get_client = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_client = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_port = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_addr = ffi.Pointer<snd_seq_addr_t> Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_addr = ffi.Pointer<snd_seq_addr_t> Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_capability = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_capability = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_type = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_type = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_midi_channels = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_midi_channels = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_midi_voices = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_midi_voices = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_synth_voices = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_synth_voices = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_read_use = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_read_use = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_write_use = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_write_use = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_port_specified = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_port_specified = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_timestamping = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_timestamping = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_timestamp_real = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_timestamp_real = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_get_timestamp_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_port_info_get_timestamp_queue = int Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_info_set_client = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 client,\n);\n\ntypedef _dart_snd_seq_port_info_set_client = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int client,\n);\n\ntypedef _c_snd_seq_port_info_set_port = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 port,\n);\n\ntypedef _dart_snd_seq_port_info_set_port = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int port,\n);\n\ntypedef _c_snd_seq_port_info_set_addr = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _dart_snd_seq_port_info_set_addr = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _c_snd_seq_port_info_set_name = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_port_info_set_name = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_port_info_set_capability = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Uint32 capability,\n);\n\ntypedef _dart_snd_seq_port_info_set_capability = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int capability,\n);\n\ntypedef _c_snd_seq_port_info_set_type = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Uint32 type,\n);\n\ntypedef _dart_snd_seq_port_info_set_type = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int type,\n);\n\ntypedef _c_snd_seq_port_info_set_midi_channels = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 channels,\n);\n\ntypedef _dart_snd_seq_port_info_set_midi_channels = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int channels,\n);\n\ntypedef _c_snd_seq_port_info_set_midi_voices = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 voices,\n);\n\ntypedef _dart_snd_seq_port_info_set_midi_voices = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int voices,\n);\n\ntypedef _c_snd_seq_port_info_set_synth_voices = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 voices,\n);\n\ntypedef _dart_snd_seq_port_info_set_synth_voices = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int voices,\n);\n\ntypedef _c_snd_seq_port_info_set_port_specified = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_port_info_set_port_specified = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_port_info_set_timestamping = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 enable,\n);\n\ntypedef _dart_snd_seq_port_info_set_timestamping = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int enable,\n);\n\ntypedef _c_snd_seq_port_info_set_timestamp_real = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 realtime,\n);\n\ntypedef _dart_snd_seq_port_info_set_timestamp_real = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int realtime,\n);\n\ntypedef _c_snd_seq_port_info_set_timestamp_queue = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  ffi.Int32 queue,\n);\n\ntypedef _dart_snd_seq_port_info_set_timestamp_queue = void Function(\n  ffi.Pointer<snd_seq_port_info_> info,\n  int queue,\n);\n\ntypedef _c_snd_seq_create_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_create_port = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_delete_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 port,\n);\n\ntypedef _dart_snd_seq_delete_port = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int port,\n);\n\ntypedef _c_snd_seq_get_port_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_get_port_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_get_any_port_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 client,\n  ffi.Int32 port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_get_any_port_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int client,\n  int port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_set_port_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_set_port_info = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int port,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_query_next_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _dart_snd_seq_query_next_port = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_info_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_port_subscribe_sizeof = int Function();\n\ntypedef _c_snd_seq_port_subscribe_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_port_subscribe_>> ptr,\n);\n\ntypedef _dart_snd_seq_port_subscribe_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_port_subscribe_>> ptr,\n);\n\ntypedef _c_snd_seq_port_subscribe_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> ptr,\n);\n\ntypedef _dart_snd_seq_port_subscribe_free = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> ptr,\n);\n\ntypedef _c_snd_seq_port_subscribe_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> dst,\n  ffi.Pointer<snd_seq_port_subscribe_> src,\n);\n\ntypedef _dart_snd_seq_port_subscribe_copy = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> dst,\n  ffi.Pointer<snd_seq_port_subscribe_> src,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_sender = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_sender = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_dest = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_dest = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_queue = int Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_exclusive = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_exclusive = int Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_time_update = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_time_update = int Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_get_time_real = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_port_subscribe_get_time_real = int Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_sender = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_sender = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_dest = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_dest = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_queue = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Int32 q,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_queue = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  int q,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_exclusive = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_exclusive = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_time_update = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_time_update = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_port_subscribe_set_time_real = ffi.Void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  ffi.Int32 val,\n);\n\ntypedef _dart_snd_seq_port_subscribe_set_time_real = void Function(\n  ffi.Pointer<snd_seq_port_subscribe_> info,\n  int val,\n);\n\ntypedef _c_snd_seq_get_port_subscription = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _dart_snd_seq_get_port_subscription = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _c_snd_seq_subscribe_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _dart_snd_seq_subscribe_port = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _c_snd_seq_unsubscribe_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _dart_snd_seq_unsubscribe_port = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_port_subscribe_> sub,\n);\n\ntypedef _c_snd_seq_query_subscribe_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_query_subscribe_sizeof = int Function();\n\ntypedef _c_snd_seq_query_subscribe_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_query_subscribe_>> ptr,\n);\n\ntypedef _dart_snd_seq_query_subscribe_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_query_subscribe_>> ptr,\n);\n\ntypedef _c_snd_seq_query_subscribe_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> ptr,\n);\n\ntypedef _dart_snd_seq_query_subscribe_free = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> ptr,\n);\n\ntypedef _c_snd_seq_query_subscribe_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> dst,\n  ffi.Pointer<snd_seq_query_subscribe_> src,\n);\n\ntypedef _dart_snd_seq_query_subscribe_copy = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> dst,\n  ffi.Pointer<snd_seq_query_subscribe_> src,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_client = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_client = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_port = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_root = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_root = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_type = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_index = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_index = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_num_subs = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_num_subs = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_addr = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_addr = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_queue = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_exclusive = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_exclusive = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_time_update = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_time_update = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_get_time_real = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _dart_snd_seq_query_subscribe_get_time_real = int Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n);\n\ntypedef _c_snd_seq_query_subscribe_set_client = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Int32 client,\n);\n\ntypedef _dart_snd_seq_query_subscribe_set_client = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  int client,\n);\n\ntypedef _c_snd_seq_query_subscribe_set_port = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Int32 port,\n);\n\ntypedef _dart_snd_seq_query_subscribe_set_port = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  int port,\n);\n\ntypedef _c_snd_seq_query_subscribe_set_root = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _dart_snd_seq_query_subscribe_set_root = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _c_snd_seq_query_subscribe_set_type = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_seq_query_subscribe_set_type = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  int type,\n);\n\ntypedef _c_snd_seq_query_subscribe_set_index = ffi.Void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  ffi.Int32 _index,\n);\n\ntypedef _dart_snd_seq_query_subscribe_set_index = void Function(\n  ffi.Pointer<snd_seq_query_subscribe_> info,\n  int _index,\n);\n\ntypedef _c_snd_seq_query_port_subscribers = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_query_subscribe_> subs,\n);\n\ntypedef _dart_snd_seq_query_port_subscribers = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_query_subscribe_> subs,\n);\n\ntypedef _c_snd_seq_queue_info_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_queue_info_sizeof = int Function();\n\ntypedef _c_snd_seq_queue_info_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_info_>> ptr,\n);\n\ntypedef _dart_snd_seq_queue_info_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_info_>> ptr,\n);\n\ntypedef _c_snd_seq_queue_info_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> ptr,\n);\n\ntypedef _dart_snd_seq_queue_info_free = void Function(\n  ffi.Pointer<snd_seq_queue_info_> ptr,\n);\n\ntypedef _c_snd_seq_queue_info_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> dst,\n  ffi.Pointer<snd_seq_queue_info_> src,\n);\n\ntypedef _dart_snd_seq_queue_info_copy = void Function(\n  ffi.Pointer<snd_seq_queue_info_> dst,\n  ffi.Pointer<snd_seq_queue_info_> src,\n);\n\ntypedef _c_snd_seq_queue_info_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_queue_info_get_queue = int Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_queue_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_queue_info_get_name = ffi.Pointer<ffi.Int8> Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_queue_info_get_owner = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_queue_info_get_owner = int Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_queue_info_get_locked = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_queue_info_get_locked = int Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_queue_info_get_flags = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_queue_info_get_flags = int Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_queue_info_set_name = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_queue_info_set_name = void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_queue_info_set_owner = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  ffi.Int32 owner,\n);\n\ntypedef _dart_snd_seq_queue_info_set_owner = void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  int owner,\n);\n\ntypedef _c_snd_seq_queue_info_set_locked = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  ffi.Int32 locked,\n);\n\ntypedef _dart_snd_seq_queue_info_set_locked = void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  int locked,\n);\n\ntypedef _c_snd_seq_queue_info_set_flags = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  ffi.Uint32 flags,\n);\n\ntypedef _dart_snd_seq_queue_info_set_flags = void Function(\n  ffi.Pointer<snd_seq_queue_info_> info,\n  int flags,\n);\n\ntypedef _c_snd_seq_create_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_create_queue = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_alloc_named_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_alloc_named_queue = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_alloc_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_alloc_queue = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_free_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n);\n\ntypedef _dart_snd_seq_free_queue = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n);\n\ntypedef _c_snd_seq_get_queue_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_get_queue_info = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int q,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_set_queue_info = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _dart_snd_seq_set_queue_info = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int q,\n  ffi.Pointer<snd_seq_queue_info_> info,\n);\n\ntypedef _c_snd_seq_query_named_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_query_named_queue = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_get_queue_usage = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n);\n\ntypedef _dart_snd_seq_get_queue_usage = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n);\n\ntypedef _c_snd_seq_set_queue_usage = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Int32 used,\n);\n\ntypedef _dart_snd_seq_set_queue_usage = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  int used,\n);\n\ntypedef _c_snd_seq_queue_status_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_queue_status_sizeof = int Function();\n\ntypedef _c_snd_seq_queue_status_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_status_>> ptr,\n);\n\ntypedef _dart_snd_seq_queue_status_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_status_>> ptr,\n);\n\ntypedef _c_snd_seq_queue_status_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_status_> ptr,\n);\n\ntypedef _dart_snd_seq_queue_status_free = void Function(\n  ffi.Pointer<snd_seq_queue_status_> ptr,\n);\n\ntypedef _c_snd_seq_queue_status_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_status_> dst,\n  ffi.Pointer<snd_seq_queue_status_> src,\n);\n\ntypedef _dart_snd_seq_queue_status_copy = void Function(\n  ffi.Pointer<snd_seq_queue_status_> dst,\n  ffi.Pointer<snd_seq_queue_status_> src,\n);\n\ntypedef _c_snd_seq_queue_status_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _dart_snd_seq_queue_status_get_queue = int Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _c_snd_seq_queue_status_get_events = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _dart_snd_seq_queue_status_get_events = int Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _c_snd_seq_queue_status_get_tick_time = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _dart_snd_seq_queue_status_get_tick_time = int Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _c_snd_seq_queue_status_get_real_time = ffi.Pointer<snd_seq_real_time_t>\n    Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _dart_snd_seq_queue_status_get_real_time\n    = ffi.Pointer<snd_seq_real_time_t> Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _c_snd_seq_queue_status_get_status = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _dart_snd_seq_queue_status_get_status = int Function(\n  ffi.Pointer<snd_seq_queue_status_> info,\n);\n\ntypedef _c_snd_seq_get_queue_status = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_status_> status,\n);\n\ntypedef _dart_snd_seq_get_queue_status = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  ffi.Pointer<snd_seq_queue_status_> status,\n);\n\ntypedef _c_snd_seq_queue_tempo_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_queue_tempo_sizeof = int Function();\n\ntypedef _c_snd_seq_queue_tempo_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_tempo_>> ptr,\n);\n\ntypedef _dart_snd_seq_queue_tempo_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_tempo_>> ptr,\n);\n\ntypedef _c_snd_seq_queue_tempo_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> ptr,\n);\n\ntypedef _dart_snd_seq_queue_tempo_free = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> ptr,\n);\n\ntypedef _c_snd_seq_queue_tempo_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> dst,\n  ffi.Pointer<snd_seq_queue_tempo_> src,\n);\n\ntypedef _dart_snd_seq_queue_tempo_copy = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> dst,\n  ffi.Pointer<snd_seq_queue_tempo_> src,\n);\n\ntypedef _c_snd_seq_queue_tempo_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _dart_snd_seq_queue_tempo_get_queue = int Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _c_snd_seq_queue_tempo_get_tempo = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _dart_snd_seq_queue_tempo_get_tempo = int Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _c_snd_seq_queue_tempo_get_ppq = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _dart_snd_seq_queue_tempo_get_ppq = int Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _c_snd_seq_queue_tempo_get_skew = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _dart_snd_seq_queue_tempo_get_skew = int Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _c_snd_seq_queue_tempo_get_skew_base = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _dart_snd_seq_queue_tempo_get_skew_base = int Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n);\n\ntypedef _c_snd_seq_queue_tempo_set_tempo = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  ffi.Uint32 tempo,\n);\n\ntypedef _dart_snd_seq_queue_tempo_set_tempo = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  int tempo,\n);\n\ntypedef _c_snd_seq_queue_tempo_set_ppq = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  ffi.Int32 ppq,\n);\n\ntypedef _dart_snd_seq_queue_tempo_set_ppq = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  int ppq,\n);\n\ntypedef _c_snd_seq_queue_tempo_set_skew = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  ffi.Uint32 skew,\n);\n\ntypedef _dart_snd_seq_queue_tempo_set_skew = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  int skew,\n);\n\ntypedef _c_snd_seq_queue_tempo_set_skew_base = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  ffi.Uint32 base,\n);\n\ntypedef _dart_snd_seq_queue_tempo_set_skew_base = void Function(\n  ffi.Pointer<snd_seq_queue_tempo_> info,\n  int base,\n);\n\ntypedef _c_snd_seq_get_queue_tempo = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_tempo_> tempo,\n);\n\ntypedef _dart_snd_seq_get_queue_tempo = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  ffi.Pointer<snd_seq_queue_tempo_> tempo,\n);\n\ntypedef _c_snd_seq_set_queue_tempo = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_tempo_> tempo,\n);\n\ntypedef _dart_snd_seq_set_queue_tempo = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  ffi.Pointer<snd_seq_queue_tempo_> tempo,\n);\n\ntypedef _c_snd_seq_queue_timer_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_queue_timer_sizeof = int Function();\n\ntypedef _c_snd_seq_queue_timer_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_timer_>> ptr,\n);\n\ntypedef _dart_snd_seq_queue_timer_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_queue_timer_>> ptr,\n);\n\ntypedef _c_snd_seq_queue_timer_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_timer_> ptr,\n);\n\ntypedef _dart_snd_seq_queue_timer_free = void Function(\n  ffi.Pointer<snd_seq_queue_timer_> ptr,\n);\n\ntypedef _c_snd_seq_queue_timer_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_timer_> dst,\n  ffi.Pointer<snd_seq_queue_timer_> src,\n);\n\ntypedef _dart_snd_seq_queue_timer_copy = void Function(\n  ffi.Pointer<snd_seq_queue_timer_> dst,\n  ffi.Pointer<snd_seq_queue_timer_> src,\n);\n\ntypedef _c_snd_seq_queue_timer_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _dart_snd_seq_queue_timer_get_queue = int Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _c_snd_seq_queue_timer_get_type = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _dart_snd_seq_queue_timer_get_type = int Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _c_snd_seq_queue_timer_get_id = ffi.Pointer<snd_timer_id_> Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _dart_snd_seq_queue_timer_get_id = ffi.Pointer<snd_timer_id_> Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _c_snd_seq_queue_timer_get_resolution = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _dart_snd_seq_queue_timer_get_resolution = int Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n);\n\ntypedef _c_snd_seq_queue_timer_set_type = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_seq_queue_timer_set_type = void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  int type,\n);\n\ntypedef _c_snd_seq_queue_timer_set_id = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _dart_snd_seq_queue_timer_set_id = void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  ffi.Pointer<snd_timer_id_> id,\n);\n\ntypedef _c_snd_seq_queue_timer_set_resolution = ffi.Void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  ffi.Uint32 resolution,\n);\n\ntypedef _dart_snd_seq_queue_timer_set_resolution = void Function(\n  ffi.Pointer<snd_seq_queue_timer_> info,\n  int resolution,\n);\n\ntypedef _c_snd_seq_get_queue_timer = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_timer_> timer,\n);\n\ntypedef _dart_snd_seq_get_queue_timer = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  ffi.Pointer<snd_seq_queue_timer_> timer,\n);\n\ntypedef _c_snd_seq_set_queue_timer = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Int32 q,\n  ffi.Pointer<snd_seq_queue_timer_> timer,\n);\n\ntypedef _dart_snd_seq_set_queue_timer = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  int q,\n  ffi.Pointer<snd_seq_queue_timer_> timer,\n);\n\ntypedef _c_snd_seq_free_event = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_free_event = int Function(\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_event_length = ffi.Int64 Function(\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_event_length = int Function(\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_event_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_event_output = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_event_output_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_event_output_buffer = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_event_output_direct = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_event_output_direct = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_event_input = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n);\n\ntypedef _dart_snd_seq_event_input = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n);\n\ntypedef _c_snd_seq_event_input_pending = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 fetch_sequencer,\n);\n\ntypedef _dart_snd_seq_event_input_pending = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int fetch_sequencer,\n);\n\ntypedef _c_snd_seq_drain_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_drain_output = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_event_output_pending = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_event_output_pending = int Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_seq_extract_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n);\n\ntypedef _dart_snd_seq_extract_output = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<ffi.Pointer<snd_seq_event_t>> ev,\n);\n\ntypedef _c_snd_seq_drop_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_drop_output = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_drop_output_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_drop_output_buffer = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_drop_input = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_drop_input = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_drop_input_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _dart_snd_seq_drop_input_buffer = int Function(\n  ffi.Pointer<snd_seq_> handle,\n);\n\ntypedef _c_snd_seq_remove_events_sizeof = ffi.Uint64 Function();\n\ntypedef _dart_snd_seq_remove_events_sizeof = int Function();\n\ntypedef _c_snd_seq_remove_events_malloc = ffi.Int32 Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_remove_events_>> ptr,\n);\n\ntypedef _dart_snd_seq_remove_events_malloc = int Function(\n  ffi.Pointer<ffi.Pointer<snd_seq_remove_events_>> ptr,\n);\n\ntypedef _c_snd_seq_remove_events_free = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> ptr,\n);\n\ntypedef _dart_snd_seq_remove_events_free = void Function(\n  ffi.Pointer<snd_seq_remove_events_> ptr,\n);\n\ntypedef _c_snd_seq_remove_events_copy = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> dst,\n  ffi.Pointer<snd_seq_remove_events_> src,\n);\n\ntypedef _dart_snd_seq_remove_events_copy = void Function(\n  ffi.Pointer<snd_seq_remove_events_> dst,\n  ffi.Pointer<snd_seq_remove_events_> src,\n);\n\ntypedef _c_snd_seq_remove_events_get_condition = ffi.Uint32 Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_condition = int Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_get_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_queue = int Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_get_dest = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_dest = ffi.Pointer<snd_seq_addr_t>\n    Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_get_channel = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_channel = int Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_get_event_type = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_event_type = int Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_get_tag = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events_get_tag = int Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_remove_events_set_condition = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Uint32 flags,\n);\n\ntypedef _dart_snd_seq_remove_events_set_condition = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  int flags,\n);\n\ntypedef _c_snd_seq_remove_events_set_queue = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Int32 queue,\n);\n\ntypedef _dart_snd_seq_remove_events_set_queue = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  int queue,\n);\n\ntypedef _c_snd_seq_remove_events_set_dest = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _dart_snd_seq_remove_events_set_dest = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Pointer<snd_seq_addr_t> addr,\n);\n\ntypedef _c_snd_seq_remove_events_set_channel = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Int32 channel,\n);\n\ntypedef _dart_snd_seq_remove_events_set_channel = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  int channel,\n);\n\ntypedef _c_snd_seq_remove_events_set_event_type = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Int32 type,\n);\n\ntypedef _dart_snd_seq_remove_events_set_event_type = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  int type,\n);\n\ntypedef _c_snd_seq_remove_events_set_tag = ffi.Void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  ffi.Int32 tag,\n);\n\ntypedef _dart_snd_seq_remove_events_set_tag = void Function(\n  ffi.Pointer<snd_seq_remove_events_> info,\n  int tag,\n);\n\ntypedef _c_snd_seq_remove_events = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _dart_snd_seq_remove_events = int Function(\n  ffi.Pointer<snd_seq_> handle,\n  ffi.Pointer<snd_seq_remove_events_> info,\n);\n\ntypedef _c_snd_seq_set_bit = ffi.Void Function(\n  ffi.Int32 nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _dart_snd_seq_set_bit = void Function(\n  int nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _c_snd_seq_unset_bit = ffi.Void Function(\n  ffi.Int32 nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _dart_snd_seq_unset_bit = void Function(\n  int nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _c_snd_seq_change_bit = ffi.Int32 Function(\n  ffi.Int32 nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _dart_snd_seq_change_bit = int Function(\n  int nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _c_snd_seq_get_bit = ffi.Int32 Function(\n  ffi.Int32 nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _dart_snd_seq_get_bit = int Function(\n  int nr,\n  ffi.Pointer<ffi.Void> array,\n);\n\ntypedef _c_snd_seq_control_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 q,\n  ffi.Int32 type,\n  ffi.Int32 value,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_seq_control_queue = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int q,\n  int type,\n  int value,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_seq_create_simple_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n  ffi.Uint32 caps,\n  ffi.Uint32 type,\n);\n\ntypedef _dart_snd_seq_create_simple_port = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n  int caps,\n  int type,\n);\n\ntypedef _c_snd_seq_delete_simple_port = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 port,\n);\n\ntypedef _dart_snd_seq_delete_simple_port = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int port,\n);\n\ntypedef _c_snd_seq_connect_from = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 my_port,\n  ffi.Int32 src_client,\n  ffi.Int32 src_port,\n);\n\ntypedef _dart_snd_seq_connect_from = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int my_port,\n  int src_client,\n  int src_port,\n);\n\ntypedef _c_snd_seq_connect_to = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 my_port,\n  ffi.Int32 dest_client,\n  ffi.Int32 dest_port,\n);\n\ntypedef _dart_snd_seq_connect_to = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int my_port,\n  int dest_client,\n  int dest_port,\n);\n\ntypedef _c_snd_seq_disconnect_from = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 my_port,\n  ffi.Int32 src_client,\n  ffi.Int32 src_port,\n);\n\ntypedef _dart_snd_seq_disconnect_from = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int my_port,\n  int src_client,\n  int src_port,\n);\n\ntypedef _c_snd_seq_disconnect_to = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 my_port,\n  ffi.Int32 dest_client,\n  ffi.Int32 dest_port,\n);\n\ntypedef _dart_snd_seq_disconnect_to = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int my_port,\n  int dest_client,\n  int dest_port,\n);\n\ntypedef _c_snd_seq_set_client_name = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _dart_snd_seq_set_client_name = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<ffi.Int8> name,\n);\n\ntypedef _c_snd_seq_set_client_event_filter = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Int32 event_type,\n);\n\ntypedef _dart_snd_seq_set_client_event_filter = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int event_type,\n);\n\ntypedef _c_snd_seq_set_client_pool_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_set_client_pool_output = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int size,\n);\n\ntypedef _c_snd_seq_set_client_pool_output_room = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_set_client_pool_output_room = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int size,\n);\n\ntypedef _c_snd_seq_set_client_pool_input = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Uint64 size,\n);\n\ntypedef _dart_snd_seq_set_client_pool_input = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  int size,\n);\n\ntypedef _c_snd_seq_sync_output_queue = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_sync_output_queue = int Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_seq_parse_address = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_addr_t> addr,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _dart_snd_seq_parse_address = int Function(\n  ffi.Pointer<snd_seq_> seq,\n  ffi.Pointer<snd_seq_addr_t> addr,\n  ffi.Pointer<ffi.Int8> str,\n);\n\ntypedef _c_snd_seq_reset_pool_output = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_reset_pool_output = int Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_seq_reset_pool_input = ffi.Int32 Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _dart_snd_seq_reset_pool_input = int Function(\n  ffi.Pointer<snd_seq_> seq,\n);\n\ntypedef _c_snd_midi_event_new = ffi.Int32 Function(\n  ffi.Uint64 bufsize,\n  ffi.Pointer<ffi.Pointer<snd_midi_event>> rdev,\n);\n\ntypedef _dart_snd_midi_event_new = int Function(\n  int bufsize,\n  ffi.Pointer<ffi.Pointer<snd_midi_event>> rdev,\n);\n\ntypedef _c_snd_midi_event_resize_buffer = ffi.Int32 Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Uint64 bufsize,\n);\n\ntypedef _dart_snd_midi_event_resize_buffer = int Function(\n  ffi.Pointer<snd_midi_event> dev,\n  int bufsize,\n);\n\ntypedef _c_snd_midi_event_free = ffi.Void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _dart_snd_midi_event_free = void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _c_snd_midi_event_init = ffi.Void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _dart_snd_midi_event_init = void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _c_snd_midi_event_reset_encode = ffi.Void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _dart_snd_midi_event_reset_encode = void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _c_snd_midi_event_reset_decode = ffi.Void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _dart_snd_midi_event_reset_decode = void Function(\n  ffi.Pointer<snd_midi_event> dev,\n);\n\ntypedef _c_snd_midi_event_no_status = ffi.Void Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Int32 on_1,\n);\n\ntypedef _dart_snd_midi_event_no_status = void Function(\n  ffi.Pointer<snd_midi_event> dev,\n  int on_1,\n);\n\ntypedef _c_snd_midi_event_encode = ffi.Int64 Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Pointer<ffi.Uint8> buf,\n  ffi.Int64 count,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_midi_event_encode = int Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Pointer<ffi.Uint8> buf,\n  int count,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_midi_event_encode_byte = ffi.Int32 Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Int32 c,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_midi_event_encode_byte = int Function(\n  ffi.Pointer<snd_midi_event> dev,\n  int c,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _c_snd_midi_event_decode = ffi.Int64 Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Pointer<ffi.Uint8> buf,\n  ffi.Int64 count,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _dart_snd_midi_event_decode = int Function(\n  ffi.Pointer<snd_midi_event> dev,\n  ffi.Pointer<ffi.Uint8> buf,\n  int count,\n  ffi.Pointer<snd_seq_event_t> ev,\n);\n\ntypedef _typedefC_4 = ffi.Int32 Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_5 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_6 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_7 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_8 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_9 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n\ntypedef _typedefC_10 = ffi.Void Function(\n  ffi.Pointer<snd_pcm_scope_>,\n);\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/lib/flutter_midi_command_linux.dart",
    "content": "import 'dart:async';\nimport 'package:ffi/ffi.dart';\nimport 'dart:ffi';\nimport 'dart:isolate';\nimport 'dart:typed_data';\nimport 'package:tuple/tuple.dart';\nimport 'package:flutter_midi_command_platform_interface/flutter_midi_command_platform_interface.dart';\nimport 'alsa_generated_bindings.dart' as a;\n\nfinal alsa = a.ALSA(DynamicLibrary.open(\"libasound.so.2\"));\n\nfinal int SND_RAWMIDI_STREAM_INPUT = 1;\nfinal int SND_RAWMIDI_STREAM_OUTPUT = 0;\n\nint lengthOfMessageType(int type) {\n  int midiType = type & 0xF0;\n\n  switch (type) {\n    case 0xF6:\n    case 0xF8:\n    case 0xFA:\n    case 0xFB:\n    case 0xFC:\n    case 0xFF:\n    case 0xFE:\n      return 1;\n    case 0xF1:\n    case 0xF3:\n      return 2;\n    default:\n      break;\n  }\n\n  switch (midiType) {\n    case 0xC0:\n    case 0xD0:\n      return 2;\n    case 0xF2:\n    case 0x80:\n    case 0x90:\n    case 0xA0:\n    case 0xB0:\n    case 0xE0:\n      return 3;\n    default:\n      break;\n  }\n  return 0;\n}\n\nvoid _rxIsolate(Tuple2<SendPort, int> args) {\n  final sendPort = args.item1;\n  final Pointer<a.snd_rawmidi_> inPort = Pointer<a.snd_rawmidi_>.fromAddress(args.item2);\n\n  print(\"start isolate $sendPort, $inPort, ${args.item2}\");\n\n  int status = 0;\n  int msgLength = 0;\n  Pointer<Uint8> buffer = calloc<Uint8>();\n  List<int> rxBuffer = [];\n\n  while (true) {\n    if (inPort == null) {\n      print(\"no inport\");\n      break;\n    }\n\n    if ((status = alsa.snd_rawmidi_read(inPort, buffer.cast(), 1)) < 0) {\n      print(\"Problem reading MIDI input:${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}\");\n    } else {\n      // print(\"byte ${buffer.value}\");\n      if (rxBuffer.length == 0) {\n        msgLength = lengthOfMessageType(buffer.value);\n      }\n\n      rxBuffer.add(buffer.value);\n\n      if (rxBuffer.length == msgLength) {\n        // print(\"send buffer $rxBuffer $msgLength\");\n        sendPort.send(Uint8List.fromList(rxBuffer));\n        rxBuffer.clear();\n      }\n    }\n  }\n}\n\nclass LinuxMidiDevice extends MidiDevice {\n  Pointer<Pointer<a.snd_rawmidi_>>? outPort;\n  Pointer<Pointer<a.snd_rawmidi_>>? inPort;\n  StreamController<MidiPacket> _rxStreamCtrl;\n  Isolate? _isolate;\n\n  ReceivePort? errorPort;\n  ReceivePort? receivePort;\n\n  Pointer<a.snd_ctl_> ctl;\n  int cardId;\n  int deviceId;\n\n  LinuxMidiDevice(this.ctl, this.cardId, this.deviceId, String name, String type, this._rxStreamCtrl) : super(\"hw:$cardId,$deviceId\", name, type, false) {\n    // Fetch device info\n    Pointer<Pointer<a.snd_rawmidi_info_>> info = calloc<Pointer<a.snd_rawmidi_info_>>();\n    alsa.snd_rawmidi_info_malloc(info);\n    alsa.snd_rawmidi_info_set_device(info.value, deviceId);\n\n    int status = alsa.snd_ctl_rawmidi_info(ctl, info.value);\n    if (status < 0) {\n      print('error: cannot get device info.value ${alsa.snd_strerror(status).cast<Utf8>().toDartString()}');\n      return;\n    }\n\n    // Get input ports\n    alsa.snd_rawmidi_info_set_stream(info.value, SND_RAWMIDI_STREAM_INPUT);\n    status = alsa.snd_ctl_rawmidi_info(ctl, info.value);\n    int inCount = alsa.snd_rawmidi_info_get_subdevices_count(info.value);\n    for (var i = 0; i < inCount; i++) {\n      if (alsa.snd_rawmidi_info_get_subdevice(info.value) < 0) {\n        print(\"error: snd_rawmidi_info_get_subdevice in [$i] $status ${alsa.snd_rawmidi_info_get_subdevice_name(info.value).cast<Utf8>().toDartString()}\");\n      } else {\n        inputPorts.add(MidiPort(i, MidiPortType.IN));\n      }\n    }\n\n    // Get output ports\n    alsa.snd_rawmidi_info_set_stream(info.value, SND_RAWMIDI_STREAM_OUTPUT);\n    status = alsa.snd_ctl_rawmidi_info(ctl, info.value);\n    int outCount = alsa.snd_rawmidi_info_get_subdevices_count(info.value);\n    for (var i = 0; i < outCount; i++) {\n      if (alsa.snd_rawmidi_info_get_subdevice(info.value) < 0) {\n        print(\"error: snd_rawmidi_info_get_subdevice out [$i] $status ${alsa.snd_rawmidi_info_get_subdevice_name(info.value).cast<Utf8>().toDartString()}\");\n      } else {\n        outputPorts.add(MidiPort(i, MidiPortType.OUT));\n      }\n    }\n\n    calloc.free(info);\n  }\n\n  Future<bool> connect() async {\n    outPort = calloc<Pointer<a.snd_rawmidi_>>();\n    inPort = calloc<Pointer<a.snd_rawmidi_>>();\n\n    Pointer<Int8> name = \"hw:$cardId,$deviceId,0\".toNativeUtf8().cast<Int8>();\n    print(\"open out port ${FlutterMidiCommandLinux.stringFromNative(name)}\");\n    int status = 0;\n    if ((status = alsa.snd_rawmidi_open(inPort!, outPort!, name, a.SND_RAWMIDI_SYNC)) < 0) {\n      print('error: cannot open card number $cardId ${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}');\n      return false;\n    }\n\n    connected = true;\n\n    errorPort = new ReceivePort();\n    receivePort = ReceivePort();\n    _isolate = await Isolate.spawn(_rxIsolate, Tuple2(receivePort!.sendPort, inPort!.value.address), onError: errorPort!.sendPort).catchError((err, stackTrace) {\n      print(\"Could not launch RX isolate. $err\\nStackTrace: $stackTrace\");\n    });\n\n    errorPort?.listen((message) {\n      print('isolate error message $message');\n    });\n\n    receivePort?.listen((data) {\n      // print(\"rx data $data $_rxStreamCtrl ${_rxStreamCtrl.sink}\");\n      var packet = MidiPacket(data, DateTime.now().millisecondsSinceEpoch, this);\n      _rxStreamCtrl.add(packet);\n    });\n\n    return true;\n  }\n\n  send(Pointer<Uint8> buffer, int length) {\n    if (outPort != null) {\n      final voidBuffer = buffer.cast<Void>();\n\n      int status;\n      if ((status = alsa.snd_rawmidi_write(outPort!.value, voidBuffer, length)) < 0) {\n        print('failed to write ${alsa.snd_strerror(status).cast<Utf8>().toDartString()}');\n      }\n    } else {\n      print('outport is null');\n    }\n  }\n\n  disconnect() {\n    receivePort?.close();\n    errorPort?.close();\n    _isolate?.kill(priority: Isolate.immediate);\n    _isolate = null;\n\n    int status = 0;\n    if (outPort != null) {\n      if ((status = alsa.snd_rawmidi_drain(outPort!.value)) < 0) {\n        print('error: cannot drain out port $this ${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}');\n      }\n      if ((status = alsa.snd_rawmidi_close(outPort!.value)) < 0) {\n        print('error: cannot close out port $this ${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}');\n      }\n    }\n\n    if (inPort != null) {\n      if ((status = alsa.snd_rawmidi_drain(inPort!.value)) < 0) {\n        print('error: cannot drain in port $this ${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}');\n      }\n      if ((status = alsa.snd_rawmidi_close(inPort!.value)) < 0) {\n        print('error: cannot close in port $this ${FlutterMidiCommandLinux.stringFromNative(alsa.snd_strerror(status))}');\n      }\n    }\n    connected = false;\n  }\n}\n\nclass FlutterMidiCommandLinux extends MidiCommandPlatform {\n  StreamController<MidiPacket> _rxStreamController = StreamController<MidiPacket>.broadcast();\n  late Stream<MidiPacket> _rxStream;\n  StreamController<String> _setupStreamController = StreamController<String>.broadcast();\n  late Stream<String> _setupStream;\n\n  Map<String, LinuxMidiDevice> _connectedDevices = Map<String, LinuxMidiDevice>();\n\n  /// A constructor that allows tests to override the window object used by the plugin.\n  FlutterMidiCommandLinux() {\n    _setupStream = _setupStreamController.stream;\n    _rxStream = _rxStreamController.stream;\n  }\n\n  static String stringFromNative(Pointer<Int8> pointer) {\n    return pointer.cast<Utf8>().toDartString();\n  }\n\n  /// The linux implementation of [MidiCommandPlatform]\n  ///\n  /// This class implements the `package:flutter_midi_command_platform_interface` functionality for linux\n  static void registerWith() {\n    print(\"register FlutterMidiCommandLinux\");\n    MidiCommandPlatform.instance = FlutterMidiCommandLinux();\n  }\n\n  @override\n  Future<List<MidiDevice>> get devices async {\n    return Future.value(_printCardList());\n  }\n\n  List<MidiDevice>? _printCardList() {\n    int status;\n    var card = calloc<Int32>();\n    card.elementAt(0).value = -1;\n    // Pointer<Pointer<Int8>> longname = calloc<Pointer<Int8>>();\n    Pointer<Pointer<Int8>> shortname = calloc<Pointer<Int8>>();\n\n    List<MidiDevice> devices = [];\n\n    if ((status = alsa.snd_card_next(card)) < 0) {\n      print('error: cannot determine card number $card ${stringFromNative(alsa.snd_strerror(status))}');\n      return null;\n    }\n    // print('status $status');\n    if (card.value < 0) {\n      print('error: no sound cards found');\n      return null;\n    }\n\n    while (card.value >= 0) {\n      Pointer<Int8> name = \"hw:${card.value}\".toNativeUtf8().cast<Int8>();\n      Pointer<Pointer<a.snd_ctl_>> ctl = calloc<Pointer<a.snd_ctl_>>();\n      Pointer<Int32> device = calloc<Int32>();\n      device.elementAt(0).value = -1;\n\n      // print(\"card ${card.value}\");\n      if ((status = alsa.snd_card_get_name(card.value, shortname)) < 0) {\n        print('error: cannot determine card shortname $card ${stringFromNative(alsa.snd_strerror(status))}');\n        continue;\n      }\n\n      status = alsa.snd_ctl_open(ctl, name, 0);\n      // print(\"status after ctl_open $status ctl $ctl ctl.value ${ctl.value}\");\n      if (status < 0) {\n        print('error: cannot open control for card number $card ${stringFromNative(alsa.snd_strerror(status))}');\n        continue;\n      }\n\n      do {\n        status = alsa.snd_ctl_rawmidi_next_device(ctl.value, device);\n        // print(\"status $status device.value ${device.value}\");\n        if (status < 0) {\n          print('error: cannot determine device number ${device.value} ${stringFromNative(alsa.snd_strerror(status))}');\n          break;\n        }\n\n        if (device.value >= 0) {\n          var deviceId = \"hw:${card.value},${device.value}\";\n          if (!_connectedDevices.containsKey(deviceId)) {\n            // print(\"add unconnected device with id $deviceId\");\n            devices.add(LinuxMidiDevice(ctl.value, card.value, device.value, stringFromNative(shortname.value), \"native\", _rxStreamController));\n          }\n        }\n      } while (device.value > 0);\n\n      if ((status = alsa.snd_card_next(card)) < 0) {\n        print('error: cannot determine card number $card ${stringFromNative(alsa.snd_strerror(status))}');\n        break;\n      }\n\n      calloc.free(name);\n      calloc.free(ctl);\n      calloc.free(device);\n    }\n\n    // Add all connected devices\n    devices.addAll(_connectedDevices.values);\n\n    return devices;\n  }\n\n  /// Starts scanning for BLE MIDI devices.\n  ///\n  /// Found devices will be included in the list returned by [devices].\n  Future<void> startScanningForBluetoothDevices() async {}\n\n  /// Stops scanning for BLE MIDI devices.\n  void stopScanningForBluetoothDevices() {}\n\n  /// Connects to the device.\n  @override\n  void connectToDevice(MidiDevice device, {List<MidiPort>? ports}) {\n    print('connect to $device');\n\n    var linuxDevice = device as LinuxMidiDevice;\n    linuxDevice.connect().then((success) {\n      if (success) {\n        _connectedDevices[device.id] = device;\n        _setupStreamController.add(\"deviceConnected\");\n      } else {\n        print(\"failed to connect $linuxDevice\");\n      }\n    });\n  }\n\n  /// Disconnects from the device.\n  @override\n  void disconnectDevice(MidiDevice device, {bool remove = true}) {\n    if (_connectedDevices.containsKey(device.id)) {\n      var linuxDevice = device as LinuxMidiDevice;\n      linuxDevice.disconnect();\n      if (remove) {\n        _connectedDevices.remove(device.id);\n        _setupStreamController.add(\"deviceDisconnected\");\n      }\n    }\n  }\n\n  @override\n  void teardown() {\n    _connectedDevices.values.forEach((device) {\n      disconnectDevice(device, remove: false);\n    });\n    _connectedDevices.clear();\n    _setupStreamController.add(\"deviceDisconnected\");\n  }\n\n  /// Sends data to the currently connected device.wmidi hardware driver name\n  ///\n  /// Data is an UInt8List of individual MIDI command bytes.\n  @override\n  void sendData(Uint8List data, {int? timestamp, String? deviceId}) {\n    // print(\"send $data through buffer\");\n\n    final buffer = calloc<Uint8>(data.lengthInBytes);\n    for (var i = 0; i < data.length; i++) {\n      buffer[i] = data[i];\n    }\n    _connectedDevices.values.forEach((device) {\n      // print(\"send to $device\");\n      device.send(buffer, data.length);\n    });\n\n    calloc.free(buffer);\n  }\n\n  /// Stream firing events whenever a midi package is received.\n  ///\n  /// The event contains the raw bytes contained in the MIDI package.\n  @override\n  Stream<MidiPacket>? get onMidiDataReceived {\n    return _rxStream;\n  }\n\n  /// Stream firing events whenever a change in the MIDI setup occurs.\n  ///\n  /// For example, when a new BLE devices is discovered.\n  @override\n  Stream<String>? get onMidiSetupChanged {\n    return _setupStream;\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.10)\nset(PROJECT_NAME \"flutter_midi_command_linux\")\nproject(${PROJECT_NAME} LANGUAGES CXX)\n\nset(PLUGIN_NAME \"${PROJECT_NAME}_plugin\")\n\nadd_library(${PLUGIN_NAME} SHARED\n  \"${PLUGIN_NAME}.cc\"\n)\napply_standard_settings(${PLUGIN_NAME})\nset_target_properties(${PLUGIN_NAME} PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)\ntarget_include_directories(${PLUGIN_NAME} INTERFACE\n  \"${CMAKE_CURRENT_SOURCE_DIR}/include\")\ntarget_link_libraries(${PLUGIN_NAME} PRIVATE flutter)\ntarget_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)\n\n# List of absolute paths to libraries that should be bundled with the plugin\nset(flutter_midi_command_linux_bundled_libraries\n  \"\"\n  PARENT_SCOPE\n)\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n#include \"generated_plugin_registrant.h\"\n\n\nvoid fl_register_plugins(FlPluginRegistry* registry) {\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter_linux/flutter_linux.h>\n\n// Registers Flutter plugins.\nvoid fl_register_plugins(FlPluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/flutter_midi_command_linux_plugin.cc",
    "content": "#include \"include/flutter_midi_command_linux/flutter_midi_command_linux_plugin.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#include <gtk/gtk.h>\n#include <sys/utsname.h>\n\n#define FLUTTER_MIDI_COMMAND_LINUX_PLUGIN(obj) \\\n  (G_TYPE_CHECK_INSTANCE_CAST((obj), flutter_midi_command_linux_plugin_get_type(), \\\n                              FlutterMidiCommandLinuxPlugin))\n\nstruct _FlutterMidiCommandLinuxPlugin {\n  GObject parent_instance;\n\n  FlPluginRegistrar* registrar;\n\n  // Connection to Flutter engine.\n  FlMethodChannel* channel;\n  FIEventChannel* rxChannel;\n  FIEventChannel* setupChannel;\n};\n\nG_DEFINE_TYPE(FlutterMidiCommandLinuxPlugin, flutter_midi_command_linux_plugin, g_object_get_type())\n\n// Called when a method call is received from Flutter.\nstatic void flutter_midi_command_linux_plugin_handle_method_call(\n    FlutterMidiCommandLinuxPlugin* self,\n    FlMethodCall* method_call) {\n  g_autoptr(FlMethodResponse) response = nullptr;\n\n  const gchar* method = fl_method_call_get_name(method_call);\n\n  if (strcmp(method, \"getPlatformVersion\") == 0) {\n    struct utsname uname_data = {};\n    uname(&uname_data);\n    g_autofree gchar *version = g_strdup_printf(\"Linux %s\", uname_data.version);\n    g_autoptr(FlValue) result = fl_value_new_string(version);\n    response = FL_METHOD_RESPONSE(fl_method_success_response_new(result));\n  } else {\n    response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new());\n  }\n\n  fl_method_call_respond(method_call, response, nullptr);\n}\n\nstatic void flutter_midi_command_linux_plugin_dispose(GObject* object) {\n  G_OBJECT_CLASS(flutter_midi_command_linux_plugin_parent_class)->dispose(object);\n}\n\nstatic void flutter_midi_command_linux_plugin_class_init(FlutterMidiCommandLinuxPluginClass* klass) {\n  G_OBJECT_CLASS(klass)->dispose = flutter_midi_command_linux_plugin_dispose;\n}\n\nstatic void flutter_midi_command_linux_plugin_init(FlutterMidiCommandLinuxPlugin* self) {}\n\nstatic void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call,\n                           gpointer user_data) {\n  FlutterMidiCommandLinuxPlugin* plugin = FLUTTER_MIDI_COMMAND_LINUX_PLUGIN(user_data);\n  flutter_midi_command_linux_plugin_handle_method_call(plugin, method_call);\n}\n\nvoid flutter_midi_command_linux_plugin_register_with_registrar(FlPluginRegistrar* registrar) {\n  FlutterMidiCommandLinuxPlugin* plugin = FLUTTER_MIDI_COMMAND_LINUX_PLUGIN(\n      g_object_new(flutter_midi_command_linux_plugin_get_type(), nullptr));\n\n  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();\n  g_autoptr(FlMethodChannel) channel =\n      fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),\n                            \"plugins.invisiblewrench.com/flutter_midi_command\",\n                            FL_METHOD_CODEC(codec));\n  fl_method_channel_set_method_call_handler(channel, method_call_cb,\n                                            g_object_ref(plugin),\n                                            g_object_unref);\n\n                                            g_autoptr(FlMethodChannel) channel =\n      fl_event_channel_new(fl_plugin_registrar_get_messenger(registrar),\n                            \"plugins.invisiblewrench.com/flutter_midi_command/rx_channel\",\n                            FL_METHOD_CODEC(codec));\n\n                            g_autoptr(FlMethodChannel) channel =\n      fl_event_channel_new(fl_plugin_registrar_get_messenger(registrar),\n                            \"plugins.invisiblewrench.com/flutter_midi_command/setup_channel\",\n                            FL_METHOD_CODEC(codec));\n\n  g_object_unref(plugin);\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/linux/include/flutter_midi_command_linux/flutter_midi_command_linux_plugin.h",
    "content": "#ifndef FLUTTER_PLUGIN_FLUTTER_MIDI_COMMAND_LINUX_PLUGIN_H_\n#define FLUTTER_PLUGIN_FLUTTER_MIDI_COMMAND_LINUX_PLUGIN_H_\n\n#include <flutter_linux/flutter_linux.h>\n\nG_BEGIN_DECLS\n\n#ifdef FLUTTER_PLUGIN_IMPL\n#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility(\"default\")))\n#else\n#define FLUTTER_PLUGIN_EXPORT\n#endif\n\ntypedef struct _FlutterMidiCommandLinuxPlugin FlutterMidiCommandLinuxPlugin;\ntypedef struct {\n  GObjectClass parent_class;\n} FlutterMidiCommandLinuxPluginClass;\n\nFLUTTER_PLUGIN_EXPORT GType flutter_midi_command_linux_plugin_get_type();\n\nFLUTTER_PLUGIN_EXPORT void flutter_midi_command_linux_plugin_register_with_registrar(\n    FlPluginRegistrar* registrar);\n\nG_END_DECLS\n\n#endif  // FLUTTER_PLUGIN_FLUTTER_MIDI_COMMAND_LINUX_PLUGIN_H_\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/pubspec.yaml",
    "content": "name: flutter_midi_command_linux\ndescription: FlutterMidiCommand for Linux.\nversion: 0.1.3\nhomepage: https://github.com/InvisibleWrench/FlutterMidiCommand\npublish_to: none\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n  flutter: \">=1.20.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_midi_command_platform_interface:\n    path: ../flutter_midi_command_platform_interface-0.3.3\n  ffi: \">=1.1.2 <3.0.0\"\n  tuple: ^2.0.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  ffigen: ^2.4.0\n\nflutter:\n  plugin:\n    implements: flutter_midi_command\n    platforms:\n      linux:\n        dartPluginClass: FlutterMidiCommandLinux\n        pluginClass: none\n\nffigen:\n  name: 'ALSA'\n  output: 'lib/alsa_generated_bindings.dart'\n  headers:\n    entry-points:\n      - '/usr/include/alsa/asoundlib.h'\n  compiler-opts: '-I/usr/lib/llvm-11/include/ -L/usr/lib/llvm-11/lib/ -I/usr/local/opt/llvm/include/ -Wno-nullability-completeness'\n  structs:\n    rename:\n      '_(.*)': '$1_'\n    member-rename:\n      '.*':\n        '_(.*)': '$1_'\n  "
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_linux-0.1.3/test/flutter_midi_command_linux_test.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  const MethodChannel channel = MethodChannel('flutter_midi_command_linux');\n\n  TestWidgetsFlutterBinding.ensureInitialized();\n\n  setUp(() {\n    channel.setMockMethodCallHandler((MethodCall methodCall) async {\n      return '42';\n    });\n  });\n\n  tearDown(() {\n    channel.setMockMethodCallHandler(null);\n  });\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/.gitignore",
    "content": ".packages\npubspec.lock\n.dart_tool\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/CHANGELOG.md",
    "content": "## 0.3.3\n- Fixed device connection value on Android\n\n## 0.3.2\n- Fixed null warning\n\n## 0.3.1\n- Aligned midi ports\n\n## 0.3.0\n- Null safety\n\n## 0.2.1\n- Removed print.\n\n## 0.2.0\n- Initial release."
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/LICENSE",
    "content": "Copyright 2020 InvisibleWrench. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials provided\n      with the distribution.\n    * Neither the name of Google Inc. nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/README.md",
    "content": "# flutter_midi_command\n\nThe interface for\nA Flutter plugin for sending and receiving MIDI messages between Flutter and physical and virtual MIDI devices. \n\nWraps CoreMIDI and android.media.midi in a thin dart/flutter layer.\nWorks with USB and BLE MIDI connections on Android, and USB, network(session) and BLE MIDI connections on iOS.\n\n## Getting Started\n\nThis plugin is build using Swift and Kotlin on the native side, so make sure your project supports this.\n\nImport flutter_midi_command\n\n`import 'package:flutter_midi_command/flutter_midi_command.dart';`\n\n- Get a list of available MIDI devices by calling `MidiCommand().devices` which returns a list of `MidiDevice`\n- Start scanning for BLE MIDI devices by calling `MidiCommand().startScanningForBluetoothDevices()`\n- Connect to a specific `MidiDevice` by calling `MidiCommand.connectToDevice(selectedDevice)`\n- Stop scanning for BLE MIDI devices by calling `MidiCommand().stopScanningForBluetoothDevices()`\n- Disconnect from the current device by calling `MidiCommand.disconnectDevice()`\n- Listen for updates in the MIDI setup by subscribing to `MidiCommand().onMidiSetupChanged`\n- Listen for incoming MIDI messages on from the current device by subscribing to `MidiCommand().onMidiDataReceived`, after which the listener will recieve inbound MIDI messages as an UInt8List of variable length.\n- Send a MIDI message by calling `MidiCommand.sendData(data)`, where data is an UInt8List of bytes following the MIDI spec.\n- Or use the various `MidiCommand` subtypes to send PC, CC, NoteOn and NoteOff messsages.\n\nSee example folder for how to use.\n\nFor help getting started with Flutter, view our online\n[documentation](https://flutter.io/).\n\nFor help on editing plugin code, view the [documentation](https://flutter.io/developing-packages/#edit-plugin-package).\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/lib/flutter_midi_command_platform_interface.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:flutter_midi_command_platform_interface/midi_device.dart';\nimport 'package:flutter_midi_command_platform_interface/midi_packet.dart';\nimport 'package:flutter_midi_command_platform_interface/midi_port.dart';\nimport 'package:plugin_platform_interface/plugin_platform_interface.dart';\nimport 'method_channel_midi_command.dart';\n\nexport 'package:flutter_midi_command_platform_interface/midi_device.dart';\nexport 'package:flutter_midi_command_platform_interface/midi_packet.dart';\nexport 'package:flutter_midi_command_platform_interface/midi_port.dart';\n\nabstract class MidiCommandPlatform extends PlatformInterface {\n  /// Constructs a MidiCommandPlatform.\n  MidiCommandPlatform() : super(token: _token);\n\n  static final Object _token = Object();\n\n  static MidiCommandPlatform _instance = MethodChannelMidiCommand();\n\n  /// The default instance of [MidiCommandPlatform] to use.\n  ///\n  /// Defaults to [MethodChannelMidiCommand].\n  static MidiCommandPlatform get instance => _instance;\n\n  /// Platform-specific plugins should set this with their own platform-specific\n  /// class that extends [MidiCommandPlatform] when they register themselves.\n  static set instance(MidiCommandPlatform instance) {\n    PlatformInterface.verifyToken(instance, _token);\n    _instance = instance;\n  }\n\n  /// Returns a list of found MIDI devices.\n  Future<List<MidiDevice>?> get devices async {\n    throw UnimplementedError('get devices has not been implemented.');\n  }\n\n  /// Starts scanning for BLE MIDI devices.\n  ///\n  /// Found devices will be included in the list returned by [devices].\n  Future<void> startScanningForBluetoothDevices() async {\n    throw UnimplementedError('startScanningForBluetoothDevices() has not been implemented.');\n  }\n\n  /// Stops scanning for BLE MIDI devices.\n  void stopScanningForBluetoothDevices() {\n    throw UnimplementedError('stopScanningForBluetoothDevices() has not been implemented.');\n  }\n\n  /// Connects to the device.\n  void connectToDevice(MidiDevice device, {List<MidiPort>? ports}) {\n    throw UnimplementedError('connectToDevice() has not been implemented.');\n  }\n\n  /// Disconnects from the device.\n  void disconnectDevice(MidiDevice device) {\n    throw UnimplementedError('disconnectDevice() has not been implemented.');\n  }\n\n  /// Disconnects from all devices.\n  void teardown() {\n    throw UnimplementedError('teardown() has not been implemented.');\n  }\n\n  /// Sends data to the currently connected device.\n  ///\n  /// Data is an UInt8List of individual MIDI command bytes.\n  void sendData(Uint8List data, {int? timestamp, String? deviceId}) {\n    throw UnimplementedError('sendData() has not been implemented.');\n  }\n\n  Stream<MidiPacket>? get onMidiDataReceived {\n    throw UnimplementedError('get onMidiDataReceived has not been implemented.');\n  }\n\n  /// Stream firing events whenever a change in the MIDI setup occurs.\n  ///\n  /// For example, when a new BLE devices is discovered.\n  Stream<String>? get onMidiSetupChanged {\n    throw UnimplementedError('get onMidiSetupChanged has not been implemented.');\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/lib/method_channel_midi_command.dart",
    "content": "import 'dart:async';\nimport 'package:flutter/services.dart';\nimport 'flutter_midi_command_platform_interface.dart';\n\nconst MethodChannel _methodChannel =\n    MethodChannel('plugins.invisiblewrench.com/flutter_midi_command');\nconst EventChannel _rxChannel =\n    EventChannel('plugins.invisiblewrench.com/flutter_midi_command/rx_channel');\nconst EventChannel _setupChannel = EventChannel(\n    'plugins.invisiblewrench.com/flutter_midi_command/setup_channel');\n\n/// An implementation of [MidiCommandPlatform] that uses method channels.\nclass MethodChannelMidiCommand extends MidiCommandPlatform {\n  Stream<MidiPacket>? _rxStream;\n  Stream<String>? _setupStream;\n\n  /// Returns a list of found MIDI devices.\n  @override\n  Future<List<MidiDevice>?> get devices async {\n    var devs = await _methodChannel.invokeMethod('getDevices');\n    return devs.map<MidiDevice>((m) {\n      var map = m.cast<String, Object>();\n      var dev = MidiDevice(map[\"id\"].toString(), map[\"name\"], map[\"type\"],\n          map[\"connected\"] == \"true\");\n      dev.inputPorts = _portsFromDevice(map[\"inputs\"], MidiPortType.IN);\n      dev.outputPorts = _portsFromDevice(map[\"outputs\"], MidiPortType.OUT);\n      return dev;\n    }).toList();\n  }\n\n  List<MidiPort> _portsFromDevice(List<dynamic>? portList, MidiPortType type) {\n    if (portList == null) return [];\n    var ports = portList.map<MidiPort>((e) {\n      var portMap = (e as Map).cast<String, Object>();\n      return MidiPort(portMap[\"id\"] as int, type);\n    });\n    return ports.toList(growable: false);\n  }\n\n  /// Starts scanning for BLE MIDI devices.\n  ///\n  /// Found devices will be included in the list returned by [devices].\n  @override\n  Future<void> startScanningForBluetoothDevices() async {\n    try {\n      await _methodChannel.invokeMethod('scanForDevices');\n    } on PlatformException catch (e) {\n      throw e.message!;\n    }\n  }\n\n  /// Stops scanning for BLE MIDI devices.\n  @override\n  void stopScanningForBluetoothDevices() {\n    _methodChannel.invokeMethod('stopScanForDevices');\n  }\n\n  /// Connects to the device.\n  @override\n  void connectToDevice(MidiDevice device, {List<MidiPort>? ports}) {\n    _methodChannel.invokeMethod(\n        'connectToDevice', {\"device\": device.toDictionary, \"ports\": ports});\n  }\n\n  /// Disconnects from the device.\n  @override\n  void disconnectDevice(MidiDevice device) {\n    _methodChannel.invokeMethod('disconnectDevice', device.toDictionary);\n  }\n\n  /// Disconnects from all devices.\n  @override\n  void teardown() {\n    _methodChannel.invokeMethod('teardown');\n  }\n\n  /// Sends data to the currently connected device.\n  ///\n  /// Data is an UInt8List of individual MIDI command bytes.\n  @override\n  void sendData(Uint8List data, {int? timestamp, String? deviceId}) {\n    // print(\"send $data through method channel\");\n    _methodChannel.invokeMethod('sendData',\n        {\"data\": data, \"timestamp\": timestamp, \"deviceId\": deviceId});\n  }\n\n  /// Stream firing events whenever a midi package is received.\n  ///\n  /// The event contains the raw bytes contained in the MIDI package.\n  @override\n  Stream<MidiPacket>? get onMidiDataReceived {\n    // print(\"get on midi data\");\n    _rxStream ??= _rxChannel.receiveBroadcastStream().map<MidiPacket>((d) {\n      var dd = d[\"device\"];\n      // print(\"device data $dd\");\n      var device =\n          MidiDevice(dd['id'], dd[\"name\"], dd[\"type\"], dd[\"connected\"] ?? true);\n      return MidiPacket(Uint8List.fromList(List<int>.from(d[\"data\"])),\n          d[\"timestamp\"] as int, device);\n    });\n    return _rxStream;\n  }\n\n  /// Stream firing events whenever a change in the MIDI setup occurs.\n  ///\n  /// For example, when a new BLE devices is discovered.\n  @override\n  Stream<String>? get onMidiSetupChanged {\n    _setupStream ??= _setupChannel.receiveBroadcastStream().cast<String>();\n    return _setupStream;\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/lib/midi_device.dart",
    "content": "import 'package:flutter_midi_command_platform_interface/midi_port.dart';\n\nclass MidiDevice {\n  String name;\n  String id;\n  String type;\n  List<MidiPort> inputPorts = [];\n  List<MidiPort> outputPorts = [];\n  bool connected;\n\n  MidiDevice(this.id, this.name, this.type, this.connected);\n\n  Map<String, Object> get toDictionary {\n    return {\n      \"name\": name,\n      \"id\": id,\n      \"type\": type,\n      \"connected\": connected,\n    };\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/lib/midi_packet.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:flutter_midi_command_platform_interface/flutter_midi_command_platform_interface.dart';\n\nclass MidiPacket {\n  int timestamp;\n  Uint8List data;\n  MidiDevice device;\n\n  MidiPacket(this.data, this.timestamp, this.device);\n\n  Map<String, Object> get toDictionary {\n    return {\"data\": data, \"timestamp\": timestamp, \"sender\": device.toDictionary};\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/lib/midi_port.dart",
    "content": "enum MidiPortType { IN, OUT }\n\nclass MidiPort {\n  MidiPortType type;\n  int id;\n  bool connected = false;\n\n  MidiPort(this.id, this.type);\n\n  Map<String, Object> get toDictionary {\n    return {\"id\": id, \"type\": type.toString(), \"connected\": connected};\n  }\n}\n"
  },
  {
    "path": "plugins/flutter_midi_command/flutter_midi_command_platform_interface-0.3.3/pubspec.yaml",
    "content": "name: flutter_midi_command_platform_interface\ndescription: A common platform interface for the FlutterMidiCommand plugin.\nversion: 0.3.3\nhomepage: https://github.com/InvisibleWrench/FlutterMidiCommand\n\nenvironment:\n  sdk: '>=2.12.0 <3.0.0'\n  flutter: \">=1.20.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  plugin_platform_interface: ^2.0.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter"
  },
  {
    "path": "plugins/mighty_ble/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.\n/pubspec.lock\n**/doc/api/\n.dart_tool/\n.packages\nbuild/\n"
  },
  {
    "path": "plugins/mighty_ble/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled.\n\nversion:\n  revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n  channel: stable\n\nproject_type: plugin\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n      base_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n    - platform: android\n      create_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n      base_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n    - platform: ios\n      create_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n      base_revision: e99c9c7cd9f6c0b2f8ae6e3ebfd585239f5568f4\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "plugins/mighty_ble/CHANGELOG.md",
    "content": "## 0.0.1\n\n* TODO: Describe initial release.\n"
  },
  {
    "path": "plugins/mighty_ble/LICENSE",
    "content": "TODO: Add your license here.\n"
  },
  {
    "path": "plugins/mighty_ble/README.md",
    "content": "# mighty_ble\n\nA new Flutter plugin project.\n\n## Getting Started\n\nThis project is a starting point for a Flutter\n[plug-in package](https://flutter.dev/developing-packages/),\na specialized package that includes platform-specific implementation code for\nAndroid and/or iOS.\n\nFor help getting started with Flutter development, view the\n[online documentation](https://flutter.dev/docs), which offers tutorials,\nsamples, guidance on mobile development, and a full API reference.\n\n"
  },
  {
    "path": "plugins/mighty_ble/analysis_options.yaml",
    "content": "include: package:flutter_lints/flutter.yaml\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "plugins/mighty_ble/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.cxx\n"
  },
  {
    "path": "plugins/mighty_ble/android/build.gradle",
    "content": "group 'com.tuntori.mighty_ble'\nversion '1.0'\n\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:7.1.2'\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 34\n    namespace 'com.tuntori.mighty_ble'\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        minSdkVersion 16\n    }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/android/settings.gradle",
    "content": "rootProject.name = 'mighty_ble'\n"
  },
  {
    "path": "plugins/mighty_ble/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.tuntori.mighty_ble\">\n</manifest>\n"
  },
  {
    "path": "plugins/mighty_ble/android/src/main/java/com/tuntori/mighty_ble/BLEManager.java",
    "content": "package com.tuntori.mighty_ble;\n\nimport android.bluetooth.BluetoothAdapter;\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothGatt;\nimport android.bluetooth.BluetoothGattCallback;\nimport android.bluetooth.BluetoothGattCharacteristic;\nimport android.bluetooth.BluetoothGattDescriptor;\nimport android.bluetooth.BluetoothGattService;\nimport android.bluetooth.BluetoothManager;\nimport android.bluetooth.BluetoothStatusCodes;\nimport android.bluetooth.le.BluetoothLeScanner;\nimport android.bluetooth.le.ScanCallback;\nimport android.bluetooth.le.ScanResult;\nimport android.bluetooth.le.ScanRecord;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\nimport android.os.ParcelUuid;\nimport android.os.Build;\nimport android.util.Log;\n\nimport java.util.List;\nimport java.util.HashMap;\nimport java.util.Queue;\nimport java.util.UUID;\nimport java.util.LinkedList;\n\n\npublic class BLEManager {\n    private static final String TAG = \"BLEManager\";\n\n    // UUIDs for the service and characteristics we are interested in\n    private static final UUID MIDI_SERVICE_UUID = UUID.fromString(\"03b80e5a-ede8-4b33-a751-6ce34ec4c700\");\n    private static final UUID MIDI_CHARACTERISTIC_UUID = UUID.fromString(\"7772e5db-3868-4112-a1a9-f2669d106bf3\");\n\n    // Request code for enabling Bluetooth\n    private static final int REQUEST_ENABLE_BT = 1;\n\n    //a hashmap containing result from a scan, a pair of mac addr and device\n    private final HashMap<String, BluetoothDevice> mScanResults = new HashMap<>();\n\n    //a hashmap containing the connected devices\n    private final HashMap<String, BluetoothGatt> mConnectedDevices = new HashMap<>();\n\n    //a hashmap containing the midi characteristics\n    private final HashMap<String, BluetoothGattCharacteristic> mCharacteristics = new HashMap<>();\n    \n    private final Queue<byte[]> mWriteQueue = new LinkedList<byte[]>();\n    private boolean mIsWriting = false;\n\n    private Context context;\n    private MightyBlePlugin pluginHandler;\n\n    private BluetoothAdapter mBluetoothAdapter;\n    private BluetoothLeScanner mBluetoothLeScanner;\n\n    private boolean mScanning = false;\n\n    public BLEManager(Context context, MightyBlePlugin pluginHandler)\n    {\n        this.context = context;\n        this.pluginHandler = pluginHandler;\n    }\n\n    public void init()\n    {\n        final BluetoothManager bluetoothManager =\n                (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);\n        mBluetoothAdapter = bluetoothManager.getAdapter();\n\n        // Initialize the Bluetooth LE scanner\n        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();\n    }\n\n    public boolean isAvailable()\n    {\n        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);\n    }\n\n    public void startScan() {\n        if (mScanning)\n            return;\n\n        mScanning = true;\n        mScanResults.clear();\n        \n        // Start scanning for devices\n        mBluetoothLeScanner.startScan(mScanCallback);\n    }\n\n    public void stopScan() {\n        if (!mScanning)\n            return;\n\n        mScanning = false;\n        mBluetoothLeScanner.stopScan(mScanCallback);\n    }\n\n    public void connect(String address) {\n        stopScan();\n\n        if (mScanResults.containsKey(address))\n        {\n            BluetoothDevice device = mScanResults.get(address);\n            device.connectGatt(context, false, mGattCallback);\n        }\n    }\n\n    public void disconnect(String address) {\n        if (mConnectedDevices.containsKey(address)) {\n            BluetoothGatt gatt = mConnectedDevices.get(address);\n            mIsWriting = false;\n            mWriteQueue.clear();\n            if (gatt != null) {\n                gatt.disconnect();\n                gatt.close();\n            }\n            mConnectedDevices.remove(address);\n            mCharacteristics.remove(address);\n        }\n    }\n\n    public void setNotificationEnabled(String address, boolean enabled)\n    {\n        if (!mConnectedDevices.containsKey(address) ||\n         !mCharacteristics.containsKey(address))\n         {\n            Log.w(TAG, \"conn dev \" + mConnectedDevices.containsKey(address) +\n                 \" chars \" + mCharacteristics.containsKey(address));\n            return;\n         }\n\n        BluetoothGatt gatt = mConnectedDevices.get(address);\n        BluetoothGattCharacteristic characteristic = mCharacteristics.get(address);\n        gatt.setCharacteristicNotification(characteristic, enabled);\n    }\n    \n    public int write(String address, byte[] data) {\n        \n        if (!mConnectedDevices.containsKey(address) ||\n         !mCharacteristics.containsKey(address))\n         {\n            Log.w(TAG, \"conn dev \" + mConnectedDevices.containsKey(address) +\n                 \" chars \" + mCharacteristics.containsKey(address));\n            return 0;\n         }\n\n        synchronized (this) {\n            if (mIsWriting) {\n                mWriteQueue.add(data);\n                return 0;\n            }\n            mIsWriting = true;\n        }\n\n        BluetoothGatt gatt = mConnectedDevices.get(address);\n        BluetoothGattCharacteristic characteristic = mCharacteristics.get(address);\n        \n        writeNext(gatt, characteristic, data);\n\n        // if (mConnectedDevices.containsKey(address) &&\n        //  mCharacteristics.containsKey(address)){\n        //     BluetoothGatt gatt = mConnectedDevices.get(address);\n        //     BluetoothGattCharacteristic characteristic = mCharacteristics.get(address);\n        //     mWriteQueue.add(data);\n        //     writeNext(gatt, characteristic);\n        // }\n        // else {\n            \n        // }\n        return 0;\n    }\n\n    private int writeNext(BluetoothGatt gatt, \n                BluetoothGattCharacteristic characteristic, byte[] value) {\n        // if (mIsWriting || mWriteQueue.isEmpty()) {\n        //     if (mWriteQueue.isEmpty())\n        //         Log.d(TAG, \"Queue exhausted.\");\n        //     return 0;\n        // }\n        \n        // mIsWriting = true;\n        // byte[] value = mWriteQueue.poll();\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)\n        {\n            int success = gatt.writeCharacteristic(characteristic, value, BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);\n            if (success != BluetoothStatusCodes.SUCCESS) {\n                Log.d(TAG, \"writeCharacteristic failed with value \" + success);\n            }\n            return 0;\n        }\n        \n        //legacy code (< 33) here\n        characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);\n\n        boolean success = characteristic.setValue(value);\n        if (!success) {\n            Log.d(TAG, \"SetValue failed\");\n            return 1;\n        }\n        success = gatt.writeCharacteristic(characteristic);\n        if (!success) {\n            Log.d(TAG, \"writeCharacteristic failed\");\n        }\n        return 0;\n\n        // int errcode = mBluetoothGatt.writeCharacteristic (midiCharacteristic, \n        //                     data, \n        //                     BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);\n        //return errcode;\n    }\n\n    // Callback for receiving BLE scan results\n    private ScanCallback mScanCallback = new ScanCallback() {\n        @Override\n        public void onScanResult(int callbackType, ScanResult result) {\n            Log.d(TAG, \"onScanResult: \" + result.getDevice().getAddress());\n\n            // Check if the device name matches the name of the device we are looking for\n            if (result.getDevice().getName()!=null) {\n                boolean hasMidiService = false;\n                //check if it contains the midi service id\n                ScanRecord scanRecord = result.getScanRecord();\n                List<ParcelUuid> serviceUuids = scanRecord.getServiceUuids();\n                \n                // Convert UUID to ParcelUuid\n                ParcelUuid midiParcelUuid = ParcelUuid.fromString(MIDI_SERVICE_UUID.toString());\n\n                if (serviceUuids.contains(midiParcelUuid)) {\n                    hasMidiService = true;\n                }\n\n                String address = result.getDevice().getAddress();\n                //add to result list\n                if (!mScanResults.containsKey(address))\n                mScanResults.put(address, result.getDevice());\n\n                //notify about result\n                pluginHandler.onScanResult(result.getDevice().getName(), address, hasMidiService);\n            }\n        }\n    };\n\n    // Callback for receiving GATT events\n    private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {\n        @Override\n        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {\n            if (newState == BluetoothGatt.STATE_CONNECTED) {\n                Log.d(TAG, \"Connected to GATT server.\");\n                \n                // Discover services\n                gatt.discoverServices();\n            } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {\n                Log.d(TAG, \"Disconnected from GATT server.\");\n\n                String address = gatt.getDevice().getAddress();\n                mConnectedDevices.remove(address);\n\n                if (mCharacteristics.containsKey(address))\n                    mCharacteristics.remove(address);\n\n                //notify about the disconnect\n                pluginHandler.onDisconnected(address);\n            }\n        }\n\n        @Override\n        public void onServicesDiscovered(BluetoothGatt gatt, int status) {\n            if (status == BluetoothGatt.GATT_SUCCESS) {\n                Log.d(TAG, \"Services discovered.\");\n\n                // Get the service we are interested in\n                BluetoothGattService service = gatt.getService(MIDI_SERVICE_UUID);\n                if (service != null) {\n                    // Get the characteristic we are interested in\n                    BluetoothGattCharacteristic characteristic = service.getCharacteristic(MIDI_CHARACTERISTIC_UUID);\n                    if (characteristic != null) {\n                        // Enable notifications for the characteristic\n                        gatt.setCharacteristicNotification(characteristic, true);\n                        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(\n                                UUID.fromString(\"00002902-0000-1000-8000-00805f9b34fb\"));\n\n                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)\n                        {\n                            gatt.writeDescriptor(descriptor, BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);\n                        }\n                        else {\n                            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);\n                            gatt.writeDescriptor(descriptor);\n                        }\n                        \n\n                        //store in connected devices\n                        String address = gatt.getDevice().getAddress();\n                        mConnectedDevices.put(address, gatt);\n\n                        mCharacteristics.put(address, characteristic);\n\n                        //notify about the successful connection\n                        pluginHandler.onConnected(address);\n                    }\n                }\n            } else {\n                Log.w(TAG, \"onServicesDiscovered received: \" + status);\n            }\n        }\n\n        @Override\n        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {\n            // We received a notification for the characteristic we are interested in\n            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n                String address = gatt.getDevice().getAddress();\n                byte[] value = characteristic.getValue();\n                //Log.d(TAG, \"Received notification: \" + bytesToHex( value ));\n                pluginHandler.onCharacteristicNotify(address, value);\n            }\n        }\n\n        @Override\n        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, byte[] value) {\n            // We received a notification for the characteristic we are interested in\n            String address = gatt.getDevice().getAddress();\n            pluginHandler.onCharacteristicNotify(address, value);\n        }\n        \n        @Override\n        public void onCharacteristicWrite (BluetoothGatt gatt, \n                BluetoothGattCharacteristic characteristic, \n                int status)\n        {\n            Log.e(TAG, \"Characteristic write \" + status);\n            // mIsWriting = false;\n            // writeNext(gatt, characteristic);\n\n            byte[] message;\n            synchronized (this) {\n                if (mWriteQueue.isEmpty()) {\n                    mIsWriting = false;\n                    return;\n                }\n                message = mWriteQueue.poll();\n            }\n            writeNext(gatt, characteristic, message);\n\n        }\n    };\n}"
  },
  {
    "path": "plugins/mighty_ble/android/src/main/java/com/tuntori/mighty_ble/MightyBlePlugin.java",
    "content": "package com.tuntori.mighty_ble;\n\nimport androidx.annotation.NonNull;\nimport android.content.Context;\nimport android.app.Activity;\nimport android.util.Log;\n\nimport java.util.HashMap;\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin;\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware;\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;\nimport io.flutter.plugin.common.MethodCall;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler;\nimport io.flutter.plugin.common.MethodChannel.Result;\n\n/** MightyBlePlugin */\npublic class MightyBlePlugin implements FlutterPlugin, MethodCallHandler, ActivityAware  {\n\n  private static final String TAG = \"MBLEPlugin\";\n\n  /// The MethodChannel that will the communication between Flutter and native Android\n  ///\n  /// This local reference serves to register the plugin with the Flutter Engine and unregister it\n  /// when the Flutter Engine is detached from the Activity\n  private MethodChannel channel;\n  private Context context;\n\n  @NonNull\n  private Activity activity;\n\n  private BLEManager bleManager;\n\n  @Override\n  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {\n    context = flutterPluginBinding.getApplicationContext();\n    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), \"mighty_ble\");\n    channel.setMethodCallHandler(this);\n\n    bleManager = new BLEManager(context, this);\n  }\n\n  @Override\n  public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) {\n    activity = activityPluginBinding.getActivity();\n  }\n\n  @Override\n  public void onDetachedFromActivityForConfigChanges() {\n    // TODO: the Activity your plugin was attached to was\n    // destroyed to change configuration.\n    // This call will be followed by onReattachedToActivityForConfigChanges().\n  }\n\n  @Override\n  public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) {\n    // TODO: your plugin is now attached to a new Activity\n    // after a configuration change.\n  }\n\n  @Override\n  public void onDetachedFromActivity() {\n    // TODO: your plugin is no longer associated with an Activity.\n    // Clean up references.\n  }\n\n  @Override\n  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {\n    if (call.method.equals(\"getPlatformVersion\")) {\n      result.success(\"Android \" + android.os.Build.VERSION.RELEASE);\n    }\n    else if(call.method.equals(\"initBle\")) {\n      bleManager.init();\n      result.success(null);\n    }\n    else if (call.method.equals(\"isAvailable\"))\n      result.success(bleManager.isAvailable());\n    else if (call.method.equals(\"startScan\")) {\n      bleManager.startScan();\n      result.success(null);\n    }\n    else if (call.method.equals(\"stopScan\")) {\n      bleManager.stopScan();\n      result.success(null);\n    }\n    else if (call.method.equals(\"connect\")) {\n      String address = call.arguments();\n      bleManager.connect(address);\n    }\n    else if (call.method.equals(\"disconnect\")) {\n      String address = call.arguments();\n      bleManager.disconnect(address);\n    }\n    else if (call.method.equals(\"write\")) {\n        String address = call.argument(\"id\");\n        byte[] data = call.argument(\"value\");\n        Log.i(TAG, \"writing: address \" + address + \" data \" + data);\n        int r = bleManager.write(address, data);\n        result.success(r);\n    }\n    else if (call.method.equals(\"setNotificationEnabled\")) {\n      String address = call.argument(\"id\");\n      boolean enabled = call.argument(\"enabled\");\n      bleManager.setNotificationEnabled(address, enabled);\n    }\n    else {\n      result.notImplemented();\n    }\n  }\n\n  @Override\n  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {\n    channel.setMethodCallHandler(null);\n  }\n\n  public void onScanResult(String name, String address, boolean hasMidiService)\n  {\n    HashMap<String, Object> resultData = new HashMap<>();\n\n    resultData.put(\"name\", name);\n    resultData.put(\"id\", address);\n    resultData.put(\"hasMidiService\", hasMidiService);\n    channel.invokeMethod(\"onScanResult\", resultData);\n  }\n\n  public void onConnected(String address)\n  {\n    activity.runOnUiThread(() -> {\n      channel.invokeMethod(\"onConnected\", address);\n    });\n    \n  }\n\n  public void onDisconnected(String address)\n  {\n    activity.runOnUiThread(() -> {\n      channel.invokeMethod(\"onDisconnected\", address);\n    });\n  }\n\n  public void onCharacteristicNotify(String address, byte[] data)\n  {\n    HashMap<String, Object> arguments = new HashMap<>();\n    arguments.put(\"id\", address);\n    arguments.put(\"value\", data);\n\n    Log.i(TAG, \"Characteristic notify \" + address + \" data \" + data);\n    activity.runOnUiThread(() -> {\n      channel.invokeMethod(\"onCharacteristicNotify\", arguments);\n    });\n  }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/ephemeral/\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "plugins/mighty_ble/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/mighty_ble/ios/Classes/MightyBlePlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface MightyBlePlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/mighty_ble/ios/Classes/MightyBlePlugin.m",
    "content": "#import \"MightyBlePlugin.h\"\n#if __has_include(<mighty_ble/mighty_ble-Swift.h>)\n#import <mighty_ble/mighty_ble-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"mighty_ble-Swift.h\"\n#endif\n\n@implementation MightyBlePlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftMightyBlePlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "plugins/mighty_ble/ios/Classes/SwiftMightyBlePlugin.swift",
    "content": "import Flutter\nimport UIKit\n\npublic class SwiftMightyBlePlugin: NSObject, FlutterPlugin {\n  public static func register(with registrar: FlutterPluginRegistrar) {\n    let channel = FlutterMethodChannel(name: \"mighty_ble\", binaryMessenger: registrar.messenger())\n    let instance = SwiftMightyBlePlugin()\n    registrar.addMethodCallDelegate(instance, channel: channel)\n  }\n\n  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n    result(\"iOS \" + UIDevice.current.systemVersion)\n  }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/ios/mighty_ble.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint mighty_ble.podspec` to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'mighty_ble'\n  s.version          = '0.0.1'\n  s.summary          = 'A new Flutter plugin project.'\n  s.description      = <<-DESC\nA new Flutter plugin project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.dependency 'Flutter'\n  s.platform = :ios, '9.0'\n\n  # Flutter.framework does not contain a i386 slice.\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }\n  s.swift_version = '5.0'\nend\n"
  },
  {
    "path": "plugins/mighty_ble/lib/mighty_ble.dart",
    "content": "import 'mighty_ble_platform_interface.dart';\n\nenum DeviceConnectState { connected, disconnected }\n\nclass ScanResult {\n  String id;\n  String name;\n  bool hasMidiService;\n  ScanResult(this.id, this.name, this.hasMidiService);\n}\n\nclass MightyBle {\n  Stream<List<ScanResult>> get scanResults =>\n      MightyBlePlatform.instance.scanResults;\n\n  Stream<bool> get scanStatus => MightyBlePlatform.instance.scanStatus;\n\n  Stream<String> get onConnect => MightyBlePlatform.instance.onConnect;\n  Stream<String> get onDisconnect => MightyBlePlatform.instance.onDisconnect;\n\n  Future<String?> getPlatformVersion() {\n    return MightyBlePlatform.instance.getPlatformVersion();\n  }\n\n  Future init() {\n    return MightyBlePlatform.instance.init();\n  }\n\n  Future<bool> isAvailable() {\n    return MightyBlePlatform.instance.isAvailable();\n  }\n\n  Future startScan() {\n    return MightyBlePlatform.instance.startScan();\n  }\n\n  Future stopScan() {\n    return MightyBlePlatform.instance.stopScan();\n  }\n\n  Future connect(String id) {\n    return MightyBlePlatform.instance.connect(id);\n  }\n\n  Future disconnect(String id) {\n    return MightyBlePlatform.instance.disconnect(id);\n  }\n\n  Future setNotificationEnabled(String id, bool enabled) async {\n    return MightyBlePlatform.instance.setNotificationEnabled(id, enabled);\n  }\n\n  Future<int> writeBle(String id, List<int> byteArray) {\n    return MightyBlePlatform.instance.writeBle(id, byteArray);\n  }\n\n  void setNotifyCallback(\n      Function(String address, List<int> data) notifyCallback) {\n    MightyBlePlatform.instance.setNotifyCallback(notifyCallback);\n  }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/lib/mighty_ble_method_channel.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\n\nimport 'mighty_ble.dart';\nimport 'mighty_ble_platform_interface.dart';\n\n/// An implementation of [MightyBlePlatform] that uses method channels.\nclass MethodChannelMightyBle extends MightyBlePlatform {\n  /// The method channel used to interact with the native platform.\n  @visibleForTesting\n  final methodChannel = const MethodChannel('mighty_ble');\n\n  final StreamController<List<ScanResult>> _scanResults = StreamController();\n\n  Function(String address, List<int> data)? _notifyCallback;\n\n  @override\n  Stream<List<ScanResult>> get scanResults => _scanResults.stream;\n\n  final StreamController<bool> _scanStatus = StreamController();\n\n  @override\n  Stream<bool> get scanStatus => _scanStatus.stream;\n\n  final StreamController<String> _onConnect = StreamController();\n\n  @override\n  Stream<String> get onConnect => _onConnect.stream;\n\n  final StreamController<String> _onDisconnect = StreamController();\n\n  @override\n  Stream<String> get onDisconnect => _onDisconnect.stream;\n\n  MethodChannelMightyBle() {\n    methodChannel.setMethodCallHandler(methodHandler); // set method handler\n  }\n\n  @override\n  Future<String?> getPlatformVersion() async {\n    final version =\n        await methodChannel.invokeMethod<String>('getPlatformVersion');\n    return version;\n  }\n\n  @override\n  Future init() async {\n    await methodChannel.invokeMethod(\"initBle\");\n  }\n\n  @override\n  Future<bool> isAvailable() async {\n    return await methodChannel.invokeMethod(\"isAvailable\");\n  }\n\n  @override\n  Future startScan() async {\n    await methodChannel.invokeMethod(\"startScan\");\n    _scanStatus.add(true);\n  }\n\n  @override\n  Future stopScan() async {\n    await methodChannel.invokeMethod(\"stopScan\");\n    _scanStatus.add(false);\n  }\n\n  @override\n  Future connect(String id) async {\n    _scanStatus.add(false);\n    await methodChannel.invokeMethod(\"connect\", id);\n  }\n\n  @override\n  Future disconnect(String id) async {\n    await methodChannel.invokeMethod(\"disconnect\", id);\n  }\n\n  @override\n  Future setNotificationEnabled(String id, bool enabled) async {\n    var args = {\"id\": id, \"enabled\": enabled};\n    return await methodChannel.invokeMethod(\"setNotificationEnabled\", args);\n  }\n\n  @override\n  Future<int> writeBle(String id, List<int> byteArray) async {\n    var args = {\"id\": id, \"value\": Uint8List.fromList(byteArray)};\n    return await methodChannel.invokeMethod(\"write\", args);\n  }\n\n  @override\n  void setNotifyCallback(\n      Function(String address, List<int> data) notifyCallback) {\n    _notifyCallback = notifyCallback;\n  }\n\n  Future<void> methodHandler(MethodCall call) async {\n    switch (call.method) {\n      case \"onScanResult\":\n        var result = call.arguments;\n        ScanResult sr =\n            ScanResult(result['id'], result['name'], result['hasMidiService']);\n\n        //todo: stupid\n        _scanResults.add([sr]);\n        break;\n      case \"onConnected\":\n        print(\"Flutter: on connected ${call.arguments}\");\n        _onConnect.add(call.arguments.toString());\n        break;\n      case \"onDisconnected\":\n        print(\"Flutter: on disconnected ${call.arguments}\");\n        _onDisconnect.add(call.arguments.toString());\n        break;\n      case \"onCharacteristicNotify\":\n        var result = call.arguments;\n        var id = result['id'];\n        Uint8List value = result['value'];\n        _notifyCallback?.call(id, value.toList());\n        break;\n      default:\n        print('no method handler for method ${call.method}');\n    }\n  }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/lib/mighty_ble_platform_interface.dart",
    "content": "import 'dart:async';\n\nimport 'package:plugin_platform_interface/plugin_platform_interface.dart';\nimport 'mighty_ble.dart';\nimport 'mighty_ble_method_channel.dart';\n\nabstract class MightyBlePlatform extends PlatformInterface {\n  /// Constructs a MightyBlePlatform.\n  MightyBlePlatform() : super(token: _token);\n\n  Stream<bool> get scanStatus;\n  Stream<List<ScanResult>> get scanResults;\n  Stream<String> get onConnect;\n  Stream<String> get onDisconnect;\n\n  static final Object _token = Object();\n\n  static MightyBlePlatform _instance = MethodChannelMightyBle();\n\n  /// The default instance of [MightyBlePlatform] to use.\n  ///\n  /// Defaults to [MethodChannelMightyBle].\n  static MightyBlePlatform get instance => _instance;\n\n  /// Platform-specific implementations should set this with their own\n  /// platform-specific class that extends [MightyBlePlatform] when\n  /// they register themselves.\n  static set instance(MightyBlePlatform instance) {\n    PlatformInterface.verifyToken(instance, _token);\n    _instance = instance;\n  }\n\n  Future<String?> getPlatformVersion() {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future init() {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future<bool> isAvailable() {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future startScan() {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future stopScan() {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future connect(String id) {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future disconnect(String id) {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  Future setNotificationEnabled(String id, bool enabled) {\n    throw UnimplementedError(\n        'setNotificationEnabled() has not been implemented.');\n  }\n\n  Future<int> writeBle(String id, List<int> byteArray) {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n\n  void setNotifyCallback(\n      Function(String address, List<int> data) notifyCallback) {\n    throw UnimplementedError('platformVersion() has not been implemented.');\n  }\n}\n"
  },
  {
    "path": "plugins/mighty_ble/pubspec.yaml",
    "content": "name: mighty_ble\ndescription: A simple BLE plugin to be used with Mightier Amp\nversion: 1.0.0\nhomepage:\n\nenvironment:\n  sdk: '>=2.18.4 <3.0.0'\n  flutter: \">=2.5.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  plugin_platform_interface: ^2.0.2\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^2.0.0\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter packages.\nflutter:\n  # This section identifies this Flutter project as a plugin project.\n  # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.)\n  # which should be registered in the plugin registry. This is required for\n  # using method channels.\n  # The Android 'package' specifies package in which the registered class is.\n  # This is required for using method channels on Android.\n  # The 'ffiPlugin' specifies that native code should be built and bundled.\n  # This is required for using `dart:ffi`.\n  # All these are used by the tooling to maintain consistency when\n  # adding or updating assets for this project.\n  plugin:\n    platforms:\n      android:\n        package: com.tuntori.mighty_ble\n        pluginClass: MightyBlePlugin\n      ios:\n        pluginClass: MightyBlePlugin\n\n  # To add assets to your plugin package, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  #\n  # For details regarding assets in packages, see\n  # https://flutter.dev/assets-and-images/#from-packages\n  #\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware\n\n  # To add custom fonts to your plugin package, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts in packages, see\n  # https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/.gitignore",
    "content": "# Created by https://www.gitignore.io/api/osx,vim,dart,linux,android,windows,flutter,notepadpp,visualstudio,androidstudio\n# Edit at https://www.gitignore.io/?templates=osx,vim,dart,linux,android,windows,flutter,notepadpp,visualstudio,androidstudio\n\n### Android ###\n# Built application files\n*.apk\n*.ap_\n*.aab\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\nrelease/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# IntelliJ\n*.iml\n.idea/workspace.xml\n.idea/tasks.xml\n.idea/gradle.xml\n.idea/assetWizardSettings.xml\n.idea/dictionaries\n.idea/libraries\n# Android Studio 3 in .gitignore file.\n.idea/caches\n.idea/modules.xml\n# Comment next line if keeping position of elements in Navigation Editor is relevant for you\n.idea/navEditor.xml\n\n# Keystore files\n# Uncomment the following lines if you do not want to check your keystore files in.\n#*.jks\n#*.keystore\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n\n# Google Services (e.g. APIs or Firebase)\n# google-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n\n# fastlane\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\nfastlane/readme.md\n\n# Version control\nvcs.xml\n\n# lint\nlint/intermediates/\nlint/generated/\nlint/outputs/\nlint/tmp/\n# lint/reports/\n\n### Android Patch ###\ngen-external-apklibs\noutput.json\n\n# Replacement of .externalNativeBuild directories introduced\n# with Android Studio 3.5.\n.cxx/\n\n### Dart ###\n# See https://www.dartlang.org/guides/libraries/private-files\n\n# Files and directories created by pub\n.dart_tool/\n.packages\n# If you're building an application, you may want to check-in your pubspec.lock\npubspec.lock\n\n# Directory created by dartdoc\n# If you don't generate documentation locally you can remove this line.\ndoc/api/\n\n# Avoid committing generated Javascript files:\n*.dart.js\n*.info.json      # Produced by the --dump-info flag.\n*.js             # When generated by dart2js. Don't specify *.js if your\n                 # project includes source files written in JavaScript.\n*.js_\n*.js.deps\n*.js.map\n\n### Flutter ###\n# Flutter/Dart/Pub related\n**/doc/api/\n.flutter-plugins\n.flutter-plugins-dependencies\n.pub-cache/\n.pub/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n\n### Linux ###\n*~\n\n# temporary files which can be created if a process still has a handle open of a deleted file\n.fuse_hidden*\n\n# KDE directory preferences\n.directory\n\n# Linux trash folder which might appear on any partition or disk\n.Trash-*\n\n# .nfs files are created when an open file is removed but is still being accessed\n.nfs*\n\n### NotepadPP ###\n# Notepad++ backups #\n*.bak\n\n### OSX ###\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n### Vim ###\n# Swap\n[._]*.s[a-v][a-z]\n[._]*.sw[a-p]\n[._]s[a-rt-v][a-z]\n[._]ss[a-gi-z]\n[._]sw[a-p]\n\n# Session\nSession.vim\nSessionx.vim\n\n# Temporary\n.netrwhist\n\n# Auto-generated tag files\ntags\n\n# Persistent undo\n[._]*.un~\n\n# Coc configuration directory\n.vim\n\n### Windows ###\n# Windows thumbnail cache files\nThumbs.db\nThumbs.db:encryptable\nehthumbs.db\nehthumbs_vista.db\n\n# Dump file\n*.stackdump\n\n# Folder config file\n[Dd]esktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Windows Installer files\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# Windows shortcuts\n*.lnk\n\n### AndroidStudio ###\n# Covers files to be ignored for android development using Android Studio.\n\n# Built application files\n\n# Files for the ART/Dalvik VM\n\n# Java class files\n\n# Generated files\n\n# Gradle files\n.gradle\n\n# Signing files\n.signing/\n\n# Local configuration file (sdk path, etc)\n\n# Proguard folder generated by Eclipse\n\n# Log Files\n\n# Android Studio\n/*/build/\n/*/local.properties\n/*/out\n/*/*/build\n/*/*/production\n*.ipr\n*.swp\n\n# Android Patch\n\n# External native build folder generated in Android Studio 2.2 and later\n\n# NDK\nobj/\n\n# IntelliJ IDEA\n*.iws\n/out/\n\n# User-specific configurations\n.idea/caches/\n.idea/libraries/\n.idea/shelf/\n.idea/.name\n.idea/compiler.xml\n.idea/copyright/profiles_settings.xml\n.idea/encodings.xml\n.idea/misc.xml\n.idea/scopes/scope_settings.xml\n.idea/vcs.xml\n.idea/jsLibraryMappings.xml\n.idea/datasources.xml\n.idea/dataSources.ids\n.idea/sqlDataSources.xml\n.idea/dynamic.xml\n.idea/uiDesigner.xml\n\n# OS-specific files\n.DS_Store?\n\n# Legacy Eclipse project files\n.classpath\n.project\n.cproject\n.settings/\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.ear\n\n# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml)\nhs_err_pid*\n\n## Plugin-specific files:\n\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Mongo Explorer plugin\n.idea/mongoSettings.xml\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\ncom_crashlytics_export_strings.xml\ncrashlytics.properties\ncrashlytics-build.properties\nfabric.properties\n\n### AndroidStudio Patch ###\n\n!/gradle/wrapper/gradle-wrapper.jar\n\n### VisualStudio ###\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# End of https://www.gitignore.io/api/osx,vim,dart,linux,android,windows,flutter,notepadpp,visualstudio,androidstudio\n\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/CHANGELOG.md",
    "content": "## 0.1.5\n\n* minor changes\n\n## 0.1.4\n\n* README.md updated\n\n## 0.1.3\n\n* QR code cancel handled\n* README.md updated\n\n## 0.1.2\n\n* QR code cancel handled\n* README.md updated\n\n## 0.1.1\n\n* README.md updated\n\n## 0.1.0\n\n* Initial Release"
  },
  {
    "path": "plugins/qr_utils-0.1.5/LICENSE",
    "content": "\nMIT License\n\nCopyright (c) 2019 Aeologic\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "plugins/qr_utils-0.1.5/README.md",
    "content": "For help getting started with Flutter, view our online\n[documentation](https://flutter.io/).\n\n\n[![Pub](https://img.shields.io/badge/Pub-0.1.4-orange.svg?style=flat-square)](https://pub.dartlang.org/packages/qr_utils)\n\n\n\n# qr_utils\n\nA new Flutter QR scanner and generator plugin. This plugin is use for scanning 1D barcode and 2D QR code and generating QR code as well.\n\n### Implementation in Flutter\n\nSimply add a dependency to you pubspec.yaml for qr_utils.\n\nThen import the package in your dart file with\n\n```dart\nimport 'package:qr_utils/qr_utils.dart';\n```\n\n\n### Usages\n\n1. Scan QR\n\n    ```dart\n    // Scan QR\n    final content = await QrUtils.scanQR;\n    ```\n\n2. Generate QR\n\n     ```dart\n     // Generate QR\n    Image image = await QrUtils.generateQR(content);\n    ```\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/build.gradle",
    "content": "group 'com.aeologic.adhoc.qr_utils'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.0'\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\napply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 31\n    namespace 'com.aeologic.adhoc.qr_utils'\n    defaultConfig {\n        minSdkVersion 16\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n}\n\ndependencies {\n    implementation 'com.karumi:dexter:5.0.0'\n    //implementation 'me.dm7.barcodescanner:zxing:1.9.13'\n    //implementation files('libs/zxing-1.3.jar')\n    implementation 'me.dm7.barcodescanner:zxing:1.9.3'\n}\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/settings.gradle",
    "content": "rootProject.name = 'qr_utils'\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.aeologic.adhoc.qr_utils\">\n\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n\n    <!--\n    IMPORTANT PART:\n    Include all the \"features\" under the camera permission,\n    and mark them all as optional.\n    -->\n<uses-feature\n    android:name=\"android.hardware.camera\"\n    android:required=\"false\" />\n\n    <application>\n        <activity\n            android:name=\".activity.QRScannerActivity\"\n            android:label=\"@string/qr_scanner\"\n            android:theme=\"@style/AppTheme.NoActionBar.FullScreen\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/java/com/aeologic/adhoc/qr_utils/QrUtilsPlugin.java",
    "content": "package com.aeologic.adhoc.qr_utils;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.util.Base64;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\n\nimport com.aeologic.adhoc.qr_utils.activity.QRScannerActivity;\nimport com.aeologic.adhoc.qr_utils.utils.Utility;\nimport com.google.zxing.BinaryBitmap;\nimport com.google.zxing.LuminanceSource;\nimport com.google.zxing.MultiFormatReader;\nimport com.google.zxing.Reader;\nimport com.google.zxing.RGBLuminanceSource;\nimport com.google.zxing.common.HybridBinarizer;\nimport com.karumi.dexter.Dexter;\nimport com.karumi.dexter.MultiplePermissionsReport;\nimport com.karumi.dexter.PermissionToken;\nimport com.karumi.dexter.listener.PermissionRequest;\nimport com.karumi.dexter.listener.multi.MultiplePermissionsListener;\n\nimport java.io.ByteArrayOutputStream;\nimport java.util.List;\n\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware;\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;\nimport io.flutter.embedding.engine.plugins.FlutterPlugin;\nimport io.flutter.plugin.common.MethodCall;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler;\nimport io.flutter.plugin.common.MethodChannel.Result;\n\n/**\n * QrUtilsPlugin\n */\npublic class QrUtilsPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {\n    private static final String TAG = QrUtilsPlugin.class.getSimpleName();\n    private static final String METHOD_CHANNEL = \"com.aeologic.adhoc.qr_utils\";\n\n    private MethodChannel channel;\n    private Activity activity;\n    private Result pendingResult;\n    private int requestID;\n    private static final int REQUEST_SCAN_QR = 0x1000001;\n\n    @Override\n    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {\n        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), METHOD_CHANNEL);\n        channel.setMethodCallHandler(this);\n    }\n\n    @Override\n    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {\n        if (channel != null) {\n            channel.setMethodCallHandler(null);\n            channel = null;\n        }\n    }\n\n    @Override\n    public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {\n        activity = binding.getActivity();\n        binding.addActivityResultListener((requestCode, resultCode, data) -> onActivityResult(requestCode, resultCode, data));\n    }\n\n    @Override\n    public void onDetachedFromActivityForConfigChanges() {\n        activity = null;\n    }\n\n    @Override\n    public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {\n        onAttachedToActivity(binding);\n    }\n\n    @Override\n    public void onDetachedFromActivity() {\n        activity = null;\n    }\n\n    @Override\n    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {\n        this.pendingResult = result;\n        if (call.method.equals(\"scanQR\")) {\n            requestID = REQUEST_SCAN_QR;\n            checkPermission();\n        } else if (call.method.equals(\"scanImage\")) {\n            byte[] data = call.argument(\"data\");\n            String qrData = scanQRImage(data);\n            result.success(qrData);\n        } else if (call.method.equals(\"generateQR\")) {\n            String content = call.argument(\"content\");\n            generateQR(content);\n        } else {\n            result.notImplemented();\n        }\n    }\n\n    private void checkPermission() {\n        Dexter.withActivity(activity)\n                .withPermissions(Manifest.permission.CAMERA)\n                .withListener(new MultiplePermissionsListener() {\n                    @Override\n                    public void onPermissionsChecked(MultiplePermissionsReport report) {\n                        if (report.areAllPermissionsGranted()) {\n                            if (requestID == REQUEST_SCAN_QR) {\n                                scanQR();\n                            }\n                        } else {\n                    Toast.makeText(activity, activity.getString(R.string.grant_all_permission), Toast.LENGTH_SHORT).show();\n                        }\n                    }\n\n                    @Override\n                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {\n                        token.continuePermissionRequest();\n                    }\n                }).check();\n    }\n\n    private String scanQRImage(byte[] data) {\n        Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, data.length);\n        String contents = null;\n        int[] intArray = new int[bMap.getWidth() * bMap.getHeight()];\n        bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());\n        LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(), intArray);\n        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));\n        Reader reader = new MultiFormatReader();\n        try {\n            com.google.zxing.Result result = reader.decode(bitmap);\n            contents = result.getText();\n        } catch (Exception e) {\n            Log.e(TAG, \"Error decoding QR code\", e);\n        }\n        return contents;\n    }\n\n    private void generateQR(final String content) {\n        new Thread(() -> {\n            try {\n                final Bitmap qrBmp = Utility.generateQRCode(content);\n                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n                qrBmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);\n                final byte[] byteArray = byteArrayOutputStream.toByteArray();\n                final String qrBase64 = Base64.encodeToString(byteArray, Base64.DEFAULT);\n                activity.runOnUiThread(() -> pendingResult.success(byteArray));\n            } catch (Exception e) {\n                activity.runOnUiThread(() -> Toast.makeText(activity, \"QR code generation failed.\", Toast.LENGTH_SHORT).show());\n                Log.e(TAG, \"Error generating QR code\", e);\n            }\n        }).start();\n    }\n\n    private void scanQR() {\n        Intent intent = new Intent(activity, QRScannerActivity.class);\n        activity.startActivityForResult(intent, REQUEST_SCAN_QR);\n    }\n\n    private boolean onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (requestCode == REQUEST_SCAN_QR) {\n            if (resultCode == Activity.RESULT_OK && data != null) {\n                String content = data.getStringExtra(QRScannerActivity.QR_CONTENT);\n                pendingResult.success(content);\n            } else {\n                pendingResult.success(null);\n            }\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/java/com/aeologic/adhoc/qr_utils/activity/QRScannerActivity.java",
    "content": "package com.aeologic.adhoc.qr_utils.activity;\n\n\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\nimport android.util.Log;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.ImageView;\nimport android.widget.Toast;\nimport android.graphics.Color;\n\nimport com.aeologic.adhoc.qr_utils.R;\nimport com.google.zxing.Result;\n\nimport me.dm7.barcodescanner.zxing.ZXingScannerView;\n\nimport static com.aeologic.adhoc.qr_utils.utils.Utility.isDrawablesIdentical;\n\n/**\n * Created by Deepak on 06-Jul-17.\n */\n\npublic class QRScannerActivity extends AppCompatActivity implements View.OnClickListener, ZXingScannerView.ResultHandler {\n    private static final String TAG = QRScannerActivity.class.getSimpleName();\n    private ZXingScannerView mScannerView;\n    private ViewGroup contentFrame;\n    private ImageView flashImg;\n\n    public static final String QR_CONTENT = \"QR_CONTENT\";\n\n    @Override\n    public void onCreate(Bundle state) {\n        super.onCreate(state);\n        setContentView(R.layout.activity_qr_scanner);\n        initViews();\n        /*setupToolbar();\n         setupStatusBarColor();*/\n        mScannerView = new ZXingScannerView(this);\n        mScannerView.setLaserEnabled(false);\n        mScannerView.setSquareViewFinder(true);\n        contentFrame.addView(mScannerView);\n        flashImg.setOnClickListener(this);\n    }\n\n    private void initViews() {\n        contentFrame = findViewById(R.id.content_frame);\n        flashImg = findViewById(R.id.flash_img);\n    }\n\n    @Override\n    public void onClick(View view) {\n        if (view == flashImg) {\n            if (isDrawablesIdentical(flashImg.getDrawable(), getResources().getDrawable(R.drawable.ic_flash_active))) {\n                flashImg.setImageDrawable(getResources().getDrawable(R.drawable.ic_flash_inactive));\n                startFlash(false);\n            } else if (isDrawablesIdentical(flashImg.getDrawable(), getResources().getDrawable(R.drawable.ic_flash_inactive))) {\n                flashImg.setImageDrawable(getResources().getDrawable(R.drawable.ic_flash_active));\n                startFlash(true);\n            }\n        }\n    }\n\n    private void startFlash(boolean status) {\n        mScannerView.setFlash(status);\n    }\n\n    private void setupToolbar() {\n        //Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\n        //setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n        getSupportActionBar().setDisplayShowHomeEnabled(true);\n        setTitle(getString(R.string.qr_scanner));\n    }\n\n    private void setupStatusBarColor() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            Window window = getWindow();\n            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n            //window.setStatusBarColor(getResources().getColor(R.color.blueDark));\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        mScannerView.setResultHandler(this);\n        mScannerView.startCamera();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        mScannerView.stopCamera();\n    }\n\n    @Override\n    public void handleResult(Result rawResult) {\n        /*Toast.makeText(this, \"Contents = \" + rawResult.getText() +\n                \", Format = \" + rawResult.getBarcodeFormat().toString(), Toast.LENGTH_SHORT).show();*/\n        if (rawResult != null) {\n            String qrContent = rawResult.getText();\n            Log.v(\"CONTENT\", \"DATA: \" + qrContent);\n            Handler handler = new Handler();\n            handler.postDelayed(new Runnable() {\n                @Override\n                public void run() {\n                    mScannerView.resumeCameraPreview(QRScannerActivity.this);\n                }\n            }, 2000);\n            Intent intent = new Intent();\n            intent.putExtra(QR_CONTENT, qrContent);\n            setResult(RESULT_OK, intent);\n            finish();\n\n        } else {\n            Log.v(TAG,\"handleResult(_) => Process Failed\");\n            Toast.makeText(QRScannerActivity.this, getString(R.string.process_failed), Toast.LENGTH_SHORT).show();\n            goToBack();\n        }\n    }\n\n    @Override\n    public void onBackPressed() {\n        goToBack();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                goToBack();\n                break;\n        }\n        return true;\n    }\n\n    private void goToBack() {\n        Intent intent = new Intent();\n        setResult(RESULT_CANCELED, intent);\n        finish();\n    }\n\n}"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/java/com/aeologic/adhoc/qr_utils/utils/Utility.java",
    "content": "package com.aeologic.adhoc.qr_utils.utils;\n\n\n\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\n\nimport com.google.zxing.BarcodeFormat;\nimport com.google.zxing.WriterException;\nimport com.google.zxing.common.BitMatrix;\nimport com.google.zxing.qrcode.QRCodeWriter;\n\nimport java.util.Hashtable;\n\npublic class Utility {\n\n    public static Bitmap generateQRCode(String content) throws WriterException {\n        QRCodeWriter writer = new QRCodeWriter();\n        try {\n            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, 384, 384);\n            int width = bitMatrix.getWidth();\n            int height = bitMatrix.getHeight();\n            Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);\n            for (int x = 0; x < width; x++) {\n                for (int y = 0; y < height; y++) {\n                    bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);\n                }\n            }\n            return bmp;\n\n        } catch (WriterException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static boolean isDrawablesIdentical(Drawable drawable1, Drawable drawable2) {\n        Drawable.ConstantState constantState1 = drawable1.getConstantState();\n        Drawable.ConstantState constantState2 = drawable2.getConstantState();\n\n        return (constantState1 != null && constantState2 != null && constantState1.equals(constantState2))\n                || getBitmap(drawable1).sameAs(getBitmap(drawable2));\n    }\n\n    public static Bitmap getBitmap(Drawable drawable) {\n        Bitmap result;\n        if (drawable instanceof BitmapDrawable) {\n            result = ((BitmapDrawable) drawable).getBitmap();\n        } else {\n            int width = drawable.getIntrinsicWidth();\n            int height = drawable.getIntrinsicHeight();\n            // Some drawables have no intrinsic width - e.g. solid colours.\n            if (width <= 0) {\n                width = 1;\n            }\n            if (height <= 0) {\n                height = 1;\n            }\n\n            result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n            Canvas canvas = new Canvas(result);\n            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());\n            drawable.draw(canvas);\n        }\n        return result;\n    }\n}"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/drawable/ic_flash_active.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M400.268,175.599c-1.399,-3.004 -4.412,-4.932 -7.731,-4.932h-101.12l99.797,-157.568c1.664,-2.628 1.766,-5.956 0.265,-8.678C389.977,1.69 387.109,0 384.003,0H247.47c-3.234,0 -6.187,1.826 -7.637,4.719l-128,256c-1.323,2.637 -1.178,5.777 0.375,8.294c1.562,2.517 4.301,4.053 7.262,4.053h87.748l-95.616,227.089c-1.63,3.883 -0.179,8.388 3.413,10.59c1.382,0.845 2.918,1.254 4.446,1.254c2.449,0 4.864,-1.05 6.537,-3.029l273.067,-324.267C401.206,182.161 401.667,178.611 400.268,175.599z\" />\n</vector>\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/drawable/ic_flash_inactive.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M400.388,175.787c-1.707,-3.413 -4.267,-5.12 -7.68,-5.12H292.015L391.855,12.8c1.707,-2.56 1.707,-5.973 0,-8.533S387.588,0 384.175,0H247.642c-3.413,0 -5.973,1.707 -7.68,4.267l-128,256c-1.707,2.56 -1.707,5.973 0,8.533c1.707,2.56 5.12,4.267 7.68,4.267h87.893l-95.573,227.84c-1.707,3.413 0,7.68 3.413,10.24c0.853,0.853 2.56,0.853 4.267,0.853c2.56,0 5.12,-0.853 6.827,-2.56l273.067,-324.267C401.242,182.613 402.095,179.2 400.388,175.787zM149.508,454.827l78.507,-187.733c0.853,-2.56 0.853,-5.12 -0.853,-7.68c-1.707,-1.707 -4.267,-3.413 -6.827,-3.413h-87.04L252.762,17.067h116.053L268.122,174.933c-1.707,2.56 -1.707,5.973 0,8.533s4.267,4.267 7.68,4.267h98.987L149.508,454.827z\" />\n</vector>\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/drawable/ic_shape_circle.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"#88000000\" />\n</shape>"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/layout/activity_qr_scanner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:id=\"@+id/content_frame\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\" />\n\n    <RelativeLayout\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:background=\"@drawable/ic_shape_circle\"\n        android:layout_marginBottom=\"40dp\">\n\n        <ImageView\n            android:id=\"@+id/flash_img\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:src=\"@drawable/ic_flash_inactive\" />\n\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"white\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"process_failed\">Process failed</string>\n    <string name=\"qr_scanner\">QR Scanner</string>\n    <string name=\"grant_all_permission\">Please grant all permissions!</string>\n</resources>"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/values/styles.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">?colorPrimary</item>\n        <item name=\"colorPrimaryDark\">?colorPrimaryDark</item>\n        <item name=\"colorAccent\">?colorAccent</item>\n    </style>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme.NoActionBar.FullScreen\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"android:windowFullscreen\">true</item>\n    </style>\n\n\n\n</resources>"
  },
  {
    "path": "plugins/qr_utils-0.1.5/android/src/main/res/xml/provider_paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <external-path\n        name=\"storage/emulated/0\"\n        path=\".\" />\n</paths>"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/Classes/QrUtilsPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface QrUtilsPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/Classes/QrUtilsPlugin.m",
    "content": "#import \"QrUtilsPlugin.h\"\n#if __has_include(<qr_utils/qr_utils-Swift.h>)\n#import <qr_utils/qr_utils-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"qr_utils-Swift.h\"\n#endif\n\n@implementation QrUtilsPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftQrUtilsPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/Classes/SwiftQRScanner.swift",
    "content": "import Flutter\nimport UIKit\nimport AVFoundation\n\nenum ScanMode:Int{\n    case QR\n    case BARCODE\n    case DEFAULT\n    \n    var index: Int {\n        return rawValue\n    }\n}\n\npublic class SwiftFlutterBarcodeScannerPlugin: NSObject, ScanBarcodeDelegate {\n    \n    public static var viewController = UIViewController()\n    public static var lineColor:String=\"#ff6666\"\n    public static var cancelButtonText:String=\"Cancel\"\n    public static var isShowFlashIcon:Bool=true\n    var pendingResult:FlutterResult!\n    public static var scanMode = ScanMode.QR.index\n    \n    public static func initScanner() {\n        viewController = (UIApplication.shared.delegate?.window??.rootViewController)!\n    }\n    \n    /// Check for camera availability\n    func checkCameraAvailability()->Bool{\n        return UIImagePickerController.isSourceTypeAvailable(.camera)\n    }\n    \n    func checkForCameraPermission()->Bool{\n        return AVCaptureDevice.authorizationStatus(for: .video) == .authorized\n    }\n\n\tpublic func showScanner(result: @escaping FlutterResult) {\n\t\tpendingResult=result\n        let controller = BarcodeScannerViewController()\n        controller.delegate = self\n        \n        if #available(iOS 13.0, *) {\n            controller.modalPresentationStyle = .fullScreen\n        }\n        \n        if checkCameraAvailability(){\n            if checkForCameraPermission() {\n                SwiftFlutterBarcodeScannerPlugin.viewController.present(controller\n                                                                        , animated: true) {\n                    \n                }\n            }else {\n                AVCaptureDevice.requestAccess(for: .video) { success in\n                    DispatchQueue.main.async {\n                        if success {\n                            SwiftFlutterBarcodeScannerPlugin.viewController.present(controller\n                                                                                    , animated: true) {\n                                \n                            }\n                        } else {\n                            let alert = UIAlertController(title: \"Action needed\", message: \"Please grant camera permission to use barcode scanner\", preferredStyle: .alert)\n                            \n                            alert.addAction(UIAlertAction(title: \"Grant\", style: .default, handler: { action in\n                                UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)\n                            }))\n                            \n                            alert.addAction(UIAlertAction(title: \"Cancel\", style: .cancel))\n                            \n                            SwiftFlutterBarcodeScannerPlugin.viewController.present(alert, animated: true)\n                        }\n                    }\n                }}\n        }else {\n            showAlertDialog(title: \"Unable to proceed\", message: \"Camera not available\")\n        }\n\t}\n\t\n    public func userDidScanWith(barcode: String){\n        pendingResult(barcode)\n    }\n    \n    /// Show common alert dialog\n    func showAlertDialog(title:String,message:String){\n        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)\n        let alertAction = UIAlertAction(title: \"Ok\", style: .default, handler: nil)\n        alertController.addAction(alertAction)\n        SwiftFlutterBarcodeScannerPlugin.viewController.present(alertController, animated: true, completion: nil)\n    }\n}\n\nprotocol ScanBarcodeDelegate {\n    func userDidScanWith(barcode: String)\n}\n\nclass BarcodeScannerViewController: UIViewController {\n    private let supportedCodeTypes = [AVMetadataObject.ObjectType.qr]\n    public var delegate: ScanBarcodeDelegate? = nil\n    private var captureSession = AVCaptureSession()\n    private var videoPreviewLayer: AVCaptureVideoPreviewLayer?\n    private var qrCodeFrameView: UIView?\n    private var scanlineRect = CGRect.zero\n    private var scanlineStartY: CGFloat = 0\n    private var scanlineStopY: CGFloat = 0\n    private var topBottomMargin: CGFloat = 80\n    private var scanLine: UIView = UIView()\n    var screenSize = UIScreen.main.bounds\n    private var isOrientationPortrait = true\n    var screenHeight:CGFloat = 0\n    let captureMetadataOutput = AVCaptureMetadataOutput()\n    \n    private lazy var xCor: CGFloat! = {\n        return self.isOrientationPortrait ? (screenSize.width - (screenSize.width*0.8))/2 :\n            (screenSize.width - (screenSize.width*0.6))/2\n    }()\n    private lazy var yCor: CGFloat! = {\n        return self.isOrientationPortrait ? (screenSize.height - (screenSize.width*0.8))/2 :\n            (screenSize.height - (screenSize.height*0.8))/2\n    }()\n    //Bottom view\n    private lazy var bottomView : UIView! = {\n        let view = UIView()\n        view.backgroundColor = UIColor.black\n        view.translatesAutoresizingMaskIntoConstraints = false\n        return view\n    }()\n    \n    /// Create and return flash button\n    private lazy var flashIcon : UIButton! = {\n        let flashButton = UIButton()\n        flashButton.setTitle(\"Flash\",for:.normal)\n        flashButton.translatesAutoresizingMaskIntoConstraints=false\n        \n        flashButton.setImage(UIImage(named: \"ic_flash_off\", in: Bundle(for: SwiftFlutterBarcodeScannerPlugin.self), compatibleWith: nil),for:.normal)\n        \n        flashButton.addTarget(self, action: #selector(BarcodeScannerViewController.flashButtonClicked), for: .touchUpInside)\n        return flashButton\n    }()\n    \n    /// Create and return switch camera button\n    private lazy var switchCameraButton : UIButton! = {\n        let button = UIButton()\n        \n        button.translatesAutoresizingMaskIntoConstraints = false\n        button.setImage(UIImage(named: \"ic_switch_camera\", in: Bundle(for: SwiftFlutterBarcodeScannerPlugin.self), compatibleWith: nil),for: .normal)\n        button.addTarget(self, action: #selector(BarcodeScannerViewController.switchCameraButtonClicked), for: .touchUpInside)\n        \n        return button\n    }()\n    \n    \n    /// Create and return cancel button\n    public lazy var cancelButton: UIButton! = {\n        let view = UIButton()\n        view.setTitle(SwiftFlutterBarcodeScannerPlugin.cancelButtonText, for: .normal)\n        view.translatesAutoresizingMaskIntoConstraints = false\n        view.addTarget(self, action: #selector(BarcodeScannerViewController.cancelButtonClicked), for: .touchUpInside)\n        return view\n    }()\n    \n    override public func viewDidLoad() {\n        super.viewDidLoad()\n        self.isOrientationPortrait = isLandscape\n        self.initUIComponents()\n    }\n    \n    override public func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        self.moveVertically()\n    }\n\n    override public func viewDidDisappear(_ animated: Bool){\n        // Stop video capture\n        captureSession.stopRunning()\n    }\n    \n    // Init UI components needed\n    func initUIComponents(){\n        if isOrientationPortrait {\n            screenHeight = (CGFloat)((SwiftFlutterBarcodeScannerPlugin.scanMode == ScanMode.QR.index) ? (screenSize.width * 0.8) : (screenSize.width * 0.5))\n            \n        } else {\n            screenHeight = (CGFloat)((SwiftFlutterBarcodeScannerPlugin.scanMode == ScanMode.QR.index) ? (screenSize.height * 0.6) : (screenSize.height * 0.5))\n        }\n        \n        \n        self.initBarcodeComponents()\n    }\n    \n    \n    // Inititlize components\n    func initBarcodeComponents(){\n        \n        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)\n        // Get the back-facing camera for capturing videos\n        guard let captureDevice = deviceDiscoverySession.devices.first else {\n            print(\"Failed to get the camera device\")\n            return\n        }\n        \n        do {\n            // Get an instance of the AVCaptureDeviceInput class using the previous device object.\n            let input = try AVCaptureDeviceInput(device: captureDevice)\n            \n            // Set the input device on the capture session.\n            if captureSession.inputs.isEmpty {\n                captureSession.addInput(input)\n            }\n            // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session.\n            \n            let captureRectWidth = self.isOrientationPortrait ? (screenSize.width*0.8):(screenSize.height*0.8)\n            \n            captureMetadataOutput.rectOfInterest = CGRect(x: xCor, y: yCor, width: captureRectWidth, height: screenHeight)\n            if captureSession.outputs.isEmpty {\n                captureSession.addOutput(captureMetadataOutput)\n            }\n            // Set delegate and use the default dispatch queue to execute the call back\n            captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)\n            captureMetadataOutput.metadataObjectTypes = supportedCodeTypes\n            //            captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]\n            \n        } catch {\n            // If any error occurs, simply print it out and don't continue any more.\n            print(error)\n            return\n        }\n        // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer.\n        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)\n        videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill\n        videoPreviewLayer?.frame = view.layer.bounds\n        \n        setVideoPreviewOrientation()\n        //videoPreviewLayer?.connection?.videoOrientation = self.isOrientationPortrait ? AVCaptureVideoOrientation.portrait : AVCaptureVideoOrientation.landscapeRight\n        \n        self.drawUIOverlays{\n        }\n    }\n    \n    \n    func drawUIOverlays(withCompletion processCompletionCallback: () -> Void){\n        //    func drawUIOverlays(){\n        let overlayPath = UIBezierPath(rect: view.bounds)\n        \n        let transparentPath = UIBezierPath(rect: CGRect(x: xCor, y: yCor, width: self.isOrientationPortrait ? (screenSize.width*0.8) : (screenSize.height*0.8), height: screenHeight))\n        \n        overlayPath.append(transparentPath)\n        overlayPath.usesEvenOddFillRule = true\n        let fillLayer = CAShapeLayer()\n        \n        fillLayer.path = overlayPath.cgPath\n        fillLayer.fillRule = CAShapeLayerFillRule.evenOdd\n        fillLayer.fillColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor\n        \n        videoPreviewLayer?.layoutSublayers()\n        videoPreviewLayer?.layoutIfNeeded()\n        \n        view.layer.addSublayer(videoPreviewLayer!)\n        \n        \n        // Start video capture.\n        captureSession.startRunning()\n        \n        let scanRect = CGRect(x: xCor, y: yCor, width: self.isOrientationPortrait ? (screenSize.width*0.8) : (screenSize.height*0.8), height: screenHeight)\n        \n        \n        let rectOfInterest = videoPreviewLayer?.metadataOutputRectConverted(fromLayerRect: scanRect)\n        if let rOI = rectOfInterest{\n            captureMetadataOutput.rectOfInterest = rOI\n        }\n        // Initialize QR Code Frame to highlight the QR code\n        qrCodeFrameView = UIView()\n        \n        qrCodeFrameView!.frame = CGRect(x: 0, y: 0, width: self.isOrientationPortrait ? (screenSize.width * 0.8) : (screenSize.height * 0.8), height: screenHeight)\n        \n        \n        if let qrCodeFrameView = qrCodeFrameView {\n            self.view.addSubview(qrCodeFrameView)\n            self.view.bringSubviewToFront(qrCodeFrameView)\n            qrCodeFrameView.layer.insertSublayer(fillLayer, below: videoPreviewLayer!)\n            self.view.bringSubviewToFront(bottomView)\n            self.view.bringSubviewToFront(flashIcon)\n            if(!SwiftFlutterBarcodeScannerPlugin.isShowFlashIcon){\n                flashIcon.isHidden=true\n            }\n            qrCodeFrameView.layoutIfNeeded()\n            qrCodeFrameView.layoutSubviews()\n            qrCodeFrameView.setNeedsUpdateConstraints()\n            self.view.bringSubviewToFront(cancelButton)\n            self.view.bringSubviewToFront(switchCameraButton)\n        }\n        setConstraintsForControls()\n        self.drawLine()\n        processCompletionCallback()\n    }\n    \n    /// Apply constraints to ui components\n    private func setConstraintsForControls() {\n        self.view.addSubview(bottomView)\n        self.view.addSubview(cancelButton)\n        self.view.addSubview(flashIcon)\n        self.view.addSubview(switchCameraButton)\n        \n        bottomView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant:0).isActive = true\n        bottomView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant:0).isActive = true\n        bottomView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant:0).isActive = true\n        bottomView.heightAnchor.constraint(equalToConstant:self.isOrientationPortrait ? 100.0 : 70.0).isActive=true\n        \n        flashIcon.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true\n        flashIcon.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10).isActive = true\n        flashIcon.heightAnchor.constraint(equalToConstant: 40.0).isActive = true\n        flashIcon.widthAnchor.constraint(equalToConstant: 40.0).isActive = true\n        \n        cancelButton.translatesAutoresizingMaskIntoConstraints = false\n        cancelButton.widthAnchor.constraint(equalToConstant: 100.0).isActive = true\n        cancelButton.heightAnchor.constraint(equalToConstant: 70.0).isActive = true\n        cancelButton.bottomAnchor.constraint(equalTo:view.bottomAnchor,constant: 0).isActive=true\n        cancelButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant:10).isActive = true\n        \n        switchCameraButton.translatesAutoresizingMaskIntoConstraints = false\n        // A little bit to the right.\n        switchCameraButton.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true\n        switchCameraButton.heightAnchor.constraint(equalToConstant: 70.0).isActive = true\n        switchCameraButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true\n    }\n    \n    /// Flash button click event listener\n    @IBAction private func flashButtonClicked() {\n        if #available(iOS 10.0, *) {\n            toggleFlash()\n        } else {\n            /// Handle further checks\n        }\n    }\n    \n    private func flashIconOff() {\n        flashIcon.setImage(UIImage(named: \"ic_flash_off\", in: Bundle(for: SwiftFlutterBarcodeScannerPlugin.self), compatibleWith: nil),for:.normal)\n    }\n    \n    private func flashIconOn() {\n        flashIcon.setImage(UIImage(named: \"ic_flash_on\", in: Bundle(for: SwiftFlutterBarcodeScannerPlugin.self), compatibleWith: nil),for:.normal)\n    }\n    \n    private func setFlashStatus(device: AVCaptureDevice, mode: AVCaptureDevice.TorchMode) {\n        guard device.hasTorch else {\n            flashIconOff()\n            return\n        }\n        \n        do {\n            try device.lockForConfiguration()\n            \n            if (mode == .off) {\n                device.torchMode = AVCaptureDevice.TorchMode.off\n                flashIconOff()\n            } else {\n                // Treat .auto & .on equally.\n                do {\n                    try device.setTorchModeOn(level: 1.0)\n                    flashIconOn()\n                } catch {\n                    print(error)\n                }\n            }\n            \n            device.unlockForConfiguration()\n        } catch {\n            print(error)\n        }\n    }\n    \n    /// Toggle flash and change flash icon\n    func toggleFlash() {\n        guard let device = getCaptureDeviceFromCurrentSession(session: captureSession) else {\n            flashIconOff()\n            return\n        }\n        \n        do {\n            try device.lockForConfiguration()\n            \n            if (device.torchMode == AVCaptureDevice.TorchMode.off) {\n                setFlashStatus(device: device, mode: .on)\n            } else {\n                setFlashStatus(device: device, mode: .off)\n            }\n            \n            device.unlockForConfiguration()\n        } catch {\n            print(error)\n        }\n    }\n    \n    \n    /// Cancel button click event listener\n    @IBAction private func cancelButtonClicked() {\n        if self.delegate != nil {\n            self.dismiss(animated: true, completion: {\n                self.delegate?.userDidScanWith(barcode: \"\")\n            })\n        }\n    }\n    \n    /// Switch camera button click event listener\n    @IBAction private func switchCameraButtonClicked() {\n        // Get the current active input.\n        guard let currentInput = captureSession.inputs.first as? AVCaptureDeviceInput else { return }\n        let newPosition = getInversePosition(position: currentInput.device.position);\n        guard let device = getCaptureDeviceByPosition(position: newPosition) else { return }\n        do {\n            let newInput = try AVCaptureDeviceInput(device: device)\n            // Replace current input with the new one.\n            captureSession.removeInput(currentInput)\n            captureSession.addInput(newInput)\n            // Disable flash by default\n            setFlashStatus(device: device, mode: .off)\n        } catch let error {\n            print(error)\n            return\n        }\n    }\n    \n    private func getCaptureDeviceFromCurrentSession(session: AVCaptureSession) -> AVCaptureDevice? {\n        // Get the current active input.\n        guard let currentInput = captureSession.inputs.first as? AVCaptureDeviceInput else { return nil }\n        return currentInput.device;\n    }\n    \n    private func getCaptureDeviceByPosition(position: AVCaptureDevice.Position) -> AVCaptureDevice? {\n        // List all capture devices\n        let devices = AVCaptureDevice.DiscoverySession(deviceTypes: [ .builtInWideAngleCamera ], mediaType: AVMediaType.video, position: .unspecified).devices\n        for device in devices {\n            if device.position == position {\n                return device\n            }\n        }\n        \n        return nil;\n    }\n    \n    private func getInversePosition(position: AVCaptureDevice.Position) -> AVCaptureDevice.Position {\n        if (position == .back) {\n            return AVCaptureDevice.Position.front;\n        }\n        if (position == .front) {\n            return AVCaptureDevice.Position.back;\n        }\n        // Fall back to camera in the back.\n        return AVCaptureDevice.Position.back;\n    }\n    \n    /// Draw scan line\n    private func drawLine() {\n        self.view.addSubview(scanLine)\n        scanLine.backgroundColor = hexStringToUIColor(hex: SwiftFlutterBarcodeScannerPlugin.lineColor)\n        scanlineRect = CGRect(x: xCor, y: yCor, width:self.isOrientationPortrait ? (screenSize.width*0.8) : (screenSize.height*0.8), height: 2)\n        \n        scanlineStartY = yCor\n        \n        var stopY:CGFloat\n        \n        if SwiftFlutterBarcodeScannerPlugin.scanMode == ScanMode.QR.index {\n            let w = self.isOrientationPortrait ? (screenSize.width*0.8) : (screenSize.height*0.6)\n            stopY = (yCor + w)\n        } else {\n            let w = self.isOrientationPortrait ? (screenSize.width * 0.5) : (screenSize.height * 0.5)\n            stopY = (yCor + w)\n        }\n        scanlineStopY = stopY\n    }\n    \n    /// Animate scan line vertically\n    private func moveVertically() {\n        scanLine.frame  = scanlineRect\n        scanLine.center = CGPoint(x: scanLine.center.x, y: scanlineStartY)\n        scanLine.isHidden = false\n        weak var weakSelf = scanLine\n        UIView.animate(withDuration: 2.0, delay: 0.0, options: [.repeat, .autoreverse, .beginFromCurrentState], animations: {() -> Void in\n            weakSelf!.center = CGPoint(x: weakSelf!.center.x, y: self.scanlineStopY)\n        }, completion: nil)\n    }\n    \n    private func updatePreviewLayer(layer: AVCaptureConnection, orientation: AVCaptureVideoOrientation) {\n        layer.videoOrientation = orientation\n    }\n    \n    var isLandscape: Bool {\n        return UIDevice.current.orientation.isValidInterfaceOrientation\n            ? UIDevice.current.orientation.isPortrait\n            : UIApplication.shared.statusBarOrientation.isPortrait\n    }\n    \n    private func launchApp(decodedURL: String) {\n        if presentedViewController != nil {\n            return\n        }\n        if self.delegate != nil {\n            self.dismiss(animated: true, completion: {\n                self.delegate?.userDidScanWith(barcode: decodedURL)\n            })\n        }\n    }\n}\n\n/// Extension for view controller\nextension BarcodeScannerViewController: AVCaptureMetadataOutputObjectsDelegate {\n    public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {\n        // Check if the metadataObjects array is not nil and it contains at least one object.\n        if metadataObjects.count == 0 {\n            qrCodeFrameView?.frame = CGRect.zero\n            return\n        }\n        // Get the metadata object.\n        let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject\n        if supportedCodeTypes.contains(metadataObj.type) {\n            // If the found metadata is equal to the QR code metadata (or barcode) then update the status label's text and set the bounds\n            //            let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)\n            //qrCodeFrameView?.frame = barCodeObject!.bounds\n            if metadataObj.stringValue != nil {\n                launchApp(decodedURL: metadataObj.stringValue!)\n            }\n        }\n    }\n}\n\n// Handle auto rotation\nextension BarcodeScannerViewController{\n    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {\n        super.viewWillTransition(to: size, with: coordinator)\n        updateUIAfterRotation()\n    }\n    \n    func updateUIAfterRotation(){\n        DispatchQueue.main.async {\n            if UIDevice.current.orientation == .portrait || UIDevice.current.orientation == .portraitUpsideDown {\n                self.isOrientationPortrait = true\n            }else{\n                self.isOrientationPortrait = false\n            }\n            //self.isOrientationPortrait = self.isLandscape\n            \n            self.screenSize = UIScreen.main.bounds\n            \n            if UIDevice.current.orientation == .portrait || UIDevice.current.orientation == .portraitUpsideDown {\n                self.screenHeight = (CGFloat)((SwiftFlutterBarcodeScannerPlugin.scanMode == ScanMode.QR.index) ? (self.screenSize.width * 0.8) : (self.screenSize.width * 0.5))\n                \n            } else {\n                self.screenHeight = (CGFloat)((SwiftFlutterBarcodeScannerPlugin.scanMode == ScanMode.QR.index) ? (self.screenSize.height * 0.6) : (self.screenSize.height * 0.5))\n            }\n            \n            \n            self.videoPreviewLayer?.frame = self.view.layer.bounds\n            \n            self.setVideoPreviewOrientation()\n            self.xCor = self.isOrientationPortrait ? (self.screenSize.width - (self.screenSize.width*0.8))/2 :\n                (self.screenSize.width - (self.screenSize.width*0.6))/2\n            \n            self.yCor = self.isOrientationPortrait ? (self.screenSize.height - (self.screenSize.width*0.8))/2 :\n                (self.screenSize.height - (self.screenSize.height*0.8))/2\n            \n            self.videoPreviewLayer?.layoutIfNeeded()\n            self.removeAllViews {\n                self.drawUIOverlays{\n                    //self.scanlineRect = CGRect(x: self.xCor, y: self.yCor, width:self.isOrientationPortrait ? (self.screenSize.width*0.8) : (self.screenSize.height*0.8), height: 2)\n                    self.scanLine.frame  = self.scanlineRect\n                    self.scanLine.center = CGPoint(x: self.scanLine.center.x, y: self.scanlineStopY)\n                    //                self.moveVertically()\n                }\n            }\n        }\n    }\n    \n    // Set video preview orientation\n    func setVideoPreviewOrientation(){\n        switch(UIDevice.current.orientation){\n        case .unknown:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait\n            break\n        case .portrait:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait\n            break\n        case .portraitUpsideDown:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portraitUpsideDown\n            break\n        case .landscapeLeft:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.landscapeRight\n            break\n        case .landscapeRight:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.landscapeLeft\n            break\n        case .faceUp:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait\n            break\n        case .faceDown:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait\n            break\n        @unknown default:\n            self.videoPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait\n            break\n        }\n    }\n    \n    \n    /// Remove all subviews from superviews\n    func removeAllViews(withCompletion processCompletionCallback: () -> Void){\n        for view in self.view.subviews {\n            view.removeFromSuperview()\n        }\n        processCompletionCallback()\n    }\n}\n\n/// Convert hex string to UIColor\nfunc hexStringToUIColor (hex:String) -> UIColor {\n    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()\n    \n    if (cString.hasPrefix(\"#\")) {\n        cString.remove(at: cString.startIndex)\n    }\n    \n    if ((cString.count) != 6 && (cString.count) != 8) {\n        return UIColor.gray\n    }\n    \n    var rgbaValue:UInt32 = 0\n    \n    if (!Scanner(string: cString).scanHexInt32(&rgbaValue)) {\n        return UIColor.gray\n    }\n    \n    var aValue:CGFloat = 1.0\n    if ((cString.count) == 8) {\n        aValue = CGFloat((rgbaValue & 0xFF000000) >> 24) / 255.0\n    }\n    \n    let rValue:CGFloat = CGFloat((rgbaValue & 0x00FF0000) >> 16) / 255.0\n    let gValue:CGFloat = CGFloat((rgbaValue & 0x0000FF00) >> 8) / 255.0\n    let bValue:CGFloat = CGFloat(rgbaValue & 0x000000FF) / 255.0\n    \n    return UIColor(\n        red: rValue,\n        green: gValue,\n        blue: bValue,\n        alpha: aValue\n    )\n}\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/Classes/SwiftQrUtilsPlugin.swift",
    "content": "import Flutter\nimport UIKit\nimport AVFoundation\nimport MobileCoreServices\n\npublic class SwiftQrUtilsPlugin: NSObject, FlutterPlugin, UIImagePickerControllerDelegate, UINavigationControllerDelegate {\nfileprivate var result:FlutterResult?\nfileprivate var qrcodeImage: CIImage!\n    \n  fileprivate  var captureSession = AVCaptureSession()\n    \n   fileprivate var videoPreviewLayer: AVCaptureVideoPreviewLayer?\n   fileprivate   var qrCodeFrameView: UIView?\n    var qrScanner: SwiftFlutterBarcodeScannerPlugin?\n    \n    private let supportedCodeTypes = [AVMetadataObject.ObjectType.qr]\n\n    var controller: FlutterViewController!\n\n    init(cont: FlutterViewController, messenger: FlutterBinaryMessenger) {\n          self.controller = cont;\n          super.init();\n      }\n    \n  public static func register(with registrar: FlutterPluginRegistrar) {\n    let channel = FlutterMethodChannel(name: \"com.aeologic.adhoc.qr_utils\", binaryMessenger: registrar.messenger())\n\n    SwiftFlutterBarcodeScannerPlugin.initScanner()\n    let app =  UIApplication.shared\n    let controller : FlutterViewController = app.delegate!.window!!.rootViewController as! \tFlutterViewController;\n      \n      let instance = SwiftQrUtilsPlugin.init(cont: controller, messenger: registrar.messenger())\n      \n    registrar.addMethodCallDelegate(instance, channel: channel)\n  }\n\n  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n    \n    self.result = result\n            if (call.method == \"scanQR\") {\n                    if #available(iOS 10.0, *) {\n                        qrScanner = SwiftFlutterBarcodeScannerPlugin()\n                        qrScanner?.showScanner(result: result)\n                    }\n            }\n            else if (call.method == \"scanImage\") {\n                self.openImagePicker()\n            }\n            else if (call.method == \"generateQR\") {\n                let tempDataDict = call.arguments as? Dictionary<String, Any>\n                let content = tempDataDict![\"content\"] as! String\n                self.generateQR(text: content)\n            }\n  }\n\n    public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {\n        guard let image = info[.originalImage] as? UIImage else { return }\n\n        controller!.dismiss(animated: true)\n        \n        if let features = detectQRCode(image), !features.isEmpty{\n            for case let row as CIQRCodeFeature in features{\n                print(row.messageString ?? \"scan error\")\n                self.result!(row.messageString ?? \"\")\n                return\n            }\n        }\n        self.result!(nil)\n    }\n    \n    func detectQRCode(_ image: UIImage?) -> [CIFeature]? {\n        if let image = image, let ciImage = CIImage.init(image: image){\n            var options: [String: Any]\n            let context = CIContext()\n            options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]\n            let qrDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: options)\n            if ciImage.properties.keys.contains((kCGImagePropertyOrientation as String)){\n                options = [CIDetectorImageOrientation: ciImage.properties[(kCGImagePropertyOrientation as String)] ?? 1]\n            } else {\n                options = [CIDetectorImageOrientation: 1]\n            }\n            let features = qrDetector?.features(in: ciImage, options: options)\n            return features\n\n        }\n        return nil\n    }\n\n    func getDocumentsDirectory() -> URL {\n        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)\n        return paths[0]\n    }\n}\n\nextension SwiftQrUtilsPlugin {\n    @available(iOS 10.0, *)\n    @available(iOS 10.0, *)\n    \n    func openImagePicker() {\n        let pickerController = UIImagePickerController()\n        pickerController.delegate = self\n        pickerController.allowsEditing = false\n        pickerController.mediaTypes = [\"public.image\"]\n        pickerController.sourceType = .photoLibrary\n        controller!.present(pickerController, animated: true)\n    }\n\n    func generateQR(text:String){\n        if text == \"\" {\n            return\n        }\n        let data = text.data(using: .isoLatin1, allowLossyConversion: false)\n        let filter = CIFilter(name: \"CIQRCodeGenerator\")\n    \n        filter!.setValue(data, forKey: \"inputMessage\")\n        filter!.setValue(\"Q\", forKey: \"inputCorrectionLevel\")\n        \n        qrcodeImage = filter!.outputImage\n        displayQRCodeImage()\n    }\n    \n    func displayQRCodeImage() {\n        let scaleX = 263 / qrcodeImage.extent.size.width\n        let scaleY = 263 / qrcodeImage.extent.size.height\n        let transformedImage = qrcodeImage.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY))\n        let img:UIImage =  convert(cmage: transformedImage)\n        let imageData: Data = img.pngData()!\n        self.result!(imageData)\n    }\n    \n    func convert(cmage:CIImage) -> UIImage\n    {\n        let context:CIContext = CIContext.init(options: nil)\n        let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!\n        let image:UIImage = UIImage.init(cgImage: cgImage)\n        return image\n    }\n}\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/ios/qr_utils.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html\n#\nPod::Spec.new do |s|\n  s.name             = 'qr_utils'\n  s.version          = '0.1.5'\n  s.summary          = 'A new Flutter QR scanner and generator plugin. This plugin is use for scanning 1D barcode and 2D QR code and generating QR code as well.'\n  s.description      = <<-DESC\nA new Flutter QR scanner and generator plugin.\n                       DESC\n  s.homepage         = 'https://www.aeologic.com/'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Deepak Nishad' => 'deepak@aeologic.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.public_header_files = 'Classes/**/*.h'\n  s.resources = 'Assets/*.png'\n  s.dependency 'Flutter'\n\n  s.ios.deployment_target = '10.0'\nend\n\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/lib/qr_utils.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'package:flutter/services.dart';\nimport 'package:flutter/widgets.dart';\n\nenum PresetQRError { Ok, UnsupportedFormat, WrongDevice, WrongFWVersion }\n\nclass QrUtils {\n  static const nuxQRPrefix = \"nux://MightyAmp:\";\n  static const QRMessages = [\n    \"Imported Successfully\",\n    \"Error! Unsupported Format!\",\n    \"Error! This preset is for different amp model!\",\n    \"Error! This preset is for different firmware version!\"\n  ];\n  static const MethodChannel _channel =\n      MethodChannel('com.aeologic.adhoc.qr_utils');\n\n  // Returns Future<String> after scanning QR code\n  static Future<String?> get scanQR async {\n    final String? qrContent = await _channel.invokeMethod('scanQR');\n    return qrContent;\n  }\n\n  static Future<String?> scanImageFromData(List<int> data) async {\n    final String? qrContent =\n        await _channel.invokeMethod('scanImage', {\"data\": data});\n    return qrContent;\n  }\n\n  static Future<String?> scanImage() async {\n    final String? qrContent = await _channel.invokeMethod('scanImage');\n    return qrContent;\n  }\n\n  // Returns Future<Image> after generating QR Image\n  static Future<Image> generateQR(String content) async {\n    final Uint8List uInt8list =\n        await _channel.invokeMethod('generateQR', {\"content\": content});\n    return imageFromUInt8List(uInt8list);\n  }\n\n  // Returns Future<Image> after generating QR Image\n  static Future<Uint8List> generateQRByteArray(String content) async {\n    final Uint8List uInt8list =\n        await _channel.invokeMethod('generateQR', {\"content\": content});\n    return uInt8list;\n  }\n\n  // Returns Image from base64\n  static Image imageFromBase64String(String base64String) {\n    return Image.memory(base64Decode(base64String));\n  }\n\n  // Returns Uint8List from base64\n  static Uint8List dataFromBase64String(String base64String) {\n    return base64Decode(base64String);\n  }\n\n  // Returns String from Uint8List\n  static String base64String(Uint8List data) {\n    return base64Encode(data);\n  }\n\n  // Returns Image from Uint8List\n  static Image imageFromUInt8List(Uint8List data) {\n    return Image.memory(data);\n  }\n}\n"
  },
  {
    "path": "plugins/qr_utils-0.1.5/pubspec.yaml",
    "content": "name: qr_utils\ndescription: A new Flutter QR scanner and generator plugin. This plugin is use for scanning 1D barcode and 2D QR code and generating QR code as well.\nversion: 0.1.5\n#authors:\n#  - Deepak Nishad <deepak@aeologic.com>\n#  - Anurag Bhatt<anurag@aeologic.com>\nhomepage: https://www.aeologic.com/\ndocumentation: https://pub.dev/documentation/qr_utils/latest/\nrepository: https://github.com/flutter-devs/qr_utils\nissue_tracker: https://github.com/flutter-devs/qr_utils/issues\n\nenvironment:\n  sdk: \">=2.12.2 <3.0.0\"\n  flutter: \">=1.10.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n\n  plugin:\n    platforms:\n      android:\n        package: com.aeologic.adhoc.qr_utils\n        pluginClass: QrUtilsPlugin\n      ios:\n        pluginClass: QrUtilsPlugin\n\n\n\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: mighty_plug_manager\ndescription: Custom mighty plug/air managing app\n\n# The following line prevents the package from being accidentally published to\n# pub.dev using `pub publish`. This is preferred for private packages.\npublish_to: 'none' # Remove this line if you wish to publish to pub.dev\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.18+68\n\nenvironment:\n  sdk: \">=3.0.0 <=4.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  permission_handler: ^10.2.0\n  path_provider: ^2.0.10\n  html: ^0.15.0\n  just_audio: ^0.9.20\n\n  tinycolor2: ^3.0.1\n\n  wakelock_plus: ^1.2.10\n  package_info_plus: ^8.1.3\n  device_info_plus: ^11.2.1\n  url_launcher: ^6.3.1\n\n  drag_and_drop_lists:\n    path: ./plugins/drag_and_drop_list\n  \n  #modified to include qr scanning from gallery (for android only)\n  #and to make it null safe\n  qr_utils:\n    path: ./plugins/qr_utils-0.1.5\n\n  audio_waveform:\n    path: ./plugins/audio_waveform\n  youtube_explode_dart: ^2.0.2\n  \n  #modified audio_picker to allow multiple file selection\n  #note the ios version does not have the multi file fix\n  #maybe don't show it in ios altogether\n  audio_picker:\n    path: ./plugins/audio_picker\n  file_picker:\n    path: ./plugins/file_picker\n  #modified to work on ios but not tested\n  on_audio_query_forked: ^2.9.1\n\n  page_view_indicators: ^2.0.0\n  uuid: ^3.0.1\n  marquee_text: ^2.5.0+1\n\n  flutter_blue_plus:\n    path: ./plugins/flutter_blue_plus\n\n  flutter_web_bluetooth: ^0.2.0\n  \n  mighty_ble:\n    path: ./plugins/mighty_ble\n\n # flutter_reactive_ble: ^5.0.3\n\n  flutter_midi_command:\n    path: ./plugins/flutter_midi_command/flutter_midi_command-0.3.7\n  \n  undo: ^1.4.0\n  flutter_typeahead: ^5.2.0\n  \n  screenshot: ^3.0.0\n  share_plus: ^10.1.4\n  convert: ^3.0.1\n  pocketbase: ^0.16.0\n\n  #webview_flutter: ^4.4.2\n  #http: ^1.1.0\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  # cupertino_icons: ^0.1.3\n\ndev_dependencies:\n  flutter_launcher_icons: ^0.11.0\n  flutter_test:\n    sdk: flutter\n\n  # The \"flutter_lints\" package below contains a set of recommended lints to\n  # encourage good coding practices. The lint set provided by the package is\n  # activated in the `analysis_options.yaml` file located at the root of your\n  # package. See that file for information about deactivating specific lint\n  # rules and activating additional ones.\n  flutter_lints: ^2.0.0\n  \nflutter_icons:\n  android: \"launcher_icon\"\n  ios: false\n  image_path: \"assets/icon_big.png\"\n  adaptive_icon_background: \"#ffffff\"\n  adaptive_icon_foreground: \"assets/icon_adaptive.png\"\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  # assets must be at 2 spaces, the files at 4\n  assets:\n    - assets/audio/calibration.wav\n    - assets/images/\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  fonts:\n    - family: MightierIcons\n      fonts:\n        - asset: assets/fonts/MightierIcons.ttf\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <!--\n    If you are serving your web app in a path other than the root, change the\n    href value below to reflect the base path you are serving from.\n\n    The path provided below has to start and end with a slash \"/\" in order for\n    it to work correctly.\n\n    For more details:\n    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base\n\n    This is a placeholder for base href that will be replaced by the value of\n    the `--base-href` argument provided to `flutter build`.\n  -->\n  <base href=\"$FLUTTER_BASE_HREF\">\n\n  <meta charset=\"UTF-8\">\n  <meta content=\"IE=Edge\" http-equiv=\"X-UA-Compatible\">\n  <meta name=\"description\" content=\"A new Flutter project.\">\n\n  <!-- iOS meta tags & icons -->\n  <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n  <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n  <meta name=\"apple-mobile-web-app-title\" content=\"Mightier Amp\">\n  <link rel=\"apple-touch-icon\" href=\"icons/Icon-192.png\">\n\n  <!-- Favicon -->\n  <link rel=\"icon\" type=\"image/png\" href=\"favicon.png\"/>\n\n  <title>mighty_plug_manager</title>\n  <link rel=\"manifest\" href=\"manifest.json\">\n\n  <script>\n    // The value below is injected by flutter build, do not touch.\n    var serviceWorkerVersion = null;\n  </script>\n  <!-- This script adds the flutter initialization JS code -->\n  <script src=\"flutter.js\" defer></script>\n</head>\n<body>\n  <script>\n    window.addEventListener('load', function(ev) {\n      // Download main.dart.js\n      _flutter.loader.loadEntrypoint({\n        serviceWorker: {\n          serviceWorkerVersion: serviceWorkerVersion,\n        }\n      }).then(function(engineInitializer) {\n        return engineInitializer.initializeEngine();\n      }).then(function(appRunner) {\n        return appRunner.runApp();\n      });\n    });\n  </script>\n\n  <script type=\"module\">\n    // Import the functions you need from the SDKs you need\n    import { initializeApp } from \"https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js\";\n    // TODO: Add SDKs for Firebase products that you want to use\n    // https://firebase.google.com/docs/web/setup#available-libraries\n\n    // Your web app's Firebase configuration\n    const firebaseConfig = {\n      apiKey: \"AIzaSyAz_oTpelQhzqZmbQy9ghTWYy-9ZUDFlZg\",\n      authDomain: \"mightier-amp.firebaseapp.com\",\n      projectId: \"mightier-amp\",\n      storageBucket: \"mightier-amp.appspot.com\",\n      messagingSenderId: \"303119619345\",\n      appId: \"1:303119619345:web:04cfe58eda9631985868b0\"\n    };\n\n    // Initialize Firebase\n    const app = initializeApp(firebaseConfig);\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "web/manifest.json",
    "content": "{\n    \"name\": \"Mightier Amp\",\n    \"short_name\": \"Mightier Amp\",\n    \"start_url\": \".\",\n    \"display\": \"standalone\",\n    \"background_color\": \"#0175C2\",\n    \"theme_color\": \"#0175C2\",\n    \"description\": \"A new Flutter project.\",\n    \"orientation\": \"portrait-primary\",\n    \"prefer_related_applications\": false,\n    \"icons\": [\n        {\n            \"src\": \"icons/Icon-192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"icons/Icon-512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"icons/Icon-maskable-192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\",\n            \"purpose\": \"maskable\"\n        },\n        {\n            \"src\": \"icons/Icon-maskable-512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\",\n            \"purpose\": \"maskable\"\n        }\n    ]\n}\n"
  },
  {
    "path": "windows/.gitignore",
    "content": "flutter/ephemeral/\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n"
  },
  {
    "path": "windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(mighty_plug_manager LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"mighty_plug_manager\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\")\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n"
  },
  {
    "path": "windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      windows-x64 $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <permission_handler_windows/permission_handler_windows_plugin.h>\n#include <share_plus/share_plus_windows_plugin_c_api.h>\n#include <url_launcher_windows/url_launcher_windows.h>\n\nvoid RegisterPlugins(flutter::PluginRegistry* registry) {\n  PermissionHandlerWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"PermissionHandlerWindowsPlugin\"));\n  SharePlusWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"SharePlusWindowsPluginCApi\"));\n  UrlLauncherWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"UrlLauncherWindows\"));\n}\n"
  },
  {
    "path": "windows/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter/plugin_registry.h>\n\n// Registers Flutter plugins.\nvoid RegisterPlugins(flutter::PluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "windows/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  permission_handler_windows\n  share_plus\n  url_launcher_windows\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"com.tuntori\" \"\\0\"\n            VALUE \"FileDescription\", \"mighty_plug_manager\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"mighty_plug_manager\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2022 com.tuntori. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"mighty_plug_manager.exe\" \"\\0\"\n            VALUE \"ProductName\", \"mighty_plug_manager\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "windows/runner/flutter_window.cpp",
    "content": "#include \"flutter_window.h\"\n\n#include <optional>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nbool FlutterWindow::OnCreate() {\n  if (!Win32Window::OnCreate()) {\n    return false;\n  }\n\n  RECT frame = GetClientArea();\n\n  // The size here must match the window dimensions to avoid unnecessary surface\n  // creation / destruction in the startup path.\n  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n      frame.right - frame.left, frame.bottom - frame.top, project_);\n  // Ensure that basic setup of the controller was successful.\n  if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n    return false;\n  }\n  RegisterPlugins(flutter_controller_->engine());\n  SetChildContent(flutter_controller_->view()->GetNativeWindow());\n  return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n  if (flutter_controller_) {\n    std::optional<LRESULT> result =\n        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n    if (result) {\n      return *result;\n    }\n  }\n\n  switch (message) {\n    case WM_FONTCHANGE:\n      flutter_controller_->engine()->ReloadSystemFonts();\n      break;\n  }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}\n"
  },
  {
    "path": "windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.CreateAndShow(L\"Mightier Amp\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr);\n  std::string utf8_string;\n  if (target_length == 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, utf8_string.data(),\n      target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <flutter_windows.h>\n\n#include \"resource.h\"\n\nnamespace {\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n    FreeLibrary(user32_module);\n  }\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::CreateAndShow(const std::wstring& title,\n                                const Point& origin,\n                                const Size& size) {\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  return OnCreate();\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n"
  },
  {
    "path": "windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates and shows a win32 window with |title| and position and size using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size to will treat the width height passed in to this function\n  // as logical pixels and scale to appropriate for the default monitor. Returns\n  // true if the window was created successfully.\n  bool CreateAndShow(const std::wstring& title,\n                     const Point& origin,\n                     const Size& size);\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responsponds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  }
]