Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a7885e7 authored by Eric Laurent's avatar Eric Laurent
Browse files

add test for AudioRecord constructor

This test contructs a number of AudioRecords from arguments
listed in an input file and outputs dumps of the constructed
AudioRecords to an output file.
The output file can be compared to previous iterations to spot regressions.
An reference input file and the corresponding output file are added for
further comparison.

Test: run this test
Change-Id: I0d1b596ca91c3c58f159887fbd48aa3f04ae38c2
parent 724a1816
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -9,12 +9,27 @@ cc_defaults {
cc_test {
    name: "test_create_audiotrack",
    defaults: ["libaudioclient_tests_defaults"],
    srcs: ["test_create_audiotrack.cpp"],
    srcs: ["test_create_audiotrack.cpp",
           "test_create_utils.cpp"],
    shared_libs: [
        "libaudioclient",
        "libbinder",
        "libcutils",
        "libutils",
        "libbinder",
    ],
    data: ["track_test_input_*.txt"],
}

cc_test {
    name: "test_create_audiorecord",
    defaults: ["libaudioclient_tests_defaults"],
    srcs: ["test_create_audiorecord.cpp",
           "test_create_utils.cpp"],
    shared_libs: [
        "libaudioclient",
        "libbinder",
        "libcutils",
        "libutils",
    ],
    data: ["record_test_input_*.txt"],
}
+33 −0
Original line number Diff line number Diff line
version 1.0
# Input file for test_create_audiorecord
# Add one line for each tested AudioRecord constructor with the following arguments:
# sampleRate format   channelMask frameCount notificationFrames flags sessionId inputSource
# sample rate tests
  48000      0x1      0x10        4800       2400               0x0   0         0
  24000      0x1      0x10        4800       2400               0x0   0         0
  16000      0x1      0x10        4800       2400               0x0   0         0
   8000      0x1      0x10        4800       2400               0x0   0         0
  44100      0x1      0x10        4410       2205               0x0   0         0
  22050      0x1      0x10        4410       2205               0x0   0         0
  11025      0x1      0x10        4410       2205               0x0   0         0
# format tests
  48000      0x2      0x10        4800       2400               0x0   0         0
  48000      0x3      0x10        4800       2400               0x0   0         0
  48000      0x5      0x10        4800       2400               0x0   0         0
# channel mask tests
  48000      0x1      0x0C        4800       2400               0x0   0         0
# frame count tests
  48000      0x1      0x10        0          0                  0x0   0         0
  48000      0x1      0x10        48000      0                  0x0   0         0
  48000      0x1      0x10        12000      6000               0x0   0         0
# flags test
  48000      0x1      0x0C        0          0                  0x1   0         0
  44100      0x1      0x0C        0          0                  0x5   0         0
# session tests
  48000      0x1      0x10        0          0                  0     1001      0
# input source tests
  48000      0x1      0x10        0          0                  0     0         1
  48000      0x1      0x10        0          0                  0     0         5
  48000      0x1      0x10        0          0                  0     0         6
  48000      0x1      0x10        0          0                  0     0         7
  48000      0x1      0x10        0          0                  0     0         9
+198 −0
Original line number Diff line number Diff line

#### Test 1 status 0
 AudioRecord::dump
  status(0), active(0), session Id(65)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(4800), req. frame count(4800)
  notif. frame count(960), req. notif. frame count(2400)
  input(150), latency(100), selected device Id(0), routed device Id(11)

#### Test 2 status 0
 AudioRecord::dump
  status(0), active(0), session Id(73)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(24000)
  frame count(4800), req. frame count(4800)
  notif. frame count(480), req. notif. frame count(2400)
  input(158), latency(200), selected device Id(0), routed device Id(11)

#### Test 3 status 0
 AudioRecord::dump
  status(0), active(0), session Id(81)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(16000)
  frame count(4800), req. frame count(4800)
  notif. frame count(320), req. notif. frame count(2400)
  input(166), latency(300), selected device Id(0), routed device Id(11)

#### Test 4 status 0
 AudioRecord::dump
  status(0), active(0), session Id(89)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(8000)
  frame count(4800), req. frame count(4800)
  notif. frame count(160), req. notif. frame count(2400)
  input(174), latency(600), selected device Id(0), routed device Id(11)

#### Test 5 status 0
 AudioRecord::dump
  status(0), active(0), session Id(97)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(44100)
  frame count(4410), req. frame count(4410)
  notif. frame count(896), req. notif. frame count(2205)
  input(182), latency(100), selected device Id(0), routed device Id(11)

#### Test 6 status 0
 AudioRecord::dump
  status(0), active(0), session Id(105)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(22050)
  frame count(4410), req. frame count(4410)
  notif. frame count(448), req. notif. frame count(2205)
  input(190), latency(200), selected device Id(0), routed device Id(11)

#### Test 7 status 0
 AudioRecord::dump
  status(0), active(0), session Id(113)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(11025)
  frame count(4410), req. frame count(4410)
  notif. frame count(224), req. notif. frame count(2205)
  input(198), latency(400), selected device Id(0), routed device Id(11)

#### Test 8 status 0
 AudioRecord::dump
  status(0), active(0), session Id(121)
  flags(0), req. flags(0), audio source(0)
  format(0x2), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(4800), req. frame count(4800)
  notif. frame count(960), req. notif. frame count(2400)
  input(206), latency(100), selected device Id(0), routed device Id(11)

#### Test 9 status 0
 AudioRecord::dump
  status(0), active(0), session Id(129)
  flags(0), req. flags(0), audio source(0)
  format(0x3), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(4800), req. frame count(4800)
  notif. frame count(960), req. notif. frame count(2400)
  input(214), latency(100), selected device Id(0), routed device Id(11)

#### Test 10 status 0
 AudioRecord::dump
  status(0), active(0), session Id(137)
  flags(0), req. flags(0), audio source(0)
  format(0x5), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(4800), req. frame count(4800)
  notif. frame count(960), req. notif. frame count(2400)
  input(222), latency(100), selected device Id(0), routed device Id(11)

#### Test 11 status 0
 AudioRecord::dump
  status(0), active(0), session Id(145)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0xc), channel count(2), sample rate(48000)
  frame count(4800), req. frame count(4800)
  notif. frame count(960), req. notif. frame count(2400)
  input(230), latency(100), selected device Id(0), routed device Id(11)

