diff --git a/OAT.xml b/OAT.xml
new file mode 100644
index 0000000000000000000000000000000000000000..03b00feca3515d5d0e671fff96e7af284080ecdf
--- /dev/null
+++ b/OAT.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/.gitignore b/packages/audioplayers/example/ohos/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f0364c33c52a9b8ce1b89ea309af9c8ea68f718d
--- /dev/null
+++ b/packages/audioplayers/example/ohos/.gitignore
@@ -0,0 +1,16 @@
+/node_modules
+/oh_modules
+/local.properties
+/.idea
+**/build
+/.hvigor
+.cxx
+/.clangd
+/.clang-format
+/.clang-tidy
+**/.test
+entry/libs/arm64-v8a/libapp.so
+entry/libs/arm64-v8a/libflutter.so
+entry/libs/arm64-v8a/libvmservice_snapshot.so
+entry/src/main/resources/rawfile/flutter_assets/
+har/flutter.har
diff --git a/packages/audioplayers/example/ohos/AppScope/app.json5 b/packages/audioplayers/example/ohos/AppScope/app.json5
new file mode 100644
index 0000000000000000000000000000000000000000..2a4511ce2d20320c4edc4b6caa791e1bae1dd1fa
--- /dev/null
+++ b/packages/audioplayers/example/ohos/AppScope/app.json5
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "app": {
+ "bundleName": "xyz.luan.audioplayers_example",
+ "vendor": "example",
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "icon": "$media:app_icon",
+ "label": "$string:app_name"
+ }
+}
diff --git a/packages/audioplayers/example/ohos/AppScope/resources/base/element/string.json b/packages/audioplayers/example/ohos/AppScope/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..098c3c1a43c177e45be8a60644ba06159851eb20
--- /dev/null
+++ b/packages/audioplayers/example/ohos/AppScope/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "audioplayers_example"
+ }
+ ]
+}
diff --git a/packages/audioplayers/example/ohos/AppScope/resources/base/media/app_icon.png b/packages/audioplayers/example/ohos/AppScope/resources/base/media/app_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/packages/audioplayers/example/ohos/AppScope/resources/base/media/app_icon.png differ
diff --git a/packages/audioplayers/example/ohos/build-profile.json5 b/packages/audioplayers/example/ohos/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..e8c7d7eb0de5e1a65194730cc12e2a4c3d3e4a92
--- /dev/null
+++ b/packages/audioplayers/example/ohos/build-profile.json5
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "app": {
+ "signingConfigs": [],
+ "products": [
+ {
+ "name": "default",
+ "signingConfig": "default",
+ "compileSdkVersion": "4.1.0(11)",
+ "compatibleSdkVersion": "4.1.0(11)",
+ "runtimeOS": "HarmonyOS",
+ }
+ ]
+ },
+ "modules": [
+ {
+ "name": "entry",
+ "srcPath": "./entry",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/dta/icudtl.dat b/packages/audioplayers/example/ohos/dta/icudtl.dat
new file mode 100644
index 0000000000000000000000000000000000000000..d1f10917ab52e3ebd251abd7f5377d7196b80d67
Binary files /dev/null and b/packages/audioplayers/example/ohos/dta/icudtl.dat differ
diff --git a/packages/audioplayers/example/ohos/entry/.gitignore b/packages/audioplayers/example/ohos/entry/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2795a1c5b1fe53659dd1b71d90ba0592eaf7e043
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/.gitignore
@@ -0,0 +1,7 @@
+
+/node_modules
+/oh_modules
+/.preview
+/build
+/.cxx
+/.test
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/build-profile.json5 b/packages/audioplayers/example/ohos/entry/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..633d360fbc91a3186a23b66ab71b27e5618944cb
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/build-profile.json5
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "apiType": 'stageMode',
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default",
+ "runtimeOS": "HarmonyOS"
+ },
+ {
+ "name": "ohosTest",
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/hvigorfile.ts b/packages/audioplayers/example/ohos/entry/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..894fc15c6b793f085e6c8506e43d719af658e8ff
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/hvigorfile.ts
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { hapTasks } from '@ohos/hvigor-ohos-plugin';
diff --git a/packages/audioplayers/example/ohos/entry/libs/arm64-v8a/libc++_shared.so b/packages/audioplayers/example/ohos/entry/libs/arm64-v8a/libc++_shared.so
new file mode 100644
index 0000000000000000000000000000000000000000..831c9353702073d45889352a4dafb93103d67d20
Binary files /dev/null and b/packages/audioplayers/example/ohos/entry/libs/arm64-v8a/libc++_shared.so differ
diff --git a/packages/audioplayers/example/ohos/entry/oh-package.json5 b/packages/audioplayers/example/ohos/entry/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..dabaee13151003854589516fcfb20ccd29c44b6b
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/oh-package.json5
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "name": "entry",
+ "version": "1.0.0",
+ "description": "Please describe the basic information.",
+ "main": "",
+ "author": "",
+ "license": "",
+ "dependencies": {
+ },
+}
+
diff --git a/packages/audioplayers/example/ohos/entry/src/main/ets/entryability/EntryAbility.ets b/packages/audioplayers/example/ohos/entry/src/main/ets/entryability/EntryAbility.ets
new file mode 100644
index 0000000000000000000000000000000000000000..a00049282e93c69f1b3dcd987538024f47e40ace
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/ets/entryability/EntryAbility.ets
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import { FlutterAbility } from '@ohos/flutter_ohos'
+import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant';
+import FlutterEngine from '@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine';
+
+export default class EntryAbility extends FlutterAbility {
+ configureFlutterEngine(flutterEngine: FlutterEngine) {
+ super.configureFlutterEngine(flutterEngine)
+ GeneratedPluginRegistrant.registerWith(flutterEngine)
+ }
+}
diff --git a/packages/audioplayers/example/ohos/entry/src/main/ets/pages/Index.ets b/packages/audioplayers/example/ohos/entry/src/main/ets/pages/Index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..1125f9fdd95f4310a182c1c9e3680f37f73686c9
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/ets/pages/Index.ets
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import common from '@ohos.app.ability.common';
+import { FlutterPage } from '@ohos/flutter_ohos'
+
+let storage = LocalStorage.getShared()
+const EVENT_BACK_PRESS = 'EVENT_BACK_PRESS'
+
+@Entry(storage)
+@Component
+struct Index {
+ private context = getContext(this) as common.UIAbilityContext
+ @LocalStorageLink('viewId') viewId: string = "";
+
+ build() {
+ Column() {
+ FlutterPage({ viewId: this.viewId })
+ }
+ }
+
+ onBackPress(): boolean {
+ this.context.eventHub.emit(EVENT_BACK_PRESS)
+ return true
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/main/module.json5 b/packages/audioplayers/example/ohos/entry/src/main/module.json5
new file mode 100644
index 0000000000000000000000000000000000000000..7bbf78b18f39991b1404061c7437538c7d532bb7
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/module.json5
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+{
+ "module": {
+ "name": "entry",
+ "type": "entry",
+ "description": "$string:module_desc",
+ "mainElement": "EntryAbility",
+ "deviceTypes": [
+ "phone"
+ ],
+ "deliveryWithInstall": true,
+ "installationFree": false,
+ "pages": "$profile:main_pages",
+ "abilities": [
+ {
+ "name": "EntryAbility",
+ "srcEntry": "./ets/entryability/EntryAbility.ets",
+ "description": "$string:EntryAbility_desc",
+ "icon": "$media:icon",
+ "label": "$string:EntryAbility_label",
+ "startWindowIcon": "$media:icon",
+ "startWindowBackground": "$color:start_window_background",
+ "exported": true,
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ]
+ }
+ ],
+ "requestPermissions": [
+ {"name" : "ohos.permission.INTERNET"},
+ ]
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/color.json b/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/color.json
new file mode 100644
index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/color.json
@@ -0,0 +1,8 @@
+{
+ "color": [
+ {
+ "name": "start_window_background",
+ "value": "#FFFFFF"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/string.json b/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..b318dd7cce7b4d71bc5fc5b463c8fc4f8fbda905
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/resources/base/element/string.json
@@ -0,0 +1,16 @@
+{
+ "string": [
+ {
+ "name": "module_desc",
+ "value": "module description"
+ },
+ {
+ "name": "EntryAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "EntryAbility_label",
+ "value": "audioplayers_example"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/base/media/icon.png b/packages/audioplayers/example/ohos/entry/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/packages/audioplayers/example/ohos/entry/src/main/resources/base/media/icon.png differ
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/base/profile/main_pages.json b/packages/audioplayers/example/ohos/entry/src/main/resources/base/profile/main_pages.json
new file mode 100644
index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/resources/base/profile/main_pages.json
@@ -0,0 +1,5 @@
+{
+ "src": [
+ "pages/Index"
+ ]
+}
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/en_US/element/string.json b/packages/audioplayers/example/ohos/entry/src/main/resources/en_US/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..b318dd7cce7b4d71bc5fc5b463c8fc4f8fbda905
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/resources/en_US/element/string.json
@@ -0,0 +1,16 @@
+{
+ "string": [
+ {
+ "name": "module_desc",
+ "value": "module description"
+ },
+ {
+ "name": "EntryAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "EntryAbility_label",
+ "value": "audioplayers_example"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/main/resources/zh_CN/element/string.json b/packages/audioplayers/example/ohos/entry/src/main/resources/zh_CN/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..e503f2f9618759d1af1cdda85f7b179e0ca7d86b
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/main/resources/zh_CN/element/string.json
@@ -0,0 +1,16 @@
+{
+ "string": [
+ {
+ "name": "module_desc",
+ "value": "模块描述"
+ },
+ {
+ "name": "EntryAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "EntryAbility_label",
+ "value": "audioplayers_example"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/Ability.test.ets b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/Ability.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..25d4c71ff3cd584f5d64f6f8c0ac864928c234c4
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/Ability.test.ets
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import hilog from '@ohos.hilog';
+import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
+
+export default function abilityTest() {
+ describe('ActsAbilityTest', function () {
+ // Defines a test suite. Two parameters are supported: test suite name and test suite function.
+ beforeAll(function () {
+ // Presets an action, which is performed only once before all test cases of the test suite start.
+ // This API supports only one parameter: preset action function.
+ })
+ beforeEach(function () {
+ // Presets an action, which is performed before each unit test case starts.
+ // The number of execution times is the same as the number of test cases defined by **it**.
+ // This API supports only one parameter: preset action function.
+ })
+ afterEach(function () {
+ // Presets a clear action, which is performed after each unit test case ends.
+ // The number of execution times is the same as the number of test cases defined by **it**.
+ // This API supports only one parameter: clear action function.
+ })
+ afterAll(function () {
+ // Presets a clear action, which is performed after all test cases of the test suite end.
+ // This API supports only one parameter: clear action function.
+ })
+ it('assertContain',0, function () {
+ // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
+ hilog.info(0x0000, 'testTag', '%{public}s', 'it begin');
+ let a = 'abc'
+ let b = 'b'
+ // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
+ expect(a).assertContain(b)
+ expect(a).assertEqual(a)
+ })
+ })
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/List.test.ets b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/List.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..f4140030e65d20df6af30a6bf51e464dea8f8aa6
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/test/List.test.ets
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import abilityTest from './Ability.test'
+
+export default function testsuite() {
+ abilityTest()
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/TestAbility.ets b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/TestAbility.ets
new file mode 100644
index 0000000000000000000000000000000000000000..4ca645e6013cfce8e7dbb728313cb8840c4da660
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/TestAbility.ets
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import UIAbility from '@ohos.app.ability.UIAbility';
+import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
+import hilog from '@ohos.hilog';
+import { Hypium } from '@ohos/hypium';
+import testsuite from '../test/List.test';
+import window from '@ohos.window';
+
+export default class TestAbility extends UIAbility {
+ onCreate(want, launchParam) {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate');
+ hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? '');
+ hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:'+ JSON.stringify(launchParam) ?? '');
+ var abilityDelegator: any
+ abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
+ var abilityDelegatorArguments: any
+ abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
+ hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!');
+ Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
+ }
+
+ onDestroy() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy');
+ }
+
+ onWindowStageCreate(windowStage: window.WindowStage) {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate');
+ windowStage.loadContent('testability/pages/Index', (err, data) => {
+ if (err.code) {
+ hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
+ return;
+ }
+ hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s',
+ JSON.stringify(data) ?? '');
+ });
+ }
+
+ onWindowStageDestroy() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy');
+ }
+
+ onForeground() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground');
+ }
+
+ onBackground() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground');
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..cef0447cd2f137ef82d223ead2e156808878ab90
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import hilog from '@ohos.hilog';
+
+@Entry
+@Component
+struct Index {
+ aboutToAppear() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear');
+ }
+ @State message: string = 'Hello World'
+ build() {
+ Row() {
+ Column() {
+ Text(this.message)
+ .fontSize(50)
+ .fontWeight(FontWeight.Bold)
+ Button() {
+ Text('next page')
+ .fontSize(20)
+ .fontWeight(FontWeight.Bold)
+ }.type(ButtonType.Capsule)
+ .margin({
+ top: 20
+ })
+ .backgroundColor('#0D9FFB')
+ .width('35%')
+ .height('5%')
+ .onClick(()=>{
+ })
+ }
+ .width('100%')
+ }
+ .height('100%')
+ }
+ }
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1def08f2e9dcbfa3454a07b7a3b82b173bb90d02
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import hilog from '@ohos.hilog';
+import TestRunner from '@ohos.application.testRunner';
+import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
+
+var abilityDelegator = undefined
+var abilityDelegatorArguments = undefined
+
+async function onAbilityCreateCallback() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback');
+}
+
+async function addAbilityMonitorCallback(err: any) {
+ hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? '');
+}
+
+export default class OpenHarmonyTestRunner implements TestRunner {
+ constructor() {
+ }
+
+ onPrepare() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare ');
+ }
+
+ async onRun() {
+ hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run');
+ abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
+ abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
+ var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility'
+ let lMonitor = {
+ abilityName: testAbilityName,
+ onAbilityCreate: onAbilityCreateCallback,
+ };
+ abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback)
+ var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName
+ var debug = abilityDelegatorArguments.parameters['-D']
+ if (debug == 'true')
+ {
+ cmd += ' -D'
+ }
+ hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd);
+ abilityDelegator.executeShellCommand(cmd,
+ (err: any, d: any) => {
+ hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? '');
+ hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? '');
+ hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? '');
+ })
+ hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end');
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/module.json5 b/packages/audioplayers/example/ohos/entry/src/ohosTest/module.json5
new file mode 100644
index 0000000000000000000000000000000000000000..fab77ce2e0c61e3ad010bab5b27ccbd15f9a8c96
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/module.json5
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "module": {
+ "name": "entry_test",
+ "type": "feature",
+ "description": "$string:module_test_desc",
+ "mainElement": "TestAbility",
+ "deviceTypes": [
+ "phone"
+ ],
+ "deliveryWithInstall": true,
+ "installationFree": false,
+ "pages": "$profile:test_pages",
+ "abilities": [
+ {
+ "name": "TestAbility",
+ "srcEntry": "./ets/testability/TestAbility.ets",
+ "description": "$string:TestAbility_desc",
+ "icon": "$media:icon",
+ "label": "$string:TestAbility_label",
+ "exported": true,
+ "startWindowIcon": "$media:icon",
+ "startWindowBackground": "$color:start_window_background",
+ "skills": [
+ {
+ "actions": [
+ "action.system.home"
+ ],
+ "entities": [
+ "entity.system.home"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/color.json b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/color.json
new file mode 100644
index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/color.json
@@ -0,0 +1,8 @@
+{
+ "color": [
+ {
+ "name": "start_window_background",
+ "value": "#FFFFFF"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/string.json b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..65d8fa5a7cf54aa3943dcd0214f58d1771bc1f6c
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/element/string.json
@@ -0,0 +1,16 @@
+{
+ "string": [
+ {
+ "name": "module_test_desc",
+ "value": "test ability description"
+ },
+ {
+ "name": "TestAbility_desc",
+ "value": "the test ability"
+ },
+ {
+ "name": "TestAbility_label",
+ "value": "test label"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/media/icon.png b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/media/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/media/icon.png differ
diff --git a/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/profile/test_pages.json b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/profile/test_pages.json
new file mode 100644
index 0000000000000000000000000000000000000000..b7e7343cacb32ce982a45e76daad86e435e054fe
--- /dev/null
+++ b/packages/audioplayers/example/ohos/entry/src/ohosTest/resources/base/profile/test_pages.json
@@ -0,0 +1,5 @@
+{
+ "src": [
+ "testability/pages/Index"
+ ]
+}
diff --git a/packages/audioplayers/example/ohos/hvigor/hvigor-config.json5 b/packages/audioplayers/example/ohos/hvigor/hvigor-config.json5
new file mode 100644
index 0000000000000000000000000000000000000000..a0a933c22a1d614ad1d6f8a1ebec4326fc009444
--- /dev/null
+++ b/packages/audioplayers/example/ohos/hvigor/hvigor-config.json5
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "hvigorVersion": "4.0.2",
+ "dependencies": {
+ "@ohos/hvigor-ohos-plugin": "4.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/hvigor/hvigor-wrapper.js b/packages/audioplayers/example/ohos/hvigor/hvigor-wrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7a65272c904328233e2cb52f0adc1def3f9bc8d
--- /dev/null
+++ b/packages/audioplayers/example/ohos/hvigor/hvigor-wrapper.js
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},E=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const F=E(D),A="Windows_NT",o="Darwin";function a(){return F.default.type()===A}function c(){return F.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===F.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.ENABLE_SIGN_TASK_KEY=e.HVIGOR_CACHE_DIR_KEY=e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const E=i(D),F=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=F.resolve(E.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=F.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=F.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=F.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=F.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=F.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace",e.HVIGOR_CACHE_DIR_KEY="hvigor.cacheDir",e.ENABLE_SIGN_TASK_KEY="enableSignTask"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const O=f(e),p=f(u),h=l;_=s.executeBuild=function(u){const D=p.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=O.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class I{}R.Unicode=I,I.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,I.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,I.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const y=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&y.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||y.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||""===u||""===u||y.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const S=N(e),b=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,G,V,j,J,U="start",L=[],W=0,$=1,K=0,k=!1,z="default",q="'",Z=1;function Y(u,D=!1){T=String(u),U="start",L=[],W=0,$=1,K=0,V=void 0,k=D;do{M=X(),nu[U]()}while("eof"!==M.type);return V}function X(){for(z="default",j="",q="'",Z=1;;){J=Q();const u=Du[z]();if(u)return u}}function Q(){if(T[W])return String.fromCodePoint(T.codePointAt(W))}function uu(){const u=Q();return"\n"===u?($++,K=0):u?K+=u.length:K++,u&&(W+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=S.default.readFileSync(w.default.resolve(u),{encoding:e});try{return Y(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${b.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=Y;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[U]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Fu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Fu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Fu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Fu(x.Char,uu())},end(){throw Fu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Fu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Fu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Fu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Fu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Fu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Fu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Fu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"":case"":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"":case"":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Q(),D=function(){switch(Q()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Q()))throw Fu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());if(u+=uu(),D=Q(),!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Q()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Fu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Fu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Eu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:K}}function tu(u){for(const D of u){if(Q()!==D)throw Fu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Fu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return G=M.value,void(U="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Fu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Fu(x.EOF);U="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Fu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Fu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(k&&"object"==typeof u&&(u._line=$,u._column=K),void 0===V)V=u;else{const D=L[L.length-1];Array.isArray(D)?k&&"object"!=typeof u?D.push({value:u,_line:$,_column:K}):D.push(u):D[G]=k&&"object"!=typeof u?{value:u,_line:$,_column:K}:u}!function(u){if(u&&"object"==typeof u)L.push(u),U=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){L.pop();const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Eu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Fu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${K}`:`JSON5: invalid character '${Eu(D)}' at ${$}:${K}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${K}`;break;case x.Identifier:K-=5,e=`JSON5: invalid identifier character at ${$}:${K}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=K,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,Ou=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,Ou.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var pu=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&pu(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),Iu=Pu(u),yu=i,Nu=v,Su=g,bu=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===Iu.normalize(e.dependencies[u])}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=Iu.resolve(yu.HVIGOR_PROJECT_WRAPPER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,bu.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,Su.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){const D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${yu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Nu.hash)(D)}(u):(0,Nu.hash)(process.cwd());return Iu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=Iu.resolve(Mu,yu.WORK_SPACE,yu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,Su.parseJsonFile)(u):{dependencies:{}}}(),function(){const u=Iu.resolve(yu.HVIGOR_USER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);if(mu.existsSync(u))(0,Su.parseJsonFile)(u)}(),!(0,wu.hasNpmPackInPaths)(yu.HVIGOR_ENGINE_PACKAGE_NAME,[Iu.join(Mu,yu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[Iu.join(Mu,yu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}())try{!function(){(0,bu.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=Iu.join(Mu,yu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=Iu.resolve(D,yu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,bu.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",yu.HVIGOR_PNPM_STORE_PATH],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,bu.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){!function(){const u=Iu.join(Mu,yu.WORK_SPACE);if((0,bu.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=Iu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(Iu.resolve(u,D),{recursive:!0})}))}catch(D){(0,bu.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}()}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),E=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),F=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return E(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=F(e),c=A(D),s=F(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}();
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/hvigorfile.ts b/packages/audioplayers/example/ohos/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f2d2aafe6d6a3a71a9944ebd0c91fbc308ac9d1
--- /dev/null
+++ b/packages/audioplayers/example/ohos/hvigorfile.ts
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import { appTasks } from '@ohos/hvigor-ohos-plugin';
+
+export default {
+ system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
+ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
+}
\ No newline at end of file
diff --git a/packages/audioplayers/example/ohos/hvigorw b/packages/audioplayers/example/ohos/hvigorw
new file mode 100644
index 0000000000000000000000000000000000000000..5efd8343d3232bdd1d9b7f67a3326034054c5396
--- /dev/null
+++ b/packages/audioplayers/example/ohos/hvigorw
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# ----------------------------------------------------------------------------
+# Hvigor startup script, version 1.0.0
+#
+# Required ENV vars:
+# ------------------
+# NODE_HOME - location of a Node home dir
+# or
+# Add /usr/local/nodejs/bin to the PATH environment variable
+# ----------------------------------------------------------------------------
+
+HVIGOR_APP_HOME=$(dirname $(readlink -f $0))
+HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
+warn() {
+ echo ""
+ echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+error() {
+ echo ""
+ echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+fail() {
+ error "$@"
+ exit 1
+}
+
+# Determine node to start hvigor wrapper script
+if [ -n "${NODE_HOME}" ];then
+ EXECUTABLE_NODE="${NODE_HOME}/bin/node"
+ if [ ! -x "$EXECUTABLE_NODE" ];then
+ fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
+ fi
+else
+ EXECUTABLE_NODE="node"
+ which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
+fi
+
+# Check hvigor wrapper script
+if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
+ fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
+fi
+
+# start hvigor-wrapper script
+exec "${EXECUTABLE_NODE}" \
+ "${HVIGOR_WRAPPER_SCRIPT}" "$@"
diff --git a/packages/audioplayers/example/ohos/hvigorw.bat b/packages/audioplayers/example/ohos/hvigorw.bat
new file mode 100644
index 0000000000000000000000000000000000000000..2fea846e289394982993a8c72db9329ed78e0753
--- /dev/null
+++ b/packages/audioplayers/example/ohos/hvigorw.bat
@@ -0,0 +1,78 @@
+:: Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+:: Licensed under the Apache License, Version 2.0 (the "License");
+:: you may not use this file except in compliance with the License.
+:: You may obtain a copy of the License at
+::
+:: http://www.apache.org/licenses/LICENSE-2.0
+::
+:: Unless required by applicable law or agreed to in writing, software
+:: distributed under the License is distributed on an "AS IS" BASIS,
+:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+:: See the License for the specific language governing permissions and
+:: limitations under the License.
+
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Hvigor startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js
+set NODE_EXE=node.exe
+
+goto start
+
+:start
+@rem Find node.exe
+if defined NODE_HOME goto findNodeFromNodeHome
+
+%NODE_EXE% --version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:findNodeFromNodeHome
+set NODE_HOME=%NODE_HOME:"=%
+set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE%
+
+if exist "%NODE_EXE_PATH%" goto execute
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:execute
+@rem Execute hvigor
+"%NODE_EXE%" %WRAPPER_MODULE_PATH% %*
+
+if "%ERRORLEVEL%" == "0" goto hvigorwEnd
+
+:fail
+exit /b 1
+
+:hvigorwEnd
+if "%OS%" == "Windows_NT" endlocal
+
+:end
diff --git a/packages/audioplayers/example/ohos/oh-package.json5 b/packages/audioplayers/example/ohos/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..c29a29a6ea295b682cf503bb4fb1fbc4fa813246
--- /dev/null
+++ b/packages/audioplayers/example/ohos/oh-package.json5
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "name": "apptemplate",
+ "version": "1.0.0",
+ "description": "Please describe the basic information.",
+ "main": "",
+ "author": "",
+ "license": "",
+ "dependencies": {
+ "@ohos/flutter_ohos": "file:./har/flutter.har"
+ },
+ "devDependencies": {
+ "@ohos/hypium": "1.0.6"
+ },
+ "overrides": {
+ "@ohos/flutter_ohos": "file:./har/flutter.har"
+ }
+}
diff --git a/packages/audioplayers/example/pubspec.yaml b/packages/audioplayers/example/pubspec.yaml
index 2b106caddc581fc024de3a4d75b57bbe5c033f78..5da4b80642849ce1c6d16126d11df73daba07726 100644
--- a/packages/audioplayers/example/pubspec.yaml
+++ b/packages/audioplayers/example/pubspec.yaml
@@ -3,19 +3,24 @@ description: Demonstrates how to use the audioplayers plugin.
publish_to: none
dependencies:
- audioplayers: ^4.1.0
+ audioplayers:
+ path: ../
collection: ^1.16.0
file_picker: ^5.0.1
flutter:
sdk: flutter
http: ^0.13.1
- path_provider: ^2.0.12
+ path_provider:
+ git:
+ url: https://gitee.com/openharmony-sig/flutter_packages.git
+ path: packages/path_provider/path_provider
provider: ^6.0.5
dev_dependencies:
# Integration tests for audioplayers_platform_interface are handled
# in this package to avoid maintaining multiple example apps:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../../audioplayers_platform_interface
flame_lint: ^0.2.0
flutter_test:
sdk: flutter
diff --git a/packages/audioplayers/pubspec.yaml b/packages/audioplayers/pubspec.yaml
index 58ca36ef74af2bc680248adb2159a447d432decd..b4c72d29e7afc90c2d82dd9990d9cf4731eaaed2 100644
--- a/packages/audioplayers/pubspec.yaml
+++ b/packages/audioplayers/pubspec.yaml
@@ -3,6 +3,7 @@ description: A Flutter plugin to play multiple audio files simultaneously
version: 4.1.0
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers
+publish_to: none
flutter:
plugin:
@@ -19,20 +20,33 @@ flutter:
default_package: audioplayers_web
windows:
default_package: audioplayers_windows
+ ohos:
+ default_package: audioplayers_ohos
dependencies:
- audioplayers_android: ^3.0.2
- audioplayers_darwin: ^4.1.0
- audioplayers_linux: ^2.1.0
- audioplayers_platform_interface: ^5.0.1
- audioplayers_web: ^3.1.0
- audioplayers_windows: ^2.0.2
+ audioplayers_android:
+ path: ../audioplayers_android
+ audioplayers_ohos:
+ path: ../audioplayers_ohos
+ audioplayers_darwin:
+ path: ../audioplayers_darwin
+ audioplayers_linux:
+ path: ../audioplayers_linux
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
+ audioplayers_web:
+ path: ../audioplayers_web
+ audioplayers_windows:
+ path: ../audioplayers_windows
file: ^6.1.0
flutter:
sdk: flutter
http: ^0.13.5
meta: ^1.7.0
- path_provider: ^2.0.12
+ path_provider:
+ git:
+ url: https://gitee.com/openharmony-sig/flutter_packages.git
+ path: packages/path_provider/path_provider
synchronized: ^3.0.0
uuid: ^3.0.7
diff --git a/packages/audioplayers_android/pubspec.yaml b/packages/audioplayers_android/pubspec.yaml
index 3c6a6dfeab8d9d386874c37704fc5a831fac1215..6792dda3c6017779de8ff4cf8e58f92c9b88bdd2 100644
--- a/packages/audioplayers_android/pubspec.yaml
+++ b/packages/audioplayers_android/pubspec.yaml
@@ -3,6 +3,7 @@ description: Android implementation of audioplayers, a Flutter plugin to play mu
version: 3.0.2
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers_android
+publish_to: none
flutter:
plugin:
@@ -13,7 +14,8 @@ flutter:
pluginClass: AudioplayersPlugin
dependencies:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
flutter:
sdk: flutter
diff --git a/packages/audioplayers_darwin/pubspec.yaml b/packages/audioplayers_darwin/pubspec.yaml
index 7b03602d607ba3776fc02d1b1d65c0cc026524fd..70cdf93fdf1404138008765c0e4f8288025b38f9 100644
--- a/packages/audioplayers_darwin/pubspec.yaml
+++ b/packages/audioplayers_darwin/pubspec.yaml
@@ -3,6 +3,7 @@ description: iOS and macOS implementation of audioplayers, a Flutter plugin to p
version: 4.1.0
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers_darwin
+publish_to: none
flutter:
plugin:
@@ -14,7 +15,8 @@ flutter:
pluginClass: AudioplayersDarwinPlugin
dependencies:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
flutter:
sdk: flutter
diff --git a/packages/audioplayers_linux/pubspec.yaml b/packages/audioplayers_linux/pubspec.yaml
index f8c732497a61eab55ec46aa5837b5791a3698d27..06ea08bc37485c172a66157c914aa69027b43a98 100644
--- a/packages/audioplayers_linux/pubspec.yaml
+++ b/packages/audioplayers_linux/pubspec.yaml
@@ -3,6 +3,7 @@ description: Linux implementation of audioplayers, a Flutter plugin to play mult
version: 2.1.0
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers_linux
+publish_to: none
flutter:
plugin:
@@ -12,7 +13,8 @@ flutter:
pluginClass: AudioplayersLinuxPlugin
dependencies:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
flutter:
sdk: flutter
diff --git a/packages/audioplayers_ohos/.gitignore b/packages/audioplayers_ohos/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..04c2400af2bf659badc32bbf1e84707f011aadd8
--- /dev/null
+++ b/packages/audioplayers_ohos/.gitignore
@@ -0,0 +1,17 @@
+*.iml
+.DS_Store
+.atom/
+.idea
+.packages
+.dart_tool/
+.pub/
+build/
+ios/.generated/
+packages
+.classpath
+.project
+.settings
+.vscode
+testing
+.flutter-plugins-dependencies
+flutter_export_environment.sh
diff --git a/packages/audioplayers_ohos/analysis_options.yaml b/packages/audioplayers_ohos/analysis_options.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..41310ed31d103d1622612223f972ea3b019076ab
--- /dev/null
+++ b/packages/audioplayers_ohos/analysis_options.yaml
@@ -0,0 +1,14 @@
+# Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include: package:flame_lint/analysis_options.yaml
diff --git a/packages/audioplayers_ohos/ohos/AppScope/app.json5 b/packages/audioplayers_ohos/ohos/AppScope/app.json5
new file mode 100644
index 0000000000000000000000000000000000000000..3b004562e3a6f3883f276124187e5ad73741f10f
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/AppScope/app.json5
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "app": {
+ "bundleName": "xyz.luan.audioplayers",
+ "vendor": "example",
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "icon": "$media:app_icon",
+ "label": "$string:app_name"
+ }
+}
diff --git a/packages/audioplayers_ohos/ohos/AppScope/resources/base/element/string.json b/packages/audioplayers_ohos/ohos/AppScope/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..58b1cc51d8d9a97f4b3c535648614dddf46d30ea
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/AppScope/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "audioplayers"
+ }
+ ]
+}
diff --git a/packages/audioplayers_ohos/ohos/AppScope/resources/base/media/app_icon.png b/packages/audioplayers_ohos/ohos/AppScope/resources/base/media/app_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/packages/audioplayers_ohos/ohos/AppScope/resources/base/media/app_icon.png differ
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/.gitignore b/packages/audioplayers_ohos/ohos/audioplayers/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/.gitignore
@@ -0,0 +1,6 @@
+/node_modules
+/oh_modules
+/.preview
+/build
+/.cxx
+/.test
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/build-profile.json5 b/packages/audioplayers_ohos/ohos/audioplayers/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..b5cf54176f8d80660aec9b1757d42ce5b50b2267
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/build-profile.json5
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "apiType": "stageMode",
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default"
+ }
+ ]
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/hvigorfile.ts b/packages/audioplayers_ohos/ohos/audioplayers/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5cdfdb9dcf894f0a1c8e3e6bac99341cdb273f27
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/hvigorfile.ts
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { harTasks } from '@ohos/hvigor-ohos-plugin';
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/index.ets b/packages/audioplayers_ohos/ohos/audioplayers/index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..170b1978b0587f75745aaf38cfbdbbc1c303957f
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/index.ets
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import AudioplayersPlugin from './src/main/ets/components/plugin/AudioplayersPlugin';
+export default AudioplayersPlugin;
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/oh-package.json5 b/packages/audioplayers_ohos/ohos/audioplayers/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..e3ef8720eabc5c7c3c826648024bd63231e4b475
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/oh-package.json5
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "name": "audioplayers",
+ "version": "1.0.0",
+ "description": "Please describe the basic information.",
+ "main": "index.ets",
+ "author": "",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ohos/flutter_ohos": "file:./har/flutter.har"
+ }
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioContextOhos.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioContextOhos.ets
new file mode 100644
index 0000000000000000000000000000000000000000..8b62a2de705afecb6167fff89b539351b76140fd
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioContextOhos.ets
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import media from '@ohos.multimedia.media';
+import audio from '@ohos.multimedia.audio';
+import { Log } from '@ohos/flutter_ohos';
+
+export default class AudioContextOhos {
+ rendererFlags: number = 0;
+ usageType: number = 1;
+ isSpeakerphoneOn: boolean = true;
+ audioScene: number = 0
+
+ copy(): AudioContextOhos {
+ let context = new AudioContextOhos()
+ context.rendererFlags = this.rendererFlags;
+ context.usageType = this.usageType;
+ context.isSpeakerphoneOn = this.isSpeakerphoneOn;
+ context.audioScene = this.audioScene;
+ return context;
+ }
+
+ setAttributesOnPlayer(mediaPlayer: media.AVPlayer) {
+ Log.d("zhu", `setAttributesOnPlayer usage=${this.usageType} rendererFlags=${this.rendererFlags}`);
+ mediaPlayer.audioRendererInfo = {
+ content: 2,
+ usage: this.usageType, rendererFlags: this.rendererFlags
+ }
+ }
+
+ buildAttributes(): audio.AudioRendererInfo {
+ return {
+ content: 2,
+ usage: this.usageType,
+ rendererFlags: this.rendererFlags
+ }
+ }
+
+ equals(context: AudioContextOhos) {
+ return context.rendererFlags == this.rendererFlags && context.usageType == this.usageType;
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioplayersPlugin.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioplayersPlugin.ets
new file mode 100644
index 0000000000000000000000000000000000000000..f04d0854361a6def06b308e1f348e53a56f0da96
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/AudioplayersPlugin.ets
@@ -0,0 +1,362 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ FlutterPlugin,
+ FlutterPluginBinding
+} from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
+import MethodChannel, { MethodResult, } from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel';
+import { EventSink, StreamHandler } from '@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel';
+import MethodCall from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodCall';
+import { BinaryMessenger, EventChannel, Log } from '@ohos/flutter_ohos';
+import { HashMap } from '@kit.ArkTS';
+import AudioContextOhos from './AudioContextOhos';
+import { SoundPoolManager } from './player/SoundPoolPlayer';
+import WrappedPlayer from './player/WrappedPlayer';
+import audio from '@ohos.multimedia.audio';
+import UrlSource from './source/UrlSource';
+import BytesSource from './source/BytesSource';
+import { parseReleaseMode } from './ReleaseMode';
+import { parsePlayerMode } from './PlayerMode';
+
+export default class AudioplayersPlugin implements FlutterPlugin, IUpdateCallback {
+ private methods?: MethodChannel = undefined;
+ private globalMethods?: MethodChannel = undefined;
+ private globalEvents?: EventHandler = undefined;
+ private context?: Context = undefined;
+ private binaryMessenger?: BinaryMessenger = undefined;
+ private soundPoolManager?: SoundPoolManager = undefined;
+ private players = new HashMap();
+ private defaultAudioContext = new AudioContextOhos();
+ private updateInterval: number | null = null
+
+ getUniqueClassName(): string {
+ return "AudioplayersPlugin"
+ }
+
+ onAttachedToEngine(binding: FlutterPluginBinding): void {
+ this.context = binding.getApplicationContext()
+ this.binaryMessenger = binding.getBinaryMessenger()
+ this.soundPoolManager = new SoundPoolManager(this)
+ this.methods = new MethodChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers")
+ this.methods.setMethodCallHandler({
+ onMethodCall: (call: MethodCall, result: MethodResult) => {
+ this.methodCall(call, result)
+ }
+ })
+ this.globalMethods = new MethodChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers.global")
+ this.globalMethods.setMethodCallHandler({
+ onMethodCall: (call: MethodCall, result: MethodResult) => {
+ this.globalMethodCall(call, result)
+ }
+ })
+ this.globalEvents = new EventHandler(new EventChannel(binding.getBinaryMessenger(), "xyz.luan/audioplayers.global/events"))
+ }
+
+ onDetachedFromEngine(binding: FlutterPluginBinding): void {
+ this.stopUpdates()
+ this.players.forEach((value: WrappedPlayer, key: string) => value.dispose())
+ this.players.clear()
+ this.soundPoolManager?.dispose()
+ this.globalEvents?.dispose()
+ this.stopUpdates();
+ }
+
+ private globalMethodCall(call: MethodCall, result: MethodResult): void {
+ switch (call.method) {
+ case "setAudioContext":
+ // TODO 没有相关API
+ //let audioManager = this.getAudioManager()
+ //audioManager.mode = defaultAudioContext.audioMode
+ //audioManager.isSpeakerphoneOn = defaultAudioContext.isSpeakerphoneOn
+ this.defaultAudioContext = this.getAudioContext(call)
+ break;
+ case "emitLog":
+ let message = this.getObjectValue(call, "message", "message is required") as string;
+ this.handleGlobalLog(message);
+ break;
+ case "emitError":
+ let code = this.getObjectValue(call, "code", "code is required") as string;
+ message = this.getObjectValue(call, "message", "message is required") as string;
+ this.handleGlobalError(code, message, null)
+ break;
+ default:
+ result.notImplemented()
+ break;
+ }
+ }
+
+ private async methodCall(call: MethodCall, response: MethodResult) {
+ let playerId = call.argument("playerId") as string
+ if (playerId == null || playerId == undefined) {
+ response.success(1)
+ return;
+ }
+ try {
+ if (call.method == "create") {
+ let eventHandler = new EventHandler(new EventChannel(this.binaryMessenger!, `xyz.luan/audioplayers/events/${playerId}`))
+ this.players.set(playerId, new WrappedPlayer(this, eventHandler, this.defaultAudioContext.copy(), this.soundPoolManager!))
+ response.success(1);
+ return;
+ }
+ let player = this.getPlayer(playerId)
+ if (player == null) {
+ response.error("OhosAudioError", "not find player", Error("not find player"))
+ return;
+ }
+ switch (call.method) {
+ case "setSourceUrl":
+ let url = this.getObjectValue(call, "url", "url is required") as string;
+ let isLocal = call.hasArgument("isLocal") ? (call.argument("isLocal") as boolean) : false;
+ await player!.setSource(new UrlSource(url, isLocal));
+ break;
+ case "setSourceBytes":
+ let bytes = this.getObjectValue(call, "bytes", "bytes are required") as ArrayBuffer
+ player.setSource(new BytesSource(bytes))
+ break;
+ case "resume":
+ player.play();
+ break;
+ case "pause":
+ player.pause();
+ break;
+ case "stop":
+ player.stop();
+ break;
+ case "release":
+ player.release();
+ break;
+ case "seek":
+ let position = this.getObjectValue(call, "position", "position is required") as number;
+ player.seek(position);
+ break;
+ case "setVolume":
+ let volume = this.getObjectValue(call, "volume", "volume is required") as number;
+ player.setVolume(volume);
+ break;
+ case "setBalance":
+ let balance = this.getObjectValue(call, "balance", "balance is required") as number;
+ player.setBalance(balance);
+ break;
+ case "setPlaybackRate":
+ let rate = this.getObjectValue(call, "playbackRate", "playbackRate is required") as number;
+ player.setRate(rate);
+ break;
+ case "getDuration":
+ let duration = player.getDuration();
+ response.success(duration ? duration : 0);
+ return;
+ case "getCurrentPosition":
+ let postion = player.getCurrentPosition();
+ response.success(postion ? postion : 0)
+ return;
+ case "setReleaseMode":
+ let releaseMode = this.getObjectValue(call, "releaseMode", "releaseMode is required") as string
+ player.setReleaseMode(parseReleaseMode(releaseMode));
+ break;
+ case "setPlayerMode":
+ let playerMode = this.getObjectValue(call, "playerMode", "playerMode is required") as string
+ player.setPlayerMode(parsePlayerMode(playerMode));
+ break;
+ case "setAudioContext":
+ let audioContext = this.getAudioContext(call);
+ player.updateAudioContext(audioContext)
+ break;
+ case "emitLog":
+ let message = this.getObjectValue(call, "message", "message is required") as string
+ player.handleLog(message)
+ break;
+ case "emitError":
+ let code = this.getObjectValue(call, "code", "code is required") as string
+ message = this.getObjectValue(call, "message", "message is required") as string
+ player.handleError(code, message, null)
+ break;
+ case "dispose":
+ player.dispose()
+ this.players.remove(playerId)
+ break;
+ default:
+ response.notImplemented()
+ return;
+ }
+ response.success(1)
+ } catch (e) {
+ response.error("AndroidAudioError", e.message, e)
+ }
+ }
+
+ private getPlayer(playerId: string): WrappedPlayer | null {
+ if (this.players.hasKey(playerId)) {
+ return this.players.get(playerId)
+ }
+ this.error("Player has not yet been created or has already been disposed.")
+ return null
+ }
+
+ getApplicationContext(): Context {
+ return this.context!
+ }
+
+ getAudioManager(): audio.AudioManager {
+ return audio.getAudioManager();
+ }
+
+ handleIsPlaying() {
+ this.startUpdates()
+ }
+
+ handleDuration(player: WrappedPlayer) {
+ let map = new Map();
+ let dutraion = player.getDuration();
+ map.set("value", dutraion ? dutraion : 0);
+ player.eventHandler.success("audio.onDuration", map);
+ }
+
+ handleComplete(player: WrappedPlayer) {
+ player.eventHandler.success("audio.onComplete");
+ }
+
+ handlePrepared(player: WrappedPlayer, isPrepared: boolean) {
+ let map = new Map();
+ map.set("value", isPrepared);
+ player.eventHandler.success("audio.onPrepared", map);
+ }
+
+ handleLog(player: WrappedPlayer, message: string) {
+ let map = new Map();
+ map.set("value", message);
+ player.eventHandler.success("audio.onLog", map);
+ }
+
+ handleGlobalLog(message: string) {
+ let map = new Map();
+ map.set("value", message);
+ this.globalEvents!.success("audio.onLog", map);
+ }
+
+ handleError(player: WrappedPlayer, errorCode?: string, errorMessage?: string, errorDetails?: ESObject) {
+ player.eventHandler.error(errorCode, errorMessage, errorDetails)
+ }
+
+ handleGlobalError(errorCode?: string, errorMessage?: string, errorDetails?: ESObject) {
+ this.globalEvents!.error(errorCode, errorMessage, errorDetails)
+ }
+
+ handleSeekComplete(player: WrappedPlayer) {
+ let map = new Map();
+ let position = player.getCurrentPosition();
+ map.set("value", position ? position : 0);
+ player.eventHandler.success("audio.onSeekComplete")
+ player.eventHandler.success("audio.onCurrentPosition", map)
+ }
+
+ startUpdates() {
+ this.stopUpdates();
+ this.updateInterval = setInterval(() => {
+ this.updateCallback();
+ }, 200)
+ }
+
+ stopUpdates() {
+ if (this.updateInterval) {
+ clearInterval(this.updateInterval)
+ this.updateInterval = null
+ }
+ }
+
+ private updateCallback() {
+ let mediaPlayers = this.players;
+ let channel = this.methods;
+ if (mediaPlayers == null || channel == null) {
+ this.stopUpdates()
+ return
+ }
+ let isAnyPlaying = false
+ mediaPlayers.forEach((player: WrappedPlayer, key: string) => {
+ if (player.isActuallyPlaying()) {
+ isAnyPlaying = true
+ let time = player.getCurrentPosition()
+
+ let map = new Map();
+ map.set("value", time ? time : 0);
+ player.eventHandler.success("audio.onCurrentPosition", map)
+ }
+ })
+ if (!isAnyPlaying) {
+ this.stopUpdates()
+ }
+ }
+
+ private getAudioContext(call: MethodCall): AudioContextOhos {
+ let contextOhos = new AudioContextOhos();
+ contextOhos.isSpeakerphoneOn = this.getObjectValue(call, "isSpeakerphoneOn", "isSpeakerphoneOn is required") as boolean
+ contextOhos.rendererFlags = this.getObjectValue(call, "rendererFlags", "rendererFlags is required") as number
+ contextOhos.usageType = this.getObjectValue(call, "usageType", "usageType is required") as number
+ contextOhos.audioScene = this.getObjectValue(call, "audioScene", "audioScene is required") as number
+ return contextOhos;
+ }
+
+ private getObjectValue(call: MethodCall, key: string, error: string): ESObject {
+ if (call.hasArgument(key)) {
+ return call.argument(key);
+ }
+ this.error(error)
+ }
+
+ private error(msg: string) {
+ throw new Error(msg);
+ }
+}
+
+export class EventHandler implements StreamHandler {
+ private eventChannel?: EventChannel = undefined;
+ private eventSink: EventSink | null = null
+
+ constructor(eventChannel: EventChannel) {
+ this.eventChannel = eventChannel;
+ this.eventChannel.setStreamHandler(this)
+ }
+
+ onListen(args: ESObject, events: EventSink): void {
+ this.eventSink = events
+ }
+
+ onCancel(args: ESObject): void {
+ this.eventSink = null
+ }
+
+ success(method: string, args: Map = new Map()) {
+ args.set("event", method)
+ this.eventSink?.success(args)
+ }
+
+ error(errorCode?: string, errorMessage?: string, errorDetails?: ESObject) {
+ this.eventSink?.error(errorCode, errorMessage, errorDetails)
+ }
+
+ dispose() {
+ if (this.eventSink) {
+ this.eventSink.endOfStream();
+ this.onCancel(null);
+ }
+ this.eventChannel?.setStreamHandler(null)
+ }
+}
+
+interface IUpdateCallback {
+ stopUpdates(): void
+
+ startUpdates(): void
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/PlayerMode.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/PlayerMode.ets
new file mode 100644
index 0000000000000000000000000000000000000000..d22de0f8d4f0b4061cef1886fb5b5ea3d65a910b
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/PlayerMode.ets
@@ -0,0 +1,27 @@
+
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ export enum PlayerMode {
+ MEDIA_PLAYER = 1,
+ LOW_LATENCY = 2
+}
+
+export const parsePlayerMode = (mode: string) => {
+ if (mode == "PlayerMode.lowLatency") {
+ return PlayerMode.LOW_LATENCY
+ }
+ return PlayerMode.MEDIA_PLAYER;
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/ReleaseMode.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/ReleaseMode.ets
new file mode 100644
index 0000000000000000000000000000000000000000..30494c35a348ce100bd90c135cb034a05cd7fc76
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/ReleaseMode.ets
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export enum ReleaseMode {
+ RELEASE = 1,
+ LOOP = 2,
+ STOP = 3
+}
+
+export const parseReleaseMode = (mode: string) => {
+ if (mode == "ReleaseMode.stop") {
+ return ReleaseMode.STOP
+ } else if (mode == "ReleaseMode.loop") {
+ return ReleaseMode.LOOP
+ }
+ return ReleaseMode.RELEASE;
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/FocusManager.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/FocusManager.ets
new file mode 100644
index 0000000000000000000000000000000000000000..24da65ee53f28dd1454c3b9373de2b23a5d6d724
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/FocusManager.ets
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import WrappedPlayer from './WrappedPlayer'
+
+export default class FocusManager {
+ private player: WrappedPlayer | null = null;
+
+ constructor(player: WrappedPlayer) {
+ this.player = player;
+ }
+
+ handleStop() {
+
+ }
+
+ maybeRequestAudioFocus(andThen: Function) {
+ andThen()
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/MediaPlayerPlayer.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/MediaPlayerPlayer.ets
new file mode 100644
index 0000000000000000000000000000000000000000..67a813e87037fed2b6f125c5d7211ade4179b065
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/MediaPlayerPlayer.ets
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AudioContextOhos from '../AudioContextOhos';
+import Source from '../source/Source';
+import Player from './Player';
+import WrappedPlayer from './WrappedPlayer'
+import media from '@ohos.multimedia.media';
+import { BusinessError } from '@ohos.base';
+import { Log } from '@ohos/flutter_ohos';
+
+const TAG = "MediaPlayerPlayer"
+
+export default class MediaPlayerPlayer implements Player {
+ private wrappedPlayer: WrappedPlayer;
+ private mediaPlayer?: media.AVPlayer | null = null;
+ private isLooping: boolean = false;
+ private volume: number = 1;
+ private needPrepare: boolean = false;
+
+ constructor(wrappedPlayer: WrappedPlayer) {
+ this.wrappedPlayer = wrappedPlayer;
+ }
+
+ async initMediaPlayer() {
+ this.mediaPlayer = await media.createAVPlayer();
+ this.setAVPlayerCallback(this.mediaPlayer)
+ Log.d(TAG, "initMediaPlayer");
+ }
+
+ setAVPlayerCallback(avPlayer: media.AVPlayer) {
+ // seek操作结果回调函数
+ avPlayer.on('seekDone', (seekDoneTime: number) => {
+ Log.d(TAG, `AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
+ this.wrappedPlayer.onSeekComplete()
+ })
+
+ avPlayer.on('bufferingUpdate', (infoType: media.BufferingInfoType, value: number) => {
+ Log.d(TAG, `AVPlayer bufferingUpdate value is ${value}`);
+ this.wrappedPlayer.onBuffering(value)
+ })
+
+ // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
+ avPlayer.on('error', (err: BusinessError) => {
+ Log.e(TAG, `Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
+ this.wrappedPlayer.onError(err.code, err.message)
+ })
+ // 状态机变化回调函数
+ avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
+ switch (state) {
+ case 'idle': // 成功调用reset接口后触发该状态机上报
+ Log.d(TAG, 'AVPlayer state idle called.');
+ break;
+ case 'initialized': // avplayer 设置播放源后触发该状态上报
+ Log.d(TAG, 'AVPlayer state initialized called.');
+ this.wrappedPlayer.context?.setAttributesOnPlayer(this.mediaPlayer!)
+ this.needPrepare && this.prepare();
+ break;
+ case 'prepared': // prepare调用成功后上报该状态机
+ Log.d(TAG, 'AVPlayer state prepared called.');
+ this.setVolume(this.volume, this.volume)
+ this.setLooping(this.isLooping)
+ this.wrappedPlayer.onPrepared();
+ break;
+ case 'playing': // play成功调用后触发该状态机上报
+ Log.d(TAG, 'AVPlayer state playing called.');
+ break;
+ case 'paused': // pause成功调用后触发该状态机上报
+ Log.d(TAG, 'AVPlayer state paused called.');
+ break;
+ case 'completed': // 播放结束后触发该状态机上报
+ Log.d(TAG, 'AVPlayer state completed called.');
+ this.wrappedPlayer.onCompletion()
+ break;
+ case 'stopped': // stop接口成功调用后触发该状态机上报
+ Log.d(TAG, 'AVPlayer state stopped called.');
+ this.needPrepare && this.prepare();
+ break;
+ case 'released':
+ Log.d(TAG, 'AVPlayer state released called.');
+ break;
+ default:
+ Log.d(TAG, 'AVPlayer state unknown called.');
+ break;
+ }
+ })
+ }
+
+ getDuration(): number {
+ // media player returns -1 if the duration is unknown
+ return this.mediaPlayer ? this.mediaPlayer!.duration : -1
+ }
+
+ getCurrentPosition(): number {
+ return this.mediaPlayer ? this.mediaPlayer!.currentTime : -1
+ }
+
+ isActuallyPlaying(): boolean {
+ return this.mediaPlayer ? this.mediaPlayer!.state == 'playing' : false
+ }
+
+ isLiveStream(): boolean {
+ let duration = this.getDuration();
+ return duration == 0 || duration == -1
+ }
+
+ async start() {
+ this.mediaPlayer && await this.mediaPlayer.play();
+ }
+
+ async pause() {
+ this.mediaPlayer && this.mediaPlayer!.state == 'playing' && await this.mediaPlayer.pause();
+ }
+
+ async stop() {
+ this.needPrepare = false;
+ this.mediaPlayer && await this.mediaPlayer.stop();
+ }
+
+ seekTo(position: number) {
+ this.mediaPlayer && this.mediaPlayer.seek(position);
+ }
+
+ async release() {
+ if (this.mediaPlayer) {
+ await this.mediaPlayer.reset()
+ await this.mediaPlayer.release()
+ }
+ }
+
+ setVolume(leftVolume: number, rightVolume: number) {
+ this.volume = leftVolume;
+ if (this.isReadyState()) {
+ this.mediaPlayer!.setVolume(leftVolume);
+ }
+ }
+
+ setRate(rate: number) {
+ let speed = media.PlaybackSpeed.SPEED_FORWARD_1_00_X;
+ if (rate < 1) {
+ speed = media.PlaybackSpeed.SPEED_FORWARD_0_75_X;
+ } else if (rate == 1.25) {
+ speed = media.PlaybackSpeed.SPEED_FORWARD_1_25_X;
+ } else if (rate == 1.75) {
+ speed = media.PlaybackSpeed.SPEED_FORWARD_1_75_X;
+ } else if (rate >= 2) {
+ speed = media.PlaybackSpeed.SPEED_FORWARD_2_00_X;
+ }
+ this.mediaPlayer && this.mediaPlayer.setSpeed(speed);
+ }
+
+ setLooping(looping: boolean) {
+ this.isLooping = looping;
+ if (this.isReadyState()) {
+ this.mediaPlayer!.loop = looping;
+ }
+ }
+
+ private isReadyState() {
+ return this.mediaPlayer && (this.mediaPlayer!.state == 'prepared' || this.mediaPlayer!.state == 'playing'
+ || this.mediaPlayer!.state == 'paused' || this.mediaPlayer!.state == 'completed')
+ }
+
+ updateContext(context: AudioContextOhos) {
+ this.mediaPlayer && this.mediaPlayer!.state == 'initialized' &&context.setAttributesOnPlayer(this.mediaPlayer);
+ }
+
+ async setSource(source: Source) {
+ await this.reset()
+ this.mediaPlayer && source.setForMediaPlayer(this.mediaPlayer);
+ }
+
+ async prepare() {
+ if (this.canPrepare()) {
+ this.needPrepare = false;
+ await this.mediaPlayer!.prepare()
+ } else {
+ this.needPrepare = true
+ }
+ }
+
+ private canPrepare() {
+ return this.mediaPlayer && (this.mediaPlayer!.state == 'stopped' || this.mediaPlayer!.state == 'initialized')
+ }
+
+ async reset() {
+ this.mediaPlayer && await this.mediaPlayer.reset()
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/Player.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/Player.ets
new file mode 100644
index 0000000000000000000000000000000000000000..7064b3bc3fac3c3653b7a34d572eb50419aea8d6
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/Player.ets
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AudioContextOhos from '../AudioContextOhos'
+import Source from '../source/Source'
+
+export default interface Player {
+ getDuration(): number | null;
+
+ getCurrentPosition(): number | null;
+
+ isActuallyPlaying(): boolean;
+
+ isLiveStream(): boolean;
+
+ start(): void;
+
+ pause(): void;
+
+ stop(): void;
+
+ seekTo(position: number): void;
+
+ release(): void;
+
+ setVolume(leftVolume: number, rightVolume: number): void;
+
+ setRate(rate: number): void;
+
+ setLooping(looping: boolean): void;
+
+ updateContext(context: AudioContextOhos): void;
+
+ setSource(source: Source): void;
+
+ prepare(): void;
+
+ reset(): void;
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/SoundPoolPlayer.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/SoundPoolPlayer.ets
new file mode 100644
index 0000000000000000000000000000000000000000..962e05640898ec5f08251a0274bd277e93260ee5
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/SoundPoolPlayer.ets
@@ -0,0 +1,293 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import audio from '@ohos.multimedia.audio';
+import media from '@ohos.multimedia.media';
+import AudioContextOhos from '../AudioContextOhos';
+import AudioplayersPlugin from '../AudioplayersPlugin';
+import Source from '../source/Source';
+import UrlSource from '../source/UrlSource';
+import Player from './Player';
+import WrappedPlayer from './WrappedPlayer';
+import { HashMap } from '@kit.ArkTS';
+
+const MAX_STREAMS = 32;
+
+export default class SoundPoolPlayer implements Player {
+ wrappedPlayer: WrappedPlayer;
+ private soundPoolManager: SoundPoolManager;
+ soundId: number | null = null;
+ private streamId: number | null = null;
+ private audioContext: AudioContextOhos;
+ private soundPoolWrapper: SoundPoolWrapper | null = null;
+ private soundPool: media.SoundPool | null = null;
+
+ constructor(wrappedPlayer: WrappedPlayer, soundPoolManager: SoundPoolManager) {
+ this.wrappedPlayer = wrappedPlayer;
+ this.soundPoolManager = soundPoolManager;
+ this.audioContext = wrappedPlayer.context;
+ }
+
+ async init() {
+ await this.soundPoolManager.createSoundPoolWrapper(MAX_STREAMS, this.audioContext);
+ this.soundPoolWrapper = this.soundPoolManager.getSoundPoolWrapper(this.audioContext);
+ this.soundPool = this.soundPoolWrapper!.soundPool;
+ }
+
+ async setAudioContext(audioContext: AudioContextOhos) {
+ if (!audioContext.equals(audioContext)) {
+ this.audioContext = audioContext;
+ await this.release();
+ await this.init()
+ }
+ }
+
+ getDuration(): number | null {
+ return null;
+ }
+
+ getCurrentPosition(): number | null {
+ return null;
+ }
+
+ isActuallyPlaying(): boolean {
+ return false;
+ }
+
+ isLiveStream(): boolean {
+ return false;
+ }
+
+ async start() {
+ let streamId = this.streamId
+ let soundId = this.soundId
+ if (soundId != null) {
+ let playParameters: media.PlayParameters = {
+ loop: this.wrappedPlayer.getLooping() ? -1 : 0,
+ rate: this.convertRate(this.wrappedPlayer.getRate()), // 正常倍速
+ leftVolume: this.wrappedPlayer.getVolume(), // range = 0.0-1.0
+ rightVolume: this.wrappedPlayer.getVolume(), // range = 0.0-1.0
+ priority: 0, // 最低优先级
+ }
+ this.streamId = await this.soundPool!.play(this.soundId, playParameters)!
+ }
+ }
+
+ pause() {
+ if (this.streamId != null) {
+ this.soundPool!.stop(this.streamId)
+ this.streamId = null;
+ }
+ }
+
+ stop() {
+ if (this.streamId != null) {
+ this.soundPool!.stop(this.streamId)
+ this.streamId = null;
+ }
+ }
+
+ seekTo(position: number) {
+ //TODO
+ //this.unsupportedOperation("seek")
+ }
+
+ async release() {
+ await this.stop()
+ if (this.soundId == null) {
+ return
+ }
+ if (this.getUrlSource() == null) {
+ return;
+ }
+ if (!this.soundPoolWrapper!.urlToPlayers.hasKey(this.getUrlSource())) {
+ return;
+ }
+ let playersForSoundId = this.soundPoolWrapper!.urlToPlayers.get(this.getUrlSource());
+ if (playersForSoundId.length == 1 && playersForSoundId[0] == this) {
+ this.soundPoolWrapper!.urlToPlayers.remove(this.getUrlSource())
+ await this.soundPool!.unload(this.soundId)
+ this.soundPoolWrapper!.soundIdToPlayer.remove(this.soundId)
+ this.wrappedPlayer.handleLog("unloaded soundId $soundId")
+ } else {
+ // This is not the last player using the soundId, just remove it from the list.
+ let index = playersForSoundId.indexOf(this);
+ if (index > -1) {
+ playersForSoundId.splice(index, 1)
+ }
+ }
+ this.soundId = null
+ }
+
+ async setVolume(leftVolume: number, rightVolume: number) {
+ if (this.streamId != null) {
+ await this.soundPool!.setVolume(this.streamId, leftVolume, rightVolume)
+ }
+ }
+
+ async setRate(rate: number) {
+ if (this.streamId != null) {
+ await this.soundPool!.setRate(this.streamId, this.convertRate(rate))
+ }
+ }
+
+ async setLooping(looping: boolean) {
+ if (this.streamId != null) {
+ await this.soundPool!.setLoop(this.streamId, looping ? -1 : 0);
+ }
+ }
+
+ updateContext(context: AudioContextOhos) {
+ this.audioContext = context
+ }
+
+ setSource(source: Source) {
+ source.setForSoundPool(this)
+ }
+
+ prepare() {
+ // sound pool automatically prepares when source URL is set
+ }
+
+ reset() {
+ // TODO(luan): what do I do here?
+ }
+
+ private unsupportedOperation(message: string) {
+ throw new Error(`LOW_LATENCY mode does not support: ${message}`)
+ }
+
+ private convertRate(rate: number): audio.AudioRendererRate {
+ let ohrate = audio.AudioRendererRate.RENDER_RATE_NORMAL;
+ if (this.wrappedPlayer.getRate() < 1) {
+ ohrate = audio.AudioRendererRate.RENDER_RATE_HALF;
+ } else if (this.wrappedPlayer.getRate() > 1) {
+ ohrate = audio.AudioRendererRate.RENDER_RATE_DOUBLE;
+ }
+ return ohrate;
+ }
+
+ async setUrlSource(urlSource: UrlSource) {
+ if (this.soundId != null) {
+ await this.release()
+ }
+ if (!this.soundPoolWrapper!.urlToPlayers.hasKey(urlSource)) {
+ this.soundPoolWrapper!.urlToPlayers.set(urlSource, Array())
+ }
+ let urlPlayers = this.soundPoolWrapper!.urlToPlayers.get(urlSource);
+ let originalPlayer = urlPlayers.length > 0 ? urlPlayers[0] : null;
+ if (originalPlayer != null) {
+ // Sound has already been loaded - reuse the soundId.
+ let prepared = originalPlayer.wrappedPlayer.getPrepared();
+ this.wrappedPlayer.setPrepared(prepared);
+ this.soundId = originalPlayer.soundId
+ this.wrappedPlayer.handleLog(`Reusing soundId ${this.soundId} for ${urlSource.url} is prepared=${prepared}`)
+ } else {
+ // First one for this URL - load it.
+ let start = new Date().getTime();
+ this.wrappedPlayer.setPrepared(false);
+ this.wrappedPlayer.handleLog(`Fetching actual URL for ${urlSource.url}}`)
+ let actualUrl = await urlSource.getAudioPathForSoundPool(this.wrappedPlayer.getApplicationContext());
+ this.wrappedPlayer.handleLog(`Now loading ${actualUrl}`)
+ let intSoundId = await this.soundPool!.load(actualUrl)
+ this.soundPoolWrapper!.soundIdToPlayer.set(intSoundId, this)
+ this.soundId = intSoundId
+ this.wrappedPlayer.handleLog(`time to call load() for ${urlSource.url}: ${new Date().getTime() - start} player=${this}}`,)
+ }
+ urlPlayers.push(this);
+ }
+
+ getUrlSource(): UrlSource | null {
+ let source = this.wrappedPlayer.getSource();
+ return source ? this.wrappedPlayer.getSource() as UrlSource : null
+ }
+}
+
+export class SoundPoolManager {
+ private ref: AudioplayersPlugin;
+ private legacySoundPoolWrapper: SoundPoolWrapper | null = null
+ private soundPoolWrappers = new HashMap()
+
+ constructor(plugin: AudioplayersPlugin) {
+ this.ref = plugin;
+ }
+
+ async createSoundPoolWrapper(maxStreams: number, audioContext: AudioContextOhos) {
+ let attrs = audioContext.buildAttributes();
+ let key = attrs.usage + "" + attrs.rendererFlags;
+ if (!this.soundPoolWrappers.hasKey(key)) {
+ let soundPool = await media.createSoundPool(maxStreams, attrs);
+ this.ref.handleGlobalLog("Create SoundPool with " + key);
+ let soundPoolWrapper = new SoundPoolWrapper(soundPool);
+ soundPoolWrapper.soundPool.on('loadComplete', (soundId: number) => {
+ this.ref.handleGlobalLog(`Loaded ${soundId}`)
+ let loadingPlayer = soundPoolWrapper.soundIdToPlayer.get(soundId)
+ let urlSource = loadingPlayer.getUrlSource()
+ if (urlSource) {
+ soundPoolWrapper.soundIdToPlayer.remove(loadingPlayer.soundId);
+ let urlPlayers = soundPoolWrapper.urlToPlayers.get(urlSource)
+ for (let player of urlPlayers) {
+ player.wrappedPlayer.handleLog(`Marking ${player.soundId} as loaded`);
+ player.wrappedPlayer.setPrepared(true);
+ if (player.wrappedPlayer.isPlaying()) {
+ player.wrappedPlayer.handleLog(`Delayed start of ${player.soundId}`);
+ player.start();
+ }
+ }
+ }
+ });
+ this.soundPoolWrappers.set(key, soundPoolWrapper);
+ }
+ }
+
+ /**
+ * Get the [SoundPoolWrapper] with the given [audioContext].
+ */
+ getSoundPoolWrapper(audioContext: AudioContextOhos): SoundPoolWrapper | null {
+ let attrs = audioContext.buildAttributes();
+ let key = attrs.usage + "" + attrs.rendererFlags;
+ return this.soundPoolWrappers.hasKey(key) ? this.soundPoolWrappers.get(key) : null;
+ }
+
+ dispose() {
+ this.soundPoolWrappers.forEach((value: SoundPoolWrapper, key: string) => value.dispose())
+ this.soundPoolWrappers.clear()
+ }
+}
+
+class SoundPoolWrapper {
+ soundPool: media.SoundPool;
+ soundIdToPlayer = new HashMap()
+ urlToPlayers = new HashMap>()
+
+ constructor(soundPool: media.SoundPool) {
+ this.soundPool = soundPool;
+ }
+
+ /** For the onLoadComplete listener, track which sound id is associated with which player. An entry only exists until
+ * it has been loaded.
+ */
+
+ /** This is to keep track of the players which share the same sound id, referenced by url. When a player release()s, it
+ * is removed from the associated player list. The last player to be removed actually unloads() the sound id and then
+ * the url is removed from this map.
+ */
+ dispose() {
+ this.soundPool.off('loadComplete');
+ this.soundPool.release();
+ this.soundIdToPlayer.clear();
+ this.urlToPlayers.clear();
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/WrappedPlayer.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/WrappedPlayer.ets
new file mode 100644
index 0000000000000000000000000000000000000000..cb49847be12a5910c4730d9cb7d5d06936c0ceac
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/player/WrappedPlayer.ets
@@ -0,0 +1,380 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AudioContextOhos from '../AudioContextOhos'
+import AudioplayersPlugin, { EventHandler } from '../AudioplayersPlugin'
+import { ReleaseMode } from '../ReleaseMode';
+import { PlayerMode } from '../PlayerMode';
+import Source from '../source/Source';
+import FocusManager from './FocusManager';
+import Player from './Player';
+import { Context } from '@kit.AbilityKit';
+import audio from '@ohos.multimedia.audio';
+import SoundPoolPlayer, { SoundPoolManager } from './SoundPoolPlayer';
+import MediaPlayerPlayer from './MediaPlayerPlayer';
+
+export default class WrappedPlayer {
+ private ref: AudioplayersPlugin;
+ eventHandler: EventHandler;
+ context: AudioContextOhos;
+ private soundPoolManager: SoundPoolManager;
+ private player: Player | null = null;
+ private source: Source | null = null;
+ private released: boolean = true;
+ private prepared: boolean = false;
+ private playing: boolean = false;
+ private volume: number = 1.0;
+ private balance: number = 0.0;
+ private rate: number = 1.0;
+ private releaseMode: ReleaseMode = ReleaseMode.RELEASE;
+ private isLooping: boolean = this.releaseMode == ReleaseMode.LOOP;
+ private playerMode: PlayerMode = PlayerMode.MEDIA_PLAYER;
+ private shouldSeekTo: number = -1
+ private focusManager = new FocusManager(this)
+
+ constructor(plugin: AudioplayersPlugin, eventHandler: EventHandler, context: AudioContextOhos, soundPoolManager: SoundPoolManager) {
+ this.ref = plugin;
+ this.eventHandler = eventHandler;
+ this.context = context;
+ this.soundPoolManager = soundPoolManager;
+ }
+
+ async setSource(value: Source | null) {
+ if (this.source != value) {
+ this.source = value;
+ if (value != null) {
+ let player = await this.getOrCreatePlayer()
+ player.setSource(value)
+ await this.configAndPrepare()
+ } else {
+ this.released = true
+ this.setPrepared(false)
+ this.playing = false
+ await this.player?.release()
+ }
+ } else {
+ this.ref.handlePrepared(this, true)
+ }
+ }
+
+ getSource(): Source | null {
+ return this.source;
+ }
+
+ isPlaying() : boolean{
+ return this.playing
+ }
+
+ setVolume(value: number) {
+ if (this.volume != value) {
+ this.volume = value
+ if (!this.released) {
+ this.setVolumeAndBalance(value, this.balance)
+ }
+ }
+ }
+
+ setBalance(value: number) {
+ if (this.balance != value) {
+ this.balance = value
+ if (!this.released) {
+ this.setVolumeAndBalance(this.volume, value)
+ }
+ }
+ }
+
+ setRate(value: number) {
+ if (this.rate != value) {
+ this.rate = value
+ this.player && this.player?.setRate(value)
+ }
+ }
+
+ setReleaseMode(value: ReleaseMode) {
+ if (this.releaseMode != value) {
+ this.releaseMode = value
+ this.isLooping = this.releaseMode == ReleaseMode.LOOP;
+ if (!this.released) {
+ this.player?.setLooping(this.isLooping)
+ }
+ }
+ }
+
+ getLooping() {
+ return this.releaseMode == ReleaseMode.LOOP;
+ }
+
+ async setPlayerMode(value: PlayerMode) {
+ if (this.playerMode != value) {
+ this.playerMode = value
+ if (this.player) {
+ this.shouldSeekTo = this.maybeGetCurrentPosition()
+ this.setPrepared(false)
+ await this.player.release()
+ }
+ await this.initPlayer()
+ }
+ }
+
+ setPrepared(value: boolean) {
+ if (this.prepared != value) {
+ this.prepared = value
+ this.ref.handlePrepared(this, value)
+ }
+ }
+
+ getPrepared(): boolean {
+ return this.prepared
+ }
+
+ getVolume() {
+ return this.volume;
+ }
+
+ getRate(){
+ return this.rate;
+ }
+
+ private maybeGetCurrentPosition(): number {
+ if (this.player) {
+ let position = this.player.getCurrentPosition();
+ return position != null ? position : -1;
+ }
+ return -1;
+ }
+
+ private async getOrCreatePlayer() {
+ let currentPlayer = this.player;
+ if (this.released || currentPlayer == null) {
+ this.player = await this.createPlayer();
+ this.released = false
+ return this.player!
+ } else if (this.prepared) {
+ await currentPlayer?.reset()
+ this.setPrepared(false);
+ }
+ return currentPlayer!
+ }
+
+ async updateAudioContext(audioContext: AudioContextOhos) {
+ if (this.context == audioContext) {
+ return
+ }
+ // TODO audioFocus
+ this.context = audioContext.copy()
+
+ // AudioManager values are set globally
+ //audioManager.mode = context.audioMode // OHOS没有类似接口?
+ //audioManager.isSpeakerphoneOn = context.isSpeakerphoneOn
+
+ if (this.player) {
+ await this.player.stop()
+ await this.player.reset()
+ this.setPrepared(false)
+ this.player.updateContext(this.context)
+ if (this.source) {
+ this.player.setSource(this.source)
+ await this.configAndPrepare()
+ }
+ }
+ }
+
+ getDuration(): number | null {
+ return (this.prepared && this.player) ? this.player!.getDuration() : null;
+ }
+
+ getCurrentPosition(): number | null {
+ return (this.prepared && this.player) ? this.player!.getCurrentPosition() : null;
+ }
+
+ isActuallyPlaying(): boolean {
+ return this.playing && this.prepared && this.player != null && this.player!.isActuallyPlaying() == true
+ }
+
+ getApplicationContext(): Context {
+ return this.ref.getApplicationContext()
+ }
+
+ getAudioManager(): audio.AudioManager {
+ return this.ref.getAudioManager()
+ }
+
+ play() {
+ this.focusManager.maybeRequestAudioFocus(async () => await this.actuallyPlay())
+ }
+
+ async actuallyPlay() {
+ if (!this.playing && !this.released) {
+ let currentPlayer = this.player;
+ this.playing = true
+ if (currentPlayer == null) {
+ await this.initPlayer()
+ } else if (this.prepared) {
+ await currentPlayer.start()
+ this.ref.handleIsPlaying()
+ }
+ }
+ }
+
+ async stop() {
+ this.focusManager.handleStop()
+ if (this.released) {
+ return
+ }
+ if (this.releaseMode != ReleaseMode.RELEASE) {
+ await this.pause()
+ if (this.prepared) {
+ if (this.player?.isLiveStream() == true) {
+ await this.player?.stop()
+ this.setPrepared(false)
+ await this.player?.prepare()
+ } else {
+ // MediaPlayer does not allow to call player.seekTo after calling player.stop
+ this.seek(0)
+ }
+ }
+ } else {
+ await this.release()
+ }
+ }
+
+ async release() {
+ this.focusManager.handleStop()
+ if (this.released) {
+ return
+ }
+ if (this.playing) {
+ await this.player?.stop()
+ }
+
+ // Setting source to null will reset released, prepared and playing
+ // and also calls player.release()
+ this.setSource(null)
+ this.player = null
+ }
+
+ async pause() {
+ if (this.playing) {
+ this.playing = false
+ if (this.prepared) {
+ await this.player?.pause()
+ }
+ }
+ }
+
+ // seek operations cannot be called until after
+ // the player is ready.
+ seek(position: number) {
+ if (this.prepared && this.player?.isLiveStream() != true) {
+ this.player?.seekTo(position)
+ this.shouldSeekTo = -1
+ } else {
+ this.shouldSeekTo = position
+ }
+ }
+
+ /**
+ * Player callbacks
+ */
+ async onPrepared() {
+ this.setPrepared(true)
+ this.ref.handleDuration(this)
+ if (this.playing) {
+ await this.player?.start()
+ this.ref.handleIsPlaying()
+ }
+ if (this.shouldSeekTo >= 0 && this.player?.isLiveStream() != true) {
+ this.player?.seekTo(this.shouldSeekTo)
+ }
+ }
+
+ async onCompletion() {
+ if (this.releaseMode != ReleaseMode.LOOP) {
+ await this.stop()
+ }
+ this.ref.handleComplete(this)
+ }
+
+ onBuffering(percent: number) {
+ // TODO(luan): expose this as a stream
+ }
+
+ onSeekComplete() {
+ this.ref.handleSeekComplete(this)
+ }
+
+ handleLog(message: string) {
+ this.ref.handleLog(this, message)
+ }
+
+ handleError(errorCode?: string, errorMessage?: string, errorDetails?: ESObject) {
+ this.ref.handleError(this, errorCode, errorMessage, errorDetails)
+ }
+
+ onError(what: number, extra: string): Boolean {
+ // TODO 添加OHOS的player错误
+ // When an error occurs, reset player to not [prepared].
+ // Then no functions will be called, which end up in an illegal player state.
+ this.setPrepared(false)
+ this.handleError(what.toString(), extra, null)
+ return false
+ }
+
+ /**
+ * Create new player
+ */
+ private async createPlayer(): Promise {
+ if (this.playerMode == PlayerMode.LOW_LATENCY) {
+ let player = new SoundPoolPlayer(this, this.soundPoolManager);
+ await player.init();
+ return player;
+ } else {
+ let player = new MediaPlayerPlayer(this);
+ await player.initMediaPlayer()
+ return player
+ }
+ }
+
+ /**
+ * Create new player, assign and configure source
+ */
+ private async initPlayer() {
+ let player = await this.createPlayer()
+ // Need to set player before calling prepare, as onPrepared may is called before player is assigned
+ this.player = player
+ if (this.source) {
+ await this.player.setSource(this.source)
+ await this.configAndPrepare()
+ }
+ }
+
+ private async configAndPrepare() {
+ this.setRate(this.rate)
+ this.setVolumeAndBalance(this.volume, this.balance)
+ this.player?.setLooping(this.isLooping)
+ await this.player?.prepare()
+ }
+
+ private setVolumeAndBalance(volume: number, balance: number) {
+ let leftVolume = Math.min(1, 1 - balance) * volume
+ let rightVolume = Math.min(1, 1 + balance) * volume
+ this.player?.setVolume(leftVolume, rightVolume)
+ }
+
+ async dispose() {
+ await this.release()
+ this.eventHandler.dispose()
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/BytesSource.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/BytesSource.ets
new file mode 100644
index 0000000000000000000000000000000000000000..68bc855442f235c87ec0589cbf40f0ef45eeced5
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/BytesSource.ets
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SoundPoolPlayer from '../player/SoundPoolPlayer';
+import Source from './Source';
+import media from '@ohos.multimedia.media';
+
+export default class BytesSource implements Source {
+ private bytes: ArrayBuffer
+
+ constructor(bytes: ArrayBuffer) {
+ this.bytes = bytes;
+ }
+
+ setForMediaPlayer(mediaPlayer: media.AVPlayer): void {
+ let src: media.AVDataSrcDescriptor = {
+ fileSize: this.bytes.byteLength,
+ callback: (buf: ArrayBuffer, length: number, pos: number | undefined) => {
+ if (buf == undefined || length == undefined || pos == undefined) {
+ return -1;
+ }
+ if (pos >= src.fileSize) {
+ return -1
+ }
+ let remainingSize = this.computeRemainingSize(length, pos);
+ if (remainingSize < 0) {
+ return -1;
+ }
+ const view = new Uint8Array(buf);
+ const dataToCopy = this.bytes.slice(pos, pos + remainingSize);
+ const dataView = new Uint8Array(dataToCopy);
+ // 复制数据到ArrayBuffer
+ view.set(dataView);
+
+ if (remainingSize > 0 && (src.fileSize >= pos)) {
+ return remainingSize;
+ }
+ return -1;
+ }
+ }
+ mediaPlayer.dataSrc = src
+ }
+
+ setForSoundPool(soundPoolPlayer: SoundPoolPlayer): void {
+ throw new Error("Bytes sources are not supported on LOW_LATENCY mode yet.")
+ }
+
+ private computeRemainingSize(length: number, position: number): number {
+ let remainingSize = length
+ if (position + remainingSize > this.bytes.byteLength) {
+ remainingSize -= position + remainingSize - this.bytes.byteLength
+ }
+ return remainingSize
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/Source.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/Source.ets
new file mode 100644
index 0000000000000000000000000000000000000000..9d60498aed724d62c528885d164ce1c4bd7e525d
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/Source.ets
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import media from '@ohos.multimedia.media';
+import SoundPoolPlayer from '../player/SoundPoolPlayer';
+
+export default interface Source {
+ setForMediaPlayer(mediaPlayer: media.AVPlayer): void;
+
+ setForSoundPool(soundPoolPlayer: SoundPoolPlayer): void;
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/UrlSource.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/UrlSource.ets
new file mode 100644
index 0000000000000000000000000000000000000000..ad8679b3b1595c19b5682f3eea17a51680bb9476
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/ets/components/plugin/source/UrlSource.ets
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SoundPoolPlayer from '../player/SoundPoolPlayer';
+import Source from './Source';
+import media from '@ohos.multimedia.media';
+import fs from '@ohos.file.fs';
+import request from '@ohos.request';
+
+export default class UrlSource implements Source {
+ url: string
+ private isLocal: boolean
+
+ constructor(url: string, isLocal: boolean) {
+ this.url = url;
+ this.isLocal = isLocal;
+ }
+
+ setForMediaPlayer(mediaPlayer: media.AVPlayer): void {
+ if (this.isLocal) {
+ let fdPath = 'fd://';
+ // 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报
+ let file = fs.openSync(this.url);
+ fdPath = fdPath + '' + file.fd;
+ mediaPlayer.url = fdPath;
+ } else {
+ mediaPlayer.url = this.url;
+ }
+ }
+
+ setForSoundPool(soundPoolPlayer: SoundPoolPlayer): void {
+ soundPoolPlayer.setUrlSource(this);
+ }
+
+ getAudioPathForSoundPool(context: Context): Promise {
+ return new Promise((resolve, reject) => {
+ if (this.isLocal) {
+ // 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报
+ let file = fs.openSync(this.url);
+ resolve('fd://' + file.fd)
+ } else {
+ let tempFile = context.tempDir + "/sound.data"
+ if (fs.accessSync(tempFile)) {
+ fs.rmdirSync(tempFile)
+ }
+ request.downloadFile(context, {
+ url: this.url,
+ filePath: tempFile
+ }).then((downloadTask: request.DownloadTask) => {
+ downloadTask.on('complete', () => {
+ let file = fs.openSync(tempFile);
+ resolve('fd://' + file.fd)
+ })
+ downloadTask.on('fail', (err: number) => {
+ resolve(tempFile)
+ })
+ })
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/module.json5 b/packages/audioplayers_ohos/ohos/audioplayers/src/main/module.json5
new file mode 100644
index 0000000000000000000000000000000000000000..d81e2be84d147072e96fd9d39a6ca94a57ca7c14
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/module.json5
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "module": {
+ "name": "audioplayers",
+ "type": "har",
+ "deviceTypes": [
+ "default",
+ "tablet"
+ ]
+ }
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/base/element/string.json b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/en_US/element/string.json b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/en_US/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/en_US/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/zh_CN/element/string.json b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/zh_CN/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/main/resources/zh_CN/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/test/List.test.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/test/List.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..93d49a34c7c9fdb9924b9077e21f174107983cae
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/test/List.test.ets
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import localUnitTest from './LocalUnit.test';
+
+export default function testsuite() {
+ localUnitTest()
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/audioplayers/src/test/LocalUnit.test.ets b/packages/audioplayers_ohos/ohos/audioplayers/src/test/LocalUnit.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..3059cb42d1c90d97e2d0ccd09a79666da2643edf
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/audioplayers/src/test/LocalUnit.test.ets
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';
+
+export default function localUnitTest() {
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/build-profile.json5 b/packages/audioplayers_ohos/ohos/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..669cdf16ba83921692f6cc6ea37a68f85027abcc
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/build-profile.json5
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "app": {
+ "signingConfigs": [],
+ "products": [
+ {
+ "name": "default",
+ "signingConfig": "default",
+ "compileSdkVersion": "4.1.0(11)",
+ "compatibleSdkVersion": "4.1.0(11)",
+ "runtimeOS": "HarmonyOS",
+ }
+ ],
+ "buildModeSet": [
+ {
+ "name": "debug",
+ },
+ {
+ "name": "release"
+ }
+ ]
+ },
+ "modules": [
+ {
+ "name": "audioplayers",
+ "srcPath": "./audioplayers"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/hvigor/hvigor-config.json5 b/packages/audioplayers_ohos/ohos/hvigor/hvigor-config.json5
new file mode 100644
index 0000000000000000000000000000000000000000..a0a933c22a1d614ad1d6f8a1ebec4326fc009444
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/hvigor/hvigor-config.json5
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "hvigorVersion": "4.0.2",
+ "dependencies": {
+ "@ohos/hvigor-ohos-plugin": "4.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/hvigor/hvigor-wrapper.js b/packages/audioplayers_ohos/ohos/hvigor/hvigor-wrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7a65272c904328233e2cb52f0adc1def3f9bc8d
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/hvigor/hvigor-wrapper.js
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},E=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const F=E(D),A="Windows_NT",o="Darwin";function a(){return F.default.type()===A}function c(){return F.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===F.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.ENABLE_SIGN_TASK_KEY=e.HVIGOR_CACHE_DIR_KEY=e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const E=i(D),F=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=F.resolve(E.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=F.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=F.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=F.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=F.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=F.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace",e.HVIGOR_CACHE_DIR_KEY="hvigor.cacheDir",e.ENABLE_SIGN_TASK_KEY="enableSignTask"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const O=f(e),p=f(u),h=l;_=s.executeBuild=function(u){const D=p.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=O.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class I{}R.Unicode=I,I.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,I.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,I.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const y=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&y.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||y.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||""===u||""===u||y.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const S=N(e),b=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,G,V,j,J,U="start",L=[],W=0,$=1,K=0,k=!1,z="default",q="'",Z=1;function Y(u,D=!1){T=String(u),U="start",L=[],W=0,$=1,K=0,V=void 0,k=D;do{M=X(),nu[U]()}while("eof"!==M.type);return V}function X(){for(z="default",j="",q="'",Z=1;;){J=Q();const u=Du[z]();if(u)return u}}function Q(){if(T[W])return String.fromCodePoint(T.codePointAt(W))}function uu(){const u=Q();return"\n"===u?($++,K=0):u?K+=u.length:K++,u&&(W+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=S.default.readFileSync(w.default.resolve(u),{encoding:e});try{return Y(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${b.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=Y;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[U]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Fu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Fu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Fu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Fu(x.Char,uu())},end(){throw Fu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Fu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Fu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Fu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Fu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Fu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Fu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Fu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"":case"":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"":case"":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Q(),D=function(){switch(Q()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Q()))throw Fu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());if(u+=uu(),D=Q(),!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Q()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Fu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Fu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Eu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:K}}function tu(u){for(const D of u){if(Q()!==D)throw Fu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Fu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return G=M.value,void(U="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Fu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Fu(x.EOF);U="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Fu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Fu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(k&&"object"==typeof u&&(u._line=$,u._column=K),void 0===V)V=u;else{const D=L[L.length-1];Array.isArray(D)?k&&"object"!=typeof u?D.push({value:u,_line:$,_column:K}):D.push(u):D[G]=k&&"object"!=typeof u?{value:u,_line:$,_column:K}:u}!function(u){if(u&&"object"==typeof u)L.push(u),U=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){L.pop();const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Eu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Fu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${K}`:`JSON5: invalid character '${Eu(D)}' at ${$}:${K}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${K}`;break;case x.Identifier:K-=5,e=`JSON5: invalid identifier character at ${$}:${K}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=K,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,Ou=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,Ou.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var pu=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&pu(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),Iu=Pu(u),yu=i,Nu=v,Su=g,bu=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===Iu.normalize(e.dependencies[u])}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=Iu.resolve(yu.HVIGOR_PROJECT_WRAPPER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,bu.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,Su.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){const D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${yu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Nu.hash)(D)}(u):(0,Nu.hash)(process.cwd());return Iu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=Iu.resolve(Mu,yu.WORK_SPACE,yu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,Su.parseJsonFile)(u):{dependencies:{}}}(),function(){const u=Iu.resolve(yu.HVIGOR_USER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);if(mu.existsSync(u))(0,Su.parseJsonFile)(u)}(),!(0,wu.hasNpmPackInPaths)(yu.HVIGOR_ENGINE_PACKAGE_NAME,[Iu.join(Mu,yu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[Iu.join(Mu,yu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}())try{!function(){(0,bu.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=Iu.join(Mu,yu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=Iu.resolve(D,yu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,bu.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",yu.HVIGOR_PNPM_STORE_PATH],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,bu.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){!function(){const u=Iu.join(Mu,yu.WORK_SPACE);if((0,bu.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=Iu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(Iu.resolve(u,D),{recursive:!0})}))}catch(D){(0,bu.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}()}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),E=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),F=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return E(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=F(e),c=A(D),s=F(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}();
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/hvigorfile.ts b/packages/audioplayers_ohos/ohos/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f2d2aafe6d6a3a71a9944ebd0c91fbc308ac9d1
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/hvigorfile.ts
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import { appTasks } from '@ohos/hvigor-ohos-plugin';
+
+export default {
+ system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
+ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
+}
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/hvigorw b/packages/audioplayers_ohos/ohos/hvigorw
new file mode 100644
index 0000000000000000000000000000000000000000..b245702e39478ce875987eb48a2c6aba9e92fadc
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/hvigorw
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+# Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# ----------------------------------------------------------------------------
+# Hvigor startup script, version 1.0.0
+#
+# Required ENV vars:
+# ------------------
+# NODE_HOME - location of a Node home dir
+# or
+# Add /usr/local/nodejs/bin to the PATH environment variable
+# ----------------------------------------------------------------------------
+
+HVIGOR_APP_HOME=$(dirname $(readlink -f $0))
+HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
+warn() {
+ echo ""
+ echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+error() {
+ echo ""
+ echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+fail() {
+ error "$@"
+ exit 1
+}
+
+# Determine node to start hvigor wrapper script
+if [ -n "${NODE_HOME}" ];then
+ EXECUTABLE_NODE="${NODE_HOME}/bin/node"
+ if [ ! -x "$EXECUTABLE_NODE" ];then
+ fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
+ fi
+else
+ EXECUTABLE_NODE="node"
+ which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
+fi
+
+# Check hvigor wrapper script
+if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
+ fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
+fi
+
+# start hvigor-wrapper script
+exec "${EXECUTABLE_NODE}" \
+ "${HVIGOR_WRAPPER_SCRIPT}" "$@"
diff --git a/packages/audioplayers_ohos/ohos/hvigorw.bat b/packages/audioplayers_ohos/ohos/hvigorw.bat
new file mode 100644
index 0000000000000000000000000000000000000000..2fea846e289394982993a8c72db9329ed78e0753
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/hvigorw.bat
@@ -0,0 +1,78 @@
+:: Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+:: Licensed under the Apache License, Version 2.0 (the "License");
+:: you may not use this file except in compliance with the License.
+:: You may obtain a copy of the License at
+::
+:: http://www.apache.org/licenses/LICENSE-2.0
+::
+:: Unless required by applicable law or agreed to in writing, software
+:: distributed under the License is distributed on an "AS IS" BASIS,
+:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+:: See the License for the specific language governing permissions and
+:: limitations under the License.
+
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Hvigor startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js
+set NODE_EXE=node.exe
+
+goto start
+
+:start
+@rem Find node.exe
+if defined NODE_HOME goto findNodeFromNodeHome
+
+%NODE_EXE% --version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:findNodeFromNodeHome
+set NODE_HOME=%NODE_HOME:"=%
+set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE%
+
+if exist "%NODE_EXE_PATH%" goto execute
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:execute
+@rem Execute hvigor
+"%NODE_EXE%" %WRAPPER_MODULE_PATH% %*
+
+if "%ERRORLEVEL%" == "0" goto hvigorwEnd
+
+:fail
+exit /b 1
+
+:hvigorwEnd
+if "%OS%" == "Windows_NT" endlocal
+
+:end
diff --git a/packages/audioplayers_ohos/ohos/local.properties b/packages/audioplayers_ohos/ohos/local.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a70b34ee87067d0907b59295dafdd753e489e5b6
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/local.properties
@@ -0,0 +1,3 @@
+hwsdk.dir=D:\\OpenHarmony\\sdk11\\sdk
+sdk.dir=
+nodejs.dir=D:\\OpenHarmony\\nodejs
\ No newline at end of file
diff --git a/packages/audioplayers_ohos/ohos/oh-package.json5 b/packages/audioplayers_ohos/ohos/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..4d123c6991f17d5998eb3952d1356f5d59a6a96c
--- /dev/null
+++ b/packages/audioplayers_ohos/ohos/oh-package.json5
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "name": "audioplayers",
+ "version": "1.0.0",
+ "description": "Please describe the basic information.",
+ "main": "",
+ "author": "",
+ "license": "",
+ "dependencies": {
+ },
+ "devDependencies": {
+ "@ohos/hypium": "1.0.6"
+ }
+}
diff --git a/packages/audioplayers_ohos/pubspec.yaml b/packages/audioplayers_ohos/pubspec.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0653870a4ed205ddd3b1f40f4c6dcd7a066a4c44
--- /dev/null
+++ b/packages/audioplayers_ohos/pubspec.yaml
@@ -0,0 +1,42 @@
+# Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: audioplayers_ohos
+description: Ohos implementation of audioplayers, a Flutter plugin to play multiple audio files simultaneously
+version: 3.0.2
+publish_to: none
+
+flutter:
+ plugin:
+ implements: audioplayers
+ platforms:
+ ohos:
+ package: xyz.luan.audioplayers
+ pluginClass: AudioplayersPlugin
+
+dependencies:
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
+ flutter:
+ sdk: flutter
+
+dev_dependencies:
+ dartdoc: ^6.1.5
+ flame_lint: ^0.2.0
+ flutter_test:
+ sdk: flutter
+
+environment:
+ sdk: ">=2.18.0 <3.0.0"
+ flutter: ">=3.3.0"
+
diff --git a/packages/audioplayers_platform_interface/lib/src/api/audio_context.dart b/packages/audioplayers_platform_interface/lib/src/api/audio_context.dart
index 6cbe10598d80642ce43b71e5f3185bcb1972e747..4f21f63bc2194218897d0ee2471f9c10b46d7fd2 100644
--- a/packages/audioplayers_platform_interface/lib/src/api/audio_context.dart
+++ b/packages/audioplayers_platform_interface/lib/src/api/audio_context.dart
@@ -6,19 +6,23 @@ import 'package:flutter/foundation.dart';
/// configurations: [AudioContextAndroid] and [AudioContextIOS].
class AudioContext {
final AudioContextAndroid android;
+ final AudioContextOhos ohos;
final AudioContextIOS iOS;
const AudioContext({
this.android = const AudioContextAndroid(),
+ this.ohos = const AudioContextOhos(),
this.iOS = const AudioContextIOS(),
});
AudioContext copy({
AudioContextAndroid? android,
+ AudioContextOhos? ohos,
AudioContextIOS? iOS,
}) {
return AudioContext(
android: android ?? this.android,
+ ohos: ohos ?? this.ohos,
iOS: iOS ?? this.iOS,
);
}
@@ -30,6 +34,8 @@ class AudioContext {
return {};
} else if (defaultTargetPlatform == TargetPlatform.android) {
return android.toJson();
+ } else if (defaultTargetPlatform == TargetPlatform.ohos) {
+ return ohos.toJson();
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
return iOS.toJson();
} else {
@@ -99,6 +105,53 @@ class AudioContextAndroid {
}
}
+
+/// A platform-specific class to encapsulate a collection of attributes about an
+/// Ohos audio stream.
+class AudioContextOhos {
+ /// Sets the speakerphone on or off, globally.
+
+ /// This method should only be used by applications that replace the
+ /// platform-wide management of audio settings or the main telephony
+ /// application.
+ final bool isSpeakerphoneOn;
+ ///
+ /// 音频渲染器标志。0代表普通音频渲染器,1代表低时延音频渲染器。ArkTS接口暂不支持低时延音频渲染器。
+ final int rendererFlags;
+ final OhosUsageType usageType;
+ final OhosAudioScene audioScene;
+
+ const AudioContextOhos({
+ this.isSpeakerphoneOn = true,
+ this.audioScene = OhosAudioScene.normal,
+ this.rendererFlags = 0,
+ this.usageType = OhosUsageType.music,
+ });
+
+ AudioContextOhos copy({
+ bool? isSpeakerphoneOn,
+ OhosAudioScene? audioScene,
+ int? rendererFlags,
+ OhosUsageType? usageType,
+ }) {
+ return AudioContextOhos(
+ isSpeakerphoneOn: isSpeakerphoneOn ?? this.isSpeakerphoneOn,
+ audioScene: audioScene ?? this.audioScene,
+ rendererFlags: rendererFlags ?? this.rendererFlags,
+ usageType: usageType ?? this.usageType,
+ );
+ }
+
+ Map toJson() {
+ return {
+ 'isSpeakerphoneOn': isSpeakerphoneOn,
+ 'rendererFlags': rendererFlags,
+ 'audioScene': audioScene.value,
+ 'usageType': usageType.value,
+ };
+ }
+}
+
/// A platform-specific class to encapsulate a collection of attributes about an
/// iOS audio stream.
class AudioContextIOS {
@@ -474,3 +527,129 @@ enum AVAudioSessionOptions {
/// when it mutes the built-in microphone.
overrideMutedMicrophoneInterruption,
}
+
+
+/// "why" you are playing a sound, what is this sound used for. This is achieved
+/// with the "usage" information. Examples of usage are [media] and [alarm].
+/// These two examples are the closest to stream types, but more detailed use
+/// cases are available. Usage information is more expressive than a stream
+/// type, and allows certain platforms or routing policies to use this
+/// information for more refined volume or routing decisions. Usage is the most
+/// important information to supply in [AudioContextOhos] and it is
+/// recommended to build any instance with this information supplied.
+enum OhosUsageType {
+ /**
+ * Unknown usage.
+ * @syscap SystemCapability.Multimedia.Audio.Core
+ * @since 7
+ */
+ unknown,
+
+ /// Media or Music usage.
+ music,
+
+ /// Usage value to use when the usage is voice communications, such as
+ /// telephony or VoIP.
+ voiceCommunication,
+
+ /// Voice assistant broadcast usage.
+ voiceAssistant,
+
+ /// Usage value to use when the usage is an alarm (e.g. wake-up alarm).
+ alarm,
+
+ /// Voice message usage.
+ voiceMessage,
+
+ /// Notification or ringtone usage.
+ ringtone,
+
+ /// Usage value to use when the usage is notification. See other notification
+ /// usages for more specialized uses.
+ notification,
+
+ /// Usage value to use when the usage is for accessibility, such as with a
+ /// screen reader.
+ accessibility,
+
+ /// Usage value to use when the usage is for moive audio.
+ moive,
+
+ /// Usage value to use when the usage is for game audio.
+ game,
+
+ /// Usage value to use when the usage is for audiobook audio.
+ audiobook,
+
+ /// Navigation usage.
+ navigation,
+}
+
+extension OhosUsageTypeValue on OhosUsageType {
+ int get value {
+ switch (this) {
+ case OhosUsageType.unknown:
+ return 0;
+ case OhosUsageType.music:
+ return 1;
+ case OhosUsageType.voiceCommunication:
+ return 2;
+ case OhosUsageType.voiceAssistant:
+ return 3;
+ case OhosUsageType.alarm:
+ return 4;
+ case OhosUsageType.voiceMessage:
+ return 5;
+ case OhosUsageType.ringtone:
+ return 6;
+ case OhosUsageType.notification:
+ return 7;
+ case OhosUsageType.accessibility:
+ return 8;
+ case OhosUsageType.moive:
+ return 10;
+ case OhosUsageType.game:
+ return 11;
+ case OhosUsageType.audiobook:
+ return 12;
+ case OhosUsageType.navigation:
+ return 13;
+ }
+ }
+}
+
+
+/// The audio scence encompasses audio routing AND the behavior of the telephony
+/// layer. Therefore this flag should only be used by applications that
+/// replace the platform-wide management of audio settings or the main telephony
+/// application. In particular, the [inCall] mode should only be used by the
+/// telephony application when it places a phone call, as it will cause signals
+/// from the radio layer to feed the platform mixer.
+enum OhosAudioScene {
+ /// 默认音频场景。
+ normal,
+
+ /// 响铃模式
+ ringing,
+
+ /// 电话模式.
+ phoneCall,
+
+ /// 语音聊天模式。
+ voiceChat
+}
+
+extension OhosAudioSceneValue on OhosAudioScene {
+ int get value {
+ switch (this) {
+ case OhosAudioScene.normal:
+ return 0;
+ case OhosAudioScene.ringing:
+ return 1;
+ case OhosAudioScene.phoneCall:
+ return 2;
+ case OhosAudioScene.voiceChat:
+ return 3;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/audioplayers_platform_interface/lib/src/api/audio_context_config.dart b/packages/audioplayers_platform_interface/lib/src/api/audio_context_config.dart
index 5466f612379ad2ec26b736309de85320ee2033f7..9d4b4dc2e879b4655b09058f51456919d4e97717 100644
--- a/packages/audioplayers_platform_interface/lib/src/api/audio_context_config.dart
+++ b/packages/audioplayers_platform_interface/lib/src/api/audio_context_config.dart
@@ -97,6 +97,7 @@ class AudioContextConfig {
AudioContext build() {
return AudioContext(
android: buildAndroid(),
+ ohos: buildOhos(),
iOS: buildIOS(),
);
}
@@ -114,6 +115,15 @@ class AudioContextConfig {
);
}
+ AudioContextOhos buildOhos() {
+ return AudioContextOhos(
+ isSpeakerphoneOn: forceSpeaker,
+ usageType: respectSilence
+ ? OhosUsageType.ringtone
+ : OhosUsageType.music
+ );
+ }
+
AudioContextIOS buildIOS() {
if (defaultTargetPlatform == TargetPlatform.iOS) {
validateIOS();
diff --git a/packages/audioplayers_web/pubspec.yaml b/packages/audioplayers_web/pubspec.yaml
index cd201acc795db9bd095c160cc61ae83d2a5c00fa..fa4a5b02ee48b9b3046a40def99c5ab8142bb0d7 100644
--- a/packages/audioplayers_web/pubspec.yaml
+++ b/packages/audioplayers_web/pubspec.yaml
@@ -3,6 +3,7 @@ description: Web implementation of audioplayers, a Flutter plugin to play multip
version: 3.1.0
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers_web
+publish_to: none
flutter:
plugin:
@@ -12,7 +13,8 @@ flutter:
fileName: audioplayers_web.dart
dependencies:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
flutter:
sdk: flutter
flutter_web_plugins:
diff --git a/packages/audioplayers_windows/pubspec.yaml b/packages/audioplayers_windows/pubspec.yaml
index 75bd616687e19e255398f14fb878cb55b7671305..2f1e0b897a89722208d305641c5498e5de1ce439 100644
--- a/packages/audioplayers_windows/pubspec.yaml
+++ b/packages/audioplayers_windows/pubspec.yaml
@@ -3,6 +3,7 @@ description: Windows implementation of audioplayers, a Flutter plugin to play mu
version: 2.0.2
homepage: https://github.com/bluefireteam/audioplayers
repository: https://github.com/bluefireteam/audioplayers/tree/master/packages/audioplayers_windows
+publish_to: none
flutter:
plugin:
@@ -12,7 +13,8 @@ flutter:
pluginClass: AudioplayersWindowsPlugin
dependencies:
- audioplayers_platform_interface: ^5.0.1
+ audioplayers_platform_interface:
+ path: ../audioplayers_platform_interface
flutter:
sdk: flutter