1
0

add egl support

This commit is contained in:
2025-08-14 14:44:42 +08:00
parent 5c8f9993e4
commit f31dc23a1f
8 changed files with 266 additions and 204 deletions

2
.gitignore vendored
View File

@@ -34,5 +34,5 @@
/build /build
/.vscode /.vscode
/xPlayer.* /xplayer*
*.ini *.ini

View File

@@ -20,12 +20,12 @@
"name": "MinGW64", "name": "MinGW64",
"includePath": [ "includePath": [
"${workspaceFolder}/**", "${workspaceFolder}/**",
"D:\\msys64\\mingw64\\include" "C:\\MinGW64\\include"
], ],
"defines": [ "defines": [
"USE_OPENGL" "USE_OPENGL"
], ],
"compilerPath": "D:\\msys64\\mingw64\\bin\\gcc.exe", "compilerPath": "C:\\MinGW64\\bin\\gcc.exe",
"cStandard": "c17", "cStandard": "c17",
"cppStandard": "gnu++17", "cppStandard": "gnu++17",
"intelliSenseMode": "windows-gcc-x64" "intelliSenseMode": "windows-gcc-x64"

View File

@@ -17,7 +17,7 @@ if (MPV_SW_RENDER)
list(APPEND RENDER_DRIVER MPV_SW_RENDER) list(APPEND RENDER_DRIVER MPV_SW_RENDER)
endif () endif ()
project(xPlayer) project(xplayer)
file(GLOB_RECURSE MAIN_SRC file(GLOB_RECURSE MAIN_SRC
"${CMAKE_SOURCE_DIR}/src/*.cpp" "${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/imgui/*.cpp" "${CMAKE_SOURCE_DIR}/imgui/*.cpp"

195
Makefile
View File

@@ -1,190 +1,25 @@
#--------------------------------------------------------------------------------- TARGET = xplayer
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
endif
TOPDIR ?= $(CURDIR)
include $(DEVKITPRO)/libnx/switch_rules
#---------------------------------------------------------------------------------
TARGET := xPlayer
BUILD := build BUILD := build
SRCS := src imgui SRCS := src imgui
DATA := data
INCLUDES := imgui
#ROMFS := romfs
#--------------------------------------------------------------------------------- VPATH := $(foreach dir,$(SRCS),$(CURDIR)/$(dir))
# options for code generation CPPFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.cpp)))
#--------------------------------------------------------------------------------- OFILES := $(CPPFILES:.cpp=.o)
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
CFLAGS := -g -Wall -O2 -ffunction-sections $(ARCH) $(DEFINES)
CFLAGS += $(INCLUDE) -D__SWITCH__
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -DIMGUI_IMPL_OPENGL_LOADER_CUSTOM
ASFLAGS := -g $(ARCH)
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
LIBS := `$(PREFIX)pkg-config mpv --libs` \
-lglfw3 -lEGL -lglapi -lglad -ldrm_nouveau -lm -lnx
#--------------------------------------------------------------------------------- INCLUDES := -I$(CURDIR)/imgui
# list of directories containing libraries, this must be the top level containing CFLAGS := -O2 -Wall $(INCLUDES) $(shell pkg-config --cflags glfw3)
# include and lib CXXFLAGS := $(CFLAGS) -std=c++17
#--------------------------------------------------------------------------------- LDFLAGS := $(shell pkg-config mpv glfw3 --libs)
LIBDIRS := $(PORTLIBS) $(LIBNX)
all: $(TARGET)
#--------------------------------------------------------------------------------- $(TARGET): $(OFILES)
# no real need to edit anything past this point unless you need to add additional $(CXX) -o $@ $^ $(LDFLAGS)
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
export OUTPUT := $(CURDIR)/$(TARGET) run: all
export TOPDIR := $(CURDIR) @./$(TARGET)
export VPATH := $(foreach dir,$(SRCS),$(CURDIR)/$(dir)) \ .PHONY: clean
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
export DEPSDIR := $(CURDIR)/$(BUILD)
CFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.s)))
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
ifeq ($(strip $(CPPFILES)),)
#---------------------------------------------------------------------------------
export LD := $(CC)
#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
export LD := $(CXX)
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------
export OFILES_BIN := $(addsuffix .o,$(BINFILES))
export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
export OFILES := $(OFILES_BIN) $(OFILES_SRC)
export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES)))
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
-I$(CURDIR)/$(BUILD)
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
ifeq ($(strip $(CONFIG_JSON)),)
jsons := $(wildcard *.json)
ifneq (,$(findstring $(TARGET).json,$(jsons)))
export APP_JSON := $(TOPDIR)/$(TARGET).json
else
ifneq (,$(findstring config.json,$(jsons)))
export APP_JSON := $(TOPDIR)/config.json
endif
endif
else
export APP_JSON := $(TOPDIR)/$(CONFIG_JSON)
endif
ifeq ($(strip $(ICON)),)
icons := $(wildcard *.jpg)
ifneq (,$(findstring $(TARGET).jpg,$(icons)))
export APP_ICON := $(TOPDIR)/$(TARGET).jpg
else
ifneq (,$(findstring icon.jpg,$(icons)))
export APP_ICON := $(TOPDIR)/icon.jpg
endif
endif
else
export APP_ICON := $(TOPDIR)/$(ICON)
endif
ifeq ($(strip $(NO_ICON)),)
export NROFLAGS += --icon=$(APP_ICON)
endif
ifeq ($(strip $(NO_NACP)),)
export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp
endif
ifneq ($(APP_TITLEID),)
export NACPFLAGS += --titleid=$(APP_TITLEID)
endif
ifneq ($(ROMFS),)
export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)
endif
.PHONY: $(BUILD) clean all
#---------------------------------------------------------------------------------
all: $(BUILD)
$(BUILD):
@[ -d $@ ] || mkdir -p $@
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
#---------------------------------------------------------------------------------
clean: clean:
@echo clean ... $(RM) $(OFILES) $(TARGET)
ifeq ($(strip $(APP_JSON)),)
@rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf
else
@rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf
endif
#---------------------------------------------------------------------------------
else
.PHONY: all
DEPENDS := $(OFILES:.o=.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
ifeq ($(strip $(APP_JSON)),)
all : $(OUTPUT).nro
ifeq ($(strip $(NO_NACP)),)
$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp
else
$(OUTPUT).nro : $(OUTPUT).elf
endif
else
all : $(OUTPUT).nsp
$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm
$(OUTPUT).nso : $(OUTPUT).elf
endif
$(OUTPUT).elf : $(OFILES)
$(OFILES_SRC) : $(HFILES_BIN)
#---------------------------------------------------------------------------------
# you need a rule like this for each extension you use as binary data
#---------------------------------------------------------------------------------
%.bin.o %_bin.h : %.bin
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
-include $(DEPENDS)
#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------

View File

@@ -1,4 +1,4 @@
TARGET = xPlayer TARGET = xplayer
BUILD := build BUILD := build
SRCS := src imgui SRCS := src imgui
@@ -9,9 +9,10 @@ CPPFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.cpp)))
OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o)
INCLUDES := -I$(CURDIR)/imgui INCLUDES := -I$(CURDIR)/imgui
CFLAGS := -O2 -Wall $(INCLUDES) `pkg-config --cflags glfw3` CFLAGS := -O2 -Wall $(INCLUDES) $(shell pkg-config --cflags glfw3)
CXXFLAGS := $(CFLAGS) -std=c++17 CXXFLAGS := $(CFLAGS) -std=c++17
LDFLAGS := `pkg-config mpv glfw3 --libs` -lgdi32 LDFLAGS := -Wl,-Bdynamic $(shell pkg-config mpv glfw3 --libs) -lgdi32 \
-static-libgcc -static-libstdc++ -static
all: $(TARGET) all: $(TARGET)

