Ticket #2240: vorbis-tools-1.1.1-flac.patch

File vorbis-tools-1.1.1-flac.patch, 18.7 KB (added by Ag. Hatzimanikas, 17 years ago)

Linking against flac-1.1.4

  • vorbis-tools-1.1.1/configure.ac

    Add support for libFLAC-1.1.3. Original patch from Josh Coalson:
    http://lists.xiph.org/pipermail/vorbis-dev/2006-October/018561.html
    This patch updates that to build against svn trunk, and includes
    automatic detection of libFLAC version in ./configure.
    Tested against libFLAC versions 1.1.2 and 1.1.3. 
    
    old new  
    169169
    170170FLAC_LIBS=""
    171171if test "x$build_flac" = xyes; then
     172
    172173  AC_CHECK_LIB(m,log,FLAC_LIBS="-lm")
    173   AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_process_single],
    174     [have_libFLAC=yes; FLAC_LIBS="-lFLAC $FLAC_LIBS"],
    175     AC_MSG_WARN([libFLAC missing])
    176     have_libFLAC=no, [$FLAC_LIBS]
    177   )
    178   AC_CHECK_LIB(OggFLAC, [OggFLAC__stream_decoder_new],
    179     [FLAC_LIBS="-lOggFLAC $FLAC_LIBS $OGG_LIBS"],
    180     AC_MSG_WARN([libOggFLAC missing])
    181     have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS]
    182   )
     174
     175  dnl First check for libFLAC-1.1.3 or later. As of libFLAC 1.1.3,
     176  dnl OggFLAC functionality has been rolled into libFLAC rather
     177  dnl than being in a separate libOggFLAC library.
     178
     179  AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_init_ogg_stream],
     180    have_libFLAC=yes, have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS])
     181
     182  if test "x$have_libFLAC" = xyes; then
     183    FLAC_LIBS="-lFLAC $FLAC_LIBS $OGG_LIBS"
     184  else
     185    dnl Check for libFLAC prior to 1.1.3
     186    AC_CHECK_LIB(FLAC, [FLAC__stream_decoder_process_single],
     187      [have_libFLAC=yes; FLAC_LIBS="-lFLAC $FLAC_LIBS"],
     188      AC_MSG_WARN([libFLAC missing])
     189      have_libFLAC=no, [$FLAC_LIBS]
     190    )
     191
     192    AC_CHECK_LIB(OggFLAC, [OggFLAC__stream_decoder_new],
     193      [FLAC_LIBS="-lOggFLAC $FLAC_LIBS $OGG_LIBS"],
     194      AC_MSG_WARN([libOggFLAC missing])
     195      have_libFLAC=no, [$FLAC_LIBS $OGG_LIBS]
     196    )
     197  fi
     198
    183199  AC_CHECK_HEADER(FLAC/stream_decoder.h,,
    184200    AC_MSG_WARN(libFLAC headers missing)
    185201    have_libFLAC=no,[ ])
  • vorbis-tools-1.1.1/ogg123/flac_format.c

    old new  
    2020#include <string.h>
    2121#include <sys/types.h>
    2222#include <math.h>
    23 #include <FLAC/metadata.h>
     23#include <FLAC/all.h>
    2424#include <ao/ao.h>
    2525#include "audio.h"
    2626#include "format.h"
    2727#include "i18n.h"
     28#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8)
     29#define NEED_EASYFLAC 1
     30#endif
     31#if NEED_EASYFLAC
    2832#include "easyflac.h"
     33#endif
    2934#include "vorbis_comments.h"
    3035
    31 #define DEFAULT_FLAC_FRAME_SIZE 4608
    32 
    3336typedef struct {
     37#if NEED_EASYFLAC
    3438  EasyFLAC__StreamDecoder *decoder;
     39#else
     40  FLAC__StreamDecoder *decoder;
     41  int is_oggflac;
     42#endif
    3543  short channels;
    3644  int rate;
    3745  int bits_per_sample;
     
    6775
    6876
    6977/* Private functions declarations */
    70 FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
    71 FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
    72 void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
    73 void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
     78#if NEED_EASYFLAC
     79static FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
     80static FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
     81static void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
     82static void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
     83#else
     84static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
     85static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
     86static void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
     87static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
     88static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
     89#endif
    7490
    7591void resize_buffer(flac_private_t *flac, int newchannels, int newsamples);
    7692/*void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments);*/
     
    155171  private->buf_start = 0;
    156172 
    157173  /* Setup FLAC decoder */
     174#if NEED_EASYFLAC
    158175  if (oggflac_can_decode(source)) {
    159176    decoder->format = &oggflac_format;
    160177    private->decoder = EasyFLAC__stream_decoder_new(1);
     
    172189  EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_STREAMINFO);
    173190  EasyFLAC__set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
    174191  EasyFLAC__init(private->decoder);
     192#else
     193  if (oggflac_can_decode(source)) {
     194    private->is_oggflac = 1;
     195    decoder->format = &oggflac_format;
     196  } else {
     197    private->is_oggflac = 0;
     198    decoder->format = &flac_format;
     199  }
     200  private->decoder = FLAC__stream_decoder_new();
     201
     202  FLAC__stream_decoder_set_md5_checking(private->decoder, false);
     203  FLAC__stream_decoder_set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_STREAMINFO);
     204  FLAC__stream_decoder_set_metadata_respond(private->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
     205  /*FLAC__stream_decoder_init(private->decoder);*/
     206  if(private->is_oggflac)
     207    FLAC__stream_decoder_init_ogg_stream(private->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, decoder);
     208  else
     209    FLAC__stream_decoder_init_stream(private->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, decoder);
     210#endif
    175211 
    176212  /* Callback will set the total samples and sample rate */
     213#if NEED_EASYFLAC
    177214  EasyFLAC__process_until_end_of_metadata(private->decoder);
     215#else
     216  FLAC__stream_decoder_process_until_end_of_metadata(private->decoder);
     217#endif
    178218
    179219  /* Callback will set the number of channels and resize the
    180220     audio buffer */
     221#if NEED_EASYFLAC
    181222  EasyFLAC__process_single(private->decoder);
     223#else
     224  FLAC__stream_decoder_process_single(private->decoder);
     225#endif
    182226
    183227  /* FLAC API returns signed samples on all streams */
    184228  decoder->actual_fmt.signed_sample = 1;
     
    241285      realsamples += copy;
    242286    }
    243287    else if (!priv->eos) {
     288#if NEED_EASYFLAC
    244289      ret = EasyFLAC__process_single(priv->decoder);
    245290      if (!ret ||
    246291          EasyFLAC__get_state(priv->decoder)
    247292          == FLAC__STREAM_DECODER_END_OF_STREAM)
    248293        priv->eos = 1;  /* Bail out! */
     294#else
     295      ret = FLAC__stream_decoder_process_single(priv->decoder);
     296      if (!ret ||
     297          FLAC__stream_decoder_get_state(priv->decoder)
     298          == FLAC__STREAM_DECODER_END_OF_STREAM)
     299        priv->eos = 1;  /* Bail out! */
     300#endif
    249301    } else
    250302      break;
    251303  }
     
    311363    free(priv->buf[i]);
    312364 
    313365  free(priv->buf);
     366#if NEED_EASYFLAC
    314367  EasyFLAC__finish(priv->decoder);
    315368  EasyFLAC__stream_decoder_delete(priv->decoder);
     369#else
     370  FLAC__stream_decoder_finish(priv->decoder);
     371  FLAC__stream_decoder_delete(priv->decoder);
     372#endif
    316373
    317374  free(decoder->private);
    318375  free(decoder);
     
    342399
    343400
    344401
     402#if NEED_EASYFLAC
    345403FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
     404#else
     405FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
     406#endif
    346407{
    347408  decoder_t *e_decoder = client_data;
    348409  flac_private_t *priv = e_decoder->private;
     
    363424}
    364425
    365426
     427#if NEED_EASYFLAC
    366428FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
     429#else
     430FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
     431#endif
    367432{
    368433  decoder_t *e_decoder = client_data;
    369434  flac_private_t *priv = e_decoder->private;
     
    389454}
    390455
    391456
     457#if NEED_EASYFLAC
    392458void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
     459#else
     460void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
     461#endif
    393462{
    394463  decoder_t *e_decoder = client_data;
    395464  flac_private_t *priv = e_decoder->private;
     
    409478}
    410479
    411480
     481#if NEED_EASYFLAC
    412482void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
     483#else
     484void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
     485#endif
    413486{
    414487
    415488
    416489}
    417490
     491#if !NEED_EASYFLAC
     492FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
     493{
     494  decoder_t *e_decoder = client_data;
     495  flac_private_t *priv = e_decoder->private;
     496
     497  return priv->eos;
     498}
     499#endif
     500
    418501
    419502void resize_buffer(flac_private_t *flac, int newchannels, int newsamples)
    420503{
     
    457540   
    458541
    459542 
     543#if NEED_EASYFLAC
    460544  if (EasyFLAC__is_oggflac(priv->decoder))
     545#else
     546  if (priv->is_oggflac)
     547#endif
    461548    cb->printf_metadata(decoder->callback_arg, 2,
    462549                        _("Ogg FLAC stream: %d bits, %d channel, %ld Hz"),
    463550                        priv->bits_per_sample,
  • vorbis-tools-1.1.1/ogg123/easyflac.c

    old new  
    3333 *
    3434 */
    3535
     36#include <FLAC/export.h>
     37#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8)
     38
    3639#include <stdlib.h>
    3740#include "easyflac.h"
    3841
    39 
    4042FLAC__bool EasyFLAC__is_oggflac(EasyFLAC__StreamDecoder *decoder)
    4143{
    4244        return decoder->is_oggflac;
     
    373375        else
    374376                return FLAC__stream_decoder_process_until_end_of_stream(decoder->flac);
    375377}
     378
     379#endif
  • vorbis-tools-1.1.1/oggenc/flac.c

    old new  
    2020#include "platform.h"
    2121#include "resample.h"
    2222
    23 #define DEFAULT_FLAC_FRAME_SIZE 4608
     23#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8)
     24#define NEED_EASYFLAC 1
     25#endif
     26
     27#if NEED_EASYFLAC
     28static FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
     29static FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
     30static void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
     31static void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
     32#else
     33static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
     34static FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
     35static void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
     36static void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
     37static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
     38#endif
    2439
    25 FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
    26 FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
    27 void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
    28 void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
    29 
    30 void resize_buffer(flacfile *flac, int newchannels, int newsamples);
    31 void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments);
     40static void resize_buffer(flacfile *flac, int newchannels, int newsamples);
     41static void copy_comments (vorbis_comment *v_comments, FLAC__StreamMetadata_VorbisComment *f_comments);
    3242
    3343
    3444int flac_id(unsigned char *buf, int len)
     
    7686        flac->in = in;
    7787
    7888        /* Setup FLAC decoder */
     89#if NEED_EASYFLAC
    7990        flac->decoder = EasyFLAC__stream_decoder_new(oggflac_id(oldbuf, buflen));
    8091        EasyFLAC__set_client_data(flac->decoder, flac);
    8192        EasyFLAC__set_read_callback(flac->decoder, &easyflac_read_callback);
     
    8596        EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO);
    8697        EasyFLAC__set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
    8798        EasyFLAC__init(flac->decoder);
     99#else
     100    flac->decoder = FLAC__stream_decoder_new();
     101    FLAC__stream_decoder_set_md5_checking(flac->decoder, false);
     102    FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_STREAMINFO);
     103    FLAC__stream_decoder_set_metadata_respond(flac->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
     104    if(oggflac_id(oldbuf, buflen))
     105        FLAC__stream_decoder_init_ogg_stream(flac->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, flac);
     106    else
     107        FLAC__stream_decoder_init_stream(flac->decoder, read_callback, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, eof_callback, write_callback, metadata_callback, error_callback, flac);
     108#endif
    88109       
    89110        /* Callback will set the total samples and sample rate */
     111#if NEED_EASYFLAC
    90112        EasyFLAC__process_until_end_of_metadata(flac->decoder);
     113#else
     114    FLAC__stream_decoder_process_until_end_of_metadata(flac->decoder);
     115#endif
    91116
    92117        /* Callback will set the number of channels and resize the
    93118           audio buffer */
     119#if NEED_EASYFLAC
    94120        EasyFLAC__process_single(flac->decoder);
    95        
     121#else
     122    FLAC__stream_decoder_process_single(flac->decoder);
     123#endif
     124
    96125        /* Copy format info for caller */
    97126        opt->rate = flac->rate;
    98127        opt->channels = flac->channels;
     
    133162                }
    134163                else if (!flac->eos)
    135164                {
     165#if NEED_EASYFLAC
    136166                        ret = EasyFLAC__process_single(flac->decoder);
    137167                        if (!ret ||
    138168                            EasyFLAC__get_state(flac->decoder)
    139169                            == FLAC__STREAM_DECODER_END_OF_STREAM)
    140170                                flac->eos = 1;  /* Bail out! */
     171#else
     172            ret = FLAC__stream_decoder_process_single(flac->decoder);
     173            if (!ret ||
     174                FLAC__stream_decoder_get_state(flac->decoder)
     175                == FLAC__STREAM_DECODER_END_OF_STREAM)
     176                flac->eos = 1;  /* Bail out! */
     177#endif
    141178                } else
    142179                        break;
    143180        }
     
    157194        free(flac->buf);
    158195        free(flac->oldbuf);
    159196        free(flac->comments);
     197#if NEED_EASYFLAC
    160198        EasyFLAC__finish(flac->decoder);
    161199        EasyFLAC__stream_decoder_delete(flac->decoder);
     200#else
     201    FLAC__stream_decoder_finish(flac->decoder);
     202    FLAC__stream_decoder_delete(flac->decoder);
     203#endif
    162204        free(flac);
    163205}
    164206
    165207
     208#if NEED_EASYFLAC
    166209FLAC__StreamDecoderReadStatus easyflac_read_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
     210#else
     211FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
     212#endif
    167213{
    168214        flacfile *flac = (flacfile *) client_data;
    169215        int i = 0;
     
    200246        return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;       
    201247}
    202248
     249#if NEED_EASYFLAC
    203250FLAC__StreamDecoderWriteStatus easyflac_write_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
     251#else
     252FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
     253#endif
    204254{
    205255        flacfile *flac = (flacfile *) client_data;
    206256        int samples = frame->header.blocksize;
     
    221271        return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
    222272}
    223273
     274#if NEED_EASYFLAC
    224275void easyflac_metadata_callback(const EasyFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
     276#else
     277void metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
     278#endif
    225279{
    226280        flacfile *flac = (flacfile *) client_data;
    227281
     
    240294        }
    241295}
    242296
     297#if NEED_EASYFLAC
    243298void easyflac_error_callback(const EasyFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
     299#else
     300void error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
     301#endif
    244302{
    245         flacfile *flac = (flacfile *) client_data;
     303    flacfile *flac = (flacfile *) client_data;
     304
     305}
     306
     307#if !NEED_EASYFLAC
     308FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
     309{
     310    flacfile *flac = (flacfile *) client_data;
    246311
     312    return feof(flac->in)? true : false;
    247313}
     314#endif
    248315
    249316
    250317void resize_buffer(flacfile *flac, int newchannels, int newsamples)
  • vorbis-tools-1.1.1/oggenc/easyflac.c

    old new  
    3333 *
    3434 */
    3535
     36#include <FLAC/export.h>
     37#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8)
     38
    3639#include <stdlib.h>
    3740#include "easyflac.h"
    3841
     
    373376        else
    374377                return FLAC__stream_decoder_process_until_end_of_stream(decoder->flac);
    375378}
     379
     380#endif
  • vorbis-tools-1.1.1/oggenc/flac.h

    old new  
    55#include "encode.h"
    66#include "audio.h"
    77#include <stdio.h>
     8#include <FLAC/stream_decoder.h>
     9#if !defined(FLAC_API_VERSION_CURRENT) || (FLAC_API_VERSION_CURRENT < 8)
     10#define NEED_EASYFLAC 1
     11#endif
     12#if NEED_EASYFLAC
     13#include <OggFLAC/stream_decoder.h>
    814#include "easyflac.h"
     15#endif
    916
    1017typedef struct {
     18#if NEED_EASYFLAC
    1119        EasyFLAC__StreamDecoder *decoder;
     20#else
     21        FLAC__StreamDecoder *decoder;
     22#endif
    1223        short channels;
    1324        int rate;
    1425        long totalsamples; /* per channel, of course */