Un peu de code, ça fait longtemps non ?

Bon, j'ai pas souvent pris du temps "perso" pour parler "boulot" depuis quelques ... temps mais là l'épilogue me fais marrer alors je partage ... là je viens de passer du temps sur une bêtise qui m'a donné envie d'aller vraiment voir profond dans le code et son implémentation : comment transformer un fichier son mono en stéréo ...

Il y a bien une solution proposée ici http://stackoverflow.com/questions/6292905/mono-to-stereo-conversion

void interleave(const uint16_t * in_L,     // mono input buffer (left channel)
                const uint16_t * in_R,     // mono input buffer (right channel)
                uint16_t * out,            // stereo output buffer
                const size_t num_samples)  // number of samples
{
    for (size_t i = 0; i < num_samples; ++i)
    {
        out[i * 2] = in_L[i];
        out[i * 2 + 1] = in_R[i];
    }
}

mais voilà le genre de fichier que ça produit

00000000  52 49 46 46 24 40 04 00  57 41 56 45 66 6d 74 20  |RIFF$@..WAVEfmt |
00000010  10 00 00 00 01 00 02 00  44 ac 00 00 10 b1 02 00  |........D.......|
00000020  04 00 10 00 64 61 74 61  00 40 04 00 f4 f4 ff ff  |....data.@......|
00000030  e8 e8 ff ff f9 f9 00 00  0a 0a 01 01 5a 5a 00 00  |............ZZ..|
00000040  b7 b7 ff ff 02 02 01 01  c7 c7 01 01 c3 c3 01 01  |................|
00000050  ab ab 01 01 7f 7f 01 01  54 54 01 01 be be 00 00  |........TT......|
00000060  c1 c1 00 00 7c 7c 00 00  bf bf 00 00 81 81 00 00  |....||..........|
00000070  4c 4c 01 01 71 71 01 01  80 80 ff ff 8c 8c 00 00  |LL..qq..........|
00000080  ab ab 00 00 86 86 00 00  ba ba 00 00 29 29 00 00  |............))..|
00000090  ab ab 00 00 21 21 00 00  02 02 01 01 c4 c4 00 00  |....!!..........|
000000a0  c3 c3 ff ff 7d 7d 00 00  98 98 ff ff b0 b0 ff ff  |....}}..........|

alors qu'un fichier correct devrait ressembler à ceci, regardez bien, l'entête du fichier wav est correcte, c'est ensuite l'entrelacement du signal qui déconne, regardez dans la marge de droite c'est plus simple à lire, Z.Z. dans un cas (correct) et ZZ dans le cas où ça ne marche pas ... on entrelace avec une mauvaise "fréquence" ou un truc du genre ...

00000000  52 49 46 46 24 40 04 00  57 41 56 45 66 6d 74 20  |RIFF$@..WAVEfmt |
00000010  10 00 00 00 01 00 02 00  44 ac 00 00 10 b1 02 00  |........D.......|
00000020  04 00 10 00 64 61 74 61  00 40 04 00 f4 ff f4 ff  |....data.@......|
00000030  e8 ff e8 ff f9 00 f9 00  0a 01 0a 01 5a 00 5a 00  |............Z.Z.|
00000040  b7 ff b7 ff 02 01 02 01  c7 01 c7 01 c3 01 c3 01  |................|
00000050  ab 01 ab 01 7f 01 7f 01  54 01 54 01 be 00 be 00  |........T.T.....|
00000060  c1 00 c1 00 7c 00 7c 00  bf 00 bf 00 81 00 81 00  |....|.|.........|
00000070  4c 01 4c 01 71 01 71 01  80 ff 80 ff 8c 00 8c 00  |L.L.q.q.........|
00000080  ab 00 ab 00 86 00 86 00  ba 00 ba 00 29 00 29 00  |............).).|
00000090  ab 00 ab 00 21 00 21 00  02 01 02 01 c4 00 c4 00  |....!.!.........|
000000a0  c3 ff c3 ff 7d 00 7d 00  98 ff 98 ff b0 ff b0 ff  |....}.}.........|

Et finalement dans le code source de la super lib qaudiocoder je lis la solution, évidente, claire, limpide, "mais c'est bien sûr" ...

	for(int i = 0, j = 0; i < samples; ++i, j += 2)
	{
		outputData[j] = inputData[i];
		outputData[j + 1] = inputData[i];
	}

Oui je ne vous cache pas que j'ai mis du temps avant d'aller voir le hexdump ... et une fois le hexdump entre les doigts j'ai bien compris que le code proposé sur stackoverflow n'était soit pas bon ... soit que je passais à côté d'un truc.

Et tout ça pourquoi ? pour raconte-moi forcément ... et à cause du multi-plate-forme qui fait que sur certains systèmes on récupère du mono et sur d'autre du stéréo ... et au moment de tout coller bout à bout ça déconne ... il faut donc tout mettre en stéréo avant d'aller plus loin !

QR code
Send to friend

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.