#### Test 12 status 0
 AudioRecord::dump
  status(0), active(0), session Id(153)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(238), latency(60), selected device Id(0), routed device Id(11)

#### Test 13 status 0
 AudioRecord::dump
  status(0), active(0), session Id(161)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(48000), req. frame count(48000)
  notif. frame count(960), req. notif. frame count(0)
  input(246), latency(1000), selected device Id(0), routed device Id(11)

#### Test 14 status 0
 AudioRecord::dump
  status(0), active(0), session Id(169)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(12000), req. frame count(12000)
  notif. frame count(960), req. notif. frame count(6000)
  input(254), latency(250), selected device Id(0), routed device Id(11)

#### Test 15 status 0
 AudioRecord::dump
  status(0), active(0), session Id(177)
  flags(0x1), req. flags(0x1), audio source(0)
  format(0x1), channel mask(0xc), channel count(2), sample rate(48000)
  frame count(4096), req. frame count(4096)
  notif. frame count(96), req. notif. frame count(0)
  input(262), latency(85), selected device Id(0), routed device Id(11)

#### Test 16 status 0
 AudioRecord::dump
  status(0), active(0), session Id(185)
  flags(0), req. flags(0x5), audio source(0)
  format(0x1), channel mask(0xc), channel count(2), sample rate(44100)
  frame count(2664), req. frame count(2664)
  notif. frame count(888), req. notif. frame count(0)
  input(278), latency(60), selected device Id(0), routed device Id(11)

#### Test 17 status 0
 AudioRecord::dump
  status(0), active(0), session Id(1001)
  flags(0), req. flags(0), audio source(0)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(286), latency(60), selected device Id(0), routed device Id(11)

#### Test 18 status 0
 AudioRecord::dump
  status(0), active(0), session Id(193)
  flags(0), req. flags(0), audio source(1)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(294), latency(60), selected device Id(0), routed device Id(11)

#### Test 19 status 0
 AudioRecord::dump
  status(0), active(0), session Id(201)
  flags(0), req. flags(0), audio source(5)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(302), latency(60), selected device Id(0), routed device Id(12)

#### Test 20 status 0
 AudioRecord::dump
  status(0), active(0), session Id(209)
  flags(0), req. flags(0), audio source(6)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(310), latency(60), selected device Id(0), routed device Id(11)

#### Test 21 status 0
 AudioRecord::dump
  status(0), active(0), session Id(217)
  flags(0), req. flags(0), audio source(7)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(318), latency(60), selected device Id(0), routed device Id(11)

