#include "../3rdParty/libsmacker/smacker.h" #include "pch.h" BYTE movie_playing; BOOL loop_movie; // TODO void __fastcall play_movie(char *pszMovie, BOOL user_can_close) { DUMMY_PRINT("%s", pszMovie); void *video_stream; movie_playing = TRUE; sound_disable_music(TRUE); sfx_stop(); effects_play_sound("Sfx\\Misc\\blank.wav"); HANDLE directsound; SFileOpenFile(pszMovie, &directsound); BYTE *fileBuffer; int bytestoread = SFileGetFileSize(directsound, 0); fileBuffer = DiabloAllocPtr(bytestoread); SFileReadFile(directsound, fileBuffer, bytestoread, NULL, 0); /* file meta-info */ unsigned long width, height, nFrames; /* arrays for audio track metadata */ unsigned char a_trackmask, a_channels[7], a_depth[7]; unsigned long a_rate[7]; unsigned char *palette_data; smk smacker; smacker = smk_open_memory(fileBuffer, bytestoread); if (smacker != NULL) { int now; double usPerFrame; smk_enable_all(smacker, -1); smk_info_all(smacker, NULL, &nFrames, &usPerFrame); smk_info_video(smacker, &width, &height, NULL); smk_info_audio(smacker, &a_trackmask, a_channels, a_depth, a_rate); if (a_depth[0] && Mix_OpenAudio(a_rate[0], a_depth[0] == 16 ? AUDIO_S16LSB : AUDIO_U8, a_channels[0], 512) < 0) { printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError()); } SDL_DestroyTexture(texture); texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, width, height); SDL_RenderSetLogicalSize(renderer, width, height); smk_first(smacker); SDL_Event event; double frameEnd = SDL_GetTicks() * 1000 + usPerFrame; for (int f = 0; f < nFrames && movie_playing; f++) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: case SDL_MOUSEBUTTONDOWN: if (user_can_close) { movie_playing = false; } break; case SDL_QUIT: exit(0); } } now = SDL_GetTicks() * 1000; if (now >= frameEnd) { continue; // Skip audio and video if the system is to slow } Mix_Chunk *Song = Mix_QuickLoad_RAW(smk_get_audio(smacker, 0), smk_get_audio_size(smacker, 0)); Mix_PlayChannel(-1, Song, 0); now = SDL_GetTicks() * 1000; if (now >= frameEnd) { continue; // Skip video if system is to slow } /* Retrieve the palette and image */ palette_data = smk_get_palette(smacker); for (int i = 0; i < 256; i++) { orig_palette[i].peFlags = 0; orig_palette[i].peRed = palette_data[i * 3 + 0]; orig_palette[i].peGreen = palette_data[i * 3 + 1]; orig_palette[i].peBlue = palette_data[i * 3 + 2]; } ApplyGamma(logical_palette, orig_palette, 256); // Copy frame to buffer BYTE *src = (BYTE *)smk_get_video(smacker); BYTE *dst = (BYTE *)&gpBuffer->row[0].pixels[0]; for (int i = 0; i < height && i < SCREEN_HEIGHT; i++, src += width, dst += ROW_PITCH) { for (int j = 0; j < width && j < SCREEN_WIDTH; j++) { dst[j] = src[j]; } } SetFadeLevel(256); // present frame smk_next(smacker); // Decode next frame now = SDL_GetTicks() * 1000; if (now < frameEnd) { usleep(frameEnd - now); // wait with next frame if the system is to fast } frameEnd += usPerFrame; } smk_close(smacker); SDL_DestroyTexture(texture); texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT); SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT); if (a_depth[0] && Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024) < 0) { printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError()); } } }