Merge pull request #221 from Chuui9739/fix-MediaSource-error
Some checks failed
CI / test (3.10) (push) Has been cancelled

Repair the error 'Error: Error generating speech: Failed to execute '…
This commit is contained in:
Fireblade2534 2025-03-06 17:52:21 -05:00 committed by GitHub
commit a578d22084
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -264,7 +264,7 @@ export class AudioService {
// Don't process if audio is in error state // Don't process if audio is in error state
if (this.audio.error) { if (this.audio.error) {
console.warn('Skipping operation due to audio error'); console.warn("Skipping operation due to audio error");
return; return;
} }
@ -272,11 +272,38 @@ export class AudioService {
try { try {
this.sourceBuffer.appendBuffer(operation.chunk); this.sourceBuffer.appendBuffer(operation.chunk);
operation.resolve();
// Set up event listeners
const onUpdateEnd = () => {
operation.resolve();
this.sourceBuffer.removeEventListener("updateend", onUpdateEnd);
this.sourceBuffer.removeEventListener(
"updateerror",
onUpdateError
);
// Process the next operation
this.processNextOperation();
};
const onUpdateError = (event) => {
operation.reject(event);
this.sourceBuffer.removeEventListener("updateend", onUpdateEnd);
this.sourceBuffer.removeEventListener(
"updateerror",
onUpdateError
);
// Decide whether to continue processing
if (event.name !== "InvalidStateError") {
this.processNextOperation();
}
};
this.sourceBuffer.addEventListener("updateend", onUpdateEnd);
this.sourceBuffer.addEventListener("updateerror", onUpdateError);
} catch (error) { } catch (error) {
operation.reject(error); operation.reject(error);
// Only continue processing if it's not a fatal error // Only continue processing if it's not a fatal error
if (error.name !== 'InvalidStateError') { if (error.name !== "InvalidStateError") {
this.processNextOperation(); this.processNextOperation();
} }
} }
@ -367,11 +394,11 @@ export class AudioService {
if (this.audio) { if (this.audio) {
this.audio.pause(); this.audio.pause();
this.audio.src = ''; this.audio.src = "";
this.audio = null; this.audio = null;
} }
if (this.mediaSource && this.mediaSource.readyState === 'open') { if (this.mediaSource && this.mediaSource.readyState === "open") {
try { try {
this.mediaSource.endOfStream(); this.mediaSource.endOfStream();
} catch (e) { } catch (e) {
@ -380,7 +407,11 @@ export class AudioService {
} }
this.mediaSource = null; this.mediaSource = null;
this.sourceBuffer = null; if (this.sourceBuffer) {
this.sourceBuffer.removeEventListener("updateend", () => {});
this.sourceBuffer.removeEventListener("updateerror", () => {});
this.sourceBuffer = null;
}
this.serverDownloadPath = null; this.serverDownloadPath = null;
this.pendingOperations = []; this.pendingOperations = [];
} }
@ -388,17 +419,17 @@ export class AudioService {
cleanup() { cleanup() {
if (this.audio) { if (this.audio) {
this.eventListeners.forEach((listeners, event) => { this.eventListeners.forEach((listeners, event) => {
listeners.forEach(callback => { listeners.forEach((callback) => {
this.audio.removeEventListener(event, callback); this.audio.removeEventListener(event, callback);
}); });
}); });
this.audio.pause(); this.audio.pause();
this.audio.src = ''; this.audio.src = "";
this.audio = null; this.audio = null;
} }
if (this.mediaSource && this.mediaSource.readyState === 'open') { if (this.mediaSource && this.mediaSource.readyState === "open") {
try { try {
this.mediaSource.endOfStream(); this.mediaSource.endOfStream();
} catch (e) { } catch (e) {
@ -407,7 +438,11 @@ export class AudioService {
} }
this.mediaSource = null; this.mediaSource = null;
this.sourceBuffer = null; if (this.sourceBuffer) {
this.sourceBuffer.removeEventListener("updateend", () => {});
this.sourceBuffer.removeEventListener("updateerror", () => {});
this.sourceBuffer = null;
}
this.serverDownloadPath = null; this.serverDownloadPath = null;
this.pendingOperations = []; this.pendingOperations = [];
} }