home *** CD-ROM | disk | FTP | other *** search
/ Amiga Dream 59 / CDDream59.ISO / BeOs / Sound / Intel / PPBeDevKit.ZIP / PLAYERPR.TAR / PlayerPRO / Source / Be-PlugImport.c < prev    next >
C/C++ Source or Header  |  1998-12-26  |  6KB  |  297 lines

  1. /********************                        ***********************/
  2. //
  3. //    Player PRO 5.0 -- MAD Class for BeOS -
  4. //
  5. //    Library Version 5.0
  6. //
  7. //    To use with MAD Library for BeOS: CodeWarrior
  8. //
  9. //    Antoine ROSSET
  10. //    16 Tranchees
  11. //    1206 GENEVA
  12. //    SWITZERLAND
  13. //
  14. //    Thank you for your interest in PlayerPRO !
  15. //
  16. //    Special Thanks to:
  17. //
  18. //    Dario Accornero <adario@cs.bu.edu>
  19. //
  20. //    For his BeOS support and help!
  21. //
  22. //    FAX:            (+41 22) 346 11 97
  23. //    PHONE:             (+41 79) 203 74 62
  24. //    Internet:         rossetantoine@bluewin.ch
  25. //
  26. /********************                        ***********************/
  27.  
  28. #include "RDriver.h"
  29. #include "RDriverInt.h"
  30. #include "FileUtils.h"
  31.  
  32. static    Boolean LoadPlugLib( Ptr name, PlugInfo* plug );
  33. static    void    ScanPlugDir( char *name );
  34.  
  35. static MADLibrary *inMADDriver;
  36.  
  37. OSErr CheckMADFile( Ptr name)
  38. {
  39.     UNFILE            refNum;
  40.     char                charl[ 20];
  41.     OSErr                err;
  42.     
  43.     refNum = iFileOpen( name);
  44.     if( !refNum) return -1;
  45.     else
  46.     {
  47.         iRead( 10, charl, refNum);
  48.         
  49.         if( charl[ 0] == 'M' &&
  50.                 charl[ 1] == 'A' &&
  51.                 charl[ 2] == 'D' &&
  52.                 charl[ 3] == 'I') err = noErr;
  53.         else err = -1;
  54.         
  55.         iClose( refNum);
  56.     }
  57.     
  58.     return err;
  59. }
  60.  
  61. //    DA on 9/9/98
  62.  
  63. OSErr CallImportPlug(     short        PlugNo,
  64.                         OSType        order,
  65.                         Ptr            AlienFile,
  66.                         MADMusic    *theNewMAD,
  67.                         PPInfoRec    *info)
  68. {
  69.     OSErr                myErr;
  70.     MADDriverSettings    settings;
  71.     
  72.     settings.sysMemory = inMADDriver->sysMemory;
  73.     myErr = (*(inMADDriver->ThePlug[ PlugNo].IOPlug)) (order, AlienFile, theNewMAD, info, &settings);
  74.     
  75.     return( myErr);
  76. }
  77.  
  78. OSErr    PPTestFile( char    *kindFile, Ptr AlienFile)
  79. {
  80.     short            i;
  81.     MADMusic        aMAD;
  82.     PPInfoRec        InfoRec;
  83.     
  84.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  85.     {
  86.         if( !strcmp( kindFile, inMADDriver->ThePlug[ i].type))
  87.         {
  88.             return( CallImportPlug( i, 'TEST', AlienFile, &aMAD, &InfoRec));
  89.         }
  90.     }
  91.     return MADCannotFindPlug;
  92. }
  93.  
  94. OSErr    PPInfoFile( char    *kindFile, char    *AlienFile, PPInfoRec    *InfoRec)
  95. {
  96.     short            i;
  97.     MADMusic        aMAD;
  98.     
  99.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  100.     {
  101.         if( !strcmp( kindFile, inMADDriver->ThePlug[ i].type))
  102.         {
  103.             return( CallImportPlug( i, 'INFO', AlienFile, &aMAD, InfoRec));
  104.         }
  105.     }
  106.     return MADCannotFindPlug;
  107. }
  108.  
  109. OSErr    PPExportFile( char    *kindFile, char    *AlienFile, MADMusic    *theNewMAD)
  110. {
  111.     short        i;
  112.     PPInfoRec    InfoRec;
  113.     
  114.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  115.     {
  116.         if( !strcmp( kindFile, inMADDriver->ThePlug[ i].type))
  117.         {
  118.             return( CallImportPlug( i, 'EXPL', AlienFile, theNewMAD, &InfoRec));
  119.         }
  120.     }
  121.     return MADCannotFindPlug;
  122. }
  123.  
  124. OSErr    PPImportFile( MADLibrary *MADLib, char    *kindFile, char    *AlienFile, MADMusic    **theNewMAD)
  125. {
  126.     short        i;
  127.     PPInfoRec    InfoRec;
  128.     
  129.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  130.     {
  131.         if( !strcmp( kindFile, inMADDriver->ThePlug[ i].type))
  132.         {
  133.             *theNewMAD = (MADMusic*) MADNewPtrClear( sizeof( MADMusic), inMADDriver);
  134.             if( !*theNewMAD) return -1L;
  135.             
  136.             return( CallImportPlug( i, 'IMPL', AlienFile, *theNewMAD, &InfoRec));
  137.         }
  138.     }
  139.     return MADCannotFindPlug;
  140. }
  141.  
  142. OSErr    PPIdentifyFile( MADLibrary *lib, char    *type, Ptr AlienFile)
  143. {
  144.     FILE*                refNum;
  145.     short                i;
  146.     PPInfoRec        InfoRec;
  147.     OSErr                iErr;
  148.     
  149.     strcpy( type, "!!!!");
  150.     
  151.     // Check if we have access to this file
  152.     refNum = iFileOpen( AlienFile);
  153.     if( !refNum) return -1;
  154.     iClose( refNum);
  155.     
  156.     // Is it a MAD file?
  157.     iErr = CheckMADFile( AlienFile);
  158.     if( iErr == noErr)
  159.     {
  160.         strcpy( type, "MADI");
  161.         return noErr;
  162.     }
  163.     
  164.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  165.     {
  166.         if( CallImportPlug( i, 'TEST', AlienFile, 0L, &InfoRec) == noErr)
  167.         {
  168.             strcpy( type, inMADDriver->ThePlug[ i].type);
  169.             
  170.             return noErr;
  171.         }
  172.     }
  173.     
  174.     strcpy( type, "!!!!");
  175.     
  176.     return MADCannotFindPlug;
  177. }
  178.  
  179. EXP    Boolean    MADPlugAvailable( char    *kindFile)
  180. {
  181.     short        i;
  182.  
  183.     if( !strcmp( kindFile, "MADI")) return true;
  184.     
  185.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  186.     {
  187.         if( !strcmp( kindFile, inMADDriver->ThePlug[ i].type)) return true;
  188.     }
  189.     return false;
  190. }
  191.  
  192. //    DA on 9/9/98
  193.  
  194. static    Boolean LoadPlugLib( Ptr name, PlugInfo* plug )
  195. {
  196.     strcpy( plug->file, name);
  197.     
  198.     plug->hLibrary = load_add_on( name );
  199.     if ( !plug->hLibrary )
  200.         return    false;
  201.     
  202.     OSErr (*FillPlugCode)( PlugInfo *p );
  203.     FillPlugCode = NULL;
  204.     status_t    symbolGet = get_image_symbol(    plug->hLibrary,
  205.                                                 "FillPlug",
  206.                                                 B_SYMBOL_TYPE_TEXT,
  207.                                                 &FillPlugCode );
  208.     
  209.     if ( symbolGet == B_NO_ERROR && FillPlugCode )
  210.     {
  211.         FillPlugCode( plug);
  212.     
  213.         MADPlug    plugCode = NULL;
  214.         
  215.         symbolGet = get_image_symbol(    plug->hLibrary,
  216.                                         "mainPLUG",
  217.                                         B_SYMBOL_TYPE_TEXT,
  218.                                         &plugCode );
  219.         if ( symbolGet == B_NO_ERROR && plugCode )
  220.         {
  221.             plug->IOPlug = plugCode;
  222.             return    true;
  223.         }
  224.         else
  225.         {
  226.             unload_add_on( plug->hLibrary );
  227.             return    false;
  228.         }
  229.     }
  230.     else
  231.     {
  232.         unload_add_on( plug->hLibrary );
  233.         return    false;
  234.     }
  235. }
  236.  
  237. //    DA on 9/9/98
  238.  
  239. static    void    ScanPlugDir( char *FindFolder )
  240. {
  241.     BDirectory    plugsDir( FindFolder );
  242.     entry_ref    plugsRef;
  243.     while( plugsDir.GetNextRef( &plugsRef ) == B_NO_ERROR )
  244.     {
  245.         if( inMADDriver->TotalPlug < MAXPLUG)
  246.         {
  247.             char myCompleteFilename[1024];
  248.             sprintf( myCompleteFilename, "%s/%s", FindFolder, plugsRef.name );
  249.             if( LoadPlugLib( myCompleteFilename, &inMADDriver->ThePlug[ inMADDriver->TotalPlug]))
  250.                 inMADDriver->TotalPlug++;
  251.         }
  252.     }
  253. }
  254.  
  255. //    DA on 9/9/98
  256.  
  257. void MInitImportPlug( MADLibrary *lib, char *PlugsFolderName)
  258. {
  259.     //    Signal there are no valid plugs yet.
  260.  
  261.     inMADDriver = lib;
  262.     inMADDriver->TotalPlug = 0;
  263.     inMADDriver->ThePlug = (PlugInfo*) MADNewPtr( MAXPLUG * sizeof( PlugInfo), inMADDriver);
  264.  
  265.     //    Construct valid path, independent of launch mode.
  266.     
  267.     app_info    aInfo;
  268.     status_t    error = be_app->GetAppInfo( &aInfo );
  269.     BEntry        fileEntry( &aInfo.ref );
  270.     BPath        filePath;
  271.     fileEntry.GetPath( &filePath );
  272.     BPath        parentPath;
  273.     filePath.GetParent( &parentPath );
  274.     char        pathBuffer[1024];
  275.     strcpy( pathBuffer, parentPath.Path() );
  276.  
  277.     //    Build main plugs path and scan it.
  278.  
  279.     char        FindFolder[1024];    
  280.     if ( PlugsFolderName && strlen( PlugsFolderName ) )
  281.         sprintf( FindFolder, "%s/%s", pathBuffer, PlugsFolderName );
  282.     else
  283.         strcpy( FindFolder, pathBuffer );
  284.     
  285.     ScanPlugDir( FindFolder );
  286. }
  287.  
  288. //    DA on 9/9/98
  289.  
  290. void CloseImportPlug( MADLibrary *lib)
  291. {
  292.     short i;
  293.     
  294.     for( i = 0; i < inMADDriver->TotalPlug; i++)
  295.         unload_add_on( inMADDriver->ThePlug[ i].hLibrary );
  296. }
  297.