Rust SDL2でWAVファイルを再生するにはどうすればよいですか?

ザビエルシェイ

を使用してWAVファイルを再生しようとしていますrust-sdl2

私は見つけましたAudioSpecWAVが、オーディオ初期化メソッドのどれもそれをタイプとして受け取らないようで、それは実装されていませんAudioCallback次のような独自のコールバックを使用して、これを自分で実装してみました。

struct MyWav {
    wav: AudioSpecWAV,
    volume: f32,
    pos: usize,
}

impl AudioCallback for MyWav {
    type Channel = f32;

    fn callback(&mut self, out: &mut [f32]) {
        for x in out.iter_mut() {
            *x = match self.wav.buffer().get(self.pos) {
                Some(v) => { self.pos += 1; v as f32 },
                None => { 0.0 }
            }
        }
    }
}

...しかし、次のエラーを回避する方法がわかりません。

the traitcore::marker::Sync is not implemented for the type *mut u8

これはのaudio_bufフィールドのようですAudioSpecWAVが、そうでない場合Syncは、コールバックにバッファを渡すことになっていますか?

(参考までに、生成されたサウンドを再生する例を示します

アンドリューミラー

AudioCallback実装者はである必要がありますSendこれを行うにAudioSpecWAVは、構造体をラップてその構造体unsafe implに対してforを実行するSendか、データをコピーします。自分が行っていることが実際に安全であることがわかっていない限り、通常は安全でないものを使用するべきではないため、コピーアプローチを検討することをお勧めします。

両方のアプローチの例を次に示します。

extern crate sdl2;

use std::thread::{self};

use sdl2::{Sdl};
use sdl2::audio::{self, AudioSpecDesired, AudioSpecWAV, AudioCallback, AudioDevice};

//----------------------------------------------------------------------------//

struct CopiedData {
    bytes: Vec<u8>,
    position: usize
}

impl AudioCallback for CopiedData {
    type Channel = u8;

    fn callback(&mut self, data: &mut [u8]) {
        let (start, end) = (self.position, self.position + data.len());
        self.position += data.len();

        let audio_data = &self.bytes[start..end];
        for (src, dst) in audio_data.iter().zip(data.iter_mut()) {
            *dst = *src;
        }
    }
}

//----------------------------------------------------------------------------//

struct WrappedData {
    audio: AudioSpecWAV,
    position: usize
}

impl AudioCallback for WrappedData {
    type Channel = u8;

    fn callback(&mut self, data: &mut [u8]) {
        let (start, end) = (self.position, self.position + data.len());
        self.position += data.len();

        let audio_data = &self.audio.buffer()[start..end];
        for (src, dst) in audio_data.iter().zip(data.iter_mut()) {
            *dst = *src;
        }
    }
}

unsafe impl Send for WrappedData { }

//----------------------------------------------------------------------------//

pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let audio_system = sdl_context.audio().unwrap();

    let audio_spec = AudioSpecDesired{ freq: None, channels: None, samples: None };
    let audio_wav = AudioSpecWAV::load_wav("test.wav").unwrap();

    let copied_data = CopiedData{ bytes: audio_wav.buffer().to_vec(), position: 0 };
    //let wrapped_data = WrappedData{ audio: audio_wav, position: 0 };

    let audio_device = audio_system.open_playback(None, audio_spec, move |spec| {
        copied_data
    }).unwrap();

    audio_device.resume();

    thread::sleep_ms(5000);
}

注:私が再生していたWAVは非常に大きく(歪んで聞こえるほど)、私は健全な人間ではないので、それが私のコードまたは一般的に使用していたWAVファイルと関係があるかどうかはわかりません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Rustで最小限のwasmファイルを生成するにはどうすればよいですか?

分類Dev

VSCodeでRustファイルを編集するにはどうすればよいですか?

分類Dev

Rust:BytesMutをファイルに変換/読み取るにはどうすればよいですか?

分類Dev

Rustでファイルに特定のモードがあるかどうかを確認するにはどうすればよいですか?

分類Dev

Rustでパイプフィルターを作成するにはどうすればよいですか?

分類Dev

Rustでパイプフィルターを作成するにはどうすればよいですか?

分類Dev

Rustで既に開いているファイルのサイズを取得するにはどうすればよいですか?

分類Dev

Rustのビット演算を使用してファイルが実行可能かどうかを確認するにはどうすればよいですか?

分類Dev

Rust MongoDBドライバーを使用してGridFSに追加されたファイルからIDを取得するにはどうすればよいですか?

分類Dev

entrを使用して保存時にRustファイルをコンパイルして実行するにはどうすればよいですか?

分類Dev

RustのファイルまたはstdinからポリモーフィックIOを実行するにはどうすればよいですか?

分類Dev

rustで2つのファイル(mainを含む)にファイルを含め、両方のファイルでその名前空間名を直接使用するにはどうすればよいですか?

