Browse Source

* Allow cacaplay to play streams and updated its manpage.

tags/v0.99.beta14
Sam Hocevar sam 18 years ago
parent
commit
35f77b6e06
2 changed files with 65 additions and 23 deletions
  1. +7
    -7
      doc/cacaplay.1
  2. +58
    -16
      src/cacaplay.c

+ 7
- 7
doc/cacaplay.1 View File

@@ -12,14 +12,14 @@ program by setting the
environment variable to
.B "raw"
and storing the program's standard output.
.SH EXAMPLE
cacaplay file.caca
.SH BUGS
As of now,

If no file argument is provided or '\-' is used,
.B cacaplay
can only play single-image canvases, rendering it pretty useless. See
.B cacaserver
for a more usable alternative.
will read its data from the standard input.
.SH EXAMPLES
cacaplay file.caca

CACA_DRIVER=raw CACA_GEOMETRY=80x32 cacademo | cacaplay
.SH SEE ALSO
cacaserver(1)
.SH AUTHOR


+ 58
- 16
src/cacaplay.c View File

@@ -15,8 +15,13 @@
#include "common.h"

#if !defined(__KERNEL__)
#include <stdio.h>
#include <stdlib.h>
# include <stdio.h>
# include <stdlib.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <string.h>
# include <unistd.h>
#endif

#include "cucul.h"
@@ -24,34 +29,71 @@

int main(int argc, char **argv)
{
caca_event_t ev;
cucul_canvas_t *cv;
cucul_canvas_t *cv, *app;
caca_display_t *dp;
unsigned char *buf = NULL;
long int bytes, total = 0;
int fd;

if(argc < 2)
if(argc < 2 || !strcmp(argv[1], "-"))
{
fprintf(stderr, "%s: missing argument (filename).\n", argv[0]);
return 1;
fd = 0; /* use stdin */
}

cv = cucul_create_canvas(0, 0);
if(cucul_import_file(cv, argv[1], "caca") < 0)
else
{
fprintf(stderr, "%s: could not import file %s.\n", argv[0], argv[1]);
return 1;
fd = open(argv[1], O_RDONLY);
if(fd < 0)
{
fprintf(stderr, "%s: could not open `%s'.\n", argv[0], argv[1]);
return 1;
}
}

dp = caca_create_display(cv);
cv = cucul_create_canvas(0, 0);
app = cucul_create_canvas(0, 0);

caca_refresh_display(dp);
dp = caca_create_display(cv);

while(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1))
for(;;)
{
if(ev.data.key.ch == CACA_KEY_ESCAPE)
caca_event_t ev;
int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0);

if(ret && ev.type & CACA_EVENT_KEY_PRESS)
break;

bytes = cucul_import_memory(app, buf, total, "caca");

if(bytes > 0)
{
total -= bytes;
memmove(buf, buf + bytes, total);

cucul_blit(cv, 0, 0, app, NULL);
caca_refresh_display(dp);
}
else if(bytes == 0)
{
ssize_t n;
buf = realloc(buf, total + 128);
n = read(fd, buf + total, 128);
if(n < 0)
{
fprintf(stderr, "%s: read error\n", argv[0]);
return -1;
}
total += n;
}
else /* bytes < 0 */
{
fprintf(stderr, "%s: corrupted caca file\n", argv[0]);
return -1;
}
}

/* Clean up */
close(fd);

caca_free_display(dp);
cucul_free_canvas(cv);



Loading…
Cancel
Save