rockbox_ffi 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e881324e0bb82a716a98417325a1ec9823d3a0f1f015444c6e2332f7b942c65
4
- data.tar.gz: 70e45aa728fb5d2449e1849f993780a0dad201f32113eb4f352344df0bed1fb6
3
+ metadata.gz: 98d2db65260fc33b5cfd9cf8963c2f96b782079c999ded173f64611a1f3d2554
4
+ data.tar.gz: 8b6fa4f9f221aad0367c913cc6ce494ea97ce62d3658309cc6ed8252003e28d1
5
5
  SHA512:
6
- metadata.gz: b76132c6b6db3f4eee20a990707b9e65e4a7a65cd490f1d690dbf0c8c72338a7c855cf75c12deb74171d6dd3833f2394dc33ad745e87172b0d1423e631e32f59
7
- data.tar.gz: 7ef952e10d6a0728a4ef251ef43480ab6bc4d5d7fe3b7514b3c933f9cef99768ec129552f964cf3641ed98973e5831ab6272690f30b4c0fc6eca8a02d06d0f0e
6
+ metadata.gz: 97340abbfae011f7f3f09a0463046c4831eef6d429ea6d0f1ea0a814a8aac085a12309d46fe7e5ee670772aed59cf9045cbfe72606bdf34e0aab685c534aab04
7
+ data.tar.gz: b28b979145c98b851ab27cf731fb9929603a946a17435e656cb2f350af594bc8fefe525545c6bd2dafa3dd3a6236dcf998b672636f3d09ce16c95b94069d3d3d
data/README.md CHANGED
@@ -5,7 +5,8 @@
5
5
  ![FFI](https://img.shields.io/badge/FFI-fiddle-CC342D)
6
6
  ![License](https://img.shields.io/badge/license-GPL--2.0--or--later-blue)
7
7
 
8
- Ruby bindings for the Rockbox **DSP**, **metadata**, and **playback** engine,
8
+ Ruby bindings for the Rockbox **DSP**, **metadata**, **codecs**, and
9
+ **playback** engine,
9
10
  via [`fiddle`](https://docs.ruby-lang.org/en/master/Fiddle.html) (Ruby stdlib)
10
11
  over the prebuilt `librockbox_ffi` shared library. No native extension is
11
12
  compiled — the gem `dlopen`s the shared library at load time.
@@ -53,28 +54,40 @@ RockboxFFI::Dsp.open(44_100) do |dsp|
53
54
  processed = dsp.process(samples) # Array<Integer>
54
55
  end
55
56
 
57
+ # --- codecs (decode a file to PCM, one chunk at a time) ---------------
58
+ RockboxFFI::Decoder.open("song.flac") do |dec|
59
+ dec.metadata[:title] # tags from the open file
60
+ dec.each_chunk do |samples, sample_rate| # Array<Integer>, Hz
61
+ # samples: interleaved-stereo signed 16-bit PCM
62
+ end
63
+ dec.finished # => [true, 0] (0 = clean)
64
+ end
65
+
56
66
  # --- playback (needs an output device) --------------------------------
57
67
  RockboxFFI::Player.open(volume: 0.8) do |player|
58
68
  player.set_replaygain(RockboxFFI::ReplayGainMode::TRACK, 0.0, true)
59
69
  player.set_crossfade(RockboxFFI::CrossfadeMode::ALWAYS)
60
- player.set_queue(["a.flac", "b.mp3", "c.opus"])
70
+ # Queue entries may be local files, http(s):// URLs to remote media,
71
+ # or live-radio / streaming URLs — mix and match freely.
72
+ player.set_queue(["a.flac", "https://example.com/b.mp3", "http://radio.example/stream"])
61
73
  player.play
62
74
  player.status # => {state: "playing", index: 0, ...}
63
75
  end
64
76
  ```
65
77
 
66
- `Dsp` and `Player` own native resources. Use the block form (`.open`) to close
67
- them automatically, or call `#close` yourself; a GC finalizer frees the handle
68
- as a backstop.
78
+ `Dsp`, `Decoder`, and `Player` own native resources. Use the block form
79
+ (`.open`) to close them automatically, or call `#close` yourself; a GC
80
+ finalizer frees the handle as a backstop.
69
81
 
70
82
  ## API
71
83
 
72
- | Namespace | Contents |
73
- | ------------------------ | ----------------------------------------------------------------- |
74
- | `RockboxFFI::Metadata` | `read(path) => Hash`, `probe(filename) => String \| nil` |
75
- | `RockboxFFI::Dsp` | EQ / tone / surround / compressor / ReplayGain, `process(samples)` |
76
- | `RockboxFFI::Player` | queue + transport + crossfade + ReplayGain, `status => Hash` |
77
- | `RockboxFFI::*Mode` | `DspReplayGainMode`, `ReplayGainMode`, `CrossfadeMode`, `MixMode` |
84
+ | Namespace | Contents |
85
+ | ---------------------- | ------------------------------------------------------------------------------------------ |
86
+ | `RockboxFFI::Metadata` | `read(path) => Hash`, `probe(filename) => String \| nil` |
87
+ | `RockboxFFI::Dsp` | EQ / tone / surround / compressor / ReplayGain, `process(samples)` |
88
+ | `RockboxFFI::Decoder` | codec engine: `metadata`, `each_chunk` / `next_chunk`, `seek_ms`, `elapsed_ms`, `finished` |
89
+ | `RockboxFFI::Player` | queue + transport + crossfade + ReplayGain, `status => Hash` |
90
+ | `RockboxFFI::*Mode` | `DspReplayGainMode`, `ReplayGainMode`, `CrossfadeMode`, `MixMode` |
78
91
 
79
92
  Rich values (metadata, player status) cross the FFI boundary as JSON and come
80
93
  back as Hashes with **symbol keys**. Sample buffers are plain `Array<Integer>`
@@ -115,6 +115,8 @@ module RockboxFFI
115
115
  extern "void rb_player_set_queue_json(void*, void*)"
116
116
  extern "void rb_player_enqueue(void*, void*)"
117
117
  extern "void rb_player_insert_json(void*, void*, int32_t, size_t)"
118
+ extern "void rb_player_remove(void*, size_t)"
119
+ extern "void rb_player_clear_queue(void*)"
118
120
  extern "void* rb_player_queue_json(void*)"
119
121
  extern "void rb_player_play(void*)"
120
122
  extern "void rb_player_pause(void*)"
@@ -114,6 +114,22 @@ module RockboxFFI
114
114
  self
115
115
  end
116
116
 
117
+ # Remove the track at +index+ (0-based) from the queue. An out-of-range
118
+ # index is ignored. Removing a track before the current one keeps the
119
+ # current track playing; removing the currently-playing track hard-cuts to
120
+ # the track that slides into its place; removing the last remaining track
121
+ # stops playback.
122
+ def remove(index)
123
+ Lib.rb_player_remove(@ptr, Integer(index))
124
+ self
125
+ end
126
+
127
+ # Empty the queue and stop playback (also clears any saved resume state).
128
+ def clear_queue
129
+ Lib.rb_player_clear_queue(@ptr)
130
+ self
131
+ end
132
+
117
133
  # The current queue as an Array of String paths/URLs.
118
134
  def queue
119
135
  s = RockboxFFI.take_string(Lib.rb_player_queue_json(@ptr))
@@ -1,3 +1,3 @@
1
1
  module RockboxFFI
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rockbox_ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tsiry Sandratraina