FMOD Netstream

PH2621 Messages postés 9 Date d'inscription mardi 21 février 2006 Statut Membre Dernière intervention 30 janvier 2009 - 27 janv. 2009 à 11:41
PH2621 Messages postés 9 Date d'inscription mardi 21 février 2006 Statut Membre Dernière intervention 30 janvier 2009 - 30 janv. 2009 à 11:40
Bonjour à tous

Comme de nombreux "Screamer" ou "Streamer" radio au bout de quelques minutes la liaison avec les serveurs tombe et le silence ou la répétition perpétuelle du dernier bloc nous envahit. Pourtant des radios comme SmoothJazz ont des listes de plusieurs serveurs.
Des programmes comme "Quintessential Player" commutent automatiquement lorsque la liaison craque.

J'utilise la librairie FMOD (en c++) et je n'arrive pas à basculer sur une autre adresse l'application est muette ... Est-ce que quelqu'un par hasard aurait une petite idée sur la question ...

patrice.henrion@orange.fr

1 réponse

PH2621 Messages postés 9 Date d'inscription mardi 21 février 2006 Statut Membre Dernière intervention 30 janvier 2009
30 janv. 2009 à 11:40
Bonjour




On peut voir cet exemple dans FMOD (netstream) j'ai repris cet exemple de cette façon.





FMOD_SYSTEM    *rsystem;
FMOD_SOUND      *sound;
FMOD_CHANNEL   *channel;
FMOD_RESULT      result;
FMOD_MODE   mode = FMOD_SOFTWARE | FMOD_LOOP_OFF | FMOD_2D | FMOD_CREATESTREAM
                                                           |  FMOD_NONBLOCKING;
FMOD_OPENSTATE openstate;
FMOD_TAG     tag;




char * SmoothWeb[] =
{
    "http://64.15.67.14:80",                                             //  0
    "http://scfire-ntc-aa10.stream.aol.com/stream/1005",   //  1
    "http://scfire-dtc-aa01.stream.aol.com/stream/1005",   //  2
    "http://scfire-dtc-aa02.stream.aol.com/stream/1005",   //  3
    "http://scfire-dtc-aa03.stream.aol.com/stream/1005",   //  4
    "http://scfire-dtc-aa04.stream.aol.com/stream/1005",   //  5
           ................
};
int maxsmooth = (sizeof(SmoothWeb) / sizeof(int)) -1;
char **RadioWeb;

void ErrCheck(FMOD_RESULT result)
{
  if (result != FMOD_OK)
  {
    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
    exit(-1);
  }
}
 
int main(int argc, char *argv[])
{
  printf("===================================================================\n");
  printf("                                              Test Netstream                                                                  \n");
  printf("===================================================================\n\n");

  printf("Press space to pause, Esc to quit\n\n");

  result = FMOD_System_Create(&rsystem);
  ErrCheck(result);

  result = FMOD_System_GetVersion(rsystem, &version);
  ErrCheck(result);

  if (version < FMOD_VERSION)
  {
    printf("Erreur!  La version que vous devez utiliser FMOD %08x\n", FMOD_VERSION);
    return 0;
  }
  RadioWeb SmoothWeb;  MaxRadio maxsmooth;  IdxRadio 0;  loop TRUE;

  result = FMOD_System_Init(rsystem, 1 , FMOD_INIT_NORMAL, 0);
  ErrCheck(result);                   *** A noter que dans ripnetstream on voit 100 (Pourquoi ?)

  result = FMOD_System_SetStreamBufferSize(rsystem, 64*1024, FMOD_TIMEUNIT_RAWBYTES);
  ErrCheck(result);

  result = FMOD_System_CreateSound(rsystem, RadioWeb[IdxRadio], mode, 0, &sound);
  ErrCheck(result);

  do
  {
    if (kbhit())
    {
      key = getch();

      switch (key)
      {
        case ' ' :
        {
          if (channel)
          {
            FMOD_Channel_GetPaused(channel, &paused);
            FMOD_Channel_SetPaused(channel, !paused);
          }
          break;
        }
        case 27:
        {
          loop = FALSE;
          break;
        }
      }
    }

    FMOD_System_Update(rsystem);

    if ((sound) && (!channel))
    {
      FMOD_System_PlaySound(rsystem, FMOD_CHANNEL_FREE, sound, FALSE, &channel);
    }

    if (channel)
    {
      for (;;)
      {
        if (FMOD_Sound_GetTag(sound, 0, -1, &tag) != FMOD_OK)
          break;
        if (tag.datatype == FMOD_TAGDATATYPE_STRING)
          printf("%s = %s                            \n", tag.name, tag.data);
      }

      FMOD_Sound_GetOpenState(sound, &openstate, &percent, &starving);
      FMOD_Channel_GetPosition(channel, &ms, FMOD_TIMEUNIT_MS);
      printf("Time %02d:%02d  (%3d%%)  %d  \r", ms /1000 /60, ms /1000 %60, percent, IdxRadio);

      if (starving)  // Le buffer est vide ? ... la liaison ? ... ou ? ...
      {
        FMOD_Sound_Release(sound); // Et la on bloque on ne peut pas effacer ce "sound"        sound 0; channel 0;            // C'est plus génant Que peut-on faire ???
        if (++IdxRadio > MaxRadio) IdxRadio = 0;
        FMOD_System_CreateStream(rsystem, RadioWeb[IdxRadio], mode, 0, &sound);
        Sleep(1000);
      }
    }
    Sleep(200);
  } while (loop);

  printf("\nShutting down.\n");

  result = FMOD_Sound_Release(sound);
  ErrCheck(result);
  result = FMOD_System_Close(rsystem);
  ErrCheck(result);
  result = FMOD_System_Release(rsystem);
  ErrCheck(result);

  return 0;
}

Donc le problème est situé. Si la liaison se perd pourquoi pas mais comment basculer ?
commme je l'avais dit le message précédent.
0