Implementieren von DoProcessOutput
Zum Verarbeiten von Audiodaten müssen Sie mehrere Schritte in DoProcessOutput ausführen. In den folgenden Schritten wird der Beispielcode des Plug-In-Assistenten als Beispiele verwendet. Wenn Sie ein Audio-DSP-Plug-In erstellen möchten, das Medieninhalte desselben Typs verarbeitet wie der Beispielcode des Plug-In-Assistenten, müssen Sie nur den tatsächlichen Verarbeitungscode ändern, auf den in Schritt 6 verwiesen wird. Im Folgenden finden Sie alle Schritte, die in DoProcessOutput implementiert sind:
Wenn das Plug-In derzeit nicht aktiviert ist, kopieren Sie die Daten einfach unverändert in den Ausgabepuffer. Wenn Ihr Plug-In die Daten in ein anderes Format konvertiert, müssen Sie auch die Konvertierungsverarbeitung hier tun.
// Test whether the plug-in is disabled by the user. if (!m_bEnabled) { // Just copy the data without changing it. memcpy(pbOutputData, m_pbInputData, *cbBytesProcessed); return S_OK; }- Ruft einen Zeiger auf die Eingabeformatstruktur ab. Sie müssen Memberdaten aus dieser Struktur abrufen. Kopieren Sie daher den Zeiger aus m _ mtInput.pbformat zu einer lokalen Zeigervariablen eines Typs, der dem Formatstrukturtyp entspricht. Im folgenden Beispiel wird ein Zeiger auf eine WAVEFORMATEX-Eingabeformatstruktur gespeichert:
WAVEFORMATEX *pWave = (WAVEFORMATEX*) m_mtInput.pbFormat;- Berechnen Sie die Anzahl der zu verarbeitenden Stichproben. Der Beispielcode, den der Plug-In-Assistent generiert, führt diesen Schritt aus, indem die Anzahl der zu verarbeitenden Bytes durch das nBlockAlign-Member der WAVEFORMATEX-Eingabeformatstruktur dividiert und dann das Ergebnis mit der Anzahl der Kanäle multipliziert wird, die im nChannels-Member gespeichert wurden. Das folgende Beispiel ist aus dem Beispielcode des Plug-In-Assistenten:
DWORD dwSamplesToProcess = (cbBytesProcessed / pWave->nBlockAlign) * pWave->nChannels;- Bestimmen Sie die Bittiefe des Audios. Der Beispielcode des Plug-In-Assistenten bestimmt 8- oder 16-Bit-Audiodaten, indem der wBitsPerSample-Member der WAVEFORMATEX-Struktur untersucht wird. Anschließend wird dieser Wert in einer switch-Anweisung verwendet, um separate Verarbeitungsroutinen für jede Bittiefe zur Verfügung zu stellen. Möglicherweise müssen Sie eine andere Technik verwenden, wenn Sie mit anderen Formattypen und Bittiefen zu tun haben.
- Erstellen Sie eine Schleife, um die Audiobeispiele im Eingabepuffer schrittweise zu durchlaufen.
- Rufen Sie ein Beispiel aus dem Eingabepuffer ab. Hierzu deferieren Sie den Eingabedatenzeiger und speichern das Ergebnis in einer Variablen vom Typ int. Für 16-Bit-Audio müssen Sie den BYTE-Zeiger auf einen kurzen Zeiger umcasten, um die höhere Genauigkeit der Audiostichproben zu verarbeiten. Sobald Sie über den Wert verfügen, können Sie den pbInputData-Zeiger sofort erhöhen, sodass er auf das nächste Beispiel zeigt. Die folgenden Beispiele veranschaulichen dies:
// For 8-bit audio. int i = *pbInputData++;Oder
// For 16-bit audio. // Recast the pointer. short *pwInputData = (short *) pbInputData; // Enter the loop and then get the input sample. int i = *pwInputData++;- Führen Sie die Verarbeitung aus. Hier wenden Sie die Algorithmen an, die das Beispiel in irgendeiner Weise ändern. Was Sie hier tun, liegt bei Ihnen.
- Schreiben Sie die verarbeiteten Daten in den Ausgabepuffer. Erhöhen Sie den Zeiger sofort auf den Ausgabepuffer, wie im folgenden Beispiel:
*pwOutputData++ = i;- Wiederholen Sie die Schleife, bis alle Beispiele verarbeitet wurden.
- Gibt ein entsprechendes HRESULT zurück.