beeps 0.1.40 → 0.1.41
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 +4 -4
- data/.doc/ext/beeps/oscillator.cpp +6 -5
- data/.doc/ext/beeps/sound_player.cpp +8 -21
- data/ChangeLog.md +7 -0
- data/VERSION +1 -1
- data/ext/beeps/oscillator.cpp +6 -5
- data/ext/beeps/sound_player.cpp +8 -23
- data/include/beeps/generator.h +1 -1
- data/include/beeps/sound.h +14 -5
- data/lib/beeps/processor.rb +1 -1
- data/lib/beeps/sound.rb +20 -0
- data/src/oscillator.cpp +2 -2
- data/src/sound.cpp +22 -50
- data/test/test_sound_player.rb +42 -16
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3208db0b54212d8a78bae1faf4ea83e9dd866532d2348fc95ee39160df814111
|
4
|
+
data.tar.gz: 296f31a3dd5eb00da5e58b7e37f6d7684588e77f03bea198511506403e419cf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f84af845319c5bee3caee397685560dce92e7cb711ecd2119cf632c2a9614cc7ddb85c11eb6df888f240866fd83847d9c603d48c7489fcf62ea9cb01c1ba96d
|
7
|
+
data.tar.gz: 39b3a5f1e602a4e26a563bcef1db69eebc05a1fdbfa919cc255925875108fa445d983d17212c82f08ccf706f8826c29cde9fc69580777092c65717b92857df9c
|
@@ -66,11 +66,12 @@ Init_beeps_oscillator ()
|
|
66
66
|
rb_define_method(cOscillator, "type", RUBY_METHOD_FUNC(get_type), 0);
|
67
67
|
rb_define_method(cOscillator, "frequency=", RUBY_METHOD_FUNC(set_frequency), 1);
|
68
68
|
rb_define_method(cOscillator, "frequency", RUBY_METHOD_FUNC(get_frequency), 0);
|
69
|
-
|
70
|
-
cOscillator.define_const("
|
71
|
-
cOscillator.define_const("
|
72
|
-
cOscillator.define_const("
|
73
|
-
cOscillator.define_const("
|
69
|
+
|
70
|
+
cOscillator.define_const("TYPE_NONE", Beeps::Oscillator::TYPE_NONE);
|
71
|
+
cOscillator.define_const("SINE", Beeps::Oscillator::SINE);
|
72
|
+
cOscillator.define_const("TRIANGLE", Beeps::Oscillator::TRIANGLE);
|
73
|
+
cOscillator.define_const("SQUARE", Beeps::Oscillator::SQUARE);
|
74
|
+
cOscillator.define_const("SAWTOOTH", Beeps::Oscillator::SAWTOOTH);
|
74
75
|
}
|
75
76
|
|
76
77
|
|
@@ -54,27 +54,11 @@ VALUE stop(VALUE self)
|
|
54
54
|
}
|
55
55
|
|
56
56
|
static
|
57
|
-
VALUE
|
57
|
+
VALUE get_state(VALUE self)
|
58
58
|
{
|
59
59
|
CHECK;
|
60
60
|
|
61
|
-
return value(THIS->
|
62
|
-
}
|
63
|
-
|
64
|
-
static
|
65
|
-
VALUE is_paused(VALUE self)
|
66
|
-
{
|
67
|
-
CHECK;
|
68
|
-
|
69
|
-
return value(THIS->is_paused());
|
70
|
-
}
|
71
|
-
|
72
|
-
static
|
73
|
-
VALUE is_stopped(VALUE self)
|
74
|
-
{
|
75
|
-
CHECK;
|
76
|
-
|
77
|
-
return value(THIS->is_stopped());
|
61
|
+
return value(THIS->state());
|
78
62
|
}
|
79
63
|
|
80
64
|
static
|
@@ -131,14 +115,17 @@ Init_beeps_sound_player ()
|
|
131
115
|
rb_define_method(cSoundPlayer, "pause", RUBY_METHOD_FUNC(pause), 0);
|
132
116
|
rb_define_method(cSoundPlayer, "rewind", RUBY_METHOD_FUNC(rewind), 0);
|
133
117
|
rb_define_method(cSoundPlayer, "stop", RUBY_METHOD_FUNC(stop), 0);
|
134
|
-
cSoundPlayer
|
135
|
-
cSoundPlayer.define_method("paused?", is_paused);
|
136
|
-
cSoundPlayer.define_method("stopped?", is_stopped);
|
118
|
+
rb_define_method(cSoundPlayer, "state", RUBY_METHOD_FUNC(get_state), 0);
|
137
119
|
rb_define_method(cSoundPlayer, "gain=", RUBY_METHOD_FUNC(set_gain), 1);
|
138
120
|
rb_define_method(cSoundPlayer, "gain", RUBY_METHOD_FUNC(get_gain), 0);
|
139
121
|
rb_define_method(cSoundPlayer, "loop=", RUBY_METHOD_FUNC(set_loop), 1);
|
140
122
|
rb_define_method(cSoundPlayer, "loop", RUBY_METHOD_FUNC(get_loop), 0);
|
141
123
|
rb_define_singleton_method(cSoundPlayer, "stop_all", RUBY_METHOD_FUNC(stop_all), 0);
|
124
|
+
|
125
|
+
cSoundPlayer.define_const("STATE_UNKNOWN", Beeps::SoundPlayer::STATE_UNKNOWN);
|
126
|
+
cSoundPlayer.define_const("PLAYING", Beeps::SoundPlayer::PLAYING);
|
127
|
+
cSoundPlayer.define_const("PAUSED", Beeps::SoundPlayer::PAUSED);
|
128
|
+
cSoundPlayer.define_const("STOPPED", Beeps::SoundPlayer::STOPPED);
|
142
129
|
}
|
143
130
|
|
144
131
|
|
data/ChangeLog.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.41
|
data/ext/beeps/oscillator.cpp
CHANGED
@@ -71,11 +71,12 @@ Init_beeps_oscillator ()
|
|
71
71
|
cOscillator.define_method("type", get_type);
|
72
72
|
cOscillator.define_method("frequency=", set_frequency);
|
73
73
|
cOscillator.define_method("frequency", get_frequency);
|
74
|
-
|
75
|
-
cOscillator.define_const("
|
76
|
-
cOscillator.define_const("
|
77
|
-
cOscillator.define_const("
|
78
|
-
cOscillator.define_const("
|
74
|
+
|
75
|
+
cOscillator.define_const("TYPE_NONE", Beeps::Oscillator::TYPE_NONE);
|
76
|
+
cOscillator.define_const("SINE", Beeps::Oscillator::SINE);
|
77
|
+
cOscillator.define_const("TRIANGLE", Beeps::Oscillator::TRIANGLE);
|
78
|
+
cOscillator.define_const("SQUARE", Beeps::Oscillator::SQUARE);
|
79
|
+
cOscillator.define_const("SAWTOOTH", Beeps::Oscillator::SAWTOOTH);
|
79
80
|
}
|
80
81
|
|
81
82
|
|
data/ext/beeps/sound_player.cpp
CHANGED
@@ -59,29 +59,11 @@ RUCY_DEF0(stop)
|
|
59
59
|
RUCY_END
|
60
60
|
|
61
61
|
static
|
62
|
-
RUCY_DEF0(
|
62
|
+
RUCY_DEF0(get_state)
|
63
63
|
{
|
64
64
|
CHECK;
|
65
65
|
|
66
|
-
return value(THIS->
|
67
|
-
}
|
68
|
-
RUCY_END
|
69
|
-
|
70
|
-
static
|
71
|
-
RUCY_DEF0(is_paused)
|
72
|
-
{
|
73
|
-
CHECK;
|
74
|
-
|
75
|
-
return value(THIS->is_paused());
|
76
|
-
}
|
77
|
-
RUCY_END
|
78
|
-
|
79
|
-
static
|
80
|
-
RUCY_DEF0(is_stopped)
|
81
|
-
{
|
82
|
-
CHECK;
|
83
|
-
|
84
|
-
return value(THIS->is_stopped());
|
66
|
+
return value(THIS->state());
|
85
67
|
}
|
86
68
|
RUCY_END
|
87
69
|
|
@@ -144,14 +126,17 @@ Init_beeps_sound_player ()
|
|
144
126
|
cSoundPlayer.define_method("pause", pause);
|
145
127
|
cSoundPlayer.define_method("rewind", rewind);
|
146
128
|
cSoundPlayer.define_method("stop", stop);
|
147
|
-
cSoundPlayer.define_method("
|
148
|
-
cSoundPlayer.define_method("paused?", is_paused);
|
149
|
-
cSoundPlayer.define_method("stopped?", is_stopped);
|
129
|
+
cSoundPlayer.define_method("state", get_state);
|
150
130
|
cSoundPlayer.define_method("gain=", set_gain);
|
151
131
|
cSoundPlayer.define_method("gain", get_gain);
|
152
132
|
cSoundPlayer.define_method("loop=", set_loop);
|
153
133
|
cSoundPlayer.define_method("loop", get_loop);
|
154
134
|
cSoundPlayer.define_singleton_method("stop_all", stop_all);
|
135
|
+
|
136
|
+
cSoundPlayer.define_const("STATE_UNKNOWN", Beeps::SoundPlayer::STATE_UNKNOWN);
|
137
|
+
cSoundPlayer.define_const("PLAYING", Beeps::SoundPlayer::PLAYING);
|
138
|
+
cSoundPlayer.define_const("PAUSED", Beeps::SoundPlayer::PAUSED);
|
139
|
+
cSoundPlayer.define_const("STOPPED", Beeps::SoundPlayer::STOPPED);
|
155
140
|
}
|
156
141
|
|
157
142
|
|
data/include/beeps/generator.h
CHANGED
data/include/beeps/sound.h
CHANGED
@@ -20,6 +20,19 @@ namespace Beeps
|
|
20
20
|
|
21
21
|
public:
|
22
22
|
|
23
|
+
enum State
|
24
|
+
{
|
25
|
+
|
26
|
+
STATE_UNKNOWN = 0,
|
27
|
+
|
28
|
+
PLAYING,
|
29
|
+
|
30
|
+
PAUSED,
|
31
|
+
|
32
|
+
STOPPED
|
33
|
+
|
34
|
+
};// State
|
35
|
+
|
23
36
|
SoundPlayer ();
|
24
37
|
|
25
38
|
~SoundPlayer ();
|
@@ -32,11 +45,7 @@ namespace Beeps
|
|
32
45
|
|
33
46
|
void stop ();
|
34
47
|
|
35
|
-
|
36
|
-
|
37
|
-
bool is_paused () const;
|
38
|
-
|
39
|
-
bool is_stopped () const;
|
48
|
+
State state () const;
|
40
49
|
|
41
50
|
void set_gain (float gain);
|
42
51
|
|
data/lib/beeps/processor.rb
CHANGED
data/lib/beeps/sound.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'xot/setter'
|
2
|
+
require 'xot/const_symbol_accessor'
|
2
3
|
require 'xot/universal_accessor'
|
3
4
|
require 'xot/block_util'
|
4
5
|
require 'beeps/ext'
|
@@ -35,6 +36,25 @@ module Beeps
|
|
35
36
|
|
36
37
|
include Xot::Setter
|
37
38
|
|
39
|
+
const_symbol_reader :state, **{
|
40
|
+
unknown: STATE_UNKNOWN,
|
41
|
+
playing: PLAYING,
|
42
|
+
paused: PAUSED,
|
43
|
+
stopped: STOPPED
|
44
|
+
}
|
45
|
+
|
46
|
+
def playing?()
|
47
|
+
state == :playing
|
48
|
+
end
|
49
|
+
|
50
|
+
def paused?()
|
51
|
+
state == :paused
|
52
|
+
end
|
53
|
+
|
54
|
+
def stopped?()
|
55
|
+
state == :stopped
|
56
|
+
end
|
57
|
+
|
38
58
|
universal_accessor :gain, :loop
|
39
59
|
|
40
60
|
end# SoundPlayer
|
data/src/oscillator.cpp
CHANGED
@@ -15,7 +15,7 @@ namespace Beeps
|
|
15
15
|
struct Oscillator::Data
|
16
16
|
{
|
17
17
|
|
18
|
-
Type type =
|
18
|
+
Type type = TYPE_NONE;
|
19
19
|
|
20
20
|
float frequency = 440;
|
21
21
|
|
@@ -137,7 +137,7 @@ namespace Beeps
|
|
137
137
|
{
|
138
138
|
if (!Super::operator bool()) return false;
|
139
139
|
return
|
140
|
-
self->type !=
|
140
|
+
self->type != TYPE_NONE && self->frequency > 0 &&
|
141
141
|
(self->sine || self->square || self->saw);
|
142
142
|
}
|
143
143
|
|
data/src/sound.cpp
CHANGED
@@ -249,37 +249,21 @@ namespace Beeps
|
|
249
249
|
}
|
250
250
|
}
|
251
251
|
|
252
|
-
|
252
|
+
SoundPlayer::State state () const
|
253
253
|
{
|
254
|
-
if (!*this) return
|
255
|
-
|
256
|
-
ALint state = 0;
|
257
|
-
alGetSourcei(self->id, AL_SOURCE_STATE, &state);
|
258
|
-
OpenAL_check_error(__FILE__, __LINE__);
|
259
|
-
|
260
|
-
return state == AL_PLAYING;
|
261
|
-
}
|
262
|
-
|
263
|
-
bool is_paused () const
|
264
|
-
{
|
265
|
-
if (!*this) return false;
|
266
|
-
|
267
|
-
ALint state = 0;
|
268
|
-
alGetSourcei(self->id, AL_SOURCE_STATE, &state);
|
269
|
-
OpenAL_check_error(__FILE__, __LINE__);
|
270
|
-
|
271
|
-
return state == AL_PAUSED;
|
272
|
-
}
|
273
|
-
|
274
|
-
bool is_stopped () const
|
275
|
-
{
|
276
|
-
if (!*this) return true;
|
254
|
+
if (!*this) return SoundPlayer::STATE_UNKNOWN;
|
277
255
|
|
278
256
|
ALint state = 0;
|
279
257
|
alGetSourcei(self->id, AL_SOURCE_STATE, &state);
|
280
258
|
OpenAL_check_error(__FILE__, __LINE__);
|
281
259
|
|
282
|
-
|
260
|
+
switch (state)
|
261
|
+
{
|
262
|
+
case AL_PLAYING: return SoundPlayer::PLAYING;
|
263
|
+
case AL_PAUSED: return SoundPlayer::PAUSED;
|
264
|
+
case AL_STOPPED: return SoundPlayer::STOPPED;
|
265
|
+
default: return SoundPlayer::STATE_UNKNOWN;
|
266
|
+
}
|
283
267
|
}
|
284
268
|
|
285
269
|
void set_gain (float gain)
|
@@ -433,7 +417,7 @@ namespace Beeps
|
|
433
417
|
return;
|
434
418
|
|
435
419
|
source.queue(buffer);
|
436
|
-
if (source.
|
420
|
+
if (source.state() == STOPPED) source.play();
|
437
421
|
}
|
438
422
|
}
|
439
423
|
|
@@ -476,10 +460,10 @@ namespace Beeps
|
|
476
460
|
{
|
477
461
|
auto it = std::remove_if(
|
478
462
|
global::players.begin(), global::players.end(),
|
479
|
-
[](auto& player)
|
480
|
-
|
481
|
-
|
482
|
-
|
463
|
+
[](auto& player)
|
464
|
+
{
|
465
|
+
return !player || player.state() == SoundPlayer::STOPPED;
|
466
|
+
});
|
483
467
|
|
484
468
|
global::players.erase(it, global::players.end());
|
485
469
|
}
|
@@ -488,7 +472,6 @@ namespace Beeps
|
|
488
472
|
get_next_player ()
|
489
473
|
{
|
490
474
|
SoundPlayer player = create_player();
|
491
|
-
|
492
475
|
if (player)
|
493
476
|
LOG("new player");
|
494
477
|
|
@@ -496,7 +479,7 @@ namespace Beeps
|
|
496
479
|
{
|
497
480
|
for (auto& p : global::players)
|
498
481
|
{
|
499
|
-
if (p && p.
|
482
|
+
if (p && p.state() == SoundPlayer::STOPPED)
|
500
483
|
{
|
501
484
|
player = reuse_player(&p);
|
502
485
|
LOG("reuse stopped player");
|
@@ -578,24 +561,13 @@ namespace Beeps
|
|
578
561
|
self->source.stop();
|
579
562
|
}
|
580
563
|
|
581
|
-
|
582
|
-
SoundPlayer::
|
583
|
-
{
|
584
|
-
return
|
585
|
-
self->source.is_playing() ||
|
586
|
-
(self->is_streaming() && self->source.is_stopped());
|
587
|
-
}
|
588
|
-
|
589
|
-
bool
|
590
|
-
SoundPlayer::is_paused () const
|
591
|
-
{
|
592
|
-
return self->source.is_paused();
|
593
|
-
}
|
594
|
-
|
595
|
-
bool
|
596
|
-
SoundPlayer::is_stopped () const
|
564
|
+
SoundPlayer::State
|
565
|
+
SoundPlayer::state () const
|
597
566
|
{
|
598
|
-
|
567
|
+
State s = self->source.state();
|
568
|
+
if (s == STOPPED && self->is_streaming())
|
569
|
+
return PLAYING;
|
570
|
+
return s;
|
599
571
|
}
|
600
572
|
|
601
573
|
void
|
@@ -833,7 +805,7 @@ namespace Beeps
|
|
833
805
|
#if 0
|
834
806
|
std::string ox = "";
|
835
807
|
for (auto& player : global::players)
|
836
|
-
ox += player.
|
808
|
+
ox += player.state() == SoundPlayer::PLAYING ? 'o' : 'x';
|
837
809
|
LOG("%d players. (%s)", global::players.size(), ox.c_str());
|
838
810
|
#endif
|
839
811
|
|
data/test/test_sound_player.rb
CHANGED
@@ -31,26 +31,26 @@ class TestSoundPlayer < Test::Unit::TestCase
|
|
31
31
|
|
32
32
|
def test_pause()
|
33
33
|
p = sound.play
|
34
|
-
assert_equal
|
34
|
+
assert_equal :playing, p.state
|
35
35
|
p.pause
|
36
|
-
assert_equal
|
36
|
+
assert_equal :paused, p.state
|
37
37
|
|
38
38
|
p = stream_sound.play
|
39
|
-
assert_equal
|
39
|
+
assert_equal :playing, p.state
|
40
40
|
p.pause
|
41
|
-
assert_equal
|
41
|
+
assert_equal :paused, p.state
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_stop()
|
45
45
|
p = sound.play
|
46
|
-
assert_equal
|
46
|
+
assert_equal :playing, p.state
|
47
47
|
p.stop
|
48
|
-
assert_equal
|
48
|
+
assert_equal :stopped, p.state
|
49
49
|
|
50
50
|
p = stream_sound.play
|
51
|
-
assert_equal
|
51
|
+
assert_equal :playing, p.state
|
52
52
|
p.stop
|
53
|
-
assert_equal
|
53
|
+
assert_equal :stopped, p.state
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_play_end_then_stop()
|
@@ -58,42 +58,68 @@ class TestSoundPlayer < Test::Unit::TestCase
|
|
58
58
|
sec = s.seconds
|
59
59
|
|
60
60
|
p = s.play
|
61
|
-
assert_equal
|
61
|
+
assert_equal :playing, p.state
|
62
62
|
sleep sec * 2
|
63
|
-
assert_equal
|
63
|
+
assert_equal :stopped, p.state
|
64
64
|
|
65
65
|
s = stream_sound
|
66
66
|
p = s.play
|
67
|
-
assert_equal
|
67
|
+
assert_equal :playing, p.state
|
68
68
|
sleep sec * 2
|
69
|
-
assert_equal
|
69
|
+
assert_equal :stopped, p.state
|
70
70
|
end
|
71
71
|
|
72
72
|
def test_play_after_pause()
|
73
73
|
p = sound.play
|
74
74
|
p.pause
|
75
|
-
assert_equal
|
75
|
+
assert_equal :paused, p.state
|
76
76
|
p.play
|
77
|
-
assert_equal
|
77
|
+
assert_equal :playing, p.state
|
78
78
|
|
79
79
|
p = stream_sound.play
|
80
80
|
p.pause
|
81
|
-
assert_equal
|
81
|
+
assert_equal :paused, p.state
|
82
82
|
p.play
|
83
|
-
assert_equal
|
83
|
+
assert_equal :playing, p.state
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_stop_after_pause()
|
87
87
|
p = sound.play
|
88
88
|
p.pause
|
89
|
+
assert_equal :paused, p.state
|
90
|
+
p.stop
|
91
|
+
assert_equal :stopped, p.state
|
92
|
+
|
93
|
+
p = stream_sound.play
|
94
|
+
p.pause
|
95
|
+
assert_equal :paused, p.state
|
96
|
+
p.stop
|
97
|
+
assert_equal :stopped, p.state
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_state()
|
101
|
+
p = sound.play
|
102
|
+
assert_equal :playing, p.state
|
103
|
+
assert_equal [true, false, false], [p.playing?, p.paused?, p.stopped?]
|
104
|
+
|
105
|
+
p.pause
|
106
|
+
assert_equal :paused, p.state
|
89
107
|
assert_equal [false, true, false], [p.playing?, p.paused?, p.stopped?]
|
108
|
+
|
90
109
|
p.stop
|
110
|
+
assert_equal :stopped, p.state
|
91
111
|
assert_equal [false, false, true], [p.playing?, p.paused?, p.stopped?]
|
92
112
|
|
93
113
|
p = stream_sound.play
|
114
|
+
assert_equal :playing, p.state
|
115
|
+
assert_equal [true, false, false], [p.playing?, p.paused?, p.stopped?]
|
116
|
+
|
94
117
|
p.pause
|
118
|
+
assert_equal :paused, p.state
|
95
119
|
assert_equal [false, true, false], [p.playing?, p.paused?, p.stopped?]
|
120
|
+
|
96
121
|
p.stop
|
122
|
+
assert_equal :stopped, p.state
|
97
123
|
assert_equal [false, false, true], [p.playing?, p.paused?, p.stopped?]
|
98
124
|
end
|
99
125
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beeps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.41
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xot
|