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 !