#### Test 22 status 0
 AudioRecord::dump
  status(0), active(0), session Id(225)
  flags(0), req. flags(0), audio source(9)
  format(0x1), channel mask(0x10), channel count(1), sample rate(48000)
  frame count(2880), req. frame count(2880)
  notif. frame count(960), req. notif. frame count(0)
  input(326), latency(60), selected device Id(0), routed device Id(11)
+129 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <binder/MemoryBase.h>
#include <binder/MemoryDealer.h>
#include <binder/MemoryHeapBase.h>
#include <media/AudioRecord.h>

#include "test_create_utils.h"

#define NUM_ARGUMENTS 8
#define VERSION_VALUE "1.0"
#define PACKAGE_NAME  "AudioRecord test"

namespace android {

int testRecord(FILE *inputFile, int outputFileFd)
{
    char line[MAX_INPUT_FILE_LINE_LENGTH];
    uint32_t testCount = 0;
    Vector<String16> args;
    int ret = 0;

    if (inputFile == nullptr) {
        sp<AudioRecord> record = new AudioRecord(AUDIO_SOURCE_DEFAULT,
                                              0 /* sampleRate */,
                                              AUDIO_FORMAT_DEFAULT,
                                              AUDIO_CHANNEL_IN_MONO,
                                              String16(PACKAGE_NAME));
        if (record == 0 || record->initCheck() != NO_ERROR) {
            write(outputFileFd, "Error creating AudioRecord\n",
                  sizeof("Error creating AudioRecord\n"));
        } else {
            record->dump(outputFileFd, args);
        }
        return 0;
    }

    // check version
    if (!checkVersion(inputFile, VERSION_VALUE)) {
        return 1;
    }

    while (readLine(inputFile, line, MAX_INPUT_FILE_LINE_LENGTH) == 0) {
        uint32_t sampleRate;
        audio_format_t format;
        audio_channel_mask_t channelMask;
        size_t frameCount;
        int32_t notificationFrames;
        audio_input_flags_t flags;
        audio_session_t sessionId;
        audio_source_t inputSource;
        audio_attributes_t attributes;
        status_t status;
        char statusStr[MAX_OUTPUT_FILE_LINE_LENGTH];
        bool fast = false;

        if (sscanf(line, " %u %x %x %zu %d %x %u %u",
                   &sampleRate, &format, &channelMask,
                   &frameCount, &notificationFrames,
                   &flags, &sessionId, &inputSource) != NUM_ARGUMENTS) {
            fprintf(stderr, "Malformed line for test #%u in input file\n", testCount+1);
            ret = 1;
            continue;
        }
        testCount++;

        if ((flags & AUDIO_INPUT_FLAG_FAST) != 0) {
            fast = true;
        }

        memset(&attributes, 0, sizeof(attributes));
        attributes.source = inputSource;

        sp<AudioRecord> record = new AudioRecord(String16(PACKAGE_NAME));

        record->set(AUDIO_SOURCE_DEFAULT,
                   sampleRate,
                   format,
                   channelMask,
                   frameCount,
                   fast ? callback : nullptr,
                   nullptr,
                   notificationFrames,
                   false,
                   sessionId,
                   fast ? AudioRecord::TRANSFER_CALLBACK : AudioRecord::TRANSFER_DEFAULT,
                   flags,
                   getuid(),
                   getpid(),
                   &attributes,
                   AUDIO_PORT_HANDLE_NONE);
        status = record->initCheck();
        sprintf(statusStr, "\n#### Test %u status %d\n", testCount, status);
        write(outputFileFd, statusStr, strlen(statusStr));
        if (status != NO_ERROR) {
            continue;
        }
        record->dump(outputFileFd, args);
    }
    return ret;
}

}; // namespace android


int main(int argc, char **argv)
{
    return android::main(argc, argv, android::testRecord);
}
+9 −116
Original line number Diff line number Diff line
@@ -14,12 +14,6 @@
 * limitations under the License.
 */

/**
 * Handle a DISCONNECT by only opening and starting a new stream
 * without stopping and closing the old one.
 * This caused the new stream to use the old disconnected device.
 */

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
@@ -30,69 +24,19 @@
#include <binder/MemoryHeapBase.h>
#include <media/AudioTrack.h>

#define MAX_INPUT_FILE_LINE_LENGTH 512
#define MAX_OUTPUT_FILE_LINE_LENGTH 512
#include "test_create_utils.h"

#define NUM_ARGUMENTS 10
#define VERSION_KEY "version"
#define VERSION_VALUE "1.0"

