//============================================================================== // Created on: 10/13/2003 // Base class for streaming music related classes // Organizational purposes only // // Written by Ron Prestenback // © 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class StreamBase extends Object Abstract Native; enum EFileType { FILE_None, FILE_Directory, FILE_Log, FILE_Ini, FILE_Stream, FILE_Playlist, FILE_Music, FILE_Map, FILE_Texture, FILE_Animation, FILE_Static, FILE_XML, FILE_HTML, FILE_Sound, FILE_Demo, FILE_DivX, }; enum EStreamPlaylistType { SPT_None, SPT_M3U, SPT_PLS, SPT_B4S, }; struct FilePath { var string FullPath, Directory, // Always contains trailing path-separator Filename, // Only contains name (no dots) Extension; // Only contains extension (no dots) var array DirectoryParts; }; struct ID3Field { var pointer Reference; var string FieldName; var string FieldValue; var byte FieldID; var byte Code[4]; }; // "StringA" * "StringB" = "StringA\StringB" or "StringA/StringB" native static final operator(40) string * ( coerce string A, coerce string B ); native static final operator(44) string *= ( out string A, coerce string B ); // OS-specific hooks native static final function string GetPathSeparator(); native static final function bool IsCaseSensitive(); // seperates a file path into a ParsedFilePath struct static final event string GetPathRoot( out string InPath ) { local int i; local string root; i = InStr(InPath, GetPathSeparator() $ GetPathSeparator()); // would look like: '//blah/blah/' if ( i == -1 ) i = InStr(InPath, ":" $ GetPathSeparator()); // would look like 'c:\blah\blah' if ( i != -1 ) { root = Left(InPath, i + 1); InPath = Mid(InPath, i + 2); // so root should now be either '/' or 'c:' } return root; } static final event bool HasExtension( string Test ) { return ParseExtension(Test) != ""; } static final event bool ParsePath( string InPath, out FilePath ParsedPath ) { local int i; if ( InPath == "" ) return false; ParsedPath.FullPath = InPath; i = RevInStr(InPath, GetPathSeparator()); if ( i != -1 ) ParsedPath.Directory = Left(InPath, i+1); ParsedPath.DirectoryParts = ParseDirectories(InPath); ParsedPath.Extension = ParseExtension(InPath); ParsedPath.FileName = InPath; return ParsedPath.DirectoryParts.Length > 0 || (ParsedPath.Extension != "" && ParsedPath.FileName != ""); } static final event string ParseExtension( out string FileNameWithExtension ) { local int i; local string Ext; if ( FileNameWithExtension == "" ) return ""; i = RevInStr(FileNameWithExtension, "."); if ( i >= 0 ) Ext = Mid(FileNameWithExtension, i + 1); if ( ConvertToFileType(Ext) != FILE_None ) { FileNameWithExtension = Left(FileNameWithExtension,i); return Locs(Ext); } return ""; } static final event array ParseDirectories( out string InPath ) { local array Directories; local string root; root = GetPathRoot(InPath); Split(InPath, GetPathSeparator(), Directories); InPath = ""; // Re-insert the root directory at the beginning of the array if ( root != "" ) { Directories.Insert(0,1); Directories[0] = root; } // If the last item was actually a file, remove it from the array and store in the out string if ( HasExtension(Directories[Directories.Length - 1]) ) { InPath = Directories[Directories.Length - 1]; Directories.Length = Directories.Length - 1; } return Directories; } static final function int RevInStr( string src, string match ) { local int pos, i; local string s; if ( src == "" || match == "" ) return -1; s = src; i = InStr(s, match); do { pos += i; s = Mid(src, pos+1); i = InStr(s, match) + 1; } until ( i == 0 ); return pos; } static final function string FormatTimeDisplay( coerce float Seconds ) { local int i; local string TimeString; // Get hours i = Seconds / 3600; if ( i > 0 ) TimeString = i $ ":"; i = Seconds / 60; if ( TimeString != "" && i < 10 ) TimeString $= "0"; TimeString $= i $ ":"; i = Seconds % 60; if ( i < 10 ) TimeString $= "0"; TimeString $= i; return TimeString; } static final event string ConvertToFileExtension( EFileType Type ) { switch ( Type ) { case FILE_Log: return ".log"; case FILE_Ini: return ".ini"; case FILE_Playlist: return ".m3u;.pls;.b4s"; case FILE_Music: return ".umx"; case FILE_Map: return ".ut2"; case FILE_Texture: return ".utx"; case FILE_Animation: return ".ukx"; case FILE_Static: return ".usx"; case FILE_XML: return ".xml"; case FILE_HTML: return ".html;.htm"; case FILE_Sound: return ".uax"; case FILE_Demo: return ".DEMO4"; case FILE_DivX: return ".avi"; case FILE_Stream: // return ".ogg"; return ".mp3;.ogg"; } return ""; } static final event EFileType ConvertToFileType( string Extension ) { local string Ext; if ( Extension == "" ) return FILE_None; Ext = ParseExtension(Extension); if ( Ext == "" ) Ext = Extension; Ext = Locs(Ext); switch ( Ext ) { case "mp3":// return FILE_None; case "ogg": return FILE_Stream; case "wav": case "umx": return FILE_Music; case "ut2": return FILE_Map; case "ukx": return FILE_Animation; case "uax": return FILE_Sound; case "utx": return FILE_Texture; case "dem": return FILE_Demo; case "usx": return FILE_Static; case "ini": return FILE_Ini; case "log": return FILE_Log; case "avi": return FILE_DivX; case "xml": return FILE_XML; case "html": case "htm": return FILE_HTML; case "m3u": case "b4s": case "pls": return FILE_Playlist; } return FILE_None; } static function bool CompareNames( string NameA, string NameB ) { if ( IsCaseSensitive() ) return NameA == NameB; return NameA ~= NameB; } function bool HandleDebugExec( string Command, string Param ) { // log(Class.Name$"::HandleDebugExec Command:"$Command@"Param:"$Param); return false; } DefaultProperties { }