J'ai le problème suivant ici: je reçois un bloc d'octets (uint16_t *) représentant des données audio et que le périphérique les générant est de capturer mono son, donc évidemment, j'ai des données audio mono, sur 1 canal. J'ai besoin de transmettre ces données sur un autre périphérique, qui attend des données stéréo entrelées (donc, 2 canaux). Ce que je veux faire, c'est essentiellement dupliquer le 1 canal dans les données afin que les deux canaux des données stéréo contiennent les mêmes octets. Pouvez-vous me signaler à un algorithme efficace qui fait cela? P>
merci, f. p>
5 Réponses :
passe aux deux canaux le même pointeur? Si cela viole les règles code> restreindre code>, utilisez Désolé, mais votre question est autrement large. API? OS? Cpuarchitectures? P> memcpy () code>? P>
Cela ne fonctionne pas, je n'envoie pas de données pour chacun des canaux, j'envoie dans un ensemble d'octets et de périphériques NR. 2 les séparait en fonction de ses besoins.
Si vous voulez juste des échantillons stéréo entrelacés, vous pouvez utiliser une fonction comme ceci: pour générer une chaîne stéréo à partir d'un seul tampon mono, vous passeriez simplement le même pointeur pour IN_L et IN_R , par exemple p>
La prochaine fois que vous supprimez une édition, pourriez-vous au moins informer la personne qui a contribué? : - /
Bien sûr, bien que je ne sois pas sûr comment je ferais ça?
J'ai oublié d'ajouter un commentaire après que j'ai ajouté la version en place. Ma faute.
Aucun problème. FYI Je sentais que votre édition, bien qu'elle contenait des informations utiles, n'appartenait pas dans le cadre de cette réponse et aurait peut-être été ajouté comme une réponse distincte. Je vois que vous avez maintenant fait ceci: +1!
Ceci est proche, mais cela ne fonctionne que pour un cas particulier, lorsque la profondeur de cadre n'est qu'un octet. J'ai étendu cette réponse au travail pour toute profondeur de cadre.
Vous allez devoir copier le tampon et le dupliquer. Comme vous ne nous avez pas dit le format, comment il est terminé, je ne peux pas donner de code, mais cela ressemblera à une boucle simple.
int_16* allocateInterleaved(int_16* data, int length) int i; int *copy = malloc(sizeof(int_16)*length*2); if(copy == NULL) { /* handle error */ } for(i =0; i<length; i++) { copy[2*i] = data[i]; copy[2*i+1] = data[i]; } return copy; }
Vous voudrez peut-être faire la conversion en place pour sauver une certaine mémoire. Dépend de la petite quantité de mémoire que l'appareil en question a. Donc, vous voudrez peut-être utiliser quelque chose comme celui-ci au lieu de l'approche de Paul R: Lorsque vous obtenez les données sonores du périphérique mono, vous allouez un tampon deux fois plus grand que nécessaire et transmet que pour le dispositif mono. Cela remplira la moitié du tampon avec mono audio. Vous passez ensuite ce tampon à la fonction ci-dessus, ce qui le convertit en stéréo. Et enfin, vous passez le tampon sur le périphérique stéréo. Vous enregistrez une allocation supplémentaire et utilisez ainsi 33% de mémoire de moins pour la conversion. P> p>
Vous devez interlacer les données, mais si la longueur de l'image est plus importante d'une, aucune des solutions ci-dessus ne fonctionnera. Le code ci-dessous peut prendre en compte les longueurs de cadre variable.
Quel format audio / cadre utilisez-vous?
Les Anders ont également demandé le cadre.
Framework n'est rien de spécial, 1 périphérique envoie des données à un pointeur (void *) et me dit le nombre d'échantillons (via un rappel), et l'autre périphérique prend ce nombre d'échantillons et le même vide * et joue audio (numéro de périphérique deux s'appelle à partir de ce rappel). Le numéro de périphérique 2 s'attend à ce que ces données soient entrelacées stéréo.
Merci à tout le monde pour avoir répondu, problème résolu :)