Got a listen loop set up for the mic

This commit is contained in:
Peter Slattery 2021-01-23 17:38:19 -08:00
parent 26caed68a4
commit 9d1809b5e2
8 changed files with 161 additions and 44 deletions

View File

@ -9,11 +9,6 @@
// - need to request opening a network port and getting messages from it pumped into CustomUpdate
//
struct foo_
{
u32 Heyo;
};
internal gs_data
BlumenLumen_CustomInit(app_state* State, context Context)
{
@ -23,9 +18,10 @@ BlumenLumen_CustomInit(app_state* State, context Context)
// the sculpture's CustomUpdate function;
gs_data Result = {};
Result = PushSizeToData(&State->Permanent, sizeof(foo_));
foo_* MyFoo = (foo_*)Result.Memory;
MyFoo->Heyo = 5;
Result = PushSizeToData(&State->Permanent, sizeof(blumen_lumen_state));
blumen_lumen_state* BLState = (blumen_lumen_state*)Result.Memory;
BLState->JobReq.Memory = (u8*)&BLState->MicPacketBuffer;
#if 1
gs_const_string SculpturePath = ConstString("data/test_blumen.fold");
@ -41,7 +37,7 @@ BlumenLumen_CustomInit(app_state* State, context Context)
Anim0.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem);
Animation_AddLayer(&Anim0, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem);
Animation_AddBlock(&Anim0, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(5), 0);
Animation_AddBlock(&Anim0, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(11), 0);
AnimationArray_Push(&State->AnimationSystem.Animations, Anim0);
@ -53,10 +49,22 @@ BlumenLumen_CustomInit(app_state* State, context Context)
Anim1.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem);
Animation_AddLayer(&Anim1, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem);
Animation_AddBlock(&Anim1, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(5), 0);
Animation_AddBlock(&Anim1, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(12), 0);
AnimationArray_Push(&State->AnimationSystem.Animations, Anim1);
animation Anim2 = {0};
Anim2.Name = PushStringF(&State->Permanent, 256, "i_love_you");
Anim2.Layers = AnimLayerArray_Create(State->AnimationSystem.Storage, 8);
Anim2.Blocks_ = AnimBlockArray_Create(State->AnimationSystem.Storage, 8);
Anim2.PlayableRange.Min = 0;
Anim2.PlayableRange.Max = SecondsToFrames(15, State->AnimationSystem);
Animation_AddLayer(&Anim2, MakeString("Base Layer"), BlendMode_Overwrite, &State->AnimationSystem);
Animation_AddBlock(&Anim2, 0, Anim0.PlayableRange.Max, Patterns_IndexToHandle(10), 0);
AnimationArray_Push(&State->AnimationSystem.Animations, Anim2);
State->AnimationSystem.TimelineShouldAdvance = true;
} // End Animation Playground
@ -66,8 +74,42 @@ BlumenLumen_CustomInit(app_state* State, context Context)
internal void
BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
{
foo_* MyFoo = (foo_*)UserData.Memory;
Assert(MyFoo->Heyo == 5);
blumen_lumen_state* BLState = (blumen_lumen_state*)UserData.Memory;
gs_string BlueString = MakeString("blue");
gs_string GreenString = MakeString("green");
gs_string ILoveYouString = MakeString("i_love_you");
while (BLState->MicPacketBuffer.ReadHead != BLState->MicPacketBuffer.WriteHead)
{
gs_data PacketData = BLState->MicPacketBuffer.Values[BLState->MicPacketBuffer.ReadHead++];
microphone_packet Packet = *(microphone_packet*)PacketData.Memory;
u32 NameLen = CStringLength(Packet.AnimationFileName);
if (StringEqualsCharArray(BlueString.ConstString, Packet.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveAnimationIndex = 0;
}
else if (StringEqualsCharArray(GreenString.ConstString, Packet.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveAnimationIndex = 1;
}
else if (StringEqualsCharArray(ILoveYouString.ConstString, Packet.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveAnimationIndex = 2;
}
gs_string TempString = PushStringF(State->Transient, 256, "%.*s", 32, Packet.AnimationFileName);
NullTerminate(&TempString);
OutputDebugStringA("Received\n");
OutputDebugStringA(TempString.Str);
if (BLState->MicPacketBuffer.ReadHead >= PACKETS_MAX)
{
BLState->MicPacketBuffer.ReadHead = 0;
}
}
}

View File

@ -10,6 +10,26 @@ typedef struct motor_packet
u8 FlowerPositions[3];
} motor_packet;
#pragma pack(push, 1)
struct microphone_packet
{
b8 ChangeAnimation;
char AnimationFileName[32];
b8 SetLayer;
char LayerName[32];
r32 LayerOpacity;
b8 SetLayerParamColor;
char LayerParamColor[7];
r32 OverrideDuration;
};
#pragma pack(pop)
struct blumen_lumen_state
{
packet_ringbuffer MicPacketBuffer;
temp_job_req JobReq;
};
#define BLUMEN_LUMEN_H
#endif // BLUMEN_LUMEN_H

View File

@ -27,6 +27,8 @@ ClearAndPushPatterns(animation_pattern_array* Patterns)
Patterns_PushPattern(Patterns, Pattern_SmoothGrowRainbow);
Patterns_PushPattern(Patterns, Pattern_GrowAndFade);
Patterns_PushPattern(Patterns, Pattern_ColorToWhite);
Patterns_PushPattern(Patterns, Pattern_Blue);
Patterns_PushPattern(Patterns, Pattern_Green);
}
RELOAD_STATIC_DATA(ReloadStaticData)
@ -93,6 +95,10 @@ INITIALIZE_APPLICATION(InitializeApplication)
State->AnimationSystem = AnimationSystem_Init(AnimSysDesc);
State->UserData = BlumenLumen_CustomInit(State, Context);
// TEMP
blumen_lumen_state* BLState = (blumen_lumen_state*)State->UserData.Memory;
return (temp_job_req*)&BLState->JobReq;
}
UPDATE_AND_RENDER(UpdateAndRender)

