protected override void SetMediaPosition(double pos) { Logger.LogTrace("DeezerRenderer::SetMediaPosition pos={0}", pos); if (FilterState != FilterState.Stopped) { if (_dzPlayer != IntPtr.Zero) { dz_error_t err; int resumePos = (int)pos; if (resumePos != RenderPosition) { err = DeezerApi.dz_player_seek(_dzPlayer, null, IntPtr.Zero, (UInt64)(resumePos * 1e6)); DeezerApi.HandleDzErrorCode("dz_player_seek", err); } if (_evtPlayerPaused.WaitOne(DZ_OPERATION_TIMEOUT) == false) { DeezerApi.HandleDzErrorCode("[Event toggled by dz_player_seek]", dz_error_t.DZ_ERROR_PLAYER_SEEK_TIMEOUT); } Logger.LogTrace("[Event toggled by dz_player_seek] => DZ_PLAYER_EVENT_RENDER_TRACK_PAUSED"); } } }
protected override void DoResumeRenderer(double fromPosition) { Logger.LogTrace("DeezerRenderer::DoResumeRenderer fromPosition={0}", fromPosition); dz_error_t err; if (_evtPlayerPaused.WaitOne(DZ_OPERATION_TIMEOUT) == false) { DeezerApi.HandleDzErrorCode("DeezerRenderer::DoResumeRenderer", dz_error_t.DZ_ERROR_PLAYER_PAUSE_NOT_STARTED); } Logger.LogTrace("DeezerRenderer::DoResumeRenderer player is now paused."); if (FilterState == FilterState.Paused) { if (_dzPlayer != IntPtr.Zero) { int resumePos = (int)fromPosition; if (resumePos != RenderPosition) { // dz_player_seek will trigger DZ_PLAYER_EVENT_MEDIASTREAM_DATA_READY_AFTER_SEEK // Upon completion, _evtPlayerStreamReadyAfterSeek will be set. _evtPlayerStreamReadyAfterSeek.Reset(); err = DeezerApi.dz_player_seek(_dzPlayer, null, IntPtr.Zero, (UInt64)(resumePos * 1e6)); DeezerApi.HandleDzErrorCode("dz_player_seek", err); if (_evtPlayerStreamReadyAfterSeek.WaitOne(DZ_OPERATION_TIMEOUT) == false) { DeezerApi.HandleDzErrorCode("dz_player_seek", dz_error_t.DZ_ERROR_PLAYER_SEEK_TIMEOUT); } Logger.LogTrace("dz_player_seek => DZ_PLAYER_EVENT_MEDIASTREAM_DATA_READY_AFTER_SEEK"); } err = DeezerApi.dz_player_resume(_dzPlayer, null, IntPtr.Zero); DeezerApi.HandleDzErrorCode("dz_player_resume", err); } } }