निम्नलिखित डबल-बफरिंग योजना ऐसा लगता है कि इसे मेरे लिए काम करना चाहिए, लेकिन किसी कारण से हर बार एक श्रव्य क्लिक होता है जब फॉर-लूप शीर्ष पर फिर से शुरू होता है।

यहां एक परीक्षण wav फ़ाइल है जिसका आप उपयोग कर सकते हैं: https://github.com/ JoshuaD84/jwaveform/blob/master/test4.wav, लेकिन बग किसी एक परीक्षण फ़ाइल के लिए विशिष्ट नहीं है।

#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <fstream>
#include <bitset>
#pragma comment(lib, "winmm.lib")

HWAVEOUT hWaveOut = 0;
WAVEFORMATEX wfx;

int main() {
  wfx = { WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0 };
  waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL);
  
  const int increment = 80000;
  WAVEHDR* oldHeader = nullptr;
  for (int k = 0; k < 50; k++) {
    std::ifstream inStream;
    inStream.open("test4.wav", std::ios::in | std::ios::binary);
    char headerInfo[44]; //get past the wav header to the audio data
    inStream.read(headerInfo, 44);
    while (true) {
      char* buffer = new char[increment];
      inStream.read(buffer, increment);
      DWORD bytesRead = inStream.gcount();
      if (bytesRead <= 0) {
        break;
      } 
      WAVEHDR* header = new WAVEHDR{ buffer, bytesRead, 0, 0, 0, 0, 0, 0 };
      waveOutPrepareHeader(hWaveOut, header, sizeof(WAVEHDR));
      waveOutWrite(hWaveOut, header, sizeof(WAVEHDR));
      if (oldHeader != nullptr) {
        while (!(oldHeader->dwFlags & WHDR_DONE)) {
          Sleep(1);
        }
        waveOutUnprepareHeader(hWaveOut, oldHeader, sizeof(oldHeader));
        delete[] oldHeader->lpData;
        delete oldHeader;
      }
      oldHeader = header;
    }
  }
}

मुझे यकीन है कि यह कुछ बेवकूफी है, लेकिन मैं इसके साथ दो रातों से छेड़छाड़ कर रहा हूं और मुझे नहीं पता कि मैं कहां गलती कर रहा हूं।

(आपकी सुविधा के लिए: मैं इसे 64-बिट वीएस डेवलपर कमांड प्रॉम्प्ट पर cl /EHsc test.cpp कमांड के साथ एकल फ़ाइल के रूप में संकलित करने में सक्षम हूं)।

टिप्पणियाँ:

  1. मैंने फ़ाइल की जाँच की है और यह दोनों 0 पर शुरू और समाप्त होती है, इसलिए क्लिप ऑडियो के आकार के कारण नहीं है।

  2. अगर मैं फ़ाइल के अंतिम बफर के अंत से ~ 100 बाइट ट्रिम करता हूं, तो मुझे क्लिप नहीं मिलती है।

  3. अगर मैं हेडर subChunkSize फ़ील्ड पढ़ता हूं, फ़ाइल की परवाह किए बिना, यह रिपोर्ट करता है कि डेटा फ़ील्ड 312 बाइट्स से बड़ा है जो मैं पढ़ने में सक्षम हूं।

0
JoshuaD 12 सितंबर 2020, 08:15

1 उत्तर

सबसे बढ़िया उत्तर

समस्या डबल बफरिंग योजना नहीं है; वह ठीक है।

समस्या यह है कि आप मान रहे हैं कि बाकी ऑडियो फ़ाइल वैध ऑडियो डेटा है, लेकिन इस फ़ाइल के अंत में ऑडियो डेटा के पीछे जंक डेटा है। जब आप उस जंक डेटा को चलाते हैं, तो यह एक क्लिक की तरह लगता है।

क्लिक से बचने के लिए, Subchunk2Size में निर्दिष्ट केवल उतने ही बाइट्स पढ़ें, जितने wav प्रारूप में निर्दिष्ट हैं। .

0
JoshuaD 14 सितंबर 2020, 04:32