ecco un esempio di programma libasound con definizioni appena sufficienti per ottenere un output wav di base a 2 canali 44.1k senza le intestazioni.
EDIT:in realtà non sono sicuro che il dump diretto dei dati come wav funzionerebbe, poiché il rumore durante la registrazione potrebbe facilmente danneggiarlo, ma probabilmente puoi fare qualcosa come un'onda sinusoidale di bit ad alta frequenza che è più affidabile
EDIT2:se aplay è presente e funziona, puoi anche usarlo e scrivere semplicemente un programma che emette audio non elaborato e lo convoglia in aplay o qualsiasi cosa in grado di riprodurre audio
EDIT3:modificato per non utilizzare alcuna intestazione
se -lasound non viene compilato, aggiungi -L/path/where/libasound/is/located
/*
gcc alsa_noheader.c -lasound
cat stuff.wav | ./a.out
*/
typedef unsigned int uint;
typedef unsigned long ulon;
int printf(char*, ...);
void* malloc(long);
long read(int fd, void* buf, ulon count);
int snd_pcm_open(void**, char*, int, int);
ulon snd_pcm_hw_params_sizeof();
int snd_pcm_hw_params_any(void*, void*);
int snd_pcm_hw_params_set_access(void*, void*, int);
int snd_pcm_hw_params_set_format(void*, void*, int);
int snd_pcm_hw_params_set_channels(void*, void*, uint);
int snd_pcm_hw_params_set_rate_near(void*, void*, uint*, int*);
int snd_pcm_hw_params(void*, void*);
int snd_pcm_hw_params_get_period_size(void*, ulon*, int*);
long snd_pcm_writei(void*, void*, uint);
int snd_pcm_prepare(void*);
int snd_pcm_drain(void*);
int snd_pcm_close(void*);
int main(int argc, char* argv[])
{
void* pcm;
void* params;
int rate;
int nchannels;
ulon frames;
void* buf;
int bufsize;
long nread;
snd_pcm_open(&pcm, "default", 0, 0);
params = malloc(snd_pcm_hw_params_sizeof());
snd_pcm_hw_params_any(pcm, params);
/* 3 = rw_interleaved */
snd_pcm_hw_params_set_access(pcm, params, 3);
/* 2 = 16-bit signed little endian */
snd_pcm_hw_params_set_format(pcm, params, 2);
/* 2 channels */
nchannels = 2;
snd_pcm_hw_params_set_channels(pcm, params, nchannels);
/* sample rate */
rate = 44100;
snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0);
snd_pcm_hw_params(pcm, params);
snd_pcm_hw_params_get_period_size(params, &frames, 0);
bufsize = frames * nchannels * 2;
buf = malloc(bufsize);
/* read file from stdin */
while (nread = read(0, buf, bufsize) > 0)
{
if (snd_pcm_writei(pcm, buf, frames) == -29)
{
printf("W: underrun\n");
snd_pcm_prepare(pcm);
}
}
snd_pcm_drain(pcm);
snd_pcm_close(pcm);
return 0;
}
La tua HDMI o qualsiasi altra porta di uscita del display funziona? In tal caso, puoi utilizzare un dispositivo di cattura dello schermo per registrarlo come video ed elaborarlo in un secondo momento. Quindi non essere limitato dal framerate della tua webcam.
Che ne dici di codificare in esadecimale i tuoi dati e inviarli pagina per pagina al terminale?
Puoi aggiungere un prefisso con l'offset nel binario in modo da poter facilmente rigenerare una pagina (per la correzione manuale?)
Quindi, su un altro computer, utilizza un software OCR per eseguire la scansione delle pagine.
Il terminale 80x25 produrrebbe 1000 byte per pagina (meno un po' di spazio per il prefisso). Quindi in circa 1000 pagine potresti ottenere i tuoi dati. Anche a una pagina al secondo, sono meno di 20 minuti.
La codifica esadecimale è facile da scrivere e fornisce anche una forma grezza di correzione degli errori (ci sono solo 16 simboli validi).