diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2011-12-23 16:27:15 +0000 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2012-04-28 03:05:04 +0300 |
commit | 61c2365dd862de11981a429876da53fb4480f6e4 (patch) | |
tree | 3748084b2d32b5f2b99d2eee6b8d02468b5eaa2c /stream | |
parent | 4251af8d5ddfd664edda2f5ec4869f228c2ee7a5 (diff) | |
download | mpv-61c2365dd862de11981a429876da53fb4480f6e4.tar.bz2 mpv-61c2365dd862de11981a429876da53fb4480f6e4.tar.xz |
stream_cdda: various fixes
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
Diffstat (limited to 'stream')
-rw-r--r-- | stream/stream_cdda.c | 38 |
1 files 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 |