AudioGroup.cpp revision 71f2cf116aab893e224056c38ab146bd1538dd3e
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <stdio.h> 18#include <stdint.h> 19#include <string.h> 20#include <errno.h> 21#include <fcntl.h> 22#include <sys/epoll.h> 23#include <sys/types.h> 24#include <sys/socket.h> 25#include <sys/stat.h> 26#include <sys/time.h> 27#include <time.h> 28#include <arpa/inet.h> 29#include <netinet/in.h> 30 31// #define LOG_NDEBUG 0 32#define LOG_TAG "AudioGroup" 33#include <cutils/atomic.h> 34#include <cutils/properties.h> 35#include <utils/Log.h> 36#include <utils/Errors.h> 37#include <utils/RefBase.h> 38#include <utils/threads.h> 39#include <utils/SystemClock.h> 40#include <media/AudioSystem.h> 41#include <media/AudioRecord.h> 42#include <media/AudioTrack.h> 43#include <media/mediarecorder.h> 44#include <media/AudioEffect.h> 45#include <audio_effects/effect_aec.h> 46#include <system/audio.h> 47 48#include "jni.h" 49#include "JNIHelp.h" 50 51#include "AudioCodec.h" 52#include "EchoSuppressor.h" 53 54extern int parse(JNIEnv *env, jstring jAddress, int port, sockaddr_storage *ss); 55 56namespace { 57 58using namespace android; 59 60int gRandom = -1; 61 62// We use a circular array to implement jitter buffer. The simplest way is doing 63// a modulo operation on the index while accessing the array. However modulo can 64// be expensive on some platforms, such as ARM. Thus we round up the size of the 65// array to the nearest power of 2 and then use bitwise-and instead of modulo. 66// Currently we make it 2048ms long and assume packet interval is 50ms or less. 67// The first 100ms is the place where samples get mixed. The rest is the real 68// jitter buffer. For a stream at 8000Hz it takes 32 kilobytes. These numbers 69// are chosen by experiments and each of them can be adjusted as needed. 70 71// Originally a stream does not send packets when it is receive-only or there is 72// nothing to mix. However, this causes some problems with certain firewalls and 73// proxies. A firewall might remove a port mapping when there is no outgoing 74// packet for a preiod of time, and a proxy might wait for incoming packets from 75// both sides before start forwarding. To solve these problems, we send out a 76// silence packet on the stream for every second. It should be good enough to 77// keep the stream alive with relatively low resources. 78 79// Other notes: 80// + We use elapsedRealtime() to get the time. Since we use 32bit variables 81// instead of 64bit ones, comparison must be done by subtraction. 82// + Sampling rate must be multiple of 1000Hz, and packet length must be in 83// milliseconds. No floating points. 84// + If we cannot get enough CPU, we drop samples and simulate packet loss. 85// + Resampling is not done yet, so streams in one group must use the same rate. 86// For the first release only 8000Hz is supported. 87 88#define BUFFER_SIZE 2048 89#define HISTORY_SIZE 100 90#define MEASURE_BASE 100 91#define MEASURE_PERIOD 5000 92#define DTMF_PERIOD 200 93 94class AudioStream 95{ 96public: 97 AudioStream(); 98 ~AudioStream(); 99 bool set(int mode, int socket, sockaddr_storage *remote, 100 AudioCodec *codec, int sampleRate, int sampleCount, 101 int codecType, int dtmfType); 102 103 void sendDtmf(int event); 104 bool mix(int32_t *output, int head, int tail, int sampleRate); 105 void encode(int tick, AudioStream *chain); 106 void decode(int tick); 107 108private: 109 enum { 110 NORMAL = 0, 111 SEND_ONLY = 1, 112 RECEIVE_ONLY = 2, 113 LAST_MODE = 2, 114 }; 115 116 int mMode; 117 int mSocket; 118 sockaddr_storage mRemote; 119 AudioCodec *mCodec; 120 uint32_t mCodecMagic; 121 uint32_t mDtmfMagic; 122 bool mFixRemote; 123 124 int mTick; 125 int mSampleRate; 126 int mSampleCount; 127 int mInterval; 128 int mKeepAlive; 129 130 int16_t *mBuffer; 131 int mBufferMask; 132 int mBufferHead; 133 int mBufferTail; 134 int mLatencyTimer; 135 int mLatencyScore; 136 137 uint16_t mSequence; 138 uint32_t mTimestamp; 139 uint32_t mSsrc; 140 141 int mDtmfEvent; 142 int mDtmfStart; 143 144 AudioStream *mNext; 145 146 friend class AudioGroup; 147}; 148 149AudioStream::AudioStream() 150{ 151 mSocket = -1; 152 mCodec = NULL; 153 mBuffer = NULL; 154 mNext = NULL; 155} 156 157AudioStream::~AudioStream() 158{ 159 close(mSocket); 160 delete mCodec; 161 delete [] mBuffer; 162 LOGD("stream[%d] is dead", mSocket); 163} 164 165bool AudioStream::set(int mode, int socket, sockaddr_storage *remote, 166 AudioCodec *codec, int sampleRate, int sampleCount, 167 int codecType, int dtmfType) 168{ 169 if (mode < 0 || mode > LAST_MODE) { 170 return false; 171 } 172 mMode = mode; 173 174 mCodecMagic = (0x8000 | codecType) << 16; 175 mDtmfMagic = (dtmfType == -1) ? 0 : (0x8000 | dtmfType) << 16; 176 177 mTick = elapsedRealtime(); 178 mSampleRate = sampleRate / 1000; 179 mSampleCount = sampleCount; 180 mInterval = mSampleCount / mSampleRate; 181 182 // Allocate jitter buffer. 183 for (mBufferMask = 8; mBufferMask < mSampleRate; mBufferMask <<= 1); 184 mBufferMask *= BUFFER_SIZE; 185 mBuffer = new int16_t[mBufferMask]; 186 --mBufferMask; 187 mBufferHead = 0; 188 mBufferTail = 0; 189 mLatencyTimer = 0; 190 mLatencyScore = 0; 191 192 // Initialize random bits. 193 read(gRandom, &mSequence, sizeof(mSequence)); 194 read(gRandom, &mTimestamp, sizeof(mTimestamp)); 195 read(gRandom, &mSsrc, sizeof(mSsrc)); 196 197 mDtmfEvent = -1; 198 mDtmfStart = 0; 199 200 // Only take over these things when succeeded. 201 mSocket = socket; 202 if (codec) { 203 mRemote = *remote; 204 mCodec = codec; 205 206 // Here we should never get an private address, but some buggy proxy 207 // servers do give us one. To solve this, we replace the address when 208 // the first time we successfully decode an incoming packet. 209 mFixRemote = false; 210 if (remote->ss_family == AF_INET) { 211 unsigned char *address = 212 (unsigned char *)&((sockaddr_in *)remote)->sin_addr; 213 if (address[0] == 10 || 214 (address[0] == 172 && (address[1] >> 4) == 1) || 215 (address[0] == 192 && address[1] == 168)) { 216 mFixRemote = true; 217 } 218 } 219 } 220 221 LOGD("stream[%d] is configured as %s %dkHz %dms mode %d", mSocket, 222 (codec ? codec->name : "RAW"), mSampleRate, mInterval, mMode); 223 return true; 224} 225 226void AudioStream::sendDtmf(int event) 227{ 228 if (mDtmfMagic != 0) { 229 mDtmfEvent = event << 24; 230 mDtmfStart = mTimestamp + mSampleCount; 231 } 232} 233 234bool AudioStream::mix(int32_t *output, int head, int tail, int sampleRate) 235{ 236 if (mMode == SEND_ONLY) { 237 return false; 238 } 239 240 if (head - mBufferHead < 0) { 241 head = mBufferHead; 242 } 243 if (tail - mBufferTail > 0) { 244 tail = mBufferTail; 245 } 246 if (tail - head <= 0) { 247 return false; 248 } 249 250 head *= mSampleRate; 251 tail *= mSampleRate; 252 253 if (sampleRate == mSampleRate) { 254 for (int i = head; i - tail < 0; ++i) { 255 output[i - head] += mBuffer[i & mBufferMask]; 256 } 257 } else { 258 // TODO: implement resampling. 259 return false; 260 } 261 return true; 262} 263 264void AudioStream::encode(int tick, AudioStream *chain) 265{ 266 if (tick - mTick >= mInterval) { 267 // We just missed the train. Pretend that packets in between are lost. 268 int skipped = (tick - mTick) / mInterval; 269 mTick += skipped * mInterval; 270 mSequence += skipped; 271 mTimestamp += skipped * mSampleCount; 272 ALOGV("stream[%d] skips %d packets", mSocket, skipped); 273 } 274 275 tick = mTick; 276 mTick += mInterval; 277 ++mSequence; 278 mTimestamp += mSampleCount; 279 280 // If there is an ongoing DTMF event, send it now. 281 if (mMode != RECEIVE_ONLY && mDtmfEvent != -1) { 282 int duration = mTimestamp - mDtmfStart; 283 // Make sure duration is reasonable. 284 if (duration >= 0 && duration < mSampleRate * DTMF_PERIOD) { 285 duration += mSampleCount; 286 int32_t buffer[4] = { 287 htonl(mDtmfMagic | mSequence), 288 htonl(mDtmfStart), 289 mSsrc, 290 htonl(mDtmfEvent | duration), 291 }; 292 if (duration >= mSampleRate * DTMF_PERIOD) { 293 buffer[3] |= htonl(1 << 23); 294 mDtmfEvent = -1; 295 } 296 sendto(mSocket, buffer, sizeof(buffer), MSG_DONTWAIT, 297 (sockaddr *)&mRemote, sizeof(mRemote)); 298 return; 299 } 300 mDtmfEvent = -1; 301 } 302 303 int32_t buffer[mSampleCount + 3]; 304 bool data = false; 305 if (mMode != RECEIVE_ONLY) { 306 // Mix all other streams. 307 memset(buffer, 0, sizeof(buffer)); 308 while (chain) { 309 if (chain != this) { 310 data |= chain->mix(buffer, tick - mInterval, tick, mSampleRate); 311 } 312 chain = chain->mNext; 313 } 314 } 315 316 int16_t samples[mSampleCount]; 317 if (data) { 318 // Saturate into 16 bits. 319 for (int i = 0; i < mSampleCount; ++i) { 320 int32_t sample = buffer[i]; 321 if (sample < -32768) { 322 sample = -32768; 323 } 324 if (sample > 32767) { 325 sample = 32767; 326 } 327 samples[i] = sample; 328 } 329 } else { 330 if ((mTick ^ mKeepAlive) >> 10 == 0) { 331 return; 332 } 333 mKeepAlive = mTick; 334 memset(samples, 0, sizeof(samples)); 335 336 if (mMode != RECEIVE_ONLY) { 337 ALOGV("stream[%d] no data", mSocket); 338 } 339 } 340 341 if (!mCodec) { 342 // Special case for device stream. 343 send(mSocket, samples, sizeof(samples), MSG_DONTWAIT); 344 return; 345 } 346 347 // Cook the packet and send it out. 348 buffer[0] = htonl(mCodecMagic | mSequence); 349 buffer[1] = htonl(mTimestamp); 350 buffer[2] = mSsrc; 351 int length = mCodec->encode(&buffer[3], samples); 352 if (length <= 0) { 353 ALOGV("stream[%d] encoder error", mSocket); 354 return; 355 } 356 sendto(mSocket, buffer, length + 12, MSG_DONTWAIT, (sockaddr *)&mRemote, 357 sizeof(mRemote)); 358} 359 360void AudioStream::decode(int tick) 361{ 362 char c; 363 if (mMode == SEND_ONLY) { 364 recv(mSocket, &c, 1, MSG_DONTWAIT); 365 return; 366 } 367 368 // Make sure mBufferHead and mBufferTail are reasonable. 369 if ((unsigned int)(tick + BUFFER_SIZE - mBufferHead) > BUFFER_SIZE * 2) { 370 mBufferHead = tick - HISTORY_SIZE; 371 mBufferTail = mBufferHead; 372 } 373 374 if (tick - mBufferHead > HISTORY_SIZE) { 375 // Throw away outdated samples. 376 mBufferHead = tick - HISTORY_SIZE; 377 if (mBufferTail - mBufferHead < 0) { 378 mBufferTail = mBufferHead; 379 } 380 } 381 382 // Adjust the jitter buffer if the latency keeps larger than the threshold 383 // in the measurement period. 384 int score = mBufferTail - tick - MEASURE_BASE; 385 if (mLatencyScore > score || mLatencyScore <= 0) { 386 mLatencyScore = score; 387 mLatencyTimer = tick; 388 } else if (tick - mLatencyTimer >= MEASURE_PERIOD) { 389 ALOGV("stream[%d] reduces latency of %dms", mSocket, mLatencyScore); 390 mBufferTail -= mLatencyScore; 391 mLatencyScore = -1; 392 } 393 394 int count = (BUFFER_SIZE - (mBufferTail - mBufferHead)) * mSampleRate; 395 if (count < mSampleCount) { 396 // Buffer overflow. Drop the packet. 397 ALOGV("stream[%d] buffer overflow", mSocket); 398 recv(mSocket, &c, 1, MSG_DONTWAIT); 399 return; 400 } 401 402 // Receive the packet and decode it. 403 int16_t samples[count]; 404 if (!mCodec) { 405 // Special case for device stream. 406 count = recv(mSocket, samples, sizeof(samples), 407 MSG_TRUNC | MSG_DONTWAIT) >> 1; 408 } else { 409 __attribute__((aligned(4))) uint8_t buffer[2048]; 410 sockaddr_storage remote; 411 socklen_t addrlen = sizeof(remote); 412 413 int length = recvfrom(mSocket, buffer, sizeof(buffer), 414 MSG_TRUNC | MSG_DONTWAIT, (sockaddr *)&remote, &addrlen); 415 416 // Do we need to check SSRC, sequence, and timestamp? They are not 417 // reliable but at least they can be used to identify duplicates? 418 if (length < 12 || length > (int)sizeof(buffer) || 419 (ntohl(*(uint32_t *)buffer) & 0xC07F0000) != mCodecMagic) { 420 ALOGV("stream[%d] malformed packet", mSocket); 421 return; 422 } 423 int offset = 12 + ((buffer[0] & 0x0F) << 2); 424 if ((buffer[0] & 0x10) != 0) { 425 offset += 4 + (ntohs(*(uint16_t *)&buffer[offset + 2]) << 2); 426 } 427 if ((buffer[0] & 0x20) != 0) { 428 length -= buffer[length - 1]; 429 } 430 length -= offset; 431 if (length >= 0) { 432 length = mCodec->decode(samples, count, &buffer[offset], length); 433 } 434 if (length > 0 && mFixRemote) { 435 mRemote = remote; 436 mFixRemote = false; 437 } 438 count = length; 439 } 440 if (count <= 0) { 441 ALOGV("stream[%d] decoder error", mSocket); 442 return; 443 } 444 445 if (tick - mBufferTail > 0) { 446 // Buffer underrun. Reset the jitter buffer. 447 ALOGV("stream[%d] buffer underrun", mSocket); 448 if (mBufferTail - mBufferHead <= 0) { 449 mBufferHead = tick + mInterval; 450 mBufferTail = mBufferHead; 451 } else { 452 int tail = (tick + mInterval) * mSampleRate; 453 for (int i = mBufferTail * mSampleRate; i - tail < 0; ++i) { 454 mBuffer[i & mBufferMask] = 0; 455 } 456 mBufferTail = tick + mInterval; 457 } 458 } 459 460 // Append to the jitter buffer. 461 int tail = mBufferTail * mSampleRate; 462 for (int i = 0; i < count; ++i) { 463 mBuffer[tail & mBufferMask] = samples[i]; 464 ++tail; 465 } 466 mBufferTail += mInterval; 467} 468 469//------------------------------------------------------------------------------ 470 471class AudioGroup 472{ 473public: 474 AudioGroup(); 475 ~AudioGroup(); 476 bool set(int sampleRate, int sampleCount); 477 478 bool setMode(int mode); 479 bool sendDtmf(int event); 480 bool add(AudioStream *stream); 481 bool remove(int socket); 482 bool platformHasAec() { return mPlatformHasAec; } 483 484private: 485 enum { 486 ON_HOLD = 0, 487 MUTED = 1, 488 NORMAL = 2, 489 ECHO_SUPPRESSION = 3, 490 LAST_MODE = 3, 491 }; 492 493 bool checkPlatformAec(); 494 495 AudioStream *mChain; 496 int mEventQueue; 497 volatile int mDtmfEvent; 498 499 int mMode; 500 int mSampleRate; 501 int mSampleCount; 502 int mDeviceSocket; 503 bool mPlatformHasAec; 504 505 class NetworkThread : public Thread 506 { 507 public: 508 NetworkThread(AudioGroup *group) : Thread(false), mGroup(group) {} 509 510 bool start() 511 { 512 if (run("Network", ANDROID_PRIORITY_AUDIO) != NO_ERROR) { 513 LOGE("cannot start network thread"); 514 return false; 515 } 516 return true; 517 } 518 519 private: 520 AudioGroup *mGroup; 521 bool threadLoop(); 522 }; 523 sp<NetworkThread> mNetworkThread; 524 525 class DeviceThread : public Thread 526 { 527 public: 528 DeviceThread(AudioGroup *group) : Thread(false), mGroup(group) {} 529 530 bool start() 531 { 532 if (run("Device", ANDROID_PRIORITY_AUDIO) != NO_ERROR) { 533 LOGE("cannot start device thread"); 534 return false; 535 } 536 return true; 537 } 538 539 private: 540 AudioGroup *mGroup; 541 bool threadLoop(); 542 }; 543 sp<DeviceThread> mDeviceThread; 544}; 545 546AudioGroup::AudioGroup() 547{ 548 mMode = ON_HOLD; 549 mChain = NULL; 550 mEventQueue = -1; 551 mDtmfEvent = -1; 552 mDeviceSocket = -1; 553 mNetworkThread = new NetworkThread(this); 554 mDeviceThread = new DeviceThread(this); 555 mPlatformHasAec = checkPlatformAec(); 556} 557 558AudioGroup::~AudioGroup() 559{ 560 mNetworkThread->requestExitAndWait(); 561 mDeviceThread->requestExitAndWait(); 562 close(mEventQueue); 563 close(mDeviceSocket); 564 while (mChain) { 565 AudioStream *next = mChain->mNext; 566 delete mChain; 567 mChain = next; 568 } 569 LOGD("group[%d] is dead", mDeviceSocket); 570} 571 572bool AudioGroup::set(int sampleRate, int sampleCount) 573{ 574 mEventQueue = epoll_create(2); 575 if (mEventQueue == -1) { 576 LOGE("epoll_create: %s", strerror(errno)); 577 return false; 578 } 579 580 mSampleRate = sampleRate; 581 mSampleCount = sampleCount; 582 583 // Create device socket. 584 int pair[2]; 585 if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pair)) { 586 LOGE("socketpair: %s", strerror(errno)); 587 return false; 588 } 589 mDeviceSocket = pair[0]; 590 591 // Create device stream. 592 mChain = new AudioStream; 593 if (!mChain->set(AudioStream::NORMAL, pair[1], NULL, NULL, 594 sampleRate, sampleCount, -1, -1)) { 595 close(pair[1]); 596 LOGE("cannot initialize device stream"); 597 return false; 598 } 599 600 // Give device socket a reasonable timeout. 601 timeval tv; 602 tv.tv_sec = 0; 603 tv.tv_usec = 1000 * sampleCount / sampleRate * 500; 604 if (setsockopt(pair[0], SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) { 605 LOGE("setsockopt: %s", strerror(errno)); 606 return false; 607 } 608 609 // Add device stream into event queue. 610 epoll_event event; 611 event.events = EPOLLIN; 612 event.data.ptr = mChain; 613 if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, pair[1], &event)) { 614 LOGE("epoll_ctl: %s", strerror(errno)); 615 return false; 616 } 617 618 // Anything else? 619 LOGD("stream[%d] joins group[%d]", pair[1], pair[0]); 620 return true; 621} 622 623bool AudioGroup::setMode(int mode) 624{ 625 if (mode < 0 || mode > LAST_MODE) { 626 return false; 627 } 628 // FIXME: temporary code to overcome echo and mic gain issues on herring and tuna boards. 629 // Must be modified/removed when the root cause of the issue is fixed in the hardware or 630 // driver 631 char value[PROPERTY_VALUE_MAX]; 632 property_get("ro.product.board", value, ""); 633 if (mode == NORMAL && 634 (!strcmp(value, "herring") || !strcmp(value, "tuna"))) { 635 mode = ECHO_SUPPRESSION; 636 } 637 if (mMode == mode) { 638 return true; 639 } 640 641 mDeviceThread->requestExitAndWait(); 642 LOGD("group[%d] switches from mode %d to %d", mDeviceSocket, mMode, mode); 643 mMode = mode; 644 return (mode == ON_HOLD) || mDeviceThread->start(); 645} 646 647bool AudioGroup::sendDtmf(int event) 648{ 649 if (event < 0 || event > 15) { 650 return false; 651 } 652 653 // DTMF is rarely used, so we try to make it as lightweight as possible. 654 // Using volatile might be dodgy, but using a pipe or pthread primitives 655 // or stop-set-restart threads seems too heavy. Will investigate later. 656 timespec ts; 657 ts.tv_sec = 0; 658 ts.tv_nsec = 100000000; 659 for (int i = 0; mDtmfEvent != -1 && i < 20; ++i) { 660 nanosleep(&ts, NULL); 661 } 662 if (mDtmfEvent != -1) { 663 return false; 664 } 665 mDtmfEvent = event; 666 nanosleep(&ts, NULL); 667 return true; 668} 669 670bool AudioGroup::add(AudioStream *stream) 671{ 672 mNetworkThread->requestExitAndWait(); 673 674 epoll_event event; 675 event.events = EPOLLIN; 676 event.data.ptr = stream; 677 if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, stream->mSocket, &event)) { 678 LOGE("epoll_ctl: %s", strerror(errno)); 679 return false; 680 } 681 682 stream->mNext = mChain->mNext; 683 mChain->mNext = stream; 684 if (!mNetworkThread->start()) { 685 // Only take over the stream when succeeded. 686 mChain->mNext = stream->mNext; 687 return false; 688 } 689 690 LOGD("stream[%d] joins group[%d]", stream->mSocket, mDeviceSocket); 691 return true; 692} 693 694bool AudioGroup::remove(int socket) 695{ 696 mNetworkThread->requestExitAndWait(); 697 698 for (AudioStream *stream = mChain; stream->mNext; stream = stream->mNext) { 699 AudioStream *target = stream->mNext; 700 if (target->mSocket == socket) { 701 if (epoll_ctl(mEventQueue, EPOLL_CTL_DEL, socket, NULL)) { 702 LOGE("epoll_ctl: %s", strerror(errno)); 703 return false; 704 } 705 stream->mNext = target->mNext; 706 LOGD("stream[%d] leaves group[%d]", socket, mDeviceSocket); 707 delete target; 708 break; 709 } 710 } 711 712 // Do not start network thread if there is only one stream. 713 if (!mChain->mNext || !mNetworkThread->start()) { 714 return false; 715 } 716 return true; 717} 718 719bool AudioGroup::NetworkThread::threadLoop() 720{ 721 AudioStream *chain = mGroup->mChain; 722 int tick = elapsedRealtime(); 723 int deadline = tick + 10; 724 int count = 0; 725 726 for (AudioStream *stream = chain; stream; stream = stream->mNext) { 727 if (tick - stream->mTick >= 0) { 728 stream->encode(tick, chain); 729 } 730 if (deadline - stream->mTick > 0) { 731 deadline = stream->mTick; 732 } 733 ++count; 734 } 735 736 int event = mGroup->mDtmfEvent; 737 if (event != -1) { 738 for (AudioStream *stream = chain; stream; stream = stream->mNext) { 739 stream->sendDtmf(event); 740 } 741 mGroup->mDtmfEvent = -1; 742 } 743 744 deadline -= tick; 745 if (deadline < 1) { 746 deadline = 1; 747 } 748 749 epoll_event events[count]; 750 count = epoll_wait(mGroup->mEventQueue, events, count, deadline); 751 if (count == -1) { 752 LOGE("epoll_wait: %s", strerror(errno)); 753 return false; 754 } 755 for (int i = 0; i < count; ++i) { 756 ((AudioStream *)events[i].data.ptr)->decode(tick); 757 } 758 759 return true; 760} 761 762bool AudioGroup::checkPlatformAec() 763{ 764 effect_descriptor_t fxDesc; 765 uint32_t numFx; 766 767 if (AudioEffect::queryNumberEffects(&numFx) != NO_ERROR) { 768 return false; 769 } 770 for (uint32_t i = 0; i < numFx; i++) { 771 if (AudioEffect::queryEffect(i, &fxDesc) != NO_ERROR) { 772 continue; 773 } 774 if (memcmp(&fxDesc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) { 775 return true; 776 } 777 } 778 return false; 779} 780 781bool AudioGroup::DeviceThread::threadLoop() 782{ 783 int mode = mGroup->mMode; 784 int sampleRate = mGroup->mSampleRate; 785 int sampleCount = mGroup->mSampleCount; 786 int deviceSocket = mGroup->mDeviceSocket; 787 788 // Find out the frame count for AudioTrack and AudioRecord. 789 int output = 0; 790 int input = 0; 791 if (AudioTrack::getMinFrameCount(&output, AUDIO_STREAM_VOICE_CALL, 792 sampleRate) != NO_ERROR || output <= 0 || 793 AudioRecord::getMinFrameCount(&input, sampleRate, 794 AUDIO_FORMAT_PCM_16_BIT, 1) != NO_ERROR || input <= 0) { 795 LOGE("cannot compute frame count"); 796 return false; 797 } 798 LOGD("reported frame count: output %d, input %d", output, input); 799 800 if (output < sampleCount * 2) { 801 output = sampleCount * 2; 802 } 803 if (input < sampleCount * 2) { 804 input = sampleCount * 2; 805 } 806 LOGD("adjusted frame count: output %d, input %d", output, input); 807 808 // Initialize AudioTrack and AudioRecord. 809 AudioTrack track; 810 AudioRecord record; 811 if (track.set(AUDIO_STREAM_VOICE_CALL, sampleRate, AUDIO_FORMAT_PCM_16_BIT, 812 AUDIO_CHANNEL_OUT_MONO, output) != NO_ERROR || record.set( 813 AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AUDIO_FORMAT_PCM_16_BIT, 814 AUDIO_CHANNEL_IN_MONO, input) != NO_ERROR) { 815 LOGE("cannot initialize audio device"); 816 return false; 817 } 818 LOGD("latency: output %d, input %d", track.latency(), record.latency()); 819 820 // Give device socket a reasonable buffer size. 821 setsockopt(deviceSocket, SOL_SOCKET, SO_RCVBUF, &output, sizeof(output)); 822 setsockopt(deviceSocket, SOL_SOCKET, SO_SNDBUF, &output, sizeof(output)); 823 824 // Drain device socket. 825 char c; 826 while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1); 827 828 // check if platform supports echo cancellation and do not active local echo suppression in 829 // this case 830 EchoSuppressor *echo = NULL; 831 AudioEffect *aec = NULL; 832 if (mode == ECHO_SUPPRESSION) { 833 if (mGroup->platformHasAec()) { 834 aec = new AudioEffect(FX_IID_AEC, 835 NULL, 836 0, 837 0, 838 0, 839 record.getSessionId(), 840 record.getInput()); 841 status_t status = aec->initCheck(); 842 if (status == NO_ERROR || status == ALREADY_EXISTS) { 843 aec->setEnabled(true); 844 } else { 845 delete aec; 846 aec = NULL; 847 } 848 } 849 // Create local echo suppressor if platform AEC cannot be used. 850 if (aec == NULL) { 851 echo = new EchoSuppressor(sampleCount, 852 (track.latency() + record.latency()) * sampleRate / 1000); 853 } 854 } 855 // Start AudioRecord before AudioTrack. This prevents AudioTrack from being 856 // disabled due to buffer underrun while waiting for AudioRecord. 857 if (mode != MUTED) { 858 record.start(); 859 int16_t one; 860 record.read(&one, sizeof(one)); 861 } 862 track.start(); 863 864 while (!exitPending()) { 865 int16_t output[sampleCount]; 866 if (recv(deviceSocket, output, sizeof(output), 0) <= 0) { 867 memset(output, 0, sizeof(output)); 868 } 869 870 int16_t input[sampleCount]; 871 int toWrite = sampleCount; 872 int toRead = (mode == MUTED) ? 0 : sampleCount; 873 int chances = 100; 874 875 while (--chances > 0 && (toWrite > 0 || toRead > 0)) { 876 if (toWrite > 0) { 877 AudioTrack::Buffer buffer; 878 buffer.frameCount = toWrite; 879 880 status_t status = track.obtainBuffer(&buffer, 1); 881 if (status == NO_ERROR) { 882 int offset = sampleCount - toWrite; 883 memcpy(buffer.i8, &output[offset], buffer.size); 884 toWrite -= buffer.frameCount; 885 track.releaseBuffer(&buffer); 886 } else if (status != TIMED_OUT && status != WOULD_BLOCK) { 887 LOGE("cannot write to AudioTrack"); 888 goto exit; 889 } 890 } 891 892 if (toRead > 0) { 893 AudioRecord::Buffer buffer; 894 buffer.frameCount = toRead; 895 896 status_t status = record.obtainBuffer(&buffer, 1); 897 if (status == NO_ERROR) { 898 int offset = sampleCount - toRead; 899 memcpy(&input[offset], buffer.i8, buffer.size); 900 toRead -= buffer.frameCount; 901 record.releaseBuffer(&buffer); 902 } else if (status != TIMED_OUT && status != WOULD_BLOCK) { 903 LOGE("cannot read from AudioRecord"); 904 goto exit; 905 } 906 } 907 } 908 909 if (chances <= 0) { 910 LOGW("device loop timeout"); 911 while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1); 912 } 913 914 if (mode != MUTED) { 915 if (echo != NULL) { 916 ALOGV("echo->run()"); 917 echo->run(output, input); 918 } 919 send(deviceSocket, input, sizeof(input), MSG_DONTWAIT); 920 } 921 } 922 923exit: 924 delete echo; 925 delete aec; 926 return true; 927} 928 929//------------------------------------------------------------------------------ 930 931static jfieldID gNative; 932static jfieldID gMode; 933 934void add(JNIEnv *env, jobject thiz, jint mode, 935 jint socket, jstring jRemoteAddress, jint remotePort, 936 jstring jCodecSpec, jint dtmfType) 937{ 938 AudioCodec *codec = NULL; 939 AudioStream *stream = NULL; 940 AudioGroup *group = NULL; 941 942 // Sanity check. 943 sockaddr_storage remote; 944 if (parse(env, jRemoteAddress, remotePort, &remote) < 0) { 945 // Exception already thrown. 946 return; 947 } 948 if (!jCodecSpec) { 949 jniThrowNullPointerException(env, "codecSpec"); 950 return; 951 } 952 const char *codecSpec = env->GetStringUTFChars(jCodecSpec, NULL); 953 if (!codecSpec) { 954 // Exception already thrown. 955 return; 956 } 957 958 // Create audio codec. 959 int codecType = -1; 960 char codecName[16]; 961 int sampleRate = -1; 962 sscanf(codecSpec, "%d %15[^/]%*c%d", &codecType, codecName, &sampleRate); 963 codec = newAudioCodec(codecName); 964 int sampleCount = (codec ? codec->set(sampleRate, codecSpec) : -1); 965 env->ReleaseStringUTFChars(jCodecSpec, codecSpec); 966 if (sampleCount <= 0) { 967 jniThrowException(env, "java/lang/IllegalStateException", 968 "cannot initialize audio codec"); 969 goto error; 970 } 971 972 // Create audio stream. 973 stream = new AudioStream; 974 if (!stream->set(mode, socket, &remote, codec, sampleRate, sampleCount, 975 codecType, dtmfType)) { 976 jniThrowException(env, "java/lang/IllegalStateException", 977 "cannot initialize audio stream"); 978 goto error; 979 } 980 socket = -1; 981 codec = NULL; 982 983 // Create audio group. 984 group = (AudioGroup *)env->GetIntField(thiz, gNative); 985 if (!group) { 986 int mode = env->GetIntField(thiz, gMode); 987 group = new AudioGroup; 988 if (!group->set(8000, 256) || !group->setMode(mode)) { 989 jniThrowException(env, "java/lang/IllegalStateException", 990 "cannot initialize audio group"); 991 goto error; 992 } 993 } 994 995 // Add audio stream into audio group. 996 if (!group->add(stream)) { 997 jniThrowException(env, "java/lang/IllegalStateException", 998 "cannot add audio stream"); 999 goto error; 1000 } 1001 1002 // Succeed. 1003 env->SetIntField(thiz, gNative, (int)group); 1004 return; 1005 1006error: 1007 delete group; 1008 delete stream; 1009 delete codec; 1010 close(socket); 1011 env->SetIntField(thiz, gNative, NULL); 1012} 1013 1014void remove(JNIEnv *env, jobject thiz, jint socket) 1015{ 1016 AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative); 1017 if (group) { 1018 if (socket == -1 || !group->remove(socket)) { 1019 delete group; 1020 env->SetIntField(thiz, gNative, NULL); 1021 } 1022 } 1023} 1024 1025void setMode(JNIEnv *env, jobject thiz, jint mode) 1026{ 1027 AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative); 1028 if (group && !group->setMode(mode)) { 1029 jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 1030 } 1031} 1032 1033void sendDtmf(JNIEnv *env, jobject thiz, jint event) 1034{ 1035 AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative); 1036 if (group && !group->sendDtmf(event)) { 1037 jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 1038 } 1039} 1040 1041JNINativeMethod gMethods[] = { 1042 {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;I)V", (void *)add}, 1043 {"nativeRemove", "(I)V", (void *)remove}, 1044 {"nativeSetMode", "(I)V", (void *)setMode}, 1045 {"nativeSendDtmf", "(I)V", (void *)sendDtmf}, 1046}; 1047 1048} // namespace 1049 1050int registerAudioGroup(JNIEnv *env) 1051{ 1052 gRandom = open("/dev/urandom", O_RDONLY); 1053 if (gRandom == -1) { 1054 LOGE("urandom: %s", strerror(errno)); 1055 return -1; 1056 } 1057 1058 jclass clazz; 1059 if ((clazz = env->FindClass("android/net/rtp/AudioGroup")) == NULL || 1060 (gNative = env->GetFieldID(clazz, "mNative", "I")) == NULL || 1061 (gMode = env->GetFieldID(clazz, "mMode", "I")) == NULL || 1062 env->RegisterNatives(clazz, gMethods, NELEM(gMethods)) < 0) { 1063 LOGE("JNI registration failed"); 1064 return -1; 1065 } 1066 return 0; 1067} 1068