[Live-devel] modifying WAVEAudioFileSource.cpp to take input from an iOS AU buffer
Nick Porcaro
nick at porcaro.org
Sat Mar 24 21:16:30 PDT 2012
Hey folks,
Here's what I have:
- An iPhone app that reads audio input and writes to audio output
- One of these threads runs a DynamicRTSPServer session which runs a WAVAudioFileServerMediaSubsession
- When I run this session with a wav file, WAVAudioFileSource::doReadFromFile() is called, and the
samples are read out of this wav file and I can send it to another app which is acting as a live555 client.
Works great.
- Now, getting back to the iOS audio: A function gets called when the audio output hardware wants samples.
I write these samples to a circular buffer, which can be read from other threads.
- In fact, WAVAudioFileSource::doReadFromFile() is being called right now since I already have the setup
working for a .wav file. All I want to do is write the samples to fTo:
> void WAVAudioFileSource::doReadFromFile() {
> // Try to read as many bytes as will fit in the buffer provided (or "fPreferredFrameSize" if less)
> if (fLimitNumBytesToStream && fNumBytesToStream < fMaxSize) {
> fMaxSize = fNumBytesToStream;
> }
> if (fPreferredFrameSize < fMaxSize) {
> fMaxSize = fPreferredFrameSize;
> }
> unsigned bytesPerSample = (fNumChannels*fBitsPerSample)/8;
> if (bytesPerSample == 0) bytesPerSample = 1; // because we can't read less than a byte at a time
>
> // For 'trick play', read one sample at a time; otherwise (normal case) read samples in bulk:
> unsigned bytesToRead = fScaleFactor == 1 ? fMaxSize - fMaxSize%bytesPerSample : bytesPerSample;
> unsigned numBytesRead;
> while (1) { // loop for 'trick play' only
> if (readFromFilesSynchronously || fFidIsSeekable) {
> numBytesRead = fread(fTo, 1, bytesToRead, fFid);
> } else {
> // For non-seekable files (e.g., pipes), call "read()" rather than "fread()", to ensure that the read doesn't block:
> numBytesRead = read(fileno(fFid), fTo, bytesToRead);
> }
>
>
I think if I change this line to copy samples out of the ring buffer to fTo I would be able to spoof the wav file
reader into using these samples instead of the ones from the file.
> numBytesRead = fread(fTo, 1, bytesToRead, fFid);
Then ultimately, if this works, think I could make a new subclass WaveAudioIOSInputSource to do the job.
Preliminary experiments have been a bit frustrating, and I think it has something to do with the fTo variable.
Any hints on how to proceed on this?
Thanks,
- Nick
More information about the live-devel
mailing list