@jtarrio/signals 0.9.6 → 0.9.7

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.
@@ -6,13 +6,19 @@ export type PlayerOptions = {
6
6
  * If not specified, the default AudioContext constructor is used.
7
7
  */
8
8
  newAudioContext?: () => AudioContext;
9
+ /**
10
+ * How much time buffer to use to avoid stuttering, in seconds.
11
+ * If not specified, 0.05 seconds (50 milliseconds) is used.
12
+ */
13
+ timeBuffer?: number;
9
14
  };
10
15
  /** A class to play a series of sample buffers at a constant rate using the Web Audio API. */
11
16
  export declare class AudioPlayer implements Player {
12
17
  private static OUT_RATE;
13
- private static TIME_BUFFER;
14
18
  constructor(options?: PlayerOptions);
15
19
  private newAudioContext;
20
+ private timeBuffer;
21
+ private pool;
16
22
  private lastPlayedAt;
17
23
  private ac;
18
24
  private gainNode;
@@ -30,5 +36,7 @@ export declare class AudioPlayer implements Player {
30
36
  setVolume(volume: number): void;
31
37
  getVolume(): number;
32
38
  get sampleRate(): number;
39
+ private getBuffer;
40
+ private returnBuffer;
33
41
  }
34
42
  //# sourceMappingURL=audioplayer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioplayer.d.ts","sourceRoot":"","sources":["../../src/players/audioplayer.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;CACtC,CAAC;AAEF,6FAA6F;AAC7F,qBAAa,WAAY,YAAW,MAAM;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAQ;gBAEtB,OAAO,CAAC,EAAE,aAAa;IASnC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAS;IAErB;;;;OAIG;IACH,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAwB1D;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM;IAOxB,SAAS,IAAI,MAAM;IAInB,IAAI,UAAU,IAAI,MAAM,CAGvB;CACF"}
1
+ {"version":3,"file":"audioplayer.d.ts","sourceRoot":"","sources":["../../src/players/audioplayer.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,6FAA6F;AAC7F,qBAAa,WAAY,YAAW,MAAM;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;gBAEpB,OAAO,CAAC,EAAE,aAAa;IAWnC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAyC;IACrD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAS;IAErB;;;;OAIG;IACH,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAsB1D;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM;IAOxB,SAAS,IAAI,MAAM;IAInB,IAAI,UAAU,IAAI,MAAM,CAGvB;IAED,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,YAAY;CAQrB"}
@@ -14,16 +14,19 @@
14
14
  /** A class to play a series of sample buffers at a constant rate using the Web Audio API. */
15
15
  export class AudioPlayer {
16
16
  static OUT_RATE = 48000;
17
- static TIME_BUFFER = 0.05;
18
17
  constructor(options) {
19
18
  this.newAudioContext =
20
19
  options?.newAudioContext || (() => new AudioContext());
20
+ this.timeBuffer = options?.timeBuffer || 0.05;
21
+ this.pool = new Map();
21
22
  this.lastPlayedAt = -1;
22
23
  this.ac = undefined;
23
24
  this.gainNode = undefined;
24
25
  this.gain = 0;
25
26
  }
26
27
  newAudioContext;
28
+ timeBuffer;
29
+ pool = new Map();
27
30
  lastPlayedAt;
28
31
  ac;
29
32
  gainNode;
@@ -40,13 +43,15 @@ export class AudioPlayer {
40
43
  this.gainNode.gain.value = this.gain;
41
44
  this.gainNode.connect(this.ac.destination);
42
45
  }
43
- const buffer = this.ac.createBuffer(2, leftSamples.length, AudioPlayer.OUT_RATE);
44
- buffer.getChannelData(0).set(leftSamples);
45
- buffer.getChannelData(1).set(rightSamples);
46
- let source = this.ac.createBufferSource();
47
- source.buffer = buffer;
46
+ let now = this.ac.currentTime;
47
+ let next = this.lastPlayedAt + leftSamples.length / AudioPlayer.OUT_RATE;
48
+ this.lastPlayedAt = next > now ? next : now + this.timeBuffer;
49
+ const buffer = this.getBuffer(leftSamples.length);
50
+ buffer.copyToChannel(leftSamples, 0);
51
+ buffer.copyToChannel(rightSamples, 1);
52
+ let source = new AudioBufferSourceNode(this.ac, { buffer: buffer });
48
53
  source.connect(this.gainNode);
49
- this.lastPlayedAt = Math.max(this.lastPlayedAt + leftSamples.length / AudioPlayer.OUT_RATE, this.ac.currentTime + AudioPlayer.TIME_BUFFER);
54
+ source.onended = () => this.returnBuffer(buffer);
50
55
  source.start(this.lastPlayedAt);
51
56
  }
52
57
  /**
@@ -67,5 +72,24 @@ export class AudioPlayer {
67
72
  return this.ac.sampleRate;
68
73
  return 48000;
69
74
  }
75
+ getBuffer(length) {
76
+ let items = this.pool.get(length);
77
+ if (items && items.length > 0) {
78
+ return items.pop();
79
+ }
80
+ return new AudioBuffer({
81
+ sampleRate: AudioPlayer.OUT_RATE,
82
+ numberOfChannels: 2,
83
+ length: length,
84
+ });
85
+ }
86
+ returnBuffer(buffer) {
87
+ let items = this.pool.get(buffer.length);
88
+ if (!items) {
89
+ items = [];
90
+ this.pool.set(buffer.length, items);
91
+ }
92
+ items.push(buffer);
93
+ }
70
94
  }
71
95
  //# sourceMappingURL=audioplayer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioplayer.js","sourceRoot":"","sources":["../../src/players/audioplayer.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAajC,6FAA6F;AAC7F,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;IAElC,YAAY,OAAuB;QACjC,IAAI,CAAC,eAAe;YAClB,OAAO,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChB,CAAC;IAEO,eAAe,CAAqB;IACpC,YAAY,CAAS;IACrB,EAAE,CAA2B;IAC7B,QAAQ,CAAuB;IAC/B,IAAI,CAAS;IAErB;;;;OAIG;IACH,IAAI,CAAC,WAAyB,EAAE,YAA0B;QACxD,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CACjC,CAAC,EACD,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,QAAQ,CACrB,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,EAC7D,IAAI,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAC9C,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpC,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC"}
1
+ {"version":3,"file":"audioplayer.js","sourceRoot":"","sources":["../../src/players/audioplayer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jtarrio/signals",
3
3
  "description": "Demodulate radio signals in your JavaScript or TypeScript application",
4
- "version": "0.9.6",
4
+ "version": "0.9.7",
5
5
  "author": "Jacobo Tarrio <jtarrio@gmail.com>",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {