1a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh/* 2a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * Copyrightm (C) 2010 The Android Open Source Project 3a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * 4a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * you may not use this file except in compliance with the License. 6a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * You may obtain a copy of the License at 7a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * 8a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 9a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * 10a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * Unless required by applicable law or agreed to in writing, software 11a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * See the License for the specific language governing permissions and 14a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh * limitations under the License. 15a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh */ 16a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 17a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh#include "AudioCodec.h" 18a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 19a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehextern "C" { 20a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh#include "gsm.h" 21a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh} 22a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 23a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehnamespace { 24a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 25a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehclass GsmCodec : public AudioCodec 26a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh{ 27a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehpublic: 28a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh GsmCodec() { 29a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh mEncode = gsm_create(); 30a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh mDecode = gsm_create(); 31a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 32a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 33a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh ~GsmCodec() { 34a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh if (mEncode) { 35a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh gsm_destroy(mEncode); 36a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 37a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh if (mDecode) { 38a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh gsm_destroy(mDecode); 39a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 40a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 41a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 42a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh int set(int sampleRate, const char *fmtp) { 43a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh return (sampleRate == 8000 && mEncode && mDecode) ? 160 : -1; 44a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 45a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 46a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh int encode(void *payload, int16_t *samples); 4735d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh int decode(int16_t *samples, int count, void *payload, int length); 48a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 49a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehprivate: 50a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh gsm mEncode; 51a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh gsm mDecode; 52a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh}; 53a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 54a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yehint GsmCodec::encode(void *payload, int16_t *samples) 55a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh{ 56a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh gsm_encode(mEncode, samples, (unsigned char *)payload); 57a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh return 33; 58a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh} 59a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 6035d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yehint GsmCodec::decode(int16_t *samples, int count, void *payload, int length) 61a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh{ 6235d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh unsigned char *bytes = (unsigned char *)payload; 6335d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh int n = 0; 6435d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh while (n + 160 <= count && length >= 33 && 6535d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh gsm_decode(mDecode, bytes, &samples[n]) == 0) { 6635d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh n += 160; 6735d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh length -= 33; 6835d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh bytes += 33; 69a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh } 7035d05dcba1e829782813b6ec21afceb5cffc22e6Chia-chi Yeh return n; 71a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh} 72a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 73a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh} // namespace 74a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh 75a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi YehAudioCodec *newGsmCodec() 76a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh{ 77a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh return new GsmCodec; 78a6f950c9682ffffc00ca976aafeeedf391718b1dChia-chi Yeh} 79