190
Makefile.nx Normal file
View File

@@ -0,0 +1,190 @@
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
endif
TOPDIR ?= $(CURDIR)
include $(DEVKITPRO)/libnx/switch_rules
#---------------------------------------------------------------------------------
TARGET := xplayer
BUILD := build
SRCS := src imgui
DATA := data
INCLUDES := imgui
#ROMFS := romfs
#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
CFLAGS := -g -Wall -O2 -ffunction-sections $(ARCH) $(DEFINES)
CFLAGS += $(INCLUDE) -D__SWITCH__
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -DIMGUI_IMPL_OPENGL_LOADER_CUSTOM
ASFLAGS := -g $(ARCH)
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
LIBS := `$(PREFIX)pkg-config mpv --libs` \
-lglfw3 -lEGL -lglapi -lglad -ldrm_nouveau -lm -lnx
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS := $(PORTLIBS) $(LIBNX)
#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
export OUTPUT := $(CURDIR)/$(TARGET)
export TOPDIR := $(CURDIR)
export VPATH := $(foreach dir,$(SRCS),$(CURDIR)/$(dir)) \
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
export DEPSDIR := $(CURDIR)/$(BUILD)
CFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES := $(foreach dir,$(SRCS),$(notdir $(wildcard $(dir)/*.s)))
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
ifeq ($(strip $(CPPFILES)),)
#---------------------------------------------------------------------------------
export LD := $(CC)
#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
export LD := $(CXX)
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------
export OFILES_BIN := $(addsuffix .o,$(BINFILES))
export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
export OFILES := $(OFILES_BIN) $(OFILES_SRC)
export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES)))
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
-I$(CURDIR)/$(BUILD)
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
ifeq ($(strip $(CONFIG_JSON)),)
jsons := $(wildcard *.json)
ifneq (,$(findstring $(TARGET).json,$(jsons)))
export APP_JSON := $(TOPDIR)/$(TARGET).json
else
ifneq (,$(findstring config.json,$(jsons)))
export APP_JSON := $(TOPDIR)/config.json
endif
endif
else
export APP_JSON := $(TOPDIR)/$(CONFIG_JSON)
endif
ifeq ($(strip $(ICON)),)
icons := $(wildcard *.jpg)
ifneq (,$(findstring $(TARGET).jpg,$(icons)))
export APP_ICON := $(TOPDIR)/$(TARGET).jpg
else
ifneq (,$(findstring icon.jpg,$(icons)))
export APP_ICON := $(TOPDIR)/icon.jpg
endif
endif
else
export APP_ICON := $(TOPDIR)/$(ICON)
endif
ifeq ($(strip $(NO_ICON)),)
export NROFLAGS += --icon=$(APP_ICON)
endif
ifeq ($(strip $(NO_NACP)),)
export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp
endif
ifneq ($(APP_TITLEID),)
export NACPFLAGS += --titleid=$(APP_TITLEID)
endif
ifneq ($(ROMFS),)
export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)
endif
.PHONY: $(BUILD) clean all
#---------------------------------------------------------------------------------
all: $(BUILD)
$(BUILD):
@[ -d $@ ] || mkdir -p $@
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
#---------------------------------------------------------------------------------
clean:
@echo clean ...
ifeq ($(strip $(APP_JSON)),)
@rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf
else
@rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf
endif
#---------------------------------------------------------------------------------
else
.PHONY: all
DEPENDS := $(OFILES:.o=.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
ifeq ($(strip $(APP_JSON)),)
all : $(OUTPUT).nro
ifeq ($(strip $(NO_NACP)),)
$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp
else
$(OUTPUT).nro : $(OUTPUT).elf
endif
else
all : $(OUTPUT).nsp
$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm
$(OUTPUT).nso : $(OUTPUT).elf
endif
$(OUTPUT).elf : $(OFILES)
$(OFILES_SRC) : $(HFILES_BIN)
#---------------------------------------------------------------------------------
# you need a rule like this for each extension you use as binary data
#---------------------------------------------------------------------------------
%.bin.o %_bin.h : %.bin
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
-include $(DEPENDS)
#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------

View File

@@ -1,4 +1,4 @@
# xPlayer # xplayer
### Build On MSYS2 ### Build On MSYS2
@@ -25,7 +25,7 @@ To build for Switch, a standard development environment must first be set up. In
(dkp-)pacman -S switch-glfw switch-curl (dkp-)pacman -S switch-glfw switch-curl
cmake -B build -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/Switch.cmake" cmake -B build -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/Switch.cmake"
make -C build xPlayer_nro -j$(nproc) make -C build xplayer_nro -j$(nproc)
# for debug # for debug
nxlink -a 192.168.3.97 -s build/xPlayer.nro --args https://pan.3m3m.top/api/public/dl/Cwg6sGXL nxlink -a 192.168.3.97 -s build/xplayer.nro --args https://pan.3m3m.top/api/public/dl/Cwg6sGXL
``` ```

View File

@@ -6,15 +6,20 @@
#include <imgui_impl_glfw.h> #include <imgui_impl_glfw.h>
#include <imgui_impl_opengl3.h> #include <imgui_impl_opengl3.h>
#ifdef IMGUI_IMPL_OPENGL_ES3 #if defined(IMGUI_IMPL_OPENGL_ES2)
#include <GLES3/gl3.h> #include <GLES2/gl2.h>
#endif
#if defined(__SWITCH__)
#include <glad/glad.h>
#elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) #elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
#include <imgui_impl_opengl3_loader.h> #include <imgui_impl_opengl3_loader.h>
#endif #endif
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#ifdef _WIN32
#ifdef __SWITCH__ #define GLFW_EXPOSE_NATIVE_WIN32
#include <GLFW/glfw3native.h>
#elif defined(__SWITCH__)
#include <switch.h> #include <switch.h>
extern "C" void userAppInit() { extern "C" void userAppInit() {
@@ -28,6 +33,10 @@ extern "C" void userAppExit() {
plExit(); plExit();
socketExit(); socketExit();
} }
#elif defined(__linux__)
#define GLFW_EXPOSE_NATIVE_X11
#define GLFW_EXPOSE_NATIVE_WAYLAND
#include <GLFW/glfw3native.h>
#endif #endif
static void die(const char* msg) { static void die(const char* msg) {
@@ -35,6 +44,11 @@ static void die(const char* msg) {
exit(1); exit(1);
} }
static void glfw_error_callback(int error, const char* description)
{
fprintf(stderr, "GLFW Error %d: %s\n", error, description);
}
static int64_t mpv_property_int(mpv_handle* mpv, const char* key) { static int64_t mpv_property_int(mpv_handle* mpv, const char* key) {
int64_t value = -1; int64_t value = -1;
mpv_get_property(mpv, key, MPV_FORMAT_INT64, &value); mpv_get_property(mpv, key, MPV_FORMAT_INT64, &value);
@@ -45,6 +59,7 @@ static int64_t mpv_property_int(mpv_handle* mpv, const char* key) {
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
if (argc < 2) die("pass a single media file as argument"); if (argc < 2) die("pass a single media file as argument");
glfwSetErrorCallback(glfw_error_callback);
if (!glfwInit()) die("init glfw failed"); if (!glfwInit()) die("init glfw failed");
static int osdShow = 0; static int osdShow = 0;
@@ -56,29 +71,34 @@ int main(int argc, char* argv[]) {
mpv_set_option_string(mpv, "terminal", "yes"); mpv_set_option_string(mpv, "terminal", "yes");
mpv_set_option_string(mpv, "ytdl", "no"); mpv_set_option_string(mpv, "ytdl", "no");
mpv_set_option_string(mpv, "hwdec", "auto"); mpv_set_option_string(mpv, "hwdec", "auto");
mpv_set_option_string(mpv, "vo", "libmpv");
#ifdef _DEBUG #ifdef _DEBUG
mpv_set_option_string(this->mpv, "msg-level", "all=v"); mpv_set_option_string(mpv, "msg-level", "all=v");
#endif #endif
if (mpv_initialize(mpv) < 0) die("init mpv failed");
#if defined(IMGUI_IMPL_OPENGL_ES3) #if defined(IMGUI_IMPL_OPENGL_ES2)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); const char* glsl_version = "#version 100";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API);
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
#elif defined(__APPLE__) #elif defined(__APPLE__)
const char* glsl_version = "#version 150";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#elif defined(__SWITCH__)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#else #else
const char* glsl_version = "#version 130";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif #endif
// Create window with graphics context // Create window with graphics context
GLFWwindow* window = glfwCreateWindow(1280, 720, argv[1], nullptr, nullptr); GLFWwindow* window = glfwCreateWindow(1280, 720, "xplayer", nullptr, nullptr);
if (!window) { if (!window) {
glfwTerminate(); glfwTerminate();
return -1; return -1;
@@ -91,6 +111,8 @@ int main(int argc, char* argv[]) {
glfwSetWindowShouldClose(window, 1); glfwSetWindowShouldClose(window, 1);
else if (key == GLFW_KEY_ENTER) else if (key == GLFW_KEY_ENTER)
osdShow = !osdShow; osdShow = !osdShow;
else if (key == GLFW_KEY_TAB)
mpv_command_string(mpv, "script-binding stats/display-stats-toggle");
else if (key == GLFW_KEY_SPACE) else if (key == GLFW_KEY_SPACE)
mpv_command_string(mpv, "cycle pause"); mpv_command_string(mpv, "cycle pause");
else if (key == GLFW_KEY_LEFT) else if (key == GLFW_KEY_LEFT)
@@ -105,16 +127,30 @@ int main(int argc, char* argv[]) {
printf("glfwKeyCallback key press %d\n", key); printf("glfwKeyCallback key press %d\n", key);
} }
}); });
#ifdef _WIN32
HWND wid = glfwGetWin32Window(window);
mpv_set_option(mpv, "wid", MPV_FORMAT_INT64, &wid);
#endif
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
#if defined(__SWITCH__)
// Load OpenGL routines using glad
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
#endif
glfwSwapInterval(1); glfwSwapInterval(1);
glfwSetTime(0); glfwSetTime(0);
if (mpv_initialize(mpv) < 0) die("init mpv failed");
mpv_opengl_init_params gl_init_params{ mpv_opengl_init_params gl_init_params{
[](void* fn_ctx, const char* name) { return (void*)glfwGetProcAddress(name); }, nullptr}; [](void* fn_ctx, const char* name) { return (void*)glfwGetProcAddress(name); }, nullptr};
mpv_render_param params[] = { mpv_render_param params[] = {
{MPV_RENDER_PARAM_API_TYPE, const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL)}, {MPV_RENDER_PARAM_API_TYPE, const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL)},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &gl_init_params}, {MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &gl_init_params},
#if defined(GLFW_EXPOSE_NATIVE_X11)
{MPV_RENDER_PARAM_X11_DISPLAY, glfwGetX11Display()},
#endif
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
{MPV_RENDER_PARAM_WL_DISPLAY, glfwGetWaylandDisplay()},
#endif
{MPV_RENDER_PARAM_INVALID, nullptr}, {MPV_RENDER_PARAM_INVALID, nullptr},
}; };
if (mpv_render_context_create(&mpv_context, mpv, params) < 0) die("init mpv context failed"); if (mpv_render_context_create(&mpv_context, mpv, params) < 0) die("init mpv context failed");
@@ -139,7 +175,7 @@ int main(int argc, char* argv[]) {
// Setup Platform/Renderer backends // Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(nullptr); ImGui_ImplOpenGL3_Init(glsl_version);
const char* args[] = {"loadfile", argv[1], nullptr}; const char* args[] = {"loadfile", argv[1], nullptr};
if (mpv_command_async(mpv, 0, args) < 0) die("load file failed"); if (mpv_command_async(mpv, 0, args) < 0) die("load file failed");