mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-09-30 17:40:53 -07:00
Merge remote-tracking branch 'origin/main' into add-hachidori-backend
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
type: fixed
|
||||||
|
area: overlay
|
||||||
|
|
||||||
|
- On macOS with Bluetooth headphones such as AirPods, the timing review preview cursor now moves smoothly across the selection instead of stuttering and jumping to the end partway through. This affected Opus audio, including Jellyfin streams.
|
||||||
@@ -39,6 +39,22 @@ describe('buildMediaTimingPreviewArgs', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('keeps macOS previews on coreaudio with packed float output', () => {
|
||||||
|
const options = { mediaPath: '/tmp/window.mkv' };
|
||||||
|
|
||||||
|
assert.ok(
|
||||||
|
buildMediaTimingPreviewArgs('/tmp/review.sock', options, 'darwin').includes(
|
||||||
|
'--audio-format=float',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
buildMediaTimingPreviewArgs('/tmp/review.sock', options, 'linux').some((arg) =>
|
||||||
|
arg.startsWith('--audio-format='),
|
||||||
|
),
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test('separates an option-like media path without adding optional audio arguments', () => {
|
test('separates an option-like media path without adding optional audio arguments', () => {
|
||||||
const args = buildMediaTimingPreviewArgs('/tmp/review.sock', {
|
const args = buildMediaTimingPreviewArgs('/tmp/review.sock', {
|
||||||
mediaPath: '--fullscreen',
|
mediaPath: '--fullscreen',
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ interface MediaTimingPreviewDeps {
|
|||||||
export function buildMediaTimingPreviewArgs(
|
export function buildMediaTimingPreviewArgs(
|
||||||
socketPath: string,
|
socketPath: string,
|
||||||
options: MediaTimingPreviewStartOptions,
|
options: MediaTimingPreviewStartOptions,
|
||||||
|
platform: NodeJS.Platform = process.platform,
|
||||||
): string[] {
|
): string[] {
|
||||||
const args = [
|
const args = [
|
||||||
'--no-config',
|
'--no-config',
|
||||||
@@ -66,6 +67,12 @@ export function buildMediaTimingPreviewArgs(
|
|||||||
if (options.absoluteTimestamps) {
|
if (options.absoluteTimestamps) {
|
||||||
args.push('--rebase-start-time=no');
|
args.push('--rebase-start-time=no');
|
||||||
}
|
}
|
||||||
|
if (platform === 'darwin') {
|
||||||
|
// coreaudio can reject planar float (what Opus decodes to) on Bluetooth outputs such as
|
||||||
|
// AirPods, and mpv then falls back to avfoundation. Its 2 s device buffer makes time-pos
|
||||||
|
// updates sparse and ends the clip well before the audio does, so the preview cursor jumps.
|
||||||
|
args.push('--audio-format=float');
|
||||||
|
}
|
||||||
args.push('--', options.mediaPath);
|
args.push('--', options.mediaPath);
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
@@ -170,7 +177,7 @@ export class MediaTimingPreviewSession {
|
|||||||
this.startupError = null;
|
this.startupError = null;
|
||||||
const child = this.deps.spawnProcess(
|
const child = this.deps.spawnProcess(
|
||||||
command,
|
command,
|
||||||
buildMediaTimingPreviewArgs(socketPath, { ...options, mediaPath }),
|
buildMediaTimingPreviewArgs(socketPath, { ...options, mediaPath }, this.deps.platform),
|
||||||
);
|
);
|
||||||
this.process = child;
|
this.process = child;
|
||||||
child.once('error', (error) => {
|
child.once('error', (error) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user