From 88cdec31221284ddc2bed7e5eb6c22e77e800b7a Mon Sep 17 00:00:00 2001 From: reimar Date: Fri, 23 Dec 2011 16:27:15 +0000 Subject: stream_cdda: various fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix cdda speed default value, range and use more robust condition. Based on patch by Ingo Brückl [ib wupperonline de]. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34458 b3059339-0415-0410-9bf9-f77b7e298cf2 Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang. Instead use it to set/unset PARANOIA_MODE_OVERLAP. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34459 b3059339-0415-0410-9bf9-f77b7e298cf2 Fail if trying to seek beyond the last chapter, not just if it is beyond the end of the disc. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34460 b3059339-0415-0410-9bf9-f77b7e298cf2 cdda: set position to an actual EOF position when we set EOF. This avoids some inconsistency like the stream indicating EOF but a read still returning more data. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34462 b3059339-0415-0410-9bf9-f77b7e298cf2 Allow PARANOIA_MODE_FULL with skipping. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34467 b3059339-0415-0410-9bf9-f77b7e298cf2 Don't call paranoia_modeset() for PARANOIA_MODE_DISABLE. cdparanoia destroys start sector information after such a call. Since it is pointless without setting a mode anyway, don't do it. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34468 b3059339-0415-0410-9bf9-f77b7e298cf2 Add comment to a condition that is just a hack around a cdparanoia bug. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34472 b3059339-0415-0410-9bf9-f77b7e298cf2 Add checks for errors in stream_cdda's get_track_by_sector(). git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34495 b3059339-0415-0410-9bf9-f77b7e298cf2 Fix seeking beyond EOF in stream_cdda to work with cache. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@34577 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cdda.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/stream/stream_cdda.c b/stream/stream_cdda.c index 317292faec..5e5f545501 100644 --- a/stream/stream_cdda.c +++ b/stream/stream_cdda.c @@ -73,7 +73,7 @@ static struct cdda_params { char* device; m_span_t span; } cdda_dflts = { - -1, + 0, 0, NULL, 0, @@ -87,11 +87,11 @@ static struct cdda_params { #define ST_OFF(f) M_ST_OFF(struct cdda_params,f) static const m_option_t cdda_params_fields[] = { - { "speed", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, + { "speed", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,0,100, NULL }, { "paranoia", ST_OFF(paranoia_mode), CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL }, { "generic-dev", ST_OFF(generic_dev), CONF_TYPE_STRING, 0, 0, 0, NULL }, { "sector-size", ST_OFF(sector_size), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, - { "overlap", ST_OFF(search_overlap), CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL }, + { "overlap", ST_OFF(search_overlap), CONF_TYPE_INT, M_OPT_RANGE,-1,75, NULL }, { "toc-bias", ST_OFF(toc_bias), CONF_TYPE_INT, 0, 0, 0, NULL }, { "toc-offset", ST_OFF(toc_offset), CONF_TYPE_INT, 0, 0, 0, NULL }, { "noskip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 0, 1, NULL }, @@ -185,6 +185,7 @@ static int seek(stream_t* s,off_t newpos) { sec = s->pos/CD_FRAMESIZE_RAW; if (s->pos < 0 || sec > p->end_sector) { s->eof = 1; + p->sector = p->end_sector + 1; return 0; } @@ -249,6 +250,7 @@ static int control(stream_t *stream, int cmd, void *arg) { { int start_track = get_track_by_sector(p, p->start_sector); int end_track = get_track_by_sector(p, p->end_sector); + if (start_track == -1 || end_track == -1) return STREAM_ERROR; *(unsigned int *)arg = end_track + 1 - start_track; return STREAM_OK; } @@ -257,11 +259,16 @@ static int control(stream_t *stream, int cmd, void *arg) { int r; unsigned int track = *(unsigned int *)arg; int start_track = get_track_by_sector(p, p->start_sector); + int end_track = get_track_by_sector(p, p->end_sector); int seek_sector; + if (start_track == -1 || end_track == -1) return STREAM_ERROR; track += start_track; - if (track >= p->cd->tracks) { - stream->eof = 1; - return STREAM_ERROR; + if (track > end_track) { + seek(stream, (p->end_sector + 1) * CD_FRAMESIZE_RAW); + // seeking beyond EOF should not be an error, + // the cache cannot handle changing stream pos and + // returning error. + return STREAM_OK; } seek_sector = track <= 0 ? p->start_sector : p->cd->disc_toc[track].dwStartSector; @@ -274,6 +281,7 @@ static int control(stream_t *stream, int cmd, void *arg) { { int start_track = get_track_by_sector(p, p->start_sector); int cur_track = get_track_by_sector(p, p->sector); + if (start_track == -1 || cur_track == -1) return STREAM_ERROR; *(unsigned int *)arg = cur_track - start_track; return STREAM_OK; } @@ -385,7 +393,7 @@ static int open_cdda(stream_t *st,int m, void* opts, int* file_format) { cdd->disc_toc[i].dwStartSector += offset; } - if(p->speed) + if(p->speed > 0) cdda_speed_set(cdd,p->speed); last_track = cdda_tracks(cdd); @@ -421,18 +429,28 @@ static int open_cdda(stream_t *st,int m, void* opts, int* file_format) { if(p->no_skip) mode |= PARANOIA_MODE_NEVERSKIP; + else + mode &= ~PARANOIA_MODE_NEVERSKIP; + + if(p->search_overlap > 0) + mode |= PARANOIA_MODE_OVERLAP; + else if(p->search_overlap == 0) + mode &= ~PARANOIA_MODE_OVERLAP; #ifndef CONFIG_LIBCDIO // HACK against libcdparanoia's stupid caching model that // queues up a huge number of requests leading to stuttering paranoia_cachemodel_size(priv->cdp, 24); - paranoia_modeset(cdd, mode); + // For some incomprehensible reason cdparanoia breaks the + // track->sector lookup of calling paranoia_modeset with + // PARANOIA_MODE_DISABLE + if (mode != PARANOIA_MODE_DISABLE) paranoia_modeset(cdd, mode); - if(p->search_overlap >= 0) + if(p->search_overlap > 0) paranoia_overlapset(cdd,p->search_overlap); #else paranoia_modeset(priv->cdp, mode); - if(p->search_overlap >= 0) + if(p->search_overlap > 0) paranoia_overlapset(priv->cdp,p->search_overlap); #endif -- cgit v1.2.3