Un nuovo progetto…

I lettori più “datati” si ricorderanno di certo i Librogame degli anni ’80.
Personalmente da ragazzo ne lessi diversi e devo dire che li trovai divertenti.
Ricordandomi questo e venendo a conoscenza del Project AON che ha avuto il permesso dell’autore di pubblicare gratuitamente i libri della serie Lone Wolf (Lupo Solitario in Italia) ho pensato che avrei potuto realizzare una versione “portatile” dei libri per poterli leggere comodamente sul mio nokia N900.

Da un po’ di giorni ho iniziato a sviluppare il progetto e devo dire che procede abbastanza bene. Il primo libro è giocabile al 100% (ma devo ancora finire di testarlo) mentre per i successivi dovrò lavorarci ancora un po’.

Ecco comunque una piccola anteprima:

Non so quanto tempo mi servirà per completare il lavoro (devo rendere il mio programma compatibile con la licenza del Poject AON e fare un po’ di testing), ma non appena il programma verrà rilasciato lo saprete di sicuro da queste pagine. :)

Portaudio e libmad

Ho “scoperto” ieri una libreria audio compatibile con Windows e Linux: Portaudio.
Incuriosito ho deciso di provarla: un’ottima opportunità per provare ad utilizzarla insieme a MAD (libreria di decodifica MPEG) e scrivere un piccolo esempio di riproduzione di file MP3 cross-platform (sicuramente funziona su Windows e Linux e molto probabilmente anche su Nokia N900 ma non ho ancora provato).

Il risultato lo trovate in questo file.
Si tratta ovviamente di un esempio e non è un programma completo, ma dimostra la semplicità d’uso di Portaudio e MAD (due ottime librerie a mio parere).

La funzione main è molto semplice:

/* Main */
  1. int main(int argc, char *argv[])
  2. {
  3.     printf("Mad and portaudio sample\n");
  4.     printf("Copyright (c) 2011 Paolo Iommarini\n\n");
  5.  
  6.     char input[264] = "test.mp3";
  7.     if (argc > 1)
  8.         strcpy(input, argv[1]);
  9.     printf("Input file: %s\n", input);
  10.  
  11.     PaError err = Pa_Initialize();
  12.     if( err != paNoError ) goto error;
  13.     printf("Portaudio initialized\n");
  14.  
  15.     mad_stream_init(&Stream);
  16.     mad_header_init(&Header);
  17.     mad_frame_init(&Frame);
  18.     mad_synth_init(&Synth);
  19.     mad_timer_reset(&Timer);
  20.     printf("Mad initialized\n");
  21.  
  22.     input_fd = fopen(input, "rb");
  23.     if (!input_fd){
  24.         printf("Failed to open input file\n");
  25.         goto end;
  26.     }
  27.  
  28.     int size = ID3v2TagSize(input);
  29.     printf("Tag size %i\n", size);
  30.     fseek(input_fd, size, SEEK_SET);
  31.  
  32.     PaStream *stream;
  33.     /* Open an audio I/O stream. */
  34.     err = Pa_OpenDefaultStream( &stream,
  35.                                 0,
  36.                                 2,          /* stereo output */
  37.                                 paInt16,
  38.                                 SAMPLE_RATE,
  39.                                 INPUT_BUFFER_SIZE, /* frames per buffer, i.e. the number
  40.                                                    of sample frames that PortAudio will
  41.                                                    request from the callback. Many apps
  42.                                                    may want to use
  43.                                                    paFramesPerBufferUnspecified, which
  44.                                                    tells PortAudio to pick the best,
  45.                                                    possibly changing, buffer size.*/
  46.                                 patestCallback,
  47.                                 NULL );
  48.     if( err != paNoError ) goto error;
  49.     printf("Stream opened\n");
  50.  
  51.     err = Pa_StartStream( stream );
  52.     if( err != paNoError ) goto error;
  53.     printf("Stream started\n");
  54.  
  55.     printf("Waiting end of stream\n");
  56.     while (!eos)
  57.         Pa_Sleep(1000);
  58.  
  59.     err = Pa_StopStream( stream );
  60.     if( err != paNoError ) goto error;
  61.  
  62.     err = Pa_Terminate();
  63.     if( err != paNoError ) goto error;
  64.     printf("Portaudio terminated\n");
  65.  
  66.     mad_synth_finish(&Synth);
  67.     mad_header_finish(&Header);
  68.     mad_frame_finish(&Frame);
  69.     mad_stream_finish(&Stream);
  70.     printf("Mad terminated\n");
  71.  
  72. end:
  73.     return 0;
  74.  
  75. error:
  76.     printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
  77.  
  78.     return 0;
  79. }

Una cosa che salta all’occhio guardando il sorgente dell’esempio è che riproduce solo MP3 a 44.100Hz, 16 bit, stereo ma non è difficile adattarlo. ;)

Dream Theater finalmente fuori dal baratro

Con un po’ di scetticismo in questi giorni sto ascoltando l’ultimo album dei Dream Theater: A Dramatic Turn Of Events e devo dire che mi ha piacevolmente sorpreso.

Personalmente non ho per nulla apprezzato gli ultimi loro lavori: è almeno dal 1999 con Metropolis Pt. 2: Scenes From A Memory (concept album di una bellezza incredibile, secondo me uno dei migliori concept album mai registrati) che un loro album non mi convinceva. Troppo “duri” e lontani dal progressive metal che tanto mi era piaciuto nel loro primo periodo.

Accingendomi ad ascoltare A Dramatic Turn Of Events mi aspettavo, purtroppo, di ritrovarmi con un album simile a quelli precedenti ed invece ho avuto una inaspettata sorpresa: finalmente torna il progressive.

L’album passa il mio personale esame con un buon voto. Devo ancora ascoltarlo un po’ per potermi fare una idea precisa e “definitiva”, ma diciamo che un eventuale voto non potrebbe essere inferiore al 7.

In conclusione: bentornati Dream Theater!