shithub: treason

ref: 85a8a51370eb0b8a4061fc601c705d43cc73b119
dir: treason/stream.c

View raw version
#include <u.h>
#include <libc.h>
#include "stream.h"

extern Streamops ivfops, mcops, audops;

static struct {
	char *name;
	Streamops *o;
}ops[] = {
	{"mc", &mcops},
	{"ivf", &ivfops},
	{"audio", &audops},
};

Stream *
Sopen(char *filename, int *num)
{
	int i, failed;
	Stream *s;

	*num = 0;
	for(i = 0; i < nelem(ops); i++){
		failed = 0;
		if((s = ops[i].o->open(filename, num, &failed)) != nil)
			return s;
		if(failed){
			werrstr("%s: %r", ops[i].name);
			return nil;
		}
	}

	werrstr("unknown format");

	return nil;
}

void
Sclose(Stream *s)
{
	if(s->type < 0)
		return;
	s->ops.close(s);
	s->type = -1;
}

int
Sread(Stream *s, Streamframe *f)
{
	if(s->type < 0)
		return -1;
	return s->ops.read(s, f);
}