initial crap

master
Steve Ayerhart 2022-03-28 15:05:17 -04:00
commit b295c07984
No known key found for this signature in database
GPG Key ID: 5C815FDF3A00B8BA
12 changed files with 539 additions and 0 deletions

42
.gitignore vendored Normal file
View File

@ -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

5
Makefile.am Normal file
View File

@ -0,0 +1,5 @@
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src
EXTRA_DIST = autogen.sh

1
TODO.org Normal file
View File

@ -0,0 +1 @@
*

37
configure.ac Normal file
View File

@ -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

13
src/Makefile.am Normal file
View File

@ -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)

84
src/gst-engine.c Normal file
View File

@ -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;
}

45
src/gst-engine.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef __GST_ENGINE_H__
#define __GST_ENGINE_H__
#include <gst/gst.h>
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

BIN
src/oriab Executable file

Binary file not shown.

61
src/oriab.c Normal file
View File

@ -0,0 +1,61 @@
#include <raylib.h>
#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;
}

60
src/shaders/oriab.glsl Normal file
View File

@ -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);
}

136
src/user-interface.c Normal file
View File

@ -0,0 +1,136 @@
#include "user-interface.h"
#include <glib.h>
#include <gmodule.h>
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 ();
}

55
src/user-interface.h Normal file
View File

@ -0,0 +1,55 @@
#ifndef __USER_INTERFACE_H__
#define __USER_INTERFACE_H__
#include <raylib.h>
#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