• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Newbie trying to play mp3 files instead wav files
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Newbie trying to play mp3 files instead wav files


  • Subject: Re: Newbie trying to play mp3 files instead wav files
  • From: "Ignacio Enriquez" <email@hidden>
  • Date: Tue, 28 Oct 2008 10:32:55 +0900

Thanks a lot William and Jason,.

Thanks for the advices(-> William)
Thanks for the code( -> Jason)
I only read the comments, but seems quite clear what I have to do.
I think with this code I can do it.

Thanks a lot guys.

Ignacio.

2008/10/28 Murray Jason <email@hidden>:
> Hello Ignacio,
>
> The next version of SpeakHere demonstrates how to record and play back all
> supported compressed formats. To help you now, though, here is a summary of
> the changes that provide that feature. I hope I'm giving you enough context
> here so that you can compare these excerpts with the existing SpeakHere
> code.
>
> One important fact to keep in mind is that, in the Simulator, you can record
> and play only uncompressed (linear PCM) audio.
>
> // This code goes into the initializer for the audio recorder object:
>
> // Specify the recording format. Options are:
> //
> //      kAudioFormatLinearPCM
> //      kAudioFormatAppleLossless
> //      kAudioFormatAppleIMA4
> //      kAudioFormatiLBC
> //      kAudioFormatULaw
> //      kAudioFormatALaw
> //
> [self setupAudioFormat: kAudioFormatLinearPCM];
>
> AudioQueueNewInput (
>        &audioFormat,
>        recordingCallback,
>        self,                   // userData
>        NULL,                   // run loop
>        NULL,                   // run loop mode
>        0,                      // flags
>        &queueObject
> );
>
>
>
> // This is a new method for setting up the audio recording format in the
> recorder class:
>
> - (void) setupAudioFormat: (UInt32) formatID {
>
>        // Obtains the hardware sample rate for use in the recording
>        // audio format. Each time the audio route changes, the sample rate
>        // needs to get updated.
>        UInt32 propertySize = sizeof (self.hardwareSampleRate);
>
>        AudioSessionGetProperty (
>                kAudioSessionProperty_CurrentHardwareSampleRate,
>                &propertySize,
>                &hardwareSampleRate
>        );
>
>        audioFormat.mFormatID                   = formatID;
>        audioFormat.mChannelsPerFrame   = 1;
>
>        if (formatID == kAudioFormatLinearPCM) {
>
>                audioFormat.mFormatFlags                =
> kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
>                audioFormat.mFramesPerPacket    = 1;
>                audioFormat.mBitsPerChannel             = 16;
>                audioFormat.mBytesPerPacket             = 2;
>                audioFormat.mBytesPerFrame              = 2;
>        }
> }
>
>
> // This is a little bug fix for copying the magic cookie to the sound file
> in recorder class:
>
> AudioFileSetProperty (
>        theFile,
>        kAudioFilePropertyMagicCookieData, // <-- this parameter is wrong in
> the original SpeakHere
>        propertySize,
>        magicCookie
> );
>
>
> // In the player class, a replacement for the playback callback:
>
> static void playbackCallback (
>        void                    *inUserData,
>        AudioQueueRef           inAudioQueue,
>        AudioQueueBufferRef     bufferReference
> ) {
>        // This callback, being outside the implementation block, needs a
> reference to the AudioPlayer object
>        AudioPlayer *player = (AudioPlayer *) inUserData;
>        if ([player donePlayingFile]) return;
>
>        UInt32 numBytes;
>        UInt32 numPackets = [player numPacketsToRead];
>
>        // This callback is called when the playback audio queue object has
> an audio queue buffer
>        // available for filling with more data from the file being played
>        AudioFileReadPackets (
>                [player audioFileID],
>                NO,
>                &numBytes,
>                bufferReference->mPacketDescriptions,
>                [player startingPacketNumber],
>                &numPackets,
>                bufferReference->mAudioData
>        );
>
>        if (numPackets > 0) {
>
>                bufferReference->mAudioDataByteSize             = numBytes;
>
>                bufferReference->mPacketDescriptionCount        = numPackets;
>
>                AudioQueueEnqueueBuffer (
>                        inAudioQueue,
>                        bufferReference,
>                        0,
>                        NULL
>                );
>
>                [player incrementStartingPacketNumberBy: (UInt32)
> numPackets];
>
>        } else {
>
>                [player setDonePlayingFile: YES];       // 'donePlayingFile'
> used by this callback and by setupAudioQueueBuffers
>
>                // if playback is stopping because file is finished, call
> AudioQueueStop here;
>                // if user tapped Stop, then the AudioViewController calls
> AudioQueueStop
>                if (player.audioPlayerShouldStopImmediately == NO) {
>                        [player stop];
>                }
>        }
> }
>
> // In the player class, there are changes for setting up audio queue
> buffers:
>
> - (void) setupAudioQueueBuffers {
>
>        // calcluate the size to use for each audio queue buffer, and
> calculate the
>        // number of packets to read into each buffer
>        [self calculateSizesFor: (Float64) kSecondsPerBuffer];
>
>        // prime the queue with some data before starting
>        // allocate and enqueue buffers
>        int bufferIndex;
>        bool isFormatVBR = (audioFormat.mBytesPerPacket == 0 ||
> audioFormat.mFramesPerPacket == 0);
>
>        for (bufferIndex = 0; bufferIndex < kNumberAudioDataBuffers;
> ++bufferIndex) {
>
>                // if you intend to support *only* constant bit-rate formats,
> you can instead
>                //      use AudioQueueAllocateBuffers. In this case, the
> playback callback function
>                //      needs to change; you need to change the arguments to
> the
>                //      AudioQueueEnqueueBuffer function. See its reference
> documentation.
>                AudioQueueAllocateBufferWithPacketDescriptions (
>                        [self queueObject],
>                        [self bufferByteSize],
>                        (isFormatVBR ? self.numPacketsToRead : 0),
>                        &buffers[bufferIndex]
>                );
>
>                playbackCallback (
>                        self,
>                        [self queueObject],
>                        buffers[bufferIndex]
>                );
>
>                if ([self donePlayingFile]) break;
>        }
> }
>
>
> -murray
>
>
> On Oct 27, 2008, at 12:33 PM, William Stewart wrote:
>
>>
>> On Oct 27, 2008, at 8:24 AM, Ignacio Enriquez wrote:
>>
>>> Thanks William.
>>> It's been 3days, and I have been comparing the differences between
>>> SpeakHere's AudioPlayer Class and AQPlay(from
>>> /Developer/Examples/CoreAudio)
>>> And have some comments and questions.
>>>
>>> The main difference is the use of CAStreamBasicDescription instead of
>>> AudioStreamBasicDescription in AQPlay.
>>> CAStreamBasicDescription is not a Predefined Class. And Is to big for
>>> me to understand it at this moment.
>>>
>>> So my question is
>>> Is Possible to manage mp3 files with AudioStreamBasicDescription
>>> structures?
>>
>> CAStreamBasicDescription is a C++ wrapper class around the
>> AudioStreamBasicDescription. For any CA api, you can use either
>> interchangeably. the advantage of using CAStream is that it does alot for
>> you (including a nice print option)
>>
>>>
>>> if YES, how can I do it? (sorry to ask this, but I really need a hand
>>> please)
>>> If NO, adding CAStreamBasicDescription to my iPhone program will be a
>>> good idea? (I mean using CAStreamBasicDescription in my iPhone program
>>> project)
>>
>> In the AQ code:
>>
>> (1) The main difference is that SpeakHere does NOT play any file that has
>> variable bit rate (VBR) data, such as aac or mp3. The main problem is that
>> it doesn't deal with packet descriptions.
>>
>> (2) AQPlay does all of this
>>
>> Other than knowing that difference, I am not that familiar with that code,
>> so am not sure what changes you would need to make to SpeakHere to make this
>> work for you - Murray (cc'd) should be able to help you
>>
>> Bill
>>
>>>
>>>
>>> I actually want to be able to play, resume, stop, rewind and
>>> fastforward some music. (which I am doing but only for WAV files.)
>>> In my program I have like 20  5minutes long songs so, is indispensable
>>> to be able to play compressed files as mp3, as you can understand.
>>>
>>> Thanks in advance.
>>> Ignacio.
>>>
>>> 2008/10/25 William Stewart <email@hidden>:
>>>>
>>>> The current Speak Hear code doesn't play compressed data.
>>>>
>>>> AQ Play (/Developer/Examples/CoreAudio) has code that deals correctly
>>>> with
>>>> this, so in the meantime you can use this as a guideline
>>>>
>>>> On Oct 24, 2008, at 1:51 AM, Ignacio Enriquez wrote:
>>>>
>>>>> Hi everyone.
>>>>>
>>>>> I am very new to CoreAudio API, and trying to make my program play
>>>>> *.mp3 files instead *.wav files.
>>>>> As you know a *.wav file is like 10 times bigger than a mp3, so that's
>>>>> my principal reason.
>>>>>
>>>>> I am basically using iPhone's sample code. SpeakHere Classes.
>>>>>
>>>>> At first I thought it would be enough to change the 3rd parameter of
>>>>> AudioFileOpenURL function  from "kAudioFileCAFType" to
>>>>> "kAudioFileMP3Type", but it seems that this is just for opening the
>>>>> file. So the mp3 file is not being played.
>>>>>
>>>>> I wonder what other changes do I need to do in order to accomplish
>>>>> mp3 files being played?
>>>>>
>>>>> Thanks in Advance.
>>>>> Ignacio.
>>>>> _______________________________________________
>>>>> Do not post admin requests to the list. They will be ignored.
>>>>> Coreaudio-api mailing list      (email@hidden)
>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>
>>>>> This email sent to email@hidden
>>>>
>>>>
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Coreaudio-api mailing list      (email@hidden)
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>> This email sent to email@hidden
>>
>
>



--
_____________________________________________
Guillermo Ignacio Enriquez Gutierrez
Shibaura Institute Of Technology
Faculty of Engineering
Department of Information Science & Engineering
Senior Student
_____________________________________________
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

References: 
 >Newbie trying to play mp3 files instead wav files (From: "Ignacio Enriquez" <email@hidden>)
 >Re: Newbie trying to play mp3 files instead wav files (From: William Stewart <email@hidden>)
 >Re: Newbie trying to play mp3 files instead wav files (From: "Ignacio Enriquez" <email@hidden>)
 >Re: Newbie trying to play mp3 files instead wav files (From: William Stewart <email@hidden>)
 >Re: Newbie trying to play mp3 files instead wav files (From: Murray Jason <email@hidden>)

  • Prev by Date: Re: Newbie trying to play mp3 files instead wav files
  • Next by Date: Re: Status of code CoreAudio SDK
  • Previous by thread: Re: Newbie trying to play mp3 files instead wav files
  • Next by thread: Rép : Problems implementing kAudioDevicePropertyIOProcStreamUsage property in a user-land CoreAudio device (2)
  • Index(es):
    • Date
    • Thread