diff --git a/360/frontend/main.c b/360/frontend-xdk/main.c similarity index 100% rename from 360/frontend/main.c rename to 360/frontend-xdk/main.c diff --git a/360/frontend/menu.cpp b/360/frontend-xdk/menu.cpp similarity index 92% rename from 360/frontend/menu.cpp rename to 360/frontend-xdk/menu.cpp index 03f52a6490..7a561c830e 100644 --- a/360/frontend/menu.cpp +++ b/360/frontend-xdk/menu.cpp @@ -70,11 +70,11 @@ static void filebrowser_fetch_directory_entries(const char *path, filebrowser_t rompath_title->SetText(strw_buffer); romlist->DeleteItems(0, romlist->GetItemCount()); - romlist->InsertItems(0, browser->current_dir.size); - for(unsigned i = 0; i < browser->current_dir.size; i++) + romlist->InsertItems(0, browser->current_dir.list->size); + for(unsigned i = 0; i < browser->current_dir.list->size; i++) { char fname_tmp[256]; - fill_pathname_base(fname_tmp, browser->current_dir.elems[i], sizeof(fname_tmp)); + fill_pathname_base(fname_tmp, browser->current_dir.list->elems[i].data, sizeof(fname_tmp)); rarch_convert_char_to_wchar(strw_buffer, fname_tmp, sizeof(strw_buffer)); romlist->SetText(i, strw_buffer); } @@ -235,12 +235,12 @@ HRESULT CRetroArchSettings::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) m_settingslist.SetText(SETTING_HW_TEXTURE_FILTER, g_settings.video.smooth ? L"Hardware filtering shader #1: Linear interpolation" : L"Hardware filtering shader #1: Point filtering"); m_settingslist.SetText(SETTING_HW_TEXTURE_FILTER_2, g_settings.video.second_pass_smooth ? L"Hardware filtering shader #2: Linear interpolation" : L"Hardware filtering shader #2: Point filtering"); m_settingslist.SetText(SETTING_SCALE_ENABLED, g_console.fbo_enabled ? L"Custom Scaling/Dual Shaders: ON" : L"Custom Scaling/Dual Shaders: OFF"); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SHADER, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SHADER, sizeof(strw_buffer)); m_settingslist.SetText(SETTING_SHADER, strw_buffer); m_settingslist.SetText(SETTING_COLOR_FORMAT, g_console.color_format ? L"Color format: 32bit ARGB" : L"Color format: 16bit RGBA"); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SHADER_2, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SHADER_2, sizeof(strw_buffer)); m_settingslist.SetText(SETTING_SHADER_2, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); m_settingslist.SetText(SETTING_SCALE_FACTOR, strw_buffer); return 0; @@ -265,7 +265,7 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro { rarch_settings_change(S_SCALE_FACTOR_DECREMENT); //xdk360_gfx_init_fbo(vid); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); m_settingslist.SetText(SETTING_SCALE_FACTOR, strw_buffer); } } @@ -283,7 +283,7 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro { rarch_settings_change(S_SCALE_FACTOR_INCREMENT); //xdk360_gfx_init_fbo(vid); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); m_settingslist.SetText(SETTING_SCALE_FACTOR, strw_buffer); } } @@ -316,16 +316,16 @@ HRESULT CRetroArchQuickMenu::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) GetChildById(L"XuiQuickMenuList", &m_quickmenulist); GetChildById(L"XuiBackButton", &m_back); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_ORIENTATION, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_KEEP_ASPECT_RATIO, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_LOAD_STATE, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_SAVE_STATE, strw_buffer); return 0; @@ -347,9 +347,9 @@ HRESULT CRetroArchQuickMenu::OnControlNavigate(XUIMessageControlNavigate *pContr case MENU_ITEM_LOAD_STATE: case MENU_ITEM_SAVE_STATE: rarch_state_slot_decrease(); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_LOAD_STATE, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_SAVE_STATE, strw_buffer); break; case MENU_ITEM_KEEP_ASPECT_RATIO: @@ -358,7 +358,7 @@ HRESULT CRetroArchQuickMenu::OnControlNavigate(XUIMessageControlNavigate *pContr break; case MENU_ITEM_ORIENTATION: rarch_settings_change(S_ROTATION_DECREMENT); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_ORIENTATION, strw_buffer); video_xdk360.set_rotation(driver.video_data, g_console.screen_orientation); break; @@ -372,9 +372,9 @@ HRESULT CRetroArchQuickMenu::OnControlNavigate(XUIMessageControlNavigate *pContr case MENU_ITEM_LOAD_STATE: case MENU_ITEM_SAVE_STATE: rarch_state_slot_increase(); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_LOAD_STATE, strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_SAVE_STATE, strw_buffer); break; case MENU_ITEM_KEEP_ASPECT_RATIO: @@ -383,7 +383,7 @@ HRESULT CRetroArchQuickMenu::OnControlNavigate(XUIMessageControlNavigate *pContr break; case MENU_ITEM_ORIENTATION: rarch_settings_change(S_ROTATION_INCREMENT); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_ORIENTATION, strw_buffer); video_xdk360.set_rotation(driver.video_data, g_console.screen_orientation); break; @@ -399,7 +399,7 @@ HRESULT CRetroArchQuickMenu::OnControlNavigate(XUIMessageControlNavigate *pContr if(aspectratio_changed) { gfx_ctx_set_aspect_ratio(d3d9, g_console.aspect_ratio_index); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_KEEP_ASPECT_RATIO, strw_buffer); } @@ -448,7 +448,7 @@ HRESULT CRetroArchQuickMenu::OnNotifyPress( HXUIOBJ hObjPressed, int & bHandled rarch_settings_default(S_DEF_ASPECT_RATIO); gfx_ctx_set_aspect_ratio(d3d9, g_console.aspect_ratio_index); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_KEEP_ASPECT_RATIO, strw_buffer); } break; @@ -458,7 +458,7 @@ HRESULT CRetroArchQuickMenu::OnNotifyPress( HXUIOBJ hObjPressed, int & bHandled break; case MENU_ITEM_ORIENTATION: rarch_settings_default(S_DEF_ROTATION); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); m_quickmenulist.SetText(MENU_ITEM_ORIENTATION, strw_buffer); video_xdk360.set_rotation(driver.video_data, g_console.screen_orientation); break; @@ -517,7 +517,7 @@ HRESULT CRetroArchMain::OnInit(XUIMessageInit * pInitData, BOOL& bHandled) rarch_convert_char_to_wchar(strw_buffer, core_text, sizeof(strw_buffer)); m_core.SetText(strw_buffer); - rarch_settings_create_menu_item_label(strw_buffer, S_LBL_RARCH_VERSION, sizeof(strw_buffer)); + rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_RARCH_VERSION, sizeof(strw_buffer)); m_title.SetText(strw_buffer); return 0; @@ -530,7 +530,7 @@ HRESULT CRetroArchFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandle if(hObjPressed == m_romlist) { int index = m_romlist.GetCurSel(); - if(path_file_exists(browser.current_dir.elems[index])) + if(path_file_exists(browser.current_dir.list->elems[index].data)) { struct retro_system_info info; retro_get_system_info(&info); @@ -550,7 +550,7 @@ HRESULT CRetroArchFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandle rarch_settings_change(S_START_RARCH); } } - else if(path_is_directory(browser.current_dir.elems[index])) + else if(browser.current_dir.list->elems[index].attr.b) { const char * strbuffer = rarch_convert_wchar_to_const_char((const wchar_t *)m_romlist.GetText(index)); @@ -583,7 +583,7 @@ HRESULT CRetroArchShaderBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHand if(hObjPressed == m_shaderlist) { int index = m_shaderlist.GetCurSel(); - if(path_file_exists(tmp_browser.current_dir.elems[index])) + if(path_file_exists(tmp_browser.current_dir.list->elems[index].data)) { const char * strbuffer = rarch_convert_wchar_to_const_char((const wchar_t *)m_shaderlist.GetText(index)); @@ -604,7 +604,7 @@ HRESULT CRetroArchShaderBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHand if (g_console.info_msg_enable) rarch_settings_msg(S_MSG_SHADER_LOADING_SUCCEEDED, S_DELAY_180); } - else if(path_is_directory(tmp_browser.current_dir.elems[index])) + else if(tmp_browser.current_dir.list->elems[index].attr.b) { const char * strbuffer = rarch_convert_wchar_to_const_char((const wchar_t *)m_shaderlist.GetText(index)); snprintf(path, sizeof(path), "%s\\%s", filebrowser_get_current_dir(&tmp_browser), strbuffer); @@ -624,13 +624,13 @@ HRESULT CRetroArchCoreBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandle if(hObjPressed == m_romlist) { int index = m_romlist.GetCurSel(); - if(path_file_exists(tmp_browser.current_dir.elems[index])) + if(path_file_exists(tmp_browser.current_dir.list->elems[index].data)) { const char * strbuffer = rarch_convert_wchar_to_const_char((const wchar_t *)m_romlist.GetText(index)); snprintf(g_console.launch_app_on_exit, sizeof(g_console.launch_app_on_exit), "%s\\%s", filebrowser_get_current_dir(&tmp_browser), strbuffer); rarch_settings_change(S_RETURN_TO_LAUNCHER); } - else if(path_is_directory(tmp_browser.current_dir.elems[index])) + else if(tmp_browser.current_dir.list->elems[index].attr.b) { const char * strbuffer = rarch_convert_wchar_to_const_char((const wchar_t *)m_romlist.GetText(index)); snprintf(path, sizeof(path), "%s%s\\", filebrowser_get_current_dir(&tmp_browser), strbuffer); diff --git a/360/frontend/menu.h b/360/frontend-xdk/menu.h similarity index 100% rename from 360/frontend/menu.h rename to 360/frontend-xdk/menu.h diff --git a/360/xdk360_input.c b/360/xdk360_input.c index 55913d3179..4ee54e7658 100644 --- a/360/xdk360_input.c +++ b/360/xdk360_input.c @@ -22,7 +22,7 @@ #include "../libretro.h" #include "../console/console_ext.h" #include "xdk360_input.h" -#include "frontend/menu.h" +#include "frontend-xdk/menu.h" static uint64_t state[4]; static unsigned pads_connected; diff --git a/360/xdk360_video.cpp b/360/xdk360_video.cpp index b13a42d827..dda3d63efa 100644 --- a/360/xdk360_video.cpp +++ b/360/xdk360_video.cpp @@ -547,9 +547,196 @@ static void *xdk360_init(const video_info_t *video, const input_driver_t **input return d3d9; } +extern video_console_t video_console; +extern xdk360_video_font_t m_Font; + +static void xdk360_video_font_draw_text(xdk360_video_font_t * font, + float fOriginX, float fOriginY, const wchar_t * strText, float fMaxPixelWidth ) +{ + if( strText == NULL || strText[0] == L'\0') + return; + + xdk360_video_t *vid = (xdk360_video_t*)driver.video_data; + D3DDevice *pd3dDevice = vid->d3d_render_device; + + // Set the color as a vertex shader constant + float vColor[4]; + vColor[0] = ( ( 0xffffffff & 0x00ff0000 ) >> 16L ) / 255.0F; + vColor[1] = ( ( 0xffffffff & 0x0000ff00 ) >> 8L ) / 255.0F; + vColor[2] = ( ( 0xffffffff & 0x000000ff ) >> 0L ) / 255.0F; + vColor[3] = ( ( 0xffffffff & 0xff000000 ) >> 24L ) / 255.0F; + + d3d9_render_msg_pre(font); + + // Perform the actual storing of the color constant here to prevent + // a load-hit-store by inserting work between the store and the use of + // the vColor array. + pd3dDevice->SetVertexShaderConstantF( 1, vColor, 1 ); + + // Set the starting screen position + if((fOriginX < 0.0f)) + fOriginX += font->m_rcWindow.x2; + if( fOriginY < 0.0f ) + fOriginY += font->m_rcWindow.y2; + + font->m_fCursorX = floorf( fOriginX ); + font->m_fCursorY = floorf( fOriginY ); + + // Adjust for padding + fOriginY -= font->m_fFontTopPadding; + + // Add window offsets + float Winx = 0.0f; + float Winy = 0.0f; + fOriginX += Winx; + fOriginY += Winy; + font->m_fCursorX += Winx; + font->m_fCursorY += Winy; + + // Begin drawing the vertices + + // Declared as volatile to force writing in ascending + // address order. It prevents out of sequence writing in write combined + // memory. + + volatile float * pVertex; + + unsigned long dwNumChars = wcslen(strText); + HRESULT hr = pd3dDevice->BeginVertices( D3DPT_QUADLIST, 4 * dwNumChars, sizeof( XMFLOAT4 ) , + ( VOID** )&pVertex ); + + // The ring buffer may run out of space when tiling, doing z-prepasses, + // or using BeginCommandBuffer. If so, make the buffer larger. + if( hr < 0 ) + RARCH_ERR( "Ring buffer out of memory.\n" ); + + // Draw four vertices for each glyph + while( *strText ) + { + wchar_t letter; + + // Get the current letter in the string + letter = *strText++; + + // Handle the newline character + if( letter == L'\n' ) + { + font->m_fCursorX = fOriginX; + font->m_fCursorY += font->m_fFontYAdvance * font->m_fYScaleFactor; + continue; + } + + // Translate unprintable characters + const GLYPH_ATTR * pGlyph = &font->m_Glyphs[ ( letter <= font->m_cMaxGlyph ) + ? font->m_TranslatorTable[letter] : 0 ]; + + float fOffset = font->m_fXScaleFactor * (float)pGlyph->wOffset; + float fAdvance = font->m_fXScaleFactor * (float)pGlyph->wAdvance; + float fWidth = font->m_fXScaleFactor * (float)pGlyph->wWidth; + float fHeight = font->m_fYScaleFactor * font->m_fFontHeight; + + // Setup the screen coordinates + font->m_fCursorX += fOffset; + float X4 = font->m_fCursorX; + float X1 = X4; + float X3 = X4 + fWidth; + float X2 = X1 + fWidth; + float Y1 = font->m_fCursorY; + float Y3 = Y1 + fHeight; + float Y2 = Y1; + float Y4 = Y3; + + font->m_fCursorX += fAdvance; + + // Add the vertices to draw this glyph + + unsigned long tu1 = pGlyph->tu1; // Convert shorts to 32 bit longs for in register merging + unsigned long tv1 = pGlyph->tv1; + unsigned long tu2 = pGlyph->tu2; + unsigned long tv2 = pGlyph->tv2; + + // NOTE: The vertexs are 2 floats for the screen coordinates, + // followed by two USHORTS for the u/vs of the character, + // terminated with the ARGB 32 bit color. + // This makes for 16 bytes per vertex data (Easier to read) + // Second NOTE: The uvs are merged and written using a DWORD due + // to the write combining hardware being only able to handle 32, + // 64 and 128 writes. Never store to write combined memory with + // 8 or 16 bit instructions. You've been warned. + + pVertex[0] = X1; + pVertex[1] = Y1; + ((volatile unsigned long *)pVertex)[2] = (tu1<<16)|tv1; // Merged using big endian rules + pVertex[3] = 0; + pVertex[4] = X2; + pVertex[5] = Y2; + ((volatile unsigned long *)pVertex)[6] = (tu2<<16)|tv1; // Merged using big endian rules + pVertex[7] = 0; + pVertex[8] = X3; + pVertex[9] = Y3; + ((volatile unsigned long *)pVertex)[10] = (tu2<<16)|tv2; // Merged using big endian rules + pVertex[11] = 0; + pVertex[12] = X4; + pVertex[13] = Y4; + ((volatile unsigned long *)pVertex)[14] = (tu1<<16)|tv2; // Merged using big endian rules + pVertex[15] = 0; + pVertex+=16; + + dwNumChars--; + } + + // Since we allocated vertex data space based on the string length, we now need to + // add some dummy verts for any skipped characters (like newlines, etc.) + while( dwNumChars ) + { + for(int i = 0; i < 16; i++) + pVertex[i] = 0; + + pVertex += 16; + dwNumChars--; + } + + // Stop drawing vertices + D3DDevice_EndVertices(pd3dDevice); + + // Undo window offsets + font->m_fCursorX -= Winx; + font->m_fCursorY -= Winy; + + d3d9_render_msg_post(font); +} + +void xdk360_console_draw(void) +{ + xdk360_video_t *vid = (xdk360_video_t*)driver.video_data; + D3DDevice *m_pd3dDevice = vid->d3d_render_device; + + // The top line + unsigned int nTextLine = ( video_console.m_nCurLine - + video_console.m_cScreenHeight + video_console.m_cScreenHeightVirtual - + video_console.m_nScrollOffset + 1 ) + % video_console.m_cScreenHeightVirtual; + + d3d9_render_msg_pre(&m_Font); + + for( unsigned int nScreenLine = 0; nScreenLine < video_console.m_cScreenHeight; nScreenLine++ ) + { + xdk360_video_font_draw_text(&m_Font, (float)( video_console.m_cxSafeAreaOffset ), + (float)( video_console.m_cySafeAreaOffset + video_console.m_fLineHeight * nScreenLine ), + video_console.m_Lines[nTextLine], 0.0f ); + + nTextLine = ( nTextLine + 1 ) % video_console.m_cScreenHeightVirtual; + } + + d3d9_render_msg_post(&m_Font); +} + static bool xdk360_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { + if (!frame) + return true; + xdk360_video_t *d3d9 = (xdk360_video_t*)data; D3DSurface* pRenderTarget0; bool menu_enabled = g_console.menu_enable; @@ -725,8 +912,7 @@ static void xdk360_start(void) gfx_ctx_set_swap_interval(d3d9->vsync ? 1 : 0, false); /* XBox 360 specific font code */ - HRESULT hr = xdk360_console_init("game:\\media\\Arial_12.xpr", - 0xff000000, 0xffffffff ); + HRESULT hr = d3d9_init_font("game:\\media\\Arial_12.xpr"); if(hr < 0) { @@ -742,7 +928,7 @@ static void xdk360_stop(void) { void *data = driver.video_data; driver.video_data = NULL; - xdk360_console_deinit(); + d3d9_deinit_font(); xdk360_free(data); } diff --git a/360/xdk360_video.h b/360/xdk360_video.h index 508e3ab832..504a459b1e 100644 --- a/360/xdk360_video.h +++ b/360/xdk360_video.h @@ -18,7 +18,7 @@ #define _XDK360_VIDEO_H #include -#include "fonts.h" +#include "../gfx/fonts/xdk360_fonts.h" #define DFONT_MAX 4096 #define PRIM_FVF (D3DFVF_XYZRHW | D3DFVF_TEX1) diff --git a/360/xdk360_video_resources.h b/360/xdk360_video_resources.h index bd75bb7140..d8de8b76d3 100644 --- a/360/xdk360_video_resources.h +++ b/360/xdk360_video_resources.h @@ -59,11 +59,6 @@ class PackedResource HRESULT Create( const char * strFilename ); void Destroy(); - D3DResource* RegisterResource( D3DResource* pResource ) const - { - return pResource; - } - void * GetData( unsigned long dwOffset ) const { return &m_pSysMemData[dwOffset]; @@ -79,16 +74,6 @@ class PackedResource return ( D3DTexture* )GetResource( dwOffset ); } - D3DArrayTexture* GetArrayTexture( unsigned long dwOffset ) const - { - return ( D3DArrayTexture* )GetResource( dwOffset ); - } - - D3DVertexBuffer* GetVertexBuffer( unsigned long dwOffset ) const - { - return ( D3DVertexBuffer* )GetResource( dwOffset ); - } - void * GetData( const char * strName ) const; D3DResource* GetResource( const char * strName ) const @@ -101,16 +86,6 @@ class PackedResource return ( D3DTexture* )GetResource( strName ); } - D3DArrayTexture* GetArrayTexture( const char * strName ) const - { - return ( D3DArrayTexture* )GetResource( strName ); - } - - D3DVertexBuffer* GetVertexBuffer( const char * strName ) const - { - return ( D3DVertexBuffer* )GetResource( strName ); - } - PackedResource(); ~PackedResource(); }; diff --git a/README.md b/README.md index 9149ed35f1..72932cf07e 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,9 @@ RetroArch PS3 needs to be compiled in the following order: make -f Makefile.ps3 -Finally, you can add one of the following parameters to the above line in order to make a PKG file: +PlayStation3 - Creating a PKG installable file
+ +You can add 'pkg' as a parameter in order to make a PKG file - for example: make -f Makefile.ps3 pkg diff --git a/audio/jack.c b/audio/jack.c index 893a0cb42c..348b448f2f 100644 --- a/audio/jack.c +++ b/audio/jack.c @@ -85,10 +85,11 @@ static int parse_ports(char **dest_ports, const char **jports) { int parsed = 0; - const char *con = strtok(g_settings.audio.device, ","); + char *save; + const char *con = strtok_r(g_settings.audio.device, ",", &save); if (con) dest_ports[parsed++] = strdup(con); - con = strtok(NULL, ","); + con = strtok_r(NULL, ",", &save); if (con) dest_ports[parsed++] = strdup(con); diff --git a/cheats.c b/cheats.c index 16bb79f04e..1e918e39b0 100644 --- a/cheats.c +++ b/cheats.c @@ -18,6 +18,7 @@ #include "dynamic.h" #include "general.h" #include "compat/strl.h" +#include "compat/posix_string.h" #ifdef HAVE_CONFIG_H #include "config.h" @@ -165,14 +166,15 @@ static void cheat_manager_load_config(cheat_manager_t *handle, const char *path, return; } - const char *num = strtok(str, ";"); + char *save; + const char *num = strtok_r(str, ";", &save); while (num) { unsigned index = strtoul(num, NULL, 0); if (index < handle->size) handle->cheats[index].state = true; - num = strtok(NULL, ";"); + num = strtok_r(NULL, ";", &save); } free(str); diff --git a/compat/compat.c b/compat/compat.c index 5f3920e597..0562416864 100644 --- a/compat/compat.c +++ b/compat/compat.c @@ -239,6 +239,7 @@ size_t strlcat(char *dest, const char *source, size_t size) #undef strcasecmp #undef strdup #undef isblank +#undef strtok_r #include #include #include @@ -278,5 +279,36 @@ int isblank_rarch__(int c) return (c == ' ') || (c == '\t'); } +char *strtok_r_rarch__(char *str, const char *delim, char **saveptr) +{ + if (!saveptr || !delim) + return NULL; + + if (str) + *saveptr = str; + + char *first = NULL; + + do + { + first = *saveptr; + while (*first && strchr(delim, *first)) + *first++ = '\0'; + + if (*first == '\0') + return NULL; + + char *ptr = first + 1; + + while (*ptr && !strchr(delim, *ptr)) + ptr++; + + *saveptr = ptr + (*ptr ? 1 : 0); + *ptr = '\0'; + } while (strlen(first) == 0); + + return first; +} + #endif diff --git a/compat/posix_string.h b/compat/posix_string.h index ebf854d326..23f5026aef 100644 --- a/compat/posix_string.h +++ b/compat/posix_string.h @@ -23,12 +23,17 @@ extern "C" { #endif #undef strcasecmp +#undef strdup +#undef isblank +#undef strtok_r #define strcasecmp(a, b) strcasecmp_rarch__(a, b) #define strdup(orig) strdup_rarch__(orig) #define isblank(c) isblank_rarch__(c) +#define strtok_r(str, delim, saveptr) strtok_r_rarch__(str, delim, saveptr) int strcasecmp(const char *a, const char *b); char *strdup(const char *orig); int isblank(int c); +char *strtok_r(char *str, const char *delim, char **saveptr); #ifdef __cplusplus } diff --git a/conf/config_file.c b/conf/config_file.c index a981f4d398..90eb1d2c0d 100644 --- a/conf/config_file.c +++ b/conf/config_file.c @@ -110,11 +110,13 @@ static char *extract_value(char *line, bool is_value) while (isspace(*line)) line++; + char *save; + // We have a full string. Read until next ". if (*line == '"') { line++; - char *tok = strtok(line, "\""); + char *tok = strtok_r(line, "\"", &save); if (!tok) return NULL; return strdup(tok); @@ -123,7 +125,7 @@ static char *extract_value(char *line, bool is_value) return NULL; else // We don't have that... Read till next space. { - char *tok = strtok(line, " \n\t\f\r\v"); + char *tok = strtok_r(line, " \n\t\f\r\v", &save); if (tok) return strdup(tok); else diff --git a/config.def.h b/config.def.h index 6d72edec92..d4da7e7a85 100644 --- a/config.def.h +++ b/config.def.h @@ -78,7 +78,7 @@ enum #define VIDEO_DEFAULT_DRIVER VIDEO_WII #elif defined(XENON) #define VIDEO_DEFAULT_DRIVER VIDEO_XENON360 -#elif defined(_XBOX) +#elif defined(_XBOX360) #define VIDEO_DEFAULT_DRIVER VIDEO_XDK360 #elif defined(HAVE_XVIDEO) #define VIDEO_DEFAULT_DRIVER VIDEO_XVIDEO @@ -94,7 +94,7 @@ enum #define AUDIO_DEFAULT_DRIVER AUDIO_PS3 #elif defined(XENON) #define AUDIO_DEFAULT_DRIVER AUDIO_XENON360 -#elif defined(_XBOX) +#elif defined(_XBOX360) #define AUDIO_DEFAULT_DRIVER AUDIO_XDK360 #elif defined(GEKKO) #define AUDIO_DEFAULT_DRIVER AUDIO_WII @@ -128,7 +128,7 @@ enum #if defined(XENON) #define INPUT_DEFAULT_DRIVER INPUT_XENON360 -#elif defined(_XBOX) +#elif defined(_XBOX360) #define INPUT_DEFAULT_DRIVER INPUT_XDK360 #elif defined(HAVE_SDL) #define INPUT_DEFAULT_DRIVER INPUT_SDL diff --git a/console/console_ext.c b/console/console_ext.c index c0359f63c2..0881e39260 100644 --- a/console/console_ext.c +++ b/console/console_ext.c @@ -285,7 +285,7 @@ static const struct platform_bind platform_keys[] = { { CTRL_UP_MASK | CTRL_RSTICK_UP_MASK, "RStick D-Pad Up" }, { CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK, "RStick D-Pad Down" }, }; -#elif defined(_XBOX) +#elif defined(_XBOX360) static const struct platform_bind platform_keys[] = { { XINPUT_GAMEPAD_B, "B button" }, { XINPUT_GAMEPAD_A, "A button" }, @@ -471,7 +471,7 @@ void rarch_input_set_controls_default (void) rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_R3] = platform_keys[PS3_DEVICE_ID_JOYPAD_R3].joykey; rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_L2] = platform_keys[PS3_DEVICE_ID_JOYPAD_L2].joykey; rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_L3] = platform_keys[PS3_DEVICE_ID_JOYPAD_L3].joykey; -#elif defined(_XBOX) +#elif defined(_XBOX360) rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_B] = platform_keys[XDK360_DEVICE_ID_JOYPAD_A].joykey; rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_Y] = platform_keys[XDK360_DEVICE_ID_JOYPAD_X].joykey; rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_SELECT] = platform_keys[XDK360_DEVICE_ID_JOYPAD_BACK].joykey; @@ -756,15 +756,10 @@ void rarch_console_rsound_stop(void) STRING HANDLING ============================================================ */ -#ifdef _XBOX void rarch_convert_char_to_wchar(wchar_t *buf, const char * str, size_t size) { - unsigned long dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); - size /= sizeof(wchar_t); - rarch_assert(size >= dwNum); - MultiByteToWideChar(CP_ACP, 0, str, -1, buf, dwNum); + mbstowcs(buf, str, size / sizeof(wchar_t)); } -#endif const char * rarch_convert_wchar_to_const_char(const wchar_t * wstr) { @@ -803,7 +798,8 @@ void rarch_config_load(const char * conf_name, const char * libretro_dir_path, c if(!strcmp(g_settings.libretro, "")) { - const char *first_file = rarch_manage_libretro_set_first_file(libretro_dir_path, exe_ext); + char first_file[PATH_MAX]; + rarch_manage_libretro_set_first_file(first_file, sizeof(first_file), libretro_dir_path, exe_ext); if(first_file != NULL) strlcpy(g_settings.libretro, first_file, sizeof(g_settings.libretro)); } diff --git a/console/console_ext.h b/console/console_ext.h index fd28ef2f94..8f78e5a069 100644 --- a/console/console_ext.h +++ b/console/console_ext.h @@ -218,12 +218,16 @@ bool rarch_console_rsound_start(const char *ip); void rarch_console_rsound_stop(void); #endif -#ifdef _XBOX void rarch_convert_char_to_wchar(wchar_t *buf, const char * str, size_t size); -#endif - const char * rarch_convert_wchar_to_const_char(const wchar_t * wstr); +enum +{ + CONFIG_FILE, + SHADER_PRESET_FILE, + INPUT_PRESET_FILE +}; + void rarch_config_create_default(const char * conf_name); void rarch_config_load(const char * conf_name, const char * libretro_dir_path, const char * exe_ext, bool find_libretro_path); void rarch_config_save(const char * conf_name); diff --git a/console/console_ext_input.h b/console/console_ext_input.h index 05d908010d..197ac08999 100644 --- a/console/console_ext_input.h +++ b/console/console_ext_input.h @@ -81,7 +81,7 @@ enum ps3_device_id RARCH_LAST_PLATFORM_KEY }; -#elif defined(_XBOX) +#elif defined(_XBOX360) #include "../360/xdk360_input.h" enum xdk360_device_id diff --git a/console/console_settings.c b/console/console_settings.c index ebd666c8ad..90e019b8b2 100644 --- a/console/console_settings.c +++ b/console/console_settings.c @@ -220,48 +220,41 @@ void rarch_settings_msg(unsigned setting, unsigned delay) msg_queue_push(g_extern.msg_queue, str, 1, delay); } -#ifdef _XBOX -void rarch_settings_create_menu_item_label(wchar_t * strwbuf, unsigned setting, size_t size) -#else -void rarch_settings_create_menu_item_label(char * str, unsigned setting, size_t size) -#endif +void rarch_settings_create_menu_item_label_w(wchar_t *strwbuf, unsigned setting, size_t size) { -#ifdef _XBOX char str[PATH_MAX]; - size_t SIZEOF_STR = sizeof(str); -#else - size_t SIZEOF_STR = size; -#endif + rarch_settings_create_menu_item_label(str, setting, sizeof(str)); + rarch_convert_char_to_wchar(strwbuf, str, size); +} + +void rarch_settings_create_menu_item_label(char * str, unsigned setting, size_t size) +{ switch (setting) { case S_LBL_ASPECT_RATIO: - snprintf(str, SIZEOF_STR, "Aspect Ratio: %s", aspectratio_lut[g_console.aspect_ratio_index].name); + snprintf(str, size, "Aspect Ratio: %s", aspectratio_lut[g_console.aspect_ratio_index].name); break; case S_LBL_SHADER: - snprintf(str, SIZEOF_STR, "Shader #1: %s", g_settings.video.cg_shader_path); + snprintf(str, size, "Shader #1: %s", g_settings.video.cg_shader_path); break; case S_LBL_SHADER_2: - snprintf(str, SIZEOF_STR, "Shader #2: %s", g_settings.video.second_pass_shader); + snprintf(str, size, "Shader #2: %s", g_settings.video.second_pass_shader); break; case S_LBL_RARCH_VERSION: - snprintf(str, SIZEOF_STR, "RetroArch %s", PACKAGE_VERSION); + snprintf(str, size, "RetroArch %s", PACKAGE_VERSION); break; case S_LBL_SCALE_FACTOR: - snprintf(str, SIZEOF_STR, "Scale Factor: %f (X) / %f (Y)", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y); + snprintf(str, size, "Scale Factor: %f (X) / %f (Y)", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y); break; case S_LBL_ROTATION: - snprintf(str, SIZEOF_STR, "Rotation: %s", rotation_lut[g_console.screen_orientation]); + snprintf(str, size, "Rotation: %s", rotation_lut[g_console.screen_orientation]); break; case S_LBL_LOAD_STATE_SLOT: - snprintf(str, SIZEOF_STR, "Load State #%d", g_extern.state_slot); + snprintf(str, size, "Load State #%d", g_extern.state_slot); break; case S_LBL_SAVE_STATE_SLOT: - snprintf(str, SIZEOF_STR, "Save State #%d", g_extern.state_slot); + snprintf(str, size, "Save State #%d", g_extern.state_slot); break; } - -#ifdef _XBOX - rarch_convert_char_to_wchar(strwbuf, str, size); -#endif } diff --git a/console/console_settings.h b/console/console_settings.h index bebc2df457..558ff347cd 100644 --- a/console/console_settings.h +++ b/console/console_settings.h @@ -95,10 +95,7 @@ void rarch_settings_change(unsigned setting); void rarch_settings_default(unsigned setting); void rarch_settings_msg(unsigned setting, unsigned delay); -#ifdef _XBOX -void rarch_settings_create_menu_item_label(wchar_t * strwbuf, unsigned setting, size_t size); -#else void rarch_settings_create_menu_item_label(char * str, unsigned setting, size_t size); -#endif +void rarch_settings_create_menu_item_label_w(wchar_t *strwbuf, unsigned setting, size_t size); #endif diff --git a/console/fileio/file_browser.c b/console/fileio/file_browser.c index 62cc457b3d..def92827b3 100644 --- a/console/fileio/file_browser.c +++ b/console/fileio/file_browser.c @@ -22,11 +22,10 @@ const char * path, const char * extensions) strlcpy(filebrowser->dir[filebrowser->directory_stack_size], path, sizeof(filebrowser->dir[filebrowser->directory_stack_size])); - filebrowser->current_dir.elems = dir_list_new(path, extensions, true); - filebrowser->current_dir.size = dir_list_size(filebrowser->current_dir.elems); + filebrowser->current_dir.list = dir_list_new(path, extensions, true); filebrowser->current_dir.ptr = 0; - dir_list_sort(filebrowser->current_dir.elems, true); + dir_list_sort(filebrowser->current_dir.list, true); } static void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir, @@ -43,16 +42,11 @@ void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir) strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir)); } -void filebrowser_set_current_path(filebrowser_t *filebrowser, const char *path) -{ -} - void filebrowser_free(filebrowser_t * filebrowser) { - dir_list_free(filebrowser->current_dir.elems); + dir_list_free(filebrowser->current_dir.list); - filebrowser->current_dir.elems = NULL; - filebrowser->current_dir.size = 0; + filebrowser->current_dir.list = NULL; filebrowser->current_dir.ptr = 0; } @@ -82,7 +76,12 @@ const char * filebrowser_get_current_dir (filebrowser_t *filebrowser) const char * filebrowser_get_current_path (filebrowser_t *filebrowser) { - return filebrowser->current_dir.elems[filebrowser->current_dir.ptr]; + return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].data; +} + +bool filebrowser_get_current_path_isdir (filebrowser_t *filebrowser) +{ + return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].attr.b; } size_t filebrowser_get_current_index (filebrowser_t *filebrowser) @@ -98,15 +97,15 @@ void filebrowser_set_current_at (filebrowser_t *filebrowser, size_t pos) static void filebrowser_set_current_increment (filebrowser_t *filebrowser, bool allow_wraparound) { filebrowser->current_dir.ptr++; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.size && allow_wraparound) + if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size && allow_wraparound) filebrowser->current_dir.ptr = 0; } static void filebrowser_set_current_decrement (filebrowser_t *filebrowser, bool allow_wraparound) { filebrowser->current_dir.ptr--; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.size && allow_wraparound) - filebrowser->current_dir.ptr = filebrowser->current_dir.size - 1; + if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size && allow_wraparound) + filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; } void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action) @@ -129,7 +128,7 @@ void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action break; case FILEBROWSER_ACTION_RIGHT: filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5, - filebrowser->current_dir.size-1)); + filebrowser->current_dir.list->size-1)); break; case FILEBROWSER_ACTION_SCROLL_UP: if (filebrowser->current_dir.ptr <= entries_to_scroll) @@ -145,11 +144,11 @@ void filebrowser_iterate(filebrowser_t *filebrowser, filebrowser_action_t action break; case FILEBROWSER_ACTION_SCROLL_DOWN: filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + - entries_to_scroll, filebrowser->current_dir.size-1)); + entries_to_scroll, filebrowser->current_dir.list->size-1)); break; case FILEBROWSER_ACTION_SCROLL_DOWN_SMOOTH: filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 50, - filebrowser->current_dir.size-1)); + filebrowser->current_dir.list->size-1)); if(!filebrowser->current_dir.ptr) filebrowser->current_dir.ptr = 0; break; case FILEBROWSER_ACTION_OK: diff --git a/console/fileio/file_browser.h b/console/fileio/file_browser.h index 370c089101..0fee782d13 100644 --- a/console/fileio/file_browser.h +++ b/console/fileio/file_browser.h @@ -28,8 +28,7 @@ typedef struct uint32_t directory_stack_size; char dir[MAX_DIR_STACK][512]; struct { - char **elems; - size_t size; + struct string_list *list; size_t ptr; } current_dir; char root_dir[PATH_MAX]; @@ -54,6 +53,7 @@ typedef enum const char * filebrowser_get_current_dir (filebrowser_t *filebrowser); const char * filebrowser_get_current_path (filebrowser_t *filebrowser); +bool filebrowser_get_current_path_isdir (filebrowser_t *filebrowser); size_t filebrowser_get_current_index (filebrowser_t *filebrowser); void filebrowser_set_root(filebrowser_t *filebrowser, const char *root_dir); void filebrowser_free(filebrowser_t *filebrowser); diff --git a/console/griffin/griffin.c b/console/griffin/griffin.c index d57de2a3ff..093c962612 100644 --- a/console/griffin/griffin.c +++ b/console/griffin/griffin.c @@ -54,7 +54,7 @@ VIDEO CONTEXT #if defined(__CELLOS_LV2__) #include "../../gfx/context/ps3_ctx.c" -#elif defined(_XBOX) +#elif defined(_XBOX360) #include "../../gfx/context/xdk360_ctx.c" #endif @@ -86,7 +86,7 @@ VIDEO DRIVER #ifdef HAVE_OPENGL #include "../../gfx/gl.c" -#elif defined(_XBOX) +#elif defined(_XBOX360) #include "../../360/xdk360_video.cpp" #elif defined(GEKKO) #include "../../wii/video.c" @@ -100,8 +100,8 @@ FONTS #if defined(__CELLOS_LV2__) #include "../../gfx/fonts/ps3_libdbgfont.c" -#elif defined(_XBOX) -#include "../../360/fonts.cpp" +#elif defined(_XBOX360) +#include "../../gfx/fonts/xdk360_fonts.cpp" #elif defined(GEKKO) #include "../../gfx/fonts/fonts.c" #endif @@ -111,7 +111,7 @@ INPUT ============================================================ */ #if defined(__CELLOS_LV2__) #include "../../ps3/ps3_input.c" -#elif defined(_XBOX) +#elif defined(_XBOX360) #include "../../360/xdk360_input.c" #elif defined(GEKKO) #include "../../wii/input.c" @@ -157,7 +157,7 @@ AUDIO ============================================================ */ #if defined(__CELLOS_LV2__) #include "../../ps3/ps3_audio.c" -#elif defined(_XBOX) +#elif defined(_XBOX360) #include "../../360/xdk360_audio.cpp" #elif defined(GEKKO) #include "../../wii/audio.c" @@ -202,10 +202,10 @@ REWIND /*============================================================ MAIN ============================================================ */ -#if defined(_XBOX) -#include "../../360/frontend/main.c" +#if defined(_XBOX360) +#include "../../360/frontend-xdk/main.c" #elif defined(GEKKO) -#include "../../wii/main.c" +#include "../../wii/frontend/main.c" #endif /*============================================================ @@ -230,8 +230,8 @@ NETPLAY /*============================================================ MENU ============================================================ */ -#if defined(_XBOX) -#include "../../360/frontend/menu.cpp" +#if defined(_XBOX360) +#include "../../360/frontend-xdk/menu.cpp" #elif defined(GEKKO) #include "../rgui/rgui.c" #include "../rgui/list.c" diff --git a/console/griffin/rarch_func_hooks.h b/console/griffin/rarch_func_hooks.h deleted file mode 100644 index dbae9dc3cd..0000000000 --- a/console/griffin/rarch_func_hooks.h +++ /dev/null @@ -1,58 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2012 - Hans-Kristian Arntzen - * Copyright (C) 2011-2012 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#ifndef _RARCH_FUNC_HOOKS_H -#define _RARCH_FUNC_HOOKS_H - -/*============================================================ - PLAYSTATION3 -============================================================ */ - -#ifdef __CELLOS_LV2__ - -#define HAVE_GRIFFIN_OVERRIDE_AUDIO_FLUSH_FUNC 1 - -static bool audio_flush(const int16_t *data, size_t samples) -{ - const float *output_data = NULL; - unsigned output_frames = 0; - - audio_convert_s16_to_float(g_extern.audio_data.data, data, samples); - - struct resampler_data src_data = {0}; - src_data.data_in = g_extern.audio_data.data; - src_data.data_out = g_extern.audio_data.outsamples; - src_data.input_frames = (samples / 2); - - src_data.ratio = g_extern.audio_data.src_ratio; - if (g_extern.is_slowmotion) - src_data.ratio *= g_settings.slowmotion_ratio; - - resampler_process(g_extern.audio_data.source, &src_data); - - output_data = g_extern.audio_data.outsamples; - output_frames = src_data.output_frames; - - if (audio_write_func(output_data, output_frames * sizeof(float) * 2) < 0) - return false; - - return true; -} - -#endif - - -#endif diff --git a/console/libretro_mgmt.c b/console/libretro_mgmt.c index f023339ebf..0250af2218 100644 --- a/console/libretro_mgmt.c +++ b/console/libretro_mgmt.c @@ -74,23 +74,23 @@ done: return retstr; } -const char *rarch_manage_libretro_set_first_file(const char *libretro_path, const char * exe_ext) +void rarch_manage_libretro_set_first_file(char *first_file, size_t size_of_first_file, const char *libretro_path, const char * exe_ext) { //We need to set libretro to the first entry in the cores //directory so that it will be saved to the config file - char ** dir_list = dir_list_new(libretro_path, exe_ext, false); + struct string_list *dir_list = dir_list_new(libretro_path, exe_ext, false); - const char * retstr = NULL; const char * first_exe; if (!dir_list) { RARCH_ERR("Couldn't read directory.\n"); - goto error; + RARCH_ERR("Failed to set first entry to libretro path.\n"); + goto end; } - first_exe = dir_list[0]; + first_exe = dir_list->elems[0].data; if(first_exe) { @@ -101,28 +101,24 @@ const char *rarch_manage_libretro_set_first_file(const char *libretro_path, cons if(strcmp(fname_tmp, "RetroArch-Salamander.xex") == 0) { RARCH_WARN("First entry is RetroArch Salamander itself, increment entry by one and check if it exists.\n"); - first_exe = dir_list[1]; + first_exe = dir_list->elems[1].data; fill_pathname_base(fname_tmp, first_exe, sizeof(fname_tmp)); if(!first_exe) { RARCH_ERR("Unlikely error happened - no second entry - no choice but to set it to RetroArch Salamander\n"); - first_exe = dir_list[0]; + first_exe = dir_list->elems[0].data; fill_pathname_base(fname_tmp, first_exe, sizeof(fname_tmp)); } } - retstr = fname_tmp; + strlcpy(first_file, fname_tmp, size_of_first_file); #else - retstr = first_exe; + strlcpy(first_file, first_exe, size_of_first_file); #endif - RARCH_LOG("Set first entry in libretro core dir to libretro path: [%s].\n", retstr); - goto end; + RARCH_LOG("Set first entry in libretro core dir to libretro path: [%s].\n", first_file); } -error: - RARCH_ERR("Failed to set first entry to libretro path.\n"); end: dir_list_free(dir_list); - return retstr; } diff --git a/console/libretro_mgmt.h b/console/libretro_mgmt.h index b32db42850..f0c968d755 100644 --- a/console/libretro_mgmt.h +++ b/console/libretro_mgmt.h @@ -28,6 +28,6 @@ enum }; const char *rarch_manage_libretro_install(const char *full_path, const char *path, const char *exe_ext); -const char *rarch_manage_libretro_set_first_file(const char *libretro_path, const char * exe_ext); +void rarch_manage_libretro_set_first_file(char *first_file, size_t size_of_first_file, const char *libretro_path, const char * exe_ext); #endif diff --git a/logger_override.h b/console/logger/logger_override.h similarity index 93% rename from logger_override.h rename to console/logger/logger_override.h index 7dd0940cd7..0cf84278ed 100644 --- a/logger_override.h +++ b/console/logger/logger_override.h @@ -21,7 +21,7 @@ #include "console/logger/logger.h" #define RARCH_LOG(...) do { \ - if (g_extern.verbose) logger_send("SSNES: " __VA_ARGS__); \ + if (g_extern.verbose) logger_send("RetroArch: " __VA_ARGS__); \ } while(0) #define RARCH_ERR(...) do { \ @@ -36,7 +36,7 @@ extern FILE * log_fp; #ifndef RARCH_LOG #define RARCH_LOG(...) do { \ if (g_extern.verbose) \ - fprintf(log_fp, "SSNES: " __VA_ARGS__); \ + fprintf(log_fp, "RetroArch: " __VA_ARGS__); \ fflush(log_fp); \ } while (0) #endif diff --git a/console/salamander/main.c b/console/salamander/main.c index 9b26aaaaac..ab7e5ba721 100644 --- a/console/salamander/main.c +++ b/console/salamander/main.c @@ -70,7 +70,6 @@ #if defined(__CELLOS_LV2__) static uint8_t np_pool[NP_POOL_SIZE]; -char contentInfoPath[PATH_MAX]; char usrDirPath[PATH_MAX]; SYS_PROCESS_PARAM(1001, 0x100000) #elif defined(_XBOX) @@ -81,59 +80,73 @@ char LIBRETRO_DIR_PATH[PATH_MAX]; char SYS_CONFIG_FILE[PATH_MAX]; char libretro_path[PATH_MAX]; +static void rarch_manage_libretro_set_first_file(char *first_file, size_t size_of_first_file, const char *libretro_path, const char * exe_ext) +{ + //We need to set libretro to the first entry in the cores + //directory so that it will be saved to the config file + + struct string_list *dir_list = dir_list_new(libretro_path, exe_ext, false); + + const char * first_exe; + + if (!dir_list) + { + RARCH_ERR("Couldn't read directory.\n"); + RARCH_ERR("Failed to set first entry to libretro path.\n"); + goto end; + } + + first_exe = dir_list->elems[0].data; + + if(first_exe) + { +#ifdef _XBOX + char fname_tmp[PATH_MAX]; + fill_pathname_base(fname_tmp, first_exe, sizeof(fname_tmp)); + + if(strcmp(fname_tmp, "RetroArch-Salamander.xex") == 0) + { + RARCH_WARN("First entry is RetroArch Salamander itself, increment entry by one and check if it exists.\n"); + first_exe = dir_list->elems[1].data; + fill_pathname_base(fname_tmp, first_exe, sizeof(fname_tmp)); + + if(!first_exe) + { + RARCH_ERR("Unlikely error happened - no second entry - no choice but to set it to RetroArch Salamander\n"); + first_exe = dir_list->elems[0].data; + fill_pathname_base(fname_tmp, first_exe, sizeof(fname_tmp)); + } + } + + strlcpy(first_file, fname_tmp, size_of_first_file); +#else + strlcpy(first_file, first_exe, size_of_first_file); +#endif + RARCH_LOG("Set first entry in libretro core dir to libretro path: [%s].\n", first_file); + } + +end: + dir_list_free(dir_list); +} + static void find_and_set_first_file(void) { //Last fallback - we'll need to start the first executable file // we can find in the RetroArch cores directory + char first_file[PATH_MAX]; + rarch_manage_libretro_set_first_file(first_file, sizeof(first_file), #if defined(_XBOX) - char ** dir_list = dir_list_new("game:\\", "xex", false); + "game:\\", "xex" #elif defined(__CELLOS_LV2__) - char ** dir_list = dir_list_new(LIBRETRO_DIR_PATH, "SELF", false); + LIBRETRO_DIR_PATH, "SELF" #endif +); - if (!dir_list) - { - RARCH_ERR("Failed last fallback - RetroArch Salamander will exit.\n"); - return; - } - - char * first_executable = dir_list[0]; - - if(first_executable) - { -#ifdef _XBOX - //Check if it's RetroArch Salamander itself - if so, first_executable needs to - //be overridden - char fname_tmp[PATH_MAX]; - - fill_pathname_base(fname_tmp, first_executable, sizeof(fname_tmp)); - - if(strcmp(fname_tmp, "RetroArch-Salamander.xex") == 0) - { - RARCH_WARN("First entry is RetroArch Salamander itself, increment entry by one and check if it exists.\n"); - first_executable = dir_list[1]; - fill_pathname_base(fname_tmp, first_executable, sizeof(fname_tmp)); - - if(!first_executable) - { - RARCH_WARN("There is no second entry - no choice but to boot RetroArch Salamander\n"); - first_executable = dir_list[0]; - fill_pathname_base(fname_tmp, first_executable, sizeof(fname_tmp)); - } - } - - snprintf(first_executable, sizeof(first_executable), "game:\\%s", fname_tmp); -#endif - RARCH_LOG("Start first entry in libretro cores dir: [%s].\n", first_executable); - strlcpy(libretro_path, first_executable, sizeof(libretro_path)); - } + if(first_file) + strlcpy(libretro_path, first_file, sizeof(libretro_path)); else - { RARCH_ERR("Failed last fallback - RetroArch Salamander will exit.\n"); - } - - dir_list_free(dir_list); } static void init_settings(void) @@ -238,6 +251,7 @@ static void get_environment_settings (void) unsigned int get_attributes; CellGameContentSize size; char dirName[CELL_GAME_DIRNAME_SIZE]; + char contentInfoPath[PATH_MAX]; memset(&size, 0x00, sizeof(CellGameContentSize)); diff --git a/driver.c b/driver.c index 388c36b5f6..19054f0b1a 100644 --- a/driver.c +++ b/driver.c @@ -69,7 +69,7 @@ static const audio_driver_t *audio_drivers[] = { #ifdef XENON &audio_xenon360, #endif -#ifdef _XBOX +#ifdef _XBOX360 &audio_xdk360, #endif #ifdef GEKKO @@ -85,7 +85,7 @@ static const video_driver_t *video_drivers[] = { #ifdef XENON &video_xenon360, #endif -#ifdef _XBOX +#ifdef _XBOX360 &video_xdk360, #endif #ifdef HAVE_SDL @@ -119,7 +119,7 @@ static const input_driver_t *input_drivers[] = { #ifdef XENON &input_xenon360, #endif -#ifdef _XBOX +#ifdef _XBOX360 &input_xdk360, #endif #ifdef GEKKO @@ -484,28 +484,31 @@ static void deinit_filter(void) #endif #ifdef HAVE_XML +static void deinit_shader_dir(void) +{ + // It handles NULL, no worries :D + dir_list_free(g_extern.shader_dir.list); + g_extern.shader_dir.list = NULL; + g_extern.shader_dir.ptr = 0; +} + static void init_shader_dir(void) { if (!*g_settings.video.shader_dir) return; - g_extern.shader_dir.elems = dir_list_new(g_settings.video.shader_dir, "shader", false); - g_extern.shader_dir.size = dir_list_size(g_extern.shader_dir.elems); - g_extern.shader_dir.ptr = 0; + g_extern.shader_dir.list = dir_list_new(g_settings.video.shader_dir, "shader", false); + if (g_extern.shader_dir.list->size == 0) + { + deinit_shader_dir(); + return; + } - dir_list_sort(g_extern.shader_dir.elems, false); + g_extern.shader_dir.ptr = 0; + dir_list_sort(g_extern.shader_dir.list, false); - for (unsigned i = 0; i < g_extern.shader_dir.size; i++) - RARCH_LOG("Found shader \"%s\"\n", g_extern.shader_dir.elems[i]); -} - -static void deinit_shader_dir(void) -{ - // It handles NULL, no worries :D - dir_list_free(g_extern.shader_dir.elems); - g_extern.shader_dir.elems = NULL; - g_extern.shader_dir.size = 0; - g_extern.shader_dir.ptr = 0; + for (unsigned i = 0; i < g_extern.shader_dir.list->size; i++) + RARCH_LOG("Found shader \"%s\"\n", g_extern.shader_dir.list->elems[i].data); } #endif diff --git a/dynamic.c b/dynamic.c index c0d857b48a..cd48846e72 100644 --- a/dynamic.c +++ b/dynamic.c @@ -16,6 +16,7 @@ #include "dynamic.h" #include "general.h" #include "compat/strl.h" +#include "compat/posix_string.h" #include #ifdef RARCH_CONSOLE @@ -367,8 +368,11 @@ static void set_environment(void) // Assume SNES as defaults. static void set_environment_defaults(void) { + char *save; + // Split up environment variables beforehand. - if (g_extern.system.environment_split && strtok(g_extern.system.environment_split, ";")) - while (strtok(NULL, ";")); + if (g_extern.system.environment_split && + strtok_r(g_extern.system.environment_split, ";", &save)) + while (strtok_r(NULL, ";", &save)); } diff --git a/file.h b/file.h index b4f4179bb0..467f5b75a8 100644 --- a/file.h +++ b/file.h @@ -36,13 +36,30 @@ void save_ram_file(const char *path, int type); bool init_rom_file(enum rarch_game_type type); -// Returns a NULL-terminated list of files in a directory with full paths. -// If ext is NULL, any file will be picked. -// If non-NULL, only files with extension ext are added. -char **dir_list_new(const char *dir, const char *ext, bool include_dirs); -size_t dir_list_size(char * const *dir_list); -void dir_list_sort(char **dir_list, bool dir_first); -void dir_list_free(char **dir_list); +// Yep, this is C alright ;) +union string_list_elem_attr +{ + bool b; + int i; + void *p; +}; + +struct string_list_elem +{ + char *data; + union string_list_elem_attr attr; +}; + +struct string_list +{ + struct string_list_elem *elems; + size_t size; + size_t cap; +}; + +struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs); +void dir_list_sort(struct string_list *list, bool dir_first); +void dir_list_free(struct string_list *list); bool path_is_directory(const char *path); bool path_file_exists(const char *path); diff --git a/file_path.c b/file_path.c index 860f3cf69e..e5338bae97 100644 --- a/file_path.c +++ b/file_path.c @@ -23,9 +23,14 @@ #include "compat/posix_string.h" #ifdef __CELLOS_LV2__ +#include //stat() is defined here #define S_ISDIR(x) (x & CELL_FS_S_IFDIR) #endif +#ifdef _XBOX +#include +#endif + #if defined(_WIN32) && !defined(_XBOX) #include #include @@ -34,7 +39,6 @@ #define setmode _setmode #endif #elif defined(_XBOX) -#include #define setmode _setmode #define INVALID_FILE_ATTRIBUTES -1 #else @@ -43,111 +47,107 @@ #include #endif -// Yep, this is C alright ;) -struct string_list +static void string_list_free(struct string_list *list) { - char **data; - size_t size; - size_t cap; -}; + if (!list) + return; + + for (size_t i = 0; i < list->size; i++) + free(list->elems[i].data); + free(list->elems); + free(list); +} static bool string_list_capacity(struct string_list *list, size_t cap) { rarch_assert(cap > list->size); - char **new_data = (char**)realloc(list->data, cap * sizeof(char*)); + struct string_list_elem *new_data = (struct string_list_elem*)realloc(list->elems, cap * sizeof(*new_data)); if (!new_data) return false; - list->data = new_data; - list->cap = cap; + list->elems = new_data; + list->cap = cap; return true; } -static bool string_list_init(struct string_list *list) +static struct string_list *string_list_new(void) { - memset(list, 0, sizeof(*list)); - return string_list_capacity(list, 32); + struct string_list *list = (struct string_list*)calloc(1, sizeof(*list)); + if (!list) + return NULL; + + if (!string_list_capacity(list, 32)) + { + string_list_free(list); + return NULL; + } + + return list; } -static bool string_list_append(struct string_list *list, const char *elem) +static bool string_list_append(struct string_list *list, const char *elem, union string_list_elem_attr attr) { - if (list->size + 1 >= list->cap && !string_list_capacity(list, list->cap * 2)) + if (list->size >= list->cap && + !string_list_capacity(list, list->cap * 2)) return false; - if (!(list->data[list->size] = strdup(elem))) + char *dup = strdup(elem); + if (!dup) return false; + list->elems[list->size].data = dup; + list->elems[list->size].attr = attr; + list->size++; return true; } -static char **string_list_finalize(struct string_list *list) -{ - rarch_assert(list->cap > list->size); - - list->data[list->size] = NULL; - return list->data; -} - -static void string_list_cleanup(struct string_list *list) -{ - for (size_t i = 0; i < list->size; i++) - free(list->data[i]); - free(list->data); - memset(list, 0, sizeof(*list)); -} - -static void string_list_free(char **list) -{ - if (!list) - return; - - char **orig = list; - while (*list) - free(*list++); - free(orig); -} - -static char **string_split(const char *str, const char *delim) +static struct string_list *string_split(const char *str, const char *delim) { char *copy = NULL; const char *tmp = NULL; - struct string_list list; - if (!string_list_init(&list)) + struct string_list *list = string_list_new(); + if (!list) goto error; copy = strdup(str); if (!copy) - return NULL; + goto error; - tmp = strtok(copy, delim); + char *save; + tmp = strtok_r(copy, delim, &save); while (tmp) { - if (!string_list_append(&list, tmp)) + union string_list_elem_attr attr; + memset(&attr, 0, sizeof(attr)); + + if (!string_list_append(list, tmp, attr)) goto error; - tmp = strtok(NULL, delim); + tmp = strtok_r(NULL, delim, &save); } free(copy); - return string_list_finalize(&list); + return list; error: - string_list_cleanup(&list); + string_list_free(list); free(copy); return NULL; } -static bool string_list_find_elem(char * const *list, const char *elem) +static bool string_list_find_elem(const struct string_list *list, const char *elem) { if (!list) return false; - for (; *list; list++) - if (strcmp(*list, elem) == 0) + for (size_t i = 0; i < list->size; i++) + { + if (strcmp(list->elems[i].data, elem) == 0) return true; + } return false; } @@ -161,50 +161,42 @@ static const char *path_get_extension(const char *path) return ""; } -size_t dir_list_size(char * const *dir_list) +static int qstrcmp_plain(const void *a_, const void *b_) { - if (!dir_list) - return 0; + const struct string_list_elem *a = (const struct string_list_elem*)a_; + const struct string_list_elem *b = (const struct string_list_elem*)b_; - size_t size = 0; - while (*dir_list++) - size++; - - return size; -} - -static int qstrcmp_plain(const void *a, const void *b) -{ - return strcasecmp(*(const char * const*)a, *(const char * const*)b); + return strcasecmp(a->data, b->data); } static int qstrcmp_dir(const void *a_, const void *b_) { - const char *a = *(const char * const*)a_; - const char *b = *(const char * const*)b_; + const struct string_list_elem *a = (const struct string_list_elem*)a_; + const struct string_list_elem *b = (const struct string_list_elem*)b_; // Sort directories before files. - int a_dir = path_is_directory(a); - int b_dir = path_is_directory(b); + int a_dir = a->attr.b; + int b_dir = b->attr.b; if (a_dir != b_dir) return b_dir - a_dir; - - return strcasecmp(a, b); + else + return strcasecmp(a->data, b->data); } -void dir_list_sort(char **dir_list, bool dir_first) +void dir_list_sort(struct string_list *list, bool dir_first) { - if (!dir_list) + if (!list) return; - qsort(dir_list, dir_list_size(dir_list), sizeof(char*), dir_first ? qstrcmp_dir : qstrcmp_plain); + qsort(list->elems, list->size, sizeof(struct string_list_elem), + dir_first ? qstrcmp_dir : qstrcmp_plain); } #ifdef _WIN32 // Because the API is just fucked up ... -char **dir_list_new(const char *dir, const char *ext, bool include_dirs) +struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs) { - struct string_list list; - if (!string_list_init(&list)) + struct string_list *list = string_list_new(); + if (!list) return NULL; HANDLE hFind = INVALID_HANDLE_VALUE; @@ -213,7 +205,7 @@ char **dir_list_new(const char *dir, const char *ext, bool include_dirs) char path_buf[PATH_MAX]; snprintf(path_buf, sizeof(path_buf), "%s\\*", dir); - char **ext_list = NULL; + struct string_list *ext_list = NULL; if (ext) ext_list = string_split(ext, "|"); @@ -236,35 +228,38 @@ char **dir_list_new(const char *dir, const char *ext, bool include_dirs) char file_path[PATH_MAX]; snprintf(file_path, sizeof(file_path), "%s\\%s", dir, name); - if (!string_list_append(&list, file_path)) + union string_list_elem_attr attr; + attr.b = is_dir; + + if (!string_list_append(list, file_path, attr)) goto error; } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); string_list_free(ext_list); - return string_list_finalize(&list); + return list; error: RARCH_ERR("Failed to open directory: \"%s\"\n", dir); if (hFind != INVALID_HANDLE_VALUE) FindClose(hFind); - string_list_cleanup(&list); + string_list_free(list); string_list_free(ext_list); return NULL; } #else -char **dir_list_new(const char *dir, const char *ext, bool include_dirs) +struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs) { - struct string_list list; - if (!string_list_init(&list)) + struct string_list *list = string_list_new(); + if (!list) return NULL; DIR *directory = NULL; const struct dirent *entry = NULL; - char **ext_list = NULL; + struct string_list *ext_list = NULL; if (ext) ext_list = string_split(ext, "|"); @@ -287,14 +282,17 @@ char **dir_list_new(const char *dir, const char *ext, bool include_dirs) char file_path[PATH_MAX]; snprintf(file_path, sizeof(file_path), "%s/%s", dir, name); - if (!string_list_append(&list, file_path)) + union string_list_elem_attr attr; + attr.b = is_dir; + + if (!string_list_append(list, file_path, attr)) goto error; } closedir(directory); string_list_free(ext_list); - return string_list_finalize(&list); + return list; error: RARCH_ERR("Failed to open directory: \"%s\"\n", dir); @@ -302,15 +300,15 @@ error: if (directory) closedir(directory); - string_list_cleanup(&list); + string_list_free(list); string_list_free(ext_list); return NULL; } #endif -void dir_list_free(char **dir_list) +void dir_list_free(struct string_list *list) { - string_list_free(dir_list); + string_list_free(list); } bool path_is_directory(const char *path) diff --git a/general.h b/general.h index 8a4f022c4e..2f784369f2 100644 --- a/general.h +++ b/general.h @@ -42,7 +42,7 @@ #include