SDL1.2 를 SDL2.0으로 변경(migration) 방법

변경 방법 개요

SDL 함수는 디스플레이 사운드 키보드 조이스틱을 간편하게 사용하기 위한 함수입니다. Dingux 류에서는 대부분 SDL1.2 로 작성되어 있고 OGA 류에서는 SDL2.0으로 작성되어 있습니다. SDL1.2 로 작성된 유틸이나 홈브류 게임을 SDL2.0 라이브러리를 사용하도록 변경하는 방법은 아래 순서로 진행하게 됩니다. 한번 관련 함수에 익숙해 지면 다음 작업시 참고가 되기 때문에 시간을 갖고 지금까지 작업된 소스를 보고 내용을 정리합니다.

  • 빌드 환경 변경
  • 사용하는 헤더 변경
  • 비슷한 함수로 변경

빌드 환경 변경

SDL1.2

CC_OPTS		= -O2 -fomit-frame-pointer -fdata-sections -ffunction-sections $(F_OPTS)
CFLAGS		= -I$(SDL_INCLUDE) $(CC_OPTS)
LDFLAGS     = -lSDLmain -lSDL -lSDL_mixer -lSDL_image -lSDL_gfx -lm -lstdc++ -Wl,--as-needed -Wl,--gc-sections -flto

SDL2.0

CC_OPTS		= -O2 -fomit-frame-pointer -fdata-sections -ffunction-sections $(F_OPTS) -DOGS_SDL2
CFLAGS		= -I$(SDL_INCLUDE) $(CC_OPTS) `sdl2-config --cflags`
LDFLAGS     = `sdl2-config --libs` -lSDL2 -lSDL2_mixer -lSDL2_image -lSDL2_gfx -lm -lstdc++ -Wl,--as-needed -Wl,--gc-sections -flto

사용하는 헤더 변경

SDL1.2

#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
#include <SDL/SDL_gfxPrimitives.h>

SDL2.0

#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL2_rotozoom.h>
#include <SDL2/SDL2_gfxPrimitives.h>

비디오 초기 설정 함수 변경

SDL1.2

return SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);

SDL2.0

SDL_Window* sdlWindow=NULL;
SDL_Surface* sdlSurface=NULL;
int lcd_width, lcd_height;

SDL_DisplayMode DM;
SDL_GetCurrentDisplayMode(0, &DM);
lcd_width = DM.w;
lcd_height = DM.h;

sdlWindow = SDL_CreateWindow("Zelda Picross",
                          SDL_WINDOWPOS_UNDEFINED,  
                          SDL_WINDOWPOS_UNDEFINED,  
                          lcd_width, lcd_height,
                          SDL_WINDOW_OPENGL); 
sdlSurface = SDL_GetWindowSurface(sdlWindow);
return SDL_CreateRGBSurface(SDL_SWSURFACE, lcd_width, lcd_height, 32, 0, 0, 0, 0);

비디오 화면 업데이트 함수 변경

SDL1.2

SDL_Flip(gpScreen);

SDL2.0

SDL_BlitScaled(gpScreen, &src, sdlSurface, &dst);
SDL_UpdateWindowSurface(sdlWindow);

비슷한 함수로 변경

SDL1.2

SDL_WarpMouse(xmouse, ymouse);
SDL_Surface* im = SDL_DisplayFormat(tmp);
SDL_SRCCOLORKEY

SDL2.0

extern SDL_Window* sdlWindow;
SDL_WarpMouseInWindow(sdlWindow, xmouse, ymouse);
SDL_Surface* im = SDL_ConvertSurfaceFormat(tmp, SDL_GetWindowPixelFormat(sdlWindow), 0);
SDL_TRUE

키보드 키 값 변경

SDL1.2

