teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

コードの方を追記したい

2017/02/24 10:51

投稿

Jidousya_364
Jidousya_364

スコア43

title CHANGED
File without changes
body CHANGED
@@ -2,6 +2,119 @@
2
2
 
3
3
  現在私がやっているのはAudioToolboxを使って、マイクからデータを拾うもので波型データを得る方法が調べてもSwift3で使えそうなサンプルが見つかりませんでした。
4
4
 
5
+ ※追記
6
+ 私がやろうとしているのはマイクから取得したデータをリアルタイムにFFTしたいと考えています
5
7
 
8
+
9
+ import UIKit
10
+ import AudioToolbox
11
+
12
+ private func AudioQueueInputCallback(
13
+ _ inUserData: UnsafeMutableRawPointer?,
14
+ inAQ: AudioQueueRef,
15
+ inBuffer: AudioQueueBufferRef,
16
+ inStartTime: UnsafePointer<AudioTimeStamp>,
17
+ inNumberPacketDescriptions: UInt32,
18
+ inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?)
6
- ※追記
19
+ {
20
+ print(inBuffer) //出力されない
21
+ //ここが音声データ? 出力されない
22
+ }
23
+
7
- 私がやろうとしているのはマイクから取得したデータをリアルタイムにFFTしたいと考えています
24
+ class AudioViewController: UIViewController {
25
+
26
+ @IBOutlet weak var loudLabel: UILabel!
27
+
28
+ @IBOutlet weak var peakTextField: UITextField!
29
+ @IBOutlet weak var averageTextField: UITextField!
30
+
31
+ var queue: AudioQueueRef!
32
+ var timer: Timer!
33
+
34
+ override func viewDidLoad() {
35
+ super.viewDidLoad()
36
+ self.startUpdatingVolume()
37
+ }
38
+
39
+ override func viewDidDisappear(_ animated: Bool) {
40
+ super.viewDidDisappear(animated)
41
+ self.stopUpdatingVolume()
42
+ }
43
+
44
+ override func didReceiveMemoryWarning() {
45
+ super.didReceiveMemoryWarning()
46
+ // Dispose of any resources that can be recreated.
47
+ }
48
+
49
+ // MARK: - Internal methods
50
+ func startUpdatingVolume() {
51
+ // Set data format
52
+ var dataFormat = AudioStreamBasicDescription(
53
+ mSampleRate: 44100.0,
54
+ mFormatID: kAudioFormatLinearPCM,
55
+ mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked),
56
+ mBytesPerPacket: 2,
57
+ mFramesPerPacket: 1,
58
+ mBytesPerFrame: 2,
59
+ mChannelsPerFrame: 1,
60
+ mBitsPerChannel: 16,
61
+ mReserved: 0)
62
+
63
+ // Observe input level
64
+ var audioQueue: AudioQueueRef? = nil
65
+ var error = noErr
66
+ error = AudioQueueNewInput(
67
+ &dataFormat,
68
+ AudioQueueInputCallback,//充填完了時に呼ばれる?
69
+ UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
70
+ .none,
71
+ .none,
72
+ 0,
73
+ &audioQueue)
74
+ if error == noErr {
75
+ self.queue = audioQueue
76
+ }
77
+ AudioQueueStart(self.queue, nil)
78
+
79
+ // Enable level meter
80
+ var enabledLevelMeter: UInt32 = 1
81
+ AudioQueueSetProperty(self.queue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, UInt32(MemoryLayout<UInt32>.size))
82
+
83
+ self.timer = Timer.scheduledTimer(timeInterval: 0.5,
84
+ target: self,
85
+ selector: #selector(AudioViewController.detectVolume(_:)),
86
+ userInfo: nil,
87
+ repeats: true)
88
+ self.timer?.fire()
89
+ }
90
+
91
+ func stopUpdatingVolume()
92
+ {
93
+ // Finish observation
94
+ self.timer.invalidate()
95
+ self.timer = nil
96
+ AudioQueueFlush(self.queue)
97
+ AudioQueueStop(self.queue, false)
98
+ AudioQueueDispose(self.queue, true)
99
+ }
100
+
101
+ func detectVolume(_ timer: Timer)
102
+ {
103
+ // Get level
104
+ var levelMeter = AudioQueueLevelMeterState()
105
+ var propertySize = UInt32(MemoryLayout<AudioQueueLevelMeterState>.size)
106
+
107
+ AudioQueueGetProperty(
108
+ self.queue,
109
+ kAudioQueueProperty_CurrentLevelMeterDB,
110
+ &levelMeter,
111
+ &propertySize)
112
+
113
+ // Show the audio channel's peak and average RMS power.
114
+ self.peakTextField.text = "".appendingFormat("%.2f", levelMeter.mPeakPower)
115
+ self.averageTextField.text = "".appendingFormat("%.2f", levelMeter.mAveragePower)
116
+
117
+ // Show "LOUD!!" if mPeakPower is larger than -1.0
118
+ self.loudLabel.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true
119
+ }
120
+ }

1

追記

2017/02/24 10:51

投稿

Jidousya_364
Jidousya_364

スコア43

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,7 @@
1
1
  Swiftでマイクから拾った音を波形データに変換するさせるにはどうすればよいのでしょうか。
2
2
 
3
- 現在私がやっているのはAudioToolboxを使って、マイクからデータを拾うもので波型データを得る方法が調べてもSwift3で使えそうなサンプルが見つかりませんでした。
3
+ 現在私がやっているのはAudioToolboxを使って、マイクからデータを拾うもので波型データを得る方法が調べてもSwift3で使えそうなサンプルが見つかりませんでした。
4
+
5
+
6
+ ※追記
7
+ 私がやろうとしているのはマイクから取得したデータをリアルタイムにFFTしたいと考えています