diff --git a/shadermeh.c b/shadermeh.c index ebc429b..68c2e04 100644 --- a/shadermeh.c +++ b/shadermeh.c @@ -1,4 +1,5 @@ /* SPDX-License-Identifier: ISC */ + /* * shadermeh.c * @@ -6,6 +7,9 @@ */ #include "shadermeh.h" #include +#include +#define HAVE_ARCH_STRUCT_FLOCK +#include static GLfloat vertex_buffer[] = { -1.0f, -1.0f, 0.0f, /* lower left corner */ @@ -90,7 +94,7 @@ static const struct option long_opts[] = { { NULL, 0, NULL, 0 }, }; -static const char *short_opts = "w:h:s:S:r"; +static const char *short_opts = "r:w:h:s:S"; static const char *usage_str = "shadermeh OPTIONS...\n" @@ -99,6 +103,7 @@ static const char *usage_str = "\n" " --width, -w \n" " --height, -h \n" +" --sampling-rate, -r \n" "\n" " --to-stdout, -S\n" "\n" @@ -110,6 +115,7 @@ static const char *usage_str = int main(int argc, char **argv) { GLuint u_iResolution, u_iTime, u_iTimeDelta, u_iFrame; + GLfloat u_iSampleRate; struct timespec start, frame_start, frame_end; unsigned int width, height, iFrame = 0; void *fb32 = NULL, *fb24 = NULL; @@ -120,7 +126,9 @@ int main(int argc, char **argv) bool to_stdout = false; window *wnd; int i; - unsigned int sampling_rate = 0; + unsigned int sampling_rate = 0; /* Leaving this at 0 disables audio + * input + */ float in_samples[SND_BUFFER_SIZE]; /* Raw input floats from -1...1 */ float norm_samples[SND_BUFFER_SIZE]; /* Normalized samples from 0...1 */ @@ -174,6 +182,43 @@ int main(int argc, char **argv) free(fb32); return EXIT_FAILURE; } + if(!isatty(STDOUT_FILENO)){ + long old_pipe_size = fcntl(STDOUT_FILENO, F_GETPIPE_SZ); + if(old_pipe_size < 0){ + perror("Failed to get stdout pipe size"); + }else{ + + int psz = getpagesize(); + size_t frame_size = (width * height * 3); + size_t frame_cnt = psz / frame_size; + if((psz % frame_size) != 0){ + frame_cnt++; + } + size_t new_pipe_size = frame_size * frame_cnt; + int fin_psz = fcntl(STDOUT_FILENO, F_SETPIPE_SZ, + new_pipe_size); + if(fin_psz < 0){ + fprintf(stderr, "Failed to set STDOUT " + "pipe size to %zu: %s\n", + new_pipe_size, strerror(errno)); + }else{ + fprintf(stderr, "stdout pipe size " + "change from %li to %zu " + "resulted in %i\n", + old_pipe_size, + new_pipe_size, + fin_psz); + } + /* A failure to change pipe size is not + * catastrophic, beacause the application will + * still perform as needed, just with a bigger + * or smaller buffer. */ + } + } + } + if (sampling_rate != 0 && !isatty(STDIN_FILENO)){ + fputs("Sampling rate specified and STDIN not a tty! " + "You habe been warnded!\n", stderr); } /********** create window and make context current **********/ @@ -202,7 +247,7 @@ int main(int argc, char **argv) glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); - printf("OpenGL version %d.%d\n", major, minor); + fprintf(stderr,"OpenGL version %d.%d\n", major, minor); /******************** initialization ********************/ glViewport(0, 0, width, height); @@ -239,8 +284,10 @@ int main(int argc, char **argv) u_iTime = glGetUniformLocation(prog, "iTime"); u_iTimeDelta = glGetUniformLocation(prog, "iTimeDelta"); u_iFrame = glGetUniformLocation(prog, "iFrame;"); + u_iSampleRate = glGetUniformLocation(prog, "iSampleRate"); glUniform3f(u_iResolution, width, height, 0.0f); + glUniform1f(u_iSampleRate, sampling_rate); clock_gettime(CLOCK_MONOTONIC_RAW, &start);