view libmpcodecs/ad_roqaudio.c @ 7732:328bbac6224c

Fixes: - missing check in init - missing brackets causing failure - nas_aformat_to_auformat not working properly - fix hang that was finally reproducible with high disk activity - don't cut of audio on uninit(), wait for buffer to empty It also simplifies the event_handler, making it more readable and implements Sidik Isani's suggestion to make the buffer size dependent on bytes per second. I've been using it for two days and found no further problems. patch by Tobias Diedrich <td@sim.uni-hannover.de>
author arpi
date Sun, 13 Oct 2002 22:00:15 +0000
parents a117511790c0
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "config.h"
#include "ad_internal.h"

static ad_info_t info = 
{
	"Id RoQ File Audio Decoder",
	"roqaudio",
	"Nick Kurshev",
	"Mike Melanson",
	"" //"RoQA is an internal MPlayer FOURCC"
};

LIBAD_EXTERN(roqaudio)

// in native/roqav.c:
void *roq_decode_audio_init(void);
int roq_decode_audio(unsigned short *output, unsigned char *input,
  int encoded_size, int channels, void *context);

static int preinit(sh_audio_t *sh_audio)
{
  // minsize was stored in wf->nBlockAlign by the RoQ demuxer
  sh_audio->audio_out_minsize=sh_audio->wf->nBlockAlign;
  sh_audio->audio_in_minsize=sh_audio->audio_out_minsize / 2; // FIXME?
  sh_audio->context = roq_decode_audio_init();
  return 1;
}

static int init(sh_audio_t *sh_audio)
{
  sh_audio->channels=sh_audio->wf->nChannels;
  sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
  sh_audio->i_bps = 44100;
  return 1;
}

static void uninit(sh_audio_t *sh_audio)
{
}

static int control(sh_audio_t *sh,int cmd,void* arg, ...)
{
    // TODO!!!
  return CONTROL_UNKNOWN;
}

static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
{
  unsigned char header_data[6];
  int read_len;

  /* figure out how much data to read */
  if (demux_read_data(sh_audio->ds, header_data, 6) != 6) return -1; /* EOF */
  read_len = (header_data[5] << 24) | (header_data[4] << 16) |
	     (header_data[3] << 8) | header_data[2];
  read_len += 2;  /* 16-bit arguments */
  if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer, read_len) !=
    read_len) return -1;
  return 2 * roq_decode_audio((unsigned short *)buf, sh_audio->a_in_buffer,
    read_len, sh_audio->channels, sh_audio->context);
}