test_create_audiotrack.cpp revision 0a7885e717e498167520a6ed2fdec45fb472ceee
1/* 2 * Copyright (C) 2017 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 <fcntl.h> 18#include <stdio.h> 19#include <string.h> 20#include <unistd.h> 21 22#include <binder/MemoryBase.h> 23#include <binder/MemoryDealer.h> 24#include <binder/MemoryHeapBase.h> 25#include <media/AudioTrack.h> 26 27#include "test_create_utils.h" 28 29#define NUM_ARGUMENTS 10 30#define VERSION_VALUE "1.0" 31 32namespace android { 33 34int testTrack(FILE *inputFile, int outputFileFd) 35{ 36 char line[MAX_INPUT_FILE_LINE_LENGTH]; 37 uint32_t testCount = 0; 38 Vector<String16> args; 39 int ret = 0; 40 41 if (inputFile == nullptr) { 42 sp<AudioTrack> track = new AudioTrack(AUDIO_STREAM_DEFAULT, 43 0 /* sampleRate */, 44 AUDIO_FORMAT_DEFAULT, 45 AUDIO_CHANNEL_OUT_STEREO); 46 if (track == 0 || track->initCheck() != NO_ERROR) { 47 write(outputFileFd, "Error creating AudioTrack\n", 48 sizeof("Error creating AudioTrack\n")); 49 } else { 50 track->dump(outputFileFd, args); 51 } 52 return 0; 53 } 54 55 // check version 56 if (!checkVersion(inputFile, VERSION_VALUE)) { 57 return 1; 58 } 59 60 while (readLine(inputFile, line, MAX_INPUT_FILE_LINE_LENGTH) == 0) { 61 uint32_t sampleRate; 62 audio_format_t format; 63 audio_channel_mask_t channelMask; 64 size_t frameCount; 65 int32_t notificationFrames; 66 uint32_t useSharedBuffer; 67 audio_output_flags_t flags; 68 audio_session_t sessionId; 69 audio_usage_t usage; 70 audio_content_type_t contentType; 71 audio_attributes_t attributes; 72 sp<IMemory> sharedBuffer; 73 sp<MemoryDealer> heap; 74 audio_offload_info_t offloadInfo = AUDIO_INFO_INITIALIZER; 75 status_t status; 76 char statusStr[MAX_OUTPUT_FILE_LINE_LENGTH]; 77 bool offload = false; 78 bool fast = false; 79 80 if (sscanf(line, " %u %x %x %zu %d %u %x %u %u %u", 81 &sampleRate, &format, &channelMask, 82 &frameCount, ¬ificationFrames, &useSharedBuffer, 83 &flags, &sessionId, &usage, &contentType) != NUM_ARGUMENTS) { 84 fprintf(stderr, "Malformed line for test #%u in input file\n", testCount+1); 85 ret = 1; 86 continue; 87 } 88 testCount++; 89 90 if (useSharedBuffer != 0) { 91 size_t heapSize = audio_channel_count_from_out_mask(channelMask) * 92 audio_bytes_per_sample(format) * frameCount; 93 heap = new MemoryDealer(heapSize, "AudioTrack Heap Base"); 94 sharedBuffer = heap->allocate(heapSize); 95 frameCount = 0; 96 notificationFrames = 0; 97 } 98 if ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0) { 99 offloadInfo.sample_rate = sampleRate; 100 offloadInfo.channel_mask = channelMask; 101 offloadInfo.format = format; 102 offload = true; 103 } 104 if ((flags & AUDIO_OUTPUT_FLAG_FAST) != 0) { 105 fast = true; 106 } 107 108 memset(&attributes, 0, sizeof(attributes)); 109 attributes.content_type = contentType; 110 attributes.usage = usage; 111 112 sp<AudioTrack> track = new AudioTrack(); 113 114 track->set(AUDIO_STREAM_DEFAULT, 115 sampleRate, 116 format, 117 channelMask, 118 frameCount, 119 flags, 120 (fast || offload) ? callback : nullptr, 121 nullptr, 122 notificationFrames, 123 sharedBuffer, 124 false, 125 sessionId, 126 ((fast && sharedBuffer == 0) || offload) ? 127 AudioTrack::TRANSFER_CALLBACK : AudioTrack::TRANSFER_DEFAULT, 128 offload ? &offloadInfo : nullptr, 129 getuid(), 130 getpid(), 131 &attributes, 132 false, 133 1.0f, 134 AUDIO_PORT_HANDLE_NONE); 135 status = track->initCheck(); 136 sprintf(statusStr, "\n#### Test %u status %d\n", testCount, status); 137 write(outputFileFd, statusStr, strlen(statusStr)); 138 if (status != NO_ERROR) { 139 continue; 140 } 141 track->dump(outputFileFd, args); 142 } 143 return ret; 144} 145 146}; // namespace android 147 148 149int main(int argc, char **argv) 150{ 151 return android::main(argc, argv, android::testTrack); 152} 153 154