also ich finde dass der Code in
https://raw.githubusercontent.com/ti...ter/tinyplay.c
genug Vorlage bildet um es kompakter umzuschreiben aber man muss sich schon einiges C & P bedienen
also aus dem tinyplay.c mal kondensiert und an deine Vorlage angepasst
Code:
unsigned int device = 0;
unsigned int card = 0;
unsigned int period_size = 1024;
unsigned int period_count = 4;
unsigned int channels = 2;
unsigned int rate = 48000;
unsigned int bits = 16;
unsigned int is_raw = 0; /* Default wav file */
struct riff_wave_header riff_wave_header;
struct chunk_header chunk_header;
struct chunk_fmt chunk_fmt;
bool_t readWavMeta(FILE* file)
{
int more_chunks = 1;
fread(&riff_wave_header, sizeof(riff_wave_header), 1, file);
if ((riff_wave_header.riff_id != ID_RIFF) ||
(riff_wave_header.wave_id != ID_WAVE)) {
fprintf(stderr, "Error: '%s' is not a riff/wave file\n", filename);
fclose(file);
return false;
}
do {
fread(&chunk_header, sizeof(chunk_header), 1, file);
switch (chunk_header.id) {
case ID_FMT:
fread(&chunk_fmt, sizeof(chunk_fmt), 1, file);
/* If the format header is larger, skip the rest */
if (chunk_header.sz > sizeof(chunk_fmt))
fseek(file, chunk_header.sz - sizeof(chunk_fmt), SEEK_CUR);
break;
case ID_DATA:
/* Stop looking for chunks */
more_chunks = 0;
break;
default:
/* Unknown chunk, skip bytes */
fseek(file, chunk_header.sz, SEEK_CUR);
}
} while (more_chunks);
playSetup.channels = chunk_fmt.num_channels;
playSetup.rate = chunk_fmt.sample_rate;
playSetup.bits = chunk_fmt.bits_per_sample;
return true;
}
FILE *file;
char *filename;
filename = "something.wav";
file = fopen(filename, "rb");
if (!file) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
return 1;
}
if(readWavMeta(file)) play_sample(file, card, device, channels, rate, bits, period_size, period_count);
fclose(file);
mit etwas mehr mühe hätt ich jetzt die meta daten noch in ein struct geworfen, aber das würde gerade zu lange dauern
Lesezeichen