| // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:ffi'; |
| |
| import 'package:ffi/ffi.dart'; |
| |
| import 'third_party/miniaudio.g.dart'; |
| |
| /// A wrapper around the miniaudio engine. |
| final class MiniAudio { |
| late final Pointer<ma_engine> _engine; |
| |
| /// Initializes the miniaudio engine. |
| MiniAudio() { |
| _engine = malloc(); |
| final result = ma_engine_init(nullptr, _engine); |
| if (result != ma_result.MA_SUCCESS) { |
| throw MiniAudioException( |
| 'Failed to initialize miniaudio engine: ${result.name}.', |
| ); |
| } |
| } |
| |
| /// Uninitializes the miniaudio engine and frees resources. |
| void uninit() { |
| ma_engine_uninit(_engine); |
| malloc.free(_engine); |
| } |
| |
| /// Plays a sound from the given [filePath]. |
| void playSound(String filePath) => using((arena) { |
| final filePath_ = filePath.toNativeUtf8(allocator: arena); |
| final result = ma_engine_play_sound(_engine, filePath_.cast(), nullptr); |
| if (result != ma_result.MA_SUCCESS) { |
| throw MiniAudioException('Failed to play audio: ${result.name}}.'); |
| } |
| }); |
| } |
| |
| /// An exception that is thrown when an error occurs in the mini_audio library. |
| final class MiniAudioException implements Exception { |
| /// The error message. |
| final String message; |
| |
| /// Creates a new instance of the exception. |
| MiniAudioException(this.message); |
| } |