react-native-audiosprites 0.4.0 → 0.4.1

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.
@@ -11,6 +11,9 @@ export class AudioSpritePlayer {
11
11
  // Cache for the small, pre-split AudioBuffers used by mobile's QueueSourceNode
12
12
  spriteBufferCache = {};
13
13
  loopingSource = null;
14
+ sourcePool = []; // NEW: Pool for non-looping sources
15
+ maxPoolSize = 5; // Adjust this based on testing (5 is a good start)
16
+
14
17
  constructor({
15
18
  audioContext,
16
19
  fetch,
@@ -100,6 +103,59 @@ export class AudioSpritePlayer {
100
103
  // console.log(`Cached sprite buffer for ${soundName}, frames: ${durationFrames}`);
101
104
  }
102
105
  }
106
+
107
+ /**
108
+ * Retrieves a source node from the pool or creates a new one if the pool is under capacity.
109
+ */
110
+ _getOrCreateSourceNode() {
111
+ if (this.platform === 'web') {
112
+ // Web logic remains simple: always create a standard AudioBufferSourceNode
113
+ const source = this.audioContext.createBufferSource();
114
+ source.connect(this.audioContext.destination);
115
+ return source;
116
+ }
117
+
118
+ // Mobile/QueueSourceNode logic
119
+ let source;
120
+ if (this.sourcePool.length > 0) {
121
+ source = this.sourcePool.pop(); // Reuse an available source
122
+ // Disconnect the previous onEnded handler if it had one
123
+ source.onEnded = null;
124
+ // console.log('Reusing source from pool. Pool size:', this.sourcePool.length);
125
+ } else if (this.sourcePool.length < this.maxPoolSize) {
126
+ // Create a new source if pool is not full
127
+ if (!this.audioContext.createBufferQueueSource) {
128
+ console.error('RNAS Error: createBufferQueueSource is not available. Cannot create pool.');
129
+ return null;
130
+ }
131
+ source = this.audioContext.createBufferQueueSource();
132
+ source.connect(this.audioContext.destination);
133
+ // console.log('Created new source. Pool size:', this.sourcePool.length);
134
+ } else {
135
+ // If pool is full, we might have to block or fail.
136
+ // For simplicity, we'll return null and warn, but a robust system
137
+ // might implement a "wait-and-retry" mechanism.
138
+ console.warn('RNAS Warning: Source pool is full. Dropping non-looping sound.');
139
+ return null;
140
+ }
141
+
142
+ // Define the cleanup/recycling function
143
+ const cleanupAndRecycle = () => {
144
+ // Only recycle if we are under maxPoolSize and it's not the looping source
145
+ if (this.sourcePool.length < this.maxPoolSize) {
146
+ this.sourcePool.push(source);
147
+ // console.log('Recycled source. Pool size:', this.sourcePool.length);
148
+ } else {
149
+ // If pool is full, let it be garbage collected
150
+ source.disconnect();
151
+ // console.log('Source disconnected (GC candidate).');
152
+ }
153
+ };
154
+
155
+ // Assign the cleanup function to run when the sound finishes playing
156
+ source.onEnded = cleanupAndRecycle;
157
+ return source;
158
+ }
103
159
  async load(json, audio) {
104
160
  try {
105
161
  let decodedBuffer;
@@ -217,12 +273,15 @@ export class AudioSpritePlayer {
217
273
  source.start(0); // Start immediately
218
274
  this.loopingSource = source; // Store reference to looping source
219
275
  } else {
220
- // For non-looping sounds on mobile, use AudioBufferQueueSourceNode
221
- source = this.audioContext.createBufferQueueSource();
276
+ // **NEW: USE POOL FOR NON-LOOPING MOBILE SOUNDS**
277
+ source = this._getOrCreateSourceNode();
278
+ if (!source) return; // Dropped sound because pool was full
279
+
280
+ // Must re-enqueue the buffer since the source was reused
222
281
  source.enqueueBuffer(spriteBuffer);
223
- source.connect(this.audioContext.destination);
224
- source.start(1);
225
- console.log('non loop', soundName);
282
+
283
+ // Start immediately (start time 0 for BufferQueueSourceNode means "as soon as possible")
284
+ source.start(0);
226
285
  }
227
286
  } else {
228
287
  // 🌐 WEB LOGIC (Standard Web Audio API)
@@ -1 +1 @@
1
- {"version":3,"names":["AudioSpritePlayer","spriteBufferCache","loopingSource","constructor","audioContext","fetch","platform","AudioContext","Error","audioBuffer","manifest","createBufferSource","name","console","log","_cacheSpriteBuffers","sampleRate","numChannels","numberOfChannels","soundName","sprite","sound","startFrame","Math","floor","endFrame","ceil","durationFrames","warn","spriteBuffer","createBuffer","i","sourceData","getChannelData","destinationData","segment","subarray","set","load","json","audio","decodedBuffer","response","ok","statusText","urls","audioFileName","audioUrl","URL","url","href","audioResponse","arrayBuffer","decodeAudioData","typedArrayView","Uint8Array","buffer","error","play","state","resume","catch","e","duration","source","createBufferQueueSource","loop","enqueueBuffer","connect","destination","loopHandler","start","onEnded","stop","loopStart","loopEnd","getManifest","getAudioBuffer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["AudioSpritePlayer","spriteBufferCache","loopingSource","sourcePool","maxPoolSize","constructor","audioContext","fetch","platform","AudioContext","Error","audioBuffer","manifest","createBufferSource","name","console","log","_cacheSpriteBuffers","sampleRate","numChannels","numberOfChannels","soundName","sprite","sound","startFrame","Math","floor","endFrame","ceil","durationFrames","warn","spriteBuffer","createBuffer","i","sourceData","getChannelData","destinationData","segment","subarray","set","_getOrCreateSourceNode","source","connect","destination","length","pop","onEnded","createBufferQueueSource","error","cleanupAndRecycle","push","disconnect","load","json","audio","decodedBuffer","response","ok","statusText","urls","audioFileName","audioUrl","URL","url","href","audioResponse","arrayBuffer","decodeAudioData","typedArrayView","Uint8Array","buffer","play","state","resume","catch","e","duration","loop","enqueueBuffer","loopHandler","start","stop","loopStart","loopEnd","getManifest","getAudioBuffer"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,8 @@ export declare class AudioSpritePlayer {
11
11
  platform: string;
12
12
  private spriteBufferCache;
13
13
  private loopingSource;
14
+ private sourcePool;
15
+ private maxPoolSize;
14
16
  constructor({ audioContext, fetch, platform, }: {
15
17
  audioContext: any | null;
16
18
  fetch: any;
@@ -40,6 +42,10 @@ export declare class AudioSpritePlayer {
40
42
  * }
41
43
  */
42
44
  private _cacheSpriteBuffers;
45
+ /**
46
+ * Retrieves a source node from the pool or creates a new one if the pool is under capacity.
47
+ */
48
+ private _getOrCreateSourceNode;
43
49
  load(json: any, audio?: any): Promise<void>;
44
50
  play(soundName: string): void;
45
51
  getManifest(): any;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,aAAa,CAAoB;gBAE7B,EACV,YAAY,EACZ,KAAK,EACL,QAAQ,GACT,EAAE;QACD,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;QACzB,KAAK,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;KAClB;IAkCD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,mBAAmB;IA8CrB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG;IA0EjC,IAAI,CAAC,SAAS,EAAE,MAAM;IAoHtB,WAAW;IAIX,cAAc;IAId;;;OAGG;IACH,IAAI;CASL"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAa;gBAEpB,EACV,YAAY,EACZ,KAAK,EACL,QAAQ,GACT,EAAE;QACD,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;QACzB,KAAK,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;KAClB;IAkCD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuDxB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG;IA0EjC,IAAI,CAAC,SAAS,EAAE,MAAM;IAuHtB,WAAW;IAIX,cAAc;IAId;;;OAGG;IACH,IAAI;CASL"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-native-audiosprites",
3
- "version": "0.4.0",
4
- "description": "audio sprites ",
3
+ "version": "0.4.1",
4
+ "description": "audio sprites for react native ios, android and web",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
7
7
  "exports": {
package/src/index.tsx CHANGED
@@ -12,6 +12,8 @@ export class AudioSpritePlayer {
12
12
  // Cache for the small, pre-split AudioBuffers used by mobile's QueueSourceNode
13
13
  private spriteBufferCache: Record<string, any> = {};
14
14
  private loopingSource: any | null = null;
15
+ private sourcePool: any[] = []; // NEW: Pool for non-looping sources
16
+ private maxPoolSize: number = 5; // Adjust this based on testing (5 is a good start)
15
17
 
16
18
  constructor({
17
19
  audioContext,
@@ -124,6 +126,64 @@ export class AudioSpritePlayer {
124
126
  }
125
127
  }
126
128
 
129
+ /**
130
+ * Retrieves a source node from the pool or creates a new one if the pool is under capacity.
131
+ */
132
+ private _getOrCreateSourceNode(): any {
133
+ if (this.platform === 'web') {
134
+ // Web logic remains simple: always create a standard AudioBufferSourceNode
135
+ const source = this.audioContext.createBufferSource();
136
+ source.connect(this.audioContext.destination);
137
+ return source;
138
+ }
139
+
140
+ // Mobile/QueueSourceNode logic
141
+ let source;
142
+ if (this.sourcePool.length > 0) {
143
+ source = this.sourcePool.pop(); // Reuse an available source
144
+ // Disconnect the previous onEnded handler if it had one
145
+ source.onEnded = null;
146
+ // console.log('Reusing source from pool. Pool size:', this.sourcePool.length);
147
+ } else if (this.sourcePool.length < this.maxPoolSize) {
148
+ // Create a new source if pool is not full
149
+ if (!this.audioContext.createBufferQueueSource) {
150
+ console.error(
151
+ 'RNAS Error: createBufferQueueSource is not available. Cannot create pool.'
152
+ );
153
+ return null;
154
+ }
155
+ source = this.audioContext.createBufferQueueSource();
156
+ source.connect(this.audioContext.destination);
157
+ // console.log('Created new source. Pool size:', this.sourcePool.length);
158
+ } else {
159
+ // If pool is full, we might have to block or fail.
160
+ // For simplicity, we'll return null and warn, but a robust system
161
+ // might implement a "wait-and-retry" mechanism.
162
+ console.warn(
163
+ 'RNAS Warning: Source pool is full. Dropping non-looping sound.'
164
+ );
165
+ return null;
166
+ }
167
+
168
+ // Define the cleanup/recycling function
169
+ const cleanupAndRecycle = () => {
170
+ // Only recycle if we are under maxPoolSize and it's not the looping source
171
+ if (this.sourcePool.length < this.maxPoolSize) {
172
+ this.sourcePool.push(source);
173
+ // console.log('Recycled source. Pool size:', this.sourcePool.length);
174
+ } else {
175
+ // If pool is full, let it be garbage collected
176
+ source.disconnect();
177
+ // console.log('Source disconnected (GC candidate).');
178
+ }
179
+ };
180
+
181
+ // Assign the cleanup function to run when the sound finishes playing
182
+ source.onEnded = cleanupAndRecycle;
183
+
184
+ return source;
185
+ }
186
+
127
187
  async load(json: any, audio?: any) {
128
188
  try {
129
189
  let decodedBuffer: any;
@@ -268,12 +328,15 @@ export class AudioSpritePlayer {
268
328
  source.start(0); // Start immediately
269
329
  this.loopingSource = source; // Store reference to looping source
270
330
  } else {
271
- // For non-looping sounds on mobile, use AudioBufferQueueSourceNode
272
- source = this.audioContext.createBufferQueueSource();
331
+ // **NEW: USE POOL FOR NON-LOOPING MOBILE SOUNDS**
332
+ source = this._getOrCreateSourceNode();
333
+ if (!source) return; // Dropped sound because pool was full
334
+
335
+ // Must re-enqueue the buffer since the source was reused
273
336
  source.enqueueBuffer(spriteBuffer);
274
- source.connect(this.audioContext.destination);
275
- source.start(1);
276
- console.log('non loop', soundName);
337
+
338
+ // Start immediately (start time 0 for BufferQueueSourceNode means "as soon as possible")
339
+ source.start(0);
277
340
  }
278
341
  } else {
279
342
  // 🌐 WEB LOGIC (Standard Web Audio API)