@jjlmoya/utils-hardware 1.23.0 → 1.24.0

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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/stereoAudioTest/bibliography.astro +14 -0
  8. package/src/tool/stereoAudioTest/bibliography.ts +16 -0
  9. package/src/tool/stereoAudioTest/component.astro +251 -0
  10. package/src/tool/stereoAudioTest/entry.ts +29 -0
  11. package/src/tool/stereoAudioTest/i18n/de.ts +229 -0
  12. package/src/tool/stereoAudioTest/i18n/en.ts +229 -0
  13. package/src/tool/stereoAudioTest/i18n/es.ts +229 -0
  14. package/src/tool/stereoAudioTest/i18n/fr.ts +229 -0
  15. package/src/tool/stereoAudioTest/i18n/id.ts +229 -0
  16. package/src/tool/stereoAudioTest/i18n/it.ts +229 -0
  17. package/src/tool/stereoAudioTest/i18n/ja.ts +229 -0
  18. package/src/tool/stereoAudioTest/i18n/ko.ts +229 -0
  19. package/src/tool/stereoAudioTest/i18n/nl.ts +229 -0
  20. package/src/tool/stereoAudioTest/i18n/pl.ts +229 -0
  21. package/src/tool/stereoAudioTest/i18n/pt.ts +229 -0
  22. package/src/tool/stereoAudioTest/i18n/ru.ts +229 -0
  23. package/src/tool/stereoAudioTest/i18n/sv.ts +229 -0
  24. package/src/tool/stereoAudioTest/i18n/tr.ts +229 -0
  25. package/src/tool/stereoAudioTest/i18n/zh.ts +229 -0
  26. package/src/tool/stereoAudioTest/index.ts +11 -0
  27. package/src/tool/stereoAudioTest/logic.ts +22 -0
  28. package/src/tool/stereoAudioTest/seo.astro +15 -0
  29. package/src/tool/stereoAudioTest/stereo-audio-test.css +411 -0
  30. package/src/tool/stereoAudioTest/ui.ts +24 -0
  31. package/src/tools.ts +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-hardware",
3
- "version": "1.23.0",
3
+ "version": "1.24.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -12,10 +12,11 @@ import { refreshRateDetector } from '../tool/refreshRateDetector/index';
12
12
  import { monitorGhostingTest } from '../tool/monitorGhostingTest/index';
13
13
  import { spectrumCanvas } from '../tool/colorAccuracyTest/index';
14
14
  import { upsRuntimeCalculator } from '../tool/upsRuntimeCalculator/index';
15
+ import { stereoAudioTest } from '../tool/stereoAudioTest/index';
15
16
 
16
17
  export const hardwareCategory: HardwareCategoryEntry = {
17
18
  icon: 'mdi:memory',
18
- tools: [pixelesPantalla, testTeclado, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, mouseScrollTest, estimadorSaludBateria, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator],
19
+ tools: [pixelesPantalla, testTeclado, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, mouseScrollTest, estimadorSaludBateria, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, stereoAudioTest],
19
20
  i18n: {
20
21
  en: () => import('./i18n/en').then((m) => m.content),
21
22
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -24,6 +24,8 @@ export { spectrumCanvas } from './tool/colorAccuracyTest/entry';
24
24
  export type { SpectrumCanvasLocaleContent } from './tool/colorAccuracyTest/entry';
25
25
  export { upsRuntimeCalculator } from './tool/upsRuntimeCalculator/entry';
26
26
  export type { UpsRuntimeCalculatorLocaleContent } from './tool/upsRuntimeCalculator/entry';
27
+ export { stereoAudioTest } from './tool/stereoAudioTest/entry';
28
+ export type { StereoAudioTestLocaleContent } from './tool/stereoAudioTest/entry';
27
29
  export { hardwareCategory } from './category';
28
30
  import { estimadorSaludBateria } from './tool/batteryHealthEstimator/entry';
29
31
  import { pixelesPantalla } from './tool/deadPixelTest/entry';
@@ -38,4 +40,5 @@ import { refreshRateDetector } from './tool/refreshRateDetector/entry';
38
40
  import { monitorGhostingTest } from './tool/monitorGhostingTest/entry';
39
41
  import { spectrumCanvas } from './tool/colorAccuracyTest/entry';
40
42
  import { upsRuntimeCalculator } from './tool/upsRuntimeCalculator/entry';
41
- export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, testRaton, mouseDoubleClickTest, mouseScrollTest, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator];
43
+ import { stereoAudioTest } from './tool/stereoAudioTest/entry';
44
+ export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, testRaton, mouseDoubleClickTest, mouseScrollTest, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas, upsRuntimeCalculator, stereoAudioTest];
package/src/index.ts CHANGED
@@ -30,3 +30,4 @@ export { REFRESH_RATE_DETECTOR_TOOL } from './tool/refreshRateDetector/index';
30
30
  export { MONITOR_GHOSTING_TEST_TOOL } from './tool/monitorGhostingTest/index';
