view libinterp/dldfcn/audioinfo.cc @ 19502:9161b7653392

compile audio file utilities even when sndfile is not present * audioinfo.cc, audioread.cc, audiowrite.cc: disable compiling parts that require sndfile if it is not present
author Vytautas Jančauskas <unaudio@gmail.com>
date Wed, 11 Sep 2013 19:53:17 +0300
parents 157eeaa53277
children 2e174b5e7703
line wrap: on
line source

#include "oct.h"
#include "ov-struct.h"
#include <sndfile.h>
  
DEFUN_DLD(audioinfo, args, ,
"-*- texinfo -*-\n\
@deftypefn{Loadable Function} info = audioinfo(@var{filename})\n\
\n\
Return information about an audio file specified by @var{filename}.\
\n\
@end deftypefn"
)
{
  octave_scalar_map retval;
#ifdef HAVE_SNDFILE
  Matrix audio;
  SNDFILE *file;
  SF_INFO info;
  info.format = 0;
  int start, end;
  file = sf_open(args(0).string_value ().c_str (), SFM_READ, &info);
  retval.assign ("Filename", args(0).string_value ());
  retval.assign ("CompressionMethod", "");
  retval.assign ("NumChannels", info.channels);
  retval.assign ("SampleRate", info.samplerate);
  retval.assign ("TotalSamples", info.frames);
  retval.assign ("Duration", (float)info.frames / (float)info.samplerate);
  int bits;
  if (info.format & SF_FORMAT_PCM_S8)
    {
      bits = 8;
    }
  else if (info.format & SF_FORMAT_PCM_U8)
    {
      bits = 8;
    }
  else if (info.format & SF_FORMAT_PCM_16)
    {
      bits = 16;
    }
  else if (info.format & SF_FORMAT_PCM_24)
    {
      bits = 24;
    }
  else if (info.format & SF_FORMAT_PCM_32)
    {
      bits = 32;
    }
  else
    {
      bits = -1;
    }
  retval.assign ("BitsPerSample", bits);
  retval.assign ("BitRate", -1);
  retval.assign ("Title", sf_get_string (file, SF_STR_TITLE));
  retval.assign ("Artist", sf_get_string (file, SF_STR_ARTIST));
  retval.assign ("Comment", sf_get_string (file, SF_STR_COMMENT));
#else
  error("sndfile not found on your system and thus audioinfo is not functional")
#endif
  return octave_value(retval);
}