570{
571#ifdef PEBL_MIXER
572 std::cerr << "=== ENTERING SaveBufferToWave ===\n";
573 std::cerr << "mRecordPos at function entry: " << mRecordPos << "\n";
574 std::cerr << "mMixerSample pointer: " << (void*)mMixerSample << "\n";
575
576
577 if(!mMixerSample) {
579 return;
580 }
581
582 std::cerr << "mMixerSample->alen: " << mMixerSample->alen << "\n";
583 std::cerr << "mMixerSample->abuf: " << (void*)mMixerSample->abuf << "\n";
584
585
586
587
588 int freq = mOriginalSpec.freq;
589 Uint16 format = mOriginalSpec.format;
590 int channels = mOriginalSpec.channels;
591
592 std::cerr << "Using original recording spec: " << freq << "Hz, " << channels << " channels, format=" << format << "\n";
593
594
595 int bitsPerSample = 16;
596 switch(format) {
597 case AUDIO_U8:
598 case AUDIO_S8:
599 bitsPerSample = 8;
600 break;
601 case AUDIO_U16LSB:
602 case AUDIO_S16LSB:
603 case AUDIO_U16MSB:
604 case AUDIO_S16MSB:
605 bitsPerSample = 16;
606 break;
607 }
608
609 int bytesPerSample = bitsPerSample / 8;
610 int subchunk1size = 16;
611 int numChannels = channels;
612 int subchunk2size = mRecordPos;
613 int chunksize = 36 + subchunk2size;
614 int audioFormat = 1;
615 int sampleRate = freq;
616 int byteRate = freq * numChannels * bitsPerSample / 8;
617 int blockAlign = numChannels * bitsPerSample / 8;
618
619 cerr << "--------------------------------------------\n";
620 cerr << "saving file [" << filename << "]\n";
621 cerr << "bitspersample: " << bitsPerSample << endl;
622 cerr << "Channels: " << numChannels << endl;
623 cerr << "frequency: " << sampleRate << endl;
624 cerr << "byterate: " << byteRate << endl;
625 cerr << "buffer size: " << mMixerSample->alen << " bytes" << endl;
626 cerr << "recorded size: " << mRecordPos << " bytes" << endl;
627
628 std::fstream myFile(filename.GetString().c_str(), ios::out | ios::binary);
629 if(!myFile.is_open()) {
631 return;
632 }
633
634
635 myFile.seekp(0, ios::beg);
636 myFile.write("RIFF", 4);
637 myFile.write((char*)&chunksize, 4);
638 myFile.write("WAVE", 4);
639 myFile.write("fmt ", 4);
640 myFile.write((char*)&subchunk1size, 4);
641 myFile.write((char*)&audioFormat, 2);
642 myFile.write((char*)&numChannels, 2);
643 myFile.write((char*)&sampleRate, 4);
644 myFile.write((char*)&byteRate, 4);
645 myFile.write((char*)&blockAlign, 2);
646 myFile.write((char*)&bitsPerSample, 2);
647 myFile.write("data", 4);
648
649 std::cerr << "About to write data chunk header. subchunk2size = " << subchunk2size << "\n";
650 std::cerr << "About to write audio data. mRecordPos = " << mRecordPos << "\n";
651
652 myFile.write((char*)&subchunk2size, 4);
653
654 std::cerr << "File position before audio data write: " << myFile.tellp() << "\n";
655 std::cerr << "About to write " << mRecordPos << " bytes from buffer at " << (void*)(mMixerSample->abuf) << "\n";
656
657
658 if(mMixerSample->abuf ==
NULL) {
659 std::cerr << "ERROR: Buffer is NULL!\n";
660 } else {
661 std::cerr << "Buffer appears valid, first byte value: " << (int)(mMixerSample->abuf[0]) << "\n";
662 }
663
664 myFile.write((char*)(mMixerSample->abuf), mRecordPos);
665
666 std::cerr << "File position after audio data write: " << myFile.tellp() << "\n";
667 if(myFile.fail()) {
668 std::cerr << "FILE WRITE FAILED! Error state detected.\n";
669 std::cerr << "errno: " << errno << " (" << strerror(errno) << ")\n";
670 }
671 std::cerr << "File good state: " << myFile.good() << "\n";
672 std::cerr << "File fail state: " << myFile.fail() << "\n";
673 std::cerr << "File bad state: " << myFile.bad() << "\n";
674
675 myFile.close();
676 cerr << "File saved successfully.\n";
677 cerr << "--------------------------------------------\n";
678
679#else
680
681
682
684
685
686 int subchunk1size = 16;
687 int numChannels = mWave.
spec.channels;
688
690 int chunksize = 36+subchunk2size;
691
692
693 int audioFormat = 1;
694
695 int sampleRate = mWave
697 int byteRate = mWave.
spec.freq*numChannels*bitsPerSample/8;
698 int blockAlign = numChannels*bitsPerSample/8;
699
700
701 cerr <<"--------------------------------------------\n";
702 cerr << "saving file ["<< filename<<"]\n";
703 cerr << "bitspersample: " << bitsPerSample <<endl;
704 cerr << "Channels: " << numChannels <<endl;
705 cerr << "frequency: " << sampleRate << endl;
706 cerr << "byterate: " << byteRate << endl;
707
708
709 std::fstream myFile (filename.GetString().c_str(), ios::out | ios::binary);
710
711
712 myFile.seekp (0, ios::beg);
713 myFile.write ("RIFF", 4);
714 myFile.write ((char*) &chunksize, 4);
715 myFile.write ("WAVE", 4);
716 myFile.write ("fmt ", 4);
717 myFile.write ((char*) &subchunk1size, 4);
718 myFile.write ((char*) &audioFormat, 2);
719 myFile.write ((char*) &numChannels, 2);
720 myFile.write ((char*) &sampleRate, 4);
721 myFile.write ((char*) &byteRate, 4);
722 myFile.write ((char*) &blockAlign, 2);
723 myFile.write ((char*) &bitsPerSample, 2);
724
725 myFile.write ("data", 4);
726 myFile.write ((char*) &subchunk2size, 4);
727
729
730#endif
731}