From 3e7d71c6d2d0e65cc220e1c80f6daa8545896595 Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Sat, 28 Dec 2013 20:31:48 +0100 Subject: [PATCH] It works, we get a spectogram on the ipad :) (still with fixed size and such) --- SpectogramPrototype.xcodeproj/project.pbxproj | 10 ++ SpectogramPrototype/AudioFile.h | 21 +++ SpectogramPrototype/AudioFile.m | 93 ++++++++++++ .../Base.lproj/Main_iPad.storyboard | 11 -- SpectogramPrototype/FFTTest.m | 23 +-- SpectogramPrototype/RuledScrollView.m | 5 +- SpectogramPrototype/ViewController.h | 1 - SpectogramPrototype/ViewController.m | 139 +++++++++++++----- testMusic.mp3 | Bin 0 -> 2547266 bytes 9 files changed, 236 insertions(+), 67 deletions(-) create mode 100644 SpectogramPrototype/AudioFile.h create mode 100644 SpectogramPrototype/AudioFile.m create mode 100644 testMusic.mp3 diff --git a/SpectogramPrototype.xcodeproj/project.pbxproj b/SpectogramPrototype.xcodeproj/project.pbxproj index 6b85503..3abb045 100644 --- a/SpectogramPrototype.xcodeproj/project.pbxproj +++ b/SpectogramPrototype.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ 426665BC1869EF4B005D62AC /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 426665BB1869EF4B005D62AC /* CoreAudio.framework */; }; 426665C11869F194005D62AC /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 426665C01869F194005D62AC /* AudioToolbox.framework */; }; 426665C51869F50B005D62AC /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 426665C41869F50B005D62AC /* MediaPlayer.framework */; }; + 42E12A91186F122400866CB3 /* testMusic.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 42E12A90186F122400866CB3 /* testMusic.mp3 */; }; + 42E12A94186F1F4C00866CB3 /* AudioFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E12A93186F1F4C00866CB3 /* AudioFile.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -71,6 +73,9 @@ 426665BB1869EF4B005D62AC /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 426665C01869F194005D62AC /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 426665C41869F50B005D62AC /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 42E12A90186F122400866CB3 /* testMusic.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = testMusic.mp3; sourceTree = ""; }; + 42E12A92186F1F4C00866CB3 /* AudioFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioFile.h; sourceTree = ""; }; + 42E12A93186F1F4C00866CB3 /* AudioFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioFile.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,6 +109,7 @@ 424F849C18661F8000687D3B = { isa = PBXGroup; children = ( + 42E12A90186F122400866CB3 /* testMusic.mp3 */, 424F84AE18661F8000687D3B /* SpectogramPrototype */, 424F84D018661F8000687D3B /* SpectogramPrototypeTests */, 424F84A718661F8000687D3B /* Frameworks */, @@ -144,6 +150,8 @@ 424F84BD18661F8000687D3B /* Main_iPad.storyboard */, 424F84C018661F8000687D3B /* ViewController.h */, 424F84C118661F8000687D3B /* ViewController.m */, + 42E12A92186F1F4C00866CB3 /* AudioFile.h */, + 42E12A93186F1F4C00866CB3 /* AudioFile.m */, 426665B31869A7CC005D62AC /* RuledScrollView.h */, 426665B41869A7CC005D62AC /* RuledScrollView.m */, 426665B61869CEFE005D62AC /* FFTTest.h */, @@ -263,6 +271,7 @@ 424F84BF18661F8000687D3B /* Main_iPad.storyboard in Resources */, 424F84C418661F8000687D3B /* Images.xcassets in Resources */, 424F84BC18661F8000687D3B /* Main_iPhone.storyboard in Resources */, + 42E12A91186F122400866CB3 /* testMusic.mp3 in Resources */, 4261F08818671ECD00AA0EF9 /* ContentView.xib in Resources */, 424F84B318661F8000687D3B /* InfoPlist.strings in Resources */, ); @@ -283,6 +292,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 42E12A94186F1F4C00866CB3 /* AudioFile.m in Sources */, 426665B81869CEFE005D62AC /* FFTTest.m in Sources */, 424F84C218661F8000687D3B /* ViewController.m in Sources */, 424F84B918661F8000687D3B /* AppDelegate.m in Sources */, diff --git a/SpectogramPrototype/AudioFile.h b/SpectogramPrototype/AudioFile.h new file mode 100644 index 0000000..b61223c --- /dev/null +++ b/SpectogramPrototype/AudioFile.h @@ -0,0 +1,21 @@ +// +// AudioFile.h +// SpectogramPrototype +// +// Created by Joshua Moerman on 28/12/13. +// Copyright (c) 2013 Joshua Moerman. All rights reserved. +// + +#import + +// Uses the ExtAudioFileRef from the AudioToolkit +// Handles conversion to PCM and such +@interface AudioFile : NSObject + +// Loads a file (and sets the right internal format) ++ (AudioFile*) audioFileFromURL:(NSURL*) url; + +// Reads nSamples of data (left channel), return actual number of samples read +- (unsigned int) fillArray:(float*)array withNumberOfSamples:(unsigned int)nSamples; + +@end diff --git a/SpectogramPrototype/AudioFile.m b/SpectogramPrototype/AudioFile.m new file mode 100644 index 0000000..e764897 --- /dev/null +++ b/SpectogramPrototype/AudioFile.m @@ -0,0 +1,93 @@ +// +// AudioFile.m +// SpectogramPrototype +// +// Created by Joshua Moerman on 28/12/13. +// Copyright (c) 2013 Joshua Moerman. All rights reserved. +// + +#import "AudioFile.h" +#import + +@interface AudioFile (){ + ExtAudioFileRef audioFile; + AudioStreamBasicDescription format; +} +- (id)initWithExtAudioFileRef:(ExtAudioFileRef) audioFile; +- (void)setupFormat; +@end + +@implementation AudioFile + +#pragma mark +#pragma mark Creation + +- (id)initWithExtAudioFileRef:(ExtAudioFileRef) af{ + if(self = [super init]){ + audioFile = af; + [self setupFormat]; + } + return self; +} + +- (void)setupFormat{ + format.mSampleRate = 44100.0f; + format.mFormatID = kAudioFormatLinearPCM; + format.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger; + format.mBytesPerPacket = 4; + format.mFramesPerPacket = 1; + format.mBytesPerFrame = 4; + format.mChannelsPerFrame = 2; + format.mBitsPerChannel = 16; + format.mReserved = 0; + + UInt32 size = sizeof(format); + OSStatus err = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, size, &format); + assert(err == 0); +} + +- (void)dealloc { + OSStatus err = ExtAudioFileDispose(audioFile); + assert(err == 0); +} + ++ (AudioFile *)audioFileFromURL:(NSURL *)url{ + ExtAudioFileRef audioFile = NULL; + OSStatus err = ExtAudioFileOpenURL((__bridge CFURLRef) url, &audioFile); + assert(err == 0 && audioFile); + + return [[AudioFile alloc] initWithExtAudioFileRef:audioFile]; +} + +#pragma mark +#pragma mark Usage + +- (unsigned int)fillArray:(float *)array withNumberOfSamples:(unsigned int)nSamples{ + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = 2; + bufferList.mBuffers[0].mDataByteSize = nSamples * format.mBytesPerFrame; + bufferList.mBuffers[0].mData = calloc(bufferList.mBuffers[0].mDataByteSize, 1); + + UInt32 nFrames = nSamples; + OSStatus err = ExtAudioFileRead(audioFile, &nFrames, &bufferList); + assert(err == 0); + + short * buffer = bufferList.mBuffers[0].mData; + float * end = array + nSamples; + for(unsigned int i = 0; i < nFrames; ++i){ + *array++ = *buffer++ / 32768.0; + // skip right channel + buffer++; + } + + while(array != end){ + *array++ = 0.0; + } + + free(bufferList.mBuffers[0].mData); + + return nFrames; +} + +@end diff --git a/SpectogramPrototype/Base.lproj/Main_iPad.storyboard b/SpectogramPrototype/Base.lproj/Main_iPad.storyboard index efd12b3..8bb000f 100644 --- a/SpectogramPrototype/Base.lproj/Main_iPad.storyboard +++ b/SpectogramPrototype/Base.lproj/Main_iPad.storyboard @@ -21,17 +21,6 @@ -