diff --git a/ember-stereo/src/helpers/sound-position-timestamp.js b/ember-stereo/src/helpers/sound-position-timestamp.js index 91b6ae66..3f9adbfc 100644 --- a/ember-stereo/src/helpers/sound-position-timestamp.js +++ b/ember-stereo/src/helpers/sound-position-timestamp.js @@ -31,11 +31,7 @@ export default class SoundPositionTimestamp extends StereoBaseIsHelper { let currentTime = this.sound?.currentTime; let startsAt = this.options?.startsAt; - if (startsAt && !this.sound?.isLoaded) { - return new Date(startsAt); - } - - if (currentTime) { + if (currentTime && this.sound?.isLoaded) { result = new Date(currentTime); } else if (startsAt) { result = add(new Date(startsAt), { diff --git a/ember-stereo/src/stereo-connections/base.js b/ember-stereo/src/stereo-connections/base.js index c14a4a4c..9505dcdd 100644 --- a/ember-stereo/src/stereo-connections/base.js +++ b/ember-stereo/src/stereo-connections/base.js @@ -9,6 +9,7 @@ import hasEqualUrls from '../-private/utils/has-equal-urls'; import { getOwner } from '@ember/application'; import { registerDestructor } from '@ember/destroyable'; import { task, animationFrame, timeout, didCancel } from 'ember-concurrency'; +import { macroCondition, isTesting } from '@embroider/macros'; /** * This is the base sound object from which other sound objects are derived. @@ -289,11 +290,15 @@ export default class Sound extends Evented { newPosition: v, }); - yield timeout(50); + if (macroCondition(isTesting())) { + // in testing, we don't want to wait for the next animation frame + } else { + yield timeout(50); + } - next(() => { - this._position = this._setPosition(v); - }); + // next(() => { + this._position = this._setPosition(v); + // }); } /* we both want to query for the playing sounds position, and fire change events diff --git a/test-app/tests/integration/helpers/sound-position-timestamp-test.js b/test-app/tests/integration/helpers/sound-position-timestamp-test.js index c2f7bbb7..edff75c3 100644 --- a/test-app/tests/integration/helpers/sound-position-timestamp-test.js +++ b/test-app/tests/integration/helpers/sound-position-timestamp-test.js @@ -1,7 +1,7 @@ import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupStereoTest } from 'ember-stereo/test-support/stereo-setup'; -import { render } from '@ember/test-helpers'; +import { render, settled } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import { add } from 'date-fns'; @@ -52,4 +52,23 @@ module('Integration | Helper | sound-position-timestamp', function (hooks) { assert.strictEqual(this.element.textContent.trim(), ''); }); + + test('it returns the correct timestamp when currentTime is provided', async function (assert) { + let service = this.owner.lookup('service:stereo'); + + this.url = '/good/5000/position.mp3'; + let { sound } = await service.play(this.url); + sound.position = 2000; + + this.startsAt = new Date('2023-10-02T00:00:00Z'); + + await render( + hbs`{{sound-position-timestamp this.url startsAt=this.startsAt}}` + ); + + assert.strictEqual( + this.element.textContent.trim(), + new Date('2023-10-02T00:00:02Z').toString() + ); + }); });