Ignore:
Timestamp:
Dec 20, 2018, 8:34:33 PM (6 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/cnn, feature/crepe, fix/ffmpeg5, master
Children:
f7f946a
Parents:
9630fa8 (diff), b8fa393 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'feature/sink_vorbis' into feature/sink_flac

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/io/sink_vorbis.c

    r9630fa8 rd327b6f  
    2929#ifdef HAVE_VORBISENC
    3030
     31#include "fmat.h"
    3132#include "io/ioutils.h"
    32 #include "fmat.h"
    3333
    3434#include <vorbis/vorbisenc.h>
     
    3737#include <time.h> // time
    3838
    39 #define MAX_SIZE 2048
     39#define MAX_SIZE 4096
    4040
    4141struct _aubio_sink_vorbis_t {
     
    6464void del_aubio_sink_vorbis (aubio_sink_vorbis_t *s);
    6565
     66static uint_t aubio_sink_vorbis_write_page(aubio_sink_vorbis_t *s);
     67
    6668aubio_sink_vorbis_t * new_aubio_sink_vorbis (const char_t *uri,
    6769    uint_t samplerate)
     
    118120  s->fid = fopen((const char *)s->path, "wb");
    119121  if (!s->fid) {
    120     AUBIO_ERR("sink_vorbis: Error opening file %s (%s)\n",
    121         s->path, strerror(errno));
     122    char errorstr[256];
     123    AUBIO_STRERROR(errno, errorstr, sizeof(errorstr));
     124    AUBIO_ERR("sink_vorbis: Error opening file \'%s\' (%s)\n",
     125        s->path, errorstr);
    122126    return AUBIO_FAIL;
    123127  }
     
    144148  // write header
    145149  {
    146     int ret = 0;
    147     size_t wrote;
    148150    ogg_packet header;
    149151    ogg_packet header_comm;
     
    160162    while (1)
    161163    {
    162       ret = ogg_stream_flush(&s->os, &s->og);
    163       if (ret==0) break;
    164       wrote = fwrite(s->og.header, 1, s->og.header_len, s->fid);
    165       ret = (wrote == (unsigned)s->og.header_len);
    166       wrote = fwrite(s->og.body,   1, s->og.body_len,   s->fid);
    167       ret &= (wrote == (unsigned)s->og.body_len);
    168       if (ret == 0) {
    169         AUBIO_ERR("sink_vorbis: failed writing \'%s\' to disk (%s)\n",
    170             s->path, strerror(errno));
    171         return AUBIO_FAIL;
    172       }
     164      if (!ogg_stream_flush(&s->os, &s->og)) break;
     165      if (aubio_sink_vorbis_write_page(s)) return AUBIO_FAIL;
    173166    }
    174167  }
     
    212205}
    213206
    214 void aubio_sink_vorbis_write(aubio_sink_vorbis_t *s)
    215 {
     207static
     208uint_t aubio_sink_vorbis_write_page(aubio_sink_vorbis_t *s) {
    216209  int result;
    217210  size_t wrote;
     211  wrote = fwrite(s->og.header, 1, s->og.header_len, s->fid);
     212  result = (wrote == (unsigned)s->og.header_len);
     213  wrote = fwrite(s->og.body, 1, s->og.body_len,     s->fid);
     214  result &= (wrote == (unsigned)s->og.body_len);
     215  if (result == 0) {
     216    char errorstr[256];
     217    AUBIO_STRERROR(errno, errorstr, sizeof(errorstr));
     218    AUBIO_ERR("sink_vorbis: failed writing \'%s\' to disk (%s)\n",
     219        s->path, errorstr);
     220    return AUBIO_FAIL;
     221  }
     222  return AUBIO_OK;
     223}
     224
     225static
     226void aubio_sink_vorbis_write(aubio_sink_vorbis_t *s)
     227{
    218228  // pre-analysis
    219229  while (vorbis_analysis_blockout(&s->vd, &s->vb) == 1) {
     
    227237
    228238      while (1) {
    229         result = ogg_stream_pageout (&s->os, &s->og);
    230         if (result == 0) break;
    231         wrote = fwrite(s->og.header, 1, s->og.header_len, s->fid);
    232         result = (wrote == (unsigned)s->og.header_len);
    233         wrote = fwrite(s->og.body, 1, s->og.body_len,     s->fid);
    234         result &= (wrote == (unsigned)s->og.body_len);
    235         if (result == 0) {
    236           AUBIO_WRN("sink_vorbis: failed writing \'%s\' to disk (%s)\n",
    237               s->path, strerror(errno));
    238         }
     239        if (!ogg_stream_pageout (&s->os, &s->og)) break;
     240        aubio_sink_vorbis_write_page(s);
    239241        if (ogg_page_eos(&s->og)) break;
    240242      }
     
    291293    }
    292294    // tell vorbis how many frames were written
    293     vorbis_analysis_wrote(&s->vd, (long)write);
     295    vorbis_analysis_wrote(&s->vd, (long)length);
    294296  }
    295297
     
    306308
    307309  if (s->fid && fclose(s->fid)) {
    308     AUBIO_ERR("sink_vorbis: Error closing file %s (%s)\n",
    309         s->path, strerror(errno));
     310    char errorstr[256];
     311    AUBIO_STRERROR(errno, errorstr, sizeof(errorstr));
     312    AUBIO_ERR("sink_vorbis: Error closing file \'%s\' (%s)\n",
     313        s->path, errorstr);
    310314    return AUBIO_FAIL;
    311315  }
Note: See TracChangeset for help on using the changeset viewer.