分類Dev

rustで2つのファイル(mainを含む)にファイルを含め、両方のファイルでその名前空間名を直接使用するにはどうすればよいですか?

分類Dev

ローカルのRustファイルを「使用」またはインポートするにはどうすればよいですか?

分類Dev

Dockerコンテナ内にビルドされたRust実行可能ファイルを取得するにはどうすればよいですか?

分類Dev

Rustで書き込む前にファイルの内容を削除するにはどうすればよいですか?

分類Dev

兄弟/隣接するRustファイルの構造を使用するにはどうすればよいですか?

分類Dev

Rustモジュールのドキュメントを別々のMarkdownファイルに保存するにはどうすればよいですか?

分類Dev

Rustで拡張子なしのファイルパスを取得するにはどうすればよいですか?

分類Dev

Rustの同じlib.rsファイルのテストで定数を参照するにはどうすればよいですか?

分類Dev

Rustのファイル/ストリームから複数のJSON値を遅延読み取りするにはどうすればよいですか?

分類Dev

Rustの既存のスキーマファイルを使用してJSONを検証するにはどうすればよいですか?

分類Dev

Rustで2つのスライスを連結するにはどうすればよいですか?

分類Dev

Fedora 26でRustをアンインストールするにはどうすればよいですか?

分類Dev

RustでUTF8以外のファイルを1行ずつ読み取るにはどうすればよいですか?

分類Dev

Rustで文字列を分割するにはどうすればよいですか?

分類Dev

Rust 1.0で乱数を取得するにはどうすればよいですか?

分類Dev

rust 1.26以降で複数の文字列を互いに上書きせずにファイルに書き込むにはどうすればよいですか?

分類Dev

次のRustコードをコンパイルするにはどうすればよいですか?

Related 関連記事

  1. 1

    Rustで最小限のwasmファイルを生成するにはどうすればよいですか?

  2. 2

    VSCodeでRustファイルを編集するにはどうすればよいですか?

  3. 3

    Rust:BytesMutをファイルに変換/読み取るにはどうすればよいですか?

  4. 4

    Rustでファイルに特定のモードがあるかどうかを確認するにはどうすればよいですか?

  5. 5

    Rustでパイプフィルターを作成するにはどうすればよいですか?

  6. 6

    Rustでパイプフィルターを作成するにはどうすればよいですか?

  7. 7

    Rustで既に開いているファイルのサイズを取得するにはどうすればよいですか?

  8. 8

    Rustのビット演算を使用してファイルが実行可能かどうかを確認するにはどうすればよいですか?

  9. 9

    Rust MongoDBドライバーを使用してGridFSに追加されたファイルからIDを取得するにはどうすればよいですか?

  10. 10

    entrを使用して保存時にRustファイルをコンパイルして実行するにはどうすればよいですか?

  11. 11

    RustのファイルまたはstdinからポリモーフィックIOを実行するにはどうすればよいですか?

  12. 12

    rustで2つのファイル(mainを含む)にファイルを含め、両方のファイルでその名前空間名を直接使用するにはどうすればよいですか?

  13. 13

    rustで2つのファイル(mainを含む)にファイルを含め、両方のファイルでその名前空間名を直接使用するにはどうすればよいですか?

  14. 14

    ローカルのRustファイルを「使用」またはインポートするにはどうすればよいですか?

  15. 15

    Dockerコンテナ内にビルドされたRust実行可能ファイルを取得するにはどうすればよいですか?

  16. 16

    Rustで書き込む前にファイルの内容を削除するにはどうすればよいですか?

  17. 17

    兄弟/隣接するRustファイルの構造を使用するにはどうすればよいですか?

  18. 18

    Rustモジュールのドキュメントを別々のMarkdownファイルに保存するにはどうすればよいですか?

  19. 19

    Rustで拡張子なしのファイルパスを取得するにはどうすればよいですか?

  20. 20

    Rustの同じlib.rsファイルのテストで定数を参照するにはどうすればよいですか?

  21. 21

    Rustのファイル/ストリームから複数のJSON値を遅延読み取りするにはどうすればよいですか?

  22. 22

    Rustの既存のスキーマファイルを使用してJSONを検証するにはどうすればよいですか?

  23. 23

    Rustで2つのスライスを連結するにはどうすればよいですか?

  24. 24

    Fedora 26でRustをアンインストールするにはどうすればよいですか?

  25. 25

    RustでUTF8以外のファイルを1行ずつ読み取るにはどうすればよいですか?

  26. 26

    Rustで文字列を分割するにはどうすればよいですか?

  27. 27

    Rust 1.0で乱数を取得するにはどうすればよいですか?

  28. 28

    rust 1.26以降で複数の文字列を互いに上書きせずにファイルに書き込むにはどうすればよいですか?

  29. 29

    次のRustコードをコンパイルするにはどうすればよいですか?

ホットタグ

アーカイブ