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