From d31ecf63c07927541773b4f7063fb10b4d15a149 Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Sat, 26 Feb 2022 16:13:48 +0100 Subject: [PATCH] #20 add AMBEFileReader and corresponding tests --- .vscode/tasks.json | 10 +- DStarBase/AMBEFileReader.cpp | 179 ++++++++++++++++++++++++++++++++ DStarBase/AMBEFileReader.h | 74 +++++++++++++ Tests/AMBEFileReader/fr_FR.ambe | Bin 0 -> 20137 bytes Tests/AMBEFileReader/fr_FR.indx | 44 ++++++++ Tests/AMBEFileReader/lookup.cpp | 115 ++++++++++++++++++++ Tests/AMBEFileReader/read.cpp | 62 +++++++++++ 7 files changed, 479 insertions(+), 5 deletions(-) create mode 100644 DStarBase/AMBEFileReader.cpp create mode 100644 DStarBase/AMBEFileReader.h create mode 100644 Tests/AMBEFileReader/fr_FR.ambe create mode 100644 Tests/AMBEFileReader/fr_FR.indx create mode 100644 Tests/AMBEFileReader/lookup.cpp create mode 100644 Tests/AMBEFileReader/read.cpp diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 88ce123..995a9f1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,10 +13,7 @@ "USE_GPSD=1", "all" ], - "group": { - "kind": "build", - "isDefault": true - }, + "group": "build", "problemMatcher": [] }, { @@ -94,7 +91,10 @@ "ENABLE_DEBUG=1", "USE_GPSD=1" ], - "group": "build", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [] } ] diff --git a/DStarBase/AMBEFileReader.cpp b/DStarBase/AMBEFileReader.cpp new file mode 100644 index 0000000..119ea4a --- /dev/null +++ b/DStarBase/AMBEFileReader.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2021 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "AMBEFileReader.h" +#include "DStarDefines.h" +#include "Log.h" + +const unsigned int SILENCE_LENGTH = 10U; + +CAMBEFileReader::CAMBEFileReader(const std::string& indexFile, const std::string& ambeFile) : +m_indexFile(indexFile), +m_ambeFile(ambeFile), +m_ambe(nullptr), +m_ambeLength(0U), +m_index() +{ + +} + +CAMBEFileReader::~CAMBEFileReader() +{ + if(m_ambe != nullptr) { + delete[] m_ambe; + } +} + +bool CAMBEFileReader::read() +{ + bool ret = readAmbe() && readIndex(); + return ret; +} + +bool CAMBEFileReader::readAmbe() +{ + struct stat sbuf; + if (stat(m_ambeFile.c_str(), &sbuf)) { + CLog::logWarning("File %s not readable\n", m_ambeFile.c_str()); + return false; + } + + unsigned int fsize = sbuf.st_size; + + FILE *file = fopen(m_ambeFile.c_str(), "rb"); + if (NULL == file) { + CLog::logError("Cannot open %s for reading\n", m_ambeFile.c_str()); + return false; + } + + CLog::logInfo("Reading %s\n", m_ambeFile.c_str()); + + unsigned char buffer[VOICE_FRAME_LENGTH_BYTES]; + + size_t n = fread(buffer, sizeof(unsigned char), 4, file); + if (n != 4) { + CLog::logError("Unable to read the header from %s\n", m_ambeFile.c_str()); + fclose(file); + return false; + } + + if (memcmp(buffer, "AMBE", 4)) { + CLog::logError("Invalid header from %s\n", m_ambeFile.c_str()); + fclose(file); + return false; + } + + // Length of the file minus the header + unsigned int length = fsize - 4U; + + // Hold the file data plus silence at the end + m_ambe = new unsigned char[length + SILENCE_LENGTH * VOICE_FRAME_LENGTH_BYTES]; + m_ambeLength = length / VOICE_FRAME_LENGTH_BYTES; + + // Add silence to the beginning of the buffer + unsigned char* p = m_ambe; + for (unsigned int i = 0U; i < SILENCE_LENGTH; i++, p += VOICE_FRAME_LENGTH_BYTES) + memcpy(p, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES); + + n = fread(p, 1, length, file); + if (n != length) { + CLog::logError("Unable to read the AMBE data from %s\n", m_ambeFile.c_str()); + fclose(file); + delete[] m_ambe; + m_ambeLength = 0U; + m_ambe = nullptr; + return false; + } + + fclose(file); + + return true; +} + +bool CAMBEFileReader::readIndex() +{ + struct stat sbuf; + + if (stat(m_indexFile.c_str(), &sbuf)) { + CLog::logError("File %s not readable\n", m_indexFile.c_str()); + return false; + } + + FILE *file = fopen(m_indexFile.c_str(), "r"); + if (file == nullptr) { + CLog::logError("Cannot open %s for reading\n", m_indexFile.c_str()); + return false; + } + + // Add a silence entry at the beginning + m_index[" "] = new CIndexRecord(" ", 0, SILENCE_LENGTH); + + CLog::logInfo("Reading %s\n", m_indexFile.c_str()); + + char line[128]; + while (fgets(line, 128, file)) { + if (strlen(line) && '#'!=line[0]) { + const std::string space(" \t\r\n"); + std::string name(strtok(line, space.c_str())); + std::string strt(strtok(NULL, space.c_str())); + std::string leng(strtok(NULL, space.c_str())); + + if (name.size() && strt.size() && leng.size()) { + unsigned long start = std::stoul(strt); + unsigned long length = std::stoul(leng); + + if (start >= m_ambeLength || (start + length) >= m_ambeLength) + CLog::logInfo("The start or end for *%s* is out of range, start: %lu, end: %lu\n", name.c_str(), start, start + length); + else + m_index[name] = new CIndexRecord(name, start + SILENCE_LENGTH, length); + } + } + } + + fclose(file); + + return true; +} + +bool CAMBEFileReader::lookup(const std::string &id, std::vector& data) +{ + if(m_index.count(id) == 0U) { + CLog::logError("Cannot find the AMBE index for *%s*", id.c_str()); + return false; + } + + CIndexRecord* info = m_index[id]; + unsigned int start = info->getStart(); + unsigned int length = info->getLength(); + + for (unsigned int i = 0U; i < length; i++) { + unsigned char* dataIn = m_ambe + (start + i) * VOICE_FRAME_LENGTH_BYTES; + unsigned char buffer[DV_FRAME_LENGTH_BYTES]; + ::memcpy(buffer + 0U, dataIn, VOICE_FRAME_LENGTH_BYTES); + + CAMBEData* dataOut = new CAMBEData; + dataOut->setData(buffer, DV_FRAME_LENGTH_BYTES); + data.push_back(dataOut); + } + + return true; +} \ No newline at end of file diff --git a/DStarBase/AMBEFileReader.h b/DStarBase/AMBEFileReader.h new file mode 100644 index 0000000..cd66e6c --- /dev/null +++ b/DStarBase/AMBEFileReader.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#pragma once + +#include +#include +#include + +#include "AMBEData.h" + +class CIndexRecord { +public: + CIndexRecord(const std::string& name, unsigned int start, unsigned int length) : + m_name(name), + m_start(start), + m_length(length) + { + } + + std::string getName() const + { + return m_name; + } + + unsigned int getStart() const + { + return m_start; + } + + unsigned int getLength() const + { + return m_length; + } + +private: + std::string m_name; + unsigned int m_start; + unsigned int m_length; +}; + +class CAMBEFileReader +{ +public: + CAMBEFileReader(const std::string& indexFile, const std::string& ambeFile); + ~CAMBEFileReader(); + bool read(); + bool lookup(const std::string &id, std::vector& data); + +private: + bool readAmbe(); + bool readIndex(); + + std::string m_indexFile; + std::string m_ambeFile; + unsigned char* m_ambe; + unsigned int m_ambeLength; + std::unordered_map m_index; +}; \ No newline at end of file diff --git a/Tests/AMBEFileReader/fr_FR.ambe b/Tests/AMBEFileReader/fr_FR.ambe new file mode 100644 index 0000000000000000000000000000000000000000..c81d0630940a7fa373c5b4882ae9a765679c95d3 GIT binary patch literal 20137 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 +#include +#include +#include + +#include "AMBEFileReader.h" +#include "AMBEData.h" + +namespace AMBEFileReaderTests +{ + class AMBEFileReader_lookup : public ::testing::Test { + + }; + + TEST_F(AMBEFileReader_lookup, nonExistentFiles) + { + CAMBEFileReader reader("/this/file/does/not/exist", "/neither/does/this/file"); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent files"; + + std::vector data; + res = reader.lookup("0", data); + EXPECT_FALSE(res) << "read shall return false on non existent files"; + + for(auto d : data) { + delete d; + } + } + + TEST_F(AMBEFileReader_lookup, onlyIndexFileExists) + { + std::string indexFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.indx"; + CAMBEFileReader reader(indexFile, "/this/file/does/not/exist"); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + + std::vector data; + res = reader.lookup("0", data); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + + for(auto d : data) { + delete d; + } + } + + TEST_F(AMBEFileReader_lookup, onlyAmbeFileExists) + { + std::string ambeFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.ambe"; + CAMBEFileReader reader("/this/file/does/not/exist", ambeFile); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + + std::vector data; + res = reader.lookup("0", data); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + + for(auto d : data) { + delete d; + } + } + + TEST_F(AMBEFileReader_lookup, validId) + { + std::string indexFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.indx"; + std::string ambeFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.ambe"; + CAMBEFileReader reader(indexFile, ambeFile); + bool res = reader.read(); + EXPECT_TRUE(res) << "read shall return true on existent files"; + + std::vector data; + res = reader.lookup("0", data); + EXPECT_TRUE(res) << "read shall return true on existent files and valid Id"; + EXPECT_NE(data.size(), 0U) << "Vector shall contain data"; + + for(auto d : data) { + delete d; + } + } + + TEST_F(AMBEFileReader_lookup, invalidId) + { + std::string indexFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.indx"; + std::string ambeFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.ambe"; + CAMBEFileReader reader(indexFile, ambeFile); + bool res = reader.read(); + EXPECT_TRUE(res) << "read shall return true on existent files"; + + std::vector data; + res = reader.lookup("This Id does not exist", data); + EXPECT_FALSE(res) << "read shall return false on existent files and invalid Id"; + EXPECT_EQ(data.size(), 0U) << "Vector shall not contain data"; + + for(auto d : data) { + delete d; + } + } +} \ No newline at end of file diff --git a/Tests/AMBEFileReader/read.cpp b/Tests/AMBEFileReader/read.cpp new file mode 100644 index 0000000..99f7bf4 --- /dev/null +++ b/Tests/AMBEFileReader/read.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include + +#include "AMBEFileReader.h" + +namespace AMBEFileReaderTests +{ + class AMBEFileReader_read : public ::testing::Test { + + }; + + TEST_F(AMBEFileReader_read, nonExistentFiles) + { + CAMBEFileReader reader("/this/file/does/not/exist", "/neither/does/this/file"); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent files"; + } + + TEST_F(AMBEFileReader_read, onlyIndexFileExists) + { + std::string indexFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.indx"; + CAMBEFileReader reader(indexFile, "/this/file/does/not/exist"); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + } + + TEST_F(AMBEFileReader_read, onlyAmbeFileExists) + { + std::string ambeFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.ambe"; + CAMBEFileReader reader("/this/file/does/not/exist", ambeFile); + bool res = reader.read(); + EXPECT_FALSE(res) << "read shall return false on non existent file"; + } + + TEST_F(AMBEFileReader_read, bothFileExist) + { + std::string indexFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.indx"; + std::string ambeFile = std::string(std::filesystem::current_path()) + "/Tests/AMBEFileReader/fr_FR.ambe"; + CAMBEFileReader reader(indexFile, ambeFile); + bool res = reader.read(); + EXPECT_TRUE(res) << "read shall return true on existent files"; + } +} \ No newline at end of file