From dad2c6608e973022003a611c65157177d6ad6213 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 23 Aug 2020 20:49:16 +0300 Subject: [PATCH] examples: implement examples/sokol/sounds/wav_player.v --- examples/sokol/sounds/uhoh.wav | Bin 0 -> 68562 bytes examples/sokol/sounds/wav_player.v | 211 +++++++++++++++++++++++++++++ vlib/sokol/audio/audio.v | 25 +++- vlib/v/fmt/fmt.v | 4 + 4 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 examples/sokol/sounds/uhoh.wav create mode 100644 examples/sokol/sounds/wav_player.v diff --git a/examples/sokol/sounds/uhoh.wav b/examples/sokol/sounds/uhoh.wav new file mode 100644 index 0000000000000000000000000000000000000000..cff9e3cf3162e9f4e6ffe2694196dacbaf8f870f GIT binary patch literal 68562 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/sokol/sounds/wav_player.v b/examples/sokol/sounds/wav_player.v new file mode 100644 index 0000000000..a13c052ae5 --- /dev/null +++ b/examples/sokol/sounds/wav_player.v @@ -0,0 +1,211 @@ +import os +import time +import sokol.audio + +struct Player { +mut: + samples []f32 + pos int + finished bool +} + +fn main() { + if os.args.len < 2 { + eprintln('Usage: play_wav file1.wav file2.wav ...') + play_sounds([os.resource_abs_path('uhoh.wav')])? + exit(1) + } + play_sounds(os.args[1..])? +} + +fn play_sounds(files []string) ? { + mut player := Player{} + player.init() + for f in files { + if !os.exists(f) || os.is_dir(f) { + eprintln('skipping "$f" (does not exist)') + continue + } + fext := os.file_ext(f).to_lower() + if fext != '.wav' { + eprintln('skipping "$f" (not a .wav file)') + continue + } + player.play_wav_file(f)? + } + player.stop() +} + +// +fn audio_player_callback(buffer &f32, num_frames, num_channels int, mut p Player) { + if p.finished { + return + } + ntotal := num_channels * num_frames + nremaining := p.samples.len - p.pos + nsamples := if nremaining < ntotal { nremaining } else { ntotal } + if nsamples <= 0 { + p.finished = true + return + } + unsafe { + C.memcpy(buffer, &p.samples[p.pos], nsamples * int(sizeof(f32))) + } + p.pos += nsamples +} + +fn (mut p Player) init() { + audio.setup({ + num_channels: 2 + stream_userdata_cb: audio_player_callback + user_data: p + }) +} + +fn (mut p Player) stop() { + audio.shutdown() + p.free() +} + +fn (mut p Player) play_wav_file(fpath string) ? { + println('> play_wav_file: $fpath') + samples := read_wav_file_samples(fpath)? + p.finished = true + p.samples << samples + p.finished = false + for !p.finished { + time.sleep_ms(16) + } + p.free() +} + +fn (mut p Player) free() { + p.finished = false + p.samples = []f32{} + p.pos = 0 +} + +// The read_wav_file_samples function below is based on the following sources: +// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html +// http://www.lightlink.com/tjweber/StripWav/WAVE.html +// http://www.lightlink.com/tjweber/StripWav/Canon.html +// https://tools.ietf.org/html/draft-ema-vpim-wav-00 +// NB: > The chunks MAY appear in any order except that the Format chunk +// > MUST be placed before the Sound data chunk (but not necessarily +// > contiguous to the Sound data chunk). +struct RIFFHeader { + riff [4]byte + file_size u32 + form_type [4]byte +} + +struct RIFFChunkHeader { + chunk_type [4]byte + chunk_size u32 + chunk_data voidptr +} + +struct RIFFFormat { + format_tag u16 // PCM = 1; Values other than 1 indicate some form of compression. + nchannels u16 // Nc ; 1 = mono ; 2 = stereo + sample_rate u32 // F + avg_bytes_per_second u32 // F * M*Nc + nblock_align u16 // M*Nc + bits_per_sample u16 // 8 * M + cbsize u16 // Size of the extension: 22 + valid_bits_per_sample u16 // at most 8*M + channel_mask u32 // Speaker position mask + sub_format [16]byte // GUID +} + +fn read_wav_file_samples(fpath string) ?[]f32 { + mut res := []f32{} + // eprintln('> read_wav_file_samples: $fpath -------------------------------------------------') + mut bytes := os.read_bytes(fpath)? + mut pbytes := byteptr(bytes.data) + mut offset := u32(0) + rh := &RIFFHeader(pbytes) + // eprintln('rh: $rh') + if rh.riff != [`R`, `I`, `F`, `F`]!! { + return error('WAV should start with `RIFF`') + } + if rh.form_type != [`W`, `A`, `V`, `E`]!! { + return error('WAV should have `WAVE` form type') + } + if rh.file_size + 8 != bytes.len { + return error('WAV should have valid lenght') + } + offset += sizeof(RIFFHeader) + mut rf := &RIFFFormat(0) + for { + if offset >= bytes.len { + break + } + // + ch := &RIFFChunkHeader(unsafe {pbytes + offset}) + offset += 8 + ch.chunk_size + // eprintln('ch: $ch') + // eprintln('p: $pbytes | offset: $offset | bytes.len: $bytes.len') + // //////// + if ch.chunk_type == [`L`, `I`, `S`, `T`]!! { + continue + } + // + if ch.chunk_type == [`i`, `d`, `3`, ` `]!! { + continue + } + // + if ch.chunk_type == [`f`, `m`, `t`, ` `]!! { + // eprintln('`fmt ` chunk') + rf = &RIFFFormat(&ch.chunk_data) + // eprintln('fmt riff format: $rf') + if rf.format_tag != 1 { + return error('only PCM encoded WAVs are supported') + } + if rf.nchannels < 1 || rf.nchannels > 2 { + return error('only mono or stereo WAVs are supported') + } + if rf.bits_per_sample !in [u16(8), 16] { + return error('only 8 or 16 bits per sample WAVs are supported') + } + continue + } + // + if ch.chunk_type == [`d`, `a`, `t`, `a`]!! { + if rf == 0 { + return error('`data` chunk should be after `fmt ` chunk') + } + // eprintln('`fmt ` chunk: $rf\n`data` chunk: $ch') + mut doffset := 0 + mut dp := byteptr(&ch.chunk_data) + for doffset < ch.chunk_size { + for c := 0; c < rf.nchannels; c++ { + mut x := f32(0.0) + mut step := 0 + ppos := unsafe {dp + doffset} + if rf.bits_per_sample == 8 { + d8 := byteptr(ppos) + x = (f32(*d8) - 128) / 128.0 + step = 1 + doffset++ + } + if rf.bits_per_sample == 16 { + d16 := &i16(ppos) + x = f32(*d16) / 32768.0 + step = 2 + } + doffset += step + if doffset < ch.chunk_size { + res << x + if rf.nchannels == 1 { + // Duplicating single channel mono sounds, + // produces a stereo sound, simplifying further processing: + res << x + } + } + } + } + } + } + return res +} diff --git a/vlib/sokol/audio/audio.v b/vlib/sokol/audio/audio.v index f2de98f6c5..85176927e1 100644 --- a/vlib/sokol/audio/audio.v +++ b/vlib/sokol/audio/audio.v @@ -9,8 +9,15 @@ pub type FNStreamingCB = fn (buffer &f32, num_frames, num_channels int) pub type FnStreamingCBWithUserData = fn (buffer &f32, num_frames, num_channels int, user_data voidptr) +pub fn (x FNStreamingCB) str() string { + return '&FNStreamingCB{ ${ptr_str(x)} }' +} + +pub fn (x FnStreamingCBWithUserData) str() string { + return '&FnStreamingCBWithUserData{ ${ptr_str(x)} }' +} + // -[typedef] pub struct C.saudio_desc { sample_rate int num_channels int @@ -82,7 +89,7 @@ pub fn channels() int { return C.saudio_channels() } -// audio.expect - get current number of frames to fill packet queue +// audio.expect - get current number of frames to fill packet queue; use in combination with audio.push/2 pub fn expect() int { return C.saudio_expect() } @@ -103,3 +110,17 @@ pub fn fclamp(x, flo, fhi f32) f32 { } return x } + +pub fn min(x, y int) int { + if x < y { + return x + } + return y +} + +pub fn max(x, y int) int { + if x < y { + return y + } + return x +} diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index 785ede90d4..d024083ca5 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1728,6 +1728,10 @@ pub fn (mut f Fmt) array_init(it ast.ArrayInit) { f.write(']') // `[100]byte` if it.is_fixed { + if it.has_val { + f.write('!!') + return + } f.write(f.type_to_str(it.elem_type)) if it.has_default { f.write('{init: $it.default_expr}')