Issues when using OggVorbisAudioFormat


#1

Hello Jules

When I copy samples from ogg writer to an ogg reader, the samples are slowly starting to add gain and quite fast (after like 5 times) the gain is growing exponentially.

When I change that format to Aiff (both writer and reader) everything works fine.

I saw that in AudioFormatWriter::writeFromAudioReader() the reader’s usesFloatingPointData is true while the writer’s is false, (both for Ogg) it that OK?

Thank you


#2

Sorry, not sure I understand? What’s increasing?

writeFromAudioReader is pretty robust, I don’t think that’ll be at fault.


#3

This is a small example:

	for(int i = 0 ; i < 30 ; i++)
	{
		reader_->readMaxLevels(0,reader_->lengthInSamples,lowestLeft,heightLeft,lowestRight,heightRight);
		Logger::info("max left level = "+String(heightLeft));
                memoryBlock_ = MemoryBlock();
		MemoryOutputStream* mos_ = new MemoryOutputStream(memoryBlock_, false);
		ScopedPointer<AudioFormatWriter> writer_(oggAudioFormat.createWriterFor(mos_, reader_->sampleRate,
			reader_->numChannels, (int) reader_->bitsPerSample,
			metadata, 0));

		writer_->writeFromAudioReader(*reader_, 0, reader_->lengthInSamples);

		writer_ = nullptr;

		MemoryInputStream* mis = new MemoryInputStream(memoryBlock_, true);
		reader_ = formatManager.createReaderFor(mis);
	}

And this is the output:

INFO: max left level = 0.218616098
INFO: max left level = 0.204231709
INFO: max left level = 0.206640586
INFO: max left level = 0.225213498
INFO: max left level = 0.252182543
INFO: max left level = 0.255244434
INFO: max left level = 0.269231647
INFO: max left level = 0.290262252
INFO: max left level = 0.34386158
INFO: max left level = 0.401432842
INFO: max left level = 0.521992564
INFO: max left level = 0.787255526
INFO: max left level = 0.993495464
INFO: max left level = 1.42068315
INFO: max left level = 1.25658786
INFO: max left level = 1.2999177
INFO: max left level = 1.32784843
INFO: max left level = 1.33962893
INFO: max left level = 1.30674279
INFO: max left level = 1.30497968
INFO: max left level = 1.30894351
INFO: max left level = 1.29625916
INFO: max left level = 1.43839705
INFO: max left level = 1.50773096
INFO: max left level = 1.35312033
INFO: max left level = 1.54765451
INFO: max left level = 1.63104928
INFO: max left level = 1.84495401
INFO: max left level = 1.64452207
INFO: max left level = 1.56579041


#4

not sure if its related, but i had some problem with mp3. If you skip through a mp3 file to a certain position, it takes some time until the signal has its full level. I believe is has to do with the frequency related compression, so it needs some samples pre-reading to reconstruct the original signal.


#5

Well of course there’ll be some level creep if you repeatedly bounce it like that, decompressing and re-compressing the data each time!


#6

I don’t understand, how can I go from a writer to a reader without an outputStream, cause AudioFormat::createWriterFor() must use outputStream?

And why does it have to grow that much when using this compression/decompression?


#7

Sorry, your code isn’t easy to understand… It looks like you’re bouncing audio back and forth 30 times. Is that not what it’s supposed to do?

It’s a crazy thing to do - like repeatedly bouncing from tape-to-tape in the old days, the quality and levels will inevitably get screwed up, even if it only changes a tiny bit each time.


#8

Thanks Jules, I will remove the compressing / decompressing.

When I change the format from Ogg to Aiff then the numbers stays exactly the same, is that the format itself or its implementation, how can that be?


#9

aiff is uncompressed, so it’ll just store any numbers that you throw at it. Ogg is a lossy compression format, so the numbers that go in aren’t necessarily going to come out exactly the same. You seem overly confused by this…!


#10

I understand, It just that I thought that it will result in only a small variation in the audio, and although I did 30 iterations, the deviation is huge.