Compare commits
2 Commits
054715a960
...
cac558181f
Author | SHA1 | Date | |
---|---|---|---|
|
cac558181f | ||
|
918e29cb98 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -37,4 +37,5 @@ ui/t
|
||||
|
||||
Beep/alguabeep
|
||||
Beep/*.log
|
||||
Beep/foo.html
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
#
|
||||
# _ _ ____ _ _ _ ____ _____ _____ ____
|
||||
# / \ ! ! / ___! ! ! ! / \ ! __ )! ____! ____! _ \
|
||||
# / _ \ ! ! ! ! _! ! ! !/ _ \ ! _ \! _! ! _! ! !_) !
|
||||
# / ___ \! !__! !_! ! !_! / ___ \! !_) ! !___! !___! __/
|
||||
# /_/ \_\_____\____!\___/_/ \_\____/!_____!_____!_!
|
||||
#
|
||||
|
||||
|
||||
CC = gcc
|
||||
|
@ -1,11 +1,22 @@
|
||||
# AlguaBeep
|
||||
|
||||
Une expérimentation hasardeuse pour traduire des images de webcam
|
||||
en sons qui déchirent les oreilles, mais qui sont bio-dégradables.
|
||||
C'est une expérimentation hasardeuse pour traduire des images de webcam
|
||||
en sons qui déchirent les oreilles, mais qui sont relativement
|
||||
inoffensifs.
|
||||
|
||||
Pour le moment, il n'y a pas de procédure d'installation, il faut
|
||||
donc lancer le binaire à partir du répertoire de dèv :
|
||||
`~/Devel/DD2-monitor/Beep/alguabeep [options]`, ce qui implique
|
||||
de ne pas aller mettre la grouille dans ce coin-là.
|
||||
|
||||
Ensuite, pour apprécier pleinement la kitchitude (assumée) de l'affichage
|
||||
numérique de la machinerie en action, il faut un `xterm` en 150 caractères
|
||||
de large, et une toute petite fonte.
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
available options:
|
||||
-d /dev/? select video device
|
||||
-I take pictures
|
||||
-K set the K parameter
|
||||
@ -39,5 +50,10 @@ En cas de problème sur l'acquisition vidéo, dans un terminal,
|
||||
tapez `ffplay /dev/videoN`, avec `N` de zéro à quatre. Vous
|
||||
tomberez peut-être sur l'image désirée.
|
||||
|
||||
En cas de système muet, il faut aller voir avec `alsamixer` si la sortie
|
||||
par défaut n'est pas en `mute`, mais il faut aussi parfois aller négocier
|
||||
avec _pulseaudio_ et sa logique étrange. Bon courage.
|
||||
|
||||
|
||||
Et surtout que la maman des algues reste CALME !
|
||||
|
||||
|
@ -1,4 +1,10 @@
|
||||
/* V4L2 video picture grabber
|
||||
/*
|
||||
|
||||
A crude sound experiment, by Clairchanoir et tTh
|
||||
|
||||
approimatively based on :
|
||||
|
||||
V4L2 video picture grabber
|
||||
Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -58,14 +64,14 @@ do {
|
||||
} while (r == -1 && ((errno == EINTR) || (errno == EAGAIN)));
|
||||
|
||||
if (r == -1) {
|
||||
fprintf(stderr, "error %d, %s\n", errno, strerror(errno));
|
||||
fprintf(stderr, "%s: error %d, %s\n", __func__, errno, strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
void help(int v)
|
||||
{
|
||||
puts("options :");
|
||||
puts("available options:");
|
||||
puts("\t-d /dev/?\tselect video device");
|
||||
puts("\t-I\t\ttake pictures");
|
||||
puts("\t-K\t\tset the K parameter");
|
||||
@ -200,7 +206,7 @@ initialise_ecran(0);
|
||||
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
xioctl(fd, VIDIOC_STREAMON, &type);
|
||||
|
||||
sprintf(chaine, "entering main loop, %d iters\n", nbre_capt);
|
||||
sprintf(chaine, "entering main loop, %9d iters\n", nbre_capt);
|
||||
mvaddstr(1, 0, chaine);
|
||||
refresh();
|
||||
fprintf(stderr, "%s\n", chaine);
|
||||
@ -243,8 +249,8 @@ for (i = 0; i < nbre_capt; i++) {
|
||||
// fmt.fmt.pix.width, fmt.fmt.pix.height, K);
|
||||
|
||||
if (mk_img) {
|
||||
sprintf(out_name, "i/out%04d.ppm", i);
|
||||
if (verbosity) fprintf(stderr, "--> %s\n", out_name);
|
||||
sprintf(out_name, "o/out%04d.ppm", i);
|
||||
if (verbosity) fprintf(stderr, "\t--> %s\n", out_name);
|
||||
|
||||
fout = fopen(out_name, "w");
|
||||
if (!fout) {
|
||||
@ -257,6 +263,10 @@ for (i = 0; i < nbre_capt; i++) {
|
||||
fclose(fout);
|
||||
}
|
||||
|
||||
/* XXX CRITICAL BUG XXX
|
||||
Doc say 'period can be real', so why not
|
||||
use nanosleep(2) ?
|
||||
*/
|
||||
if (nbre_capt > 1 && period) {
|
||||
sleep(period);
|
||||
}
|
||||
|
@ -1,4 +1,10 @@
|
||||
|
||||
/*
|
||||
* Ugly hack made for AlguaBeep
|
||||
*
|
||||
* +++++++++++++++++++++++++++++++++++++++++
|
||||
* + DO NOT USE IN REAL LIFE +
|
||||
* +++++++++++++++++++++++++++++++++++++++++
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -27,10 +33,10 @@ if (-1 == ioctl (fd, VIDIOC_QUERYCTRL, &queryctrl)) {
|
||||
perror ("VIDIOC_QUERYCTRL");
|
||||
exit (EXIT_FAILURE);
|
||||
} else {
|
||||
printf ("V4L2_CID_BRIGHTNESS is not supported\n");
|
||||
fprintf (stderr, "V4L2_CID_BRIGHTNESS is not supported\n");
|
||||
}
|
||||
} else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
|
||||
printf ("V4L2_CID_BRIGHTNESS is not supported\n");
|
||||
fprintf (stderr, "V4L2_CID_BRIGHTNESS is not supported\n");
|
||||
} else {
|
||||
memset (&control, 0, sizeof (control));
|
||||
control.id = V4L2_CID_BRIGHTNESS;
|
||||
|
@ -1,3 +1,8 @@
|
||||
/*
|
||||
* AlguaBeep is a cool project.
|
||||
* merci clairchanoir.
|
||||
*/
|
||||
|
||||
/*
|
||||
* various V4L2 functions
|
||||
*/
|
||||
|
@ -1,3 +1,6 @@
|
||||
/*
|
||||
* un module 'curses' de AlguaBeep
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
@ -18,7 +21,7 @@ keypad(stdscr, TRUE); /* acces aux touches 'curseur' */
|
||||
|
||||
atexit(finish);
|
||||
|
||||
sprintf(chaine, " alguabeep (%s %s) pid=%d \n", __DATE__, __TIME__,
|
||||
sprintf(chaine, " AlguaBeep (%s %s) pid=%d \n", __DATE__, __TIME__,
|
||||
getpid());
|
||||
standout(); mvaddstr(0, 0, chaine); standend();
|
||||
|
||||
|
@ -1,10 +1,14 @@
|
||||
/*
|
||||
* algua beep module
|
||||
*
|
||||
* il faut etre honnete, mais ce module m'interpelle, parce
|
||||
* ce que je ne comprend plus l'intention premiere.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "funcs.h"
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* did you'v got funk with this funcs.h file ?
|
||||
*/
|
||||
typedef struct {
|
||||
int x, y, w, h;
|
||||
} Rect;
|
||||
|
@ -28,6 +28,9 @@ static ao_sample_format format;
|
||||
static double debut;
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
/*
|
||||
* what is the meaning of the 'K' parameter ?
|
||||
*/
|
||||
int init_process(int K)
|
||||
{
|
||||
// int foo;
|
||||
@ -50,7 +53,7 @@ format.rate = 44100;
|
||||
format.byte_format = AO_FMT_LITTLE;
|
||||
device = ao_open_live(default_driver, &format, NULL);
|
||||
if (device == NULL) {
|
||||
fprintf(stderr, "Error opening AO device.\n");
|
||||
fprintf(stderr, "%s: Error opening AO device.\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -69,8 +72,8 @@ typedef struct {
|
||||
|
||||
static int cmp_datums(const void *a, const void *b)
|
||||
{
|
||||
Datum *pa = (Datum *)a;
|
||||
Datum *pb = (Datum *)b;
|
||||
Datum *pa = (Datum *)a; /* nice */
|
||||
Datum *pb = (Datum *)b; /* code */
|
||||
return pa->v < pb->v;
|
||||
}
|
||||
|
||||
@ -95,7 +98,7 @@ return 30.0* (1.0 / (double)i); /* please explain */
|
||||
static int generate_samples(short *where, int size, Datum *datas)
|
||||
{
|
||||
int loop;
|
||||
short value;
|
||||
short svalue;
|
||||
double vol;
|
||||
char chaine[100];
|
||||
|
||||
@ -108,24 +111,26 @@ for (loop=0; loop<size; loop++) {
|
||||
|
||||
/* LEFT */
|
||||
vol = 10000.0 * pow(datas[0].v / 256.0, 2.0);
|
||||
value = (short)(sin((double)loop*i2freq(datas[0].y)) * vol);
|
||||
*where++ = value;
|
||||
svalue = (short)(sin((double)loop*i2freq(datas[0].y)) * vol);
|
||||
*where++ = svalue;
|
||||
|
||||
/* RIGHT */
|
||||
vol = 10000.0 * pow(datas[1].v / 256.0, 2.0);
|
||||
value = (short)(sin((double)loop*i2freq(datas[1].y)) * vol);
|
||||
*where++ = value;
|
||||
svalue = (short)(sin((double)loop*i2freq(datas[1].y)) * vol);
|
||||
*where++ = svalue;
|
||||
|
||||
}
|
||||
|
||||
sprintf(chaine, "sample %6.3f = %7d", vol, value);
|
||||
sprintf(chaine, "sample %6.3f = %7d", vol, svalue);
|
||||
mvaddstr(35, 0, chaine);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* PLEASE EXPLAIN !
|
||||
*/
|
||||
|
||||
int charcuteur(unsigned char *datas, int w, int h, int K)
|
||||
{
|
||||
@ -166,7 +171,7 @@ for (bigR=0; bigR<nbR; bigR++) {
|
||||
mvaddstr(SL+1+bigR*DL, SC+bigC*DC, chaine);
|
||||
idx++;
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s %6d %6d %6d\n", __func__, bigR, bigC, idx);
|
||||
fprintf(stderr, "%s: %6d %6d %6d\n", __func__, bigR, bigC, idx);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -176,7 +181,7 @@ qsort(vals, nbR*nbC, sizeof(Datum), cmp_datums);
|
||||
for (idx=0; idx<16; idx++) {
|
||||
sprintf(chaine, "%2d %2d %6.2f", vals[idx].x, vals[idx].y,
|
||||
vals[idx].v);
|
||||
mvaddstr(5+idx, 130, chaine);
|
||||
mvaddstr(5+idx, 130, chaine); /* XXX why 130 ? */
|
||||
}
|
||||
|
||||
/* *** sound generator ***/
|
||||
|
@ -1,3 +1,7 @@
|
||||
/*
|
||||
* AlguaBeep is a cool project.
|
||||
* merci clairchanoir.
|
||||
*/
|
||||
|
||||
double dtime(void);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user