мультиплексорная запись в cronyx

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
#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;
}