OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <stdio.h> | |
12 #include <string.h> | |
13 | |
14 #include <math.h> | |
15 | |
16 #include "webrtc/common_types.h" | |
17 #include "webrtc/modules/audio_coding/test/SpatialAudio.h" | |
18 #include "webrtc/system_wrappers/include/trace.h" | |
19 #include "webrtc/system_wrappers/include/trace.h" | |
20 #include "webrtc/test/testsupport/fileutils.h" | |
21 | |
22 namespace webrtc { | |
23 | |
24 #define NUM_PANN_COEFFS 10 | |
25 | |
26 SpatialAudio::SpatialAudio(int testMode) | |
27 : _acmLeft(AudioCodingModule::Create(1)), | |
28 _acmRight(AudioCodingModule::Create(2)), | |
29 _acmReceiver(AudioCodingModule::Create(3)), | |
30 _testMode(testMode) { | |
31 } | |
32 | |
33 SpatialAudio::~SpatialAudio() { | |
34 delete _channel; | |
35 _inFile.Close(); | |
36 _outFile.Close(); | |
37 } | |
38 | |
39 int16_t SpatialAudio::Setup() { | |
40 _channel = new Channel; | |
41 | |
42 // Register callback for the sender side. | |
43 CHECK_ERROR(_acmLeft->RegisterTransportCallback(_channel)); | |
44 CHECK_ERROR(_acmRight->RegisterTransportCallback(_channel)); | |
45 // Register the receiver ACM in channel | |
46 _channel->RegisterReceiverACM(_acmReceiver.get()); | |
47 | |
48 uint16_t sampFreqHz = 32000; | |
49 | |
50 const std::string file_name = webrtc::test::ResourcePath( | |
51 "audio_coding/testfile32kHz", "pcm"); | |
52 _inFile.Open(file_name, sampFreqHz, "rb", false); | |
53 | |
54 std::string output_file = webrtc::test::OutputPath() | |
55 + "out_spatial_autotest.pcm"; | |
56 if (_testMode == 1) { | |
57 output_file = webrtc::test::OutputPath() + "testspatial_out.pcm"; | |
58 printf("\n"); | |
59 printf("Enter the output file [%s]: ", output_file.c_str()); | |
60 PCMFile::ChooseFile(&output_file, MAX_FILE_NAME_LENGTH_BYTE, &sampFreqHz); | |
61 } else { | |
62 output_file = webrtc::test::OutputPath() + "testspatial_out.pcm"; | |
63 } | |
64 _outFile.Open(output_file, sampFreqHz, "wb", false); | |
65 _outFile.SaveStereo(true); | |
66 | |
67 // Register all available codes as receiving codecs. | |
68 CodecInst codecInst; | |
69 int status; | |
70 uint8_t num_encoders = _acmReceiver->NumberOfCodecs(); | |
71 // Register all available codes as receiving codecs once more. | |
72 for (uint8_t n = 0; n < num_encoders; n++) { | |
73 status = _acmReceiver->Codec(n, &codecInst); | |
74 if (status < 0) { | |
75 printf("Error in Codec(), no matching codec found"); | |
76 } | |
77 status = _acmReceiver->RegisterReceiveCodec(codecInst); | |
78 if (status < 0) { | |
79 printf("Error in RegisterReceiveCodec() for payload type %d", | |
80 codecInst.pltype); | |
81 } | |
82 } | |
83 | |
84 return 0; | |
85 } | |
86 | |
87 void SpatialAudio::Perform() { | |
88 if (_testMode == 0) { | |
89 printf("Running SpatialAudio Test"); | |
90 WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceAudioCoding, -1, | |
91 "---------- SpatialAudio ----------"); | |
92 } | |
93 | |
94 Setup(); | |
95 | |
96 CodecInst codecInst; | |
97 _acmLeft->Codec((uint8_t) 1, &codecInst); | |
98 CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst)); | |
99 EncodeDecode(); | |
100 | |
101 int16_t pannCntr = 0; | |
102 | |
103 double leftPanning[NUM_PANN_COEFFS] = { 1.00, 0.95, 0.90, 0.85, 0.80, 0.75, | |
104 0.70, 0.60, 0.55, 0.50 }; | |
105 double rightPanning[NUM_PANN_COEFFS] = { 0.50, 0.55, 0.60, 0.70, 0.75, 0.80, | |
106 0.85, 0.90, 0.95, 1.00 }; | |
107 | |
108 while ((pannCntr + 1) < NUM_PANN_COEFFS) { | |
109 _acmLeft->Codec((uint8_t) 0, &codecInst); | |
110 codecInst.pacsize = 480; | |
111 CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst)); | |
112 CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst)); | |
113 | |
114 EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]); | |
115 pannCntr++; | |
116 | |
117 // Change codec | |
118 _acmLeft->Codec((uint8_t) 3, &codecInst); | |
119 codecInst.pacsize = 320; | |
120 CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst)); | |
121 CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst)); | |
122 | |
123 EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]); | |
124 pannCntr++; | |
125 if (_testMode == 0) { | |
126 printf("."); | |
127 } | |
128 } | |
129 | |
130 _acmLeft->Codec((uint8_t) 4, &codecInst); | |
131 CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst)); | |
132 EncodeDecode(); | |
133 | |
134 _acmLeft->Codec((uint8_t) 0, &codecInst); | |
135 codecInst.pacsize = 480; | |
136 CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst)); | |
137 CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst)); | |
138 pannCntr = NUM_PANN_COEFFS - 1; | |
139 while (pannCntr >= 0) { | |
140 EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]); | |
141 pannCntr--; | |
142 if (_testMode == 0) { | |
143 printf("."); | |
144 } | |
145 } | |
146 if (_testMode == 0) { | |
147 printf("Done!\n"); | |
148 } | |
149 } | |
150 | |
151 void SpatialAudio::EncodeDecode(const double leftPanning, | |
152 const double rightPanning) { | |
153 AudioFrame audioFrame; | |
154 int32_t outFileSampFreq = _outFile.SamplingFrequency(); | |
155 | |
156 const double rightToLeftRatio = rightPanning / leftPanning; | |
157 | |
158 _channel->SetIsStereo(true); | |
159 | |
160 while (!_inFile.EndOfFile()) { | |
161 _inFile.Read10MsData(audioFrame); | |
162 for (size_t n = 0; n < audioFrame.samples_per_channel_; n++) { | |
163 audioFrame.data_[n] = (int16_t) floor( | |
164 audioFrame.data_[n] * leftPanning + 0.5); | |
165 } | |
166 CHECK_ERROR(_acmLeft->Add10MsData(audioFrame)); | |
167 | |
168 for (size_t n = 0; n < audioFrame.samples_per_channel_; n++) { | |
169 audioFrame.data_[n] = (int16_t) floor( | |
170 audioFrame.data_[n] * rightToLeftRatio + 0.5); | |
171 } | |
172 CHECK_ERROR(_acmRight->Add10MsData(audioFrame)); | |
173 | |
174 CHECK_ERROR(_acmReceiver->PlayoutData10Ms(outFileSampFreq, &audioFrame)); | |
175 _outFile.Write10MsData(audioFrame); | |
176 } | |
177 _inFile.Rewind(); | |
178 } | |
179 | |
180 void SpatialAudio::EncodeDecode() { | |
181 AudioFrame audioFrame; | |
182 int32_t outFileSampFreq = _outFile.SamplingFrequency(); | |
183 | |
184 _channel->SetIsStereo(false); | |
185 | |
186 while (!_inFile.EndOfFile()) { | |
187 _inFile.Read10MsData(audioFrame); | |
188 CHECK_ERROR(_acmLeft->Add10MsData(audioFrame)); | |
189 | |
190 CHECK_ERROR(_acmReceiver->PlayoutData10Ms(outFileSampFreq, &audioFrame)); | |
191 _outFile.Write10MsData(audioFrame); | |
192 } | |
193 _inFile.Rewind(); | |
194 } | |
195 | |
196 } // namespace webrtc | |
OLD | NEW |