mirror of
https://github.com/claunia/libcdio-osx.git
synced 2026-09-24 15:54:43 +00:00
Remove more paranoia code
This commit is contained in:
12
src/cd-paranoia/.gitignore
vendored
12
src/cd-paranoia/.gitignore
vendored
@@ -1,12 +0,0 @@
|
||||
/*.exe
|
||||
/*.o
|
||||
/.deps
|
||||
/.libs
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/cd-paranoia
|
||||
/*.orig
|
||||
/*~
|
||||
/*.rej
|
||||
/usage.h
|
||||
/usage.txt
|
||||
@@ -1,57 +0,0 @@
|
||||
# Copyright (C) 2004, 2005, 2006, 2007, 2008,
|
||||
# Rocky Bernstein <rocky@gnu.org>
|
||||
# Copyright (C) 1998 Monty xiphmont@mit.edu
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
transform = s,cd-paranoia,@CDPARANOIA_NAME@,
|
||||
|
||||
if BUILD_CD_PARANOIA
|
||||
|
||||
SUBDIRS = doc
|
||||
|
||||
GETOPT_C = getopt1.c getopt.c
|
||||
|
||||
EXTRA_DIST = usage.txt.in usage-copy.h pod2c.pl \
|
||||
doc/FAQ.txt doc/overlapdef.txt $(GETOPT_C) getopt.h
|
||||
|
||||
noinst_HEADERS = header.h report.h $(GETOPT_H)
|
||||
|
||||
cd_paranoia_SOURCES = cd-paranoia.c \
|
||||
buffering_write.c buffering_write.h \
|
||||
header.c report.c utils.h version.h $(GETOPT_C)
|
||||
|
||||
cd_paranoia_LDADD = $(LIBCDIO_LIBS) $(LIBCDIO_CDDA_LIBS) $(LIBCDIO_PARANOIA_LIBS) $(LTLIBICONV)
|
||||
|
||||
cd_paranoia_DEPENDENCIES = $(LIBCDIO_DEPS) $(LIBCDIO_CDDA_LIBS) $(LIBCDIO_PARANOIA_LIBS)
|
||||
|
||||
bin_PROGRAMS = cd-paranoia
|
||||
|
||||
INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS)
|
||||
|
||||
cd-paranoia.$(OBJEXT): usage.h
|
||||
|
||||
#: create header file used in help text: the "usage" help.
|
||||
if HAVE_PERL
|
||||
usage.h: usage.txt $(srcdir)/pod2c.pl
|
||||
$(PERL) $(srcdir)/pod2c.pl usage.txt >usage.h
|
||||
else
|
||||
usage.h: usage-copy.h
|
||||
cp usage-copy.h $@
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
MOSTLYCLEANFILES = usage.h usage.txt
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
/*
|
||||
$Id: buffering_write.c,v 1.4 2008/06/19 15:44:28 flameeyes Exp $
|
||||
|
||||
Copyright (C) 2004, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 1998, 1999 Monty <xiphmont@mit.edu>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Eliminate teeny little writes. patch submitted by
|
||||
Rob Ross <rbross@parl.ces.clemson.edu> --Monty 19991008 */
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define OUTBUFSZ 32*1024
|
||||
|
||||
#include "utils.h"
|
||||
#include "buffering_write.h"
|
||||
|
||||
|
||||
/* GLOBALS FOR BUFFERING CALLS */
|
||||
static int bw_fd = -1;
|
||||
static long bw_pos = 0;
|
||||
static char bw_outbuf[OUTBUFSZ];
|
||||
|
||||
|
||||
|
||||
static long int
|
||||
blocking_write(int outf, char *buffer, long num){
|
||||
long int words=0,temp;
|
||||
|
||||
while(words<num){
|
||||
temp=write(outf,buffer+words,num-words);
|
||||
if(temp==-1){
|
||||
if(errno!=EINTR && errno!=EAGAIN)
|
||||
return(-1);
|
||||
temp=0;
|
||||
}
|
||||
words+=temp;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/** buffering_write() - buffers data to a specified size before writing.
|
||||
*
|
||||
* Restrictions:
|
||||
* - MUST CALL BUFFERING_CLOSE() WHEN FINISHED!!!
|
||||
*
|
||||
*/
|
||||
long int
|
||||
buffering_write(int fd, char *buffer, long num)
|
||||
{
|
||||
if (fd != bw_fd) {
|
||||
/* clean up after buffering for some other file */
|
||||
if (bw_fd >= 0 && bw_pos > 0) {
|
||||
if (blocking_write(bw_fd, bw_outbuf, bw_pos)) {
|
||||
perror("write (in buffering_write, flushing)");
|
||||
}
|
||||
}
|
||||
bw_fd = fd;
|
||||
bw_pos = 0;
|
||||
}
|
||||
|
||||
if (bw_pos + num > OUTBUFSZ) {
|
||||
/* fill our buffer first, then write, then modify buffer and num */
|
||||
memcpy(&bw_outbuf[bw_pos], buffer, OUTBUFSZ - bw_pos);
|
||||
if (blocking_write(fd, bw_outbuf, OUTBUFSZ)) {
|
||||
perror("write (in buffering_write, full buffer)");
|
||||
return(-1);
|
||||
}
|
||||
num -= (OUTBUFSZ - bw_pos);
|
||||
buffer += (OUTBUFSZ - bw_pos);
|
||||
bw_pos = 0;
|
||||
}
|
||||
/* save data */
|
||||
memcpy(&bw_outbuf[bw_pos], buffer, num);
|
||||
bw_pos += num;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/** buffering_close() - writes out remaining buffered data before
|
||||
* closing file.
|
||||
*
|
||||
*/
|
||||
int
|
||||
buffering_close(int fd)
|
||||
{
|
||||
if (fd == bw_fd && bw_pos > 0) {
|
||||
/* write out remaining data and clean up */
|
||||
if (blocking_write(fd, bw_outbuf, bw_pos)) {
|
||||
perror("write (in buffering_close)");
|
||||
}
|
||||
bw_fd = -1;
|
||||
bw_pos = 0;
|
||||
}
|
||||
return(close(fd));
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
$Id: buffering_write.h,v 1.4 2008/06/19 15:44:30 flameeyes Exp $
|
||||
|
||||
Copyright (C) 2004, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 1998 Monty <xiphmont@mit.edu>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** buffering_write() - buffers data to a specified size before writing.
|
||||
*
|
||||
* Restrictions:
|
||||
* - MUST CALL BUFFERING_CLOSE() WHEN FINISHED!!!
|
||||
*
|
||||
*/
|
||||
extern long buffering_write(int outf, char *buffer, long num);
|
||||
|
||||
/** buffering_close() - writes out remaining buffered data before
|
||||
* closing file.
|
||||
*
|
||||
*/
|
||||
extern int buffering_close(int fd);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2
src/cd-paranoia/doc/.gitignore
vendored
2
src/cd-paranoia/doc/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
@@ -1,620 +0,0 @@
|
||||
|
||||
CDDA Paranoia FAQ
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
"Suspicion Breeds Confidence!"
|
||||
--Brazil
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
August 20, 1999
|
||||
|
||||
For those new to Paranoia and cdparanoia, this is the
|
||||
best, first place to look for information and answers to
|
||||
your questions.
|
||||
|
||||
More information can be found on the cdparanoia homepage:
|
||||
|
||||
http://www.xiph.org/paranoia/
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Table of Contents
|
||||
|
||||
1. Questions about the Paranoia and cdparanoia projects
|
||||
1. What is cdparanoia?
|
||||
2. Why use cdparanoia?
|
||||
3. What is Paranoia?
|
||||
4. Is cdparanoia / Paranoia portable?
|
||||
5. What is Paranoia's history?
|
||||
6. Is cdparanoia/Paranoia related to cdda2wav?
|
||||
7. What are the differences between Paranoia II, III and IV?
|
||||
8. Are there cdparanoia mailing lists for users or developers?
|
||||
9. What is Paranoia IV's current development status?
|
||||
10. Will cdparanoia, and cdda2wav or xcdroast merge anytime in the future?
|
||||
|
||||
2. Questions about using Paranoia and cdparanoia
|
||||
1. Requirements to run cdparanoia (as of alpha 3)
|
||||
2. Does Cdparanoia support ATAPI drives? SCSI Emulation? Parallel port
|
||||
drives?
|
||||
3. I can play audio CDs perfectly; why is reading the CD into a file so
|
||||
difficult and prone to errors?
|
||||
4. Does cdparanoia lose quality from the CD recording?
|
||||
5. Can cdparanoia detect pregaps? Can it remove the two second gaps
|
||||
between tracks?
|
||||
6. Why don't you implement CDDB? A GUI? Four million other features I want?
|
||||
7. The progress meter: What is that weird bargraph during ripping?
|
||||
8. How can I tell if my drive would be OK with regular cdda2wav?
|
||||
9. What is the biggest value of SG_BIG_BUFF I can use?
|
||||
10. Why do the binary files from two reads differ when compared?
|
||||
11. Why does CDParanoia rip files off into WAV format (and other sample
|
||||
formats) but not CDDA format?
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Questions about the Paranoia and cdparanoia projects
|
||||
|
||||
What is cdparanoia?
|
||||
|
||||
Cdparanoia is a Compact Disc Digital Audio (CDDA) extraction tool,
|
||||
commonly known on the net as a 'ripper'. The application is built on
|
||||
top of the Paranoia library, which is doing the real work (the
|
||||
Paranoia source is included in the cdparanoia source distribution).
|
||||
Like the original cdda2wav, cdparanoia package reads audio from the
|
||||
CDROM directly as data, with no analog step between, and writes the
|
||||
data to a file or pipe in WAV, AIFC or raw 16 bit linear PCM.
|
||||
|
||||
Cdparanoia is a bit different than most other CDDA extration tools. It
|
||||
contains few-to-no 'extra' features, concentrating only on the ripping
|
||||
process and knowing as much as possible about the hardware performing
|
||||
it. Cdparanoia will read correct, rock-solid audio data from
|
||||
inexpensive drives prone to misalignment, frame jitter and loss of
|
||||
streaming during atomic reads. Cdparanoia will also read and repair
|
||||
data from CDs that have been damaged in some way.
|
||||
|
||||
At the same time, however, cdparanoia turns out to be easy to use and
|
||||
administrate; It has no compile time configuration, happily
|
||||
autodetecting the CDROM, its type, its interface and other aspects of
|
||||
the ripping process at runtime. A single binary can serve the diverse
|
||||
hardware of the do-it-yourself computer laboratory from Hell...
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Why use cdparanoia?
|
||||
|
||||
All CDROM drives are not created equal. You'll need cdparanoia if
|
||||
yours is a little less equal than others-- or maybe you just keep your
|
||||
CD collection in a box of full of gravel. Jewel cases are for wimps;
|
||||
you know what I'm talking about.
|
||||
|
||||
Unfortunately, cdda2wav and readcdda cannot work properly with a large
|
||||
number of CDROM drives in the desktop world today. The most common
|
||||
problem is sporadic or regular clicks and pops in the read sample,
|
||||
regardless of 'nsector' or 'overlap' settings. Cdda2wav also cannot do
|
||||
anything about scratches (and they can cause cdda2wav to break).
|
||||
Cdparanoia is also smarter about probing CDDA support from SCSI and
|
||||
IDE-SCSI drives; many drives that do not work at all with cdda2wav,
|
||||
readcdda, tosha, etc, will work just fine with cdparanoia.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
What is Paranoia?
|
||||
|
||||
Paranoia is a library project that provides a platform independent,
|
||||
unified, robust interface for packet-command based devices. In the
|
||||
case of CDROM drives for example, handling and programming cdrom
|
||||
drives becomes identical whether on Solaris or Linux, or if the Linux
|
||||
drive is SCSI, ATAPI or on the parallel port. In this way, Paranoia is
|
||||
similar to Joerg Schilling's SCG library.
|
||||
|
||||
In addition to device/platform unification, the library provides tools
|
||||
for automatically identifying devices, and intelligent
|
||||
handling/correction of errors at all levels of the interface. On top
|
||||
of a generic low-level packet command layer, Paranoia implements
|
||||
high-level error-correcting interfaces for tasks such as CDDA where
|
||||
broken or vastly non-standard devices are the rule, rather than the
|
||||
exception.
|
||||
|
||||
The Paranoia libraries are incomplete; the first release for use will
|
||||
be Paranoia IV, to be bundled with cdparanoia alpha release 10.
|
||||
Programming documentation for Paranoia IV will appear shortly on the
|
||||
documentation page as Programming with Paranoia IV. Programmers
|
||||
interested in contributing to Paranoia IV should read the heading
|
||||
Paranoia IV development information.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Is cdparanoia / Paranoia portable?
|
||||
|
||||
Paranoia III is Linux only (although it runs on all the flavors of
|
||||
linux with a 2.0 or later kernel. It is not only for x86).
|
||||
|
||||
Paranoia IV (cdparanoia alpha 10 and later) is a port to other UNIX
|
||||
flavors and uses a substantially revised infrastructure. NetBSD and
|
||||
Solaris will be first; others will be added as time and outside
|
||||
assistance allow.
|
||||
|
||||
Suggestions on the proper way to handle each OS's native configuration
|
||||
idioms are welcome. I want Rhapsody cdparanoia to look just like other
|
||||
Rhapsody apps just as much as I want Linux cdparanoia to look like a
|
||||
Linux app.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
What is Paranoia's history?
|
||||
|
||||
Is cdparanoia/Paranoia related to cdda2wav?
|
||||
|
||||
Paranoia I/II and cdparanoia began life as a set of patches to Heiko
|
||||
Eissfeldt's 'cdda2wav' application. Cdparanoia gained its own life as
|
||||
a rewrite of cdda2wav in January of 1998 as "Paranoia III". Paranoia
|
||||
III proved to have an inadequate structure for extention and use on
|
||||
other platforms, so Paranoia IV began to take form in fall of 1998.
|
||||
|
||||
Modern Paranoia no longer has any relation to cdda2wav aside from
|
||||
general cooperation in sharing details between the two projects. In
|
||||
fact, cdda2wav itself doesn't look much like the cdda2wav of a year or
|
||||
two ago.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
What are the differences between Paranoia II, III and IV?
|
||||
|
||||
Paranoia I and II were a set of patches to Heiko Eissfeldt's cdda2wav
|
||||
0.8. These patches did nothing more than add some error checks to the
|
||||
standard cdda2wav. They were inefficient and only worked with some
|
||||
drives.
|
||||
|
||||
Paranoia III was the first version to be written seperately from
|
||||
cdda2wav in the form of a standalone library. It was not terribly
|
||||
portable, however, and the API proved to be inadequate for extension.
|
||||
|
||||
Paranoia IV is the upcoming new generation of CDDA Paranoia. It is
|
||||
both portable and more capable than Paranoia III.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Are there cdparanoia mailing lists for users or developers?
|
||||
|
||||
Yes. In addition to the mailing lists below, read-only CVS access to
|
||||
Paranoia III and IV will be availble from xiph.org soon (Paranoia IV
|
||||
is not yet under CVS). See http://www.xiph.org/paranoia/ for upto
|
||||
date information and automated ways of subscribing.
|
||||
|
||||
Mailing list for Paranoia and Cdparanoia users (paranoia@xiph.org):
|
||||
|
||||
To join: send a message containing only the one-word line
|
||||
'subscribe' in the body to paranoia-request@xiph.org. Do not send
|
||||
subscription requests directly to the main list. The list server at
|
||||
xiph.org should respond fairly quickly with a welcome message.
|
||||
|
||||
Mailing list for Paranoia IV developers: paranoia-dev@xiph.org
|
||||
|
||||
The developers list is intended for focused development discussion
|
||||
amongst the core Paranoia development team and outside groups
|
||||
developing their own applications using Paranoia. Of course, anyone is
|
||||
welcome to read.
|
||||
|
||||
To join: send a message containing only the one-word line
|
||||
'subscribe' in the body to paranoia-dev-request@xiph.org. Do not
|
||||
send subscription requests directly to the main list.
|
||||
|
||||
List for general CDROM tools
|
||||
|
||||
There's also a general mailing list for those using/developing CDDA
|
||||
extraction and CD writing tools
|
||||
(cdwrite@other.debian.org). Subscribe by sending mail to
|
||||
other-cdwrite-request@lists.debian.org containing only the word
|
||||
subscribe in the body. Do not send subscription requests directly to
|
||||
the main list.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
What is Paranoia IV's current development status?
|
||||
|
||||
Paranoia IV code will soon be available for internal evaluation,
|
||||
testing and development work to the developers involved in the
|
||||
Paranoia project; read-only CVS access should also be available soon.
|
||||
A public release does not yet set for any firm date.
|
||||
|
||||
Those interested in contributing to the development of Paranoia, or
|
||||
who wich to contribute to porting to other platforms, please contact
|
||||
us. Paranoia IV prerelease code will be available to porters soon; I
|
||||
prefer to be in contact with those porting to other platforms so that
|
||||
Paranoia development has consistent quality across platforms.
|
||||
|
||||
At the moment, volunteers have contacted me for most major platforms,
|
||||
but more help is still welcome on every OS.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Will cdparanoia, and cdda2wav or xcdroast merge anytime in the future?
|
||||
|
||||
Probably not beyond the point it already has. Versions of XCDRoast
|
||||
(and other GUI frontends; see the links page) that make use of
|
||||
cdparanoia already exist.
|
||||
|
||||
Although the cdrecord/cdda2wav and Paranoia projects cooperate,
|
||||
they're likely to remain seperate as the former is committed to Joerg
|
||||
Schilling's libscg (part of the cdrecord package), just as cdparanoia
|
||||
is committed to using Paranoia IV.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Questions about using Paranoia and cdparanoia
|
||||
|
||||
Requirements to run cdparanoia (as of alpha 3)
|
||||
|
||||
1. A CDDA capable CDROM drive
|
||||
2. Linux 2.0, 2.1, 2.2 or 2.3
|
||||
1. kernel support for the particular CDROM in use
|
||||
2. kernel support for the generic SCSI interface (if using a
|
||||
SCSI CDROM drive) and proper device (/dev/sg?) files (get
|
||||
them with the MAKEDEV script) in /dev. Most distributions
|
||||
already have the /dev/sg? files.
|
||||
|
||||
The cdparanoia binary will likely work with Linux 1.2 and 1.3, but I
|
||||
do not actively support kernels older than 2.0 I do know for a fact
|
||||
that the source will not build on kernel installs older than 2.0, but
|
||||
the problems are mostly related to the ever-changing locations of
|
||||
proprietary cdrom include files.
|
||||
|
||||
Also, although a 2.0 stock SCSI setup will work, performance will be
|
||||
better if linux/include/scsi/sg.h defines SG_BIG_BUFF to 65536 (it
|
||||
can't be bigger). Recent kernels (2.0.30+?) already set it to 32768;
|
||||
that's OK. Cdparanoia will tell you how big your generic SCSI buffer
|
||||
is. 2.2+ does not use a static DMA pool for SG, so there is nothing
|
||||
to tune.
|
||||
|
||||
Unlike cdda2wav, cdparanoia does not require threading, IPC or
|
||||
(optionally) sound card support. /proc filesystem support is no longer
|
||||
required (but encouraged!), and /dev/sr? or /dev/scd? devices are not
|
||||
required for SCSI, although they do add functionality if present.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Does Cdparanoia support ATAPI drives? SCSI Emulation? Parallel port
|
||||
drives?
|
||||
|
||||
Alpha 9 supports the full ATAPI, IDE-SCSI and SCSI generic interfaces
|
||||
under Linux.
|
||||
|
||||
Note that the native ATAPI driver is supported, but that IDE-SCSI
|
||||
emulation works better with ATAPI drives. This is an issue of control;
|
||||
the emulation interface gives cdparanoia complete control over the
|
||||
drive whereas the native ATAPI driver insists on hiding the device
|
||||
under an abstraction layer with poor error handling capabilities. Note
|
||||
also that a number of ATAPI drives that do not work at all with the
|
||||
ATAPI driver (error 006: Could not read audio) *will* work with
|
||||
IDE-SCSI emulation.
|
||||
|
||||
Parallel port based CDROM (paride) drives are not yet supported;
|
||||
support for these drives in Linux will appear in alpha release 10
|
||||
(Paranoia IV).
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
I can play audio CDs perfectly; why is reading the CD into a file so
|
||||
difficult and prone to errors? It's just the same thing.
|
||||
|
||||
Unfortunately, it isn't that easy.
|
||||
|
||||
The audio CD is not a random access format. It can only be played from
|
||||
some starting point in sequence until it is done, like a vinyl LP.
|
||||
Unlike a data CD, there are no synchronization or positioning headers
|
||||
in the audio data (a CD, audio or data, uses 2352 byte sectors. In a
|
||||
data CD, 304 bytes of each sector is used for header, sync and error
|
||||
correction. An audio CD uses all 2352 bytes for data). The audio CD
|
||||
*does* have a continuous fragmented subchannel, but this is only good
|
||||
for seeking +/-1 second (or 75 sectors or ~176kB) of the desired area,
|
||||
as per the SCSI spec.
|
||||
|
||||
When the CD is being played as audio, it is not only moving at 1x, the
|
||||
drive is keeping the media data rate (the spin speed) exactly locked
|
||||
to playback speed. Pick up a portable CD player while it's playing and
|
||||
rotate it 90 degrees. Chances are it will skip; you disturbed this
|
||||
delicate balance. In addition, a player is never distracted from what
|
||||
it's doing... it has nothing else taking up its time. Now add a
|
||||
non-realtime, (relatively) high-latency, multitasking kernel into the
|
||||
mess; it's like picking up the player and constantly shaking it.
|
||||
|
||||
CDROM drives generally assume that any sort of DAE will be linear and
|
||||
throw a readahead buffer at the task. However, the OS is reading the
|
||||
data as broken up, seperated read requests. The drive is doing
|
||||
readahead buffering and attempting to store additional data as it
|
||||
comes in off media while it waits for the OS to get around to reading
|
||||
previous blocks. Seeing as how, at 36x, data is coming in at
|
||||
6.2MB/second, and each read is only 13 sectors or ~30k (due to DMA
|
||||
restrictions), one has to get off 208 read requests a second, minimum
|
||||
without any interruption, to avoid skipping. A single swap to disc or
|
||||
flush of filesystem cache by the OS will generally result in loss of
|
||||
streaming, assuming the drive is working flawlessly. Oh, and virtually
|
||||
no PC on earth has that kind of I/O throughput; a Sun Enterprise
|
||||
server might, but a PC does not. Most don't come within a factor of
|
||||
five, assuming perfect realtime behavior.
|
||||
|
||||
To keep piling on the difficulties, faster drives are often prone to
|
||||
vibration and alignment problems; some are total fiascos. They lose
|
||||
streaming *constantly* even without being interrupted. Philips
|
||||
determined 15 years ago that the CD could only be spun up to 50-60x
|
||||
until the physical CD (made of polycarbonate) would deform from
|
||||
centripetal force badly enough to become unreadable. Today's players
|
||||
are pushing physics to the limit. Few do so terribly reliably.
|
||||
|
||||
Note that CD 'playback speed' is an excellent example of advertisers
|
||||
making numbers lie for them. A 36x cdrom is generally not spinning at
|
||||
36x a normal drive's speed. As a 1x drive is adjusting velocity
|
||||
depending on the access's distance from the hub, a 36x drive is
|
||||
probably using a constant angular velocity across the whole surface
|
||||
such that it gets 36x max at the edge. Thus it's actually spinning
|
||||
slower, assuming the '36x' isn't a complete lie, as it is on some
|
||||
drives.
|
||||
|
||||
Because audio discs have no headers in the data to assist in picking
|
||||
up where things got lost, most drives will just guess.
|
||||
|
||||
This doesn't even *begin* to get into stupid firmware bugs. Even
|
||||
Plextors have occasionally had DAE bugs (although in every case,
|
||||
Plextor has fixed the bug *and* replaced/repaired drives for free).
|
||||
Cheaper drives are often complete basket cases.
|
||||
|
||||
Rant Update (for those in the know):
|
||||
|
||||
Several folks, through personal mail and on Usenet, have pointed out
|
||||
that audio discs do place absolute positioning information for (at
|
||||
least) nine out of every ten sectors into the Q subchannel, and that
|
||||
my original statement of +/-75 sectors above is wrong. I admit to it
|
||||
being misleading, so I'll try to clarify.
|
||||
|
||||
The positioning data certainly is in subchannel Q; the point is moot
|
||||
however, for a couple of reasons.
|
||||
|
||||
1. The SCSI and ATAPI specs (there are a couple of each, pick one)
|
||||
don't give any way to retrieve the subchannel from a desired
|
||||
sector. The READ SUB-CHANNEL command will hand you Q all right,
|
||||
you just don't have any idea where exactly that Q came from. The
|
||||
command was intended for getting rough positioning information
|
||||
from audio discs that are paused or playing. This is audio;
|
||||
missing by several sectors is a tiny fraction of a second.
|
||||
|
||||
2. Older CDROM drives tended not to expect 'READ SUB-CHANNEL' unless
|
||||
the drive was playing audio; calling it during data reads could
|
||||
crash the drive and lock up the system. I had one of these drives
|
||||
(Apple 803i, actually a repackaged Sony CD-8003).
|
||||
|
||||
3. MMC-2 *does* give a way to retrieve the Q subchannel along with
|
||||
user data in the READ CD command. Although the drive is required
|
||||
to recognize the fetaure, it is allowed to simply return zeroes
|
||||
(effectively leaving the feature unimplemented). Guess how many
|
||||
drives actually implement this feature: not many.
|
||||
|
||||
4. Assuming you *can* get back the subchannel, most CDROM drives
|
||||
seem to understand audio discs primarily at the "little frame"
|
||||
level; thus sector-level structures aren't reliable. One might
|
||||
get a reassembled subQ, but if the read began in the middle of a
|
||||
sector (or dropped a little frame in the middle; many do), the
|
||||
subQ is likely corrupt and useless.
|
||||
|
||||
As reassembling uncorrupted frames is easy without the subchannel, and
|
||||
corrupted reads likely result in a corrupted subchannel too,
|
||||
cdparanoia treats the subchannel as more trouble than it's worth
|
||||
(during verification).
|
||||
|
||||
At least one other package (Exact Audio Copy for Win32) manages to use
|
||||
the subchannel to enhance the Table of Contents information. I don't
|
||||
know if this only works on MMC-2 drives that support returning Q with
|
||||
READ CD, but I think I'm going to revisit using the subchannel for
|
||||
extra TOC information.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Does cdparanoia lose quality from the CD recording? Does it just
|
||||
re-record the analog signal played from the CDROM drive?
|
||||
|
||||
No to both. Cdparanoia (and all other true CD digital audio extraction
|
||||
tools) reads the values off the CDROM in digital form. The data never
|
||||
comes anywhere near the soundcard, and does not pass through any
|
||||
conversion to analog first.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Can cdparanoia detect pregaps? Can it remove the two second gaps
|
||||
between tracks
|
||||
|
||||
Not yet. This feature is slated to appear in a release of alpha 10
|
||||
(Paranoia IV).
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Why don't you implement CDDB? A GUI? Four million other features I
|
||||
want?
|
||||
|
||||
Too many features spoil the broth. "Software is not perfect when there
|
||||
is nothing left to add, but rather when there is nothing extraneous
|
||||
left to take away." The goal of cdparanoia is perfect, rock-solid
|
||||
audio from every capable cdrom on every platform. As this goal has not
|
||||
yet been met, I'm uninterested in adding unrelated capability to the
|
||||
core engine.
|
||||
|
||||
Several GUIs that incorporate cdparanoia already exist; I'm in the
|
||||
process of compiling a list (see the links page). Other software that
|
||||
implements new features by wrapping around cdpar anoia (like CDDB
|
||||
lookup) also exist.
|
||||
|
||||
'Cdparanoia' will not play to sound cards (you can always pipe the
|
||||
output to a WAV player), do MD5 signatures, read CD catalog or serial
|
||||
numbers (this *is* a feature I plan to add), search indexes, do rate
|
||||
reduction (use Sox, Ogg or a million others), or generally make use of
|
||||
the maximum speed available from a CDROM drive.
|
||||
|
||||
If your CDROM drive is *not* prone to jitter and you don't have
|
||||
scratched discs to worry about, you might want to look at the original
|
||||
cdda2wav for features cdparanoia does not have. Keep in mind however
|
||||
that even the really good drives do occasionally stumble. I know of at
|
||||
least one cdparanoia user who insists on using full paranoia with his
|
||||
Plextor UltraPlex because it once botched a single sector from a rip;
|
||||
he'd already burned the track to several CD-Rs before noticing...
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
The progress meter: What is that weird bargraph during ripping?
|
||||
|
||||
It's a progress/status indicator. There's a completion bargraph, a
|
||||
number indicating the last sector number completely verified of the
|
||||
read currently happening, an overlap indicator, a gratuitous smilie,
|
||||
and a heartbeat indicator to show if the process is still alive, hung,
|
||||
or spinning.
|
||||
|
||||
The bargraph also marks points during the read with characters to
|
||||
indicate where various 'paranoia' features were tripped into action.
|
||||
Different bargraph characters indicate different things occurred
|
||||
during that part of the read. The letters are heirarchical; for
|
||||
example if a trasport error occurs in the same sector as jitter, the
|
||||
bargraph will print 'e' instead of '-'.
|
||||
|
||||
Legend of
|
||||
characters
|
||||
A hyphen indicates that two blocks overlapped properly,
|
||||
- but they were skewed (frame jitter). This case is
|
||||
completely corrected by Paranoia and is not a cause for
|
||||
concern.
|
||||
A plus indicates not only frame jitter, but an
|
||||
unreported, uncorrected loss of streaming in the middle
|
||||
+ of an atomic read operation. That is, the drive lost
|
||||
its place while reading data, and restarted in some
|
||||
random incorrect location without alerting the kernel.
|
||||
This case is also corrected by Paranoia.
|
||||
An 'e' indicates that a transport level SCSI or ATAPI
|
||||
e error was caught and corrected. Paranoia will
|
||||
completely repair such an error without audible
|
||||
defects.
|
||||
An "X" indicates a scratch was caught and corrected.
|
||||
X Cdparanoia wil interpolate over any missing/corrupt
|
||||
samples.
|
||||
An asterisk indicates a scratch and jitter both
|
||||
* occurred in this general area of the read. Cdparanoia
|
||||
wil interpolate over any missing/corrupt samples.
|
||||
A ! indicates that a read error got through the stage
|
||||
one of error correction and was caught by stage two.
|
||||
Many '!' are a cause for concern; it means that the
|
||||
drive is making continuous silent errors that look
|
||||
! identical on each re-read, a condition that can't
|
||||
always be detected. Although the presence of a '!'
|
||||
means the error was corrected, it also means that
|
||||
similar errors are probably passing by unnoticed.
|
||||
Upcoming releases of cdparanoia will address this
|
||||
issue.
|
||||
A V indicates a skip that could not be repaired or a
|
||||
V sector totally obliterated on the medium (hard read
|
||||
error). A 'V' marker generally results in some audible
|
||||
defect in the sample.
|
||||
|
||||
The smilie is actually relevant. It makes different faces depending on
|
||||
the current errors it's correcting.
|
||||
|
||||
Legend of
|
||||
smilies
|
||||
|
||||
:-) Normal operation. No errors to report; if any jitter is
|
||||
present, it's small.
|
||||
:-| Normal operation, but average jitter is quite large.
|
||||
A rift was found in the middle of an atomically read
|
||||
block; in other words, the drive lost streaming in the
|
||||
:-P middle of a read and did not abort, alert the kernel , or
|
||||
restart in the proper location. The drive silently
|
||||
continued reading in so me random location.
|
||||
|
||||
:-/ The read appears to be drifting; cdparanoia is shifting
|
||||
all of its reads to make up for it.
|
||||
Two matching vectors were found to disagree even after
|
||||
first stage verification; this is an indication that the
|
||||
drive is reliably dropping/adding bytes at consistent
|
||||
locations. Because the verification algorithm is partially
|
||||
8-| based on rereading and comparing vectors, if two vectors
|
||||
read incorrectly but identically, cdparanoia may never
|
||||
detect the problem. This smilie indicates that such a
|
||||
situation *was* detected; other instances may be slipping
|
||||
through.
|
||||
Transport or drive error. This is normally not a cause for
|
||||
concern; cdparanoia can repair just about any error that
|
||||
:-0 it actually detects. For more information about these
|
||||
errors, run cdparanoia with the -v option. Any all all
|
||||
errors and a description will dump to stderr.
|
||||
:-( Cdparanoia detected a scratch.
|
||||
Cdparanoia gave up trying to repair a sector; it could not
|
||||
read consistent enough information from the drive to do
|
||||
;-( so. At this point cdparanoia will make the best guess it
|
||||
has available and continue (a V appears in the bargraph at
|
||||
this point). This often results in an audible defect.
|
||||
Cdparanoia displays this smilie both when finished reading
|
||||
:^D a track and also if no error correction mechanism has been
|
||||
tripped so far reading a new track.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
How can I tell if my drive would be OK with regular cdda2wav?
|
||||
|
||||
Easy. Run cdparanoia; if the progress meter never shows any characters
|
||||
but the little arrow going across the screen, the CDROM drive is
|
||||
probably one of the (currently) few drives that can read a pristine
|
||||
stream of data off an audio disc regardless of circumstances. This
|
||||
drive will work quite well with cdda2wav (or cdparanoia using the '-Z'
|
||||
option)
|
||||
|
||||
A drive that results in a bargraph of all hyphens would *likely* work
|
||||
OK with cdda2wav, but it's less certain.
|
||||
|
||||
Any other characters in the bargraph (colons, semicolons, pluses, Xs,
|
||||
etc..) indicate that a fixups had to be performed at that point during
|
||||
the read; that read would have failed or 'popped' using cdda2wav.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
What is the biggest value of SG_BIG_BUFF I can use?
|
||||
|
||||
This is relevant only to 2.0 kernels and early 2.2 kernels.
|
||||
Modern Linux kernels no longer have a single static SG DMS pool.
|
||||
|
||||
For 2.0, 65536 (64 kilobytes). Some motherboards can use 128kB
|
||||
DMA, but attempting to use 128kB DMA on a machine that can't do
|
||||
it will crash the machine. Cdparanoia will not use larger than
|
||||
64kB requests.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Why do the binary files from two reads differ when compared?
|
||||
|
||||
The problem is the beginning point of the read. Cdparanoia enforces
|
||||
consistency from whatever the drive considers to be the starting point
|
||||
of the data, and the drive is returning a slightly different beginning
|
||||
point each time. The beginning point should not vary by much, and if
|
||||
this shift is accounted for when comparing the files, they should
|
||||
indeed turn out to be the same (aside from errors duly reported during
|
||||
the read; scratch correction or any reported skips will very likely
|
||||
also result in different files).
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Why do CDParanoia, CDDA2WAV et al. rip files off into WAV format (and
|
||||
other sample formats) but not CDDA format?
|
||||
|
||||
WAV and AIFC are simply convenient formats that include enough header
|
||||
information such that multipurpose audio software can uniquely
|
||||
identify the form of the data in the sample. In raw form, mulaw, SND
|
||||
and CDDA look exactly alike to a program like xplay, and are very
|
||||
likely to blow your ears (and stereo) out when played! Header formats
|
||||
are more versatile and safer. By default, cdparanoia and cdda2wav
|
||||
write WAV files.
|
||||
|
||||
That said, cdparanoia (and cdda2wav) will write raw, headerless
|
||||
formats if explicitly told to. Cdparanoia writes headerless, signed 16
|
||||
bit, 44.1kHz stero files in little endian format (LSB first) when
|
||||
given the -r option, and the same in big endian (MSB) format when
|
||||
given -R. All files written by cdparanoia are a multiple of 2352 bytes
|
||||
long (minus the header, if any) as required by cd writer software.
|
||||
|
||||
|
||||
Cdparanoia and the Laser-Playback-Head-of-Omniscience logo are
|
||||
trademarks (tm) of Xiphophorus (xiph.org). This document copyright (C)
|
||||
1994-1999 Xiphophorus. All rights reserved. Comments and questions
|
||||
are welcome.
|
||||
@@ -1,27 +0,0 @@
|
||||
# $Id: Makefile.am,v 1.4 2008/04/17 17:39:48 karl Exp $
|
||||
#
|
||||
# Copyright (C) 2005, 2007, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
SUBDIRS = en ja
|
||||
EXTRA_DIST = FAQ.txt overlapdef.txt
|
||||
|
||||
mostlyclean-generic:
|
||||
-rm -f *~ \#* .*~ .\#*
|
||||
|
||||
maintainer-clean-generic:
|
||||
-@echo "This command is intended for maintainers to use;"
|
||||
-@echo "it deletes files that may require special tools to rebuild."
|
||||
-rm -f Makefile.in
|
||||
3
src/cd-paranoia/doc/en/.gitignore
vendored
3
src/cd-paranoia/doc/en/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/cd-paranoia.1
|
||||
@@ -1,30 +0,0 @@
|
||||
# $Id: Makefile.am,v 1.3 2008/04/17 17:39:48 karl Exp $
|
||||
#
|
||||
# Copyright (C) 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
manfiles = cd-paranoia.1
|
||||
man_MANS = $(manfiles)
|
||||
transform = s,cd-paranoia,@CDPARANOIA_NAME@,
|
||||
|
||||
EXTRA_DIST = $(manfiles) cd-paranoia.1.in
|
||||
|
||||
mostlyclean-generic:
|
||||
-rm -f *~ \#* .*~ .\#*
|
||||
|
||||
maintainer-clean-generic:
|
||||
-@echo "This command is intended for maintainers to use;"
|
||||
-@echo "it deletes files that may require special tools to rebuild."
|
||||
-rm -f Makefile.in $(manfiles)
|
||||
@@ -1,381 +0,0 @@
|
||||
.TH @CDPARANOIA_NAME@ 1 "version III release alpha 9.8 libcdio"
|
||||
.SH NAME
|
||||
@CDPARANOIA_NAME@ 9.8 (Paranoia release III via libcdio) \- an audio CD reading utility which includes extra data verification features
|
||||
.SH SYNOPSIS
|
||||
.B @CDPARANOIA_NAME@
|
||||
.RB [ options ]
|
||||
.B span
|
||||
.RB [ outfile ]
|
||||
.SH DESCRIPTION
|
||||
.B @CDPARANOIA_NAME@
|
||||
retrieves audio tracks from CDDA capable CD-ROM drives. The data can
|
||||
be saved to a file or directed to standard output in WAV, AIFF, AIFF-C
|
||||
or raw format. Most ATAPI, SCSI and several proprietary CD-ROM drive
|
||||
makes are supported;
|
||||
.B @CDPARANOIA_NAME@
|
||||
can determine if the target drive is CDDA capable.
|
||||
.P
|
||||
In addition to simple reading,
|
||||
.B @CDPARANOIA_NAME@
|
||||
adds extra-robust data verification, synchronization, error handling
|
||||
and scratch reconstruction capability.
|
||||
.P
|
||||
This version uses the libcdio library for interaction with a CD-ROM
|
||||
drive. The jitter and error correction however are the same as used in
|
||||
Xiph's cdparanoia.
|
||||
.SH OPTIONS
|
||||
|
||||
.TP
|
||||
.B \-v --verbose
|
||||
Be absurdly verbose about the autosensing and reading process. Good
|
||||
for setup and debugging.
|
||||
|
||||
.TP
|
||||
.B \-q --quiet
|
||||
Do not print any progress or error information during the reading process.
|
||||
|
||||
.TP
|
||||
.B \-e --stderr-progress
|
||||
Force output of progress information to stderr (for wrapper scripts).
|
||||
|
||||
.TP
|
||||
.B \-V --version
|
||||
Print the program version and quit.
|
||||
|
||||
.TP
|
||||
.B \-Q --query
|
||||
Perform CD-ROM drive autosense, query and print the CD-ROM table of
|
||||
contents, then quit.
|
||||
|
||||
.TP
|
||||
.B \-s --search-for-drive
|
||||
Forces a complete search for a cdrom drive, even if the /dev/cdrom link exists.
|
||||
|
||||
.TP
|
||||
.B \-h --help
|
||||
Print a brief synopsis of
|
||||
.B @CDPARANOIA_NAME@
|
||||
usage and options.
|
||||
|
||||
.TP
|
||||
.BI "\-l --log-summary " file
|
||||
Save result summary to file.
|
||||
|
||||
.TP
|
||||
.B \-p --output-raw
|
||||
Output headerless data as raw 16 bit PCM data with interleaved samples in host byte order. To force little or big endian byte order, use
|
||||
.B \-r
|
||||
or
|
||||
.B \-R
|
||||
as described below.
|
||||
|
||||
.TP
|
||||
.B \-r --output-raw-little-endian
|
||||
Output headerless data as raw 16 bit PCM data with interleaved samples in LSB first byte order.
|
||||
|
||||
.TP
|
||||
.B \-R --output-raw-big-endian
|
||||
Output headerless data as raw 16 bit PCM data with interleaved samples in MSB first byte order.
|
||||
|
||||
.TP
|
||||
.B \-w --output-wav
|
||||
Output data in Micro$oft RIFF WAV format (note that WAV data is always
|
||||
LSB first byte order).
|
||||
|
||||
.TP
|
||||
.B \-f --output-aiff
|
||||
Output data in Apple AIFF format (note that AIFC data is
|
||||
always in MSB first byte order).
|
||||
|
||||
.TP
|
||||
.B \-a --output-aifc
|
||||
Output data in uncompressed Apple AIFF-C format (note that AIFF-C data is
|
||||
always in MSB first byte order).
|
||||
|
||||
.TP
|
||||
.BI "\-B --batch "
|
||||
|
||||
Cdda2wav-style batch output flag; @CDPARANOIA_NAME@ will split the output
|
||||
into multiple files at track boundaries. Output file names are
|
||||
prepended with 'track#.'
|
||||
|
||||
.TP
|
||||
.B \-c --force-cdrom-little-endian
|
||||
Some CD-ROM drives misreport their endianness (or do not report it at
|
||||
all); it's possible that @CDPARANOIA_NAME@ will guess wrong. Use
|
||||
.B \-c
|
||||
to force @CDPARANOIA_NAME@ to treat the drive as a little endian device.
|
||||
|
||||
.TP
|
||||
.B \-C --force-cdrom-big-endian
|
||||
As above but force @CDPARANOIA_NAME@ to treat the drive as a big endian device.
|
||||
|
||||
.TP
|
||||
.BI "\-n --force-default-sectors " n
|
||||
Force the interface backend to do atomic reads of
|
||||
.B n
|
||||
sectors per read. This number can be misleading; the kernel will often
|
||||
split read requests into multiple atomic reads (the automated Paranoia
|
||||
code is aware of this) or allow reads only wihin a restricted size
|
||||
range.
|
||||
.B This option should generally not be used.
|
||||
|
||||
.TP
|
||||
.BI "\-d --force-cdrom-device " device
|
||||
Force the interface backend to read from
|
||||
.B device
|
||||
rather than the first readable CD-ROM drive it finds containing a
|
||||
CD-DA disc. This can be used to specify devices of any valid
|
||||
interface type (ATAPI, SCSI or proprietary).
|
||||
|
||||
.TP
|
||||
.BI "\-g --force-generic-device " device
|
||||
This option is an alias for
|
||||
.B \-d
|
||||
and is retained for compatibility.
|
||||
|
||||
.TP
|
||||
.BI "\-S --force-read-speed " number
|
||||
Use this option explicitly to set the read rate of the CD drive (where
|
||||
supported). This can reduce underruns on machines with slow disks, or
|
||||
which are low on memory.
|
||||
|
||||
.TP
|
||||
.BI "\-t --toc-offset " number
|
||||
Use this option to force the entire disc LBA addressing to shift by
|
||||
the given amount; the value is added to the beginning offsets in the
|
||||
TOC. This can be used to shift track boundaries for the whole disc
|
||||
manually on sector granularity. The next option does something
|
||||
similar...
|
||||
|
||||
.TP
|
||||
.BI "\-T --toc-bias "
|
||||
Some drives (usually random Toshibas) report the actual track
|
||||
beginning offset values in the TOC, but then treat the beginning of
|
||||
track 1 index 1 as sector 0 for all read operations. This results in
|
||||
every track seeming to start too late (losing a bit of the beginning
|
||||
and catching a bit of the next track).
|
||||
\-T accounts for this behavior. Note that this option will cause
|
||||
@CDPARANOIA_NAME@ to attempt to read sectors before or past the known user
|
||||
data area of the disc, resulting in read errors at disc edges on most
|
||||
drives and possibly even hard lockups on some buggy hardware.
|
||||
|
||||
.TP
|
||||
.BI "\-O --sample-offset " number
|
||||
Some CD-ROM/CD-R drives will add an offset to the position on reading
|
||||
audio data. This is usually around 500-700 audio samples (ca. 1/75
|
||||
second) on reading. So when @CDPARANOIA_NAME@ queries a specific
|
||||
sector, it might not receive exactly that sector, but shifted by some
|
||||
amount.
|
||||
.P
|
||||
Use this option to force the entire disc to shift sample position
|
||||
output by the given amount; This can be used to shift track boundaries
|
||||
for the whole disc manually on sample granularity. Note that if you
|
||||
are ripping something including the ending of the CD (e.g. the entire
|
||||
disk), this option will cause @CDPARANOIA_NAME@ to attempt to read
|
||||
partial sectors before or past the known user data area, probably
|
||||
causing read errors on most drives and possibly even hard lockups on
|
||||
some buggy hardware.
|
||||
|
||||
.TP
|
||||
.B \-Z --disable-paranoia
|
||||
Disable
|
||||
.B all
|
||||
data verification and correction features. When using -Z, @CDPARANOIA_NAME@
|
||||
reads data exactly as would cdda2wav with an overlap setting of zero.
|
||||
This option implies that
|
||||
.B \-Y
|
||||
is active.
|
||||
|
||||
.TP
|
||||
.B \-z --never-skip[=max_retries]
|
||||
Do not accept any skips; retry forever if needed. An optional maximum
|
||||
number of retries can be specified; for comparison, default without -z is
|
||||
currently 20.
|
||||
|
||||
.TP
|
||||
.B \-Y --disable-extra-paranoia
|
||||
Disables intra-read data verification; only overlap checking at read
|
||||
boundaries is performed. It can wedge if errors occur in the attempted overlap area. Not recommended.
|
||||
|
||||
.TP
|
||||
.B \-X --abort-on-skip
|
||||
If the read skips due to imperfect data, a scratch, whatever, abort reading this track. If output is to a file, delete the partially completed file.
|
||||
|
||||
.TP
|
||||
.B \-x --test-flags mask
|
||||
Simulate CD-reading errors. This is used in regression testing, but
|
||||
other uses might be to see how well a CD-ROM performs under
|
||||
(simulated) CD degradation. mask specifies the artificial kinds of
|
||||
errors to introduced; "or"-ing values from the selection below will
|
||||
simulate the kind of specified failure.
|
||||
.P
|
||||
0x10 - Simulate under-run reading
|
||||
.TP
|
||||
|
||||
|
||||
.SH OUTPUT SMILIES
|
||||
.TP
|
||||
.B
|
||||
:-)
|
||||
Normal operation, low/no jitter
|
||||
.TP
|
||||
.B
|
||||
:-|
|
||||
Normal operation, considerable jitter
|
||||
.TP
|
||||
.B
|
||||
:-/
|
||||
Read drift
|
||||
.TP
|
||||
.B
|
||||
:-P
|
||||
Unreported loss of streaming in atomic read operation
|
||||
.TP
|
||||
.B
|
||||
8-|
|
||||
Finding read problems at same point during reread; hard to correct
|
||||
.TP
|
||||
.B
|
||||
:-0
|
||||
SCSI/ATAPI transport error
|
||||
.TP
|
||||
.B
|
||||
:-(
|
||||
Scratch detected
|
||||
.TP
|
||||
.B
|
||||
;-(
|
||||
Gave up trying to perform a correction
|
||||
.TP
|
||||
.B
|
||||
8-X
|
||||
Aborted read due to known, uncorrectable error
|
||||
.TP
|
||||
.B
|
||||
:^D
|
||||
Finished extracting
|
||||
|
||||
.SH PROGRESS BAR SYMBOLS
|
||||
.TP
|
||||
.B
|
||||
<space>
|
||||
No corrections needed
|
||||
.TP
|
||||
.B
|
||||
-
|
||||
Jitter correction required
|
||||
.TP
|
||||
.B
|
||||
+
|
||||
Unreported loss of streaming/other error in read
|
||||
.TP
|
||||
.B
|
||||
!
|
||||
Errors found after stage 1 correction; the drive is making the
|
||||
same error through multiple re-reads, and @CDPARANOIA_NAME@ is having trouble
|
||||
detecting them.
|
||||
.TP
|
||||
.B
|
||||
e
|
||||
SCSI/ATAPI transport error (corrected)
|
||||
.TP
|
||||
.B
|
||||
V
|
||||
Uncorrected error/skip
|
||||
|
||||
.SH SPAN ARGUMENT
|
||||
|
||||
The span argument specifies which track, tracks or subsections of
|
||||
tracks to read. This argument is required.
|
||||
.B NOTE:
|
||||
Unless the span is a simple number, it's generally a good idea to
|
||||
quote the span argument to protect it from the shell.
|
||||
.P
|
||||
The span argument may be a simple track number or an offset/span
|
||||
specification. The syntax of an offset/span takes the rough form:
|
||||
.P
|
||||
1[ww:xx:yy.zz]-2[aa:bb:cc.dd]
|
||||
.P
|
||||
Here, 1 and 2 are track numbers; the numbers in brackets provide a
|
||||
finer grained offset within a particular track. [aa:bb:cc.dd] is in
|
||||
hours/minutes/seconds/sectors format. Zero fields need not be
|
||||
specified: [::20], [:20], [20], [20.], etc, would be interpreted as
|
||||
twenty seconds, [10:] would be ten minutes, [.30] would be thirty
|
||||
sectors (75 sectors per second).
|
||||
.P
|
||||
When only a single offset is supplied, it is interpreted as a starting
|
||||
offset and ripping will continue to the end of the track. If a single
|
||||
offset is preceeded or followed by a hyphen, the implicit missing
|
||||
offset is taken to be the start or end of the disc, respectively. Thus:
|
||||
|
||||
.TP
|
||||
.B 1:[20.35]
|
||||
Specifies ripping from track 1, second 20, sector 35 to the end of
|
||||
track 1.
|
||||
.TP
|
||||
.B 1:[20.35]-
|
||||
Specifies ripping from 1[20.35] to the end of the disc
|
||||
.TP
|
||||
.B \-2
|
||||
Specifies ripping from the beginning of the disc up to (and including) track 2
|
||||
.TP
|
||||
.B \-2:[30.35]
|
||||
Specifies ripping from the beginning of the disc up to 2:[30.35]
|
||||
.TP
|
||||
.B 2-4
|
||||
Specifies ripping from the beginning of track 2 to the end of track 4.
|
||||
.P
|
||||
Again, don't forget to protect square brackets and preceeding hyphens from
|
||||
the shell.
|
||||
|
||||
.SH EXAMPLES
|
||||
|
||||
A few examples, protected from the shell:
|
||||
.TP
|
||||
Query only with exhaustive search for a drive and full reporting of autosense:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ -vsQ
|
||||
.TP
|
||||
Extract an entire disc, putting each track in a seperate file:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ -B
|
||||
.TP
|
||||
Extract from track 1, time 0:30.12 to 1:10.00:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ "1[:30.12]-1[1:10]"
|
||||
.TP
|
||||
Extract from the beginning of the disc up to track 3:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ -- "-3"
|
||||
.TP
|
||||
The "--" above is to distinguish "-3" from an option flag.
|
||||
.SH OUTPUT
|
||||
|
||||
The output file argument is optional; if it is not specified,
|
||||
@CDPARANOIA_NAME@ will output samples to one of
|
||||
.BR cdda.wav ", " cdda.aifc ", or " cdda.raw
|
||||
depending on whether
|
||||
.BR \-w ", " \-a ", " \-r " or " \-R " is used (" \-w
|
||||
is the implicit default). The output file argument of
|
||||
.B \-
|
||||
specifies standard output; all data formats may be piped.
|
||||
|
||||
.SH ACKNOWLEDGEMENTS
|
||||
@CDPARANOIA_NAME@ sprang from and once drew heavily from the interface of
|
||||
Heiko Eissfeldt's (heiko@colossus.escape.de) 'cdda2wav'
|
||||
package. @CDPARANOIA_NAME@ would not have happened without it.
|
||||
.P
|
||||
Joerg Schilling has also contributed SCSI expertise through his
|
||||
generic SCSI transport library.
|
||||
.P
|
||||
.SH AUTHOR
|
||||
Monty <monty@xiph.org>
|
||||
.P
|
||||
Cdparanoia's homepage may be found at:
|
||||
http://www.xiph.org/paranoia/
|
||||
.P
|
||||
Revised for use with libcdio by Rocky <rocky@gnu.org>
|
||||
.P
|
||||
The libcdio homepage may be found at:
|
||||
http://www.gnu.org/software/libcdio
|
||||
3
src/cd-paranoia/doc/ja/.gitignore
vendored
3
src/cd-paranoia/doc/ja/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/cd-paranoia.1
|
||||
@@ -1,72 +0,0 @@
|
||||
# $Id: Makefile.am,v 1.2 2008/04/17 17:39:48 karl Exp $
|
||||
#
|
||||
# Copyright (C) 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
mansubdir=/jp/man1
|
||||
manfiles = cd-paranoia.1
|
||||
man_MANS = $(manfiles) cd-paranoia.1
|
||||
transform = s,cd-paranoia,@CDPARANOIA_NAME@,
|
||||
|
||||
EXTRA_DIST = $(manfiles) cd-paranoia.1.in
|
||||
|
||||
install-man1: $(man_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(mandir)$(mansubdir)"
|
||||
@list='$(man1_MANS)'; \
|
||||
l2='$(man_MANS)'; for i in $$l2; do \
|
||||
case "$$i" in \
|
||||
*.1*) list="$$list $$i" ;; \
|
||||
esac; \
|
||||
done; \
|
||||
for i in $$list; do \
|
||||
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
||||
else file=$$i; fi; \
|
||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
case "$$ext" in \
|
||||
1*) ;; \
|
||||
*) ext='1' ;; \
|
||||
esac; \
|
||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
echo " $(INSTALL_DATA) $$file $(DESTDIR)$(mandir)$(mansubdir)/$$inst"; \
|
||||
$(INSTALL_DATA) $$file $(DESTDIR)$(mandir)$(mansubdir)/$$inst; \
|
||||
done
|
||||
|
||||
uninstall-man1:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(man1_MANS)'; \
|
||||
l2='$(man_MANS)'; for i in $$l2; do \
|
||||
case "$$i" in \
|
||||
*.1*) list="$$list $$i" ;; \
|
||||
esac; \
|
||||
done; \
|
||||
for i in $$list; do \
|
||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
echo " rm -f $(DESTDIR)$(mandir)$(mansubdir)/$$inst"; \
|
||||
rm -f $(DESTDIR)$(mandir)$(mansubdir)/$$inst; \
|
||||
done
|
||||
|
||||
mostlyclean-generic:
|
||||
-rm -f *~ \#* .*~ .\#*
|
||||
|
||||
maintainer-clean-generic:
|
||||
-@echo "This command is intended for maintainers to use;"
|
||||
-@echo "it deletes files that may require special tools to rebuild."
|
||||
-rm -f Makefile.in $(manfiles)
|
||||
@@ -1,359 +0,0 @@
|
||||
.TH @CDPARANOIA_NAME@ 1
|
||||
.\" Translated Sun Aug 22 18:02:41 JST 1999
|
||||
.\" by FUJIWARA Teruyoshi <fujiwara@linux.or.jp>
|
||||
.SH 名前
|
||||
@CDPARANOIA_NAME@ (Paranoia release III libcdio) \- オーディオ CD 読み取りユーティリティ。特別なデータ照合機能を持つ。
|
||||
.SH 日付
|
||||
バージョンIII リリースα9.6 (17 Aug 1999)
|
||||
.SH 書式
|
||||
.B @CDPARANOIA_NAME@
|
||||
.RB [ options ]
|
||||
.B span
|
||||
.RB [ outfile ]
|
||||
.SH 説明
|
||||
.B @CDPARANOIA_NAME@
|
||||
は CD-DA 機能を持つ CD-ROM ドライブからオーディオトラックを取り出しま
|
||||
す。このデータは WAV, AIFF, AIFF-C, raw 形式でファイルにセーブすること
|
||||
や、標準出力に送ることができます。ほとんどの ATAPI, SCSI, メーカー独自
|
||||
の CD-ROM ドライブがサポートされています。
|
||||
.B @CDPARANOIA_NAME@
|
||||
は対象のドライブが CD-DA 機能を持っているかどうかを判別できます。
|
||||
.P
|
||||
単純な読み取りだけでなく、
|
||||
.B @CDPARANOIA_NAME@
|
||||
は特別に頑健なデータ照合機能、同期機能、エラー処理機能、破損データの再
|
||||
構成機能を持っています。
|
||||
.SH オプション
|
||||
|
||||
.TP
|
||||
.B \-v --verbose
|
||||
自動検出と読み取りの処理について、ばかばかしいほど冗長な表示を行います。
|
||||
設定やデバッグの際に便利です。
|
||||
|
||||
.TP
|
||||
.B \-q --quiet
|
||||
読み取り処理の途中に、進行状況やエラー情報を全く表示しません。
|
||||
|
||||
.TP
|
||||
.B \-e --stderr-progress
|
||||
進行状況を(ラッパスクリプトのために)標準エラー出力に出力します。
|
||||
|
||||
.TP
|
||||
.B \-V --version
|
||||
プログラムのバージョンを表示して終了します。
|
||||
|
||||
.TP
|
||||
.B \-Q --query
|
||||
CD-ROM ドライブの自動検出を行い、CD-ROM の TOC の問い合わせと表示を行
|
||||
い、終了します。
|
||||
|
||||
.TP
|
||||
.B \-s --search-for-drive
|
||||
たとえ /dev/cdrom のリンクが存在していても、CD-ROM ドライブの完全な
|
||||
検索を行います。
|
||||
|
||||
.TP
|
||||
.B \-h --help
|
||||
.B @CDPARANOIA_NAME@
|
||||
の使い方とオプションを簡単な説明を出力します。
|
||||
|
||||
.TP
|
||||
.B \-p --output-raw
|
||||
ヘッダ無しのデータをホストのバイト順で、インタリーブ処理を施した
|
||||
サンプル音声を含む raw 形式の 16 ビット PCM データとして出力します。
|
||||
バイト順としてリトルエンディアンあるいはビッグエンディアンを指定するに
|
||||
は、後述の
|
||||
.B \-r
|
||||
または
|
||||
.B \-R
|
||||
オプションを使ってください。
|
||||
|
||||
.TP
|
||||
.B \-r --output-raw-little-endian
|
||||
ヘッダ無しのデータを LSB first のバイト順で、インタリーブ処理を施した
|
||||
サンプル音声を含む raw 形式の 16 ビット PCM データとして出力します。
|
||||
|
||||
.TP
|
||||
.B \-R --output-raw-big-endian
|
||||
ヘッダ無しのデータを MSB first のバイト順で、インタリーブ処理を施した
|
||||
サンプル音声を含む raw 形式の 16 ビット PCM データとして出力します。
|
||||
|
||||
.TP
|
||||
.B \-w --output-wav
|
||||
データを Micro$oft の RIFF WAV 形式で出力します(WAV データのバイト順は
|
||||
必ず LSB first である点に注意)。
|
||||
|
||||
.TP
|
||||
.B \-f --output-aiff
|
||||
データを Apple の AIFF 形式で出力します(AIFC データのバイト順は必ず
|
||||
MSB first である点に注意)。
|
||||
|
||||
.TP
|
||||
.B \-a --output-aifc
|
||||
データを無圧縮 の Apple AIFF-C 形式で出力します(AIFF-C データのバイト
|
||||
順は必ず MSB first である点に注意)。
|
||||
|
||||
.TP
|
||||
.BI "\-B --batch "
|
||||
cdda2wav 形式のバッチ出力を行います。@CDPARANOIA_NAME@ は出力をトラック境界で
|
||||
複数ファイルに分割します。出力ファイルのファイル名の先頭部分は、'track(番号)'
|
||||
となります。
|
||||
|
||||
.TP
|
||||
.B \-c --force-cdrom-little-endian
|
||||
一部の CD-ROM は間違ったエンディアンを報告します(あるいはエンディアン
|
||||
に関する情報を全く報告しません)。そのため、@CDPARANOIA_NAME@ がエンディアンを
|
||||
間違えることがあります。ドライブをリトルエンディアンのデバイスとして
|
||||
@CDPARANOIA_NAME@ に扱わせるには、
|
||||
.B \-c
|
||||
オプションを使います。
|
||||
|
||||
.TP
|
||||
.B \-C --force-cdrom-big-endian
|
||||
前のオプションの逆で、デバイスをビッグエンディアンのデバイスとして
|
||||
@CDPARANOIA_NAME@ に扱わせます。
|
||||
|
||||
.TP
|
||||
.BI "\-n --force-default-sectors " n
|
||||
インタフェースのバックエンドが行う最小単位の読み取りを、
|
||||
1 回の読み取りごとに
|
||||
.B n
|
||||
セクタとします。この数は問題を起こすおそれがあります。カーネルは多くの
|
||||
場合、読み取り要求を最小単位の読み取り(@CDPARANOIA_NAME@ による自動処理はこれ
|
||||
に対応しています)複数個に分割するか、制限された大きさの範囲でしか
|
||||
読み取りを許可しません。
|
||||
.B 普通はこのオプションを使うべきではありません。
|
||||
|
||||
.TP
|
||||
.BI "\-d --force-cdrom-device " device
|
||||
インタフェースのバックエンドによる読み取りを、最初に見つけた読み取り可
|
||||
能な CD-ROM ドライブではなく、指定した
|
||||
.B device
|
||||
から行うようにします。このオプションでは、利用可能である任意の
|
||||
インタフェース(ATAPI, SCSI, メーカー独自)を持つデバイスを指定すること
|
||||
ができます。
|
||||
|
||||
.TP
|
||||
.BI "\-g --force-generic-device " device
|
||||
このオプションは、SCSI CD-ROM と汎用デバイスの設定を明示的に別々に制御
|
||||
したい時に
|
||||
.B \-d
|
||||
オプションと組み合わせて使います。このオプションが役立つのは、SCSI の
|
||||
設定が標準と異なる場合だけです。
|
||||
|
||||
.TP
|
||||
.BI "\-S --force-read-speed " number
|
||||
CD ドライブからの読み込み速度を設定するには、このオプションを明示的に
|
||||
使ってください(ドライブが対応している場合)。このオプションを用いると、
|
||||
ディスクが遅い場合やメモリが少ない場合に起こるアンダーランを減らすこと
|
||||
ができます。
|
||||
|
||||
.TP
|
||||
.B \-Z --disable-paranoia
|
||||
データ照合と訂正機能を
|
||||
.b 全て
|
||||
無効にします。-Z オプションを用いると、@CDPARANOIA_NAME@ は
|
||||
オーバーラップの設定が 0 である cdda2wav と全く同じようにデータの
|
||||
読み取りを行います。
|
||||
このオプションを指定すると
|
||||
.B \-W ,
|
||||
.B \-X ,
|
||||
.B \-Y
|
||||
オプションも有効になりますが、
|
||||
.B \-Z \-W \-X \-Y
|
||||
と全く同じでは
|
||||
.B ありません。
|
||||
なぜなら、
|
||||
.B \-W
|
||||
から
|
||||
.B \-Z
|
||||
までのオプションにより照合のレベルが階層的に変わるからです。実際に有効
|
||||
になるのは最後に指定したオプションだけです。
|
||||
|
||||
.TP
|
||||
.B \-Y --disable-extra-paranoia
|
||||
読み取ったデータの中間におけるデータ照合を行いません。つまり、
|
||||
データの読み取り境界におけるオーバーラップ部分のチェックしか行いません。
|
||||
|
||||
.TP
|
||||
.B \-X --disable-scratch-detection
|
||||
照合の途中では傷の探査も行わず、傷に対して頑健な同期処理も行いません。
|
||||
.B \-X
|
||||
オプションを指定した場合、傷ついた CD を与えると @CDPARANOIA_NAME@ は読み取り
|
||||
の失敗を起こします。
|
||||
|
||||
.TP
|
||||
.B \-W --disable-scratch-repair
|
||||
傷を検出し、同期を保つ処理を行います。ただし壊れたデータの修復は行いま
|
||||
せん。ログファイルの出力を行うと(
|
||||
.RB \-i
|
||||
オプション)、全ての傷のフレーム位置がログファイルに出力されます。
|
||||
|
||||
.SH 出力される顔文字
|
||||
.TP
|
||||
.B
|
||||
:-)
|
||||
正常動作。ジッタは少ないか、全くない
|
||||
.TP
|
||||
.B
|
||||
:-|
|
||||
正常動作。ジッタは許容範囲
|
||||
.TP
|
||||
.B
|
||||
:-/
|
||||
読み取りでドリフトが発生
|
||||
.TP
|
||||
.B
|
||||
:-P
|
||||
最小単位の読み取り操作において、報告されていない損失がストリーミングにある
|
||||
.TP
|
||||
.B
|
||||
8-|
|
||||
繰り返して読み取りを行ったが、同じ位置で問題が起きた。修正は困難である
|
||||
.TP
|
||||
.B
|
||||
:-0
|
||||
SCSI/ATAPI のデータ転送エラー
|
||||
.TP
|
||||
.B
|
||||
:-(
|
||||
傷が検出された
|
||||
.TP
|
||||
.B
|
||||
;-(
|
||||
データの訂正をあきらめた
|
||||
.TP
|
||||
.B
|
||||
:^D
|
||||
読み取り終了
|
||||
|
||||
.SH 進行表示の意味
|
||||
.TP
|
||||
.B
|
||||
<スペース>
|
||||
訂正は不要
|
||||
.TP
|
||||
.B
|
||||
-
|
||||
ジッタの訂正が必要
|
||||
.TP
|
||||
.B
|
||||
+
|
||||
報告されていない損失がストリーミングにある。あるいは別のエラーが読み取り
|
||||
時に発生した
|
||||
.TP
|
||||
.B
|
||||
!
|
||||
ステージ 1 訂正の後にエラーが見つかった。読み取りを複数回繰り返しても
|
||||
同じエラーが発生し、@CDPARANOIA_NAME@ はそのエラーをうまく検出できない。
|
||||
.TP
|
||||
.B
|
||||
e
|
||||
SCSI/ATAPI のデータ転送エラー(訂正済み)
|
||||
.TP
|
||||
.B
|
||||
V
|
||||
訂正できないエラー/データのスキップ
|
||||
|
||||
.SH 引き数 'span'
|
||||
|
||||
引き数 span は、読み取りを行うトラックまたはトラックの一部を指定します。
|
||||
この引き数は必ず必要です。
|
||||
.B 注意:
|
||||
span が単なる数字でなければ、シェルが引き数 span を展開してしまわない
|
||||
ようにクォートするのが普通でしょう。
|
||||
.P
|
||||
引き数 span は、単なるトラック番号か、オフセットとスパンの組合せの指定
|
||||
となります。オフセットとスパンの組合せを指定する方法は、だいたい以下の
|
||||
ようになります:
|
||||
.P
|
||||
1[ww:xx:yy.zz]-2[aa:bb:cc.dd]
|
||||
.P
|
||||
ここで 1 と 2 はトラック番号です。角括弧の中の数値は、指定されたトラック
|
||||
における、より細かいオフセット指定です。[aa:bb:cc.dd] は
|
||||
「時間/分/秒/セクタ」の形式です。値が 0 であるフィールドは指定しなくて
|
||||
も構いません。つまり [::20], [:20], [20], [20.] 等は 20 秒と解釈され、
|
||||
[10:] は 10 秒と解釈され、[.30] は 30 セクタと解釈されます(75 セクタで
|
||||
1 秒です)。
|
||||
.P
|
||||
オフセットを 1 つしか指定しなければ、これは開始位置のオフセットを表し、
|
||||
吸い出しはそのトラックの終わりまで行われます。オフセットが 1 つだけあ
|
||||
り、その前後にハイフン(-)がある場合には、省略されているオフセットは
|
||||
ディスクの先頭あるいは末尾として解釈されます。例を以下に示します:
|
||||
|
||||
.TP
|
||||
.B 1:[20.35]
|
||||
トラック 1 の 20 秒、35 セクタの位置から、トラック 1 の末尾までを吸い
|
||||
出します。
|
||||
.TP
|
||||
.B 1:[20.35]-
|
||||
1[20.35] の位置からディスクの末尾までを吸い出します。
|
||||
.TP
|
||||
.B \-2
|
||||
ディスクの先頭からトラック 2 まで(トラック 2 も含みます)を吸い出します。
|
||||
.TP
|
||||
.B \-2:[30.35]
|
||||
ディスクの先頭から 2:[30.35] の位置まで吸い出します。
|
||||
.TP
|
||||
.B 2-4
|
||||
トラック 2 の先頭からトラック 4 の末尾までを吸い出します。
|
||||
.P
|
||||
繰り返しになりますが、角括弧および単語の先頭にあるハイフンは必ずクォート
|
||||
して、シェルに展開されないようにしてください。
|
||||
|
||||
.SH 指定例
|
||||
|
||||
クォートも含めた指定例をいくつか示します:
|
||||
.TP
|
||||
ドライブの調査だけを徹底的に行い、自動検出の結果を全て報告します:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ -vsQ
|
||||
.TP
|
||||
ディスク全体を吸い出します。それぞれのトラックは別々のファイルにします:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ -B "1-"
|
||||
.TP
|
||||
トラック 1 の時刻 0:30.12 から時刻 1:10.00 までを吸い出します:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ "1[:30.12]-1[1:10]"
|
||||
.TP
|
||||
トラック 1 の時刻 0:30.12 から 1 分間のデータを吸い出します:
|
||||
.P
|
||||
@CDPARANOIA_NAME@ "1[:30.12]-[1:00]"
|
||||
|
||||
.SH 出力
|
||||
|
||||
出力ファイルを指定する引き数は省略可能です。指定されていなければ、
|
||||
@CDPARANOIA_NAME@ はサンプル音声を
|
||||
.BR cdda.wav ", " cdda.aifc ", " cdda.raw
|
||||
のいずれかに出力します。どのファイルに出力されるのかは、オプション
|
||||
.BR \-w ", " \-a ", " \-r "," \-R
|
||||
のうちいずれを使うかによって決まります(何も指定しなければ
|
||||
.BR \-w
|
||||
がデフォルト値です)。出力ファイルを指定する引き数が
|
||||
.B \-
|
||||
ならば、出力は標準出力に対して行われます。どのデータ形式でもパイプに送
|
||||
ることができます。
|
||||
|
||||
.SH 謝辞
|
||||
@CDPARANOIA_NAME@ の基となったのは Heiko Eissfeldt さん
|
||||
(heiko@colossus.escape.de)が作成した 'cdda2wav' パッケージであり、
|
||||
以前は @CDPARANOIA_NAME@ のインタフェースの大部分は cdda2wav からもらってきた
|
||||
ものでした。cdda2wav がなければ、@CDPARANOIA_NAME@ が作られることはなかったで
|
||||
しょう。
|
||||
.P
|
||||
Joerg Schilling さんが作成した汎用 SCSI データ転送ライブラリから、SCSI
|
||||
の専門知識を多く学ばせていただきました。
|
||||
.P
|
||||
.SH 作者
|
||||
Monty <monty@xiph.org>
|
||||
.P
|
||||
cdparanoia のホームページは以下の場所にあります:
|
||||
.P
|
||||
.ce
|
||||
http://www.xiph.org/paranoia/
|
||||
.P
|
||||
libcdio のホームページは以下の場所にあります:
|
||||
.P
|
||||
.ce
|
||||
http://www.gnu.org/libcdio/
|
||||
@@ -1,18 +0,0 @@
|
||||
0 70 100
|
||||
A |----------|-----|
|
||||
B |-----|---------|
|
||||
0 40 100
|
||||
|
||||
offset=-30
|
||||
begin=30
|
||||
end=100
|
||||
|
||||
0 70 100
|
||||
A |----------|-----|
|
||||
B |-----|---------|
|
||||
50 90 150
|
||||
|
||||
offset=20
|
||||
begin=30
|
||||
end=100
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,126 +0,0 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@gnu.org.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
#if defined (__STDC__) && __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
extern int getopt (int argc, char *const *argv, const char *optstring);
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind,
|
||||
int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt ();
|
||||
extern int getopt_long ();
|
||||
extern int getopt_long_only ();
|
||||
|
||||
extern int _getopt_internal ();
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* getopt.h */
|
||||
@@ -1,190 +0,0 @@
|
||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@gnu.org.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
#if !defined __STDC__ || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#define GETOPT_INTERFACE_VERSION 2
|
||||
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
|
||||
#define ELIDE_CODE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ELIDE_CODE
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
int
|
||||
getopt_long (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
|
||||
}
|
||||
|
||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||
If an option that starts with '-' (not '--') doesn't match a long option,
|
||||
but does match a short option, it is parsed as a short option
|
||||
instead. */
|
||||
|
||||
int
|
||||
getopt_long_only (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* Not ELIDE_CODE. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"add", 1, 0, 0},
|
||||
{"append", 0, 0, 0},
|
||||
{"delete", 1, 0, 0},
|
||||
{"verbose", 0, 0, 0},
|
||||
{"create", 0, 0, 0},
|
||||
{"file", 1, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
printf ("option %s", long_options[option_index].name);
|
||||
if (optarg)
|
||||
printf (" with arg %s", optarg);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
printf ("option d with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2004 Rocky Bernstein <rocky@gnu.org
|
||||
Copyright (C) 1998 Monty xiphmont@mit.edu
|
||||
and Heiko Eissfeldt heiko@escape.colossus.de
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \file header.h
|
||||
* \brief WAV, AIFF and AIFC header-writing routines.
|
||||
*/
|
||||
|
||||
#include "header.h"
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static void PutNum(long num,int f,int endianness,int bytes){
|
||||
int i;
|
||||
unsigned char c;
|
||||
|
||||
if(!endianness)
|
||||
i=0;
|
||||
else
|
||||
i=bytes-1;
|
||||
while(bytes--){
|
||||
c=(num>>(i<<3))&0xff;
|
||||
if(write(f,&c,1)==-1){
|
||||
perror("Could not write to output.");
|
||||
exit(1);
|
||||
}
|
||||
if(endianness)
|
||||
i--;
|
||||
else
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/** Writes WAV headers */
|
||||
void
|
||||
WriteWav(int f, long int bytes)
|
||||
{
|
||||
/* quick and dirty */
|
||||
|
||||
write(f,"RIFF",4); /* 0-3 */
|
||||
PutNum(bytes+44-8,f,0,4); /* 4-7 */
|
||||
write(f,"WAVEfmt ",8); /* 8-15 */
|
||||
PutNum(16,f,0,4); /* 16-19 */
|
||||
PutNum(1,f,0,2); /* 20-21 */
|
||||
PutNum(2,f,0,2); /* 22-23 */
|
||||
PutNum(44100,f,0,4); /* 24-27 */
|
||||
PutNum(44100*2*2,f,0,4); /* 28-31 */
|
||||
PutNum(4,f,0,2); /* 32-33 */
|
||||
PutNum(16,f,0,2); /* 34-35 */
|
||||
write(f,"data",4); /* 36-39 */
|
||||
PutNum(bytes,f,0,4); /* 40-43 */
|
||||
}
|
||||
|
||||
/** Writes AIFF headers */
|
||||
void
|
||||
WriteAiff(int f, long int bytes)
|
||||
{
|
||||
long size=bytes+54;
|
||||
long frames=bytes/4;
|
||||
|
||||
/* Again, quick and dirty */
|
||||
|
||||
write(f,"FORM",4); /* 4 */
|
||||
PutNum(size-8,f,1,4); /* 8 */
|
||||
write(f,"AIFF",4); /* 12 */
|
||||
|
||||
write(f,"COMM",4); /* 16 */
|
||||
PutNum(18,f,1,4); /* 20 */
|
||||
PutNum(2,f,1,2); /* 22 */
|
||||
PutNum(frames,f,1,4); /* 26 */
|
||||
PutNum(16,f,1,2); /* 28 */
|
||||
write(f,"@\016\254D\0\0\0\0\0\0",10); /* 38 (44.100 as a float) */
|
||||
|
||||
write(f,"SSND",4); /* 42 */
|
||||
PutNum(bytes+8,f,1,4); /* 46 */
|
||||
PutNum(0,f,1,4); /* 50 */
|
||||
PutNum(0,f,1,4); /* 54 */
|
||||
|
||||
}
|
||||
|
||||
/** Writes AIFC headers */
|
||||
void
|
||||
WriteAifc(int f, long bytes)
|
||||
{
|
||||
long size=bytes+86;
|
||||
long frames=bytes/4;
|
||||
|
||||
/* Again, quick and dirty */
|
||||
|
||||
write(f,"FORM",4); /* 4 */
|
||||
PutNum(size-8,f,1,4); /* 8 */
|
||||
write(f,"AIFC",4); /* 12 */
|
||||
write(f,"FVER",4); /* 16 */
|
||||
PutNum(4,f,1,4); /* 20 */
|
||||
PutNum(2726318400UL,f,1,4); /* 24 */
|
||||
|
||||
write(f,"COMM",4); /* 28 */
|
||||
PutNum(38,f,1,4); /* 32 */
|
||||
PutNum(2,f,1,2); /* 34 */
|
||||
PutNum(frames,f,1,4); /* 38 */
|
||||
PutNum(16,f,1,2); /* 40 */
|
||||
write(f,"@\016\254D\0\0\0\0\0\0",10); /* 50 (44.100 as a float) */
|
||||
|
||||
write(f,"NONE",4); /* 54 */
|
||||
PutNum(14,f,1,1); /* 55 */
|
||||
write(f,"not compressed",14); /* 69 */
|
||||
PutNum(0,f,1,1); /* 70 */
|
||||
|
||||
write(f,"SSND",4); /* 74 */
|
||||
PutNum(bytes+8,f,1,4); /* 78 */
|
||||
PutNum(0,f,1,4); /* 82 */
|
||||
PutNum(0,f,1,4); /* 86 */
|
||||
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
$Id: header.h,v 1.2 2008/04/11 15:44:00 karl Exp $
|
||||
|
||||
Copyright (C) 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 1998 Monty <xiphmont@mit.edu>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \file header.h
|
||||
* \brief header for WAV, AIFF and AIFC header-writing routines.
|
||||
*/
|
||||
|
||||
/** Writes WAV headers */
|
||||
extern void WriteWav(int f,long int i_bytes);
|
||||
|
||||
/** Writes AIFC headers */
|
||||
extern void WriteAifc(int f,long int i_bytes);
|
||||
|
||||
/** Writes AIFF headers */
|
||||
extern void WriteAiff(int f,long int_bytes);
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# $Id: pod2c.pl,v 1.4 2008/06/19 15:44:31 flameeyes Exp $
|
||||
# Utility to turn pieces of pod text to help text.
|
||||
use File::Basename;
|
||||
|
||||
die "Expecting exactly one argument, a filename" if @ARGV != 1;
|
||||
$filename = shift;
|
||||
|
||||
($name, $path, $suffix)=fileparse($filename,"\.txt");
|
||||
close(STDIN);
|
||||
open(STDIN, "<$filename")
|
||||
|| die "Can't open $filename for reading:\n$!";
|
||||
|
||||
#$outfile="../${filename}.h";
|
||||
#open(STDOUT, ">$outfile")
|
||||
# || die "Can't open $outfile for writing:\n$!";
|
||||
|
||||
print "/*
|
||||
Copyright (C) 1999, 2005, 2007, 2008 Rocky Bernstein
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
static const char ${name}_help[] =\n";
|
||||
while(<STDIN>) {
|
||||
s/["]/\\"/g;
|
||||
# Change POD'ed items to quoted items, e.g. See L<y> and L<z> becomes
|
||||
# See "y" and "z" (with \'s around the quotes)
|
||||
s/[C,L,I,B,F]<(.+?)>/\\"$1\\"/g;
|
||||
chomp;
|
||||
if ( $^O eq "cygwin" ) {
|
||||
s/\
|
||||
//
|
||||
}
|
||||
print "\"$_\\n\"\n";
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2004, 2008, 2010, 2011 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 1998 Monty xiphmont@mit.edu
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/******************************************************************
|
||||
*
|
||||
* reporting/logging routines
|
||||
*
|
||||
******************************************************************/
|
||||
|
||||
|
||||
/* config.h has to come first else _FILE_OFFSET_BITS are redefined in
|
||||
say opensolaris. */
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
# define __CDIO_CONFIG_H__ 1
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <cdio/cdda.h>
|
||||
#include "report.h"
|
||||
|
||||
int quiet=0;
|
||||
int verbose=CDDA_MESSAGE_FORGETIT;
|
||||
|
||||
void
|
||||
report(const char *s)
|
||||
{
|
||||
if (!quiet) {
|
||||
fprintf(stderr, "%s", s);
|
||||
fputc('\n',stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
report2(const char *s, char *s2)
|
||||
{
|
||||
if (!quiet) {
|
||||
fprintf(stderr,s,s2);
|
||||
fputc('\n',stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
report3(const char *s, char *s2, char *s3)
|
||||
{
|
||||
if (!quiet) {
|
||||
fprintf(stderr,s,s2,s3);
|
||||
fputc('\n',stderr);
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
extern void report(const char *s);
|
||||
extern void report2(const char *s, char *s2);
|
||||
extern void report3(const char *s, char *s2, char *s3);
|
||||
@@ -1,143 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 1999, 2005, 2008, 2009 Rocky Bernstein
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
const char usage_help[] =
|
||||
"USAGE:\n"
|
||||
" cd-paranoia [options] <span> [outfile]\n"
|
||||
"\n"
|
||||
"OPTIONS:\n"
|
||||
" -v --verbose : extra verbose operation\n"
|
||||
" -q --quiet : quiet operation\n"
|
||||
" -e --stderr-progress : force output of progress information to\n"
|
||||
" -l --log-summary <file> : save result summary to file\n"
|
||||
" stderr (for wrapper scripts)\n"
|
||||
" -V --version : print version info and quit\n"
|
||||
" -Q --query : autosense drive, query disc and quit\n"
|
||||
" -B --batch : 'batch' mode (saves each track to a\n"
|
||||
" seperate file.\n"
|
||||
" -s --search-for-drive : do an exhaustive search for drive\n"
|
||||
" -h --help : print help\n"
|
||||
"\n"
|
||||
" -p --output-raw : output raw 16 bit PCM in host byte \n"
|
||||
" order\n"
|
||||
" -r --output-raw-little-endian : output raw 16 bit little-endian PCM\n"
|
||||
" -R --output-raw-big-endian : output raw 16 bit big-endian PCM\n"
|
||||
" -w --output-wav : output as WAV file (default)\n"
|
||||
" -f --output-aiff : output as AIFF file\n"
|
||||
" -a --output-aifc : output as AIFF-C file\n"
|
||||
"\n"
|
||||
" -c --force-cdrom-little-endian : force treating drive as little endian\n"
|
||||
" -C --force-cdrom-big-endian : force treating drive as big endian\n"
|
||||
" -n --force-default-sectors <n> : force default number of sectors in read\n"
|
||||
" to n sectors\n"
|
||||
" -o --force-search-overlap <n> : force minimum overlap search during\n"
|
||||
" verification to n sectors\n"
|
||||
" -d --force-cdrom-device <dev> : use specified device; disallow \n"
|
||||
" autosense\n"
|
||||
" -g --force-generic-device <dev> : really an alias for -d. Kept for \n"
|
||||
" compatibility.\n"
|
||||
" -S --force-read-speed <n> : read from device at specified speed\n"
|
||||
" -t --toc-offset <n> : Add <n> sectors to the values reported\n"
|
||||
" when addressing tracks. May be negative\n"
|
||||
" -T --toc-bias : Assume that the beginning offset of \n"
|
||||
" track 1 as reported in the TOC will be\n"
|
||||
" addressed as LBA 0. Necessary for some\n"
|
||||
" Toshiba drives to get track boundaries\n"
|
||||
" correct\n"
|
||||
" -m --mmc-timeout <n> : Set SCSI-MMC timeout to <n> seconds.\n"
|
||||
" -O --sample-offset <n> : Add <n> samples to the offset when\n"
|
||||
" reading data. May be negative.\n"
|
||||
" -z --never-skip[=n] : never accept any less than perfect\n"
|
||||
" data reconstruction (don't allow 'V's)\n"
|
||||
" but if [n] is given, skip after [n]\n"
|
||||
" retries without progress.\n"
|
||||
" -Z --disable-paranoia : disable all paranoia checking\n"
|
||||
" -Y --disable-extra-paranoia : only do cdda2wav-style overlap checking\n"
|
||||
" -X --abort-on-skip : abort on imperfect reads/skips\n"
|
||||
" -x --test-flags=mask : simulate CD-reading errors of ilk-mask n\n"
|
||||
" mask & 0x10 - simulate underrun errors\n"
|
||||
"\n"
|
||||
"OUTPUT SMILIES:\n"
|
||||
" :-) Normal operation, low/no jitter\n"
|
||||
" :-| Normal operation, considerable jitter\n"
|
||||
" :-/ Read drift\n"
|
||||
" :-P Unreported loss of streaming in atomic read operation\n"
|
||||
" 8-| Finding read problems at same point during reread; hard to correct\n"
|
||||
" :-0 SCSI/ATAPI transport error\n"
|
||||
" :-( Scratch detected\n"
|
||||
" ;-( Gave up trying to perform a correction\n"
|
||||
" 8-X Aborted (as per -X) due to a scratch/skip\n"
|
||||
" :^D Finished extracting\n"
|
||||
"\n"
|
||||
"PROGRESS BAR SYMBOLS:\n"
|
||||
"<space> No corrections needed\n"
|
||||
" - Jitter correction required\n"
|
||||
" + Unreported loss of streaming/other error in read\n"
|
||||
" ! Errors are getting through stage 1 but corrected in stage2\n"
|
||||
" e SCSI/ATAPI transport error (corrected)\n"
|
||||
" V Uncorrected error/skip\n"
|
||||
"\n"
|
||||
"SPAN ARGUMENT:\n"
|
||||
"The span argument may be a simple track number or a offset/span\n"
|
||||
"specification. The syntax of an offset/span takes the rough form:\n"
|
||||
" \n"
|
||||
" 1[ww:xx:yy.zz]-2[aa:bb:cc.dd] \n"
|
||||
"\n"
|
||||
"Here, 1 and 2 are track numbers; the numbers in brackets provide a\n"
|
||||
"finer grained offset within a particular track. [aa:bb:cc.dd] is in\n"
|
||||
"hours/minutes/seconds/sectors format. Zero fields need not be\n"
|
||||
"specified: [::20], [:20], [20], [20.], etc, would be interpreted as\n"
|
||||
"twenty seconds, [10:] would be ten minutes, [.30] would be thirty\n"
|
||||
"sectors (75 sectors per second).\n"
|
||||
"\n"
|
||||
"When only a single offset is supplied, it is interpreted as a starting\n"
|
||||
"offset and ripping will continue to the end of he track. If a single\n"
|
||||
"offset is preceeded or followed by a hyphen, the implicit missing\n"
|
||||
"offset is taken to be the start or end of the disc, respectively. Thus:\n"
|
||||
"\n"
|
||||
" 1:[20.35] Specifies ripping from track 1, second 20, sector 35 to \n"
|
||||
" the end of track 1.\n"
|
||||
"\n"
|
||||
" 1:[20.35]- Specifies ripping from 1[20.35] to the end of the disc\n"
|
||||
"\n"
|
||||
" -2 Specifies ripping from the beginning of the disc up to\n"
|
||||
" (and including) track 2\n"
|
||||
"\n"
|
||||
" -2:[30.35] Specifies ripping from the beginning of the disc up to\n"
|
||||
" 2:[30.35]\n"
|
||||
"\n"
|
||||
" 2-4 Specifies ripping from the beginning of track two to the\n"
|
||||
" end of track 4.\n"
|
||||
"\n"
|
||||
"Don't forget to protect square brackets and preceeding hyphens from\n"
|
||||
"the shell...\n"
|
||||
"\n"
|
||||
"A few examples, protected from the shell:\n"
|
||||
" A) query only with exhaustive search for a drive and full reporting\n"
|
||||
" of autosense:\n"
|
||||
" cd-paranoia -vsQ\n"
|
||||
"\n"
|
||||
" B) extract up to and including track 3, putting each track in a seperate\n"
|
||||
" file:\n"
|
||||
" cd-paranoia -B -- \"-3\"\n"
|
||||
"\n"
|
||||
" C) extract from track 1, time 0:30.12 to 1:10.00:\n"
|
||||
" cd-paranoia \"[:30.12]-1[1:10]\"\n"
|
||||
"\n"
|
||||
"Submit bug reports to bug-libcdio@gnu.org\n"
|
||||
"\n"
|
||||
;
|
||||
@@ -1,124 +0,0 @@
|
||||
USAGE:
|
||||
@CDPARANOIA_NAME@ [options] <span> [outfile]
|
||||
|
||||
OPTIONS:
|
||||
-v --verbose : extra verbose operation
|
||||
-q --quiet : quiet operation
|
||||
-e --stderr-progress : force output of progress information to
|
||||
stderr (for wrapper scripts)
|
||||
-l --log-summary <file> : save result summary to file
|
||||
-V --version : print version info and quit
|
||||
-Q --query : autosense drive, query disc and quit
|
||||
-B --batch : 'batch' mode (saves each track to a
|
||||
seperate file.
|
||||
-s --search-for-drive : do an exhaustive search for drive
|
||||
-h --help : print help
|
||||
|
||||
-p --output-raw : output raw 16 bit PCM in host byte
|
||||
order
|
||||
-r --output-raw-little-endian : output raw 16 bit little-endian PCM
|
||||
-R --output-raw-big-endian : output raw 16 bit big-endian PCM
|
||||
-w --output-wav : output as WAV file (default)
|
||||
-f --output-aiff : output as AIFF file
|
||||
-a --output-aifc : output as AIFF-C file
|
||||
|
||||
-c --force-cdrom-little-endian : force treating drive as little endian
|
||||
-C --force-cdrom-big-endian : force treating drive as big endian
|
||||
-n --force-default-sectors <n> : force default number of sectors in read
|
||||
to n sectors
|
||||
-o --force-search-overlap <n> : force minimum overlap search during
|
||||
verification to n sectors
|
||||
-d --force-cdrom-device <dev> : use specified device; disallow
|
||||
autosense
|
||||
-g --force-generic-device <dev> : really an alias for -d. Kept for
|
||||
compatibility.
|
||||
-S --force-read-speed <n> : read from device at specified speed
|
||||
-t --toc-offset <n> : Add <n> sectors to the values reported
|
||||
when addressing tracks. May be negative
|
||||
-T --toc-bias : Assume that the beginning offset of
|
||||
track 1 as reported in the TOC will be
|
||||
addressed as LBA 0. Necessary for some
|
||||
Toshiba drives to get track boundaries
|
||||
correct
|
||||
-m --mmc-timeout <n> : Set SCSI-MMC timeout to <n> seconds.
|
||||
-O --sample-offset <n> : Add <n> samples to the offset when
|
||||
reading data. May be negative.
|
||||
-z --never-skip[=n] : never accept any less than perfect
|
||||
data reconstruction (don't allow 'V's)
|
||||
but if [n] is given, skip after [n]
|
||||
retries without progress.
|
||||
-Z --disable-paranoia : disable all paranoia checking
|
||||
-Y --disable-extra-paranoia : only do cdda2wav-style overlap checking
|
||||
-X --abort-on-skip : abort on imperfect reads/skips
|
||||
-x --test-flags=mask : simulate CD-reading errors of ilk-mask n
|
||||
mask & 0x10 - simulate underrun errors
|
||||
|
||||
OUTPUT SMILIES:
|
||||
:-) Normal operation, low/no jitter
|
||||
:-| Normal operation, considerable jitter
|
||||
:-/ Read drift
|
||||
:-P Unreported loss of streaming in atomic read operation
|
||||
8-| Finding read problems at same point during reread; hard to correct
|
||||
:-0 SCSI/ATAPI transport error
|
||||
:-( Scratch detected
|
||||
;-( Gave up trying to perform a correction
|
||||
8-X Aborted (as per -X) due to a scratch/skip
|
||||
:^D Finished extracting
|
||||
|
||||
PROGRESS BAR SYMBOLS:
|
||||
<space> No corrections needed
|
||||
- Jitter correction required
|
||||
+ Unreported loss of streaming/other error in read
|
||||
! Errors are getting through stage 1 but corrected in stage2
|
||||
e SCSI/ATAPI transport error (corrected)
|
||||
V Uncorrected error/skip
|
||||
|
||||
SPAN ARGUMENT:
|
||||
The span argument may be a simple track number or a offset/span
|
||||
specification. The syntax of an offset/span takes the rough form:
|
||||
|
||||
1[ww:xx:yy.zz]-2[aa:bb:cc.dd]
|
||||
|
||||
Here, 1 and 2 are track numbers; the numbers in brackets provide a
|
||||
finer grained offset within a particular track. [aa:bb:cc.dd] is in
|
||||
hours/minutes/seconds/sectors format. Zero fields need not be
|
||||
specified: [::20], [:20], [20], [20.], etc, would be interpreted as
|
||||
twenty seconds, [10:] would be ten minutes, [.30] would be thirty
|
||||
sectors (75 sectors per second).
|
||||
|
||||
When only a single offset is supplied, it is interpreted as a starting
|
||||
offset and ripping will continue to the end of he track. If a single
|
||||
offset is preceeded or followed by a hyphen, the implicit missing
|
||||
offset is taken to be the start or end of the disc, respectively. Thus:
|
||||
|
||||
1:[20.35] Specifies ripping from track 1, second 20, sector 35 to
|
||||
the end of track 1.
|
||||
|
||||
1:[20.35]- Specifies ripping from 1[20.35] to the end of the disc
|
||||
|
||||
-2 Specifies ripping from the beginning of the disc up to
|
||||
(and including) track 2
|
||||
|
||||
-2:[30.35] Specifies ripping from the beginning of the disc up to
|
||||
2:[30.35]
|
||||
|
||||
2-4 Specifies ripping from the beginning of track two to the
|
||||
end of track 4.
|
||||
|
||||
Don't forget to protect square brackets and preceeding hyphens from
|
||||
the shell...
|
||||
|
||||
A few examples, protected from the shell:
|
||||
A) query only with exhaustive search for a drive and full reporting
|
||||
of autosense:
|
||||
@CDPARANOIA_NAME@ -vsQ
|
||||
|
||||
B) extract up to and including track 3, putting each track in a separate
|
||||
file:
|
||||
@CDPARANOIA_NAME@ -B -- "-3"
|
||||
|
||||
C) extract from track 1, time 0:30.12 to 1:10.00:
|
||||
@CDPARANOIA_NAME@ "[:30.12]-1[1:10]"
|
||||
|
||||
Submit bug reports to bug-libcdio@gnu.org
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
$Id: utils.h,v 1.5 2008/04/11 15:44:00 karl Exp $
|
||||
|
||||
Copyright (C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 1998 Monty <xiphmont@mit.edu>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define copystring(s) (s) ? s : NULL;
|
||||
|
||||
static inline char *
|
||||
catstring(char *buff, const char *s)
|
||||
{
|
||||
if(s){
|
||||
if(buff)
|
||||
buff=realloc(buff,strlen(buff)+strlen(s)+1);
|
||||
else
|
||||
buff=calloc(strlen(s)+1,1);
|
||||
strcat(buff,s);
|
||||
}
|
||||
return(buff);
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
$Id: version.h,v 1.6 2008/04/11 15:44:00 karl Exp $
|
||||
|
||||
Copyright (C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 2001 Monty <xiphmont@mit.edu>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/******************************************************************
|
||||
* cdda_paranoia generation III release 9.8 libcdio
|
||||
******************************************************************/
|
||||
#include <cdio/version.h>
|
||||
|
||||
#define PARANOIA_VERSION \
|
||||
"cdparanoia III release 9.8 libcdio " CDIO_VERSION "\n" \
|
||||
"(C) 2001 Monty <monty@xiph.org> and Xiphophorus\n" \
|
||||
"(C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>\n\n" \
|
||||
"Report bugs to bug-libcdio@gnu.org\n"
|
||||
Reference in New Issue
Block a user