View File

@ -41,6 +41,8 @@ typedef struct panel panel;
#include "engine/animation/foldhaus_animation_serializer.cpp"
#include "engine/animation/foldhaus_animation_renderer.cpp"
#include "blumen_lumen.h"
struct app_state
{
gs_memory_arena Permanent;

View File

@ -50,7 +50,23 @@ typedef struct context context;
// Application Functions
#define INITIALIZE_APPLICATION(name) void name(context Context)
// TODO(pjs): TEMP
typedef void temp_job_req_proc(gs_thread_context* Ctx, u8* Memory);
struct temp_job_req
{
temp_job_req_proc* Proc;
u8* Memory;
};
// This isn't necessarily temp but I'm not sure it goes here
#define PACKETS_MAX 32
struct packet_ringbuffer
{
gs_data Values[PACKETS_MAX];
u32 ReadHead;
u32 WriteHead;
};
#define INITIALIZE_APPLICATION(name) temp_job_req* name(context Context)
typedef INITIALIZE_APPLICATION(initialize_application);
#define UPDATE_AND_RENDER(name) void name(context* Context, input_queue InputQueue, render_command_buffer* RenderBuffer, addressed_data_buffer_list* OutputData)
@ -200,6 +216,5 @@ struct context
platform_get_socket_handle* PlatformGetSocketHandle;
};
#define FOLDHAUS_PLATFORM_H
#endif // FOLDHAUS_PLATFORM_H

View File

