Listar ficheros de directorio PSP

Hola a todos, estoy haciendo un programita para reproducir mp3's en la psp, (vale que ya lo lleva incorporado pero quiero hacerme uno propio por pasar el rato), el tema es que ya reproduzco, paro y pauso los archivos, el problema es que tengo que introducir el nombre del archivo especifico en el código y no puedo variarlo, con lo cual estoy intentando mostrar de alguna forma los archivos que hay en el directorio de música de la MS es decir "ms0:MUSIC/" pero no veo ninguna funcion en el sdk que me permita nada de esto, lo unico que veo son funciones para crear, borrar, modificar e incluso cambiar de directorio, pero nada respecto a listar los ficheros de estos, he estado buscando y no encuentro nada, así que si alguien puede darme un poco de luz respecto a este tema se lo agradeceria.

Un saludo
Hola,
Aunque no he realizado codigo desde cero, revisando en varios emuladores me encontre una llamada para obtener el listado de archivos. Se llama sceIoDread().
Ya con ello puedes revisar la siguiente url: http://forums.psp-hacks.com/archive/index.php/t-213353.html

Si te sirve, en el codigo fuente de los emuladores CPS1, CPS2 Y MVS se encuentra la siguiente función dentro del archivo filer.c . No es el ejemplo mas simple, pero te puede dar una idea.

Saludos.

static void getDir(const char *path)
{
   int i, j, type, fd;

   memset(&dir, 0, sizeof(dir));

   nfiles = 0;

   if (strcmp(path, "ms0:/") != 0)
   {
      strcpy(files[nfiles]->name, "..");
      strcpy(files[nfiles]->title, "..");
      files[nfiles]->type = FTYPE_UPPERDIR;
      files[nfiles]->flag = 0;
      nfiles++;
   }

   fd = sceIoDopen(path);

   while (nfiles < MAX_ENTRY)
   {
      char *ext;

      if (sceIoDread(fd, &dir) <= 0)
      {
         break;
      }
      if (dir.d_name[0] == '.')
      {
         continue;
      }

      if ((ext = strrchr(dir.d_name, '.')) != NULL)
      {

         if (stricmp(ext, ".zip") == 0)
         {
            strcpy(files[nfiles]->name, dir.d_name);
            files[nfiles]->type = FTYPE_ZIP;
            if (set_file_flags(path, nfiles))
            {
               nfiles++;
            }
            continue;
         }
      }
      if (dir.d_stat.st_attr == FIO_SO_IFDIR)
      {

         if (stricmp(dir.d_name, "config") == 0) continue;
         if (stricmp(dir.d_name, "snap") == 0) continue;
         if (stricmp(dir.d_name, "nvram") == 0) continue;
         strcpy(files[nfiles]->name, dir.d_name);
         files[nfiles]->type = FTYPE_DIR;
         set_file_flags(path, nfiles);
         nfiles++;
      }
   }

   sceIoDclose(fd);

   for (i = 0; i < nfiles - 1; i++)
   {
      for (j = i + 1; j < nfiles; j++)
      {
         if (files[i]->type > files[j]->type)
         {
            struct dirent tmp;

            tmp = *files[i];
            *files[i] = *files[j];
            *files[j] = tmp;
         }
      }
   }

   for (type = 1; type < 4; type++)
   {
      int start = nfiles, end = 0;

      for (i = 0; i < nfiles; i++)
      {
         if (files[i]->type == type)
         {
            start = i;
            break;
         }
      }
      for (; i < nfiles; i++)
      {
         if (files[i]->type != type)
         {
            end = i;
            break;
         }
      }

      if (start == nfiles) continue;
      if (end == 0) end = nfiles;

      for (i = start; i < end - 1; i++)
      {
         for (j = i + 1; j < end; j++)
         {
            if (strcmp(files[i]->title, files[j]->title) > 0)
            {
               struct dirent tmp;

               tmp = *files[i];
               *files[i] = *files[j];
               *files[j] = tmp;
            }
         }
      }
   }
}

Gracias davex por tu respuesta!!!!, de todas formas conseguí encontrar por ahí algo de información que tambien me funciona y lo veo un poco más sencillo, además que ya lo tengo funcionando en fase de pruebas, cuando lo tenga decente lo pondré aqui por si a alguien le interesa.

Un saludo, y muchas gracias de nuevo!!!
2 respuestas