From b295c07984cd61ab9bc94505512a416c3dae7d24 Mon Sep 17 00:00:00 2001 From: Steve Ayerhart Date: Mon, 28 Mar 2022 15:05:17 -0400 Subject: [PATCH] initial crap --- .gitignore | 42 +++++++++++++ Makefile.am | 5 ++ TODO.org | 1 + configure.ac | 37 +++++++++++ src/Makefile.am | 13 ++++ src/gst-engine.c | 84 +++++++++++++++++++++++++ src/gst-engine.h | 45 ++++++++++++++ src/oriab | Bin 0 -> 47832 bytes src/oriab.c | 61 ++++++++++++++++++ src/shaders/oriab.glsl | 60 ++++++++++++++++++ src/user-interface.c | 136 +++++++++++++++++++++++++++++++++++++++++ src/user-interface.h | 55 +++++++++++++++++ 12 files changed, 539 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile.am create mode 100644 TODO.org create mode 100644 configure.ac create mode 100644 src/Makefile.am create mode 100644 src/gst-engine.c create mode 100644 src/gst-engine.h create mode 100755 src/oriab create mode 100644 src/oriab.c create mode 100644 src/shaders/oriab.glsl create mode 100644 src/user-interface.c create mode 100644 src/user-interface.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ebf685 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +*.ss~ +*.ss#* +.#*.ss + +*.scm~ +*.scm#* +.#*.scm + +*.x +*~ +*.log +*.go +*.la +*.o +*.lo +*.a +autom4te.cache/ +build-aux/ +Makefile +Makefile.in +/configure +/config.status +/config.log +/config.h* +/aclocal.m4 +/compile +/config.guess +/config.sub +/depcomp +/install-sh +/libtool +/ltmain.sh +/missing +/config.rpath +/m4 +.deps +.libs +/src/modules/pre-install-env +/stamp-h1 +/GPATH +/GRTAGS +/GTAGS diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..f521af6 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,5 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src + +EXTRA_DIST = autogen.sh diff --git a/TODO.org b/TODO.org new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/TODO.org @@ -0,0 +1 @@ +* diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..7fe4f3a --- /dev/null +++ b/configure.ac @@ -0,0 +1,37 @@ +AC_INIT([oriab], [0.1], [steve@ayerh.art]) + +AC_PREREQ([2.65]) + +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_SRCDIR([Makefile.am]) +AC_CONFIG_SRCDIR([configure.ac]) +AC_CONFIG_HEADERS([config.h]) + +AM_INIT_AUTOMAKE([-Wall -Werror -Wno-portability foreign subdir-objects]) + +AC_PROG_CC +AC_PROG_CC_STDC +AM_PROG_CC_C_O +AM_PROG_AR + +LT_INIT([disable-static]) + +GLIB_SETTINGS + +PKG_CHECK_MODULES(GLIB, ["glib-2.0 gobject-2.0"]) +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(GLIB_LIBS) + +PKG_CHECK_MODULES(GSTREAMER, ["gstreamer-1.0 gstreamer-tag-1.0 gstreamer-fft-1.0 gstreamer-audio-1.0 gstreamer-app-1.0"]) +AC_SUBST(GSTREAMER_CFLAGS) +AC_SUBST(GSTREAMER_LIBS) + +PKG_CHECK_MODULES(RAYLIB, ["raylib"]) +AC_SUBST(RAYLIB_CFLAGS) +AC_SUBST(RAYLIB_LIBS) + +AC_CONFIG_FILES([Makefile + src/Makefile]) + +AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..dfd9821 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,13 @@ +bin_PROGRAMS = oriab + +C_FILES = \ + user-interface.c \ + gst-engine.c \ + oriab.c + +H_FILES = $(C_FILES.c=.h) + +oriab_SOURCES = $(C_FILES) + +oriab_CFLAGS = $(GLIB_CFLAGS) $(GSTREAMER_CFLAGS) $(RAYLIB_CFLAGS) +oriab_LDADD = $(GLIB_LIBS) $(GSTREAMER_LIBS) $(RAYLIB_LIBS) diff --git a/src/gst-engine.c b/src/gst-engine.c new file mode 100644 index 0000000..31c1d45 --- /dev/null +++ b/src/gst-engine.c @@ -0,0 +1,84 @@ +#include "gst-engine.h" +#include "user-interface.h" + +gboolean +bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + UserInterface *ui = (UserInterface *) data; + GstEngine *engine = ui->engine; + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_STATE_CHANGED: + { + g_debug ("state changed"); + break; + } + case GST_MESSAGE_TAG: + { + g_debug ("tag received"); + break; + } + case GST_MESSAGE_EOS: + { + g_debug ("end of stream"); + break; + } + case GST_MESSAGE_DURATION: + { + g_debug ("message duration received"); + break; + } + case GST_MESSAGE_WARNING: + { + g_debug ("warning received"); + break; + } + case GST_MESSAGE_ERROR: + { + g_debug ("error received"); + break; + } + default: + break; + } + + return TRUE; +} + +gboolean +engine_init (GstEngine *engine) +{ + g_debug ("engine init"); + + engine->playing = FALSE; + engine->direction_forward = TRUE; + engine->prev_done = TRUE; + + engine->has_started = FALSE; + engine->has_audio = FALSE; + + engine->loop = FALSE; + + engine->media_duration = -1; + engine->second = GST_SECOND; + engine->av_offset = 0; + engine->rate = 1.0; + + g_debug ("Initialized %s", gst_version_string ()); + + // engine->player = gst_element_factory_make ("playbin", "playbin"); + engine->player = gst_parse_launch ("pulsesrc device=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor ! spectrum bands=128 threshold=-60 post-messages=true ! fakesink", NULL); + + + /* + if (engine->player == NULL) + { + g_print ("ERROR: failed to created playbin element"); + return FALSE; + } + */ + + + return TRUE; +} diff --git a/src/gst-engine.h b/src/gst-engine.h new file mode 100644 index 0000000..6b881aa --- /dev/null +++ b/src/gst-engine.h @@ -0,0 +1,45 @@ +#ifndef __GST_ENGINE_H__ +#define __GST_ENGINE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GstEngine GstEngine; + +struct _GstEngine +{ + gboolean playing, direction_forward, prev_done; + gboolean has_started; + gboolean has_audio; + gboolean loop; + + gint64 media_duration; + gint64 second; + gint64 av_offset; + gdouble rate; + + gchar *uri; + + GstBus *bus; + GstElement *player; +}; + +gboolean at_the_eos (GstEngine *engine); +gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data); +gboolean change_state (GstEngine *engine, gchar *state); +gboolean check_missing_plugins_error (GstEngine *engine, GstMessage *msg); +gboolean engine_init (GstEngine *engine); + +gboolean engine_play (GstEngine *engine); +gboolean engine_seek (GstEngine *engine); +gboolean gngine_stop (GstEngine *engine); + +GstState get_state (GstEngine *engine); + +gint64 query_position (GstEngine *engine); +gboolean update_media_duration (GstEngine *engine); + +G_END_DECLS + +#endif diff --git a/src/oriab b/src/oriab new file mode 100755 index 0000000000000000000000000000000000000000..63db844ffa1937fd1b944c1d60797cb4e2f28c65 GIT binary patch literal 47832 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 + +#include "gst-engine.h" +#include "user-interface.h" + +void +close_down (UserInterface *ui, GstEngine *engine) +{ + g_debug ("closing oriab\n"); + + gst_element_set_state (engine->player, GST_STATE_NULL); + // change_state (engine, "Null"); + + // UnloadShader (ui->shader); + + gst_object_unref (G_OBJECT (engine->player)); + // g_array_free (ui->spectrum_magnitudes, true); +} + + +int +main (int argc, char *argv[]) +{ + g_debug ("main"); + + UserInterface *ui = NULL; + GstEngine *engine = NULL; + + gboolean ok; + + gst_init (&argc, &argv); + + + ui = g_new (UserInterface, 1); + user_interface_init (ui); + + engine = g_new (GstEngine, 1); + ok = engine_init (engine); + if (!ok) + goto quit; + + ui->engine = engine; + + g_timeout_add (0, ui_loop, ui); + + + ui->engine->bus = gst_element_get_bus (ui->engine->player); + gst_bus_add_signal_watch (ui->engine->bus); + // g_signal_connect (G_OBJECT (ui->engine->bus), "message::element", G_CALLBACK (handle_element), ui); + + gst_element_set_state (ui->engine->player, GST_STATE_PLAYING); + + g_debug ("running"); + g_main_loop_run (ui->loop); + + close_down (ui, engine); + + quit: + + return 0; +} diff --git a/src/shaders/oriab.glsl b/src/shaders/oriab.glsl new file mode 100644 index 0000000..7b110af --- /dev/null +++ b/src/shaders/oriab.glsl @@ -0,0 +1,60 @@ +#version 330 + +#ifdef GL_ES +precision mediump float; +#endif + +in vec2 fragTexCoord; +in vec4 fragColor; + +uniform vec2 uResolution; +uniform float uTime; + +out vec4 finalColor; +//uniform sampler2D u_spectrum; + +/* +void +main () +{ + vec3 c; + float z = 0.1 * u_time; + vec2 uv = gl_FragCoord.xy / u_resolution; + vec2 p = uv - 0.5; + p.x *= u_resolution.x / u_resolution.y; + float l = 0.2 * length (p); + for (int i = 0; i < 3; i++) + { + z += 0.07; + uv += p / l * (sin (z) + 1.0) * abs (sin (l * 9.0 - z * 2.00)); + c[i] = 0.01 / length (abs (mod (uv, 1.0) - 0.5)); + } + float intensity = texture2D (u_spectrum, vec2 (l, 0.5)).x; + gl_FragColor = vec4 (c / l * intensity, u_time); +} +*/ + +void +main () + { + /* + const float stepCount = 128.0; + vec2 barWidth = u_resolution / stepCount; + + float isInsideBar = step (gl_FragCoord.y / u_resolution.y, texture (u_spectrum, vec2 (floor (gl_FragCoord.x / barWidth) / stepCount, 0.25)).x); + color = vec3(1.0) * isInsideBar; + color *= vec3 ((1.0 / stepCount) * floor (gl_FragCoord.x / barWidth), 1.0 - (1.0 / stepCount) * floor (gl_FragCoord.x / barWidth), 0.5); + */ + +// vec2 uv = (gl_FragCoord.xy-.5 * uresolution.xy) / uresolution.y; + // vec3 color = vec3 (0); + + // gl_FragColor = vec4 (color, 1.0); +// vec2 uv = gl_FragCoord.xy / u_resolution; + // gl_FragColor = vec4 (sin (u_spectrum) * 0.5 + 0.5); +// float amplitude = texture2D (u_spectrum, vec2 (uv.x, 0.0)).x; + + // gl_FragColor = vec4 (vec3 (amplitude), 1.0); + // vec2 uv = (fragTexCoord-.5*uResolution.xy) / uResolution.y; + gl_FragColor = vec4(1, 0, 0.5, 1); + } diff --git a/src/user-interface.c b/src/user-interface.c new file mode 100644 index 0000000..5ffcd07 --- /dev/null +++ b/src/user-interface.c @@ -0,0 +1,136 @@ +#include "user-interface.h" +#include +#include + +gboolean handle_element (GstBus *bus, GstMessage *msg, UserInterface *ui) +{ + const GstStructure *s= gst_message_get_structure (msg); + guint band; + const GValue *magnitudes; + + if (gst_structure_has_name (s, "spectrum")) + { + magnitudes = gst_structure_get_value (s, "magnitude"); + gfloat m; + Color *pixels = (Color *)malloc (1024 * sizeof (Color)); + + for (guint i = 0; i < 128; ++i) + { + m = g_value_get_float (gst_value_list_get_value (magnitudes, i)); + //g_debug ("m before = %f", m); + m = (m + 60) * 4.25; + //g_debug ("m = %u", (guint8) m); + pixels->r = (guint8) m; + pixels->g = (guint8) m; + pixels->b = (guint8) m; + pixels->a = 255; + } + + UpdateTexture (ui->spectrum, pixels); + free (pixels); + } + + return TRUE; +} + + +void +user_interface_init (UserInterface *ui) +{ + g_debug("loading ui"); + + InitWindow (DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_WINDOW_TITLE); + + ui->loop = g_main_loop_new (NULL, FALSE); + // ui->spectrum_magnitudes = g_array_sized_new (FALSE, TRUE, sizeof (gfloat), 128); + + // Color *pixels = (Color *)malloc (1024 * sizeof (Color)); + //ui->spectrum =LoadTextureFromImage (LoadImageEx (pixels, 1024,1)); + //free (pixels); + + ui->canvas = LoadRenderTexture (GetScreenWidth (), GetScreenHeight ()); + + Shader shader = LoadShader (0, "shaders/oriab.glsl"); + + ui->time = 0.0f; + /* + + SetShaderValue (ui->shader, ui->time_location, &ui->time, UNIFORM_FLOAT); + gfloat res[2] = { (gfloat) GetScreenWidth (), (gfloat) GetScreenHeight () }; + gint loc = GetShaderLocation (ui->shader, "uresolution"); + g_debug ("why: %i", loc); + SetShaderValue (ui->shader, GetShaderLocation (ui->shader, "uresolution"), &res, UNIFORM_VEC2); + g_debug ("YEAH"); + */ + ui->shader = &shader; + + SetTargetFPS(TARGET_FPS); +} + +gboolean ui_loop (gpointer ui_data) +{ + UserInterface *ui = (UserInterface *) ui_data; + + if (WindowShouldClose()) + { + g_debug ("should close"); + g_main_loop_quit(ui->loop); + return FALSE; + } + + draw (ui); + + return TRUE; +} + +void +draw_now_playing (UserInterface *ui) +{ +} + +void +draw (UserInterface *ui) +{ + + /* + if (IsWindowResized ()) + { + g_debug ("NOOO"); + gfloat res[2] = { (gfloat) GetScreenWidth (), (gfloat) GetScreenHeight () }; + SetShaderValue (ui->shader, GetShaderLocation (ui->shader, "uresolution"), &res, UNIFORM_VEC2); + } + + */ + ui->time = GetTime (); + SetShaderValue (*ui->shader, ui->time_location, &ui->time, UNIFORM_FLOAT); + + //SetShaderValue (ui->shader, GetShaderLocation (ui->shader, "u_spectrum"), &ui->spectrum, UNIFORM_SAMPLER2D); + BeginDrawing (); + ClearBackground (RAYWHITE); + + BeginTextureMode (ui->canvas); + ClearBackground (RAYWHITE); + DrawRectangle (0, 0, GetScreenWidth (), GetScreenHeight (), GRAY); + EndTextureMode (); + + /* + BeginShaderMode (ui->shader); + DrawTextureRec (ui->canvas.texture, + (Rectangle) {0, 0, ui->canvas.texture.width, -ui->canvas.texture.height}, + (Vector2) {0.0f, 0.0f}, + PINK); + EndShaderMode (); + */ + + DrawFPS(0, 0); + + DrawText(FormatText ("time: %f", ui->time), GetScreenWidth () -180, GetScreenHeight () - 20,20, DARKGRAY); + + EndDrawing (); +} + +void +close_user_interface (void) +{ + CloseWindow (); +} diff --git a/src/user-interface.h b/src/user-interface.h new file mode 100644 index 0000000..19c00cf --- /dev/null +++ b/src/user-interface.h @@ -0,0 +1,55 @@ +#ifndef __USER_INTERFACE_H__ +#define __USER_INTERFACE_H__ + +#include + +#include "gst-engine.h" + +G_BEGIN_DECLS + +#define DEFAULT_WINDOW_TITLE "Oriab" +#define DEFAULT_WIDTH 1280 +#define DEFAULT_HEIGHT 780 +#define TARGET_FPS 60 + +typedef struct _UserInterface UserInterface; + +struct _UserInterface +{ + gint title_length, progress_id; + gint64 media_duration; + gfloat stage_width, stage_height; + gfloat screen_with, screen_height; + gfloat windowed_width, windowed_height; + + gfloat playback_position, volume; + + gchar *duration_str; + + // GArray *spectrum_magnitudes; + GMainLoop *loop; + GstEngine *engine; + + RenderTexture2D canvas; + + Shader *shader; + + Texture2D spectrum; + gfloat time; + + gint spectrum_location; + gint resolution_location; + gint time_location; + +}; + +void user_interface_init (UserInterface *ui); +void close_user_interface (void); +gboolean handle_element (GstBus *bus, GstMessage *msg, UserInterface *ui); +void draw_now_playing (UserInterface *ui); +gboolean ui_loop (gpointer ui_data); +void draw (UserInterface *ui); + +G_END_DECLS + +#endif