#define CONFIRM_BUTTON SDLK_LCTRL
Uint8* keys = SDL_GetKeyState(NULL);
if (keys[SDLK_UP]) {
if (keys[SDLK_DOWN]) {

SDL2.0

#define CONFIRM_BUTTON SDL_SCANCODE_LCTRL
Uint8* keys = (Uint8*)SDL_GetKeyboardState(NULL);
if (keys[SDL_SCANCODE_UP]) {
if (keys[SDL_SCANCODE_DOWN]) {

2023

rgb30 빌드 환경

1 분 소요

rgb30 기기를 위한 이미지는 크게 jelos와 arkos가 존재합니다. 각각 다른 빌드 환경에서 에뮬레이터/프론트엔드/코어를 빌드 합니다.

8bitdo m30 for linux

최대 1 분 소요

Press and hold for 5 sec. If LED blinks, the mode has changed. There are three modes that can be set, and they are as follows.

rgnano build sm64

최대 1 분 소요

빌드를 하기 위해서는 docker 환경 내에서 작업 합니다.

rgnano ffmpeg build

1 분 소요

ffmpeg, ffplay 를 구동하기 위한 빌드환경을 설명합니다.

rgnano build 환경

1 분 소요

rgnano 용 이미지는 2종 (anbernic 생산 버젼, funkey DrUm78 custom 버젼) 존재합니다. 빌드 환경이 서로 다르기 때문에 각각 빌드된 프로그램은 실행되지 않음

rgnano simplemenu 구동

1 분 소요

rgnano는 240x240 해상도를 갖고 있다. 하지만 simplemenu는 320x240, 640x480 테마만 가지고 있다. rgnano에서 simplemenu 프론트엔드를 적용하기 위해서 기존 테마를 가공한 필요가 있었다.

miyoo mini + advmenu ip 및 배터리 값 표시

최대 1 분 소요

휴대용 기기를 위한 ip 주소 값과 배터리 상태 값을 표시한다. advmenu.rc 상에서 값 읽는 스크립트를 자유롭게 바꿀 수 있게 설계 한다. 메뉴 일부분을 한글로 구현 한다. core와 에뮬레이터를 advmenu 메뉴를 통해 변경할 수 있다.

miyoo mini + docker

최대 1 분 소요

mm+ 용 에뮬레이터를 빌드하기 위해서는 아래 toolchain을 사용해야 합니다. build 확인된 commit 시점으로 이동합니다.

miyoo mini + key value

최대 1 분 소요

miyoo mini + generates keyboard value when press each button. button value is below.

ogu linapple 구동

1 분 소요

linapple은 sdl1.2 기반으로 구현되어 있습니다. ogu에서 구동하기 위해서는 sdl2.0으로 변경 필요합니다.

ogu bluealsa 설치

1 분 소요

bt a2dp sink 출력을 하기 위해서는 pulseaudio를 설치해야 합니다만, bt 오디오 출력이 없어도 일정 수준으로 cpu를 사용하고 있기 때문에 다른 대안 중에 하나가 bluealsa 입니다.

ogu xpadneo 구동

3 분 소요

BT gamepad에서 진동 기능을 사용하려면 xpadneo를 설치해야 합니다. 기기 내에 linuxheader 를 설치 하고

ogu dosbox pure 로 windows95/98 설치

1 분 소요

ogu 에서 windows 95/98 용 프로그램을 실행하기 위해서는 dosbox pure를 사용하여 windows 95/98을 설치해야 합니다. 설치하기 위한 hdd.img 를 만들고, window 95/98 cd를 설치한 후, 원하는 게임롬과 함께 windows 95/98 os...

ogu flycast

1 분 소요

libretro core github에 있는 flycast 동작이 이상합니다. 개선을 위해 보다 최신 github 소스를 사용해 봅니다

맨 위로 이동 ↑

2022

ogu devilutionX 구동

최대 1 분 소요

diablo 이미지를 구동하기 위한 엔진입니다. 아래 방법으로 빌드 할 수 있습니다. docker 환경에서 빌드 가능합니다.

ogu gl4es

최대 1 분 소요

64bit / 32bit 모두 빌드 가능합니다.

ogu box86,box64

최대 1 분 소요

pc linux 용 x86/x64 를 arm 기기에서 실행하기 위해서는 box86,box64 가 필요합니다.

ogu sdcard 인식문제 해결 방법

2 분 소요

v1.1 (2022/09/26) ubuntu 20.04 기본 이미지에서는 reboot 시 sdcard 인식되지 않는 문제를 해결하기 위해서는 uboot와 kernel을 수정해야 합니다.

ogu mame current

최대 1 분 소요

mame는 빌드시 memory를 많이 필요로 하기 때문에 빌드 중간에 멈추는 현상을 방지하려면 사전에 swap 메모리 확보가 필요합니다.

ogu backup image

최대 1 분 소요

recovery mode 진입 : l2 + r2 + power 키로 전원을 키면 recovery mode로 진입한다.

ogu log

최대 1 분 소요

불필요한 log 가 쌓이는 것을 막기 위해서는 사이즈 제한을 해야 합니다.

ogu openbor

최대 1 분 소요

sudo apt install libvpx-dev libvorbisidec-dev git clone https://github.com/DCurrent/openbor

ogu easyrpg

최대 1 분 소요

easyrpg standalone 사용방법

ogu toolchain

1 분 소요

pc 환경에서 ogu 소스를 빌드하기 위해서는 toolchain을 설치해야 합니다. pc에서 빌드해야 하는 소스는 linux kernel과 uboot 이 있습니다.

ogu core build

최대 1 분 소요

retroarch core build 관련해서 정리해 봅니다.

ogu attractmode

최대 1 분 소요

ogu 장치에 맞게 attracmode 구동을 위한 sfml 라이브러리를 변경합니다.

ogu libgo2 코드 libgou로 수정

최대 1 분 소요

libgo2 로 작성된 코드를 libgou로 대체하기. retrorun go2와 gou 코드를 비교하여 기존에 작성된 코드를 수정한다.

ogu 자동실행 구문 수정

1 분 소요

ubuntu 에서 부팅시 자동으로 emulationstation을 실행해 주고 있으나, killall 로 죽여도 살아나기 때문에 개발에는 적합하지 않아 수정해 줍니다.

miyoo-mini rumble motor 제어 방법

2 분 소요

기술 관련 전문 (motor 테스트 앱에 포함되어 있는 pdf 에 적혀 있는 내용을 내마음 대로 번역해 보았습니다.)

하루전날 테스트

최대 1 분 소요

Welcome 포스팅이 되지 않아 하루전날 파일 생성해서 테스트 해봅니다.

맨 위로 이동 ↑