Ich habe eine Frage dazu, was Ich denke, kocht auf C-Syntax und Speicher Überlegungen. Ich habe einen Callback in einer Objective-C-Klasse, die Audio verarbeitet, und eines der Argumente lautet bufferListInOut
. Es stellt ein Mono-Audiosignal dar, das ich in Stereo konvertieren möchte. Hier ist mein Code:Erweiterung eines Arrays innerhalb einer Struktur in C
static void tap_ProcessCallback(MTAudioProcessingTapRef tap,
CMItemCount numberFrames,
MTAudioProcessingTapFlags flags,
AudioBufferList *bufferListInOut,
CMItemCount *numberFramesOut,
MTAudioProcessingTapFlags *flagsOut){
// Retrieve mono audio data into bufferListInOut
MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, NULL, NULL, NULL);
// Copy the mono channel's data
float *channelLeft = malloc(numberFrames * sizeof(float));
channelLeft = bufferListInOut->mBuffers[0].mData;
// Attempt to create a second channel which is (currently) a copy of the first
bufferListInOut->mNumberBuffers = 2; // 2 for stereo, 1 for mono
bufferListInOut->mBuffers[1].mNumberChannels = 1;
bufferListInOut->mBuffers[1].mDataByteSize = numberFrames * sizeof(Float32);
bufferListInOut->mBuffers[1].mData = channelLeft;
// Set number of frames out
*numberFramesOut = numberFrames;
}
Einige Anmerkungen:
- In diesem Code der neue Kanal ist nur eine Kopie des Originals, aber in der Praxis wird es einige Verarbeitung unterzogen werden.
- Die Namensgebung ist ein wenig seltsam, aber
mNumberBuffers
ist in der Tat sein soll 2 undmNumberChannels
gemeint 1.
Dieser stürzt mit einem EXC_BAD_ACCESS
Fehler werden auf einem Rendering der Linie Faden nach unten. Also, meine Frage ist, was ist der richtige Weg, um einen neuen Puffer zu dieser Struktur hinzuzufügen? Ich beschäftige mich nicht allzu oft mit C, daher bin ich mir sicher, dass ich hier einige Grundlagen vermisse. Alle Hinweise dazu wären großartig. Danke fürs Lesen.
Was ist Ihre Frage? Es gibt keinen einzigen in diesem Post. – Sanuuu
Das ist eine komplexe Sache, aber Sie vergeben Speicher und ordnen ihn "channelLeft" zu und weisen dann sofort "channelLeft" neu zu, was zu einem Speicherverlust führt. Ich denke du willst 'memcpy (channelLeft, bufferListInOut-> mBuffers [0] .mData, numberFrames * sizeof (float));'. – trojanfoe
@Sanuuu Danke für den Kommentar. Ich habe gerade die Frage geklärt. – Rogare