namespace android {

int readLine(FILE *inputFile, char *line, int size) {
    int ret = 0;
    while (true) {
        char *str = fgets(line, size, inputFile);
        if (str == nullptr) {
            ret = -1;
            break;
        }
        if (feof(inputFile) != 0 || ferror(inputFile) != 0) {
            ret = -1;
            break;
        }
        if (strlen(str) != 0 && str[0] != '#') {
            break;
        }
    }
    return ret;
}

bool checkVersion(FILE *inputFile)
{
    char line[MAX_INPUT_FILE_LINE_LENGTH];
    char versionKey[MAX_INPUT_FILE_LINE_LENGTH];
    char versionValue[MAX_INPUT_FILE_LINE_LENGTH];

    if (readLine(inputFile, line, MAX_INPUT_FILE_LINE_LENGTH) != 0) {
        fprintf(stderr, "Missing version in input file\n");
        return false;
    }

    if (sscanf(line, " %s %s", versionKey, versionValue) != 2) {
        fprintf(stderr, "Malformed version in input file\n");
        return false;
    }
    if (strcmp(versionKey, VERSION_KEY) != 0) {
        fprintf(stderr, "Malformed version in input file\n");
        return false;
    }
    if (strcmp(versionValue, VERSION_VALUE) != 0) {
        fprintf(stderr, "Wrong input file version %s expecting %s\n", versionValue, VERSION_VALUE);
        return false;
    }
    return true;
}

void callback(int event __unused, void* user __unused, void *info __unused)
{
}

void testTrack(FILE *inputFile, int outputFileFd)
int testTrack(FILE *inputFile, int outputFileFd)
{
    char line[MAX_INPUT_FILE_LINE_LENGTH];
    uint32_t testCount = 0;
    Vector<String16> args;
    int ret = 0;

    if (inputFile == nullptr) {
        sp<AudioTrack> track = new AudioTrack(AUDIO_STREAM_DEFAULT,
@@ -105,12 +49,12 @@ void testTrack(FILE *inputFile, int outputFileFd)
        } else {
            track->dump(outputFileFd, args);
        }
        return;
        return 0;
    }

    // check version
    if (!checkVersion(inputFile)) {
        return;
    if (!checkVersion(inputFile, VERSION_VALUE)) {
        return 1;
    }

    while (readLine(inputFile, line, MAX_INPUT_FILE_LINE_LENGTH) == 0) {
@@ -138,6 +82,7 @@ void testTrack(FILE *inputFile, int outputFileFd)
                   &frameCount, &notificationFrames, &useSharedBuffer,
                   &flags, &sessionId, &usage, &contentType) != NUM_ARGUMENTS) {
            fprintf(stderr, "Malformed line for test #%u in input file\n", testCount+1);
            ret = 1;
            continue;
        }
        testCount++;
@@ -195,6 +140,7 @@ void testTrack(FILE *inputFile, int outputFileFd)
        }
        track->dump(outputFileFd, args);
    }
    return ret;
}

}; // namespace android
@@ -202,59 +148,6 @@ void testTrack(FILE *inputFile, int outputFileFd)

int main(int argc, char **argv)
{
    FILE *inputFile = nullptr;
    int outputFileFd = STDOUT_FILENO;
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
    int ret = 0;

    if (argc > 5) {
        fprintf(stderr, "Usage: %s [-i input_params.txt] [-o output_params.txt]\n", argv[0]);
        return 1;
    }

    argv++;
    while (*argv) {
        if (strcmp(*argv, "-i") == 0) {
            argv++;
            if (*argv) {
                inputFile = fopen(*argv, "r");
                if (inputFile == nullptr) {
                    ret = 1;
                }
            } else {
                ret = 1;
            }
        }
        if (strcmp(*argv, "-o") == 0) {
            argv++;
            if (*argv) {
                outputFileFd = open(*argv, O_WRONLY|O_CREAT, mode);
                if (outputFileFd < 0) {
                    ret = 1;
                }
            } else {
                ret = 1;
            }
            argv++;
        }
        if (*argv) {
            argv++;
        }
    }

    if (ret != 0) {
        return ret;
    }

    android::testTrack(inputFile, outputFileFd);

    if (inputFile) {
        fclose(inputFile);
    }
    if (outputFileFd >= 0 && outputFileFd != STDOUT_FILENO) {
        close(outputFileFd);
    }

    return ret;
    return android::main(argc, argv, android::testTrack);
}
Loading