#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <time.h>
/**
* дефолтный размер пакета
*/
#define DEFAULT_PACKET_LEN 1504
/**
*
* @param argc
* @param argv путь к файлу устройства и количество тайм-слотов
* @return
*/
int main( const int argc , const char** argv ) {
///////////////////////////////////////////////////////////////////////////
// читаем входные параметры
if (argc < 3) {
std::cout << "Первым параметром надо указать устройство" << std::endl;
std::cout << "Вторым параметром надо указать количество тайм-слотов"
<< std::endl;
}
const size_t channels_cnt = atoi( argv[2] );
std::cout << "dev = " << argv[1] << std::endl;
std::cout << "channels cnt = " << channels_cnt << std::endl;
// читаем входные параметры
///////////////////////////////////////////////////////////////////////////
// открываем файл устройства для записи
FILE* fp = fopen( argv[1] , "wb" );
if (NULL == fp) {
std::cout << "error opening pipe" << std::endl;
return 1;
}
setvbuf( fp , NULL , _IONBF , 0 );
// while ( true ) {
// открываем файл со звуковыми данными
FILE* data = fopen( "/home/steplg/docs/sorm/a-law.mono.wav" , "rb" );
if (NULL == data) {
std::cout << "error opening data file" << std::endl;
fclose( fp );
return 1;
}
// начинаем передачу данных
std::cout << "starting" << std::endl;
const size_t buffer_size = DEFAULT_PACKET_LEN * channels_cnt;
char * buffer = new char[buffer_size];
while ( !feof( data ) ) {
// сбрасываем буфер
memset( buffer , 0xFF , buffer_size );
// читаем данные
size_t real_length = fread( buffer , 1 , DEFAULT_PACKET_LEN , data );
// клонируем данные на несколько тайм-слотов
for ( int i = real_length - 1 ; i >= 0 ; --i ) {
for ( int j = 0 ; j < channels_cnt ; j++ ) {
buffer[i * (channels_cnt) + j] = buffer[i];
}
}
timespec start , end; // замеряем время записи в канал
std::cout << "to write : " << real_length * channels_cnt << std::endl;
clock_gettime( CLOCK_REALTIME , &start );
// пишем данные
size_t real_wrote = fwrite( buffer ,
1 ,
buffer_size ,
fp );
clock_gettime( CLOCK_REALTIME , &end );
// отладочная печать
double diff = end.tv_sec - start.tv_sec + (end.tv_nsec
- start.tv_nsec) / 1000000000.0;
std::cout << "write time\t\t" << diff << std::endl;
if (real_wrote != real_length * channels_cnt) {
std::cout << "!(" << real_length << ":" << real_wrote << ")"
<< std::endl;
} else {
std::cout << ".";
}
}
delete[] buffer;
fclose( data );
// }
fclose( fp );
return 0;
}