MiniAudio Wrapper - Playing Sounds
This commit is contained in:
parent
15e4793ba8
commit
f8a9b2c67f
Binary file not shown.
|
@ -2,6 +2,7 @@ import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:cwtch/config.dart';
|
import 'package:cwtch/config.dart';
|
||||||
|
import 'package:cwtch/third_party/miniaudio/lib/miniaudio.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
enum ModalState { none, storageMigration, shutdown }
|
enum ModalState { none, storageMigration, shutdown }
|
||||||
|
@ -28,6 +29,10 @@ class AppState extends ChangeNotifier {
|
||||||
|
|
||||||
void SetCwtchInit() {
|
void SetCwtchInit() {
|
||||||
cwtchInit = true;
|
cwtchInit = true;
|
||||||
|
var audio = MiniAudio();
|
||||||
|
audio.initAudio().then((value) {
|
||||||
|
audio.playAudio("assets/sounds_online.wav");
|
||||||
|
});
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,7 @@ dependencies:
|
||||||
ffi: ^2.0.1
|
ffi: ^2.0.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
ffigen: ^6.1.2
|
ffigen: 11.0.0
|
||||||
image: ^3.0.1
|
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern "C" {
|
||||||
if (latestFrame.empty()) {
|
if (latestFrame.empty()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
cap.release();
|
cap.release();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
# Miscellaneous
|
|
||||||
*.class
|
|
||||||
*.log
|
|
||||||
*.pyc
|
|
||||||
*.swp
|
|
||||||
.DS_Store
|
|
||||||
.atom/
|
|
||||||
.buildlog/
|
|
||||||
.history
|
|
||||||
.svn/
|
|
||||||
migrate_working_dir/
|
|
||||||
|
|
||||||
# IntelliJ related
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
# The .vscode folder contains launch configuration and tasks you configure in
|
|
||||||
# VS Code which you may wish to be included in version control, so this line
|
|
||||||
# is commented out by default.
|
|
||||||
#.vscode/
|
|
||||||
|
|
||||||
# Flutter/Dart/Pub related
|
|
||||||
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
|
|
||||||
/pubspec.lock
|
|
||||||
**/doc/api/
|
|
||||||
.dart_tool/
|
|
||||||
build/
|
|
|
@ -1,42 +0,0 @@
|
||||||
# This file tracks properties of this Flutter project.
|
|
||||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
|
||||||
#
|
|
||||||
# This file should be version controlled and should not be manually edited.
|
|
||||||
|
|
||||||
version:
|
|
||||||
revision: "41456452f29d64e8deb623a3c927524bcf9f111b"
|
|
||||||
channel: "stable"
|
|
||||||
|
|
||||||
project_type: plugin
|
|
||||||
|
|
||||||
# Tracks metadata for the flutter migrate command
|
|
||||||
migration:
|
|
||||||
platforms:
|
|
||||||
- platform: root
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
- platform: android
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
- platform: ios
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
- platform: linux
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
- platform: macos
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
- platform: windows
|
|
||||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
|
||||||
|
|
||||||
# User provided section
|
|
||||||
|
|
||||||
# List of Local paths (relative to this file) that should be
|
|
||||||
# ignored by the migrate tool.
|
|
||||||
#
|
|
||||||
# Files that are not part of the templates will be ignored by default.
|
|
||||||
unmanaged_files:
|
|
||||||
- 'lib/main.dart'
|
|
||||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
|
|
@ -1,3 +0,0 @@
|
||||||
## 0.0.1
|
|
||||||
|
|
||||||
* TODO: Describe initial release.
|
|
|
@ -1 +0,0 @@
|
||||||
TODO: Add your license here.
|
|
|
@ -1,15 +0,0 @@
|
||||||
# miniaudio
|
|
||||||
|
|
||||||
A new Flutter plugin project.
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
This project is a starting point for a Flutter
|
|
||||||
[plug-in package](https://flutter.dev/developing-packages/),
|
|
||||||
a specialized package that includes platform-specific implementation code for
|
|
||||||
Android and/or iOS.
|
|
||||||
|
|
||||||
For help getting started with Flutter development, view the
|
|
||||||
[online documentation](https://flutter.dev/docs), which offers tutorials,
|
|
||||||
samples, guidance on mobile development, and a full API reference.
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
*.iml
|
|
||||||
.gradle
|
|
||||||
/local.properties
|
|
||||||
/.idea/workspace.xml
|
|
||||||
/.idea/libraries
|
|
||||||
.DS_Store
|
|
||||||
/build
|
|
||||||
/captures
|
|
||||||
.cxx
|
|
|
@ -1,68 +0,0 @@
|
||||||
group 'com.example.miniaudio'
|
|
||||||
version '1.0-SNAPSHOT'
|
|
||||||
|
|
||||||
buildscript {
|
|
||||||
ext.kotlin_version = '1.7.10'
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:7.3.0'
|
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apply plugin: 'com.android.library'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
android {
|
|
||||||
if (project.android.hasProperty("namespace")) {
|
|
||||||
namespace 'com.example.miniaudio'
|
|
||||||
}
|
|
||||||
|
|
||||||
compileSdkVersion 33
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = '1.8'
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main.java.srcDirs += 'src/main/kotlin'
|
|
||||||
test.java.srcDirs += 'src/test/kotlin'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdkVersion 19
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
testImplementation 'org.jetbrains.kotlin:kotlin-test'
|
|
||||||
testImplementation 'org.mockito:mockito-core:5.0.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
testOptions {
|
|
||||||
unitTests.all {
|
|
||||||
useJUnitPlatform()
|
|
||||||
|
|
||||||
testLogging {
|
|
||||||
events "passed", "skipped", "failed", "standardOut", "standardError"
|
|
||||||
outputs.upToDateWhen {false}
|
|
||||||
showStandardStreams = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
rootProject.name = 'miniaudio'
|
|
|
@ -1,3 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.example.miniaudio">
|
|
||||||
</manifest>
|
|
|
@ -1,35 +0,0 @@
|
||||||
package com.example.miniaudio
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull
|
|
||||||
|
|
||||||
import io.flutter.embedding.engine.plugins.FlutterPlugin
|
|
||||||
import io.flutter.plugin.common.MethodCall
|
|
||||||
import io.flutter.plugin.common.MethodChannel
|
|
||||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
|
|
||||||
import io.flutter.plugin.common.MethodChannel.Result
|
|
||||||
|
|
||||||
/** MiniaudioPlugin */
|
|
||||||
class MiniaudioPlugin: FlutterPlugin, MethodCallHandler {
|
|
||||||
/// The MethodChannel that will the communication between Flutter and native Android
|
|
||||||
///
|
|
||||||
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
|
|
||||||
/// when the Flutter Engine is detached from the Activity
|
|
||||||
private lateinit var channel : MethodChannel
|
|
||||||
|
|
||||||
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
|
|
||||||
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "miniaudio")
|
|
||||||
channel.setMethodCallHandler(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onMethodCall(call: MethodCall, result: Result) {
|
|
||||||
if (call.method == "getPlatformVersion") {
|
|
||||||
result.success("Android ${android.os.Build.VERSION.RELEASE}")
|
|
||||||
} else {
|
|
||||||
result.notImplemented()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
|
||||||
channel.setMethodCallHandler(null)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
package com.example.miniaudio
|
|
||||||
|
|
||||||
import io.flutter.plugin.common.MethodCall
|
|
||||||
import io.flutter.plugin.common.MethodChannel
|
|
||||||
import kotlin.test.Test
|
|
||||||
import org.mockito.Mockito
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation.
|
|
||||||
*
|
|
||||||
* Once you have built the plugin's example app, you can run these tests from the command
|
|
||||||
* line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or
|
|
||||||
* you can run them directly from IDEs that support JUnit such as Android Studio.
|
|
||||||
*/
|
|
||||||
|
|
||||||
internal class MiniaudioPluginTest {
|
|
||||||
@Test
|
|
||||||
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
|
|
||||||
val plugin = MiniaudioPlugin()
|
|
||||||
|
|
||||||
val call = MethodCall("getPlatformVersion", null)
|
|
||||||
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
|
|
||||||
plugin.onMethodCall(call, mockResult)
|
|
||||||
|
|
||||||
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Run with `flutter pub run ffigen --config ffigen.yaml`.
|
||||||
|
name: MiniAudioBindings
|
||||||
|
description: |
|
||||||
|
Bindings for `src/audio.h`.
|
||||||
|
|
||||||
|
Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
|
||||||
|
output: 'lib/miniaudio_bindings_generated.dart'
|
||||||
|
headers:
|
||||||
|
entry-points:
|
||||||
|
- 'src/audio.h'
|
||||||
|
include-directives:
|
||||||
|
- 'src/audio.h'
|
||||||
|
preamble: |
|
||||||
|
// ignore_for_file: always_specify_types
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
// ignore_for_file: non_constant_identifier_names
|
||||||
|
comments:
|
||||||
|
style: any
|
||||||
|
length: full
|
|
@ -1,8 +1,27 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'dart:ffi';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
import 'package:miniaudio/miniaudio_bindings_generated.dart';
|
||||||
|
|
||||||
import 'miniaudio_platform_interface.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
|
|
||||||
class Miniaudio {
|
class MiniAudio {
|
||||||
Future<String?> getPlatformVersion() {
|
late MiniAudioBindings _bindings;
|
||||||
return MiniaudioPlatform.instance.getPlatformVersion();
|
|
||||||
|
MiniAudio() {
|
||||||
|
final dylib = DynamicLibrary.open('libminiaudio.so');
|
||||||
|
_bindings = MiniAudioBindings(dylib);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> initAudio() async {
|
||||||
|
_bindings.initAudio();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open Default Camera
|
||||||
|
Future<void> playAudio(String file) async {
|
||||||
|
var filePtr = file.toNativeUtf8();
|
||||||
|
_bindings.playAudio(filePtr.cast());
|
||||||
|
malloc.free(filePtr);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
// ignore_for_file: always_specify_types
|
||||||
|
// ignore_for_file: camel_case_types
|
||||||
|
// ignore_for_file: non_constant_identifier_names
|
||||||
|
|
||||||
|
// AUTO GENERATED FILE, DO NOT EDIT.
|
||||||
|
//
|
||||||
|
// Generated by `package:ffigen`.
|
||||||
|
import 'dart:ffi' as ffi;
|
||||||
|
|
||||||
|
/// Bindings for `src/audio.h`.
|
||||||
|
///
|
||||||
|
/// Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
|
||||||
|
///
|
||||||
|
class MiniAudioBindings {
|
||||||
|
/// Holds the symbol lookup function.
|
||||||
|
final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
|
||||||
|
_lookup;
|
||||||
|
|
||||||
|
/// The symbols are looked up in [dynamicLibrary].
|
||||||
|
MiniAudioBindings(ffi.DynamicLibrary dynamicLibrary)
|
||||||
|
: _lookup = dynamicLibrary.lookup;
|
||||||
|
|
||||||
|
/// The symbols are looked up with [lookup].
|
||||||
|
MiniAudioBindings.fromLookup(
|
||||||
|
ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
|
||||||
|
lookup)
|
||||||
|
: _lookup = lookup;
|
||||||
|
|
||||||
|
void initAudio() {
|
||||||
|
return _initAudio();
|
||||||
|
}
|
||||||
|
|
||||||
|
late final _initAudioPtr =
|
||||||
|
_lookup<ffi.NativeFunction<ffi.Void Function()>>('initAudio');
|
||||||
|
late final _initAudio = _initAudioPtr.asFunction<void Function()>();
|
||||||
|
|
||||||
|
void playAudio(
|
||||||
|
ffi.Pointer<ffi.Char> file,
|
||||||
|
) {
|
||||||
|
return _playAudio(
|
||||||
|
file,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
late final _playAudioPtr =
|
||||||
|
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Char>)>>(
|
||||||
|
'playAudio');
|
||||||
|
late final _playAudio =
|
||||||
|
_playAudioPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
|
||||||
|
}
|
|
@ -1,17 +0,0 @@
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
|
|
||||||
import 'miniaudio_platform_interface.dart';
|
|
||||||
|
|
||||||
/// An implementation of [MiniaudioPlatform] that uses method channels.
|
|
||||||
class MethodChannelMiniaudio extends MiniaudioPlatform {
|
|
||||||
/// The method channel used to interact with the native platform.
|
|
||||||
@visibleForTesting
|
|
||||||
final methodChannel = const MethodChannel('miniaudio');
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String?> getPlatformVersion() async {
|
|
||||||
final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
|
||||||
|
|
||||||
import 'miniaudio_method_channel.dart';
|
|
||||||
|
|
||||||
abstract class MiniaudioPlatform extends PlatformInterface {
|
|
||||||
/// Constructs a MiniaudioPlatform.
|
|
||||||
MiniaudioPlatform() : super(token: _token);
|
|
||||||
|
|
||||||
static final Object _token = Object();
|
|
||||||
|
|
||||||
static MiniaudioPlatform _instance = MethodChannelMiniaudio();
|
|
||||||
|
|
||||||
/// The default instance of [MiniaudioPlatform] to use.
|
|
||||||
///
|
|
||||||
/// Defaults to [MethodChannelMiniaudio].
|
|
||||||
static MiniaudioPlatform get instance => _instance;
|
|
||||||
|
|
||||||
/// Platform-specific implementations should set this with their own
|
|
||||||
/// platform-specific class that extends [MiniaudioPlatform] when
|
|
||||||
/// they register themselves.
|
|
||||||
static set instance(MiniaudioPlatform instance) {
|
|
||||||
PlatformInterface.verifyToken(instance, _token);
|
|
||||||
_instance = instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String?> getPlatformVersion() {
|
|
||||||
throw UnimplementedError('platformVersion() has not been implemented.');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,88 +7,16 @@ cmake_minimum_required(VERSION 3.10)
|
||||||
set(PROJECT_NAME "miniaudio")
|
set(PROJECT_NAME "miniaudio")
|
||||||
project(${PROJECT_NAME} LANGUAGES CXX)
|
project(${PROJECT_NAME} LANGUAGES CXX)
|
||||||
|
|
||||||
# This value is used when generating builds using this plugin, so it must
|
# Invoke the build for native code shared with the other target platforms.
|
||||||
# not be changed.
|
# This can be changed to accommodate different builds.
|
||||||
set(PLUGIN_NAME "miniaudio_plugin")
|
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared")
|
||||||
|
|
||||||
# Any new source files that you add to the plugin should be added here.
|
|
||||||
list(APPEND PLUGIN_SOURCES
|
|
||||||
"miniaudio_plugin.cc"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Define the plugin library target. Its name must not be changed (see comment
|
|
||||||
# on PLUGIN_NAME above).
|
|
||||||
add_library(${PLUGIN_NAME} SHARED
|
|
||||||
${PLUGIN_SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Apply a standard set of build settings that are configured in the
|
|
||||||
# application-level CMakeLists.txt. This can be removed for plugins that want
|
|
||||||
# full control over build settings.
|
|
||||||
apply_standard_settings(${PLUGIN_NAME})
|
|
||||||
|
|
||||||
# Symbols are hidden by default to reduce the chance of accidental conflicts
|
|
||||||
# between plugins. This should not be removed; any symbols that should be
|
|
||||||
# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro.
|
|
||||||
set_target_properties(${PLUGIN_NAME} PROPERTIES
|
|
||||||
CXX_VISIBILITY_PRESET hidden)
|
|
||||||
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
|
|
||||||
|
|
||||||
# Source include directories and library dependencies. Add any plugin-specific
|
|
||||||
# dependencies here.
|
|
||||||
target_include_directories(${PLUGIN_NAME} INTERFACE
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/include")
|
|
||||||
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter)
|
|
||||||
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)
|
|
||||||
|
|
||||||
# List of absolute paths to libraries that should be bundled with the plugin.
|
# List of absolute paths to libraries that should be bundled with the plugin.
|
||||||
# This list could contain prebuilt libraries, or libraries created by an
|
# This list could contain prebuilt libraries, or libraries created by an
|
||||||
# external build triggered from this build file.
|
# external build triggered from this build file.
|
||||||
set(miniaudio_bundled_libraries
|
set(miniaudio_bundled_libraries
|
||||||
""
|
# Defined in ../src/CMakeLists.txt.
|
||||||
|
# This can be changed to accommodate different builds.
|
||||||
|
$<TARGET_FILE:miniaudio>
|
||||||
PARENT_SCOPE
|
PARENT_SCOPE
|
||||||
)
|
)
|
||||||
|
|
||||||
# === Tests ===
|
|
||||||
# These unit tests can be run from a terminal after building the example.
|
|
||||||
|
|
||||||
# Only enable test builds when building the example (which sets this variable)
|
|
||||||
# so that plugin clients aren't building the tests.
|
|
||||||
if (${include_${PROJECT_NAME}_tests})
|
|
||||||
if(${CMAKE_VERSION} VERSION_LESS "3.11.0")
|
|
||||||
message("Unit tests require CMake 3.11.0 or later")
|
|
||||||
else()
|
|
||||||
set(TEST_RUNNER "${PROJECT_NAME}_test")
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
# Add the Google Test dependency.
|
|
||||||
include(FetchContent)
|
|
||||||
FetchContent_Declare(
|
|
||||||
googletest
|
|
||||||
URL https://github.com/google/googletest/archive/release-1.11.0.zip
|
|
||||||
)
|
|
||||||
# Prevent overriding the parent project's compiler/linker settings
|
|
||||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
||||||
# Disable install commands for gtest so it doesn't end up in the bundle.
|
|
||||||
set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE)
|
|
||||||
|
|
||||||
FetchContent_MakeAvailable(googletest)
|
|
||||||
|
|
||||||
# The plugin's exported API is not very useful for unit testing, so build the
|
|
||||||
# sources directly into the test binary rather than using the shared library.
|
|
||||||
add_executable(${TEST_RUNNER}
|
|
||||||
test/miniaudio_plugin_test.cc
|
|
||||||
${PLUGIN_SOURCES}
|
|
||||||
)
|
|
||||||
apply_standard_settings(${TEST_RUNNER})
|
|
||||||
target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
target_link_libraries(${TEST_RUNNER} PRIVATE flutter)
|
|
||||||
target_link_libraries(${TEST_RUNNER} PRIVATE PkgConfig::GTK)
|
|
||||||
target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock)
|
|
||||||
|
|
||||||
# Enable automatic test discovery.
|
|
||||||
include(GoogleTest)
|
|
||||||
gtest_discover_tests(${TEST_RUNNER})
|
|
||||||
|
|
||||||
endif() # CMake version check
|
|
||||||
endif() # include_${PROJECT_NAME}_tests
|
|
|
@ -1,26 +0,0 @@
|
||||||
#ifndef FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
||||||
#define FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
||||||
|
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#ifdef FLUTTER_PLUGIN_IMPL
|
|
||||||
#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default")))
|
|
||||||
#else
|
|
||||||
#define FLUTTER_PLUGIN_EXPORT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _MiniaudioPlugin MiniaudioPlugin;
|
|
||||||
typedef struct {
|
|
||||||
GObjectClass parent_class;
|
|
||||||
} MiniaudioPluginClass;
|
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT GType miniaudio_plugin_get_type();
|
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT void miniaudio_plugin_register_with_registrar(
|
|
||||||
FlPluginRegistrar* registrar);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif // FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
|
@ -1,87 +0,0 @@
|
||||||
#include "include/miniaudio/miniaudio_plugin.h"
|
|
||||||
|
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "miniaudio_plugin_private.h"
|
|
||||||
#include "miniaudio.h"
|
|
||||||
|
|
||||||
#define MINIAUDIO_PLUGIN(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), miniaudio_plugin_get_type(), \
|
|
||||||
MiniaudioPlugin))
|
|
||||||
|
|
||||||
struct _MiniaudioPlugin {
|
|
||||||
GObject parent_instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE(MiniaudioPlugin, miniaudio_plugin, g_object_get_type())
|
|
||||||
|
|
||||||
// Called when a method call is received from Flutter.
|
|
||||||
static void miniaudio_plugin_handle_method_call(
|
|
||||||
MiniaudioPlugin* self,
|
|
||||||
FlMethodCall* method_call) {
|
|
||||||
g_autoptr(FlMethodResponse) response = nullptr;
|
|
||||||
|
|
||||||
const gchar* method = fl_method_call_get_name(method_call);
|
|
||||||
//const FlValue* args = fl_method_call_get_args(method_call);
|
|
||||||
|
|
||||||
if (strcmp(method, "getPlatformVersion") == 0) {
|
|
||||||
response = get_platform_version();
|
|
||||||
}else if (strcmp(method, "playAudio") == 0) {
|
|
||||||
// ma_decoder decoder;
|
|
||||||
// ma_result result;
|
|
||||||
// result = ma_decoder_init_file(fl_value_get_string(0), NULL, &decoder);
|
|
||||||
// if (result != MA_SUCCESS) {
|
|
||||||
/// printf("Could not load file: %s\n", fl_value_get_string(0));
|
|
||||||
// }
|
|
||||||
|
|
||||||
//response = nullptr;
|
|
||||||
} else {
|
|
||||||
response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new());
|
|
||||||
}
|
|
||||||
|
|
||||||
fl_method_call_respond(method_call, response, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
FlMethodResponse* get_platform_version() {
|
|
||||||
struct utsname uname_data = {};
|
|
||||||
uname(&uname_data);
|
|
||||||
g_autofree gchar *version = g_strdup_printf("Linux %s", uname_data.version);
|
|
||||||
g_autoptr(FlValue) result = fl_value_new_string(version);
|
|
||||||
return FL_METHOD_RESPONSE(fl_method_success_response_new(result));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void miniaudio_plugin_dispose(GObject* object) {
|
|
||||||
G_OBJECT_CLASS(miniaudio_plugin_parent_class)->dispose(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void miniaudio_plugin_class_init(MiniaudioPluginClass* klass) {
|
|
||||||
G_OBJECT_CLASS(klass)->dispose = miniaudio_plugin_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void miniaudio_plugin_init(MiniaudioPlugin* self) {}
|
|
||||||
|
|
||||||
static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call,
|
|
||||||
gpointer user_data) {
|
|
||||||
MiniaudioPlugin* plugin = MINIAUDIO_PLUGIN(user_data);
|
|
||||||
miniaudio_plugin_handle_method_call(plugin, method_call);
|
|
||||||
}
|
|
||||||
|
|
||||||
void miniaudio_plugin_register_with_registrar(FlPluginRegistrar* registrar) {
|
|
||||||
MiniaudioPlugin* plugin = MINIAUDIO_PLUGIN(
|
|
||||||
g_object_new(miniaudio_plugin_get_type(), nullptr));
|
|
||||||
|
|
||||||
g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
|
|
||||||
g_autoptr(FlMethodChannel) channel =
|
|
||||||
fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),
|
|
||||||
"miniaudio",
|
|
||||||
FL_METHOD_CODEC(codec));
|
|
||||||
fl_method_channel_set_method_call_handler(channel, method_call_cb,
|
|
||||||
g_object_ref(plugin),
|
|
||||||
g_object_unref);
|
|
||||||
|
|
||||||
g_object_unref(plugin);
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
|
|
||||||
#include "include/miniaudio/miniaudio_plugin.h"
|
|
||||||
|
|
||||||
// This file exposes some plugin internals for unit testing. See
|
|
||||||
// https://github.com/flutter/flutter/issues/88724 for current limitations
|
|
||||||
// in the unit-testable API.
|
|
||||||
|
|
||||||
// Handles the getPlatformVersion method call.
|
|
||||||
FlMethodResponse *get_platform_version();
|
|
|
@ -1,31 +0,0 @@
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
#include <gmock/gmock.h>
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
|
|
||||||
#include "include/miniaudio/miniaudio_plugin.h"
|
|
||||||
#include "miniaudio_plugin_private.h"
|
|
||||||
|
|
||||||
// This demonstrates a simple unit test of the C portion of this plugin's
|
|
||||||
// implementation.
|
|
||||||
//
|
|
||||||
// Once you have built the plugin's example app, you can run these tests
|
|
||||||
// from the command line. For instance, for a plugin called my_plugin
|
|
||||||
// built for x64 debug, run:
|
|
||||||
// $ build/linux/x64/debug/plugins/my_plugin/my_plugin_test
|
|
||||||
|
|
||||||
namespace miniaudio {
|
|
||||||
namespace test {
|
|
||||||
|
|
||||||
TEST(MiniaudioPlugin, GetPlatformVersion) {
|
|
||||||
g_autoptr(FlMethodResponse) response = get_platform_version();
|
|
||||||
ASSERT_NE(response, nullptr);
|
|
||||||
ASSERT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
|
|
||||||
FlValue* result = fl_method_success_response_get_result(
|
|
||||||
FL_METHOD_SUCCESS_RESPONSE(response));
|
|
||||||
ASSERT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_STRING);
|
|
||||||
// The full string varies, so just validate that it has the right format.
|
|
||||||
EXPECT_THAT(fl_value_get_string(result), testing::StartsWith("Linux "));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace test
|
|
||||||
} // namespace miniaudio
|
|
|
@ -1,19 +0,0 @@
|
||||||
import Cocoa
|
|
||||||
import FlutterMacOS
|
|
||||||
|
|
||||||
public class MiniaudioPlugin: NSObject, FlutterPlugin {
|
|
||||||
public static func register(with registrar: FlutterPluginRegistrar) {
|
|
||||||
let channel = FlutterMethodChannel(name: "miniaudio", binaryMessenger: registrar.messenger)
|
|
||||||
let instance = MiniaudioPlugin()
|
|
||||||
registrar.addMethodCallDelegate(instance, channel: channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
|
||||||
switch call.method {
|
|
||||||
case "getPlatformVersion":
|
|
||||||
result("macOS " + ProcessInfo.processInfo.operatingSystemVersionString)
|
|
||||||
default:
|
|
||||||
result(FlutterMethodNotImplemented)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
#
|
|
||||||
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
|
|
||||||
# Run `pod lib lint miniaudio.podspec` to validate before publishing.
|
|
||||||
#
|
|
||||||
Pod::Spec.new do |s|
|
|
||||||
s.name = 'miniaudio'
|
|
||||||
s.version = '0.0.1'
|
|
||||||
s.summary = 'A new Flutter plugin project.'
|
|
||||||
s.description = <<-DESC
|
|
||||||
A new Flutter plugin project.
|
|
||||||
DESC
|
|
||||||
s.homepage = 'http://example.com'
|
|
||||||
s.license = { :file => '../LICENSE' }
|
|
||||||
s.author = { 'Your Company' => 'email@example.com' }
|
|
||||||
|
|
||||||
s.source = { :path => '.' }
|
|
||||||
s.source_files = 'Classes/**/*'
|
|
||||||
s.dependency 'FlutterMacOS'
|
|
||||||
|
|
||||||
s.platform = :osx, '10.11'
|
|
||||||
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
|
|
||||||
s.swift_version = '5.0'
|
|
||||||
end
|
|
|
@ -0,0 +1,333 @@
|
||||||
|
# Generated by pub
|
||||||
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
|
packages:
|
||||||
|
archive:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: archive
|
||||||
|
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.4.10"
|
||||||
|
args:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: args
|
||||||
|
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.2"
|
||||||
|
async:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: async
|
||||||
|
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.11.0"
|
||||||
|
boolean_selector:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: boolean_selector
|
||||||
|
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.1"
|
||||||
|
characters:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: characters
|
||||||
|
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.0"
|
||||||
|
cli_util:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: cli_util
|
||||||
|
sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.5"
|
||||||
|
clock:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: clock
|
||||||
|
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.1"
|
||||||
|
collection:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: collection
|
||||||
|
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.18.0"
|
||||||
|
convert:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: convert
|
||||||
|
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.1"
|
||||||
|
crypto:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: crypto
|
||||||
|
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.3"
|
||||||
|
fake_async:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: fake_async
|
||||||
|
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.1"
|
||||||
|
ffi:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: ffi
|
||||||
|
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
|
ffigen:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: ffigen
|
||||||
|
sha256: ec6a2439159d27c871d92862fb9f3012ef19d9ec4b0fa383c69c8553b2dd2ac5
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.1.2"
|
||||||
|
file:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: file
|
||||||
|
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.1.4"
|
||||||
|
flutter:
|
||||||
|
dependency: "direct main"
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
|
flutter_lints:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: flutter_lints
|
||||||
|
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.3"
|
||||||
|
flutter_test:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
|
glob:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: glob
|
||||||
|
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.2"
|
||||||
|
image:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: image
|
||||||
|
sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.3.0"
|
||||||
|
js:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: js
|
||||||
|
sha256: "4186c61b32f99e60f011f7160e32c89a758ae9b1d0c6d28e2c02ef0382300e2b"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.7.0"
|
||||||
|
lints:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: lints
|
||||||
|
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.1"
|
||||||
|
logging:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: logging
|
||||||
|
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
|
matcher:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: matcher
|
||||||
|
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.12.16"
|
||||||
|
material_color_utilities:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: material_color_utilities
|
||||||
|
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.5.0"
|
||||||
|
meta:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: meta
|
||||||
|
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.10.0"
|
||||||
|
path:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path
|
||||||
|
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.8.3"
|
||||||
|
petitparser:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: petitparser
|
||||||
|
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.0.2"
|
||||||
|
plugin_platform_interface:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: plugin_platform_interface
|
||||||
|
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.8"
|
||||||
|
pointycastle:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: pointycastle
|
||||||
|
sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.7.4"
|
||||||
|
quiver:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: quiver
|
||||||
|
sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.2.1"
|
||||||
|
sky_engine:
|
||||||
|
dependency: transitive
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.99"
|
||||||
|
source_span:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_span
|
||||||
|
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.10.0"
|
||||||
|
stack_trace:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: stack_trace
|
||||||
|
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.11.1"
|
||||||
|
stream_channel:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: stream_channel
|
||||||
|
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.2"
|
||||||
|
string_scanner:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: string_scanner
|
||||||
|
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
|
term_glyph:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: term_glyph
|
||||||
|
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.1"
|
||||||
|
test_api:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: test_api
|
||||||
|
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.6.1"
|
||||||
|
typed_data:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: typed_data
|
||||||
|
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.2"
|
||||||
|
vector_math:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: vector_math
|
||||||
|
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.4"
|
||||||
|
web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: web
|
||||||
|
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.0"
|
||||||
|
xml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: xml
|
||||||
|
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.5.0"
|
||||||
|
yaml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: yaml
|
||||||
|
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.2"
|
||||||
|
sdks:
|
||||||
|
dart: ">=3.2.0 <4.0.0"
|
||||||
|
flutter: ">=3.3.0"
|
|
@ -1,18 +1,20 @@
|
||||||
name: miniaudio
|
name: miniaudio
|
||||||
description: "A new Flutter plugin project."
|
description: Play audio
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
homepage:
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.2.6 <4.0.0'
|
sdk: '>=3.1.0 <4.0.0'
|
||||||
flutter: '>=3.3.0'
|
flutter: '>=3.3.0'
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
plugin_platform_interface: ^2.0.2
|
plugin_platform_interface: ^2.0.2
|
||||||
|
ffi: ^2.0.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
ffigen: ^6.1.2
|
||||||
|
image: ^3.0.1
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
@ -32,19 +34,12 @@ flutter:
|
||||||
# This is required for using `dart:ffi`.
|
# This is required for using `dart:ffi`.
|
||||||
# All these are used by the tooling to maintain consistency when
|
# All these are used by the tooling to maintain consistency when
|
||||||
# adding or updating assets for this project.
|
# adding or updating assets for this project.
|
||||||
|
#
|
||||||
|
# Please refer to README.md for a detailed explanation.
|
||||||
plugin:
|
plugin:
|
||||||
platforms:
|
platforms:
|
||||||
android:
|
|
||||||
package: com.example.miniaudio
|
|
||||||
pluginClass: MiniaudioPlugin
|
|
||||||
ios:
|
|
||||||
pluginClass: MiniaudioPlugin
|
|
||||||
linux:
|
linux:
|
||||||
pluginClass: MiniaudioPlugin
|
ffiPlugin: true
|
||||||
macos:
|
|
||||||
pluginClass: MiniaudioPlugin
|
|
||||||
windows:
|
|
||||||
pluginClass: MiniaudioPluginCApi
|
|
||||||
|
|
||||||
# To add assets to your plugin package, add an assets section, like this:
|
# To add assets to your plugin package, add an assets section, like this:
|
||||||
# assets:
|
# assets:
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
project(audio_library VERSION 0.0.1 LANGUAGES C CXX)
|
||||||
|
|
||||||
|
add_library(miniaudio SHARED "audio.c")
|
||||||
|
target_link_libraries(miniaudio)
|
||||||
|
|
||||||
|
set_target_properties(miniaudio PROPERTIES
|
||||||
|
PUBLIC_HEADER audio.h
|
||||||
|
PUBLIC_HEADER miniaudio.h
|
||||||
|
OUTPUT_NAME "miniaudio"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(miniaudio PUBLIC DART_SHARED_LIB)
|
|
@ -0,0 +1,67 @@
|
||||||
|
#define MINIAUDIO_IMPLEMENTATION
|
||||||
|
#include "miniaudio.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
ma_device recording_device;
|
||||||
|
ma_engine engine;
|
||||||
|
void initAudio() {
|
||||||
|
ma_result result;
|
||||||
|
result = ma_engine_init(NULL, &engine);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
printf("Could not init engine\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void playAudio(char * file) {
|
||||||
|
ma_engine_play_sound(&engine, file, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
|
||||||
|
{
|
||||||
|
ma_encoder* pEncoder = (ma_encoder*)pDevice->pUserData;
|
||||||
|
MA_ASSERT(pEncoder != NULL);
|
||||||
|
|
||||||
|
ma_encoder_write_pcm_frames(pEncoder, pInput, frameCount, NULL);
|
||||||
|
|
||||||
|
(void)pOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
void startRecording() {
|
||||||
|
ma_result result;
|
||||||
|
ma_encoder_config encoderConfig;
|
||||||
|
ma_encoder encoder;
|
||||||
|
ma_device_config deviceConfig;
|
||||||
|
|
||||||
|
encoderConfig = ma_encoder_config_init(ma_encoding_format_wav, ma_format_f32, 2, 44100);
|
||||||
|
deviceConfig = ma_device_config_init(ma_device_type_capture);
|
||||||
|
deviceConfig.capture.format = encoder.config.format;
|
||||||
|
deviceConfig.capture.channels = encoder.config.channels;
|
||||||
|
deviceConfig.sampleRate = encoder.config.sampleRate;
|
||||||
|
deviceConfig.dataCallback = data_callback;
|
||||||
|
deviceConfig.pUserData = &encoder;
|
||||||
|
|
||||||
|
if (ma_encoder_init_file("test.wav", &encoderConfig, &encoder) != MA_SUCCESS) {
|
||||||
|
printf("Failed to initialize output file.\n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = ma_device_init(NULL, &deviceConfig, &recording_device);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
printf("Failed to initialize capture device.\n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = ma_device_start(&recording_device);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
printf("Failed to start device.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopRecording() {
|
||||||
|
ma_result result;
|
||||||
|
result = ma_device_stop(&recording_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "miniaudio.h"
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void initAudio();
|
||||||
|
void playAudio(char * file);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:miniaudio/miniaudio_method_channel.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
TestWidgetsFlutterBinding.ensureInitialized();
|
|
||||||
|
|
||||||
MethodChannelMiniaudio platform = MethodChannelMiniaudio();
|
|
||||||
const MethodChannel channel = MethodChannel('miniaudio');
|
|
||||||
|
|
||||||
setUp(() {
|
|
||||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(
|
|
||||||
channel,
|
|
||||||
(MethodCall methodCall) async {
|
|
||||||
return '42';
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
tearDown(() {
|
|
||||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, null);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('getPlatformVersion', () async {
|
|
||||||
expect(await platform.getPlatformVersion(), '42');
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:miniaudio/miniaudio.dart';
|
|
||||||
import 'package:miniaudio/miniaudio_platform_interface.dart';
|
|
||||||
import 'package:miniaudio/miniaudio_method_channel.dart';
|
|
||||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
|
||||||
|
|
||||||
class MockMiniaudioPlatform
|
|
||||||
with MockPlatformInterfaceMixin
|
|
||||||
implements MiniaudioPlatform {
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String?> getPlatformVersion() => Future.value('42');
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
final MiniaudioPlatform initialPlatform = MiniaudioPlatform.instance;
|
|
||||||
|
|
||||||
test('$MethodChannelMiniaudio is the default instance', () {
|
|
||||||
expect(initialPlatform, isInstanceOf<MethodChannelMiniaudio>());
|
|
||||||
});
|
|
||||||
|
|
||||||
test('getPlatformVersion', () async {
|
|
||||||
Miniaudio miniaudioPlugin = Miniaudio();
|
|
||||||
MockMiniaudioPlatform fakePlatform = MockMiniaudioPlatform();
|
|
||||||
MiniaudioPlatform.instance = fakePlatform;
|
|
||||||
|
|
||||||
expect(await miniaudioPlugin.getPlatformVersion(), '42');
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
flutter/
|
|
||||||
|
|
||||||
# Visual Studio user-specific files.
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
*.userosscache
|
|
||||||
*.sln.docstates
|
|
||||||
|
|
||||||
# Visual Studio build-related files.
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
|
|
||||||
# Visual Studio cache files
|
|
||||||
# files ending in .cache can be ignored
|
|
||||||
*.[Cc]ache
|
|
||||||
# but keep track of directories ending in .cache
|
|
||||||
!*.[Cc]ache/
|
|
|
@ -1,100 +0,0 @@
|
||||||
# The Flutter tooling requires that developers have a version of Visual Studio
|
|
||||||
# installed that includes CMake 3.14 or later. You should not increase this
|
|
||||||
# version, as doing so will cause the plugin to fail to compile for some
|
|
||||||
# customers of the plugin.
|
|
||||||
cmake_minimum_required(VERSION 3.14)
|
|
||||||
|
|
||||||
# Project-level configuration.
|
|
||||||
set(PROJECT_NAME "miniaudio")
|
|
||||||
project(${PROJECT_NAME} LANGUAGES CXX)
|
|
||||||
|
|
||||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
|
||||||
# versions of CMake.
|
|
||||||
cmake_policy(VERSION 3.14...3.25)
|
|
||||||
|
|
||||||
# This value is used when generating builds using this plugin, so it must
|
|
||||||
# not be changed
|
|
||||||
set(PLUGIN_NAME "miniaudio_plugin")
|
|
||||||
|
|
||||||
# Any new source files that you add to the plugin should be added here.
|
|
||||||
list(APPEND PLUGIN_SOURCES
|
|
||||||
"miniaudio_plugin.cpp"
|
|
||||||
"miniaudio_plugin.h"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Define the plugin library target. Its name must not be changed (see comment
|
|
||||||
# on PLUGIN_NAME above).
|
|
||||||
add_library(${PLUGIN_NAME} SHARED
|
|
||||||
"include/miniaudio/miniaudio_plugin_c_api.h"
|
|
||||||
"miniaudio_plugin_c_api.cpp"
|
|
||||||
${PLUGIN_SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Apply a standard set of build settings that are configured in the
|
|
||||||
# application-level CMakeLists.txt. This can be removed for plugins that want
|
|
||||||
# full control over build settings.
|
|
||||||
apply_standard_settings(${PLUGIN_NAME})
|
|
||||||
|
|
||||||
# Symbols are hidden by default to reduce the chance of accidental conflicts
|
|
||||||
# between plugins. This should not be removed; any symbols that should be
|
|
||||||
# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro.
|
|
||||||
set_target_properties(${PLUGIN_NAME} PROPERTIES
|
|
||||||
CXX_VISIBILITY_PRESET hidden)
|
|
||||||
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
|
|
||||||
|
|
||||||
# Source include directories and library dependencies. Add any plugin-specific
|
|
||||||
# dependencies here.
|
|
||||||
target_include_directories(${PLUGIN_NAME} INTERFACE
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/include")
|
|
||||||
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin)
|
|
||||||
|
|
||||||
# List of absolute paths to libraries that should be bundled with the plugin.
|
|
||||||
# This list could contain prebuilt libraries, or libraries created by an
|
|
||||||
# external build triggered from this build file.
|
|
||||||
set(miniaudio_bundled_libraries
|
|
||||||
""
|
|
||||||
PARENT_SCOPE
|
|
||||||
)
|
|
||||||
|
|
||||||
# === Tests ===
|
|
||||||
# These unit tests can be run from a terminal after building the example, or
|
|
||||||
# from Visual Studio after opening the generated solution file.
|
|
||||||
|
|
||||||
# Only enable test builds when building the example (which sets this variable)
|
|
||||||
# so that plugin clients aren't building the tests.
|
|
||||||
if (${include_${PROJECT_NAME}_tests})
|
|
||||||
set(TEST_RUNNER "${PROJECT_NAME}_test")
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
# Add the Google Test dependency.
|
|
||||||
include(FetchContent)
|
|
||||||
FetchContent_Declare(
|
|
||||||
googletest
|
|
||||||
URL https://github.com/google/googletest/archive/release-1.11.0.zip
|
|
||||||
)
|
|
||||||
# Prevent overriding the parent project's compiler/linker settings
|
|
||||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
||||||
# Disable install commands for gtest so it doesn't end up in the bundle.
|
|
||||||
set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE)
|
|
||||||
FetchContent_MakeAvailable(googletest)
|
|
||||||
|
|
||||||
# The plugin's C API is not very useful for unit testing, so build the sources
|
|
||||||
# directly into the test binary rather than using the DLL.
|
|
||||||
add_executable(${TEST_RUNNER}
|
|
||||||
test/miniaudio_plugin_test.cpp
|
|
||||||
${PLUGIN_SOURCES}
|
|
||||||
)
|
|
||||||
apply_standard_settings(${TEST_RUNNER})
|
|
||||||
target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin)
|
|
||||||
target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock)
|
|
||||||
# flutter_wrapper_plugin has link dependencies on the Flutter DLL.
|
|
||||||
add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
"${FLUTTER_LIBRARY}" $<TARGET_FILE_DIR:${TEST_RUNNER}>
|
|
||||||
)
|
|
||||||
|
|
||||||
# Enable automatic test discovery.
|
|
||||||
include(GoogleTest)
|
|
||||||
gtest_discover_tests(${TEST_RUNNER})
|
|
||||||
endif()
|
|
|
@ -1,23 +0,0 @@
|
||||||
#ifndef FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_C_API_H_
|
|
||||||
#define FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_C_API_H_
|
|
||||||
|
|
||||||
#include <flutter_plugin_registrar.h>
|
|
||||||
|
|
||||||
#ifdef FLUTTER_PLUGIN_IMPL
|
|
||||||
#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT void MiniaudioPluginCApiRegisterWithRegistrar(
|
|
||||||
FlutterDesktopPluginRegistrarRef registrar);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_C_API_H_
|
|
|
@ -1,59 +0,0 @@
|
||||||
#include "miniaudio_plugin.h"
|
|
||||||
|
|
||||||
// This must be included before many other Windows headers.
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
// For getPlatformVersion; remove unless needed for your plugin implementation.
|
|
||||||
#include <VersionHelpers.h>
|
|
||||||
|
|
||||||
#include <flutter/method_channel.h>
|
|
||||||
#include <flutter/plugin_registrar_windows.h>
|
|
||||||
#include <flutter/standard_method_codec.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
namespace miniaudio {
|
|
||||||
|
|
||||||
// static
|
|
||||||
void MiniaudioPlugin::RegisterWithRegistrar(
|
|
||||||
flutter::PluginRegistrarWindows *registrar) {
|
|
||||||
auto channel =
|
|
||||||
std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
|
|
||||||
registrar->messenger(), "miniaudio",
|
|
||||||
&flutter::StandardMethodCodec::GetInstance());
|
|
||||||
|
|
||||||
auto plugin = std::make_unique<MiniaudioPlugin>();
|
|
||||||
|
|
||||||
channel->SetMethodCallHandler(
|
|
||||||
[plugin_pointer = plugin.get()](const auto &call, auto result) {
|
|
||||||
plugin_pointer->HandleMethodCall(call, std::move(result));
|
|
||||||
});
|
|
||||||
|
|
||||||
registrar->AddPlugin(std::move(plugin));
|
|
||||||
}
|
|
||||||
|
|
||||||
MiniaudioPlugin::MiniaudioPlugin() {}
|
|
||||||
|
|
||||||
MiniaudioPlugin::~MiniaudioPlugin() {}
|
|
||||||
|
|
||||||
void MiniaudioPlugin::HandleMethodCall(
|
|
||||||
const flutter::MethodCall<flutter::EncodableValue> &method_call,
|
|
||||||
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
|
||||||
if (method_call.method_name().compare("getPlatformVersion") == 0) {
|
|
||||||
std::ostringstream version_stream;
|
|
||||||
version_stream << "Windows ";
|
|
||||||
if (IsWindows10OrGreater()) {
|
|
||||||
version_stream << "10+";
|
|
||||||
} else if (IsWindows8OrGreater()) {
|
|
||||||
version_stream << "8";
|
|
||||||
} else if (IsWindows7OrGreater()) {
|
|
||||||
version_stream << "7";
|
|
||||||
}
|
|
||||||
result->Success(flutter::EncodableValue(version_stream.str()));
|
|
||||||
} else {
|
|
||||||
result->NotImplemented();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace miniaudio
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
||||||
#define FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
||||||
|
|
||||||
#include <flutter/method_channel.h>
|
|
||||||
#include <flutter/plugin_registrar_windows.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace miniaudio {
|
|
||||||
|
|
||||||
class MiniaudioPlugin : public flutter::Plugin {
|
|
||||||
public:
|
|
||||||
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
|
|
||||||
|
|
||||||
MiniaudioPlugin();
|
|
||||||
|
|
||||||
virtual ~MiniaudioPlugin();
|
|
||||||
|
|
||||||
// Disallow copy and assign.
|
|
||||||
MiniaudioPlugin(const MiniaudioPlugin&) = delete;
|
|
||||||
MiniaudioPlugin& operator=(const MiniaudioPlugin&) = delete;
|
|
||||||
|
|
||||||
// Called when a method is called on this plugin's channel from Dart.
|
|
||||||
void HandleMethodCall(
|
|
||||||
const flutter::MethodCall<flutter::EncodableValue> &method_call,
|
|
||||||
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace miniaudio
|
|
||||||
|
|
||||||
#endif // FLUTTER_PLUGIN_MINIAUDIO_PLUGIN_H_
|
|
|
@ -1,12 +0,0 @@
|
||||||
#include "include/miniaudio/miniaudio_plugin_c_api.h"
|
|
||||||
|
|
||||||
#include <flutter/plugin_registrar_windows.h>
|
|
||||||
|
|
||||||
#include "miniaudio_plugin.h"
|
|
||||||
|
|
||||||
void MiniaudioPluginCApiRegisterWithRegistrar(
|
|
||||||
FlutterDesktopPluginRegistrarRef registrar) {
|
|
||||||
miniaudio::MiniaudioPlugin::RegisterWithRegistrar(
|
|
||||||
flutter::PluginRegistrarManager::GetInstance()
|
|
||||||
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
#include <flutter/method_call.h>
|
|
||||||
#include <flutter/method_result_functions.h>
|
|
||||||
#include <flutter/standard_method_codec.h>
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <variant>
|
|
||||||
|
|
||||||
#include "miniaudio_plugin.h"
|
|
||||||
|
|
||||||
namespace miniaudio {
|
|
||||||
namespace test {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
using flutter::EncodableMap;
|
|
||||||
using flutter::EncodableValue;
|
|
||||||
using flutter::MethodCall;
|
|
||||||
using flutter::MethodResultFunctions;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
TEST(MiniaudioPlugin, GetPlatformVersion) {
|
|
||||||
MiniaudioPlugin plugin;
|
|
||||||
// Save the reply value from the success callback.
|
|
||||||
std::string result_string;
|
|
||||||
plugin.HandleMethodCall(
|
|
||||||
MethodCall("getPlatformVersion", std::make_unique<EncodableValue>()),
|
|
||||||
std::make_unique<MethodResultFunctions<>>(
|
|
||||||
[&result_string](const EncodableValue* result) {
|
|
||||||
result_string = std::get<std::string>(*result);
|
|
||||||
},
|
|
||||||
nullptr, nullptr));
|
|
||||||
|
|
||||||
// Since the exact string varies by host, just ensure that it's a string
|
|
||||||
// with the expected format.
|
|
||||||
EXPECT_TRUE(result_string.rfind("Windows ", 0) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace test
|
|
||||||
} // namespace miniaudio
|
|
|
@ -6,15 +6,11 @@
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <miniaudio/miniaudio_plugin.h>
|
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
#include <window_manager/window_manager_plugin.h>
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
g_autoptr(FlPluginRegistrar) miniaudio_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "MiniaudioPlugin");
|
|
||||||
miniaudio_plugin_register_with_registrar(miniaudio_registrar);
|
|
||||||
g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
|
g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
|
||||||
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
|
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
miniaudio
|
|
||||||
screen_retriever
|
screen_retriever
|
||||||
url_launcher_linux
|
url_launcher_linux
|
||||||
window_manager
|
window_manager
|
||||||
|
@ -11,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
camera_linux
|
camera_linux
|
||||||
|
miniaudio
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||||
|
|
|
@ -7,7 +7,6 @@ import Foundation
|
||||||
|
|
||||||
import connectivity_plus
|
import connectivity_plus
|
||||||
import flutter_local_notifications
|
import flutter_local_notifications
|
||||||
import miniaudio
|
|
||||||
import package_info_plus
|
import package_info_plus
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import screen_retriever
|
import screen_retriever
|
||||||
|
@ -17,7 +16,6 @@ import window_manager
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
||||||
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
||||||
MiniaudioPlugin.register(with: registry.registrar(forPlugin: "MiniaudioPlugin"))
|
|
||||||
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
|
ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
|
||||||
|
|
|
@ -983,5 +983,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.2.6 <4.0.0"
|
dart: ">=3.2.0-194.0.dev <4.0.0"
|
||||||
flutter: ">=3.7.0"
|
flutter: ">=3.7.0"
|
||||||
|
|
|
@ -57,7 +57,7 @@ dependencies:
|
||||||
camera_linux:
|
camera_linux:
|
||||||
path: lib/third_party/camera_linux
|
path: lib/third_party/camera_linux
|
||||||
miniaudio:
|
miniaudio:
|
||||||
path: lib/third_party/miniaudio
|
path: lib/third_party/miniaudio
|
||||||
# misc plugins
|
# misc plugins
|
||||||
qr_flutter: ^4.0.0
|
qr_flutter: ^4.0.0
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
||||||
#include <miniaudio/miniaudio_plugin_c_api.h>
|
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
#include <win_toast/win_toast_plugin.h>
|
#include <win_toast/win_toast_plugin.h>
|
||||||
|
@ -16,8 +15,6 @@
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
||||||
MiniaudioPluginCApiRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("MiniaudioPluginCApi"));
|
|
||||||
ScreenRetrieverPluginRegisterWithRegistrar(
|
ScreenRetrieverPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("ScreenRetrieverPlugin"));
|
registry->GetRegistrarForPlugin("ScreenRetrieverPlugin"));
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
connectivity_plus
|
connectivity_plus
|
||||||
miniaudio
|
|
||||||
screen_retriever
|
screen_retriever
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
win_toast
|
win_toast
|
||||||
|
|
Loading…
Reference in New Issue