version 0.1 inicial para empezar a rodar
@ -0,0 +1,16 @@
|
|||||||
|
CC := gcc
|
||||||
|
CFLAGS := -Wall
|
||||||
|
LINKER_FLAGS = `sdl2-config --cflags --libs` -lxmp -lSDL2_image
|
||||||
|
|
||||||
|
test:
|
||||||
|
make clean
|
||||||
|
make build
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(CC) $(CFLAGS) -o presentator presentator.c $(LINKER_FLAGS)
|
||||||
|
|
||||||
|
run:
|
||||||
|
./presentator
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm presentator
|
||||||
@ -0,0 +1,198 @@
|
|||||||
|
#include <SDL.h>
|
||||||
|
#include <xmp.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <SDL_image.h>
|
||||||
|
|
||||||
|
// Fanta <fanta@56k.es> 2026
|
||||||
|
// Presentator 0.1
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
int modPlaying;
|
||||||
|
char * modName = NULL;
|
||||||
|
int modVolume = 100;
|
||||||
|
int iv;
|
||||||
|
char *imgVol[] = {"res/vol100.png","res/vol090.png","res/vol080.png","res/vol070.png","res/vol060.png","res/vol050.png","res/vol040.png","res/vol030.png","res/vol020.png","res/vol010.png","res/vol000.png"};
|
||||||
|
char windowTitle[16] = "Presentator 0.1";
|
||||||
|
int windowWidth = 1024;
|
||||||
|
int windowHeight = 768;
|
||||||
|
char * slidesIndex = "slides/index.txt";
|
||||||
|
char * actualSlide = NULL;
|
||||||
|
int actualNSlide = 1;
|
||||||
|
bool quit = false;
|
||||||
|
SDL_Window * window;
|
||||||
|
SDL_Renderer * render;
|
||||||
|
SDL_Texture *textureVolume = NULL;
|
||||||
|
SDL_Texture *textureSlide = NULL;
|
||||||
|
SDL_Event evento;
|
||||||
|
xmp_context ctx;
|
||||||
|
|
||||||
|
// Functions
|
||||||
|
int createWindow(void){
|
||||||
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
|
window = SDL_CreateWindow(windowTitle,SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,windowWidth,windowHeight,SDL_WINDOW_FULLSCREEN);
|
||||||
|
render = SDL_CreateRenderer(window, -1, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int refreshVolumeArea(int iv){
|
||||||
|
SDL_Rect textureVolumeRect1 = { 0, 0, 398, 68 };
|
||||||
|
SDL_Rect textureVolumeRect2 = { 910, 20, 100, 20 };
|
||||||
|
IMG_Init(IMG_INIT_PNG);
|
||||||
|
textureVolume = IMG_LoadTexture(render, imgVol[iv]);
|
||||||
|
SDL_RenderCopy(render, textureVolume, &textureVolumeRect1, &textureVolumeRect2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void playBuffer(void *udata, Uint8 *stream, int len)
|
||||||
|
{
|
||||||
|
if (xmp_play_buffer((xmp_context)udata, stream, len, 0) < 0){ modPlaying = 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
static int initAudio(xmp_context ctx) {
|
||||||
|
SDL_AudioSpec a;
|
||||||
|
a.freq = 44100;
|
||||||
|
a.format = AUDIO_S16;
|
||||||
|
a.channels = 2;
|
||||||
|
a.samples = 2048;
|
||||||
|
a.callback = playBuffer;
|
||||||
|
a.userdata = ctx;
|
||||||
|
if (SDL_OpenAudio(&a, NULL) < 0) { printf("error inicializando audio: %s\n", SDL_GetError()); return 1; }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadMod(char *modPath){
|
||||||
|
modName = modPath;
|
||||||
|
ctx = xmp_create_context();
|
||||||
|
xmp_load_module(ctx, modName);
|
||||||
|
xmp_start_player(ctx, 44100, 0);
|
||||||
|
xmp_set_player(ctx, XMP_PLAYER_VOLUME, modVolume);
|
||||||
|
initAudio(ctx);
|
||||||
|
modPlaying = 1;
|
||||||
|
SDL_PauseAudio(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int stopMod(void){
|
||||||
|
xmp_end_player(ctx);
|
||||||
|
xmp_free_context(ctx);
|
||||||
|
SDL_CloseAudio();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int loadSlide(int nslide){
|
||||||
|
FILE * fp;
|
||||||
|
char * line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
int nline = 1;
|
||||||
|
ssize_t read;
|
||||||
|
|
||||||
|
fp = fopen(slidesIndex, "r");
|
||||||
|
while ((read = getline(&line, &len, fp)) != -1) {
|
||||||
|
if (nslide == nline){
|
||||||
|
actualSlide = line;
|
||||||
|
actualSlide[ strlen(actualSlide) - 1 ] = '\0';
|
||||||
|
SDL_Rect textureSlideRect = { 0, 0, windowWidth, windowHeight };
|
||||||
|
IMG_Init(IMG_INIT_PNG);
|
||||||
|
textureSlide = IMG_LoadTexture(render, actualSlide);
|
||||||
|
SDL_RenderCopy(render, textureSlide, NULL, &textureSlideRect);
|
||||||
|
}
|
||||||
|
nline = nline +1;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
if (line){ free(line); };
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int renderAll(void){
|
||||||
|
loadSlide(actualNSlide);
|
||||||
|
refreshVolumeArea(iv);
|
||||||
|
SDL_RenderPresent(render);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main
|
||||||
|
int main(int argc, char ** argv) {
|
||||||
|
createWindow();
|
||||||
|
loadMod("mods/001.mod");
|
||||||
|
loadSlide(1);
|
||||||
|
refreshVolumeArea(0);
|
||||||
|
SDL_RenderPresent(render);
|
||||||
|
|
||||||
|
while (!quit) {
|
||||||
|
SDL_WaitEvent(&evento);
|
||||||
|
|
||||||
|
switch (evento.type) {
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch (evento.key.keysym.sym) {
|
||||||
|
case SDLK_q:
|
||||||
|
stopMod();
|
||||||
|
quit = true;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
if(modVolume > 0) {
|
||||||
|
modVolume = modVolume - 10;
|
||||||
|
xmp_set_player(ctx, XMP_PLAYER_VOLUME, modVolume);
|
||||||
|
iv = iv + 1;
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
if(modVolume < 100) {
|
||||||
|
modVolume = modVolume + 10;
|
||||||
|
xmp_set_player(ctx, XMP_PLAYER_VOLUME, modVolume);
|
||||||
|
iv = iv - 1;
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDLK_1:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/001.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_2:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/002.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_3:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/003.xm");
|
||||||
|
break;
|
||||||
|
case SDLK_4:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/004.xm");
|
||||||
|
break;
|
||||||
|
case SDLK_5:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/005.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_6:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/006.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_7:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/007.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_8:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/008.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_9:
|
||||||
|
stopMod();
|
||||||
|
loadMod("mods/009.mod");
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
actualNSlide = actualNSlide + 1;
|
||||||
|
renderAll();
|
||||||
|
break;
|
||||||
|
case SDLK_LEFT:
|
||||||
|
actualNSlide = actualNSlide - 1;
|
||||||
|
renderAll();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 530 B |
|
After Width: | Height: | Size: 574 B |
|
After Width: | Height: | Size: 596 B |
|
After Width: | Height: | Size: 617 B |
|
After Width: | Height: | Size: 642 B |
|
After Width: | Height: | Size: 660 B |
|
After Width: | Height: | Size: 685 B |
|
After Width: | Height: | Size: 706 B |
|
After Width: | Height: | Size: 705 B |
|
After Width: | Height: | Size: 728 B |
|
After Width: | Height: | Size: 654 B |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 369 KiB |
|
After Width: | Height: | Size: 372 KiB |
|
After Width: | Height: | Size: 352 KiB |
@ -0,0 +1,4 @@
|
|||||||
|
slides/001.png
|
||||||
|
slides/002.png
|
||||||
|
slides/003.png
|
||||||
|
slides/004.png
|
||||||