31
31
  export { SPECTRUM_CANVAS_TOOL } from './tool/colorAccuracyTest/index';
32
32
  export { UPS_RUNTIME_CALCULATOR_TOOL } from './tool/upsRuntimeCalculator/index';
33
+ export { STEREO_AUDIO_TEST_TOOL } from './tool/stereoAudioTest/index';
@@ -21,8 +21,8 @@ describe('Locale Completeness Validation', () => {
21
21
  });
22
22
  });
23
23
 
24
- it('all 13 tools registered', () => {
25
- expect(ALL_TOOLS.length).toBe(13);
24
+ it('all 14 tools registered', () => {
25
+ expect(ALL_TOOLS.length).toBe(14);
26
26
  });
27
27
  });
28
28
 
@@ -4,8 +4,8 @@ import { hardwareCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
- it('should have 13 tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(13);
7
+ it('should have 14 tools in ALL_TOOLS', () => {
8
+ expect(ALL_TOOLS.length).toBe(14);
9
9
  });
10
10
 
11
11
  it('hardwareCategory should be defined', () => {
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { stereoAudioTest } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await stereoAudioTest.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,16 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'Microsoft Support - Fix sound or audio problems in Windows',
6
+ url: 'https://support.microsoft.com/windows/fix-sound-or-audio-problems-in-windows-73025246-b61c-40fb-671a-2535c7cd56c8',
7
+ },
8
+ {
9
+ name: 'Apple Support - Adjust audio balance and mono audio on Mac',
10
+ url: 'https://support.apple.com/guide/mac-help/change-sound-output-settings-mchlp2256/mac',
11
+ },
12
+ {
13
+ name: 'Crutchfield - Speaker placement for stereo listening',
14
+ url: 'https://www.crutchfield.com/learn/home-stereo-speaker-placement.html',
15
+ },
16
+ ];
@@ -0,0 +1,251 @@
1
+ ---
2
+ import { Icon } from 'astro-icon/components';
3
+ import type { KnownLocale } from '../../types';
4
+ import type { StereoAudioTestUI } from './ui';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ ui?: Record<string, unknown>;
9
+ }
10
+
11
+ const { ui } = Astro.props;
12
+ const t = (ui ?? {}) as StereoAudioTestUI;
13
+ ---
14
+
15
+ <div
16
+ class="sat-root"
17
+ data-config={JSON.stringify({
18
+ left: t.left,
19
+ center: t.center,
20
+ right: t.right,
21
+ sweep: t.sweep,
22
+ stop: t.stop,
23
+ activeIdle: t.activeIdle,
24
+ activeLeft: t.activeLeft,
25
+ activeCenter: t.activeCenter,
26
+ activeRight: t.activeRight,
27
+ activeSweep: t.activeSweep,
28
+ secondsUnit: t.secondsUnit,
29
+ })}
30
+ >
31
+ <section class="sat-panel">
32
+ <div class="sat-stage" aria-live="polite">
33
+ <div class="sat-speaker sat-left">
34
+ <span></span>
35
+ <strong>{t.leftSpeaker}</strong>
36
+ </div>
37
+ <div class="sat-orbit" aria-hidden="true">
38
+ <i data-dot></i>
39
+ <b>{t.centerLine}</b>
40
+ </div>
41
+ <div class="sat-speaker sat-right">
42
+ <span></span>
43
+ <strong>{t.rightSpeaker}</strong>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="sat-controls">
48
+ <div class="sat-buttons">
49
+ <button type="button" data-play="left"><Icon name="mdi:play" />{t.left}</button>
50
+ <button type="button" data-play="center"><Icon name="mdi:play" />{t.center}</button>
51
+ <button type="button" data-play="right"><Icon name="mdi:play" />{t.right}</button>
52
+ <button type="button" data-play="sweep"><Icon name="mdi:play" />{t.sweep}</button>
53
+ <button type="button" data-stop>{t.stop}</button>
54
+ </div>
55
+
56
+ <div class="sat-sliders">
57
+ <label class="sat-control-row">
58
+ <span>{t.volume}</span>
59
+ <strong data-volume-label>24%</strong>
60
+ <input data-volume type="range" min="1" max="80" value="24" />
61
+ </label>
62
+ <label class="sat-control-row" data-duration-control>
63
+ <span>{t.duration}</span>
64
+ <strong><output data-duration-label>3</output>{t.secondsUnit}</strong>
65
+ <input data-duration type="range" min="1" max="8" value="3" />
66
+ </label>
67
+ <label class="sat-control-row">
68
+ <span>{t.tone}</span>
69
+ <strong><output data-frequency-label>520</output>{t.hertzUnit}</strong>
70
+ <input data-frequency type="range" min="220" max="1200" step="10" value="520" />
71
+ </label>
72
+ </div>
73
+
74
+ <label class="sat-loop">
75
+ <input data-loop type="checkbox" />
76
+ <span>
77
+ <strong>{t.infiniteMode}</strong>
78
+ <em>{t.infiniteModeHint}</em>
79
+ </span>
80
+ </label>
81
+
82
+ <div class="sat-readout">
83
+ <span>{t.balance}</span>
84
+ <strong data-status>{t.activeIdle}</strong>
85
+ <meter min="-1" max="1" low="-0.65" high="0.65" optimum="0" value="0" data-meter></meter>
86
+ </div>
87
+ <p>{t.safety}</p>
88
+ </div>
89
+ </section>
90
+ </div>
91
+
92
+ <link rel="stylesheet" href="./stereo-audio-test.css" />
93
+
94
+ <script>
95
+ type Channel = 'left' | 'center' | 'right' | 'sweep';
96
+ interface Config {
97
+ left: string;
98
+ center: string;
99
+ right: string;
100
+ sweep: string;
101
+ stop: string;
102
+ activeIdle: string;
103
+ activeLeft: string;
104
+ activeCenter: string;
105
+ activeRight: string;
106
+ activeSweep: string;
107
+ secondsUnit: string;
108
+ }
109
+
110
+ const root = document.querySelector<HTMLElement>('.sat-root');
111
+ const config = JSON.parse(root?.dataset.config ?? '{}') as Config;
112
+ const audioState: {
113
+ context?: AudioContext;
114
+ oscillator?: OscillatorNode;
115
+ gain?: GainNode;
116
+ stopTimer?: number;
117
+ sweepTimer?: number;
118
+ } = {};
119
+ const els = {
120
+ dot: root?.querySelector<HTMLElement>('[data-dot]'),
121
+ meter: root?.querySelector<HTMLMeterElement>('[data-meter]'),
122
+ status: root?.querySelector<HTMLElement>('[data-status]'),
123
+ volume: root?.querySelector<HTMLInputElement>('[data-volume]'),
124
+ volumeLabel: root?.querySelector<HTMLElement>('[data-volume-label]'),
125
+ duration: root?.querySelector<HTMLInputElement>('[data-duration]'),
126
+ durationControl: root?.querySelector<HTMLElement>('[data-duration-control]'),
127
+ durationLabel: root?.querySelector<HTMLOutputElement>('[data-duration-label]'),
128
+ frequency: root?.querySelector<HTMLInputElement>('[data-frequency]'),
129
+ frequencyLabel: root?.querySelector<HTMLOutputElement>('[data-frequency-label]'),
130
+ loop: root?.querySelector<HTMLInputElement>('[data-loop]'),
131
+ };
132
+
133
+ function ensureContext() {
134
+ audioState.context ??= new AudioContext();
135
+ return audioState.context;
136
+ }
137
+
138
+ function play(channel: Channel) {
139
+ stop();
140
+ const context = ensureContext();
141
+ const oscillator = context.createOscillator();
142
+ const gain = context.createGain();
143
+ const panner = context.createStereoPanner();
144
+ const duration = readNumber(els.duration, 3);
145
+ const volume = readNumber(els.volume, 24) / 100;
146
+ const frequency = readNumber(els.frequency, 520);
147
+
148
+ oscillator.type = 'sine';
149
+ oscillator.frequency.value = frequency;
150
+ gain.gain.setValueAtTime(0.0001, context.currentTime);
151
+ gain.gain.exponentialRampToValueAtTime(Math.max(0.0001, volume), context.currentTime + 0.03);
152
+ oscillator.connect(gain).connect(panner).connect(context.destination);
153
+ oscillator.start();
154
+ audioState.oscillator = oscillator;
155
+ audioState.gain = gain;
156
+
157
+ const shouldLoop = Boolean(els.loop?.checked);
158
+ if (channel === 'sweep') {
159
+ runSweep(panner, duration);
160
+ } else {
161
+ setPan(panner, getPan(channel));
162
+ }
163
+ if (!shouldLoop) {
164
+ gain.gain.exponentialRampToValueAtTime(0.0001, context.currentTime + duration);
165
+ oscillator.stop(context.currentTime + duration + 0.05);
166
+ audioState.stopTimer = window.setTimeout(stop, (duration + 0.08) * 1000);
167
+ }
168
+ setStatus(channel);
169
+ }
170
+
171
+ function runSweep(panner: StereoPannerNode, duration: number) {
172
+ const start = performance.now();
173
+ const tick = (now: number) => {
174
+ const progress = ((now - start) % (duration * 1000)) / (duration * 1000);
175
+ const pan = Math.sin(progress * Math.PI * 2);
176
+ setPan(panner, pan);
177
+ audioState.sweepTimer = requestAnimationFrame(tick);
178
+ };
179
+ audioState.sweepTimer = requestAnimationFrame(tick);
180
+ }
181
+
182
+ function setPan(panner: StereoPannerNode, pan: number) {
183
+ panner.pan.value = pan;
184
+ root?.style.setProperty('--sat-pan', String(pan));
185
+ els.meter!.value = pan;
186
+ }
187
+
188
+ function getPan(channel: Channel) {
189
+ if (channel === 'left') return -1;
190
+ if (channel === 'right') return 1;
191
+ return 0;
192
+ }
193
+
194
+ function stop() {
195
+ if (audioState.stopTimer) window.clearTimeout(audioState.stopTimer);
196
+ if (audioState.sweepTimer) cancelAnimationFrame(audioState.sweepTimer);
197
+ if (audioState.oscillator) {
198
+ try {
199
+ audioState.oscillator.stop();
200
+ } catch {
201
+ }
202
+ audioState.oscillator = undefined;
203
+ }
204
+ audioState.gain = undefined;
205
+ root?.style.setProperty('--sat-pan', '0');
206
+ if (els.meter) els.meter.value = 0;
207
+ if (els.status) els.status.textContent = config.activeIdle;
208
+ }
209
+
210
+ function setStatus(channel: Channel) {
211
+ const labels = {
212
+ left: config.activeLeft,
213
+ center: config.activeCenter,
214
+ right: config.activeRight,
215
+ sweep: config.activeSweep,
216
+ };
217
+ if (els.status) els.status.textContent = labels[channel];
218
+ }
219
+
220
+ function readNumber(input: HTMLInputElement | null | undefined, fallback: number) {
221
+ return input ? Number(input.value) : fallback;
222
+ }
223
+
224
+ function syncLabels() {
225
+ if (els.volumeLabel && els.volume) els.volumeLabel.textContent = `${els.volume.value}%`;
226
+ if (els.durationLabel && els.duration) els.durationLabel.textContent = els.duration.value;
227
+ if (els.frequencyLabel && els.frequency) els.frequencyLabel.textContent = els.frequency.value;
228
+ syncLoopState();
229
+ updateActiveVolume();
230
+ }
231
+
232
+ function syncLoopState() {
233
+ const isLooping = Boolean(els.loop?.checked);
234
+ if (els.duration) els.duration.disabled = isLooping;
235
+ els.durationControl?.classList.toggle('is-disabled', isLooping);
236
+ }
237
+
238
+ function updateActiveVolume() {
239
+ if (!audioState.context || !audioState.gain || !els.volume) return;
240
+ const volume = Math.max(0.0001, Number(els.volume.value) / 100);
241
+ audioState.gain.gain.setTargetAtTime(volume, audioState.context.currentTime, 0.015);
242
+ }
243
+
244
+ root?.querySelectorAll<HTMLButtonElement>('[data-play]').forEach((button) => {
245
+ button.addEventListener('click', () => play(button.dataset.play as Channel));
246
+ });
247
+ root?.querySelector<HTMLButtonElement>('[data-stop]')?.addEventListener('click', stop);
248
+ [els.volume, els.duration, els.frequency].forEach((input) => input?.addEventListener('input', syncLabels));
249
+ els.loop?.addEventListener('change', syncLabels);
250
+ syncLabels();
251
+ </script>
@@ -0,0 +1,29 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+ import type { StereoAudioTestUI } from './ui';
3
+
4
+ export type StereoAudioTestLocaleContent = ToolLocaleContent<StereoAudioTestUI>;
5
+
6
+ export const stereoAudioTest: HardwareToolEntry<StereoAudioTestUI> = {
7
+ id: 'stereo-audio-test',
8
+ icons: {
9
+ bg: 'mdi:speaker-multiple',
10
+ fg: 'mdi:surround-sound',
11
+ },
12
+ i18n: {
13
+ de: () => import('./i18n/de').then((m) => m.content),
14
+ en: () => import('./i18n/en').then((m) => m.content),
15
+ es: () => import('./i18n/es').then((m) => m.content),
16
+ fr: () => import('./i18n/fr').then((m) => m.content),
17
+ id: () => import('./i18n/id').then((m) => m.content),
18
+ it: () => import('./i18n/it').then((m) => m.content),
19
+ ja: () => import('./i18n/ja').then((m) => m.content),
20
+ ko: () => import('./i18n/ko').then((m) => m.content),
21
+ nl: () => import('./i18n/nl').then((m) => m.content),
22
+ pl: () => import('./i18n/pl').then((m) => m.content),
23
+ pt: () => import('./i18n/pt').then((m) => m.content),
24
+ ru: () => import('./i18n/ru').then((m) => m.content),
25
+ sv: () => import('./i18n/sv').then((m) => m.content),
26
+ tr: () => import('./i18n/tr').then((m) => m.content),
27
+ zh: () => import('./i18n/zh').then((m) => m.content),
28
+ },
29
+ };
@@ -0,0 +1,229 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { StereoAudioTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'stereo-audio-pruefung';
7
+ const title = 'Stereo Audiotest';
8
+ const description = 'Ueberpruefen Sie linke und rechte Lautsprecherkanaele, Stereo Balance, Verkabelungsrichtung und Kopfhoererabbildung mit browsergenerierten Testtoenen.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Wie teste ich linke und rechte Lautsprecher online?',
13
+ answer: 'Starten Sie mit niedriger Lautstärke, drücken Sie Links und dann Rechts. Der linke Ton sollte nur aus dem linken Lautsprecher oder der linken Ohrmuschel kommen, und der rechte Ton sollte nur von der rechten Seite kommen. Verwenden Sie Mitte, um zu bestätigen, dass beide Seiten gleichmäßig spielen.',
14
+ },
15
+ {
16
+ question: 'Warum spielen beide Lautsprecher während des Links- oder Rechtstests?',
17
+ answer: 'Einige Geräte, Betriebssysteme, Bluetooth-Lautsprecher, Mono-Modi, Eingabehilfen oder Audioverbesserungen mischen Stereo zu Mono herunter. Überprüfen Sie System-Balance, Mono-Audio-Einstellungen, Kabelverdrahtung und app-spezifische Audioeffekte.',
18
+ },
19
+ {
20
+ question: 'Kann dies vertauschte Lautsprecherkabel diagnostizieren?',
21
+ answer: 'Ja. Wenn die Links-Taste aus dem rechten Lautsprecher und die Rechts-Taste aus dem linken Lautsprecher spielt, ist der Ausgabepfad irgendwo zwischen Computer, Kabel, Verstärker, Lautsprechern oder Kopfhörern vertauscht.',
22
+ },
23
+ {
24
+ question: 'Ist ein Sinuston für Lautsprecher und Kopfhörer sicher?',
25
+ answer: 'Ein kurzer Sinuston bei moderater Lautstärke ist normalerweise sicher. Vermeiden Sie hohe Lautstärke, lange Sitzungen oder sehr hohe Frequenzen, insbesondere bei Kopfhörern, kleinen Laptop-Lautsprechern oder unbekannten Verstärkern.',
26
+ },
27
+ {
28
+ question: 'Beeinflusst der Browser den Stereotest?',
29
+ answer: 'Das Tool verwendet den Web Audio API StereoPannerNode. Es ist in modernen Browsern zuverlässig, aber die endgültige Ausgabe hängt dennoch von Betriebssystem-Routing, Treibern, Bluetooth-Codecs, externen DACs und Lautsprecherverkabelung ab.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Eine leise Startlautstärke einstellen',
36
+ text: 'Senken Sie die Systemlautstärke und verwenden Sie den Lautstärkeregler des Tools, bevor Sie einen Testton abspielen.',
37
+ },
38
+ {
39
+ name: 'Jede Seite testen',
40
+ text: 'Drücken Sie Links und Rechts. Jeder Ton sollte eindeutig auf den passenden Lautsprecher oder die Kopfhörerseite beschränkt sein.',
41
+ },
42
+ {
43
+ name: 'Center-Balance prüfen',
44
+ text: 'Drücken Sie Mitte. Der Ton sollte zwischen beiden Lautsprechern zentriert erscheinen, nicht stark zu einer Seite gezogen.',
45
+ },
46
+ {
47
+ name: 'Sweep verwenden',
48
+ text: 'Führen Sie Sweep aus, um Bewegung über das Stereofeld zu hören und Aussetzer, vertauschte Verkabelung oder ungleichmäßige Abbildung zu erkennen.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
83
+ inLanguage: 'de',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<StereoAudioTestUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faq: faqData,
91
+ bibliography,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ seo: [
95
+ {
96
+ type: 'title',
97
+ text: 'Linker und rechter Lautsprechertest online',
98
+ level: 2,
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Verwenden Sie diesen Online-Stereo-Audiotest, um zu überprüfen, ob Ihre linken und rechten Lautsprecher, Kopfhörer, Ohrhörer, Soundbar, DAC, Verstärker oder Monitorlautsprecher korrekt geroutet sind. Das Tool spielt browsergenerierte Töne über den linken Kanal, rechten Kanal, beide Kanäle oder einen beweglichen Stereosweep ab, damit Sie schnell vertauschte Kanäle, Mono-Ausgabe, schwache Lautsprecher, Balance-Probleme und Verkabelungsfehler erkennen können, ohne Audiosoftware installieren zu müssen.',
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: 'Ein korrektes Stereo-Setup bewahrt die Richtung: Der linke Testton sollte nur aus dem linken Lautsprecher oder der linken Ohrmuschel kommen, der rechte Testton sollte nur von der rechten Seite kommen und der Center-Ton sollte zwischen beiden Seiten gleichmäßig ausbalanciert klingen. Wenn der Ton auf der falschen Seite, gleichzeitig auf beiden Seiten oder auf einer Seite deutlich lauter erscheint, liegt das Problem meist in den Ausgabeeinstellungen, dem Mono-Eingabehilfemodus, der Kabelverdrahtung, dem Bluetooth-Routing, der Lautsprecheraufstellung oder Audioverbesserungssoftware.',
107
+ },
108
+ {
109
+ type: 'table',
110
+ headers: ['Taste', 'Was Sie hören sollten', 'Zur Diagnose verwenden'],
111
+ rows: [
112
+ ['Links', 'Ton nur vom linken Lautsprecher, linken Kopfhörertreiber oder linken Ohrhörer.', 'Vertauschte Kabel, falsche Lautsprecheraufstellung, Mono-Ausgabe oder Kanal-Neuzuordnung.'],
113
+ ['Rechts', 'Ton nur vom rechten Lautsprecher, rechten Kopfhörertreiber oder rechten Ohrhörer.', 'Vertauschte Ausgänge, falsche Adapterverkabelung oder Treibereffekte, die die Kanalreihenfolge ändern.'],
114
+ ['Mitte', 'Ton erscheint in der Mitte, da beide Kanäle gleichmäßig spielen.', 'System-Balance-Versatz, ein schwacher Lautsprecher, verstopftes Ohrhörer-Gitter oder ungleiche Verstärkerverstärkung.'],
115
+ ['Sweep', 'Ton bewegt sich sanft über das Stereobild von Seite zu Seite.', 'Aussetzer, instabile Bluetooth-Verbindungen, Phasenprobleme, virtuelle Surround-Artefakte oder ungleichmäßige Abbildung.'],
116
+ ],
117
+ },
118
+ {
119
+ type: 'title',
120
+ text: 'Die häufigsten Stereoprobleme, die dieser Test findet',
121
+ level: 3,
122
+ },
123
+ {
124
+ type: 'list',
125
+ items: [
126
+ 'Linker und rechter Kanal sind vertauscht: Die linke Taste spielt auf der rechten Seite oder die rechte Taste spielt auf der linken Seite.',
127
+ 'Stereo ist zu Mono zusammengefallen: Links, rechts und Mitte klingen alle fast identisch aus beiden Lautsprechern.',
128
+ 'Eine Seite ist leiser: Center-Audio zieht zu einem Lautsprecher, auch wenn der System-Balance-Regler zentriert aussieht.',
129
+ 'Kopfhörer sind falsch verkabelt oder getragen: Spiel-Schritte, Musik-Panning und Videoanrufe fühlen sich räumlich verwirrend an.',
130
+ 'Bluetooth- oder USB-Audio wird verarbeitet: Soundbars, Docks, Headsets und TV-Modi können das Signal heruntermischen oder virtualisieren.',
131
+ 'Lautsprecheraufstellung ist irreführend: Ein Lautsprecher zu nah an einer Wand, durch Möbel blockiert oder weiter entfernt, kann das Center-Bild verschieben.',
132
+ ],
133
+ },
134
+ {
135
+ type: 'title',
136
+ text: 'So beheben Sie vertauschte linke und rechte Audio-Kanäle',
137
+ level: 3,
138
+ },
139
+ {
140
+ type: 'list',
141
+ items: [
142
+ 'Tauschen Sie bei kabelgebundenen Lautsprechern die linken und rechten Stecker am Verstärker, Audio-Interface, DAC oder Computerausgang.',
143
+ 'Stellen Sie bei passiven Lautsprechern sicher, dass der linke Lautsprecher an den linken Verstärkeranschlüssen und der rechte Lautsprecher an den rechten Anschlüssen angeschlossen ist.',
144
+ 'Überprüfen Sie bei Kopfhörern, ob sie in der richtigen Ausrichtung getragen werden, und testen Sie ohne Adapter, Verlängerungskabel oder Splitterkabel.',
145
+ 'Überprüfen Sie unter Windows oder macOS die Ausgabebalance und deaktivieren Sie Mono-Audio in den Eingabehilfen- oder Soundeinstellungen.',
146
+ 'Deaktivieren Sie bei Bluetooth-Lautsprechern und Soundbars virtuellen Surround, Party-Modus, Dual-Audio, Raumkorrektur oder TV-Soundmodi während des Tests.',
147
+ 'Überprüfen Sie bei Audio-Interfaces, DAWs und Mischern das Kanal-Routing, Pan-Regler, Monitor-Mix-Einstellungen und alle vom Hersteller bereitgestellten Software-Mixer.',
148
+ ],
149
+ },
150
+ {
151
+ type: 'title',
152
+ text: 'So interpretieren Sie den Center-Lautsprechertest',
153
+ level: 3,
154
+ },
155
+ {
156
+ type: 'paragraph',
157
+ html: 'Der Center-Ton ist kein separater physischer Center-Lautsprecher in einem normalen Zweikanal-Setup. Es ist dasselbe Signal, das gleichmäßig an links und rechts gesendet wird. Bei Kopfhörern sollte es sich zentriert im Kopf anfühlen; bei Lautsprechern sollte es ein Phantom-Center zwischen ihnen bilden. Wenn es nach links oder rechts lehnt, überprüfen Sie System-Balance, Lautsprecherabstand, Lautsprecherwinkel, Lautstärkeregler, Verstärker-Trimmung, Ohrhörer-Passform, Staub im Treibergitter und ob ein Lautsprecher teilweise blockiert oder defekt ist.',
158
+ },
159
+ {
160
+ type: 'table',
161
+ headers: ['Was passiert', 'Wahrscheinliche Ursache', 'Nächster Schritt'],
162
+ rows: [
163
+ ['Links spielt von beiden Seiten', 'Mono-Audio, Downmixing oder räumliche Audioverarbeitung.', 'Deaktivieren Sie Mono-Ausgabe und virtuellen Surround und testen Sie erneut.'],
164
+ ['Links spielt von der rechten Seite', 'Kanäle sind irgendwo in der Wiedergabekette vertauscht.', 'Tauschen Sie Kabel oder ändern Sie das Kanal-Routing im Treiber, Mixer oder Verstärker.'],
165
+ ['Mitte ist auf einer Seite lauter', 'Balance, Aufstellung, Treiberschaden, Ohrpassform oder blockiertes Lautsprechergitter.', 'Vergleichen Sie mit einem anderen Kopfhörer oder Lautsprecherpaar und überprüfen Sie die physische Aufstellung.'],
166
+ ['Sweep springt oder verschwindet', 'Bluetooth-Instabilität, Audioverbesserungsartefakte oder ein defektes Kabel/Stecker.', 'Testen Sie mit kabelgebundener Ausgabe oder einem anderen Kabel, um das schwache Glied zu isolieren.'],
167
+ ],
168
+ },
169
+ {
170
+ type: 'title',
171
+ text: 'Kopfhörer- und Ohrhörer-Links-Rechts-Test',
172
+ level: 3,
173
+ },
174
+ {
175
+ type: 'paragraph',
176
+ html: 'Für Kopfhörer und Ohrhörer ist der Links/Rechts-Test besonders nützlich vor dem Spielen, Audiobearbeitung, Filme schauen oder an Anrufen teilnehmen. Setzen Sie das Headset normal auf, starten Sie mit niedriger Lautstärke, drücken Sie Links und Rechts und bestätigen Sie, dass jeder Ton auf dem richtigen Ohr ankommt. Wenn beide Seiten gleich klingen, verwendet Ihr Gerät möglicherweise Mono-Audio. Wenn eine Seite dumpf oder leiser ist, reinigen Sie das Ohrhörer-Gitter, setzen Sie den Ohrstöpsel neu ein, überprüfen Sie das Kabel und vergleichen Sie mit einem anderen Ausgabegerät.',
177
+ },
178
+ {
179
+ type: 'title',
180
+ text: 'Sichere Audiotest-Tipps',
181
+ level: 3,
182
+ },
183
+ {
184
+ type: 'list',
185
+ items: [
186
+ 'Starten Sie mit niedriger Systemlautstärke, insbesondere bei Kopfhörern.',
187
+ 'Verwenden Sie Endlosschleife bis Stopp nur, wenn Sie aktiv kontinuierlichen Ton für Kabelverfolgung, Aufstellung oder Balance-Einstellung benötigen.',
188
+ 'Halten Sie Testtöne kurz bei kleinen Lautsprechern; kontinuierliche Sinuswellen können schnell unangenehm werden.',
189
+ 'Vermeiden Sie maximale Verstärkung bei kleinen Laptop-Lautsprechern und unbekannten Verstärkern.',
190
+ 'Setzen Sie Kopfhörer nicht auf Ihre Ohren, bevor Sie bestätigt haben, dass die Lautstärke sicher ist.',
191
+ 'Wiederholen Sie nach dem Wechseln von Kabeln oder Einstellungen die Links-, Rechts-, Center- und Sweep-Tests in dieser Reihenfolge.',
192
+ 'Kombinieren Sie für Studio- oder Heimkino-Kalibrierung diesen Schnelltest mit einem SPL-Messgerät oder der Receiver-Kalibrierungsroutine.',
193
+ ],
194
+ },
195
+ {
196
+ type: 'title',
197
+ text: 'Schnelldiagnose',
198
+ level: 3,
199
+ },
200
+ {
201
+ type: 'paragraph',
202
+ html: 'Wenn links und rechts vertauscht sind, überprüfen Sie zuerst die physische Verkabelung, da dies die schnellste Lösung für Desktop-Lautsprecher, Verstärker und Audio-Interfaces ist. Wenn beide Tasten von beiden Seiten spielen, suchen Sie nach Mono-Ausgabe, räumlichem Audio, virtuellem Surround oder einem Gerät, das Stereo absichtlich heruntermischt. Wenn die Mitte außermittig ist, aber links und rechts korrekt geroutet sind, liegt das Problem normalerweise an Balance, Aufstellung, Ohrpassform, blockierten Gittern oder ungleicher Lautsprecherausgabe.',
203
+ },
204
+ ],
205
+ ui: {
206
+ left: 'Links',
207
+ center: 'Mitte',
208
+ right: 'Rechts',
209
+ sweep: 'Sweep',
210
+ stop: 'Stopp',
211
+ volume: 'Lautstärke',
212
+ duration: 'Dauer',
213
+ infiniteMode: 'Endlosschleife',
214
+ infiniteModeHint: 'Hält einen Kanal für kontinuierliche Tests am Laufen.',
215
+ secondsUnit: 's',
216
+ hertzUnit: 'Hz',
217
+ tone: 'Ton',
218
+ balance: 'Balance',
219
+ activeIdle: 'Bereit',
220
+ activeLeft: 'Spiele linken Kanal',
221
+ activeCenter: 'Spiele zentrierten Ton',
222
+ activeRight: 'Spiele rechten Kanal',
223
+ activeSweep: 'Sweep über das Stereofeld',
224
+ safety: 'Leise starten. Testtöne können über Kopfhörer, Verstärker und kleine Laptop-Lautsprecher laut sein.',
225
+ leftSpeaker: 'Linker Lautsprecher',
226
+ rightSpeaker: 'Rechter Lautsprecher',
227
+ centerLine: 'Stereofeld',
228
+ },
229
+ };