@ -5,6 +5,29 @@
//
#ifndef BLUMEN_PATTERNS_H
internal void
SolidColorPattern(led_buffer* Leds, pixel Color)
{
for (u32 LedIndex = 0; LedIndex < Leds->LedCount; LedIndex++)
{
Leds->Colors[LedIndex] = Color;
}
}
internal void
Pattern_Blue(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData)
{
pixel Blue = pixel{0, 0, 255};
SolidColorPattern(Leds, Blue);
}
internal void
Pattern_Green(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData)
{
pixel Green = pixel{0, 255, 0};
SolidColorPattern(Leds, Green);
}
internal void
TestPatternOne(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Transient, u8* UserData)
{

View File

@ -27,6 +27,8 @@
#include "../foldhaus_renderer.cpp"
#include "win32_test_code.cpp"
global b32 Running = false;
global b32 WindowIsActive = false;
@ -423,26 +425,6 @@ Win32_SendAddressedDataBuffer_Job(gs_thread_context Context, gs_data Arg)
Win32_SendAddressedDataBuffer(Context, OutputData);
}
#pragma pack(push, 1)
struct test_microphone_packet
{
b8 ChangeAnimation;
char AnimationFileName[32];
b8 SetLayer;
char LayerName[32];
r32 LayerOpacity;
b8 SetLayerParamColor;
char LayerParamColor[7];
r32 OverrideDuration;
};
#pragma pack(pop)
inline u32
UpackB4(const u8* ptr)
{
return (u32)(ptr[3] | (ptr[2] << 8) | (ptr[1] << 16) | (ptr[0] << 24));
}
internal bool
ReloadAndLinkDLL(win32_dll_refresh* DLL, context* Context, gs_work_queue* WorkQueue, bool ShouldError)
{
@ -524,7 +506,9 @@ WinMain (
addressed_data_buffer_list OutputData = AddressedDataBufferList_Create(ThreadContext);
Context.InitializeApplication(Context);
temp_job_req* Req = Context.InitializeApplication(Context);
Req->Proc = BlumenLumen_MicListenJob;
Win32_TestCode_SocketReading(ThreadContext, Req);
Running = true;
Context.WindowIsVisible = true;

View File

@ -5,6 +5,7 @@
//
#ifndef WIN32_TEST_CODE_CPP
#if 0
internal void
Win32_TestCode_UART(gs_thread_context ThreadContext)
{
@ -31,21 +32,45 @@ Win32_TestCode_UART(gs_thread_context ThreadContext)
uart_footer* Footer = PushStructOnCursor(WriteCursor, uart_footer);
UART_FillFooter(Footer, (u8*)Header);
}
#endif
internal void
Win32_TestCode_SocketReading(gs_thread_context ThreadContext)
win32_socket ListenSocket;
DWORD WINAPI
Win32_TestCode_ListenThreadProc(LPVOID ThreadData)
{
win32_socket TestSocket = Win32Socket_ConnectToAddress("127.0.0.1", "20185");
test_microphone_packet* Recv = 0;
gs_thread_context Ctx = Win32CreateThreadContext();
temp_job_req* Req = (temp_job_req*)ThreadData;
while (true)
{
gs_data Data = Win32Socket_Receive(&TestSocket, ThreadContext.Transient);
Req->Proc(&Ctx, Req->Memory);
}
}
internal void
Win32_TestCode_SocketReading(gs_thread_context ThreadContext, temp_job_req* Req)
{
ListenSocket = Win32Socket_ConnectToAddress("127.0.0.1", "20185");
u8* Arg = (u8*)Req;
HANDLE Handle = CreateThread(0, 0, &Win32_TestCode_ListenThreadProc, Arg, 0, 0);
}
internal void
BlumenLumen_MicListenJob(gs_thread_context* Ctx, u8* UserData)
{
packet_ringbuffer* MicPacketBuffer = (packet_ringbuffer*)UserData;
gs_data Data = Win32Socket_Receive(&ListenSocket, Ctx->Transient);
if (Data.Size > 0)
{
OutputDebugStringA("Received\n");
Recv = (test_microphone_packet*)Data.Memory;
OutputDebugStringA("Listened");
MicPacketBuffer->Values[MicPacketBuffer->WriteHead++] = Data;
if (MicPacketBuffer->WriteHead >= PACKETS_MAX)
{
MicPacketBuffer->WriteHead = 0;
}
ClearArena(ThreadContext.Transient);
}
}